From b2c1c7493683ba7a0144fecdc4ea2a45432fcb69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20Cesar=20Bueno=20Cotta?= Date: Tue, 6 Aug 2019 14:25:20 -0300 Subject: [PATCH 001/133] [Firebase Analytics] Update AGP, remove deprecated method and remove castings (#1938) * Update AGP and Gradle. * Remove deprecated Android method setMinimumSessionDuration. * Removed reduntant casting * remove `FirebaseAnalyticsAndroid.setAnalyticsCollectionEnabled` --- packages/firebase_analytics/CHANGELOG.md | 8 ++++ .../firebase_analytics/android/build.gradle | 2 +- .../FirebaseAnalyticsPlugin.java | 39 ++++++------------- .../example/android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../firebase_analytics/example/lib/main.dart | 9 ----- .../test_driver/firebase_analytics.dart | 2 +- .../lib/firebase_analytics.dart | 25 +----------- packages/firebase_analytics/pubspec.yaml | 2 +- .../test/firebase_analytics_test.dart | 11 ------ 10 files changed, 27 insertions(+), 76 deletions(-) diff --git a/packages/firebase_analytics/CHANGELOG.md b/packages/firebase_analytics/CHANGELOG.md index 320289c2d858..16051241ebb9 100644 --- a/packages/firebase_analytics/CHANGELOG.md +++ b/packages/firebase_analytics/CHANGELOG.md @@ -1,3 +1,11 @@ +## 5.0.0 + +* **Breaking change**. Remove deprecated method `setMinimumSessionDuration`. +* **Breaking change**. Removed `FirebaseAnalyticsAndroid.setAnalyticsCollectionEnabled`. Use + `FirebaseAnalytics.setAnalyticsCollectionEnabled` instead. +* Update Android gradle plugin and gradle version. +* Remove redundant casts on Android. + ## 4.0.2 * Update google-services Android gradle plugin to 4.3.0 in documentation and examples. diff --git a/packages/firebase_analytics/android/build.gradle b/packages/firebase_analytics/android/build.gradle index ad0cb30fdb16..96633d9194bc 100755 --- a/packages/firebase_analytics/android/build.gradle +++ b/packages/firebase_analytics/android/build.gradle @@ -21,7 +21,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.4.2' } } diff --git a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java b/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java index 7215afb1e73b..0ec15c7cc22b 100755 --- a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java +++ b/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java @@ -47,9 +47,6 @@ public void onMethodCall(MethodCall call, Result result) { case "setAnalyticsCollectionEnabled": handleSetAnalyticsCollectionEnabled(call, result); break; - case "setMinimumSessionDuration": - handleSetMinimumSessionDuration(call, result); - break; case "setSessionTimeoutDuration": handleSetSessionTimeoutDuration(call, result); break; @@ -57,7 +54,7 @@ public void onMethodCall(MethodCall call, Result result) { handleSetUserProperty(call, result); break; case "resetAnalyticsData": - handleResetAnalyticsData(call, result); + handleResetAnalyticsData(result); break; default: result.notImplemented(); @@ -66,13 +63,10 @@ public void onMethodCall(MethodCall call, Result result) { } private void handleLogEvent(MethodCall call, Result result) { - @SuppressWarnings("unchecked") - Map arguments = (Map) call.arguments; - final String eventName = (String) arguments.get("name"); - @SuppressWarnings("unchecked") - final Bundle parameterBundle = - createBundleFromMap((Map) arguments.get("parameters")); + final String eventName = call.argument("name"); + final Map map = call.argument("parameters"); + final Bundle parameterBundle = createBundleFromMap(map); firebaseAnalytics.logEvent(eventName, parameterBundle); result.success(null); } @@ -84,49 +78,40 @@ private void handleSetUserId(MethodCall call, Result result) { } private void handleSetCurrentScreen(MethodCall call, Result result) { - @SuppressWarnings("unchecked") Activity activity = registrar.activity(); if (activity == null) { result.error("no_activity", "handleSetCurrentScreen requires a foreground activity", null); return; } - Map arguments = (Map) call.arguments; - final String screenName = (String) arguments.get("screenName"); - final String screenClassOverride = (String) arguments.get("screenClassOverride"); + + final String screenName = call.argument("screenName"); + final String screenClassOverride = call.argument("screenClassOverride"); firebaseAnalytics.setCurrentScreen(activity, screenName, screenClassOverride); result.success(null); } private void handleSetAnalyticsCollectionEnabled(MethodCall call, Result result) { - final Boolean enabled = (Boolean) call.arguments; + final Boolean enabled = call.arguments(); firebaseAnalytics.setAnalyticsCollectionEnabled(enabled); result.success(null); } - private void handleSetMinimumSessionDuration(MethodCall call, Result result) { - final Integer milliseconds = (Integer) call.arguments; - firebaseAnalytics.setMinimumSessionDuration(milliseconds); - result.success(null); - } - private void handleSetSessionTimeoutDuration(MethodCall call, Result result) { - final Integer milliseconds = (Integer) call.arguments; + final Integer milliseconds = call.arguments(); firebaseAnalytics.setSessionTimeoutDuration(milliseconds); result.success(null); } private void handleSetUserProperty(MethodCall call, Result result) { - @SuppressWarnings("unchecked") - Map arguments = (Map) call.arguments; - final String name = (String) arguments.get("name"); - final String value = (String) arguments.get("value"); + final String name = call.argument("name"); + final String value = call.argument("value"); firebaseAnalytics.setUserProperty(name, value); result.success(null); } - private void handleResetAnalyticsData(MethodCall call, Result result) { + private void handleResetAnalyticsData(Result result) { firebaseAnalytics.resetAnalyticsData(); result.success(null); } diff --git a/packages/firebase_analytics/example/android/build.gradle b/packages/firebase_analytics/example/android/build.gradle index 695de848ec30..3f271ea72055 100755 --- a/packages/firebase_analytics/example/android/build.gradle +++ b/packages/firebase_analytics/example/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.4.2' classpath 'com.google.gms:google-services:4.3.0' } } diff --git a/packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties index 019065d1d650..0c59c158ca01 100644 --- a/packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Wed Jul 31 23:52:55 BRT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/packages/firebase_analytics/example/lib/main.dart b/packages/firebase_analytics/example/lib/main.dart index 2c1d1b789984..2c3affd29c1c 100755 --- a/packages/firebase_analytics/example/lib/main.dart +++ b/packages/firebase_analytics/example/lib/main.dart @@ -94,11 +94,6 @@ class _MyHomePageState extends State { setMessage('setAnalyticsCollectionEnabled succeeded'); } - Future _testSetMinimumSessionDuration() async { - await analytics.android?.setMinimumSessionDuration(20000); - setMessage('setMinimumSessionDuration succeeded'); - } - Future _testSetSessionTimeoutDuration() async { await analytics.android?.setSessionTimeoutDuration(2000000); setMessage('setSessionTimeoutDuration succeeded'); @@ -298,10 +293,6 @@ class _MyHomePageState extends State { child: const Text('Test setAnalyticsCollectionEnabled'), onPressed: _testSetAnalyticsCollectionEnabled, ), - MaterialButton( - child: const Text('Test setMinimumSessionDuration'), - onPressed: _testSetMinimumSessionDuration, - ), MaterialButton( child: const Text('Test setSessionTimeoutDuration'), onPressed: _testSetSessionTimeoutDuration, diff --git a/packages/firebase_analytics/example/test_driver/firebase_analytics.dart b/packages/firebase_analytics/example/test_driver/firebase_analytics.dart index 40f994203284..ee09c9415527 100644 --- a/packages/firebase_analytics/example/test_driver/firebase_analytics.dart +++ b/packages/firebase_analytics/example/test_driver/firebase_analytics.dart @@ -25,7 +25,7 @@ void main() { expect(analytics.android, isNull); } if (Platform.isAndroid) { - await analytics.android.setMinimumSessionDuration(9000); + await analytics.android.setSessionTimeoutDuration(1000); } }); diff --git a/packages/firebase_analytics/lib/firebase_analytics.dart b/packages/firebase_analytics/lib/firebase_analytics.dart index 2dd17e09786f..c04ac1c3e468 100755 --- a/packages/firebase_analytics/lib/firebase_analytics.dart +++ b/packages/firebase_analytics/lib/firebase_analytics.dart @@ -24,7 +24,7 @@ class FirebaseAnalytics { /// Example: /// /// FirebaseAnalytics analytics = FirebaseAnalytics(); - /// analytics.android?.setMinimumSessionDuration(200000); + /// analytics.android?.setSessionTimeoutDuration(true); final FirebaseAnalyticsAndroid android = defaultTargetPlatform == TargetPlatform.android ? FirebaseAnalyticsAndroid() @@ -871,29 +871,6 @@ class FirebaseAnalytics { class FirebaseAnalyticsAndroid { final MethodChannel _channel = firebaseChannel; - /// Sets whether analytics collection is enabled for this app on this device. - /// - /// This setting is persisted across app sessions. By default it is enabled. - /// Deprecated: Use [FirebaseAnalytics.setAnalyticsCollectionEnabled] instead. - @deprecated - Future setAnalyticsCollectionEnabled(bool enabled) async { - if (enabled == null) { - throw ArgumentError.notNull('enabled'); - } - await _channel.invokeMethod('setAnalyticsCollectionEnabled', enabled); - } - - /// Sets the minimum engagement time required before starting a session. - /// - /// The default value is 10000 (10 seconds). - Future setMinimumSessionDuration(int milliseconds) async { - if (milliseconds == null) { - throw ArgumentError.notNull('milliseconds'); - } - await _channel.invokeMethod( - 'setMinimumSessionDuration', milliseconds); - } - /// Sets the duration of inactivity that terminates the current session. /// /// The default value is 1800000 (30 minutes). diff --git a/packages/firebase_analytics/pubspec.yaml b/packages/firebase_analytics/pubspec.yaml index 324fac8ac189..071ed2321382 100755 --- a/packages/firebase_analytics/pubspec.yaml +++ b/packages/firebase_analytics/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Google Analytics for Firebase, an app measuremen solution that provides insight on app usage and user engagement on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_analytics -version: 4.0.2 +version: 5.0.0 flutter: plugin: diff --git a/packages/firebase_analytics/test/firebase_analytics_test.dart b/packages/firebase_analytics/test/firebase_analytics_test.dart index 31fa713e1596..c8af79710f0d 100755 --- a/packages/firebase_analytics/test/firebase_analytics_test.dart +++ b/packages/firebase_analytics/test/firebase_analytics_test.dart @@ -113,17 +113,6 @@ void main() { ); }); - test('setMinimumSessionDuration', () async { - await analytics.android.setMinimumSessionDuration(123); - expect( - methodCall, - isMethodCall( - 'setMinimumSessionDuration', - arguments: 123, - ), - ); - }); - test('setSessionTimeoutDuration', () async { await analytics.android.setSessionTimeoutDuration(234); expect( From 230c53f46ea5be414341a425239d70394413cfc8 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Tue, 6 Aug 2019 16:03:04 -0700 Subject: [PATCH 002/133] [camera] Refactor Camera/Android implementation to allow reuse of Camera functionality (#1949) --- packages/camera/android/build.gradle | 5 + .../io/flutter/plugins/camera/Camera.java | 513 +++++++++++ .../plugins/camera/CameraPermissions.java | 80 ++ .../flutter/plugins/camera/CameraPlugin.java | 830 +----------------- .../flutter/plugins/camera/CameraUtils.java | 129 +++ 5 files changed, 770 insertions(+), 787 deletions(-) create mode 100644 packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java create mode 100644 packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java create mode 100644 packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java diff --git a/packages/camera/android/build.gradle b/packages/camera/android/build.gradle index fbce7b86f8f7..dd544c084ba7 100644 --- a/packages/camera/android/build.gradle +++ b/packages/camera/android/build.gradle @@ -44,7 +44,12 @@ android { lintOptions { disable 'InvalidPackage' } + compileOptions { + sourceCompatibility = '1.8' + targetCompatibility = '1.8' + } dependencies { implementation 'androidx.annotation:annotation:1.0.0' + implementation 'androidx.core:core:1.0.0' } } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java new file mode 100644 index 000000000000..bf99f8d561d5 --- /dev/null +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -0,0 +1,513 @@ +package io.flutter.plugins.camera; + +import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.graphics.ImageFormat; +import android.graphics.SurfaceTexture; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CaptureFailure; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.params.StreamConfigurationMap; +import android.media.Image; +import android.media.ImageReader; +import android.media.MediaRecorder; +import android.util.Size; +import android.view.OrientationEventListener; +import android.view.Surface; +import androidx.annotation.NonNull; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.view.FlutterView; +import io.flutter.view.TextureRegistry.SurfaceTextureEntry; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Camera { + private final SurfaceTextureEntry flutterTexture; + private final CameraManager cameraManager; + private final OrientationEventListener orientationEventListener; + private final boolean isFrontFacing; + private final int sensorOrientation; + private final String cameraName; + private final Size captureSize; + private final Size previewSize; + private final Size videoSize; + private final boolean enableAudio; + + private CameraDevice cameraDevice; + private CameraCaptureSession cameraCaptureSession; + private ImageReader pictureImageReader; + private ImageReader imageStreamReader; + private EventChannel.EventSink eventSink; + private CaptureRequest.Builder captureRequestBuilder; + private MediaRecorder mediaRecorder; + private boolean recordingVideo; + private int currentOrientation = ORIENTATION_UNKNOWN; + + public Camera( + final Activity activity, + final FlutterView flutterView, + final String cameraName, + final String resolutionPreset, + final boolean enableAudio) + throws CameraAccessException { + if (activity == null) { + throw new IllegalStateException("No activity available!"); + } + + this.cameraName = cameraName; + this.enableAudio = enableAudio; + this.flutterTexture = flutterView.createSurfaceTexture(); + this.cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); + orientationEventListener = + new OrientationEventListener(activity.getApplicationContext()) { + @Override + public void onOrientationChanged(int i) { + if (i == ORIENTATION_UNKNOWN) { + return; + } + // Convert the raw deg angle to the nearest multiple of 90. + currentOrientation = (int) Math.round(i / 90.0) * 90; + } + }; + orientationEventListener.enable(); + + int minHeight; + switch (resolutionPreset) { + case "high": + minHeight = 720; + break; + case "medium": + minHeight = 480; + break; + case "low": + minHeight = 240; + break; + default: + throw new IllegalArgumentException("Unknown preset: " + resolutionPreset); + } + + CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName); + StreamConfigurationMap streamConfigurationMap = + characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + //noinspection ConstantConditions + sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + //noinspection ConstantConditions + isFrontFacing = + characteristics.get(CameraCharacteristics.LENS_FACING) == CameraMetadata.LENS_FACING_FRONT; + captureSize = CameraUtils.computeBestCaptureSize(streamConfigurationMap); + Size[] sizes = + CameraUtils.computeBestPreviewAndRecordingSize( + activity, streamConfigurationMap, minHeight, getMediaOrientation(), captureSize); + videoSize = sizes[0]; + previewSize = sizes[1]; + } + + public void setupCameraEventChannel(EventChannel cameraEventChannel) { + cameraEventChannel.setStreamHandler( + new EventChannel.StreamHandler() { + @Override + public void onListen(Object arguments, EventChannel.EventSink sink) { + eventSink = sink; + } + + @Override + public void onCancel(Object arguments) { + eventSink = null; + } + }); + } + + private void prepareMediaRecorder(String outputFilePath) throws IOException { + if (mediaRecorder != null) { + mediaRecorder.release(); + } + mediaRecorder = new MediaRecorder(); + + // There's a specific order that mediaRecorder expects. Do not change the order + // of these function calls. + if (enableAudio) mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); + mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); + mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); + if (enableAudio) mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); + mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); + mediaRecorder.setVideoEncodingBitRate(1024 * 1000); + if (enableAudio) mediaRecorder.setAudioSamplingRate(16000); + mediaRecorder.setVideoFrameRate(27); + mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight()); + mediaRecorder.setOutputFile(outputFilePath); + mediaRecorder.setOrientationHint(getMediaOrientation()); + + mediaRecorder.prepare(); + } + + @SuppressLint("MissingPermission") + public void open(@NonNull final Result result) throws CameraAccessException { + pictureImageReader = + ImageReader.newInstance( + captureSize.getWidth(), captureSize.getHeight(), ImageFormat.JPEG, 2); + + // Used to steam image byte data to dart side. + imageStreamReader = + ImageReader.newInstance( + previewSize.getWidth(), previewSize.getHeight(), ImageFormat.YUV_420_888, 2); + + cameraManager.openCamera( + cameraName, + new CameraDevice.StateCallback() { + @Override + public void onOpened(@NonNull CameraDevice device) { + cameraDevice = device; + try { + startPreview(); + } catch (CameraAccessException e) { + result.error("CameraAccess", e.getMessage(), null); + close(); + return; + } + Map reply = new HashMap<>(); + reply.put("textureId", flutterTexture.id()); + reply.put("previewWidth", previewSize.getWidth()); + reply.put("previewHeight", previewSize.getHeight()); + result.success(reply); + } + + @Override + public void onClosed(@NonNull CameraDevice camera) { + sendEvent(EventType.CAMERA_CLOSING); + super.onClosed(camera); + } + + @Override + public void onDisconnected(@NonNull CameraDevice cameraDevice) { + close(); + sendEvent(EventType.ERROR, "The camera was disconnected."); + } + + @Override + public void onError(@NonNull CameraDevice cameraDevice, int errorCode) { + close(); + String errorDescription; + switch (errorCode) { + case ERROR_CAMERA_IN_USE: + errorDescription = "The camera device is in use already."; + break; + case ERROR_MAX_CAMERAS_IN_USE: + errorDescription = "Max cameras in use"; + break; + case ERROR_CAMERA_DISABLED: + errorDescription = "The camera device could not be opened due to a device policy."; + break; + case ERROR_CAMERA_DEVICE: + errorDescription = "The camera device has encountered a fatal error"; + break; + case ERROR_CAMERA_SERVICE: + errorDescription = "The camera service has encountered a fatal error."; + break; + default: + errorDescription = "Unknown camera error"; + } + sendEvent(EventType.ERROR, errorDescription); + } + }, + null); + } + + private void writeToFile(ByteBuffer buffer, File file) throws IOException { + try (FileOutputStream outputStream = new FileOutputStream(file)) { + while (0 < buffer.remaining()) { + outputStream.getChannel().write(buffer); + } + } + } + + SurfaceTextureEntry getFlutterTexture() { + return flutterTexture; + } + + public void takePicture(String filePath, @NonNull final Result result) { + final File file = new File(filePath); + + if (file.exists()) { + result.error( + "fileExists", "File at path '" + filePath + "' already exists. Cannot overwrite.", null); + return; + } + + pictureImageReader.setOnImageAvailableListener( + reader -> { + try (Image image = reader.acquireLatestImage()) { + ByteBuffer buffer = image.getPlanes()[0].getBuffer(); + writeToFile(buffer, file); + result.success(null); + } catch (IOException e) { + result.error("IOError", "Failed saving image", null); + } + }, + null); + + try { + final CaptureRequest.Builder captureBuilder = + cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); + captureBuilder.addTarget(pictureImageReader.getSurface()); + captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getMediaOrientation()); + + cameraCaptureSession.capture( + captureBuilder.build(), + new CameraCaptureSession.CaptureCallback() { + @Override + public void onCaptureFailed( + @NonNull CameraCaptureSession session, + @NonNull CaptureRequest request, + @NonNull CaptureFailure failure) { + String reason; + switch (failure.getReason()) { + case CaptureFailure.REASON_ERROR: + reason = "An error happened in the framework"; + break; + case CaptureFailure.REASON_FLUSHED: + reason = "The capture has failed due to an abortCaptures() call"; + break; + default: + reason = "Unknown reason"; + } + result.error("captureFailure", reason, null); + } + }, + null); + } catch (CameraAccessException e) { + result.error("cameraAccess", e.getMessage(), null); + } + } + + private void createCaptureSession(int templateType, Surface... surfaces) + throws CameraAccessException { + createCaptureSession(templateType, null, surfaces); + } + + private void createCaptureSession( + int templateType, Runnable onSuccessCallback, Surface... surfaces) + throws CameraAccessException { + // Close any existing capture session. + closeCaptureSession(); + + // Create a new capture builder. + captureRequestBuilder = cameraDevice.createCaptureRequest(templateType); + + // Build Flutter surface to render to + SurfaceTexture surfaceTexture = flutterTexture.surfaceTexture(); + surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); + Surface flutterSurface = new Surface(surfaceTexture); + captureRequestBuilder.addTarget(flutterSurface); + + List remainingSurfaces = Arrays.asList(surfaces); + if (templateType != CameraDevice.TEMPLATE_PREVIEW) { + // If it is not preview mode, add all surfaces as targets. + for (Surface surface : remainingSurfaces) { + captureRequestBuilder.addTarget(surface); + } + } + + // Prepare the callback + CameraCaptureSession.StateCallback callback = + new CameraCaptureSession.StateCallback() { + @Override + public void onConfigured(@NonNull CameraCaptureSession session) { + try { + if (cameraDevice == null) { + sendEvent(EventType.ERROR, "The camera was closed during configuration."); + return; + } + cameraCaptureSession = session; + captureRequestBuilder.set( + CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); + cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); + if (onSuccessCallback != null) { + onSuccessCallback.run(); + } + } catch (CameraAccessException | IllegalStateException | IllegalArgumentException e) { + sendEvent(EventType.ERROR, e.getMessage()); + } + } + + @Override + public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { + sendEvent(EventType.ERROR, "Failed to configure camera session."); + } + }; + + // Collect all surfaces we want to render to. + List surfaceList = new ArrayList<>(); + surfaceList.add(flutterSurface); + surfaceList.addAll(remainingSurfaces); + // Start the session + cameraDevice.createCaptureSession(surfaceList, callback, null); + } + + public void startVideoRecording(String filePath, Result result) { + if (new File(filePath).exists()) { + result.error("fileExists", "File at path '" + filePath + "' already exists.", null); + return; + } + try { + prepareMediaRecorder(filePath); + recordingVideo = true; + createCaptureSession( + CameraDevice.TEMPLATE_RECORD, () -> mediaRecorder.start(), mediaRecorder.getSurface()); + result.success(null); + } catch (CameraAccessException | IOException e) { + result.error("videoRecordingFailed", e.getMessage(), null); + } + } + + public void stopVideoRecording(@NonNull final Result result) { + if (!recordingVideo) { + result.success(null); + return; + } + + try { + recordingVideo = false; + mediaRecorder.stop(); + mediaRecorder.reset(); + startPreview(); + result.success(null); + } catch (CameraAccessException | IllegalStateException e) { + result.error("videoRecordingFailed", e.getMessage(), null); + } + } + + public void startPreview() throws CameraAccessException { + createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, pictureImageReader.getSurface()); + } + + public void startPreviewWithImageStream(EventChannel imageStreamChannel) + throws CameraAccessException { + createCaptureSession(CameraDevice.TEMPLATE_STILL_CAPTURE, imageStreamReader.getSurface()); + + imageStreamChannel.setStreamHandler( + new EventChannel.StreamHandler() { + @Override + public void onListen(Object o, EventChannel.EventSink imageStreamSink) { + setImageStreamImageAvailableListener(imageStreamSink); + } + + @Override + public void onCancel(Object o) { + imageStreamReader.setOnImageAvailableListener(null, null); + } + }); + } + + private void setImageStreamImageAvailableListener(final EventChannel.EventSink imageStreamSink) { + imageStreamReader.setOnImageAvailableListener( + reader -> { + Image img = reader.acquireLatestImage(); + if (img == null) return; + + List> planes = new ArrayList<>(); + for (Image.Plane plane : img.getPlanes()) { + ByteBuffer buffer = plane.getBuffer(); + + byte[] bytes = new byte[buffer.remaining()]; + buffer.get(bytes, 0, bytes.length); + + Map planeBuffer = new HashMap<>(); + planeBuffer.put("bytesPerRow", plane.getRowStride()); + planeBuffer.put("bytesPerPixel", plane.getPixelStride()); + planeBuffer.put("bytes", bytes); + + planes.add(planeBuffer); + } + + Map imageBuffer = new HashMap<>(); + imageBuffer.put("width", img.getWidth()); + imageBuffer.put("height", img.getHeight()); + imageBuffer.put("format", img.getFormat()); + imageBuffer.put("planes", planes); + + imageStreamSink.success(imageBuffer); + img.close(); + }, + null); + } + + private void sendEvent(EventType eventType) { + sendEvent(eventType, null); + } + + private void sendEvent(EventType eventType, String description) { + if (eventSink != null) { + Map event = new HashMap<>(); + event.put("eventType", eventType.toString().toLowerCase()); + // Only errors have description + if (eventType != EventType.ERROR) { + event.put("errorDescription", description); + } + eventSink.success(event); + } + } + + private void closeCaptureSession() { + if (cameraCaptureSession != null) { + cameraCaptureSession.close(); + cameraCaptureSession = null; + } + } + + public void close() { + closeCaptureSession(); + + if (cameraDevice != null) { + cameraDevice.close(); + cameraDevice = null; + } + if (pictureImageReader != null) { + pictureImageReader.close(); + pictureImageReader = null; + } + if (imageStreamReader != null) { + imageStreamReader.close(); + imageStreamReader = null; + } + if (mediaRecorder != null) { + mediaRecorder.reset(); + mediaRecorder.release(); + mediaRecorder = null; + } + } + + public void dispose() { + close(); + flutterTexture.release(); + orientationEventListener.disable(); + } + + private int getMediaOrientation() { + final int sensorOrientationOffset = + (currentOrientation == ORIENTATION_UNKNOWN) + ? 0 + : (isFrontFacing) ? -currentOrientation : currentOrientation; + return (sensorOrientationOffset + sensorOrientation + 360) % 360; + } + + private enum EventType { + ERROR, + CAMERA_CLOSING, + } +} diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java new file mode 100644 index 000000000000..d703af819181 --- /dev/null +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java @@ -0,0 +1,80 @@ +package io.flutter.plugins.camera; + +import android.Manifest; +import android.Manifest.permission; +import android.app.Activity; +import android.content.pm.PackageManager; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import io.flutter.plugin.common.PluginRegistry; +import io.flutter.plugin.common.PluginRegistry.Registrar; + +public class CameraPermissions { + private static final int CAMERA_REQUEST_ID = 513469796; + private boolean ongoing = false; + + public void requestPermissions( + Registrar registrar, boolean enableAudio, ResultCallback callback) { + if (ongoing) { + callback.onResult("cameraPermission", "Camera permission request ongoing"); + } + Activity activity = registrar.activity(); + if (!hasCameraPermission(activity) || (enableAudio && !hasAudioPermission(activity))) { + registrar.addRequestPermissionsResultListener( + new CameraRequestPermissionsListener( + (String errorCode, String errorDescription) -> { + ongoing = false; + callback.onResult(errorCode, errorDescription); + })); + ongoing = true; + ActivityCompat.requestPermissions( + activity, + enableAudio + ? new String[] {Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO} + : new String[] {Manifest.permission.CAMERA}, + CAMERA_REQUEST_ID); + } else { + // Permissions already exist. Call the callback with success. + callback.onResult(null, null); + } + } + + private boolean hasCameraPermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, permission.CAMERA) + == PackageManager.PERMISSION_GRANTED; + } + + private boolean hasAudioPermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, permission.RECORD_AUDIO) + == PackageManager.PERMISSION_GRANTED; + } + + private static class CameraRequestPermissionsListener + implements PluginRegistry.RequestPermissionsResultListener { + final ResultCallback callback; + + private CameraRequestPermissionsListener(ResultCallback callback) { + this.callback = callback; + } + + @Override + public boolean onRequestPermissionsResult(int id, String[] permissions, int[] grantResults) { + if (id == CAMERA_REQUEST_ID) { + if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { + callback.onResult("cameraPermission", "MediaRecorderCamera permission not granted"); + } else if (grantResults.length > 1 + && grantResults[1] != PackageManager.PERMISSION_GRANTED) { + callback.onResult("cameraPermission", "MediaRecorderAudio permission not granted"); + } else { + callback.onResult(null, null); + } + return true; + } + return false; + } + } + + interface ResultCallback { + void onResult(String errorCode, String errorDescription); + } +} diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java index 1a6b4c0de984..2d16e0be80ef 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java @@ -1,88 +1,33 @@ package io.flutter.plugins.camera; -import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; - -import android.Manifest; -import android.app.Activity; -import android.content.Context; -import android.content.pm.PackageManager; -import android.graphics.ImageFormat; -import android.graphics.Point; -import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; -import android.hardware.camera2.CameraCaptureSession; -import android.hardware.camera2.CameraCharacteristics; -import android.hardware.camera2.CameraDevice; -import android.hardware.camera2.CameraManager; -import android.hardware.camera2.CameraMetadata; -import android.hardware.camera2.CaptureFailure; -import android.hardware.camera2.CaptureRequest; -import android.hardware.camera2.params.StreamConfigurationMap; -import android.media.Image; -import android.media.ImageReader; -import android.media.MediaRecorder; import android.os.Build; -import android.util.Size; -import android.view.Display; -import android.view.OrientationEventListener; -import android.view.Surface; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; 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.plugin.common.PluginRegistry; import io.flutter.plugin.common.PluginRegistry.Registrar; import io.flutter.view.FlutterView; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; public class CameraPlugin implements MethodCallHandler { - private static final int CAMERA_REQUEST_ID = 513469796; - private static final String TAG = "CameraPlugin"; - - private static CameraManager cameraManager; + private final CameraPermissions cameraPermissions = new CameraPermissions(); private final FlutterView view; + private final Registrar registrar; + private final EventChannel imageStreamChannel; private Camera camera; - private Registrar registrar; - // The code to run after requesting camera permissions. - private Runnable cameraPermissionContinuation; - private final OrientationEventListener orientationEventListener; - private int currentOrientation = ORIENTATION_UNKNOWN; - private CameraPlugin(Registrar registrar, FlutterView view) { + private CameraPlugin(Registrar registrar) { this.registrar = registrar; - this.view = view; - - orientationEventListener = - new OrientationEventListener(registrar.activity().getApplicationContext()) { - @Override - public void onOrientationChanged(int i) { - if (i == ORIENTATION_UNKNOWN) { - return; - } - // Convert the raw deg angle to the nearest multiple of 90. - currentOrientation = (int) Math.round(i / 90.0) * 90; - } - }; - - registrar.addRequestPermissionsResultListener(new CameraRequestPermissionsListener()); + this.view = registrar.view(); + this.imageStreamChannel = + new EventChannel(registrar.messenger(), "plugins.flutter.io/camera/imageStream"); } public static void registerWith(Registrar registrar) { - if (registrar.activity() == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // When a background flutter view tries to register the plugin, the registrar has no activity. // We stop the registration process as this plugin is foreground only. Also, if the sdk is // less than 21 (min sdk for Camera2) we don't register the plugin. @@ -92,61 +37,59 @@ public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/camera"); - cameraManager = (CameraManager) registrar.activity().getSystemService(Context.CAMERA_SERVICE); + channel.setMethodCallHandler(new CameraPlugin(registrar)); + } + + private void instantiateCamera(MethodCall call, Result result) throws CameraAccessException { + String cameraName = call.argument("cameraName"); + String resolutionPreset = call.argument("resolutionPreset"); + boolean enableAudio = call.argument("enableAudio"); + camera = new Camera(registrar.activity(), view, cameraName, resolutionPreset, enableAudio); + + EventChannel cameraEventChannel = + new EventChannel( + registrar.messenger(), + "flutter.io/cameraPlugin/cameraEvents" + camera.getFlutterTexture().id()); + camera.setupCameraEventChannel(cameraEventChannel); - channel.setMethodCallHandler(new CameraPlugin(registrar, registrar.view())); + camera.open(result); } @Override - public void onMethodCall(MethodCall call, final Result result) { + public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { switch (call.method) { case "availableCameras": try { - String[] cameraNames = cameraManager.getCameraIdList(); - List> cameras = new ArrayList<>(); - for (String cameraName : cameraNames) { - HashMap details = new HashMap<>(); - CameraCharacteristics characteristics = - cameraManager.getCameraCharacteristics(cameraName); - details.put("name", cameraName); - @SuppressWarnings("ConstantConditions") - int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); - details.put("sensorOrientation", sensorOrientation); - - int lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING); - switch (lensFacing) { - case CameraMetadata.LENS_FACING_FRONT: - details.put("lensFacing", "front"); - break; - case CameraMetadata.LENS_FACING_BACK: - details.put("lensFacing", "back"); - break; - case CameraMetadata.LENS_FACING_EXTERNAL: - details.put("lensFacing", "external"); - break; - } - cameras.add(details); - } - result.success(cameras); + result.success(CameraUtils.getAvailableCameras(registrar.activity())); } catch (Exception e) { handleException(e, result); } break; case "initialize": { - String cameraName = call.argument("cameraName"); - String resolutionPreset = call.argument("resolutionPreset"); - boolean enableAudio = call.argument("enableAudio"); if (camera != null) { camera.close(); } - camera = new Camera(cameraName, resolutionPreset, result, enableAudio); - orientationEventListener.enable(); + cameraPermissions.requestPermissions( + registrar, + call.argument("enableAudio"), + (String errCode, String errDesc) -> { + if (errCode == null) { + try { + instantiateCamera(call, result); + } catch (Exception e) { + handleException(e, result); + } + } else { + result.error(errCode, errDesc, null); + } + }); + break; } case "takePicture": { - camera.takePicture((String) call.argument("path"), result); + camera.takePicture(call.argument("path"), result); break; } case "prepareForVideoRecording": @@ -157,8 +100,7 @@ public void onMethodCall(MethodCall call, final Result result) { } case "startVideoRecording": { - final String filePath = call.argument("filePath"); - camera.startVideoRecording(filePath, result); + camera.startVideoRecording(call.argument("filePath"), result); break; } case "stopVideoRecording": @@ -169,7 +111,7 @@ public void onMethodCall(MethodCall call, final Result result) { case "startImageStream": { try { - camera.startPreviewWithImageStream(); + camera.startPreviewWithImageStream(imageStreamChannel); result.success(null); } catch (Exception e) { handleException(e, result); @@ -191,7 +133,6 @@ public void onMethodCall(MethodCall call, final Result result) { if (camera != null) { camera.dispose(); } - orientationEventListener.disable(); result.success(null); break; } @@ -212,689 +153,4 @@ private void handleException(Exception exception, Result result) { throw (RuntimeException) exception; } - - private static class CompareSizesByArea implements Comparator { - @Override - public int compare(Size lhs, Size rhs) { - // We cast here to ensure the multiplications won't overflow. - return Long.signum( - (long) lhs.getWidth() * lhs.getHeight() - (long) rhs.getWidth() * rhs.getHeight()); - } - } - - private class CameraRequestPermissionsListener - implements PluginRegistry.RequestPermissionsResultListener { - @Override - public boolean onRequestPermissionsResult(int id, String[] permissions, int[] grantResults) { - if (id == CAMERA_REQUEST_ID) { - cameraPermissionContinuation.run(); - return true; - } - return false; - } - } - - private class Camera { - private final FlutterView.SurfaceTextureEntry textureEntry; - private CameraDevice cameraDevice; - private CameraCaptureSession cameraCaptureSession; - private EventChannel.EventSink eventSink; - private ImageReader pictureImageReader; - private ImageReader imageStreamReader; - private int sensorOrientation; - private boolean isFrontFacing; - private String cameraName; - private Size captureSize; - private Size previewSize; - private CaptureRequest.Builder captureRequestBuilder; - private Size videoSize; - private MediaRecorder mediaRecorder; - private boolean recordingVideo; - private boolean enableAudio; - - Camera( - final String cameraName, - final String resolutionPreset, - @NonNull final Result result, - final boolean enableAudio) { - - this.cameraName = cameraName; - this.enableAudio = enableAudio; - textureEntry = view.createSurfaceTexture(); - - registerEventChannel(); - - try { - int minHeight; - switch (resolutionPreset) { - case "high": - minHeight = 720; - break; - case "medium": - minHeight = 480; - break; - case "low": - minHeight = 240; - break; - default: - throw new IllegalArgumentException("Unknown preset: " + resolutionPreset); - } - - CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName); - StreamConfigurationMap streamConfigurationMap = - characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); - //noinspection ConstantConditions - sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); - //noinspection ConstantConditions - isFrontFacing = - characteristics.get(CameraCharacteristics.LENS_FACING) - == CameraMetadata.LENS_FACING_FRONT; - computeBestCaptureSize(streamConfigurationMap); - computeBestPreviewAndRecordingSize(streamConfigurationMap, minHeight, captureSize); - - if (cameraPermissionContinuation != null) { - result.error("cameraPermission", "Camera permission request ongoing", null); - } - cameraPermissionContinuation = - new Runnable() { - @Override - public void run() { - cameraPermissionContinuation = null; - if (!hasCameraPermission()) { - result.error( - "cameraPermission", "MediaRecorderCamera permission not granted", null); - return; - } - if (enableAudio && !hasAudioPermission()) { - result.error( - "cameraPermission", "MediaRecorderAudio permission not granted", null); - return; - } - open(result); - } - }; - if (hasCameraPermission() && (!enableAudio || hasAudioPermission())) { - cameraPermissionContinuation.run(); - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - final Activity activity = registrar.activity(); - if (activity == null) { - throw new IllegalStateException("No activity available!"); - } - - activity.requestPermissions( - enableAudio - ? new String[] {Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO} - : new String[] {Manifest.permission.CAMERA}, - CAMERA_REQUEST_ID); - } - } - } catch (CameraAccessException e) { - result.error("CameraAccess", e.getMessage(), null); - } catch (IllegalArgumentException e) { - result.error("IllegalArgumentException", e.getMessage(), null); - } - } - - private void registerEventChannel() { - new EventChannel( - registrar.messenger(), "flutter.io/cameraPlugin/cameraEvents" + textureEntry.id()) - .setStreamHandler( - new EventChannel.StreamHandler() { - @Override - public void onListen(Object arguments, EventChannel.EventSink eventSink) { - Camera.this.eventSink = eventSink; - } - - @Override - public void onCancel(Object arguments) { - Camera.this.eventSink = null; - } - }); - } - - private boolean hasCameraPermission() { - final Activity activity = registrar.activity(); - if (activity == null) { - throw new IllegalStateException("No activity available!"); - } - - return Build.VERSION.SDK_INT < Build.VERSION_CODES.M - || activity.checkSelfPermission(Manifest.permission.CAMERA) - == PackageManager.PERMISSION_GRANTED; - } - - private boolean hasAudioPermission() { - final Activity activity = registrar.activity(); - if (activity == null) { - throw new IllegalStateException("No activity available!"); - } - - return Build.VERSION.SDK_INT < Build.VERSION_CODES.M - || activity.checkSelfPermission(Manifest.permission.RECORD_AUDIO) - == PackageManager.PERMISSION_GRANTED; - } - - private void computeBestPreviewAndRecordingSize( - StreamConfigurationMap streamConfigurationMap, int minHeight, Size captureSize) { - Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class); - - // Preview size and video size should not be greater than screen resolution or 1080. - Point screenResolution = new Point(); - - final Activity activity = registrar.activity(); - if (activity == null) { - throw new IllegalStateException("No activity available!"); - } - - Display display = activity.getWindowManager().getDefaultDisplay(); - display.getRealSize(screenResolution); - - final boolean swapWH = getMediaOrientation() % 180 == 90; - int screenWidth = swapWH ? screenResolution.y : screenResolution.x; - int screenHeight = swapWH ? screenResolution.x : screenResolution.y; - - List goodEnough = new ArrayList<>(); - for (Size s : sizes) { - if (minHeight <= s.getHeight() - && s.getWidth() <= screenWidth - && s.getHeight() <= screenHeight - && s.getHeight() <= 1080) { - goodEnough.add(s); - } - } - - Collections.sort(goodEnough, new CompareSizesByArea()); - - if (goodEnough.isEmpty()) { - previewSize = sizes[0]; - videoSize = sizes[0]; - } else { - float captureSizeRatio = (float) captureSize.getWidth() / captureSize.getHeight(); - - previewSize = goodEnough.get(0); - for (Size s : goodEnough) { - if ((float) s.getWidth() / s.getHeight() == captureSizeRatio) { - previewSize = s; - break; - } - } - - Collections.reverse(goodEnough); - videoSize = goodEnough.get(0); - for (Size s : goodEnough) { - if ((float) s.getWidth() / s.getHeight() == captureSizeRatio) { - videoSize = s; - break; - } - } - } - } - - private void computeBestCaptureSize(StreamConfigurationMap streamConfigurationMap) { - // For still image captures, we use the largest available size. - captureSize = - Collections.max( - Arrays.asList(streamConfigurationMap.getOutputSizes(ImageFormat.JPEG)), - new CompareSizesByArea()); - } - - private void prepareMediaRecorder(String outputFilePath) throws IOException { - if (mediaRecorder != null) { - mediaRecorder.release(); - } - mediaRecorder = new MediaRecorder(); - - if (enableAudio) mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); - mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); - mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); - if (enableAudio) mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); - mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); - mediaRecorder.setVideoEncodingBitRate(1024 * 1000); - if (enableAudio) mediaRecorder.setAudioSamplingRate(16000); - mediaRecorder.setVideoFrameRate(27); - mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight()); - mediaRecorder.setOutputFile(outputFilePath); - mediaRecorder.setOrientationHint(getMediaOrientation()); - - mediaRecorder.prepare(); - } - - private void open(@Nullable final Result result) { - if (!hasCameraPermission()) { - if (result != null) result.error("cameraPermission", "Camera permission not granted", null); - } else { - try { - pictureImageReader = - ImageReader.newInstance( - captureSize.getWidth(), captureSize.getHeight(), ImageFormat.JPEG, 2); - - // Used to steam image byte data to dart side. - imageStreamReader = - ImageReader.newInstance( - previewSize.getWidth(), previewSize.getHeight(), ImageFormat.YUV_420_888, 2); - - cameraManager.openCamera( - cameraName, - new CameraDevice.StateCallback() { - @Override - public void onOpened(@NonNull CameraDevice cameraDevice) { - Camera.this.cameraDevice = cameraDevice; - try { - startPreview(); - } catch (CameraAccessException e) { - if (result != null) result.error("CameraAccess", e.getMessage(), null); - cameraDevice.close(); - Camera.this.cameraDevice = null; - return; - } - - if (result != null) { - Map reply = new HashMap<>(); - reply.put("textureId", textureEntry.id()); - reply.put("previewWidth", previewSize.getWidth()); - reply.put("previewHeight", previewSize.getHeight()); - result.success(reply); - } - } - - @Override - public void onClosed(@NonNull CameraDevice camera) { - if (eventSink != null) { - Map event = new HashMap<>(); - event.put("eventType", "cameraClosing"); - eventSink.success(event); - } - super.onClosed(camera); - } - - @Override - public void onDisconnected(@NonNull CameraDevice cameraDevice) { - cameraDevice.close(); - Camera.this.cameraDevice = null; - sendErrorEvent("The camera was disconnected."); - } - - @Override - public void onError(@NonNull CameraDevice cameraDevice, int errorCode) { - cameraDevice.close(); - Camera.this.cameraDevice = null; - String errorDescription; - switch (errorCode) { - case ERROR_CAMERA_IN_USE: - errorDescription = "The camera device is in use already."; - break; - case ERROR_MAX_CAMERAS_IN_USE: - errorDescription = "Max cameras in use"; - break; - case ERROR_CAMERA_DISABLED: - errorDescription = - "The camera device could not be opened due to a device policy."; - break; - case ERROR_CAMERA_DEVICE: - errorDescription = "The camera device has encountered a fatal error"; - break; - case ERROR_CAMERA_SERVICE: - errorDescription = "The camera service has encountered a fatal error."; - break; - default: - errorDescription = "Unknown camera error"; - } - sendErrorEvent(errorDescription); - } - }, - null); - } catch (CameraAccessException e) { - if (result != null) result.error("cameraAccess", e.getMessage(), null); - } - } - } - - private void writeToFile(ByteBuffer buffer, File file) throws IOException { - try (FileOutputStream outputStream = new FileOutputStream(file)) { - while (0 < buffer.remaining()) { - outputStream.getChannel().write(buffer); - } - } - } - - private void takePicture(String filePath, @NonNull final Result result) { - final File file = new File(filePath); - - if (file.exists()) { - result.error( - "fileExists", - "File at path '" + filePath + "' already exists. Cannot overwrite.", - null); - return; - } - - pictureImageReader.setOnImageAvailableListener( - new ImageReader.OnImageAvailableListener() { - @Override - public void onImageAvailable(ImageReader reader) { - try (Image image = reader.acquireLatestImage()) { - ByteBuffer buffer = image.getPlanes()[0].getBuffer(); - writeToFile(buffer, file); - result.success(null); - } catch (IOException e) { - result.error("IOError", "Failed saving image", null); - } - } - }, - null); - - try { - final CaptureRequest.Builder captureBuilder = - cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); - captureBuilder.addTarget(pictureImageReader.getSurface()); - captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getMediaOrientation()); - - cameraCaptureSession.capture( - captureBuilder.build(), - new CameraCaptureSession.CaptureCallback() { - @Override - public void onCaptureFailed( - @NonNull CameraCaptureSession session, - @NonNull CaptureRequest request, - @NonNull CaptureFailure failure) { - String reason; - switch (failure.getReason()) { - case CaptureFailure.REASON_ERROR: - reason = "An error happened in the framework"; - break; - case CaptureFailure.REASON_FLUSHED: - reason = "The capture has failed due to an abortCaptures() call"; - break; - default: - reason = "Unknown reason"; - } - result.error("captureFailure", reason, null); - } - }, - null); - } catch (CameraAccessException e) { - result.error("cameraAccess", e.getMessage(), null); - } - } - - private void startVideoRecording(String filePath, @NonNull final Result result) { - if (cameraDevice == null) { - result.error("configureFailed", "Camera was closed during configuration.", null); - return; - } - if (new File(filePath).exists()) { - result.error( - "fileExists", - "File at path '" + filePath + "' already exists. Cannot overwrite.", - null); - return; - } - try { - closeCaptureSession(); - prepareMediaRecorder(filePath); - - recordingVideo = true; - - SurfaceTexture surfaceTexture = textureEntry.surfaceTexture(); - surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); - captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); - - List surfaces = new ArrayList<>(); - - Surface previewSurface = new Surface(surfaceTexture); - surfaces.add(previewSurface); - captureRequestBuilder.addTarget(previewSurface); - - Surface recorderSurface = mediaRecorder.getSurface(); - surfaces.add(recorderSurface); - captureRequestBuilder.addTarget(recorderSurface); - - cameraDevice.createCaptureSession( - surfaces, - new CameraCaptureSession.StateCallback() { - @Override - public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { - try { - if (cameraDevice == null) { - result.error("configureFailed", "Camera was closed during configuration", null); - return; - } - Camera.this.cameraCaptureSession = cameraCaptureSession; - captureRequestBuilder.set( - CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); - cameraCaptureSession.setRepeatingRequest( - captureRequestBuilder.build(), null, null); - mediaRecorder.start(); - result.success(null); - } catch (CameraAccessException - | IllegalStateException - | IllegalArgumentException e) { - result.error("cameraException", e.getMessage(), null); - } - } - - @Override - public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { - result.error("configureFailed", "Failed to configure camera session", null); - } - }, - null); - } catch (CameraAccessException | IOException e) { - result.error("videoRecordingFailed", e.getMessage(), null); - } - } - - private void stopVideoRecording(@NonNull final Result result) { - if (!recordingVideo) { - result.success(null); - return; - } - - try { - recordingVideo = false; - mediaRecorder.stop(); - mediaRecorder.reset(); - startPreview(); - result.success(null); - } catch (CameraAccessException | IllegalStateException e) { - result.error("videoRecordingFailed", e.getMessage(), null); - } - } - - private void startPreview() throws CameraAccessException { - closeCaptureSession(); - - SurfaceTexture surfaceTexture = textureEntry.surfaceTexture(); - surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); - captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); - - List surfaces = new ArrayList<>(); - - Surface previewSurface = new Surface(surfaceTexture); - surfaces.add(previewSurface); - captureRequestBuilder.addTarget(previewSurface); - - surfaces.add(pictureImageReader.getSurface()); - - cameraDevice.createCaptureSession( - surfaces, - new CameraCaptureSession.StateCallback() { - - @Override - public void onConfigured(@NonNull CameraCaptureSession session) { - if (cameraDevice == null) { - sendErrorEvent("The camera was closed during configuration."); - return; - } - try { - cameraCaptureSession = session; - captureRequestBuilder.set( - CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); - cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); - } catch (CameraAccessException | IllegalStateException | IllegalArgumentException e) { - sendErrorEvent(e.getMessage()); - } - } - - @Override - public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { - sendErrorEvent("Failed to configure the camera for preview."); - } - }, - null); - } - - private void startPreviewWithImageStream() throws CameraAccessException { - closeCaptureSession(); - - SurfaceTexture surfaceTexture = textureEntry.surfaceTexture(); - surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); - - captureRequestBuilder = - cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); - - List surfaces = new ArrayList<>(); - - Surface previewSurface = new Surface(surfaceTexture); - surfaces.add(previewSurface); - captureRequestBuilder.addTarget(previewSurface); - - surfaces.add(imageStreamReader.getSurface()); - captureRequestBuilder.addTarget(imageStreamReader.getSurface()); - - cameraDevice.createCaptureSession( - surfaces, - new CameraCaptureSession.StateCallback() { - @Override - public void onConfigured(@NonNull CameraCaptureSession session) { - if (cameraDevice == null) { - sendErrorEvent("The camera was closed during configuration."); - return; - } - try { - cameraCaptureSession = session; - captureRequestBuilder.set( - CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); - cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); - } catch (CameraAccessException | IllegalStateException | IllegalArgumentException e) { - sendErrorEvent(e.getMessage()); - } - } - - @Override - public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { - sendErrorEvent("Failed to configure the camera for streaming images."); - } - }, - null); - - registerImageStreamEventChannel(); - } - - private void registerImageStreamEventChannel() { - final EventChannel imageStreamChannel = - new EventChannel(registrar.messenger(), "plugins.flutter.io/camera/imageStream"); - - imageStreamChannel.setStreamHandler( - new EventChannel.StreamHandler() { - @Override - public void onListen(Object o, EventChannel.EventSink eventSink) { - setImageStreamImageAvailableListener(eventSink); - } - - @Override - public void onCancel(Object o) { - imageStreamReader.setOnImageAvailableListener(null, null); - } - }); - } - - private void setImageStreamImageAvailableListener(final EventChannel.EventSink eventSink) { - imageStreamReader.setOnImageAvailableListener( - new ImageReader.OnImageAvailableListener() { - @Override - public void onImageAvailable(final ImageReader reader) { - Image img = reader.acquireLatestImage(); - if (img == null) return; - - List> planes = new ArrayList<>(); - for (Image.Plane plane : img.getPlanes()) { - ByteBuffer buffer = plane.getBuffer(); - - byte[] bytes = new byte[buffer.remaining()]; - buffer.get(bytes, 0, bytes.length); - - Map planeBuffer = new HashMap<>(); - planeBuffer.put("bytesPerRow", plane.getRowStride()); - planeBuffer.put("bytesPerPixel", plane.getPixelStride()); - planeBuffer.put("bytes", bytes); - - planes.add(planeBuffer); - } - - Map imageBuffer = new HashMap<>(); - imageBuffer.put("width", img.getWidth()); - imageBuffer.put("height", img.getHeight()); - imageBuffer.put("format", img.getFormat()); - imageBuffer.put("planes", planes); - - eventSink.success(imageBuffer); - img.close(); - } - }, - null); - } - - private void sendErrorEvent(String errorDescription) { - if (eventSink != null) { - Map event = new HashMap<>(); - event.put("eventType", "error"); - event.put("errorDescription", errorDescription); - eventSink.success(event); - } - } - - private void closeCaptureSession() { - if (cameraCaptureSession != null) { - cameraCaptureSession.close(); - cameraCaptureSession = null; - } - } - - private void close() { - closeCaptureSession(); - - if (cameraDevice != null) { - cameraDevice.close(); - cameraDevice = null; - } - if (pictureImageReader != null) { - pictureImageReader.close(); - pictureImageReader = null; - } - if (imageStreamReader != null) { - imageStreamReader.close(); - imageStreamReader = null; - } - if (mediaRecorder != null) { - mediaRecorder.reset(); - mediaRecorder.release(); - mediaRecorder = null; - } - } - - private void dispose() { - close(); - textureEntry.release(); - } - - private int getMediaOrientation() { - final int sensorOrientationOffset = - (currentOrientation == ORIENTATION_UNKNOWN) - ? 0 - : (isFrontFacing) ? -currentOrientation : currentOrientation; - return (sensorOrientationOffset + sensorOrientation + 360) % 360; - } - } } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java new file mode 100644 index 000000000000..517db1537041 --- /dev/null +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java @@ -0,0 +1,129 @@ +package io.flutter.plugins.camera; + +import android.app.Activity; +import android.content.Context; +import android.graphics.ImageFormat; +import android.graphics.Point; +import android.graphics.SurfaceTexture; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.params.StreamConfigurationMap; +import android.util.Size; +import android.view.Display; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** Provides various utilities for camera. */ +public final class CameraUtils { + + private CameraUtils() {} + + static Size[] computeBestPreviewAndRecordingSize( + Activity activity, + StreamConfigurationMap streamConfigurationMap, + int minHeight, + int orientation, + Size captureSize) { + Size previewSize, videoSize; + Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class); + + // Preview size and video size should not be greater than screen resolution or 1080. + Point screenResolution = new Point(); + + Display display = activity.getWindowManager().getDefaultDisplay(); + display.getRealSize(screenResolution); + + final boolean swapWH = orientation % 180 == 90; + int screenWidth = swapWH ? screenResolution.y : screenResolution.x; + int screenHeight = swapWH ? screenResolution.x : screenResolution.y; + + List goodEnough = new ArrayList<>(); + for (Size s : sizes) { + if (minHeight <= s.getHeight() + && s.getWidth() <= screenWidth + && s.getHeight() <= screenHeight + && s.getHeight() <= 1080) { + goodEnough.add(s); + } + } + + Collections.sort(goodEnough, new CompareSizesByArea()); + + if (goodEnough.isEmpty()) { + previewSize = sizes[0]; + videoSize = sizes[0]; + } else { + float captureSizeRatio = (float) captureSize.getWidth() / captureSize.getHeight(); + + previewSize = goodEnough.get(0); + for (Size s : goodEnough) { + if ((float) s.getWidth() / s.getHeight() == captureSizeRatio) { + previewSize = s; + break; + } + } + + Collections.reverse(goodEnough); + videoSize = goodEnough.get(0); + for (Size s : goodEnough) { + if ((float) s.getWidth() / s.getHeight() == captureSizeRatio) { + videoSize = s; + break; + } + } + } + return new Size[] {videoSize, previewSize}; + } + + static Size computeBestCaptureSize(StreamConfigurationMap streamConfigurationMap) { + // For still image captures, we use the largest available size. + return Collections.max( + Arrays.asList(streamConfigurationMap.getOutputSizes(ImageFormat.JPEG)), + new CompareSizesByArea()); + } + + public static List> getAvailableCameras(Activity activity) + throws CameraAccessException { + CameraManager cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); + String[] cameraNames = cameraManager.getCameraIdList(); + List> cameras = new ArrayList<>(); + for (String cameraName : cameraNames) { + HashMap details = new HashMap<>(); + CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName); + details.put("name", cameraName); + int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + details.put("sensorOrientation", sensorOrientation); + + int lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING); + switch (lensFacing) { + case CameraMetadata.LENS_FACING_FRONT: + details.put("lensFacing", "front"); + break; + case CameraMetadata.LENS_FACING_BACK: + details.put("lensFacing", "back"); + break; + case CameraMetadata.LENS_FACING_EXTERNAL: + details.put("lensFacing", "external"); + break; + } + cameras.add(details); + } + return cameras; + } + + private static class CompareSizesByArea implements Comparator { + @Override + public int compare(Size lhs, Size rhs) { + // We cast here to ensure the multiplications won't overflow. + return Long.signum( + (long) lhs.getWidth() * lhs.getHeight() - (long) rhs.getWidth() * rhs.getHeight()); + } + } +} From 8c8bec09ae50ca6022ea8b982428611e177f92d1 Mon Sep 17 00:00:00 2001 From: Klaus Jokinen <36441457+KlausJokinen@users.noreply.github.com> Date: Wed, 7 Aug 2019 18:50:36 +0300 Subject: [PATCH 003/133] [google_maps] Set correct polyline width when building polylines. (#1935) * Fix polyline width when created by adding density option to PolyLineBuilder class * Version bump * Adjust changelog --- packages/google_maps_flutter/CHANGELOG.md | 4 ++++ .../java/io/flutter/plugins/googlemaps/PolylineBuilder.java | 6 ++++-- .../io/flutter/plugins/googlemaps/PolylinesController.java | 2 +- packages/google_maps_flutter/pubspec.yaml | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index aecdc28a1541..d3f56e36327d 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.20+2 + +* Android: Fix polyline width in building phase. + ## 0.5.20+1 * Android: Unregister ActivityLifecycleCallbacks on activity destroy (fixes a memory leak). diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java index 034659768844..49091b4686d4 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java @@ -9,9 +9,11 @@ class PolylineBuilder implements PolylineOptionsSink { private final PolylineOptions polylineOptions; private boolean consumeTapEvents; + private final float density; - PolylineBuilder() { + PolylineBuilder(float density) { this.polylineOptions = new PolylineOptions(); + this.density = density; } PolylineOptions build() { @@ -70,7 +72,7 @@ public void setVisible(boolean visible) { @Override public void setWidth(float width) { - polylineOptions.width(width); + polylineOptions.width(width * density); } @Override diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylinesController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylinesController.java index cafc94c53a7d..a6ad61adc170 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylinesController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylinesController.java @@ -81,7 +81,7 @@ private void addPolyline(Object polyline) { if (polyline == null) { return; } - PolylineBuilder polylineBuilder = new PolylineBuilder(); + PolylineBuilder polylineBuilder = new PolylineBuilder(density); String polylineId = Convert.interpretPolylineOptions(polyline, polylineBuilder); PolylineOptions options = polylineBuilder.build(); addPolyline(polylineId, options, polylineBuilder.consumeTapEvents()); diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 7b595046e1a3..dcd2b3eb4ed3 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+1 +version: 0.5.20+2 dependencies: flutter: From e876d3ed840d09ca281a4e4ad5bfff0bf07fa903 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Wed, 7 Aug 2019 14:14:38 -0700 Subject: [PATCH 004/133] [webview_flutter] Add an initialAutoMediaPlaybackPolicy setting (#1951) Controls whether a user action (e.g is touch event) is required in order to start media playback. --- packages/webview_flutter/CHANGELOG.md | 5 + .../webviewflutter/FlutterWebView.java | 8 + .../example/assets/sample_audio.ogg | Bin 0 -> 36870 bytes packages/webview_flutter/example/pubspec.yaml | 4 +- .../example/test_driver/webview.dart | 161 ++++++++++++++++++ .../ios/Classes/FlutterWebView.m | 30 +++- .../lib/platform_interface.dart | 14 +- .../lib/src/webview_method_channel.dart | 3 +- .../webview_flutter/lib/webview_flutter.dart | 40 ++++- packages/webview_flutter/pubspec.yaml | 2 +- 10 files changed, 257 insertions(+), 10 deletions(-) create mode 100644 packages/webview_flutter/example/assets/sample_audio.ogg diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index d5801c7a6516..eb7b1bc4684f 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.11 + +* Add an initialAutoMediaPlaybackPolicy setting for controlling how auto media + playback is restricted. + ## 0.3.10+5 * Add dependency on `androidx.annotation:annotation:1.0.0`. diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 838987714d31..80431ad4cd5b 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -51,6 +51,7 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { registerJavaScriptChannelNames((List) params.get(JS_CHANNEL_NAMES_FIELD)); } + updateAutoMediaPlaybackPolicy((Integer) params.get("autoMediaPlaybackPolicy")); if (params.containsKey("initialUrl")) { String url = (String) params.get("initialUrl"); webView.loadUrl(url); @@ -251,6 +252,13 @@ private void updateJsMode(int mode) { } } + private void updateAutoMediaPlaybackPolicy(int mode) { + // This is the index of the AutoMediaPlaybackPolicy enum, index 1 is always_allow, for all + // other values we require a user gesture. + boolean requireUserGesture = mode != 1; + webView.getSettings().setMediaPlaybackRequiresUserGesture(requireUserGesture); + } + private void registerJavaScriptChannelNames(List channelNames) { for (String channelName : channelNames) { webView.addJavascriptInterface( diff --git a/packages/webview_flutter/example/assets/sample_audio.ogg b/packages/webview_flutter/example/assets/sample_audio.ogg new file mode 100644 index 0000000000000000000000000000000000000000..27e17104277b38ae70d3936f5afb4ea32477ec22 GIT binary patch literal 36870 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 XfG+?r+!9a#U;+;`01|XOAOHdYynO-T literal 0 HcmV?d00001 diff --git a/packages/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/example/pubspec.yaml index 6ec8a1ddd0ea..8657cfde0f8b 100644 --- a/packages/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/example/pubspec.yaml @@ -1,7 +1,7 @@ name: webview_flutter_example description: Demonstrates how to use the webview_flutter plugin. -version: 1.0.0+1 +version: 1.0.1 environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" @@ -20,3 +20,5 @@ dev_dependencies: flutter: uses-material-design: true + assets: + - assets/sample_audio.ogg diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index 7a290a05bd5b..b6abff94e6b2 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -3,7 +3,11 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; +import 'dart:convert'; +import 'dart:typed_data'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -132,9 +136,166 @@ void main() { await controller.evaluateJavascript('Echo.postMessage("hello");'); expect(messagesReceived, equals(['hello'])); }); + + group('Media playback policy', () { + String audioTestBase64; + setUpAll(() async { + final ByteData audioData = + await rootBundle.load('assets/sample_audio.ogg'); + final String base64AudioData = + base64Encode(Uint8List.view(audioData.buffer)); + final String audioTest = ''' + + Audio auto play + + + + + + + '''; + audioTestBase64 = base64Encode(const Utf8Encoder().convert(audioTest)); + }); + + test('Auto media playback', () async { + Completer controllerCompleter = + Completer(); + Completer pageLoaded = Completer(); + + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: 'data:text/html;charset=utf-8;base64,$audioTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, + ), + ), + ); + WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + + String isPaused = await controller.evaluateJavascript('isPaused();'); + expect(isPaused, _webviewBool(false)); + + controllerCompleter = Completer(); + pageLoaded = Completer(); + + // We change the key to re-create a new webview as we change the initialMediaPlaybackPolicy + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: 'data:text/html;charset=utf-8;base64,$audioTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + initialMediaPlaybackPolicy: + AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, + ), + ), + ); + + controller = await controllerCompleter.future; + await pageLoaded.future; + + isPaused = await controller.evaluateJavascript('isPaused();'); + expect(isPaused, _webviewBool(true)); + }); + + test('Changes to initialMediaPlaybackPolocy are ignored', () async { + final Completer controllerCompleter = + Completer(); + Completer pageLoaded = Completer(); + + final GlobalKey key = GlobalKey(); + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: key, + initialUrl: 'data:text/html;charset=utf-8;base64,$audioTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, + ), + ), + ); + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + + String isPaused = await controller.evaluateJavascript('isPaused();'); + expect(isPaused, _webviewBool(false)); + + pageLoaded = Completer(); + + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: key, + initialUrl: 'data:text/html;charset=utf-8;base64,$audioTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + initialMediaPlaybackPolicy: + AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, + ), + ), + ); + + await controller.reload(); + + await pageLoaded.future; + + isPaused = await controller.evaluateJavascript('isPaused();'); + expect(isPaused, _webviewBool(false)); + }); + }); } Future pumpWidget(Widget widget) { runApp(widget); return WidgetsBinding.instance.endOfFrame; } + +// JavaScript booleans evaluate to different string values on Android and iOS. +// This utility method returns the string boolean value of the current platform. +String _webviewBool(bool value) { + if (defaultTargetPlatform == TargetPlatform.iOS) { + return value ? '1' : '0'; + } + return value ? 'true' : 'false'; +} diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index c56d5c7dbcc3..87cb0f57377b 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -62,8 +62,12 @@ - (instancetype)initWithFrame:(CGRect)frame [self registerJavaScriptChannels:_javaScriptChannelNames controller:userContentController]; } + NSDictionary* settings = args[@"settings"]; + WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init]; configuration.userContentController = userContentController; + [self updateAutoMediaPlaybackPolicy:args[@"autoMediaPlaybackPolicy"] + inConfiguration:configuration]; _webView = [[WKWebView alloc] initWithFrame:frame configuration:configuration]; _navigationDelegate = [[FLTWKNavigationDelegate alloc] initWithChannel:_channel]; @@ -72,7 +76,7 @@ - (instancetype)initWithFrame:(CGRect)frame [_channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { [weakSelf onMethodCall:call result:result]; }]; - NSDictionary* settings = args[@"settings"]; + [self applySettings:settings]; // TODO(amirh): return an error if apply settings failed once it's possible to do so. // https://github.com/flutter/flutter/issues/36228 @@ -271,6 +275,30 @@ - (void)updateJsMode:(NSNumber*)mode { } } +- (void)updateAutoMediaPlaybackPolicy:(NSNumber*)policy + inConfiguration:(WKWebViewConfiguration*)configuration { + switch ([policy integerValue]) { + case 0: // require_user_action_for_all_media_types + NSLog(@"requiring user action for all types"); + if (@available(iOS 10.0, *)) { + configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeAll; + } else { + configuration.mediaPlaybackRequiresUserAction = true; + } + break; + case 1: // always_allow + NSLog(@"allowing auto playback"); + if (@available(iOS 10.0, *)) { + configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone; + } else { + configuration.mediaPlaybackRequiresUserAction = false; + } + break; + default: + NSLog(@"webview_flutter: unknown auto media playback policy: %@", policy); + } +} + - (bool)loadRequest:(NSDictionary*)request { if (!request) { return false; diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index bfb5b6255421..4e6b8b86cacf 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -183,9 +183,16 @@ class WebSettings { } /// Configuration to use when creating a new [WebViewPlatformController]. +/// +/// The `autoMediaPlaybackPolicy` parameter must not be null. class CreationParams { - CreationParams( - {this.initialUrl, this.webSettings, this.javascriptChannelNames}); + CreationParams({ + this.initialUrl, + this.webSettings, + this.javascriptChannelNames, + this.autoMediaPlaybackPolicy = + AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, + }) : assert(autoMediaPlaybackPolicy != null); /// The initialUrl to load in the webview. /// @@ -210,6 +217,9 @@ class CreationParams { // to PlatformWebView. final Set javascriptChannelNames; + /// Which restrictions apply on automatic media playback. + final AutoMediaPlaybackPolicy autoMediaPlaybackPolicy; + @override String toString() { return '$runtimeType(initialUrl: $initialUrl, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames)'; diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index ce9988743853..a914e1828b6b 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -103,7 +103,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'removeJavascriptChannels', javascriptChannelNames.toList()); } - /// Method channel mplementation for [WebViewPlatform.clearCookies]. + /// Method channel implementation for [WebViewPlatform.clearCookies]. static Future clearCookies() { return _cookieManagerChannel .invokeMethod('clearCookies') @@ -135,6 +135,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'initialUrl': creationParams.initialUrl, 'settings': _webSettingsToMap(creationParams.webSettings), 'javascriptChannelNames': creationParams.javascriptChannelNames.toList(), + 'autoMediaPlaybackPolicy': creationParams.autoMediaPlaybackPolicy.index, }; } } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 3c0175e2f22b..4335ed27ada8 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -72,6 +72,25 @@ typedef NavigationDecision NavigationDelegate(NavigationRequest navigation); /// Signature for when a [WebView] has finished loading a page. typedef void PageFinishedCallback(String url); +/// Specifies possible restrictions on automatic media playback. +/// +/// This is typically used in [WebView.initialMediaPlaybackPolicy]. +// The method channel implementation is marshalling this enum to the value's index, so the order +// is important. +enum AutoMediaPlaybackPolicy { + /// Starting any kind of media playback requires a user action. + /// + /// For example: JavaScript code cannot start playing media unless the code was executed + /// as a result of a user action (like a touch event). + require_user_action_for_all_media_types, + + /// Starting any kind of media playback is always allowed. + /// + /// For example: JavaScript code that's triggered when the page is loaded can start playing + /// video or audio. + always_allow, +} + final RegExp _validChannelNames = RegExp('^[a-zA-Z_][a-zA-Z0-9]*\$'); /// A named channel for receiving messaged from JavaScript code running inside a web view. @@ -110,7 +129,7 @@ class WebView extends StatefulWidget { /// The web view can be controlled using a `WebViewController` that is passed to the /// `onWebViewCreated` callback once the web view is created. /// - /// The `javascriptMode` parameter must not be null. + /// The `javascriptMode` and `autoMediaPlaybackPolicy` parameters must not be null. const WebView({ Key key, this.onWebViewCreated, @@ -121,7 +140,10 @@ class WebView extends StatefulWidget { this.gestureRecognizers, this.onPageFinished, this.debuggingEnabled = false, + this.initialMediaPlaybackPolicy = + AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, }) : assert(javascriptMode != null), + assert(initialMediaPlaybackPolicy != null), super(key: key); static WebViewPlatform _platform; @@ -255,6 +277,14 @@ class WebView extends StatefulWidget { /// By default `debuggingEnabled` is false. final bool debuggingEnabled; + /// Which restrictions apply on automatic media playback. + /// + /// This initial value is applied to the platform's webview upon creation. Any following + /// changes to this parameter are ignored (as long as the state of the [WebView] is preserved). + /// + /// The default policy is [AutoMediaPlaybackPolicy.require_user_action_for_all_media_types]. + final AutoMediaPlaybackPolicy initialMediaPlaybackPolicy; + @override State createState() => _WebViewState(); } @@ -317,6 +347,7 @@ CreationParams _creationParamsfromWidget(WebView widget) { initialUrl: widget.initialUrl, webSettings: _webSettingsFromWidget(widget), javascriptChannelNames: _extractChannelNames(widget.javascriptChannels), + autoMediaPlaybackPolicy: widget.initialMediaPlaybackPolicy, ); } @@ -351,9 +382,10 @@ WebSettings _clearUnchangedWebSettings( } return WebSettings( - javascriptMode: javascriptMode, - hasNavigationDelegate: hasNavigationDelegate, - debuggingEnabled: debuggingEnabled); + javascriptMode: javascriptMode, + hasNavigationDelegate: hasNavigationDelegate, + debuggingEnabled: debuggingEnabled, + ); } Set _extractChannelNames(Set channels) { diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index c4940c215e0e..6cde699ea336 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.10+5 +version: 0.3.11 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From d515868f9c77d70bb4ac68012976456fe46178cb Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Thu, 8 Aug 2019 08:27:38 -0700 Subject: [PATCH 005/133] [Camera] Improved resolution presets (#1952) This PR is here to address issues in the quality of video recording for the camera plugin on Android, as well as discrepancies in quality level between Android and iOS. It also allows to control the still picture quality (which was so far only maximum quality). The existing resolution presets have been updated to match between Android and iOS, and new presets have been added. There are no breaking changes but the quality of the presets have been adjusted which will result in different picture/video quality on apps using this plugin. We believe this change is necessary as, for the same resolution preset, Android video quality was very poor and the quality on iOS was too high, generating 4k files that are too heavy to upload. --- packages/camera/CHANGELOG.md | 5 + .../io/flutter/plugins/camera/Camera.java | 54 +++---- .../flutter/plugins/camera/CameraUtils.java | 104 ++++++------- packages/camera/example/lib/main.dart | 2 +- packages/camera/example/pubspec.yaml | 2 + .../camera/example/test_driver/camera.dart | 146 ++++++++++++++++++ .../example/test_driver/camera_test.dart | 7 + packages/camera/ios/Classes/CameraPlugin.m | 108 +++++++++---- packages/camera/lib/camera.dart | 29 +++- packages/camera/pubspec.yaml | 8 +- 10 files changed, 345 insertions(+), 120 deletions(-) create mode 100644 packages/camera/example/test_driver/camera.dart create mode 100644 packages/camera/example/test_driver/camera_test.dart diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 2d09af5b8953..196cd3e2c563 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.5.3 + +* Added new quality presets. +* Now all quality presets can be used to control image capture quality. + ## 0.5.2+2 * Fix memory leak related to not unregistering stream handler in FlutterEventChannel when disposing camera. diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index bf99f8d561d5..763e3b516a62 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -1,6 +1,7 @@ package io.flutter.plugins.camera; import static android.view.OrientationEventListener.ORIENTATION_UNKNOWN; +import static io.flutter.plugins.camera.CameraUtils.computeBestPreviewSize; import android.annotation.SuppressLint; import android.app.Activity; @@ -16,6 +17,7 @@ import android.hardware.camera2.CaptureFailure; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.params.StreamConfigurationMap; +import android.media.CamcorderProfile; import android.media.Image; import android.media.ImageReader; import android.media.MediaRecorder; @@ -46,7 +48,6 @@ public class Camera { private final String cameraName; private final Size captureSize; private final Size previewSize; - private final Size videoSize; private final boolean enableAudio; private CameraDevice cameraDevice; @@ -57,8 +58,19 @@ public class Camera { private CaptureRequest.Builder captureRequestBuilder; private MediaRecorder mediaRecorder; private boolean recordingVideo; + private CamcorderProfile recordingProfile; private int currentOrientation = ORIENTATION_UNKNOWN; + // Mirrors camera.dart + public enum ResolutionPreset { + low, + medium, + high, + veryHigh, + ultraHigh, + max, + } + public Camera( final Activity activity, final FlutterView flutterView, @@ -87,21 +99,6 @@ public void onOrientationChanged(int i) { }; orientationEventListener.enable(); - int minHeight; - switch (resolutionPreset) { - case "high": - minHeight = 720; - break; - case "medium": - minHeight = 480; - break; - case "low": - minHeight = 240; - break; - default: - throw new IllegalArgumentException("Unknown preset: " + resolutionPreset); - } - CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName); StreamConfigurationMap streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); @@ -110,12 +107,11 @@ public void onOrientationChanged(int i) { //noinspection ConstantConditions isFrontFacing = characteristics.get(CameraCharacteristics.LENS_FACING) == CameraMetadata.LENS_FACING_FRONT; - captureSize = CameraUtils.computeBestCaptureSize(streamConfigurationMap); - Size[] sizes = - CameraUtils.computeBestPreviewAndRecordingSize( - activity, streamConfigurationMap, minHeight, getMediaOrientation(), captureSize); - videoSize = sizes[0]; - previewSize = sizes[1]; + ResolutionPreset preset = ResolutionPreset.valueOf(resolutionPreset); + recordingProfile = + CameraUtils.getBestAvailableCamcorderProfileForResolutionPreset(cameraName, preset); + captureSize = new Size(recordingProfile.videoFrameWidth, recordingProfile.videoFrameHeight); + previewSize = computeBestPreviewSize(cameraName, preset); } public void setupCameraEventChannel(EventChannel cameraEventChannel) { @@ -143,13 +139,13 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { // of these function calls. if (enableAudio) mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); - mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); - if (enableAudio) mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); - mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); - mediaRecorder.setVideoEncodingBitRate(1024 * 1000); - if (enableAudio) mediaRecorder.setAudioSamplingRate(16000); - mediaRecorder.setVideoFrameRate(27); - mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight()); + mediaRecorder.setOutputFormat(recordingProfile.fileFormat); + if (enableAudio) mediaRecorder.setAudioEncoder(recordingProfile.audioCodec); + mediaRecorder.setVideoEncoder(recordingProfile.videoCodec); + mediaRecorder.setVideoEncodingBitRate(recordingProfile.videoBitRate); + if (enableAudio) mediaRecorder.setAudioSamplingRate(recordingProfile.audioSampleRate); + mediaRecorder.setVideoFrameRate(recordingProfile.videoFrameRate); + mediaRecorder.setVideoSize(recordingProfile.videoFrameWidth, recordingProfile.videoFrameHeight); mediaRecorder.setOutputFile(outputFilePath); mediaRecorder.setOrientationHint(getMediaOrientation()); diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java index 517db1537041..e4613fb237c1 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java @@ -3,15 +3,14 @@ import android.app.Activity; import android.content.Context; import android.graphics.ImageFormat; -import android.graphics.Point; -import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.params.StreamConfigurationMap; +import android.media.CamcorderProfile; import android.util.Size; -import android.view.Display; +import io.flutter.plugins.camera.Camera.ResolutionPreset; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -25,61 +24,14 @@ public final class CameraUtils { private CameraUtils() {} - static Size[] computeBestPreviewAndRecordingSize( - Activity activity, - StreamConfigurationMap streamConfigurationMap, - int minHeight, - int orientation, - Size captureSize) { - Size previewSize, videoSize; - Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class); - - // Preview size and video size should not be greater than screen resolution or 1080. - Point screenResolution = new Point(); - - Display display = activity.getWindowManager().getDefaultDisplay(); - display.getRealSize(screenResolution); - - final boolean swapWH = orientation % 180 == 90; - int screenWidth = swapWH ? screenResolution.y : screenResolution.x; - int screenHeight = swapWH ? screenResolution.x : screenResolution.y; - - List goodEnough = new ArrayList<>(); - for (Size s : sizes) { - if (minHeight <= s.getHeight() - && s.getWidth() <= screenWidth - && s.getHeight() <= screenHeight - && s.getHeight() <= 1080) { - goodEnough.add(s); - } + static Size computeBestPreviewSize(String cameraName, ResolutionPreset preset) { + if (preset.ordinal() > ResolutionPreset.high.ordinal()) { + preset = ResolutionPreset.high; } - Collections.sort(goodEnough, new CompareSizesByArea()); - - if (goodEnough.isEmpty()) { - previewSize = sizes[0]; - videoSize = sizes[0]; - } else { - float captureSizeRatio = (float) captureSize.getWidth() / captureSize.getHeight(); - - previewSize = goodEnough.get(0); - for (Size s : goodEnough) { - if ((float) s.getWidth() / s.getHeight() == captureSizeRatio) { - previewSize = s; - break; - } - } - - Collections.reverse(goodEnough); - videoSize = goodEnough.get(0); - for (Size s : goodEnough) { - if ((float) s.getWidth() / s.getHeight() == captureSizeRatio) { - videoSize = s; - break; - } - } - } - return new Size[] {videoSize, previewSize}; + CamcorderProfile profile = + getBestAvailableCamcorderProfileForResolutionPreset(cameraName, preset); + return new Size(profile.videoFrameWidth, profile.videoFrameHeight); } static Size computeBestCaptureSize(StreamConfigurationMap streamConfigurationMap) { @@ -118,6 +70,46 @@ public static List> getAvailableCameras(Activity activity) return cameras; } + static CamcorderProfile getBestAvailableCamcorderProfileForResolutionPreset( + String cameraName, ResolutionPreset preset) { + int cameraId = Integer.parseInt(cameraName); + switch (preset) { + // All of these cases deliberately fall through to get the best available profile. + case max: + if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_HIGH)) { + return CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); + } + case ultraHigh: + if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_2160P)) { + return CamcorderProfile.get(CamcorderProfile.QUALITY_2160P); + } + case veryHigh: + if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_1080P)) { + return CamcorderProfile.get(CamcorderProfile.QUALITY_1080P); + } + case high: + if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_720P)) { + return CamcorderProfile.get(CamcorderProfile.QUALITY_720P); + } + case medium: + if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_480P)) { + return CamcorderProfile.get(CamcorderProfile.QUALITY_480P); + } + case low: + if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_QVGA)) { + return CamcorderProfile.get(CamcorderProfile.QUALITY_QVGA); + } + default: + if (CamcorderProfile.hasProfile( + Integer.parseInt(cameraName), CamcorderProfile.QUALITY_LOW)) { + return CamcorderProfile.get(CamcorderProfile.QUALITY_LOW); + } else { + throw new IllegalArgumentException( + "No capture session available for current capture session."); + } + } + } + private static class CompareSizesByArea implements Comparator { @Override public int compare(Size lhs, Size rhs) { diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index 70b7ef285796..2e2aa4d0fe1f 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -258,7 +258,7 @@ class _CameraExampleHomeState extends State } controller = CameraController( cameraDescription, - ResolutionPreset.high, + ResolutionPreset.medium, enableAudio: enableAudio, ); diff --git a/packages/camera/example/pubspec.yaml b/packages/camera/example/pubspec.yaml index 834fe1b98cee..59f3821abe21 100644 --- a/packages/camera/example/pubspec.yaml +++ b/packages/camera/example/pubspec.yaml @@ -13,6 +13,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_driver: + sdk: flutter flutter: uses-material-design: true diff --git a/packages/camera/example/test_driver/camera.dart b/packages/camera/example/test_driver/camera.dart new file mode 100644 index 000000000000..7d59016ff0b1 --- /dev/null +++ b/packages/camera/example/test_driver/camera.dart @@ -0,0 +1,146 @@ +import 'dart:async'; +import 'dart:io'; +import 'dart:ui'; + +import 'package:flutter/painting.dart'; +import 'package:flutter_driver/driver_extension.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:camera/camera.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:video_player/video_player.dart'; + +void main() { + final Completer completer = Completer(); + Directory testDir; + enableFlutterDriverExtension(handler: (_) => completer.future); + + setUpAll(() async { + final Directory extDir = await getTemporaryDirectory(); + testDir = await Directory('${extDir.path}/test').create(recursive: true); + }); + + tearDownAll(() async { + await testDir.delete(recursive: true); + completer.complete(null); + }); + + final Map presetExpectedSizes = + { + ResolutionPreset.low: + Platform.isAndroid ? const Size(240, 320) : const Size(288, 352), + ResolutionPreset.medium: + Platform.isAndroid ? const Size(480, 720) : const Size(480, 640), + ResolutionPreset.high: const Size(720, 1280), + ResolutionPreset.veryHigh: const Size(1080, 1920), + ResolutionPreset.ultraHigh: const Size(2160, 3840), + // Don't bother checking for max here since it could be anything. + }; + + /// Verify that [actual] has dimensions that are at least as large as + /// [expectedSize]. Allows for a mismatch in portrait vs landscape. Returns + /// whether the dimensions exactly match. + bool assertExpectedDimensions(Size expectedSize, Size actual) { + expect(actual.shortestSide, lessThanOrEqualTo(expectedSize.shortestSide)); + expect(actual.longestSide, lessThanOrEqualTo(expectedSize.longestSide)); + return actual.shortestSide == expectedSize.shortestSide && + actual.longestSide == expectedSize.longestSide; + } + + // This tests that the capture is no bigger than the preset, since we have + // automatic code to fall back to smaller sizes when we need to. Returns + // whether the image is exactly the desired resolution. + Future testCaptureImageResolution( + CameraController controller, ResolutionPreset preset) async { + final Size expectedSize = presetExpectedSizes[preset]; + print( + 'Capturing photo at $preset (${expectedSize.width}x${expectedSize.height}) using camera ${controller.description.name}'); + + // Take Picture + final String filePath = + '${testDir.path}/${DateTime.now().millisecondsSinceEpoch}.jpg'; + await controller.takePicture(filePath); + + // Load picture + final File fileImage = File(filePath); + final Image image = await decodeImageFromList(fileImage.readAsBytesSync()); + + // Verify image dimensions are as expected + expect(image, isNotNull); + return assertExpectedDimensions( + expectedSize, Size(image.height.toDouble(), image.width.toDouble())); + } + + test('Capture specific image resolutions', () async { + final List cameras = await availableCameras(); + if (cameras.isEmpty) { + return; + } + for (CameraDescription cameraDescription in cameras) { + bool previousPresetExactlySupported = true; + for (MapEntry preset + in presetExpectedSizes.entries) { + final CameraController controller = + CameraController(cameraDescription, preset.key); + await controller.initialize(); + final bool presetExactlySupported = + await testCaptureImageResolution(controller, preset.key); + assert(!(!previousPresetExactlySupported && presetExactlySupported), + 'The camera took higher resolution pictures at a lower resolution.'); + previousPresetExactlySupported = presetExactlySupported; + await controller.dispose(); + } + } + }); + + // This tests that the capture is no bigger than the preset, since we have + // automatic code to fall back to smaller sizes when we need to. Returns + // whether the image is exactly the desired resolution. + Future testCaptureVideoResolution( + CameraController controller, ResolutionPreset preset) async { + final Size expectedSize = presetExpectedSizes[preset]; + print( + 'Capturing video at $preset (${expectedSize.width}x${expectedSize.height}) using camera ${controller.description.name}'); + + // Take Video + final String filePath = + '${testDir.path}/${DateTime.now().millisecondsSinceEpoch}.mp4'; + await controller.startVideoRecording(filePath); + sleep(const Duration(milliseconds: 300)); + await controller.stopVideoRecording(); + + // Load video metadata + final File videoFile = File(filePath); + final VideoPlayerController videoController = + VideoPlayerController.file(videoFile); + await videoController.initialize(); + final Size video = videoController.value.size; + + // Verify image dimensions are as expected + expect(video, isNotNull); + return assertExpectedDimensions( + expectedSize, Size(video.height, video.width)); + } + + test('Capture specific video resolutions', () async { + final List cameras = await availableCameras(); + if (cameras.isEmpty) { + return; + } + for (CameraDescription cameraDescription in cameras) { + bool previousPresetExactlySupported = true; + for (MapEntry preset + in presetExpectedSizes.entries) { + final CameraController controller = + CameraController(cameraDescription, preset.key); + await controller.initialize(); + await controller.prepareForVideoRecording(); + final bool presetExactlySupported = + await testCaptureVideoResolution(controller, preset.key); + assert(!(!previousPresetExactlySupported && presetExactlySupported), + 'The camera took higher resolution pictures at a lower resolution.'); + previousPresetExactlySupported = presetExactlySupported; + await controller.dispose(); + } + } + }); +} diff --git a/packages/camera/example/test_driver/camera_test.dart b/packages/camera/example/test_driver/camera_test.dart new file mode 100644 index 000000000000..38fe6c447e05 --- /dev/null +++ b/packages/camera/example/test_driver/camera_test.dart @@ -0,0 +1,7 @@ +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); +} diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 4c001926ae25..3aeaa4612a3e 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -6,8 +6,8 @@ static FlutterError *getFlutterError(NSError *error) { return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %d", (int)error.code] - message:error.domain - details:error.localizedDescription]; + message:error.localizedDescription + details:error.domain]; } @interface FLTSavePhotoDelegate : NSObject @@ -114,6 +114,43 @@ - (UIImageOrientation)getImageRotation { } @end +// Mirrors ResolutionPreset in camera.dart +typedef enum { + veryLow, + low, + medium, + high, + veryHigh, + ultraHigh, + max, +} ResolutionPreset; + +static ResolutionPreset getResolutionPresetForString(NSString *preset) { + if ([preset isEqualToString:@"veryLow"]) { + return veryLow; + } else if ([preset isEqualToString:@"low"]) { + return low; + } else if ([preset isEqualToString:@"medium"]) { + return medium; + } else if ([preset isEqualToString:@"high"]) { + return high; + } else if ([preset isEqualToString:@"veryHigh"]) { + return veryHigh; + } else if ([preset isEqualToString:@"ultraHigh"]) { + return ultraHigh; + } else if ([preset isEqualToString:@"max"]) { + return max; + } else { + NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain + code:NSURLErrorUnknown + userInfo:@{ + NSLocalizedDescriptionKey : [NSString + stringWithFormat:@"Unknown resolution preset %@", preset] + }]; + @throw error; + } +} + @interface FLTCam : NSObject @@ -18,10 +18,12 @@ dependencies: sdk: flutter dev_dependencies: - flutter_test: - sdk: flutter path_provider: ^0.5.0 video_player: ^0.10.0 + flutter_test: + sdk: flutter + flutter_driver: + sdk: flutter flutter: plugin: From 90456140529265140971c6b9b9772d6c95173961 Mon Sep 17 00:00:00 2001 From: Daniel Wulff Date: Thu, 8 Aug 2019 11:38:27 -0700 Subject: [PATCH 006/133] [connectivity] update the connectivity readme to include info about changes in iOS 13 (#1957) --- packages/connectivity/CHANGELOG.md | 4 ++++ packages/connectivity/README.md | 24 ++++++++++++++++++++++++ packages/connectivity/pubspec.yaml | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/connectivity/CHANGELOG.md b/packages/connectivity/CHANGELOG.md index 6bc9f4a24be6..4115a1be4aae 100644 --- a/packages/connectivity/CHANGELOG.md +++ b/packages/connectivity/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.3+7 + +* Update README with the updated information about CNCopyCurrentNetworkInfo on iOS 13. + ## 0.4.3+6 * [Android] Fix the invalid suppression check (it should be "deprecation" not "deprecated"). diff --git a/packages/connectivity/README.md b/packages/connectivity/README.md index b1c2b8b356fe..215f8991a756 100644 --- a/packages/connectivity/README.md +++ b/packages/connectivity/README.md @@ -7,6 +7,8 @@ This plugin works for iOS and Android. > Note that on Android, this does not guarantee connection to Internet. For instance, the app might have wifi access but it might be a VPN or a hotel WiFi with no access. +## Usage + Sample usage to check current status: ```dart @@ -48,6 +50,28 @@ dispose() { } ``` +You can get WIFI related information using: + +```dart +import 'package:connectivity/connectivity.dart'; + +var wifiBSSID = await (Connectivity().getWifiBSSID()); +var wifiIP = await (Connectivity().getWifiIP());network +var wifiName = await (Connectivity().getWifiName());wifi network +``` + +### Known Issues + +#### iOS 13 + +The methods `.getWifiBSSID()` and `.getWifiName()` utilize the [CNCopyCurrentNetworkInfo](https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo) function on iOS. + +As of iOS 13, Apple announced that these APIs will no longer return valid information by default and will instead return the following: +> SSID: "Wi-Fi" or "WLAN" ("WLAN" will be returned for the China SKU) +> BSSID: "00:00:00:00:00:00" + +You can follow issue [#37804](https://github.com/flutter/flutter/issues/37804) for the changes required to return valid SSID and BSSID values with iOS 13. + ## Getting Started For help getting started with Flutter, view our online diff --git a/packages/connectivity/pubspec.yaml b/packages/connectivity/pubspec.yaml index 33c8e4d94595..b91741f2f916 100644 --- a/packages/connectivity/pubspec.yaml +++ b/packages/connectivity/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity -version: 0.4.3+6 +version: 0.4.3+7 flutter: plugin: From 3aa087c6cc4d3c1adafaada813006664bec29558 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Thu, 8 Aug 2019 12:05:43 -0700 Subject: [PATCH 007/133] Fix bug in camera example. (#1958) --- packages/camera/example/lib/main.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index 2e2aa4d0fe1f..10b0ff9201a1 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -52,6 +52,10 @@ class _CameraExampleHomeState extends State @override void didChangeAppLifecycleState(AppLifecycleState state) { + // App state changed before we got the chance to initialize. + if (controller == null || !controller.value.isInitialized) { + return; + } if (state == AppLifecycleState.inactive) { controller?.dispose(); } else if (state == AppLifecycleState.resumed) { From 6deda07662e420d747896a886518fd2855451fde Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Thu, 8 Aug 2019 13:39:26 -0700 Subject: [PATCH 008/133] [shared_preferences] Allow getInstance() to be reentrant (#1961) --- .../lib/shared_preferences.dart | 26 +++++++++++++------ .../test/shared_preferences_test.dart | 6 +++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/shared_preferences/lib/shared_preferences.dart b/packages/shared_preferences/lib/shared_preferences.dart index d013484fa1ad..aece19b6e29e 100644 --- a/packages/shared_preferences/lib/shared_preferences.dart +++ b/packages/shared_preferences/lib/shared_preferences.dart @@ -18,14 +18,24 @@ class SharedPreferences { SharedPreferences._(this._preferenceCache); static const String _prefix = 'flutter.'; - static SharedPreferences _instance; + static Completer _completer; static Future getInstance() async { - if (_instance == null) { - final Map preferencesMap = - await _getSharedPreferencesMap(); - _instance = SharedPreferences._(preferencesMap); + if (_completer == null) { + _completer = Completer(); + try { + final Map preferencesMap = + await _getSharedPreferencesMap(); + _completer.complete(SharedPreferences._(preferencesMap)); + } on Exception catch (e) { + // If there's an error, explicitly return the future with an error. + // then set the completer to null so we can retry. + _completer.completeError(e); + final Future sharedPrefsFuture = _completer.future; + _completer = null; + return sharedPrefsFuture; + } } - return _instance; + return _completer.future; } /// The cache that holds all preferences. @@ -168,7 +178,7 @@ class SharedPreferences { /// Initializes the shared preferences with mock values for testing. /// - /// If the singleton instance has been initialized already, it is automatically reloaded. + /// If the singleton instance has been initialized already, it is nullified. @visibleForTesting static void setMockInitialValues(Map values) { _kChannel.setMockMethodCallHandler((MethodCall methodCall) async { @@ -177,6 +187,6 @@ class SharedPreferences { } return null; }); - _instance?.reload(); + _completer = null; } } diff --git a/packages/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/test/shared_preferences_test.dart index f9f4bde06ba3..c0d9068204c9 100755 --- a/packages/shared_preferences/test/shared_preferences_test.dart +++ b/packages/shared_preferences/test/shared_preferences_test.dart @@ -155,6 +155,12 @@ void main() { expect(preferences.getString('String'), kTestValues2['flutter.String']); }); + test('back to back calls should return same instance.', () async { + final Future first = SharedPreferences.getInstance(); + final Future second = SharedPreferences.getInstance(); + expect(await first, await second); + }); + group('mocking', () { const String _key = 'dummy'; const String _prefixedKey = 'flutter.' + _key; From b48dd36fccc6edf6b37a0291a90d3efccd8d2b78 Mon Sep 17 00:00:00 2001 From: Christian Becker Date: Fri, 9 Aug 2019 18:08:33 +0200 Subject: [PATCH 009/133] [image_picker] Depend on AndroidX Core instead of Legacy Support v4 (#1934) --- packages/image_picker/CHANGELOG.md | 4 ++++ packages/image_picker/android/build.gradle | 2 +- packages/image_picker/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index c3b5a2a02c00..bd1b4300442b 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1+2 + +* Replace dependency on `androidx.legacy:legacy-support-v4:1.0.0` with `androidx.core:core:1.0.2` + ## 0.6.1+1 * Add dependency on `androidx.annotation:annotation:1.0.0`. diff --git a/packages/image_picker/android/build.gradle b/packages/image_picker/android/build.gradle index d234a8fef294..d192a890e3cc 100755 --- a/packages/image_picker/android/build.gradle +++ b/packages/image_picker/android/build.gradle @@ -48,7 +48,7 @@ android { disable 'InvalidPackage' } dependencies { - api 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.core:core:1.0.2' implementation 'androidx.annotation:annotation:1.0.0' } } diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index 88a52c1c96b7..7ebbc579a7b8 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -5,7 +5,7 @@ authors: - Flutter Team - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.1+1 +version: 0.6.1+2 flutter: plugin: From 40ef139ceda28c2390b3cb53fa2785d5ed690602 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Fri, 9 Aug 2019 16:35:47 -0700 Subject: [PATCH 010/133] [webview_flutter] Filter onChanged events for invalid displays (#1964) Works around an Android WebView bug that was causing a crash by filtering some DisplayListener invocations. Older Android WebView versions had assumed that when DisplayListener#onDisplayChanged is invoked, the display ID it is provided is of a valid display. However it turns out that when a display is removed Android may call onDisplayChanged with the ID of the removed display, in this case the Android WebView code tries to fetch and use the display with this ID and crashes with an NPE. The issue was fixed in the Android WebView code in https://chromium-review.googlesource.com/517913 which is available starting WebView version 58.0.3029.125 however older webviews in the wild still have this issue. Since Flutter removes virtual displays whenever a platform view is resized the webview crash is more likely to happen than other apps. And users were reporting this issue see: flutter/flutter#30420 This change works around the webview bug by unregistering the WebView's DisplayListener, and instead registering our own DisplayListener which delegates the callbacks to the WebView's listener unless it's a onDisplayChanged for an invalid display. --- packages/webview_flutter/CHANGELOG.md | 5 + .../webviewflutter/DisplayListenerProxy.java | 142 ++++++++++++++++++ .../webviewflutter/FlutterWebView.java | 10 +- .../ios/Runner.xcodeproj/project.pbxproj | 8 +- .../example/test_driver/webview.dart | 85 +++++++++++ packages/webview_flutter/pubspec.yaml | 2 +- 6 files changed, 248 insertions(+), 4 deletions(-) create mode 100644 packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index eb7b1bc4684f..6e7f498968f0 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.11+1 + +* Work around a bug in old Android WebView versions that was causing a crash + when resizing the webview on old devices. + ## 0.3.11 * Add an initialAutoMediaPlaybackPolicy setting for controlling how auto media diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java new file mode 100644 index 000000000000..9335f6f37fcf --- /dev/null +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java @@ -0,0 +1,142 @@ +package io.flutter.plugins.webviewflutter; + +import static android.hardware.display.DisplayManager.DisplayListener; + +import android.annotation.TargetApi; +import android.hardware.display.DisplayManager; +import android.os.Build; +import android.util.Log; +import java.lang.reflect.Field; +import java.util.ArrayList; + +/** + * Works around an Android WebView bug by filtering some DisplayListener invocations. + * + *

Older Android WebView versions had assumed that when {@link DisplayListener#onDisplayChanged} + * is invoked, the display ID it is provided is of a valid display. However it turns out that when a + * display is removed Android may call onDisplayChanged with the ID of the removed display, in this + * case the Android WebView code tries to fetch and use the display with this ID and crashes with an + * NPE. + * + *

This issue was fixed in the Android WebView code in + * https://chromium-review.googlesource.com/517913 which is available starting WebView version + * 58.0.3029.125 however older webviews in the wild still have this issue. + * + *

Since Flutter removes virtual displays whenever a platform view is resized the webview crash + * is more likely to happen than other apps. And users were reporting this issue see: + * https://github.com/flutter/flutter/issues/30420 + * + *

This class works around the webview bug by unregistering the WebView's DisplayListener, and + * instead registering its own DisplayListener which delegates the callbacks to the WebView's + * listener unless it's a onDisplayChanged for an invalid display. + * + *

I did not find a clean way to get a handle of the WebView's DisplayListener so I'm using + * reflection to fetch all registered listeners before and after initializing a webview. In the + * first initialization of a webview within the process the difference between the lists is the + * webview's display listener. + */ +@TargetApi(Build.VERSION_CODES.KITKAT) +class DisplayListenerProxy { + private static final String TAG = "DisplayListenerProxy"; + + private ArrayList listenersBeforeWebView; + + /** Should be called prior to the webview's initialization. */ + void onPreWebViewInitialization(DisplayManager displayManager) { + listenersBeforeWebView = yoinkDisplayListeners(displayManager); + } + + /** Should be called after the webview's initialization. */ + void onPostWebViewInitialization(final DisplayManager displayManager) { + final ArrayList webViewListeners = yoinkDisplayListeners(displayManager); + // We recorded the list of listeners prior to initializing webview, any new listeners we see + // after initializing the webview are listeners added by the webview. + webViewListeners.removeAll(listenersBeforeWebView); + + if (webViewListeners.isEmpty()) { + // The Android WebView registers a single display listener per process (even if there + // are multiple WebView instances) so this list is expected to be non-empty only the + // first time a webview is initialized. + // Note that in an add2app scenario if the application had instantiated a non Flutter + // WebView prior to instantiating the Flutter WebView we are not able to get a reference + // to the WebView's display listener and can't work around the bug. + // + // This means that webview resizes in add2app Flutter apps with a non Flutter WebView + // running on a system with a webview prior to 58.0.3029.125 may crash (the Android's + // behavior seems to be racy so it doesn't always happen). + return; + } + + for (DisplayListener webViewListener : webViewListeners) { + // Note that while DisplayManager.unregisterDisplayListener throws when given an + // unregistered listener, this isn't an issue as the WebView code never calls + // unregisterDisplayListener. + displayManager.unregisterDisplayListener(webViewListener); + + // We never explicitly unregister this listener as the webview's listener is never + // unregistered (it's released when the process is terminated). + displayManager.registerDisplayListener( + new DisplayListener() { + @Override + public void onDisplayAdded(int displayId) { + for (DisplayListener webViewListener : webViewListeners) { + webViewListener.onDisplayAdded(displayId); + } + } + + @Override + public void onDisplayRemoved(int displayId) { + for (DisplayListener webViewListener : webViewListeners) { + webViewListener.onDisplayRemoved(displayId); + } + } + + @Override + public void onDisplayChanged(int displayId) { + if (displayManager.getDisplay(displayId) == null) { + return; + } + for (DisplayListener webViewListener : webViewListeners) { + webViewListener.onDisplayChanged(displayId); + } + } + }, + null); + } + } + + @SuppressWarnings({"unchecked", "PrivateApi"}) + private static ArrayList yoinkDisplayListeners(DisplayManager displayManager) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + // We cannot use reflection on Android O, but it shouldn't matter as it shipped + // with a WebView version that has the bug this code is working around fixed. + return new ArrayList<>(); + } + try { + Field displayManagerGlobalField = DisplayManager.class.getDeclaredField("mGlobal"); + displayManagerGlobalField.setAccessible(true); + Object displayManagerGlobal = displayManagerGlobalField.get(displayManager); + Field displayListenersField = + displayManagerGlobal.getClass().getDeclaredField("mDisplayListeners"); + displayListenersField.setAccessible(true); + ArrayList delegates = + (ArrayList) displayListenersField.get(displayManagerGlobal); + + Field listenerField = null; + ArrayList listeners = new ArrayList<>(); + for (Object delegate : delegates) { + if (listenerField == null) { + listenerField = delegate.getClass().getField("mListener"); + listenerField.setAccessible(true); + } + DisplayManager.DisplayListener listener = + (DisplayManager.DisplayListener) listenerField.get(delegate); + listeners.add(listener); + } + return listeners; + } catch (NoSuchFieldException | IllegalAccessException e) { + Log.w(TAG, "Could not extract WebView's display listeners. " + e); + return new ArrayList<>(); + } + } +} diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 80431ad4cd5b..e089f6d28190 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -6,6 +6,7 @@ import android.annotation.TargetApi; import android.content.Context; +import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Handler; import android.view.View; @@ -28,14 +29,21 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { private final FlutterWebViewClient flutterWebViewClient; private final Handler platformThreadHandler; + @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @SuppressWarnings("unchecked") FlutterWebView( - Context context, + final Context context, BinaryMessenger messenger, int id, Map params, final View containerView) { + + DisplayListenerProxy displayListenerProxy = new DisplayListenerProxy(); + DisplayManager displayManager = + (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); + displayListenerProxy.onPreWebViewInitialization(displayManager); webView = new InputAwareWebView(context, containerView); + displayListenerProxy.onPostWebViewInitialization(displayManager); platformThreadHandler = new Handler(context.getMainLooper()); // Allow local storage. diff --git a/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj index f471b69fb7d1..61ee7d2d4093 100644 --- a/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 127772EEA7782174BE0D74B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; @@ -55,6 +56,7 @@ 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 = ""; }; + C475C484BD510DD9CB2E403C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -138,6 +140,8 @@ C6FFB52F5C2B8A41A7E39DE2 /* Pods */ = { isa = PBXGroup; children = ( + 127772EEA7782174BE0D74B5 /* Pods-Runner.debug.xcconfig */, + C475C484BD510DD9CB2E403C /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -249,7 +253,7 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; @@ -258,7 +262,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; B71376B4FB8384EF9D5F3F84 /* [CP] Check Pods Manifest.lock */ = { diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index b6abff94e6b2..fefaf6d49bef 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -137,6 +137,91 @@ void main() { expect(messagesReceived, equals(['hello'])); }); + test('resize webview', () async { + final String resizeTest = ''' + + Resize test + + + + + + '''; + final String resizeTestBase64 = + base64Encode(const Utf8Encoder().convert(resizeTest)); + final Completer resizeCompleter = Completer(); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); + final GlobalKey key = GlobalKey(); + + final WebView webView = WebView( + key: key, + initialUrl: 'data:text/html;charset=utf-8;base64,$resizeTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + // TODO(iskakaushik): Remove this when collection literals makes it to stable. + // ignore: prefer_collection_literals + javascriptChannels: [ + JavascriptChannel( + name: 'Resize', + onMessageReceived: (JavascriptMessage message) { + resizeCompleter.complete(true); + }, + ), + ].toSet(), + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + javascriptMode: JavascriptMode.unrestricted, + ); + + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Column( + children: [ + SizedBox( + width: 200, + height: 200, + child: webView, + ), + ], + ), + ), + ); + + await controllerCompleter.future; + await pageLoaded.future; + + expect(resizeCompleter.isCompleted, false); + + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Column( + children: [ + SizedBox( + width: 400, + height: 400, + child: webView, + ), + ], + ), + ), + ); + + await resizeCompleter.future; + }); + group('Media playback policy', () { String audioTestBase64; setUpAll(() async { diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 6cde699ea336..9999ca9519b3 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11 +version: 0.3.11+1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 560694c5b58eed8a46e57b1dd61e701591209340 Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Fri, 9 Aug 2019 17:31:50 -0700 Subject: [PATCH 011/133] [webview_flutter] Fix double tap on resize issue (#1965) WebView is incorrectly dropping some input events as unhandled. Previously we were restarting the input connection to try and work around this, but that causes a long tail of bugs in various SDK and WebView versions. Stop the events from bubbling instead since they still appear to be correctly handled despite being marked wrong. Long term we should figure out why this is happening in WebView and figure out a deeper fix for this issue, but this workaround solves the linked bugs in the immediate short term. --- packages/webview_flutter/CHANGELOG.md | 5 +++++ packages/webview_flutter/README.md | 6 ++---- .../webviewflutter/FlutterWebViewClient.java | 15 +++++++++++++++ .../plugins/webviewflutter/InputAwareWebView.java | 9 +++------ .../webviewflutter/WebViewFlutterPlugin.java | 1 - packages/webview_flutter/pubspec.yaml | 2 +- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 6e7f498968f0..0bcb47f4cab3 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.11+2 + +* Add fix for input connection being dropped after a screen resize on certain + Android devices. + ## 0.3.11+1 * Work around a bug in old Android WebView versions that was causing a crash diff --git a/packages/webview_flutter/README.md b/packages/webview_flutter/README.md index 8e8d3979d8f8..47e5c008edf6 100644 --- a/packages/webview_flutter/README.md +++ b/packages/webview_flutter/README.md @@ -22,12 +22,10 @@ Keyboard support within webviews is also experimental. The above tags also surface known issues with keyboard input. Some currently known keyboard issues, as of `webview_flutter` version `0.3.10+4`: -* [Input needs to be tapped twice to be registered on Samsung - devices](https://github.com/flutter/flutter/issues/35867) -* [Keyboard behavior is buggy after a - resize](https://github.com/flutter/flutter/issues/36978) * [Keyboard persists after tapping outside text field](https://github.com/flutter/flutter/issues/36478) +* [WebView's text selection dialog is not responding to touch + events](https://github.com/flutter/flutter/issues/24585) ## Setup diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java index e7b10ce2257b..bdd6abb66282 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java @@ -7,6 +7,7 @@ import android.annotation.TargetApi; import android.os.Build; import android.util.Log; +import android.view.KeyEvent; import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -110,6 +111,13 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request public void onPageFinished(WebView view, String url) { FlutterWebViewClient.this.onPageFinished(view, url); } + + @Override + public void onUnhandledKeyEvent(WebView view, KeyEvent event) { + // Deliberately empty. Occasionally the webview will mark events as having failed to be + // handled even though they were handled. We don't want to propagate those as they're not + // truly lost. + } }; } @@ -130,6 +138,13 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { public void onPageFinished(WebView view, String url) { FlutterWebViewClient.this.onPageFinished(view, url); } + + @Override + public void onUnhandledKeyEvent(WebView view, KeyEvent event) { + // Deliberately empty. Occasionally the webview will mark events as having failed to be + // handled even though they were handled. We don't want to propagate those as they're not + // truly lost. + } }; } diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java index 93b5c57926fd..b4783c1746f9 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java @@ -43,14 +43,11 @@ void lockInputConnection() { /** Sets the proxy adapter view back to its default behavior. */ void unlockInputConnection() { - if (proxyAdapterView != null) { - proxyAdapterView.setLocked(false); + if (proxyAdapterView == null) { + return; } - // Restart the input connection to avoid ViewRootImpl assuming an incorrect window state. - InputMethodManager imm = - (InputMethodManager) containerView.getContext().getSystemService(INPUT_METHOD_SERVICE); - imm.restartInput(containerView); + proxyAdapterView.setLocked(false); } /** Restore the original InputConnection, if needed. */ diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java index abc4f09f8034..17177541222c 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java @@ -8,7 +8,6 @@ /** WebViewFlutterPlugin */ public class WebViewFlutterPlugin { - /** Plugin registration. */ public static void registerWith(Registrar registrar) { registrar diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 9999ca9519b3..5af01a9b0a1c 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11+1 +version: 0.3.11+2 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 95ba642b716937908bbbefbc3c407a0ebc6c6aeb Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Mon, 12 Aug 2019 14:16:46 -0700 Subject: [PATCH 012/133] [multiple] Add licenses (#1908) --- .../main/java/io/flutter/plugins/camera/CameraPlugin.java | 4 ++++ packages/camera/example/lib/main.dart | 4 ++++ packages/camera/ios/Classes/CameraPlugin.h | 4 ++++ packages/camera/ios/Classes/CameraPlugin.m | 4 ++++ .../cloudfirestore/FlutterFirebaseAppRegistrar.java | 4 ++++ .../cloudfunctions/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h | 4 ++++ packages/connectivity/test/connectivity_test.dart | 4 ++++ packages/firebase_admob/ios/Classes/FLTMobileAd.h | 6 +++--- packages/firebase_admob/ios/Classes/FLTMobileAd.m | 6 +++--- packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m | 6 +++--- packages/firebase_admob/lib/firebase_admob.dart | 3 ++- .../firebaseanalytics/FlutterFirebaseAppRegistrar.java | 4 ++++ .../plugins/firebaseauth/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_auth/example/lib/register_page.dart | 4 ++++ packages/firebase_auth/example/lib/signin_page.dart | 4 ++++ packages/firebase_auth/lib/firebase_auth.dart | 6 +++--- packages/firebase_auth/lib/src/auth_credential.dart | 6 +++--- .../lib/src/auth_provider/email_auth_provider.dart | 6 +++--- .../lib/src/auth_provider/facebook_auth_provider.dart | 6 +++--- .../lib/src/auth_provider/github_auth_provider.dart | 6 +++--- .../lib/src/auth_provider/google_auth_provider.dart | 6 +++--- .../lib/src/auth_provider/phone_auth_provider.dart | 6 +++--- .../lib/src/auth_provider/twitter_auth_provider.dart | 6 +++--- .../plugins/firebase/core/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_core/example/lib/main.dart | 4 ++++ packages/firebase_core/lib/firebase_core.dart | 6 +++--- packages/firebase_core/lib/src/firebase_app.dart | 6 +++--- packages/firebase_core/lib/src/firebase_options.dart | 6 +++--- packages/firebase_core/test/firebase_core_test.dart | 6 +++--- .../firebasecrashlytics/FirebaseCrashlyticsPlugin.java | 4 ++++ .../firebasecrashlytics/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_crashlytics/example/lib/main.dart | 4 ++++ .../ios/Classes/FirebaseCrashlyticsPlugin.h | 4 ++++ .../ios/Classes/FirebaseCrashlyticsPlugin.m | 4 ++++ packages/firebase_crashlytics/lib/firebase_crashlytics.dart | 4 ++++ .../firebase_crashlytics/lib/src/firebase_crashlytics.dart | 6 +++--- .../test/firebase_crashlytics_test.dart | 4 ++++ .../firebase/database/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_database/example/lib/main.dart | 6 +++--- packages/firebase_database/lib/firebase_database.dart | 6 +++--- packages/firebase_database/lib/src/database_reference.dart | 6 +++--- packages/firebase_database/lib/src/event.dart | 6 +++--- packages/firebase_database/lib/src/firebase_database.dart | 6 +++--- packages/firebase_database/lib/src/on_disconnect.dart | 4 ++++ packages/firebase_database/lib/src/query.dart | 6 +++--- .../firebase_database/lib/src/utils/push_id_generator.dart | 6 +++--- .../firebase_database/lib/ui/firebase_animated_list.dart | 6 +++--- packages/firebase_database/lib/ui/firebase_list.dart | 6 +++--- packages/firebase_database/lib/ui/firebase_sorted_list.dart | 6 +++--- .../lib/ui/utils/stream_subscriber_mixin.dart | 6 +++--- .../firebasedynamiclinks/FirebaseDynamicLinksPlugin.java | 4 ++++ .../firebasedynamiclinks/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_dynamic_links/example/lib/main.dart | 6 +++--- .../ios/Classes/FirebaseDynamicLinksPlugin.h | 4 ++++ .../ios/Classes/FirebaseDynamicLinksPlugin.m | 4 ++++ .../FirebaseInAppMessagingPlugin.java | 4 ++++ packages/firebase_in_app_messaging/example/lib/main.dart | 4 ++++ .../ios/Classes/FirebaseInAppMessagingPlugin.h | 4 ++++ .../ios/Classes/FirebaseInAppMessagingPlugin.m | 4 ++++ .../lib/firebase_in_app_messaging.dart | 4 ++++ .../test/firebase_in_app_messaging_test.dart | 4 ++++ .../firebasemessaging/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_messaging/example/lib/main.dart | 2 +- .../flutter/plugins/firebasemlvision/BarcodeDetector.java | 4 ++++ .../java/io/flutter/plugins/firebasemlvision/Detector.java | 4 ++++ .../io/flutter/plugins/firebasemlvision/FaceDetector.java | 4 ++++ .../plugins/firebasemlvision/FirebaseMlVisionPlugin.java | 4 ++++ .../firebasemlvision/FlutterFirebaseAppRegistrar.java | 4 ++++ .../io/flutter/plugins/firebasemlvision/ImageLabeler.java | 4 ++++ .../io/flutter/plugins/firebasemlvision/TextRecognizer.java | 4 ++++ packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m | 4 ++++ packages/firebase_ml_vision/ios/Classes/FaceDetector.m | 4 ++++ .../firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h | 4 ++++ .../firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m | 4 ++++ packages/firebase_ml_vision/ios/Classes/ImageLabeler.m | 4 ++++ packages/firebase_ml_vision/ios/Classes/TextRecognizer.m | 4 ++++ .../firebaseperformance/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_performance/example/lib/main.dart | 6 +++--- .../ios/Classes/FirebasePerformancePlugin.h | 4 ++++ packages/firebase_performance/lib/firebase_performance.dart | 6 +++--- .../firebase_performance/lib/src/firebase_performance.dart | 6 +++--- packages/firebase_performance/lib/src/http_metric.dart | 6 +++--- .../lib/src/performance_attributes.dart | 6 +++--- packages/firebase_performance/lib/src/trace.dart | 6 +++--- .../firebaseremoteconfig/FirebaseRemoteConfigPlugin.java | 4 ++++ .../firebaseremoteconfig/FlutterFirebaseAppRegistrar.java | 4 ++++ packages/firebase_remote_config/example/lib/main.dart | 4 ++++ .../ios/Classes/FirebaseRemoteConfigPlugin.h | 4 ++++ .../ios/Classes/FirebaseRemoteConfigPlugin.m | 4 ++++ .../firebase_remote_config/lib/firebase_remote_config.dart | 4 ++++ packages/firebase_remote_config/lib/src/remote_config.dart | 4 ++++ .../lib/src/remote_config_fetch_throttled_exception.dart | 4 ++++ .../lib/src/remote_config_last_fetch_status.dart | 4 ++++ .../lib/src/remote_config_settings.dart | 4 ++++ .../firebase_remote_config/lib/src/remote_config_value.dart | 4 ++++ .../test/firebase_remote_config_test.dart | 4 ++++ .../firebase/storage/FlutterFirebaseAppRegistrar.java | 4 ++++ .../io/flutter/plugins/googlemaps/GoogleMapFactory.java | 4 ++++ .../java/io/flutter/plugins/googlemaps/PolygonBuilder.java | 4 ++++ .../io/flutter/plugins/googlemaps/PolygonController.java | 4 ++++ .../io/flutter/plugins/googlemaps/PolygonOptionsSink.java | 4 ++++ .../java/io/flutter/plugins/googlemaps/PolylineBuilder.java | 4 ++++ .../io/flutter/plugins/googlemaps/PolylineController.java | 4 ++++ .../io/flutter/plugins/googlemaps/PolylineOptionsSink.java | 4 ++++ packages/google_maps_flutter/example/lib/marker_icons.dart | 4 ++++ packages/google_maps_flutter/example/lib/padding.dart | 4 ++++ packages/google_maps_flutter/example/lib/place_circle.dart | 4 ++++ packages/google_maps_flutter/example/lib/place_polygon.dart | 4 ++++ .../google_maps_flutter/example/lib/place_polyline.dart | 4 ++++ packages/google_maps_flutter/lib/src/cap.dart | 4 ++++ packages/google_maps_flutter/lib/src/joint_type.dart | 4 ++++ packages/google_maps_flutter/lib/src/pattern_item.dart | 4 ++++ packages/google_maps_flutter/lib/src/polygon.dart | 4 ++++ packages/google_maps_flutter/lib/src/polyline.dart | 4 ++++ packages/google_sign_in/example/lib/main.dart | 2 +- packages/google_sign_in/lib/testing.dart | 2 +- packages/google_sign_in/test/google_sign_in_test.dart | 2 +- .../java/io/flutter/plugins/imagepicker/ExifDataCopier.java | 2 +- .../main/java/io/flutter/plugins/imagepicker/FileUtils.java | 4 ++++ .../io/flutter/plugins/imagepicker/ImagePickerCache.java | 2 +- .../io/flutter/plugins/imagepicker/ImagePickerDelegate.java | 2 +- .../plugins/imagepicker/ImagePickerFileProvider.java | 4 ++++ .../io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 2 +- .../io/flutter/plugins/imagepicker/ImagePickerUtils.java | 2 +- .../java/io/flutter/plugins/imagepicker/ImageResizer.java | 2 +- packages/image_picker/example/lib/main.dart | 2 +- packages/image_picker/ios/Classes/FLTImagePickerImageUtil.h | 2 +- packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m | 2 +- .../image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h | 2 +- .../image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m | 2 +- .../image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h | 2 +- .../image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m | 2 +- packages/image_picker/ios/Classes/ImagePickerPlugin.h | 2 +- packages/image_picker/ios/Classes/ImagePickerPlugin.m | 2 +- packages/image_picker/lib/image_picker.dart | 2 +- packages/image_picker/test/image_picker_test.dart | 2 +- packages/in_app_purchase/example/lib/consumable_store.dart | 4 ++++ packages/in_app_purchase/ios/Classes/FIAPReceiptManager.m | 4 ++++ .../lib/src/billing_client_wrappers/enum_converters.dart | 4 ++++ .../lib/src/store_kit_wrappers/enum_converters.dart | 4 ++++ .../io/flutter/plugins/pathprovider/PathProviderPlugin.java | 2 +- packages/path_provider/example/lib/main.dart | 2 +- packages/path_provider/ios/Classes/PathProviderPlugin.h | 2 +- packages/path_provider/ios/Classes/PathProviderPlugin.m | 2 +- packages/path_provider/lib/path_provider.dart | 2 +- packages/path_provider/test/path_provider_test.dart | 2 +- packages/sensors/lib/sensors.dart | 4 ++++ packages/sensors/test/sensors_test.dart | 4 ++++ .../src/main/java/io/flutter/plugins/share/SharePlugin.java | 2 +- packages/share/example/lib/main.dart | 2 +- packages/share/ios/Classes/SharePlugin.h | 2 +- packages/share/ios/Classes/SharePlugin.m | 2 +- packages/share/lib/share.dart | 2 +- packages/share/test/share_test.dart | 2 +- .../io/flutter/plugins/videoplayer/QueuingEventSink.java | 4 ++++ packages/video_player/test/video_player_test.dart | 4 ++++ .../flutter/plugins/webviewflutter/InputAwareWebView.java | 4 ++++ packages/webview_flutter/ios/Classes/FLTCookieManager.h | 4 ++++ packages/webview_flutter/ios/Classes/FLTCookieManager.m | 4 ++++ packages/webview_flutter/ios/Classes/WebViewFlutterPlugin.m | 4 ++++ 161 files changed, 509 insertions(+), 136 deletions(-) diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java index 2d16e0be80ef..69633a499d2a 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.camera; import android.hardware.camera2.CameraAccessException; diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index 10b0ff9201a1..f66b5b937345 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'dart:io'; diff --git a/packages/camera/ios/Classes/CameraPlugin.h b/packages/camera/ios/Classes/CameraPlugin.h index 84a90f34b98c..ae865e496a45 100644 --- a/packages/camera/ios/Classes/CameraPlugin.h +++ b/packages/camera/ios/Classes/CameraPlugin.h @@ -1,3 +1,7 @@ +// 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 @interface CameraPlugin : NSObject diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 3aeaa4612a3e..8a08c435861a 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -1,3 +1,7 @@ +// 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 "CameraPlugin.h" #import #import diff --git a/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java b/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java index 963fdc7d4cc0..c9d0c3c8db3d 100644 --- a/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java +++ b/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.cloudfirestore; import com.google.firebase.components.Component; diff --git a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java index 15dae525fed0..859db85b6ca8 100644 --- a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java +++ b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.cloudfunctions; import com.google.firebase.components.Component; diff --git a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h index 568c14a5a5ce..f49ddc6883d2 100644 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h +++ b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h @@ -1,3 +1,7 @@ +// 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 @interface CloudFunctionsPlugin : NSObject diff --git a/packages/connectivity/test/connectivity_test.dart b/packages/connectivity/test/connectivity_test.dart index 4159130b3190..9bfe0fb89abb 100644 --- a/packages/connectivity/test/connectivity_test.dart +++ b/packages/connectivity/test/connectivity_test.dart @@ -1,3 +1,7 @@ +// 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:flutter/services.dart'; import 'package:connectivity/connectivity.dart'; import 'package:flutter_test/flutter_test.dart'; diff --git a/packages/firebase_admob/ios/Classes/FLTMobileAd.h b/packages/firebase_admob/ios/Classes/FLTMobileAd.h index 24d23e04ed7a..195164b559a1 100644 --- a/packages/firebase_admob/ios/Classes/FLTMobileAd.h +++ b/packages/firebase_admob/ios/Classes/FLTMobileAd.h @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 #import "GoogleMobileAds/GoogleMobileAds.h" diff --git a/packages/firebase_admob/ios/Classes/FLTMobileAd.m b/packages/firebase_admob/ios/Classes/FLTMobileAd.m index 3a2d97fa93d1..22765d5b27c7 100644 --- a/packages/firebase_admob/ios/Classes/FLTMobileAd.m +++ b/packages/firebase_admob/ios/Classes/FLTMobileAd.m @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 "FLTMobileAd.h" #import "FLTRequestFactory.h" diff --git a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m b/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m index 82afa217b362..8a55c3145e51 100644 --- a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m +++ b/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 "FirebaseAdMobPlugin.h" diff --git a/packages/firebase_admob/lib/firebase_admob.dart b/packages/firebase_admob/lib/firebase_admob.dart index 6e7f73206689..de8560a00eb9 100644 --- a/packages/firebase_admob/lib/firebase_admob.dart +++ b/packages/firebase_admob/lib/firebase_admob.dart @@ -1,8 +1,9 @@ -// ignore_for_file: deprecated_member_use_from_same_package // Copyright 2017 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: deprecated_member_use_from_same_package + import 'dart:async'; import 'dart:io' show Platform; diff --git a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java b/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java index c290440ce3ef..01c08327078d 100644 --- a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebaseanalytics; import com.google.firebase.components.Component; diff --git a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java index a69a9e43ec0a..cfe7c7386d3f 100644 --- a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebaseauth; import com.google.firebase.components.Component; diff --git a/packages/firebase_auth/example/lib/register_page.dart b/packages/firebase_auth/example/lib/register_page.dart index acc055aa17b5..44c6be36cab6 100644 --- a/packages/firebase_auth/example/lib/register_page.dart +++ b/packages/firebase_auth/example/lib/register_page.dart @@ -1,3 +1,7 @@ +// 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:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; diff --git a/packages/firebase_auth/example/lib/signin_page.dart b/packages/firebase_auth/example/lib/signin_page.dart index ac1638f5f2d8..34d47f05f291 100644 --- a/packages/firebase_auth/example/lib/signin_page.dart +++ b/packages/firebase_auth/example/lib/signin_page.dart @@ -1,3 +1,7 @@ +// 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 'dart:io'; import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; diff --git a/packages/firebase_auth/lib/firebase_auth.dart b/packages/firebase_auth/lib/firebase_auth.dart index 29100487713b..5eff0e4ae27d 100755 --- a/packages/firebase_auth/lib/firebase_auth.dart +++ b/packages/firebase_auth/lib/firebase_auth.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. library firebase_auth; diff --git a/packages/firebase_auth/lib/src/auth_credential.dart b/packages/firebase_auth/lib/src/auth_credential.dart index 7240b045cd80..cf9e943e2e4d 100644 --- a/packages/firebase_auth/lib/src/auth_credential.dart +++ b/packages/firebase_auth/lib/src/auth_credential.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_auth; diff --git a/packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart index 97094529f259..1187923abffc 100644 --- a/packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart +++ b/packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_auth; diff --git a/packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart index e52233e1ff0b..5f1a4f0866bd 100644 --- a/packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart +++ b/packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_auth; diff --git a/packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart index 418f6f646544..448862f22528 100644 --- a/packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart +++ b/packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_auth; diff --git a/packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart index 891bbeb46e5a..4dca135291f5 100644 --- a/packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart +++ b/packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_auth; diff --git a/packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart index 3930e801d715..95055e1f80ba 100644 --- a/packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart +++ b/packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_auth; diff --git a/packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart index 7a9656e33116..9b349ccf6fb4 100644 --- a/packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart +++ b/packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_auth; diff --git a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java b/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java index 58a626528219..4057e7dc9a62 100644 --- a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.core; import com.google.firebase.components.Component; diff --git a/packages/firebase_core/example/lib/main.dart b/packages/firebase_core/example/lib/main.dart index de231536c911..80da9e02a056 100644 --- a/packages/firebase_core/example/lib/main.dart +++ b/packages/firebase_core/example/lib/main.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; diff --git a/packages/firebase_core/lib/firebase_core.dart b/packages/firebase_core/lib/firebase_core.dart index 7972063c97c3..7a8d76191744 100644 --- a/packages/firebase_core/lib/firebase_core.dart +++ b/packages/firebase_core/lib/firebase_core.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. library firebase_core; diff --git a/packages/firebase_core/lib/src/firebase_app.dart b/packages/firebase_core/lib/src/firebase_app.dart index 6fefe9c6b12d..f5b5069f8aec 100644 --- a/packages/firebase_core/lib/src/firebase_app.dart +++ b/packages/firebase_core/lib/src/firebase_app.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. part of firebase_core; diff --git a/packages/firebase_core/lib/src/firebase_options.dart b/packages/firebase_core/lib/src/firebase_options.dart index bbd8886a5ced..33aea5ced5b6 100644 --- a/packages/firebase_core/lib/src/firebase_options.dart +++ b/packages/firebase_core/lib/src/firebase_options.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. part of firebase_core; diff --git a/packages/firebase_core/test/firebase_core_test.dart b/packages/firebase_core/test/firebase_core_test.dart index d42ccd951dda..d09a8c99629d 100755 --- a/packages/firebase_core/test/firebase_core_test.dart +++ b/packages/firebase_core/test/firebase_core_test.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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:flutter/services.dart'; diff --git a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java index 0368738c939e..0c3edff9991f 100644 --- a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java +++ b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.crashlytics.firebasecrashlytics; import android.util.Log; diff --git a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java index a5aed6c64fc8..fdcf9d6b6737 100644 --- a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.crashlytics.firebasecrashlytics; import com.google.firebase.components.Component; diff --git a/packages/firebase_crashlytics/example/lib/main.dart b/packages/firebase_crashlytics/example/lib/main.dart index 81684ceaa272..f13881facfc6 100644 --- a/packages/firebase_crashlytics/example/lib/main.dart +++ b/packages/firebase_crashlytics/example/lib/main.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:flutter/material.dart'; diff --git a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h b/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h index ff9cf31e3943..c0b268534401 100644 --- a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h +++ b/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h @@ -1,3 +1,7 @@ +// 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 @interface FirebaseCrashlyticsPlugin : NSObject diff --git a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m b/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m index 862072f756f0..01f233cbd347 100644 --- a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m +++ b/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m @@ -1,3 +1,7 @@ +// 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 "FirebaseCrashlyticsPlugin.h" #import "UserAgent.h" diff --git a/packages/firebase_crashlytics/lib/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/firebase_crashlytics.dart index 9125e4282dd7..a57738b63f43 100644 --- a/packages/firebase_crashlytics/lib/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/firebase_crashlytics.dart @@ -1,3 +1,7 @@ +// 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. + library firebase_crashlytics; import 'dart:async'; diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart index 23ed4ecea288..2d853c9b40f6 100644 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart @@ -1,6 +1,6 @@ -// Copyright 2019, the Flutter 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. +// 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. part of firebase_crashlytics; /// The entry point for accessing Crashlytics. diff --git a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart index da6dafffb1e2..ed3bce48c5aa 100644 --- a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart +++ b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart @@ -1,3 +1,7 @@ +// 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_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java b/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java index b048150cc027..2016d286ccdc 100644 --- a/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.database; import com.google.firebase.components.Component; diff --git a/packages/firebase_database/example/lib/main.dart b/packages/firebase_database/example/lib/main.dart index 96673e566a91..c22374aa3e94 100755 --- a/packages/firebase_database/example/lib/main.dart +++ b/packages/firebase_database/example/lib/main.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 'dart:async'; import 'dart:io' show Platform; diff --git a/packages/firebase_database/lib/firebase_database.dart b/packages/firebase_database/lib/firebase_database.dart index 1db1bbf06574..9ae46229e71d 100755 --- a/packages/firebase_database/lib/firebase_database.dart +++ b/packages/firebase_database/lib/firebase_database.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. library firebase_database; diff --git a/packages/firebase_database/lib/src/database_reference.dart b/packages/firebase_database/lib/src/database_reference.dart index 8670d1593057..ddf22325e32a 100644 --- a/packages/firebase_database/lib/src/database_reference.dart +++ b/packages/firebase_database/lib/src/database_reference.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. part of firebase_database; diff --git a/packages/firebase_database/lib/src/event.dart b/packages/firebase_database/lib/src/event.dart index 2d240f29c9ef..c8bf7c540f91 100644 --- a/packages/firebase_database/lib/src/event.dart +++ b/packages/firebase_database/lib/src/event.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. part of firebase_database; diff --git a/packages/firebase_database/lib/src/firebase_database.dart b/packages/firebase_database/lib/src/firebase_database.dart index e4b16bd50dd6..f7681c19b618 100644 --- a/packages/firebase_database/lib/src/firebase_database.dart +++ b/packages/firebase_database/lib/src/firebase_database.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. part of firebase_database; diff --git a/packages/firebase_database/lib/src/on_disconnect.dart b/packages/firebase_database/lib/src/on_disconnect.dart index 24769710ce0f..2d44315e069e 100644 --- a/packages/firebase_database/lib/src/on_disconnect.dart +++ b/packages/firebase_database/lib/src/on_disconnect.dart @@ -1,3 +1,7 @@ +// 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. + part of firebase_database; class OnDisconnect { diff --git a/packages/firebase_database/lib/src/query.dart b/packages/firebase_database/lib/src/query.dart index a5f4b64d888e..f91c5d4cf7d4 100644 --- a/packages/firebase_database/lib/src/query.dart +++ b/packages/firebase_database/lib/src/query.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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. part of firebase_database; diff --git a/packages/firebase_database/lib/src/utils/push_id_generator.dart b/packages/firebase_database/lib/src/utils/push_id_generator.dart index 0ceb3cc2959e..187c9b7845d9 100644 --- a/packages/firebase_database/lib/src/utils/push_id_generator.dart +++ b/packages/firebase_database/lib/src/utils/push_id_generator.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 'dart:math'; diff --git a/packages/firebase_database/lib/ui/firebase_animated_list.dart b/packages/firebase_database/lib/ui/firebase_animated_list.dart index 0f9a661bbfea..3fa8a375313c 100755 --- a/packages/firebase_database/lib/ui/firebase_animated_list.dart +++ b/packages/firebase_database/lib/ui/firebase_animated_list.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/packages/firebase_database/lib/ui/firebase_list.dart b/packages/firebase_database/lib/ui/firebase_list.dart index 8010cb7f4c7a..2ac087a42988 100644 --- a/packages/firebase_database/lib/ui/firebase_list.dart +++ b/packages/firebase_database/lib/ui/firebase_list.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 'dart:collection'; diff --git a/packages/firebase_database/lib/ui/firebase_sorted_list.dart b/packages/firebase_database/lib/ui/firebase_sorted_list.dart index a81ff47b140e..d9bb592555a9 100644 --- a/packages/firebase_database/lib/ui/firebase_sorted_list.dart +++ b/packages/firebase_database/lib/ui/firebase_sorted_list.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 'dart:collection'; diff --git a/packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart b/packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart index 5bba816d30f6..cfc488da04a1 100644 --- a/packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart +++ b/packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart @@ -1,6 +1,6 @@ -// Copyright 2017, the Flutter 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. +// 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 'dart:async'; diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java index 5cc4debaa404..cd5c5ea2456f 100644 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java +++ b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasedynamiclinks; import android.content.Intent; diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java index 74d24730e3cc..e3a643252ec9 100644 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasedynamiclinks; import com.google.firebase.components.Component; diff --git a/packages/firebase_dynamic_links/example/lib/main.dart b/packages/firebase_dynamic_links/example/lib/main.dart index 6784e2d0e2ef..9e915761a9c6 100644 --- a/packages/firebase_dynamic_links/example/lib/main.dart +++ b/packages/firebase_dynamic_links/example/lib/main.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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 'dart:async'; diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h index 25f4c1d8b8ca..f905bbbd03e0 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h +++ b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h @@ -1,3 +1,7 @@ +// 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 @interface FLTFirebaseDynamicLinksPlugin : NSObject diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m index 4ab04a4e8723..9893a4ad6c02 100644 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m +++ b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m @@ -1,3 +1,7 @@ +// 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 "FirebaseDynamicLinksPlugin.h" #import "UserAgent.h" diff --git a/packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java b/packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java index cb9e3be51ed5..8a4c6bcfc71e 100644 --- a/packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java +++ b/packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package com.example.firebase_in_app_messaging; import com.google.firebase.inappmessaging.FirebaseInAppMessaging; diff --git a/packages/firebase_in_app_messaging/example/lib/main.dart b/packages/firebase_in_app_messaging/example/lib/main.dart index 0df4cb951dd6..8f187657f95e 100644 --- a/packages/firebase_in_app_messaging/example/lib/main.dart +++ b/packages/firebase_in_app_messaging/example/lib/main.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:firebase_analytics/firebase_analytics.dart'; diff --git a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h b/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h index 4f6f7dfaba56..8a11472c4197 100644 --- a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h +++ b/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h @@ -1,3 +1,7 @@ +// 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 @interface FirebaseInAppMessagingPlugin : NSObject diff --git a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m b/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m index 306330eeae8e..8ae625e4915b 100644 --- a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m +++ b/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m @@ -1,3 +1,7 @@ +// 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 "FirebaseInAppMessagingPlugin.h" #import diff --git a/packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart b/packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart index d6e6084a5269..e6549888c3ed 100644 --- a/packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart +++ b/packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:flutter/services.dart'; diff --git a/packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart b/packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart index 200ea1527d0a..d2448c2a9d05 100644 --- a/packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart +++ b/packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart @@ -1,3 +1,7 @@ +// 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_in_app_messaging/firebase_in_app_messaging.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; diff --git a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java index d675d7fdca09..c7b14c89738a 100644 --- a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemessaging; import com.google.firebase.components.Component; diff --git a/packages/firebase_messaging/example/lib/main.dart b/packages/firebase_messaging/example/lib/main.dart index 36de611f8bd3..685a3f86f2fa 100644 --- a/packages/firebase_messaging/example/lib/main.dart +++ b/packages/firebase_messaging/example/lib/main.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Flutter Authors. All rights reserved. +// 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. diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java index 311964b66203..899b09cb4653 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemlvision; import android.graphics.Point; diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java index f05aaed50cae..b65efa41f444 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemlvision; import com.google.firebase.ml.vision.common.FirebaseVisionImage; diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java index eba06e71eecd..9af31c6973d6 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemlvision; import androidx.annotation.NonNull; diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java index fd049ef30769..a36cf4f7acb9 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemlvision; import android.graphics.Bitmap; diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java index b403915d2d07..14d4accca3dd 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemlvision; import com.google.firebase.components.Component; diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java index c3e2f0d728ee..99899402c037 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemlvision; import androidx.annotation.NonNull; diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java index 9a0f82343ff4..29ee31975626 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebasemlvision; import android.graphics.Point; diff --git a/packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m b/packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m index 96dd0195908d..810b2417dfbf 100644 --- a/packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m +++ b/packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m @@ -1,3 +1,7 @@ +// 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 "FirebaseMlVisionPlugin.h" @interface BarcodeDetector () diff --git a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m b/packages/firebase_ml_vision/ios/Classes/FaceDetector.m index 3f036b403857..9d9bed56567f 100644 --- a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m +++ b/packages/firebase_ml_vision/ios/Classes/FaceDetector.m @@ -1,3 +1,7 @@ +// 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 "FirebaseMlVisionPlugin.h" @interface FaceDetector () diff --git a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h b/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h index 3fd116fa3b11..78060e8e1a08 100644 --- a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h +++ b/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h @@ -1,3 +1,7 @@ +// 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 #import "Firebase/Firebase.h" diff --git a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m b/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m index 991d50e434b1..d453b7928852 100644 --- a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m +++ b/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m @@ -1,3 +1,7 @@ +// 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 "FirebaseMlVisionPlugin.h" #import "UserAgent.h" diff --git a/packages/firebase_ml_vision/ios/Classes/ImageLabeler.m b/packages/firebase_ml_vision/ios/Classes/ImageLabeler.m index fff9f350181e..6cb8341597bc 100644 --- a/packages/firebase_ml_vision/ios/Classes/ImageLabeler.m +++ b/packages/firebase_ml_vision/ios/Classes/ImageLabeler.m @@ -1,3 +1,7 @@ +// 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 "FirebaseMlVisionPlugin.h" @interface ImageLabeler () diff --git a/packages/firebase_ml_vision/ios/Classes/TextRecognizer.m b/packages/firebase_ml_vision/ios/Classes/TextRecognizer.m index cc8cc9306a12..a6f401b9ca39 100644 --- a/packages/firebase_ml_vision/ios/Classes/TextRecognizer.m +++ b/packages/firebase_ml_vision/ios/Classes/TextRecognizer.m @@ -1,3 +1,7 @@ +// 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 "FirebaseMlVisionPlugin.h" @interface TextRecognizer () diff --git a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java b/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java index fbcff73c6e6b..37bf5a31dea6 100644 --- a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebaseperformance; import com.google.firebase.components.Component; diff --git a/packages/firebase_performance/example/lib/main.dart b/packages/firebase_performance/example/lib/main.dart index 16ed5b4322ee..e947cd5bfd65 100644 --- a/packages/firebase_performance/example/lib/main.dart +++ b/packages/firebase_performance/example/lib/main.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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 'dart:async'; diff --git a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h b/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h index 44bf53592eb9..f5258a1c561d 100644 --- a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h +++ b/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h @@ -1,3 +1,7 @@ +// 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 #import diff --git a/packages/firebase_performance/lib/firebase_performance.dart b/packages/firebase_performance/lib/firebase_performance.dart index 8f8a2e7a4348..a4574ab47dd1 100644 --- a/packages/firebase_performance/lib/firebase_performance.dart +++ b/packages/firebase_performance/lib/firebase_performance.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. library firebase_performance; diff --git a/packages/firebase_performance/lib/src/firebase_performance.dart b/packages/firebase_performance/lib/src/firebase_performance.dart index 0ecad7436f9f..c0d15573c96a 100644 --- a/packages/firebase_performance/lib/src/firebase_performance.dart +++ b/packages/firebase_performance/lib/src/firebase_performance.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_performance; diff --git a/packages/firebase_performance/lib/src/http_metric.dart b/packages/firebase_performance/lib/src/http_metric.dart index 704b36c12be2..2586a1455cc5 100644 --- a/packages/firebase_performance/lib/src/http_metric.dart +++ b/packages/firebase_performance/lib/src/http_metric.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_performance; diff --git a/packages/firebase_performance/lib/src/performance_attributes.dart b/packages/firebase_performance/lib/src/performance_attributes.dart index 020b61a4bafc..96a77a009f57 100644 --- a/packages/firebase_performance/lib/src/performance_attributes.dart +++ b/packages/firebase_performance/lib/src/performance_attributes.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_performance; diff --git a/packages/firebase_performance/lib/src/trace.dart b/packages/firebase_performance/lib/src/trace.dart index 43efb2585f01..873a138c7392 100644 --- a/packages/firebase_performance/lib/src/trace.dart +++ b/packages/firebase_performance/lib/src/trace.dart @@ -1,6 +1,6 @@ -// Copyright 2018, the Flutter 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. +// 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. part of firebase_performance; diff --git a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java b/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java index d95d70e25916..d07a9ad1d57a 100644 --- a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java +++ b/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.firebaseremoteconfig; import android.content.Context; diff --git a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java b/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java index 39aeb128816d..6be694a853be 100644 --- a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.firebaseremoteconfig; import com.google.firebase.components.Component; diff --git a/packages/firebase_remote_config/example/lib/main.dart b/packages/firebase_remote_config/example/lib/main.dart index 9a5458050ed0..8db737372086 100644 --- a/packages/firebase_remote_config/example/lib/main.dart +++ b/packages/firebase_remote_config/example/lib/main.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:firebase_remote_config/firebase_remote_config.dart'; diff --git a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h b/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h index 429a11c5addc..eb3cd9767481 100644 --- a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h +++ b/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h @@ -1,3 +1,7 @@ +// 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 @interface FirebaseRemoteConfigPlugin : NSObject diff --git a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m b/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m index f0e6a090af6a..844e11d811b8 100644 --- a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m +++ b/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m @@ -1,3 +1,7 @@ +// 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 "FirebaseRemoteConfigPlugin.h" #import "UserAgent.h" diff --git a/packages/firebase_remote_config/lib/firebase_remote_config.dart b/packages/firebase_remote_config/lib/firebase_remote_config.dart index 68bb0dbb3acf..641e6efbe102 100644 --- a/packages/firebase_remote_config/lib/firebase_remote_config.dart +++ b/packages/firebase_remote_config/lib/firebase_remote_config.dart @@ -1,3 +1,7 @@ +// 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. + library firebase_remote_config; import 'dart:async'; diff --git a/packages/firebase_remote_config/lib/src/remote_config.dart b/packages/firebase_remote_config/lib/src/remote_config.dart index 8358556c6818..ea8362eac265 100644 --- a/packages/firebase_remote_config/lib/src/remote_config.dart +++ b/packages/firebase_remote_config/lib/src/remote_config.dart @@ -1,3 +1,7 @@ +// 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. + part of firebase_remote_config; /// The entry point for accessing Remote Config. diff --git a/packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart b/packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart index 58e27e249c5f..7e8f28cd1eba 100644 --- a/packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart +++ b/packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart @@ -1,3 +1,7 @@ +// 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. + part of firebase_remote_config; /// Exception thrown when the fetch() operation cannot be completed successfully, due to throttling. diff --git a/packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart b/packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart index 88a8c33411f6..ad82f9a3d876 100644 --- a/packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart +++ b/packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart @@ -1,3 +1,7 @@ +// 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. + part of firebase_remote_config; /// LastFetchStatus defines the possible status values of the last fetch. diff --git a/packages/firebase_remote_config/lib/src/remote_config_settings.dart b/packages/firebase_remote_config/lib/src/remote_config_settings.dart index eadb645b6ee6..38ace7611ddb 100644 --- a/packages/firebase_remote_config/lib/src/remote_config_settings.dart +++ b/packages/firebase_remote_config/lib/src/remote_config_settings.dart @@ -1,3 +1,7 @@ +// 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. + part of firebase_remote_config; /// RemoteConfigSettings can be used to configure how Remote Config operates. diff --git a/packages/firebase_remote_config/lib/src/remote_config_value.dart b/packages/firebase_remote_config/lib/src/remote_config_value.dart index c4c95a8d00d9..ddf93a5df189 100644 --- a/packages/firebase_remote_config/lib/src/remote_config_value.dart +++ b/packages/firebase_remote_config/lib/src/remote_config_value.dart @@ -1,3 +1,7 @@ +// 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. + part of firebase_remote_config; /// ValueSource defines the possible sources of a config parameter value. diff --git a/packages/firebase_remote_config/test/firebase_remote_config_test.dart b/packages/firebase_remote_config/test/firebase_remote_config_test.dart index 249803cbe5e8..b86f067a6c1a 100644 --- a/packages/firebase_remote_config/test/firebase_remote_config_test.dart +++ b/packages/firebase_remote_config/test/firebase_remote_config_test.dart @@ -1,3 +1,7 @@ +// 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_remote_config/firebase_remote_config.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; diff --git a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java index 45b8dc697e11..a3b58d0fbe2f 100644 --- a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java +++ b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.firebase.storage; import com.google.firebase.components.Component; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapFactory.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapFactory.java index bc19fa56572a..9d1b3310779e 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapFactory.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapFactory.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.googlemaps; import static io.flutter.plugin.common.PluginRegistry.Registrar; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonBuilder.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonBuilder.java index 68c35864b08c..f2a717fecaf1 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonBuilder.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonBuilder.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.model.LatLng; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonController.java index d77c86922fd5..12989d1c5d0e 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonController.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.model.LatLng; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonOptionsSink.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonOptionsSink.java index 7abbcfaa634e..df4dae0fda4e 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonOptionsSink.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolygonOptionsSink.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.model.LatLng; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java index 49091b4686d4..9fd242a4706f 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineBuilder.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.model.Cap; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineController.java index 4a6d2d0ae6d0..ec0fed83be49 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineController.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.model.Cap; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineOptionsSink.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineOptionsSink.java index d682d1c53078..adaf867b92d1 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineOptionsSink.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/PolylineOptionsSink.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.model.Cap; diff --git a/packages/google_maps_flutter/example/lib/marker_icons.dart b/packages/google_maps_flutter/example/lib/marker_icons.dart index b5445b9982ff..7472e8f8a175 100644 --- a/packages/google_maps_flutter/example/lib/marker_icons.dart +++ b/packages/google_maps_flutter/example/lib/marker_icons.dart @@ -1,3 +1,7 @@ +// 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:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; diff --git a/packages/google_maps_flutter/example/lib/padding.dart b/packages/google_maps_flutter/example/lib/padding.dart index 58c24d34eae7..be45cb38d0c1 100644 --- a/packages/google_maps_flutter/example/lib/padding.dart +++ b/packages/google_maps_flutter/example/lib/padding.dart @@ -1,3 +1,7 @@ +// 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:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'page.dart'; diff --git a/packages/google_maps_flutter/example/lib/place_circle.dart b/packages/google_maps_flutter/example/lib/place_circle.dart index ccd4b1496c0d..fb9436acac74 100644 --- a/packages/google_maps_flutter/example/lib/place_circle.dart +++ b/packages/google_maps_flutter/example/lib/place_circle.dart @@ -1,3 +1,7 @@ +// 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:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; diff --git a/packages/google_maps_flutter/example/lib/place_polygon.dart b/packages/google_maps_flutter/example/lib/place_polygon.dart index 1e48dfe789f1..25818c73e3b7 100644 --- a/packages/google_maps_flutter/example/lib/place_polygon.dart +++ b/packages/google_maps_flutter/example/lib/place_polygon.dart @@ -1,3 +1,7 @@ +// 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:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; diff --git a/packages/google_maps_flutter/example/lib/place_polyline.dart b/packages/google_maps_flutter/example/lib/place_polyline.dart index c5f0d94f0ac2..e2b0d3f8e393 100644 --- a/packages/google_maps_flutter/example/lib/place_polyline.dart +++ b/packages/google_maps_flutter/example/lib/place_polyline.dart @@ -1,3 +1,7 @@ +// 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 'dart:io' show Platform; import 'package:flutter/material.dart'; diff --git a/packages/google_maps_flutter/lib/src/cap.dart b/packages/google_maps_flutter/lib/src/cap.dart index 03676c0561fa..1a6be1f3f528 100644 --- a/packages/google_maps_flutter/lib/src/cap.dart +++ b/packages/google_maps_flutter/lib/src/cap.dart @@ -1,3 +1,7 @@ +// 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. + part of google_maps_flutter; /// Cap that can be applied at the start or end vertex of a [Polyline]. diff --git a/packages/google_maps_flutter/lib/src/joint_type.dart b/packages/google_maps_flutter/lib/src/joint_type.dart index 26eee4e3ef63..ced61ba77417 100644 --- a/packages/google_maps_flutter/lib/src/joint_type.dart +++ b/packages/google_maps_flutter/lib/src/joint_type.dart @@ -1,3 +1,7 @@ +// 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. + part of google_maps_flutter; /// Joint types for [Polyline]. diff --git a/packages/google_maps_flutter/lib/src/pattern_item.dart b/packages/google_maps_flutter/lib/src/pattern_item.dart index 620af0ebd9d4..6d30c72d7b11 100644 --- a/packages/google_maps_flutter/lib/src/pattern_item.dart +++ b/packages/google_maps_flutter/lib/src/pattern_item.dart @@ -1,3 +1,7 @@ +// 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. + part of google_maps_flutter; /// Item used in the stroke pattern for a Polyline. diff --git a/packages/google_maps_flutter/lib/src/polygon.dart b/packages/google_maps_flutter/lib/src/polygon.dart index 439a5f5403b0..7592cb78d393 100644 --- a/packages/google_maps_flutter/lib/src/polygon.dart +++ b/packages/google_maps_flutter/lib/src/polygon.dart @@ -1,3 +1,7 @@ +// 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. + part of google_maps_flutter; /// Uniquely identifies a [Polygon] among [GoogleMap] polygons. diff --git a/packages/google_maps_flutter/lib/src/polyline.dart b/packages/google_maps_flutter/lib/src/polyline.dart index 563b5ec0148e..5e93669a596e 100644 --- a/packages/google_maps_flutter/lib/src/polyline.dart +++ b/packages/google_maps_flutter/lib/src/polyline.dart @@ -1,3 +1,7 @@ +// 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. + part of google_maps_flutter; /// Uniquely identifies a [Polyline] among [GoogleMap] polylines. diff --git a/packages/google_sign_in/example/lib/main.dart b/packages/google_sign_in/example/lib/main.dart index 42a81b80841c..6973a36c3b02 100755 --- a/packages/google_sign_in/example/lib/main.dart +++ b/packages/google_sign_in/example/lib/main.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/google_sign_in/lib/testing.dart b/packages/google_sign_in/lib/testing.dart index 79379557604e..0bc8d8f8095b 100644 --- a/packages/google_sign_in/lib/testing.dart +++ b/packages/google_sign_in/lib/testing.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/google_sign_in/test/google_sign_in_test.dart b/packages/google_sign_in/test/google_sign_in_test.dart index b0ba5e82d3e2..b2ae89a0e886 100755 --- a/packages/google_sign_in/test/google_sign_in_test.dart +++ b/packages/google_sign_in/test/google_sign_in_test.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ExifDataCopier.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ExifDataCopier.java index ce199295cc19..fd7db57e96cc 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ExifDataCopier.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ExifDataCopier.java @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java index 15900bea5cc3..a8ca394be01d 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + /* * Copyright (C) 2007-2008 OpenIntents.org * diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java index 6e5121f10200..4d6f452cf444 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index a568eca4dc22..f9318e9c5760 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerFileProvider.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerFileProvider.java index 74fe0020f211..ca7f6b064b39 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerFileProvider.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerFileProvider.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Flutter 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.imagepicker; import androidx.core.content.FileProvider; diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index 1276963623a0..05e3d883e5e2 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java index da23615dc660..65b05e7ac3cc 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerUtils.java @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 363bfec8281b..ab3120afb6d0 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/example/lib/main.dart b/packages/image_picker/example/lib/main.dart index 9c9b019fbe05..a2175c098f17 100755 --- a/packages/image_picker/example/lib/main.dart +++ b/packages/image_picker/example/lib/main.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.h b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.h index 0983f1fad6b8..e809744f76d9 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.h +++ b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.h @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m index 2e57caf4b54f..fd766aad7fc5 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h index bc12f467720e..591375b26ff4 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h +++ b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m index a789853d32aa..c73559008bbd 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h index 417a6f9a7399..709b6ca65143 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h +++ b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m index 59e9d51b9ed8..4531298f3f87 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m @@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/ImagePickerPlugin.h b/packages/image_picker/ios/Classes/ImagePickerPlugin.h index f7825ce7b6d9..25f3e88d3a53 100644 --- a/packages/image_picker/ios/Classes/ImagePickerPlugin.h +++ b/packages/image_picker/ios/Classes/ImagePickerPlugin.h @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/ios/Classes/ImagePickerPlugin.m b/packages/image_picker/ios/Classes/ImagePickerPlugin.m index 975c47778bbc..a23e13918148 100644 --- a/packages/image_picker/ios/Classes/ImagePickerPlugin.m +++ b/packages/image_picker/ios/Classes/ImagePickerPlugin.m @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/lib/image_picker.dart b/packages/image_picker/lib/image_picker.dart index a6ca94713ee3..bbe5157f4274 100755 --- a/packages/image_picker/lib/image_picker.dart +++ b/packages/image_picker/lib/image_picker.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/image_picker/test/image_picker_test.dart b/packages/image_picker/test/image_picker_test.dart index 7d962e6b916b..78e818538c4a 100644 --- a/packages/image_picker/test/image_picker_test.dart +++ b/packages/image_picker/test/image_picker_test.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/in_app_purchase/example/lib/consumable_store.dart b/packages/in_app_purchase/example/lib/consumable_store.dart index d70598ef07a0..12121a9d30ce 100644 --- a/packages/in_app_purchase/example/lib/consumable_store.dart +++ b/packages/in_app_purchase/example/lib/consumable_store.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:shared_preferences/shared_preferences.dart'; diff --git a/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.m b/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.m index 20043e2a3237..92872d91234e 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.m +++ b/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.m @@ -1,3 +1,7 @@ +// 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. + // // FIAPReceiptManager.m // in_app_purchase diff --git a/packages/in_app_purchase/lib/src/billing_client_wrappers/enum_converters.dart b/packages/in_app_purchase/lib/src/billing_client_wrappers/enum_converters.dart index ac22623100e1..5d0522135d99 100644 --- a/packages/in_app_purchase/lib/src/billing_client_wrappers/enum_converters.dart +++ b/packages/in_app_purchase/lib/src/billing_client_wrappers/enum_converters.dart @@ -1,3 +1,7 @@ +// 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:in_app_purchase/billing_client_wrappers.dart'; import 'package:json_annotation/json_annotation.dart'; diff --git a/packages/in_app_purchase/lib/src/store_kit_wrappers/enum_converters.dart b/packages/in_app_purchase/lib/src/store_kit_wrappers/enum_converters.dart index c1be198c5d04..49cfb78a686b 100644 --- a/packages/in_app_purchase/lib/src/store_kit_wrappers/enum_converters.dart +++ b/packages/in_app_purchase/lib/src/store_kit_wrappers/enum_converters.dart @@ -1,3 +1,7 @@ +// 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:in_app_purchase/store_kit_wrappers.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; diff --git a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java index f8448cbc15d6..b53f0cbbe2ea 100644 --- a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java +++ b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/path_provider/example/lib/main.dart b/packages/path_provider/example/lib/main.dart index db32f7b68e3a..bea99bc4b671 100644 --- a/packages/path_provider/example/lib/main.dart +++ b/packages/path_provider/example/lib/main.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/path_provider/ios/Classes/PathProviderPlugin.h b/packages/path_provider/ios/Classes/PathProviderPlugin.h index 1ed0f26507f8..394f8c070632 100644 --- a/packages/path_provider/ios/Classes/PathProviderPlugin.h +++ b/packages/path_provider/ios/Classes/PathProviderPlugin.h @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/path_provider/ios/Classes/PathProviderPlugin.m b/packages/path_provider/ios/Classes/PathProviderPlugin.m index 72751f7861aa..a8dc4a7b5bfe 100644 --- a/packages/path_provider/ios/Classes/PathProviderPlugin.m +++ b/packages/path_provider/ios/Classes/PathProviderPlugin.m @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/path_provider/lib/path_provider.dart b/packages/path_provider/lib/path_provider.dart index f834566cd71e..c53468ae05ca 100644 --- a/packages/path_provider/lib/path_provider.dart +++ b/packages/path_provider/lib/path_provider.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/path_provider/test/path_provider_test.dart b/packages/path_provider/test/path_provider_test.dart index f1d1ff3451d3..9da5a2568a9a 100644 --- a/packages/path_provider/test/path_provider_test.dart +++ b/packages/path_provider/test/path_provider_test.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/sensors/lib/sensors.dart b/packages/sensors/lib/sensors.dart index 28254bd64c83..7b41a4959f94 100644 --- a/packages/sensors/lib/sensors.dart +++ b/packages/sensors/lib/sensors.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:flutter/services.dart'; diff --git a/packages/sensors/test/sensors_test.dart b/packages/sensors/test/sensors_test.dart index 88e944e1eb7f..d95e788e2106 100644 --- a/packages/sensors/test/sensors_test.dart +++ b/packages/sensors/test/sensors_test.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'dart:typed_data'; diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index 3680e00e201e..60b83e415b70 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/share/example/lib/main.dart b/packages/share/example/lib/main.dart index 775ae18718ea..1eb04e0f3c64 100644 --- a/packages/share/example/lib/main.dart +++ b/packages/share/example/lib/main.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/share/ios/Classes/SharePlugin.h b/packages/share/ios/Classes/SharePlugin.h index 6f09616296b7..b06f1d0be606 100644 --- a/packages/share/ios/Classes/SharePlugin.h +++ b/packages/share/ios/Classes/SharePlugin.h @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/share/ios/Classes/SharePlugin.m b/packages/share/ios/Classes/SharePlugin.m index 7f6700b3cce4..cfd8eac6876d 100644 --- a/packages/share/ios/Classes/SharePlugin.m +++ b/packages/share/ios/Classes/SharePlugin.m @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/share/lib/share.dart b/packages/share/lib/share.dart index 3707a2f7c704..ff20d194f9e5 100644 --- a/packages/share/lib/share.dart +++ b/packages/share/lib/share.dart @@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/share/test/share_test.dart b/packages/share/test/share_test.dart index 275c052d7264..48df12cffa1c 100644 --- a/packages/share/test/share_test.dart +++ b/packages/share/test/share_test.dart @@ -1,4 +1,4 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. +// Copyright 2019 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java index 21933919027c..18835271a83a 100644 --- a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java +++ b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.videoplayer; import io.flutter.plugin.common.EventChannel; diff --git a/packages/video_player/test/video_player_test.dart b/packages/video_player/test/video_player_test.dart index 94bebbd331d8..0bdcb756b711 100644 --- a/packages/video_player/test/video_player_test.dart +++ b/packages/video_player/test/video_player_test.dart @@ -1,3 +1,7 @@ +// 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 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java index b4783c1746f9..9275c380fb56 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.webviewflutter; import static android.content.Context.INPUT_METHOD_SERVICE; diff --git a/packages/webview_flutter/ios/Classes/FLTCookieManager.h b/packages/webview_flutter/ios/Classes/FLTCookieManager.h index 30951b6d055b..3ad5c7e0d9bf 100644 --- a/packages/webview_flutter/ios/Classes/FLTCookieManager.h +++ b/packages/webview_flutter/ios/Classes/FLTCookieManager.h @@ -1,3 +1,7 @@ +// 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 #import diff --git a/packages/webview_flutter/ios/Classes/FLTCookieManager.m b/packages/webview_flutter/ios/Classes/FLTCookieManager.m index b3b29036a522..4e48501e1a74 100644 --- a/packages/webview_flutter/ios/Classes/FLTCookieManager.m +++ b/packages/webview_flutter/ios/Classes/FLTCookieManager.m @@ -1,3 +1,7 @@ +// 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 "FLTCookieManager.h" @implementation FLTCookieManager { diff --git a/packages/webview_flutter/ios/Classes/WebViewFlutterPlugin.m b/packages/webview_flutter/ios/Classes/WebViewFlutterPlugin.m index cab9169df00a..65e87fc71e21 100644 --- a/packages/webview_flutter/ios/Classes/WebViewFlutterPlugin.m +++ b/packages/webview_flutter/ios/Classes/WebViewFlutterPlugin.m @@ -1,3 +1,7 @@ +// 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 "WebViewFlutterPlugin.h" #import "FLTCookieManager.h" #import "FlutterWebView.h" From 993f895baa13d85ceb4c08aa24bb38230ca3bb86 Mon Sep 17 00:00:00 2001 From: Afsar Pasha <25363752+Afsar-Pasha@users.noreply.github.com> Date: Mon, 12 Aug 2019 22:58:08 +0000 Subject: [PATCH 013/133] [android_alarm_manager] Added oneShotAt method to schedule a alarm at a given time (#1947) --- packages/android_alarm_manager/CHANGELOG.md | 4 ++ .../AndroidAlarmManagerPlugin.java | 4 +- .../lib/android_alarm_manager.dart | 62 +++++++++++++++++-- packages/android_alarm_manager/pubspec.yaml | 2 +- 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/packages/android_alarm_manager/CHANGELOG.md b/packages/android_alarm_manager/CHANGELOG.md index af2d8b7cf53e..f7537a5b62f5 100644 --- a/packages/android_alarm_manager/CHANGELOG.md +++ b/packages/android_alarm_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.3 + +* Added `oneShotAt` method to run `callback` at a given DateTime `time`. + ## 0.4.2 * Added support for setting alarms which work when the phone is in doze mode. diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java index 6a7239314caa..5cc77413928e 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java @@ -50,7 +50,7 @@ public static void registerWith(Registrar registrar) { // alarmManagerPluginChannel is the channel responsible for receiving the following messages // from the main Flutter app: // - "AlarmService.start" - // - "Alarm.oneShot" + // - "Alarm.oneShotAt" // - "Alarm.periodic" // - "Alarm.cancel" final MethodChannel alarmManagerPluginChannel = @@ -125,7 +125,7 @@ public void onMethodCall(MethodCall call, Result result) { PeriodicRequest periodicRequest = PeriodicRequest.fromJson((JSONArray) arguments); AlarmService.setPeriodic(mContext, periodicRequest); result.success(true); - } else if (method.equals("Alarm.oneShot")) { + } else if (method.equals("Alarm.oneShotAt")) { // This message indicates that the Flutter app would like to schedule a one-time // task. OneShotRequest oneShotRequest = OneShotRequest.fromJson((JSONArray) arguments); diff --git a/packages/android_alarm_manager/lib/android_alarm_manager.dart b/packages/android_alarm_manager/lib/android_alarm_manager.dart index 228112a847c8..05ead109c36f 100644 --- a/packages/android_alarm_manager/lib/android_alarm_manager.dart +++ b/packages/android_alarm_manager/lib/android_alarm_manager.dart @@ -113,20 +113,74 @@ class AndroidAlarmManager { bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, + }) => + oneShotAt( + DateTime.now().add(delay), + id, + callback, + alarmClock: alarmClock, + allowWhileIdle: allowWhileIdle, + exact: exact, + wakeup: wakeup, + rescheduleOnReboot: rescheduleOnReboot, + ); + + /// Schedules a one-shot timer to run `callback` at `time`. + /// + /// The `callback` will run whether or not the main application is running or + /// in the foreground. It will run in the Isolate owned by the + /// AndroidAlarmManager service. + /// + /// `callback` must be either a top-level function or a static method from a + /// class. + /// + /// The timer is uniquely identified by `id`. Calling this function again + /// again with the same `id` will cancel and replace the existing timer. + /// + /// If `alarmClock` is passed as `true`, the timer will be created with + /// Android's `AlarmManagerCompat.setAlarmClock`. + /// + /// If `allowWhileIdle` is passed as `true`, the timer will be created with + /// Android's `AlarmManagerCompat.setExactAndAllowWhileIdle` or + /// `AlarmManagerCompat.setAndAllowWhileIdle`. + /// + /// If `exact` is passed as `true`, the timer will be created with Android's + /// `AlarmManagerCompat.setExact`. When `exact` is `false` (the default), the + /// timer will be created with `AlarmManager.set`. + /// + /// If `wakeup` is passed as `true`, the device will be woken up when the + /// alarm fires. If `wakeup` is false (the default), the device will not be + /// woken up to service the alarm. + /// + /// If `rescheduleOnReboot` is passed as `true`, the alarm will be persisted + /// across reboots. If `rescheduleOnReboot` is false (the default), the alarm + /// will not be rescheduled after a reboot and will not be executed. + /// + /// Returns a [Future] that resolves to `true` on success and `false` on + /// failure. + static Future oneShotAt( + DateTime time, + int id, + dynamic Function() callback, { + bool alarmClock = false, + bool allowWhileIdle = false, + bool exact = false, + bool wakeup = false, + bool rescheduleOnReboot = false, }) async { - final int now = DateTime.now().millisecondsSinceEpoch; - final int first = now + delay.inMilliseconds; + final int startMillis = time.millisecondsSinceEpoch; final CallbackHandle handle = PluginUtilities.getCallbackHandle(callback); if (handle == null) { return false; } - final bool r = await _channel.invokeMethod('Alarm.oneShot', [ + final bool r = + await _channel.invokeMethod('Alarm.oneShotAt', [ id, alarmClock, allowWhileIdle, exact, wakeup, - first, + startMillis, rescheduleOnReboot, handle.toRawHandle(), ]); diff --git a/packages/android_alarm_manager/pubspec.yaml b/packages/android_alarm_manager/pubspec.yaml index 90907d9908a0..b164970fcc97 100644 --- a/packages/android_alarm_manager/pubspec.yaml +++ b/packages/android_alarm_manager/pubspec.yaml @@ -1,7 +1,7 @@ name: android_alarm_manager description: Flutter plugin for accessing the Android AlarmManager service, and running Dart code in the background when alarms fire. -version: 0.4.2 +version: 0.4.3 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager From 2b2ca6687e49e5e1067a11939fc78f2013c6fbd4 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Mon, 12 Aug 2019 17:00:41 -0700 Subject: [PATCH 014/133] Request code needs to be below 2^16 for FragmentActivity (#1968) If using FragmentActivity, the requestCode used for startActivityForResult needs to be below 65536. See https://stackoverflow.com/questions/25529865/java-lang-illegalargumentexception-can-only-use-lower-16-bits-for-requestcode. --- packages/camera/CHANGELOG.md | 4 ++++ .../java/io/flutter/plugins/camera/CameraPermissions.java | 2 +- packages/camera/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 196cd3e2c563..ff0593ad2c5d 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.3+1 + +* Fix too large request code for FragmentActivity users. + ## 0.5.3 * Added new quality presets. diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java index d703af819181..e45fb1e5a594 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java @@ -10,7 +10,7 @@ import io.flutter.plugin.common.PluginRegistry.Registrar; public class CameraPermissions { - private static final int CAMERA_REQUEST_ID = 513469796; + private static final int CAMERA_REQUEST_ID = 9796; private boolean ongoing = false; public void requestPermissions( diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 3e290f10568d..3a82ee425e34 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.3 +version: 0.5.3+1 authors: - Flutter Team From eb7278731585dd6f8631341c90fb3ac8aad46213 Mon Sep 17 00:00:00 2001 From: James McIntosh Date: Wed, 14 Aug 2019 05:21:32 +1200 Subject: [PATCH 015/133] google-services-maps v17.0.0 androidx compatible (#1941) --- packages/google_maps_flutter/CHANGELOG.md | 4 ++++ packages/google_maps_flutter/android/build.gradle | 2 +- packages/google_maps_flutter/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index d3f56e36327d..92e490a5f313 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.20+3 + +* Update Android play-services-maps to 17.0.0 + ## 0.5.20+2 * Android: Fix polyline width in building phase. diff --git a/packages/google_maps_flutter/android/build.gradle b/packages/google_maps_flutter/android/build.gradle index 8992ab39e74c..e7bc80c42c52 100644 --- a/packages/google_maps_flutter/android/build.gradle +++ b/packages/google_maps_flutter/android/build.gradle @@ -46,6 +46,6 @@ android { } dependencies { - implementation 'com.google.android.gms:play-services-maps:16.1.0' + implementation 'com.google.android.gms:play-services-maps:17.0.0' } } diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index dcd2b3eb4ed3..60573e275c40 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+2 +version: 0.5.20+3 dependencies: flutter: From 3820fd581ec859fef9bb1f4f38d9a12d9f657860 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Tue, 13 Aug 2019 15:29:46 -0700 Subject: [PATCH 016/133] [webview_flutter] Workaround display listeners bug on all Android versions prior to P (#1975) Apply the display listeners workaround on all Android versions prior to P --- packages/webview_flutter/CHANGELOG.md | 5 +++++ .../plugins/webviewflutter/DisplayListenerProxy.java | 7 ++++--- packages/webview_flutter/pubspec.yaml | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 0bcb47f4cab3..38b344d88f34 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.11+3 + +* Apply the display listeners workaround that was shipped in 0.3.11+1 on + all Android versions prior to P. + ## 0.3.11+2 * Add fix for input connection being dropped after a screen resize on certain diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java index 9335f6f37fcf..1273e7349620 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java @@ -107,9 +107,10 @@ public void onDisplayChanged(int displayId) { @SuppressWarnings({"unchecked", "PrivateApi"}) private static ArrayList yoinkDisplayListeners(DisplayManager displayManager) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - // We cannot use reflection on Android O, but it shouldn't matter as it shipped - // with a WebView version that has the bug this code is working around fixed. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + // We cannot use reflection on Android P, but it shouldn't matter as it shipped + // with WebView 66.0.3359.158 and the WebView version the bug this code is working around was + // fixed in 61.0.3116.0. return new ArrayList<>(); } try { diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 5af01a9b0a1c..d2f6aa0e81e1 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11+2 +version: 0.3.11+3 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From e2f0f2df1f406c0b61648ed307ffd1b0b55c9e77 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Tue, 13 Aug 2019 23:42:25 +0100 Subject: [PATCH 017/133] [firebase_auth] use long datatype for timestamps (iOS) (#1973) * [firebase_auth] use long datatype for timestamps (iOS) --- packages/firebase_auth/CHANGELOG.md | 4 ++++ packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m | 7 ++++--- packages/firebase_auth/pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/firebase_auth/CHANGELOG.md b/packages/firebase_auth/CHANGELOG.md index 1565e4fada58..d2b0aa1a4e34 100644 --- a/packages/firebase_auth/CHANGELOG.md +++ b/packages/firebase_auth/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.14.0+2 + +* Reduce compiler warnings on iOS port by replacing `int` with `long` backing in returned timestamps. + ## 0.14.0+1 * Add dependency on `androidx.annotation:annotation:1.0.0`. diff --git a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m index 682ffe18e34c..28a3f3e18b03 100644 --- a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m +++ b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m @@ -217,9 +217,10 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result tokenData = [[NSMutableDictionary alloc] initWithDictionary:@{ @"token" : tokenResult.token, @"expirationTimestamp" : - [NSNumber numberWithInt:expirationTimestamp], - @"authTimestamp" : [NSNumber numberWithInt:authTimestamp], - @"issuedAtTimestamp" : [NSNumber numberWithInt:issuedAtTimestamp], + [NSNumber numberWithLong:expirationTimestamp], + @"authTimestamp" : [NSNumber numberWithLong:authTimestamp], + @"issuedAtTimestamp" : + [NSNumber numberWithLong:issuedAtTimestamp], @"claims" : tokenResult.claims, }]; diff --git a/packages/firebase_auth/pubspec.yaml b/packages/firebase_auth/pubspec.yaml index d4cf41bc55c7..163957b97e9b 100755 --- a/packages/firebase_auth/pubspec.yaml +++ b/packages/firebase_auth/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter plugin for Firebase Auth, enabling Android and iOS like Google, Facebook and Twitter. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_auth -version: 0.14.0+1 +version: 0.14.0+2 flutter: plugin: From 759375a6834efe57cb315b7fc8e008ed87ee746a Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Wed, 14 Aug 2019 13:42:32 -0700 Subject: [PATCH 018/133] [webview_flutter] Remove noisy log messages on iOS (#1978) --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/ios/Classes/FlutterWebView.m | 2 -- packages/webview_flutter/pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 38b344d88f34..d5c8f4661fc5 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.11+4 + +* Removed noisy log messages on iOS. + ## 0.3.11+3 * Apply the display listeners workaround that was shipped in 0.3.11+1 on diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index 87cb0f57377b..c0aa7fd650f6 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -279,7 +279,6 @@ - (void)updateAutoMediaPlaybackPolicy:(NSNumber*)policy inConfiguration:(WKWebViewConfiguration*)configuration { switch ([policy integerValue]) { case 0: // require_user_action_for_all_media_types - NSLog(@"requiring user action for all types"); if (@available(iOS 10.0, *)) { configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeAll; } else { @@ -287,7 +286,6 @@ - (void)updateAutoMediaPlaybackPolicy:(NSNumber*)policy } break; case 1: // always_allow - NSLog(@"allowing auto playback"); if (@available(iOS 10.0, *)) { configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone; } else { diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index d2f6aa0e81e1..83e360187e55 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11+3 +version: 0.3.11+4 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 05c6d01ce3b251f4fa14016e9c07762bd2298602 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Thu, 15 Aug 2019 16:51:01 +0100 Subject: [PATCH 019/133] [webview_flutter] Remove warnings regarding iOS9 SDK methods (#1976) Including the webview_flutter plugin currently creates a few warnings rgd. methods not being available on iOS9 and so forth. It may be personal taste, but I find them distracting - and technically the method is not really protected by the @available block so it will be useful to move the code back into it. The plugin also migrates the example project files to the latest Xcode recommendation which removes compilation warnings as well. After this PR, the compiler warnings for the webview_example are gone completely: --- packages/webview_flutter/CHANGELOG.md | 5 +++ .../ios/Runner.xcodeproj/project.pbxproj | 14 +++++--- .../xcshareddata/xcschemes/Runner.xcscheme | 4 +-- .../ios/Classes/FLTCookieManager.m | 32 ++++++++----------- packages/webview_flutter/pubspec.yaml | 2 +- 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index d5c8f4661fc5..bed1174101d5 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.11+5 + +* Reduce compiler warnings regarding iOS9 compatibility by moving a single + method back into a `@available` block. + ## 0.3.11+4 * Removed noisy log messages on iOS. diff --git a/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj index 61ee7d2d4093..cfae18c07a78 100644 --- a/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 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 */; }; @@ -177,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0910; + LastUpgradeCheck = 1030; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -187,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,7 +209,6 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -323,6 +321,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -332,12 +331,14 @@ 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; @@ -377,6 +378,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -386,12 +388,14 @@ 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; @@ -426,6 +430,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -449,6 +454,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/webview_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/webview_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1263ac84b105..036fdb7b317a 100644 --- a/packages/webview_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/webview_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -46,7 +45,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/packages/webview_flutter/ios/Classes/FLTCookieManager.m b/packages/webview_flutter/ios/Classes/FLTCookieManager.m index 4e48501e1a74..47948bf6b9f0 100644 --- a/packages/webview_flutter/ios/Classes/FLTCookieManager.m +++ b/packages/webview_flutter/ios/Classes/FLTCookieManager.m @@ -26,28 +26,24 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result - (void)clearCookies:(FlutterResult)result { if (@available(iOS 9.0, *)) { - [self clearCookiesIos9AndLater:result]; + NSSet *websiteDataTypes = [NSSet setWithObject:WKWebsiteDataTypeCookies]; + WKWebsiteDataStore *dataStore = [WKWebsiteDataStore defaultDataStore]; + + void (^deleteAndNotify)(NSArray *) = + ^(NSArray *cookies) { + BOOL hasCookies = cookies.count > 0; + [dataStore removeDataOfTypes:websiteDataTypes + forDataRecords:cookies + completionHandler:^{ + result(@(hasCookies)); + }]; + }; + + [dataStore fetchDataRecordsOfTypes:websiteDataTypes completionHandler:deleteAndNotify]; } else { // support for iOS8 tracked in https://github.com/flutter/flutter/issues/27624. NSLog(@"Clearing cookies is not supported for Flutter WebViews prior to iOS 9."); } } -- (void)clearCookiesIos9AndLater:(FlutterResult)result { - NSSet *websiteDataTypes = [NSSet setWithArray:@[ WKWebsiteDataTypeCookies ]]; - WKWebsiteDataStore *dataStore = [WKWebsiteDataStore defaultDataStore]; - - void (^deleteAndNotify)(NSArray *) = - ^(NSArray *cookies) { - BOOL hasCookies = cookies.count > 0; - [dataStore removeDataOfTypes:websiteDataTypes - forDataRecords:cookies - completionHandler:^{ - result(@(hasCookies)); - }]; - }; - - [dataStore fetchDataRecordsOfTypes:websiteDataTypes completionHandler:deleteAndNotify]; -} - @end diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 83e360187e55..287177aee272 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11+4 +version: 0.3.11+5 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From be0cfa33c7e07aa94743ad88920bdd48b17a8925 Mon Sep 17 00:00:00 2001 From: Rafal Wachol Date: Thu, 15 Aug 2019 22:48:05 +0100 Subject: [PATCH 020/133] [webview_flutter] Calling destroy on webview when flutter part is getting disposed (#1886) fixes: flutter/flutter#33299 --- AUTHORS | 3 ++- packages/webview_flutter/CHANGELOG.md | 4 ++++ .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 1 + packages/webview_flutter/pubspec.yaml | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 855e3a4569f2..a24dfd196966 100644 --- a/AUTHORS +++ b/AUTHORS @@ -41,4 +41,5 @@ Jose Sanchez Debkanchan Samadder Audrius Karosevicius Lukasz Piliszczuk -SoundReply Solutions GmbH \ No newline at end of file +SoundReply Solutions GmbH +Rafal Wachol diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index bed1174101d5..8600d04b3ffb 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.11+6 + +* Calling destroy on Android webview when flutter webview is getting disposed. + ## 0.3.11+5 * Reduce compiler warnings regarding iOS9 compatibility by moving a single diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index e089f6d28190..67fdcc71b3df 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -278,5 +278,6 @@ private void registerJavaScriptChannelNames(List channelNames) { public void dispose() { methodChannel.setMethodCallHandler(null); webView.dispose(); + webView.destroy(); } } diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 287177aee272..ce39caee2fd6 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11+5 +version: 0.3.11+6 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 59eeaa85c1fe70de24a194970042be73ec846635 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Thu, 15 Aug 2019 16:44:27 -0700 Subject: [PATCH 021/133] [webview_flutter] Add a getTitle method to WebViewController (#1979) Allows inspecting the title of the currently loaded page. --- packages/webview_flutter/CHANGELOG.md | 4 ++ .../webviewflutter/FlutterWebView.java | 7 ++++ .../example/test_driver/webview.dart | 37 +++++++++++++++++++ .../ios/Classes/FlutterWebView.m | 7 ++++ .../lib/platform_interface.dart | 6 +++ .../lib/src/webview_method_channel.dart | 3 ++ .../webview_flutter/lib/webview_flutter.dart | 5 +++ packages/webview_flutter/pubspec.yaml | 2 +- 8 files changed, 70 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 8600d04b3ffb..80edcc8279f2 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.12 + +* Added a getTitle getter to WebViewController. + ## 0.3.11+6 * Calling destroy on Android webview when flutter webview is getting disposed. diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 67fdcc71b3df..333e7e8067bf 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -130,6 +130,9 @@ public void onMethodCall(MethodCall methodCall, Result result) { case "clearCache": clearCache(result); break; + case "getTitle": + getTitle(result); + break; default: result.notImplemented(); } @@ -222,6 +225,10 @@ private void clearCache(Result result) { result.success(null); } + private void getTitle(Result result) { + result.success(webView.getTitle()); + } + private void applySettings(Map settings) { for (String key : settings.keySet()) { switch (key) { diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index fefaf6d49bef..7e1440b71409 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -369,6 +369,43 @@ void main() { expect(isPaused, _webviewBool(false)); }); }); + + test('getTitle', () async { + final String getTitleTest = ''' + + Some title + + + + + '''; + final String getTitleTestBase64 = + base64Encode(const Utf8Encoder().convert(getTitleTest)); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); + + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), + ), + ); + + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + + final String title = await controller.getTitle(); + expect(title, 'Some title'); + }); } Future pumpWidget(Widget widget) { diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index c0aa7fd650f6..8fd855e2c8bd 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -118,6 +118,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self onRemoveJavaScriptChannels:call result:result]; } else if ([[call method] isEqualToString:@"clearCache"]) { [self clearCache:result]; + } else if ([[call method] isEqualToString:@"getTitle"]) { + [self onGetTitle:result]; } else { result(FlutterMethodNotImplemented); } @@ -238,6 +240,11 @@ - (void)clearCache:(FlutterResult)result { } } +- (void)onGetTitle:(FlutterResult)result { + NSString* title = _webView.title; + result(title); +} + // Returns nil when successful, or an error message when one or more keys are unknown. - (NSString*)applySettings:(NSDictionary*)settings { NSMutableArray* unknownKeys = [[NSMutableArray alloc] init]; diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 4e6b8b86cacf..644c33a4e014 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -152,6 +152,12 @@ abstract class WebViewPlatformController { throw UnimplementedError( "WebView removeJavascriptChannels is not implemented on the current platform"); } + + /// Returns the title of the currently loaded page. + Future getTitle() { + throw UnimplementedError( + "WebView getTitle is not implemented on the current platform"); + } } /// Settings for configuring a WebViewPlatform. diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index a914e1828b6b..337e871145aa 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -103,6 +103,9 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'removeJavascriptChannels', javascriptChannelNames.toList()); } + @override + Future getTitle() => _channel.invokeMethod("getTitle"); + /// Method channel implementation for [WebViewPlatform.clearCookies]. static Future clearCookies() { return _cookieManagerChannel diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 4335ed27ada8..8d81278955a0 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -600,6 +600,11 @@ class WebViewController { // ignore: strong_mode_implicit_dynamic_method return _webViewPlatformController.evaluateJavascript(javascriptString); } + + /// Returns the title of the currently loaded page. + Future getTitle() { + return _webViewPlatformController.getTitle(); + } } /// Manages cookies pertaining to all [WebView]s. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index ce39caee2fd6..6c668033548b 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.11+6 +version: 0.3.12 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From e4feab651ad6aec18d8fc2b71633fee9f41164b7 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Thu, 15 Aug 2019 18:14:56 -0700 Subject: [PATCH 022/133] Revert "[webview_flutter] Add a getTitle method to WebViewController" (#1981) Reverts #1979 The change broke Fuchsia, as FuchsiaWebViewController implements WebViewPlatformController so it doesn't get the no-op implementation of getTitle. We could change the FuchsiaWebViewController implementation to extend WebViewPlatformController so we can add new methods without requiring roll coordination. I'm reverting temporarily until we resolve the roll issue. --- packages/webview_flutter/CHANGELOG.md | 4 ++ .../webviewflutter/FlutterWebView.java | 7 ---- .../example/test_driver/webview.dart | 37 ------------------- .../ios/Classes/FlutterWebView.m | 7 ---- .../lib/platform_interface.dart | 6 --- .../lib/src/webview_method_channel.dart | 3 -- .../webview_flutter/lib/webview_flutter.dart | 5 --- packages/webview_flutter/pubspec.yaml | 2 +- 8 files changed, 5 insertions(+), 66 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 80edcc8279f2..a7c767aec5b8 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.12+1 + +* Temporarily revert getTitle (doing this as a patch bump shortly after publishing). + ## 0.3.12 * Added a getTitle getter to WebViewController. diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 333e7e8067bf..67fdcc71b3df 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -130,9 +130,6 @@ public void onMethodCall(MethodCall methodCall, Result result) { case "clearCache": clearCache(result); break; - case "getTitle": - getTitle(result); - break; default: result.notImplemented(); } @@ -225,10 +222,6 @@ private void clearCache(Result result) { result.success(null); } - private void getTitle(Result result) { - result.success(webView.getTitle()); - } - private void applySettings(Map settings) { for (String key : settings.keySet()) { switch (key) { diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index 7e1440b71409..fefaf6d49bef 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -369,43 +369,6 @@ void main() { expect(isPaused, _webviewBool(false)); }); }); - - test('getTitle', () async { - final String getTitleTest = ''' - - Some title - - - - - '''; - final String getTitleTestBase64 = - base64Encode(const Utf8Encoder().convert(getTitleTest)); - final Completer pageLoaded = Completer(); - final Completer controllerCompleter = - Completer(); - - await pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - initialUrl: 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - ), - ), - ); - - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; - - final String title = await controller.getTitle(); - expect(title, 'Some title'); - }); } Future pumpWidget(Widget widget) { diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index 8fd855e2c8bd..c0aa7fd650f6 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -118,8 +118,6 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self onRemoveJavaScriptChannels:call result:result]; } else if ([[call method] isEqualToString:@"clearCache"]) { [self clearCache:result]; - } else if ([[call method] isEqualToString:@"getTitle"]) { - [self onGetTitle:result]; } else { result(FlutterMethodNotImplemented); } @@ -240,11 +238,6 @@ - (void)clearCache:(FlutterResult)result { } } -- (void)onGetTitle:(FlutterResult)result { - NSString* title = _webView.title; - result(title); -} - // Returns nil when successful, or an error message when one or more keys are unknown. - (NSString*)applySettings:(NSDictionary*)settings { NSMutableArray* unknownKeys = [[NSMutableArray alloc] init]; diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 644c33a4e014..4e6b8b86cacf 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -152,12 +152,6 @@ abstract class WebViewPlatformController { throw UnimplementedError( "WebView removeJavascriptChannels is not implemented on the current platform"); } - - /// Returns the title of the currently loaded page. - Future getTitle() { - throw UnimplementedError( - "WebView getTitle is not implemented on the current platform"); - } } /// Settings for configuring a WebViewPlatform. diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index 337e871145aa..a914e1828b6b 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -103,9 +103,6 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'removeJavascriptChannels', javascriptChannelNames.toList()); } - @override - Future getTitle() => _channel.invokeMethod("getTitle"); - /// Method channel implementation for [WebViewPlatform.clearCookies]. static Future clearCookies() { return _cookieManagerChannel diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 8d81278955a0..4335ed27ada8 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -600,11 +600,6 @@ class WebViewController { // ignore: strong_mode_implicit_dynamic_method return _webViewPlatformController.evaluateJavascript(javascriptString); } - - /// Returns the title of the currently loaded page. - Future getTitle() { - return _webViewPlatformController.getTitle(); - } } /// Manages cookies pertaining to all [WebView]s. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 6c668033548b..206b481ce0bf 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.12 +version: 0.3.12+1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 2daeaf22cc5b2938762b9ced228e9fa737629ae3 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 15 Aug 2019 19:39:00 -0700 Subject: [PATCH 023/133] [image_picker] Image picker rotation fix on iOS after scaling. --- packages/image_picker/CHANGELOG.md | 6 +++ .../MetaDataUtilTests.m | 41 ------------------- .../PhotoAssetUtilTests.m | 18 +++++--- .../ios/Classes/FLTImagePickerImageUtil.m | 10 ++++- .../ios/Classes/FLTImagePickerMetaDataUtil.h | 3 -- .../ios/Classes/FLTImagePickerMetaDataUtil.m | 25 ----------- .../Classes/FLTImagePickerPhotoAssetUtil.m | 23 +---------- packages/image_picker/pubspec.yaml | 2 +- 8 files changed, 29 insertions(+), 99 deletions(-) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index bd1b4300442b..40af08bff32b 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.1+3 + +* Bugfix iOS: Fix orientation of the picked image after scaling. +* Remove unnecessary code that tried to normalize the orientation. +* Trivial XCTest code fix. + ## 0.6.1+2 * Replace dependency on `androidx.legacy:legacy-support-v4:1.0.0` with `androidx.core:core:1.0.2` diff --git a/packages/image_picker/example/ios/image_picker_exampleTests/MetaDataUtilTests.m b/packages/image_picker/example/ios/image_picker_exampleTests/MetaDataUtilTests.m index bc2fa79fd009..e625105d3196 100644 --- a/packages/image_picker/example/ios/image_picker_exampleTests/MetaDataUtilTests.m +++ b/packages/image_picker/example/ios/image_picker_exampleTests/MetaDataUtilTests.m @@ -95,47 +95,6 @@ - (void)testConvertImageToData { quality:nil]; XCTAssertEqual([FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:convertedDataPNG], FLTImagePickerMIMETypePNG); - - // test throws exceptions - XCTAssertThrows([FLTImagePickerMetaDataUtil convertImage:imageJPG - usingType:FLTImagePickerMIMETypePNG - quality:@(0.5)], - @"setting quality when converting to PNG throws exception"); -} - -- (void)testGetNormalizedUIImageOrientationFromCGImagePropertyOrientation { - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationUp], - UIImageOrientationUp); - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationDown], - UIImageOrientationDown); - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationLeft], - UIImageOrientationRight); - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationRight], - UIImageOrientationLeft); - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationUpMirrored], - UIImageOrientationUpMirrored); - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationDownMirrored], - UIImageOrientationDownMirrored); - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationLeftMirrored], - UIImageOrientationRightMirrored); - XCTAssertEqual( - [FLTImagePickerMetaDataUtil getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - kCGImagePropertyOrientationRightMirrored], - UIImageOrientationLeftMirrored); } @end diff --git a/packages/image_picker/example/ios/image_picker_exampleTests/PhotoAssetUtilTests.m b/packages/image_picker/example/ios/image_picker_exampleTests/PhotoAssetUtilTests.m index ce7dc07dfa61..118707564ac4 100644 --- a/packages/image_picker/example/ios/image_picker_exampleTests/PhotoAssetUtilTests.m +++ b/packages/image_picker/example/ios/image_picker_exampleTests/PhotoAssetUtilTests.m @@ -31,7 +31,8 @@ - (void)testSaveImageWithOriginalImageData_ShouldSaveWithTheCorrectExtentionAndM NSString *savedPathJPG = [FLTImagePickerPhotoAssetUtil saveImageWithOriginalImageData:dataJPG image:imageJPG maxWidth:nil - maxHeight:nil]; + maxHeight:nil + imageQuality:nil]; XCTAssertNotNil(savedPathJPG); XCTAssertEqualObjects([savedPathJPG substringFromIndex:savedPathJPG.length - 4], @".jpg"); @@ -47,7 +48,8 @@ - (void)testSaveImageWithOriginalImageData_ShouldSaveWithTheCorrectExtentionAndM NSString *savedPathPNG = [FLTImagePickerPhotoAssetUtil saveImageWithOriginalImageData:dataPNG image:imagePNG maxWidth:nil - maxHeight:nil]; + maxHeight:nil + imageQuality:nil]; XCTAssertNotNil(savedPathPNG); XCTAssertEqualObjects([savedPathPNG substringFromIndex:savedPathPNG.length - 4], @".png"); @@ -62,7 +64,8 @@ - (void)testSaveImageWithPickerInfo_ShouldSaveWithDefaultExtention { ofType:@"jpg"]]; UIImage *imageJPG = [UIImage imageWithData:dataJPG]; NSString *savedPathJPG = [FLTImagePickerPhotoAssetUtil saveImageWithPickerInfo:nil - image:imageJPG]; + image:imageJPG + imageQuality:nil]; XCTAssertNotNil(savedPathJPG); // should be saved as @@ -81,7 +84,8 @@ - (void)testSaveImageWithPickerInfo_ShouldSaveWithTheCorrectExtentionAndMetaData ofType:@"jpg"]]; UIImage *imageJPG = [UIImage imageWithData:dataJPG]; NSString *savedPathJPG = [FLTImagePickerPhotoAssetUtil saveImageWithPickerInfo:dummyInfo - image:imageJPG]; + image:imageJPG + imageQuality:nil]; NSData *data = [NSData dataWithContentsOfFile:savedPathJPG]; NSDictionary *meta = [FLTImagePickerMetaDataUtil getMetaDataFromImageData:data]; XCTAssertEqualObjects(meta[(__bridge NSString *)kCGImagePropertyExifDictionary] @@ -102,7 +106,8 @@ - (void)testSaveImageWithOriginalImageData_ShouldSaveAsGifAnimation { NSString *savedPathGIF = [FLTImagePickerPhotoAssetUtil saveImageWithOriginalImageData:dataGIF image:imageGIF maxWidth:nilSize - maxHeight:nilSize]; + maxHeight:nilSize + imageQuality:nil]; XCTAssertNotNil(savedPathGIF); XCTAssertEqualObjects([savedPathGIF substringFromIndex:savedPathGIF.length - 4], @".gif"); @@ -128,7 +133,8 @@ - (void)testSaveImageWithOriginalImageData_ShouldSaveAsScalledGifAnimation { NSString *savedPathGIF = [FLTImagePickerPhotoAssetUtil saveImageWithOriginalImageData:dataGIF image:imageGIF maxWidth:@3 - maxHeight:@2]; + maxHeight:@2 + imageQuality:nil]; NSData *newDataGIF = [NSData dataWithContentsOfFile:savedPathGIF]; UIImage *newImage = [[UIImage alloc] initWithData:newDataGIF]; diff --git a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m index fd766aad7fc5..000bd4bf9c66 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m @@ -69,12 +69,18 @@ + (UIImage *)scaledImage:(UIImage *)image } } + // Scaling the image always rotate itself based on the current imageOrientation of the original + // Image. Set to orientationUp for the orignal image before scaling, so the scaled image doesn't + // mess up with the pixels. + UIImage *imageToScale = [UIImage imageWithCGImage:image.CGImage + scale:1 + orientation:UIImageOrientationUp]; + UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, 1.0); - [image drawInRect:CGRectMake(0, 0, width, height)]; + [imageToScale drawInRect:CGRectMake(0, 0, width, height)]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); - return scaledImage; } diff --git a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h index 591375b26ff4..a82dbbff93f7 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h +++ b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h @@ -29,9 +29,6 @@ extern const FLTImagePickerMIMEType kFLTImagePickerMIMETypeDefault; + (NSData *)updateMetaData:(NSDictionary *)metaData toImage:(NSData *)imageData; -+ (UIImageOrientation)getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - (CGImagePropertyOrientation)cgImageOrientation; - // Converting UIImage to a NSData with the type proveide. // // The quality is for JPEG type only, it defaults to 1. It throws exception if setting a non-nil diff --git a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m index c73559008bbd..c15f7079ad0c 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m @@ -84,29 +84,4 @@ + (NSData *)convertImage:(UIImage *)image } } -+ (UIImageOrientation)getNormalizedUIImageOrientationFromCGImagePropertyOrientation: - (CGImagePropertyOrientation)cgImageOrientation { - switch (cgImageOrientation) { - case kCGImagePropertyOrientationUp: - return UIImageOrientationUp; - case kCGImagePropertyOrientationDown: - return UIImageOrientationDown; - case kCGImagePropertyOrientationLeft: - return UIImageOrientationRight; - case kCGImagePropertyOrientationRight: - return UIImageOrientationLeft; - case kCGImagePropertyOrientationUpMirrored: - return UIImageOrientationUpMirrored; - case kCGImagePropertyOrientationDownMirrored: - return UIImageOrientationDownMirrored; - case kCGImagePropertyOrientationLeftMirrored: - return UIImageOrientationRightMirrored; - case kCGImagePropertyOrientationRightMirrored: - return UIImageOrientationLeftMirrored; - default: - return UIImageOrientationUp; - } - return UIImageOrientationUp; -} - @end diff --git a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m index 4531298f3f87..f6727334060a 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.m @@ -76,16 +76,7 @@ + (NSString *)saveImageWithMetaData:(NSDictionary *)metaData suffix:(NSString *)suffix type:(FLTImagePickerMIMEType)type imageQuality:(NSNumber *)imageQuality { - CGImagePropertyOrientation orientation = (CGImagePropertyOrientation)[metaData[( - __bridge NSString *)kCGImagePropertyOrientation] integerValue]; - UIImage *newImage = [UIImage - imageWithCGImage:[image CGImage] - scale:1.0 - orientation: - [FLTImagePickerMetaDataUtil - getNormalizedUIImageOrientationFromCGImagePropertyOrientation:orientation]]; - - NSData *data = [FLTImagePickerMetaDataUtil convertImage:newImage + NSData *data = [FLTImagePickerMetaDataUtil convertImage:image usingType:type quality:imageQuality]; if (metaData) { @@ -118,19 +109,9 @@ + (NSString *)saveImageWithMetaData:(NSDictionary *)metaData CGImageDestinationSetProperties(destination, (CFDictionaryRef)gifMetaProperties); - CGImagePropertyOrientation orientation = (CGImagePropertyOrientation)[metaData[( - __bridge NSString *)kCGImagePropertyOrientation] integerValue]; - for (NSInteger index = 0; index < gifInfo.images.count; index++) { UIImage *image = (UIImage *)[gifInfo.images objectAtIndex:index]; - UIImage *newImage = [UIImage - imageWithCGImage:[image CGImage] - scale:1.0 - orientation: - [FLTImagePickerMetaDataUtil - getNormalizedUIImageOrientationFromCGImagePropertyOrientation:orientation]]; - - CGImageDestinationAddImage(destination, newImage.CGImage, (CFDictionaryRef)frameProperties); + CGImageDestinationAddImage(destination, image.CGImage, (CFDictionaryRef)frameProperties); } CGImageDestinationFinalize(destination); diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index 7ebbc579a7b8..b85cd9039b53 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -5,7 +5,7 @@ authors: - Flutter Team - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.1+2 +version: 0.6.1+3 flutter: plugin: From c8f0c27a69543e4547b7329ee3dd0f9b56af3f4c Mon Sep 17 00:00:00 2001 From: Mohamad Alsabbagh Date: Fri, 16 Aug 2019 10:40:59 -0400 Subject: [PATCH 024/133] [firebase_admob] Banner Ad Horizontal Positioning (#1925) --- packages/firebase_admob/CHANGELOG.md | 4 ++++ packages/firebase_admob/README.md | 19 ++++++++++++++++++- .../firebaseadmob/FirebaseAdMobPlugin.java | 4 ++++ .../plugins/firebaseadmob/MobileAd.java | 9 +++++++-- packages/firebase_admob/example/lib/main.dart | 8 ++++++++ .../firebase_admob/ios/Classes/FLTMobileAd.h | 4 +++- .../firebase_admob/ios/Classes/FLTMobileAd.m | 13 ++++++++++--- .../ios/Classes/FirebaseAdMobPlugin.m | 6 +++++- .../firebase_admob/lib/firebase_admob.dart | 8 ++++++-- packages/firebase_admob/pubspec.yaml | 2 +- .../test/firebase_admob_test.dart | 6 +++++- 11 files changed, 71 insertions(+), 12 deletions(-) diff --git a/packages/firebase_admob/CHANGELOG.md b/packages/firebase_admob/CHANGELOG.md index 03ca09e32284..7a44bfb131f5 100644 --- a/packages/firebase_admob/CHANGELOG.md +++ b/packages/firebase_admob/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.0+4 + +* Add the ability to horizontally adjust the ads banner location by specifying a pixel offset from the centre. + ## 0.9.0+3 * Update google-services Android gradle plugin to 4.3.0 in documentation and examples. diff --git a/packages/firebase_admob/README.md b/packages/firebase_admob/README.md index 80a1ca5f416e..a7a285249c49 100644 --- a/packages/firebase_admob/README.md +++ b/packages/firebase_admob/README.md @@ -122,6 +122,23 @@ myBanner ..show( // Positions the banner ad 60 pixels from the bottom of the screen anchorOffset: 60.0, + // Positions the banner ad 10 pixels from the center of the screen to the right + horizontalCenterOffset: 10.0, + // Banner Position + anchorType: AnchorType.bottom, + ); +``` + +Ads must be loaded before they're shown. +```dart +myBanner + // typically this happens well before the ad is shown + ..load() + ..show( + // Positions the banner ad 60 pixels from the bottom of the screen + anchorOffset: 60.0, + // Positions the banner ad 10 pixels from the center of the screen to the left + horizontalCenterOffset: -10.0, // Banner Position anchorType: AnchorType.bottom, ); @@ -133,6 +150,7 @@ myInterstitial ..show( anchorType: AnchorType.bottom, anchorOffset: 0.0, + horizontalCenterOffset: 0.0, ); ``` @@ -186,7 +204,6 @@ method. This is just an initial version of the plugin. There are still some limitations: -- Banner ads have limited positioning functionality. They can be positioned at the top or the bottom of the screen and at a logical pixel offset from the edge. - Banner ads cannot be animated into view. - It's not possible to specify a banner ad's size. - There's no support for native ads. diff --git a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java index 8fb1fb3e2ec9..62e6fe4befeb 100644 --- a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java +++ b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java @@ -151,6 +151,10 @@ private void callShowAd(int id, MethodCall call, Result result) { if (call.argument("anchorOffset") != null) { ad.anchorOffset = Double.parseDouble((String) call.argument("anchorOffset")); } + if (call.argument("horizontalCenterOffset") != null) { + ad.horizontalCenterOffset = + Double.parseDouble((String) call.argument("horizontalCenterOffset")); + } if (call.argument("anchorType") != null) { ad.anchorType = call.argument("anchorType").equals("bottom") ? Gravity.BOTTOM : Gravity.TOP; } diff --git a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java index 0b3fa19c64f6..a13573194c94 100644 --- a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java +++ b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java @@ -28,6 +28,7 @@ abstract class MobileAd extends AdListener { final int id; Status status; double anchorOffset; + double horizontalCenterOffset; int anchorType; enum Status { @@ -44,6 +45,7 @@ private MobileAd(int id, Activity activity, MethodChannel channel) { this.channel = channel; this.status = Status.CREATED; this.anchorOffset = 0.0; + this.horizontalCenterOffset = 0.0; this.anchorType = Gravity.BOTTOM; allAds.put(id, this); } @@ -160,10 +162,13 @@ void show() { content.addView(adView); final float scale = activity.getResources().getDisplayMetrics().density; + int left = horizontalCenterOffset > 0 ? (int) (horizontalCenterOffset * scale) : 0; + int right = + horizontalCenterOffset < 0 ? (int) (Math.abs(horizontalCenterOffset) * scale) : 0; if (anchorType == Gravity.BOTTOM) { - content.setPadding(0, 0, 0, (int) (anchorOffset * scale)); + content.setPadding(left, 0, right, (int) (anchorOffset * scale)); } else { - content.setPadding(0, (int) (anchorOffset * scale), 0, 0); + content.setPadding(left, (int) (anchorOffset * scale), right, 0); } activity.addContentView( diff --git a/packages/firebase_admob/example/lib/main.dart b/packages/firebase_admob/example/lib/main.dart index 7daf341a8d6e..e5014d652f13 100644 --- a/packages/firebase_admob/example/lib/main.dart +++ b/packages/firebase_admob/example/lib/main.dart @@ -92,6 +92,14 @@ class _MyAppState extends State { ..load() ..show(); }), + RaisedButton( + child: const Text('SHOW BANNER WITH OFFSET'), + onPressed: () { + _bannerAd ??= createBannerAd(); + _bannerAd + ..load() + ..show(horizontalCenterOffset: -50, anchorOffset: 100); + }), RaisedButton( child: const Text('REMOVE BANNER'), onPressed: () { diff --git a/packages/firebase_admob/ios/Classes/FLTMobileAd.h b/packages/firebase_admob/ios/Classes/FLTMobileAd.h index 195164b559a1..1979be13eb4e 100644 --- a/packages/firebase_admob/ios/Classes/FLTMobileAd.h +++ b/packages/firebase_admob/ios/Classes/FLTMobileAd.h @@ -19,7 +19,9 @@ typedef enum : NSUInteger { - (FLTMobileAdStatus)status; - (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targetingInfo; - (void)show; -- (void)showAtOffset:(double)anchorOffset fromAnchor:(int)anchorType; +- (void)showAtOffset:(double)anchorOffset + hCenterOffset:(double)horizontalCenterOffset + fromAnchor:(int)anchorType; - (void)dispose; @end diff --git a/packages/firebase_admob/ios/Classes/FLTMobileAd.m b/packages/firebase_admob/ios/Classes/FLTMobileAd.m index 22765d5b27c7..9e263406d620 100644 --- a/packages/firebase_admob/ios/Classes/FLTMobileAd.m +++ b/packages/firebase_admob/ios/Classes/FLTMobileAd.m @@ -14,6 +14,7 @@ @implementation FLTMobileAd FlutterMethodChannel *_channel; FLTMobileAdStatus _status; double _anchorOffset; +double _horizontalCenterOffset; int _anchorType; + (void)initialize { @@ -22,6 +23,7 @@ + (void)initialize { } _anchorType = 0; _anchorOffset = 0; + _horizontalCenterOffset = 0; if (statusToString == nil) { statusToString = @{ @@ -53,6 +55,7 @@ - (instancetype)initWithId:(NSNumber *)mobileAdId channel:(FlutterMethodChannel _channel = channel; _status = CREATED; _anchorOffset = 0; + _horizontalCenterOffset = 0; _anchorType = 0; allAds[mobileAdId] = self; } @@ -67,12 +70,15 @@ - (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targ // Implemented by the Banner and Interstitial subclasses } -- (void)showAtOffset:(double)anchorOffset fromAnchor:(int)anchorType { +- (void)showAtOffset:(double)anchorOffset + hCenterOffset:(double)horizontalCenterOffset + fromAnchor:(int)anchorType { _anchorType = anchorType; _anchorOffset = anchorOffset; if (_anchorType == 0) { _anchorOffset = -_anchorOffset; } + _horizontalCenterOffset = horizontalCenterOffset; [self show]; } @@ -146,7 +152,8 @@ - (void)show { if (@available(ios 11.0, *)) { UILayoutGuide *guide = screen.safeAreaLayoutGuide; [NSLayoutConstraint activateConstraints:@[ - [_banner.centerXAnchor constraintEqualToAnchor:guide.centerXAnchor], + [_banner.centerXAnchor constraintEqualToAnchor:guide.centerXAnchor + constant:_horizontalCenterOffset], [_banner.bottomAnchor constraintEqualToAnchor:_anchorType == 0 ? guide.bottomAnchor : guide.topAnchor constant:_anchorOffset] @@ -161,7 +168,7 @@ - (void)show { - (void)placeBannerPreIos11 { UIView *screen = [FLTMobileAd rootViewController].view; - CGFloat x = screen.frame.size.width / 2 - _banner.frame.size.width / 2; + CGFloat x = screen.frame.size.width / 2 - _banner.frame.size.width / 2 + _horizontalCenterOffset; CGFloat y; if (_anchorType == 0) { y = screen.frame.size.height - _banner.frame.size.height + _anchorOffset; diff --git a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m b/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m index 8a55c3145e51..d94762b9b61f 100644 --- a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m +++ b/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m @@ -187,15 +187,19 @@ - (void)callShowAd:(NSNumber *)mobileAdId } double offset = 0.0; + double horizontalCenterOffset = 0.0; int type = 0; if (call.arguments[@"anchorOffset"] != nil) { offset = [call.arguments[@"anchorOffset"] doubleValue]; } + if (call.arguments[@"horizontalCenterOffset"] != nil) { + horizontalCenterOffset = [call.arguments[@"horizontalCenterOffset"] doubleValue]; + } if (call.arguments[@"anchorType"] != nil) { type = [call.arguments[@"anchorType"] isEqualToString:@"bottom"] ? 0 : 1; } - [ad showAtOffset:offset fromAnchor:type]; + [ad showAtOffset:offset hCenterOffset:horizontalCenterOffset fromAnchor:type]; result([NSNumber numberWithBool:YES]); } diff --git a/packages/firebase_admob/lib/firebase_admob.dart b/packages/firebase_admob/lib/firebase_admob.dart index de8560a00eb9..70289b2b5dc2 100644 --- a/packages/firebase_admob/lib/firebase_admob.dart +++ b/packages/firebase_admob/lib/firebase_admob.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'dart:io' show Platform; +import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; @@ -221,11 +222,14 @@ abstract class MobileAd { /// anchorOffset is the logical pixel offset from the edge of the screen (default 0.0) /// anchorType place advert at top or bottom of screen (default bottom) Future show( - {double anchorOffset = 0.0, AnchorType anchorType = AnchorType.bottom}) { + {double anchorOffset = 0.0, + double horizontalCenterOffset = 0.0, + AnchorType anchorType = AnchorType.bottom}) { return _invokeBooleanMethod("showAd", { 'id': id, 'anchorOffset': anchorOffset.toString(), - 'anchorType': anchorType == AnchorType.top ? "top" : "bottom" + 'horizontalCenterOffset': horizontalCenterOffset.toString(), + 'anchorType': describeEnum(anchorType) }); } diff --git a/packages/firebase_admob/pubspec.yaml b/packages/firebase_admob/pubspec.yaml index 717d5c759ed3..e6ba7fa7271a 100644 --- a/packages/firebase_admob/pubspec.yaml +++ b/packages/firebase_admob/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Firebase AdMob, supporting banner, interstitial (full-screen), and rewarded video ads author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_admob -version: 0.9.0+3 +version: 0.9.0+4 flutter: plugin: diff --git a/packages/firebase_admob/test/firebase_admob_test.dart b/packages/firebase_admob/test/firebase_admob_test.dart index 45ff0615e19c..4d85664fa614 100644 --- a/packages/firebase_admob/test/firebase_admob_test.dart +++ b/packages/firebase_admob/test/firebase_admob_test.dart @@ -73,6 +73,7 @@ void main() { isMethodCall('showAd', arguments: { 'id': id, 'anchorOffset': '0.0', + 'horizontalCenterOffset': '0.0', 'anchorType': 'bottom', }), isMethodCall('disposeAd', arguments: { @@ -92,7 +93,9 @@ void main() { expect(await interstitial.load(), true); expect( await interstitial.show( - anchorOffset: 60.0, anchorType: AnchorType.top), + anchorOffset: 60.0, + horizontalCenterOffset: 10.0, + anchorType: AnchorType.top), true); expect(await interstitial.dispose(), true); @@ -105,6 +108,7 @@ void main() { isMethodCall('showAd', arguments: { 'id': id, 'anchorOffset': '60.0', + 'horizontalCenterOffset': '10.0', 'anchorType': 'top', }), isMethodCall('disposeAd', arguments: { From d8eed344ec8c5b2f3cae11fbcd3744adb4166b1d Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Fri, 16 Aug 2019 15:05:29 -0700 Subject: [PATCH 025/133] [webview_flutter] Add a comment asking to extend WebViewPlatformController (#1982) --- packages/webview_flutter/lib/platform_interface.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 4e6b8b86cacf..2c2efc425ae0 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -31,6 +31,12 @@ abstract class WebViewPlatformCallbacksHandler { /// /// An instance implementing this interface is passed to the `onWebViewPlatformCreated` callback that is /// passed to [WebViewPlatformBuilder#onWebViewPlatformCreated]. +/// +/// Platform implementations that live in a separate package should extend this class rather than +/// implement it as webview_flutter does not consider newly added methods to be breaking changes. +/// Extending this class (using `extends`) ensures that the subclass will get the default +/// implementation, while platform implementations that `implements` this interface will be broken +/// by newly added [WebViewPlatformController] methods. abstract class WebViewPlatformController { /// Creates a new WebViewPlatform. /// From 61c39d1e79e8f36030162a5f85fb491c65f4e51c Mon Sep 17 00:00:00 2001 From: Luis Thein Date: Sat, 17 Aug 2019 00:10:29 +0200 Subject: [PATCH 026/133] [webview_flutter] Allow setting a custom HTTP User-Agent (#1920) flutter/flutter#28256 --- packages/webview_flutter/CHANGELOG.md | 4 + .../webviewflutter/FlutterWebView.java | 11 +++ .../example/test_driver/webview.dart | 97 +++++++++++++++++++ .../ios/Classes/FlutterWebView.m | 11 +++ .../lib/platform_interface.dart | 72 +++++++++++++- .../lib/src/webview_method_channel.dart | 9 ++ .../webview_flutter/lib/webview_flutter.dart | 25 +++++ packages/webview_flutter/pubspec.yaml | 2 +- .../test/webview_flutter_test.dart | 27 +++++- 9 files changed, 252 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index a7c767aec5b8..75b2bf4997fc 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.13 + +* Add an optional `userAgent` property to set a custom User Agent. + ## 0.3.12+1 * Temporarily revert getTitle (doing this as a patch bump shortly after publishing). diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 67fdcc71b3df..2288b8f52d5a 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -60,6 +60,10 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { } updateAutoMediaPlaybackPolicy((Integer) params.get("autoMediaPlaybackPolicy")); + if (params.containsKey("userAgent")) { + String userAgent = (String) params.get("userAgent"); + updateUserAgent(userAgent); + } if (params.containsKey("initialUrl")) { String url = (String) params.get("initialUrl"); webView.loadUrl(url); @@ -241,6 +245,9 @@ private void applySettings(Map settings) { webView.setWebContentsDebuggingEnabled(debuggingEnabled); break; + case "userAgent": + updateUserAgent((String) settings.get(key)); + break; default: throw new IllegalArgumentException("Unknown WebView setting: " + key); } @@ -274,6 +281,10 @@ private void registerJavaScriptChannelNames(List channelNames) { } } + private void updateUserAgent(String userAgent) { + webView.getSettings().setUserAgentString(userAgent); + } + @Override public void dispose() { methodChannel.setMethodCallHandler(null); diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index fefaf6d49bef..be7e859df27c 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -222,6 +222,94 @@ void main() { await resizeCompleter.future; }); + test('set custom userAgent', () async { + final Completer controllerCompleter1 = + Completer(); + final GlobalKey _globalKey = GlobalKey(); + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'https://flutter.dev/', + javascriptMode: JavascriptMode.unrestricted, + userAgent: 'Custom_User_Agent1', + onWebViewCreated: (WebViewController controller) { + controllerCompleter1.complete(controller); + }, + ), + ), + ); + final WebViewController controller1 = await controllerCompleter1.future; + final String customUserAgent1 = await _getUserAgent(controller1); + expect(customUserAgent1, 'Custom_User_Agent1'); + // rebuild the WebView with a different user agent. + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'https://flutter.dev/', + javascriptMode: JavascriptMode.unrestricted, + userAgent: 'Custom_User_Agent2', + ), + ), + ); + + final String customUserAgent2 = await _getUserAgent(controller1); + expect(customUserAgent2, 'Custom_User_Agent2'); + }); + + test('use default platform userAgent after webView is rebuilt', () async { + final Completer controllerCompleter = + Completer(); + final GlobalKey _globalKey = GlobalKey(); + // Build the webView with no user agent to get the default platform user agent. + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'https://flutter.dev/', + javascriptMode: JavascriptMode.unrestricted, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + ), + ), + ); + final WebViewController controller = await controllerCompleter.future; + final String defaultPlatformUserAgent = await _getUserAgent(controller); + // rebuild the WebView with a custom user agent. + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'https://flutter.dev/', + javascriptMode: JavascriptMode.unrestricted, + userAgent: 'Custom_User_Agent', + ), + ), + ); + final String customUserAgent = await _getUserAgent(controller); + expect(customUserAgent, 'Custom_User_Agent'); + // rebuilds the WebView with no user agent. + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'https://flutter.dev/', + javascriptMode: JavascriptMode.unrestricted, + ), + ), + ); + + final String customUserAgent2 = await _getUserAgent(controller); + expect(customUserAgent2, defaultPlatformUserAgent); + }); + group('Media playback policy', () { String audioTestBase64; setUpAll(() async { @@ -384,3 +472,12 @@ String _webviewBool(bool value) { } return value ? 'true' : 'false'; } + +/// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests. +Future _getUserAgent(WebViewController controller) async { + if (defaultTargetPlatform == TargetPlatform.iOS) { + return await controller.evaluateJavascript('navigator.userAgent;'); + } + return jsonDecode( + await controller.evaluateJavascript('navigator.userAgent;')); +} diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index c0aa7fd650f6..fed73d8a7d2c 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -250,6 +250,9 @@ - (NSString*)applySettings:(NSDictionary*)settings { _navigationDelegate.hasDartNavigationDelegate = [hasDartNavigationDelegate boolValue]; } else if ([key isEqualToString:@"debuggingEnabled"]) { // no-op debugging is always enabled on iOS. + } else if ([key isEqualToString:@"userAgent"]) { + NSString* userAgent = settings[key]; + [self updateUserAgent:[userAgent isEqual:[NSNull null]] ? nil : userAgent]; } else { [unknownKeys addObject:key]; } @@ -347,4 +350,12 @@ - (void)registerJavaScriptChannels:(NSSet*)channelNames } } +- (void)updateUserAgent:(NSString*)userAgent { + if (@available(iOS 9.0, *)) { + [_webView setCustomUserAgent:userAgent]; + } else { + NSLog(@"Updating UserAgent is not supported for Flutter WebViews prior to iOS 9."); + } +} + @end diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 2c2efc425ae0..972cb25da54b 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -160,16 +160,66 @@ abstract class WebViewPlatformController { } } +/// A single setting for configuring a WebViewPlatform which may be absent. +class WebSetting { + /// Constructs an absent setting instance. + /// + /// The [isPresent] field for the instance will be false. + /// + /// Accessing [value] for an absent instance will throw. + WebSetting.absent() + : _value = null, + isPresent = false; + + /// Constructs a setting of the given `value`. + /// + /// The [isPresent] field for the instance will be true. + WebSetting.of(T value) + : _value = value, + isPresent = true; + + final T _value; + + /// The setting's value. + /// + /// Throws if [WebSetting.isPresent] is false. + T get value { + if (!isPresent) { + throw StateError('Cannot access a value of an absent WebSetting'); + } + assert(isPresent); + return _value; + } + + /// True when this web setting instance contains a value. + /// + /// When false the [WebSetting.value] getter throws. + final bool isPresent; + + @override + bool operator ==(Object other) { + if (other.runtimeType != runtimeType) return false; + final WebSetting typedOther = other; + return typedOther.isPresent == isPresent && typedOther._value == _value; + } + + @override + int get hashCode => hashValues(_value, isPresent); +} + /// Settings for configuring a WebViewPlatform. /// /// Initial settings are passed as part of [CreationParams], settings updates are sent with /// [WebViewPlatform#updateSettings]. +/// +/// The `userAgent` parameter must not be null. class WebSettings { WebSettings({ this.javascriptMode, this.hasNavigationDelegate, this.debuggingEnabled, - }); + @required this.userAgent, + }) : assert(userAgent != null); /// The JavaScript execution mode to be used by the webview. final JavascriptMode javascriptMode; @@ -182,9 +232,19 @@ class WebSettings { /// See also: [WebView.debuggingEnabled]. final bool debuggingEnabled; + /// The value used for the HTTP `User-Agent:` request header. + /// + /// If [userAgent.value] is null the platform's default user agent should be used. + /// + /// An absent value ([userAgent.isPresent] is false) represents no change to this setting from the + /// last time it was set. + /// + /// See also [WebView.userAgent]. + final WebSetting userAgent; + @override String toString() { - return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, debuggingEnabled: $debuggingEnabled)'; + return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, debuggingEnabled: $debuggingEnabled, userAgent: $userAgent,)'; } } @@ -196,6 +256,7 @@ class CreationParams { this.initialUrl, this.webSettings, this.javascriptChannelNames, + this.userAgent, this.autoMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, }) : assert(autoMediaPlaybackPolicy != null); @@ -223,12 +284,17 @@ class CreationParams { // to PlatformWebView. final Set javascriptChannelNames; + /// The value used for the HTTP User-Agent: request header. + /// + /// When null the platform's webview default is used for the User-Agent header. + final String userAgent; + /// Which restrictions apply on automatic media playback. final AutoMediaPlaybackPolicy autoMediaPlaybackPolicy; @override String toString() { - return '$runtimeType(initialUrl: $initialUrl, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames)'; + return '$runtimeType(initialUrl: $initialUrl, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames, UserAgent: $userAgent)'; } } diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index a914e1828b6b..f34000569551 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -119,9 +119,17 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { map[key] = value; } + void _addSettingIfPresent(String key, WebSetting setting) { + if (!setting.isPresent) { + return; + } + map[key] = setting.value; + } + _addIfNonNull('jsMode', settings.javascriptMode?.index); _addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate); _addIfNonNull('debuggingEnabled', settings.debuggingEnabled); + _addSettingIfPresent('userAgent', settings.userAgent); return map; } @@ -135,6 +143,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'initialUrl': creationParams.initialUrl, 'settings': _webSettingsToMap(creationParams.webSettings), 'javascriptChannelNames': creationParams.javascriptChannelNames.toList(), + 'userAgent': creationParams.userAgent, 'autoMediaPlaybackPolicy': creationParams.autoMediaPlaybackPolicy.index, }; } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 4335ed27ada8..97b7786de9a6 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -140,6 +140,7 @@ class WebView extends StatefulWidget { this.gestureRecognizers, this.onPageFinished, this.debuggingEnabled = false, + this.userAgent, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, }) : assert(javascriptMode != null), @@ -277,6 +278,20 @@ class WebView extends StatefulWidget { /// By default `debuggingEnabled` is false. final bool debuggingEnabled; + /// The value used for the HTTP User-Agent: request header. + /// + /// When null the platform's webview default is used for the User-Agent header. + /// + /// When the [WebView] is rebuilt with a different `userAgent`, the page reloads and the request uses the new User Agent. + /// + /// When [WebViewController.goBack] is called after changing `userAgent` the previous `userAgent` value is used until the page is reloaded. + /// + /// This field is ignored on iOS versions prior to 9 as the platform does not support a custom + /// user agent. + /// + /// By default `userAgent` is null. + final String userAgent; + /// Which restrictions apply on automatic media playback. /// /// This initial value is applied to the platform's webview upon creation. Any following @@ -347,6 +362,7 @@ CreationParams _creationParamsfromWidget(WebView widget) { initialUrl: widget.initialUrl, webSettings: _webSettingsFromWidget(widget), javascriptChannelNames: _extractChannelNames(widget.javascriptChannels), + userAgent: widget.userAgent, autoMediaPlaybackPolicy: widget.initialMediaPlaybackPolicy, ); } @@ -356,6 +372,7 @@ WebSettings _webSettingsFromWidget(WebView widget) { javascriptMode: widget.javascriptMode, hasNavigationDelegate: widget.navigationDelegate != null, debuggingEnabled: widget.debuggingEnabled, + userAgent: WebSetting.of(widget.userAgent), ); } @@ -365,12 +382,16 @@ WebSettings _clearUnchangedWebSettings( assert(currentValue.javascriptMode != null); assert(currentValue.hasNavigationDelegate != null); assert(currentValue.debuggingEnabled != null); + assert(currentValue.userAgent.isPresent); assert(newValue.javascriptMode != null); assert(newValue.hasNavigationDelegate != null); assert(newValue.debuggingEnabled != null); + assert(newValue.userAgent.isPresent); + JavascriptMode javascriptMode; bool hasNavigationDelegate; bool debuggingEnabled; + WebSetting userAgent = WebSetting.absent(); if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } @@ -380,11 +401,15 @@ WebSettings _clearUnchangedWebSettings( if (currentValue.debuggingEnabled != newValue.debuggingEnabled) { debuggingEnabled = newValue.debuggingEnabled; } + if (currentValue.userAgent != newValue.userAgent) { + userAgent = newValue.userAgent; + } return WebSettings( javascriptMode: javascriptMode, hasNavigationDelegate: hasNavigationDelegate, debuggingEnabled: debuggingEnabled, + userAgent: userAgent, ); } diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 206b481ce0bf..23c09e81444f 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.12+1 +version: 0.3.13 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index d451a86b19c8..6907436b24a2 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -776,6 +776,7 @@ void main() { javascriptMode: JavascriptMode.disabled, hasNavigationDelegate: false, debuggingEnabled: false, + userAgent: WebSetting.of(null), ), // TODO(iskakaushik): Remove this when collection literals makes it to stable. // ignore: prefer_collection_literals @@ -807,6 +808,25 @@ void main() { expect(platform.lastRequestHeaders, headers); }); }); + testWidgets('Set UserAgent', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + initialUrl: 'https://youtube.com', + javascriptMode: JavascriptMode.unrestricted, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.userAgent, isNull); + + await tester.pumpWidget(const WebView( + initialUrl: 'https://youtube.com', + javascriptMode: JavascriptMode.unrestricted, + userAgent: 'UA', + )); + + expect(platformWebView.userAgent, 'UA'); + }); } class FakePlatformWebView { @@ -826,7 +846,7 @@ class FakePlatformWebView { hasNavigationDelegate = params['settings']['hasNavigationDelegate'] ?? false; debuggingEnabled = params['settings']['debuggingEnabled']; - + userAgent = params['settings']['userAgent']; channel = MethodChannel( 'plugins.flutter.io/webview_$id', const StandardMethodCodec()); channel.setMockMethodCallHandler(onMethodCall); @@ -845,6 +865,7 @@ class FakePlatformWebView { bool hasNavigationDelegate; bool debuggingEnabled; + String userAgent; Future onMethodCall(MethodCall call) { switch (call.method) { @@ -862,6 +883,7 @@ class FakePlatformWebView { if (call.arguments['debuggingEnabled'] != null) { debuggingEnabled = call.arguments['debuggingEnabled']; } + userAgent = call.arguments['userAgent']; break; case 'canGoBack': return Future.sync(() => currentPosition > 0); @@ -1092,7 +1114,8 @@ class MatchesWebSettings extends Matcher { return _webSettings.javascriptMode == webSettings.javascriptMode && _webSettings.hasNavigationDelegate == webSettings.hasNavigationDelegate && - _webSettings.debuggingEnabled == webSettings.debuggingEnabled; + _webSettings.debuggingEnabled == webSettings.debuggingEnabled && + _webSettings.userAgent == webSettings.userAgent; } } From 4a7ddd239ea598da11a15efd3077bdd15aa9ff7a Mon Sep 17 00:00:00 2001 From: Afsar Pasha <25363752+Afsar-Pasha@users.noreply.github.com> Date: Mon, 19 Aug 2019 20:08:33 +0000 Subject: [PATCH 027/133] [android_alarm_manager] Added ability to get id in the callback (#1985) Co-Authored-By: Charles Crete --- packages/android_alarm_manager/CHANGELOG.md | 4 +++ .../androidalarmmanager/AlarmService.java | 4 ++- .../lib/android_alarm_manager.dart | 34 +++++++++++++++---- packages/android_alarm_manager/pubspec.yaml | 2 +- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/packages/android_alarm_manager/CHANGELOG.md b/packages/android_alarm_manager/CHANGELOG.md index f7537a5b62f5..2bb200dcc2fc 100644 --- a/packages/android_alarm_manager/CHANGELOG.md +++ b/packages/android_alarm_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.4 + +* Add `id` to `callback` if it is of type `Function(int)` + ## 0.4.3 * Added `oneShotAt` method to run `callback` at a given DateTime `time`. diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java index 16a6375a8070..bb3d0c8db102 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java @@ -211,7 +211,8 @@ public void notImplemented() { // provided. // TODO(mattcarroll): consider giving a method name anyway for the purpose of developer discoverability // when reading the source code. Especially on the Dart side. - sBackgroundChannel.invokeMethod("", new Object[] {callbackHandle}, result); + sBackgroundChannel.invokeMethod( + "", new Object[] {callbackHandle, intent.getIntExtra("id", -1)}, result); } private static void scheduleAlarm( @@ -242,6 +243,7 @@ private static void scheduleAlarm( // Create an Intent for the alarm and set the desired Dart callback handle. Intent alarm = new Intent(context, AlarmBroadcastReceiver.class); + alarm.putExtra("id", requestCode); alarm.putExtra("callbackHandle", callbackHandle); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, alarm, PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/packages/android_alarm_manager/lib/android_alarm_manager.dart b/packages/android_alarm_manager/lib/android_alarm_manager.dart index 05ead109c36f..b90823e5c9d4 100644 --- a/packages/android_alarm_manager/lib/android_alarm_manager.dart +++ b/packages/android_alarm_manager/lib/android_alarm_manager.dart @@ -38,7 +38,13 @@ void _alarmManagerCallbackDispatcher() { print('Fatal: could not find callback'); exit(-1); } - closure(); + + if (closure is Function()) { + closure(); + } else if (closure is Function(int)) { + final int id = args[1]; + closure(id); + } }); // Once we've finished initializing, let the native portion of the plugin @@ -80,8 +86,12 @@ class AndroidAlarmManager { /// `callback` must be either a top-level function or a static method from a /// class. /// + /// `callback` can be `Function()` or `Function(int)` + /// /// The timer is uniquely identified by `id`. Calling this function again - /// again with the same `id` will cancel and replace the existing timer. + /// with the same `id` will cancel and replace the existing timer. + /// + /// `id` will passed to `callback` if it is of type `Function(int)` /// /// If `alarmClock` is passed as `true`, the timer will be created with /// Android's `AlarmManagerCompat.setAlarmClock`. @@ -107,7 +117,7 @@ class AndroidAlarmManager { static Future oneShot( Duration delay, int id, - dynamic Function() callback, { + Function callback, { bool alarmClock = false, bool allowWhileIdle = false, bool exact = false, @@ -134,8 +144,12 @@ class AndroidAlarmManager { /// `callback` must be either a top-level function or a static method from a /// class. /// + /// `callback` can be `Function()` or `Function(int)` + /// /// The timer is uniquely identified by `id`. Calling this function again - /// again with the same `id` will cancel and replace the existing timer. + /// with the same `id` will cancel and replace the existing timer. + /// + /// `id` will passed to `callback` if it is of type `Function(int)` /// /// If `alarmClock` is passed as `true`, the timer will be created with /// Android's `AlarmManagerCompat.setAlarmClock`. @@ -161,13 +175,15 @@ class AndroidAlarmManager { static Future oneShotAt( DateTime time, int id, - dynamic Function() callback, { + Function callback, { bool alarmClock = false, bool allowWhileIdle = false, bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, }) async { + assert(callback is Function() || callback is Function(int)); + assert(id.bitLength < 32); final int startMillis = time.millisecondsSinceEpoch; final CallbackHandle handle = PluginUtilities.getCallbackHandle(callback); if (handle == null) { @@ -196,9 +212,13 @@ class AndroidAlarmManager { /// `callback` must be either a top-level function or a static method from a /// class. /// + /// `callback` can be `Function()` or `Function(int)` + /// /// The repeating timer is uniquely identified by `id`. Calling this function /// again with the same `id` will cancel and replace the existing timer. /// + /// `id` will passed to `callback` if it is of type `Function(int)` + /// /// If `startAt` is passed, the timer will first go off at that time and /// subsequently run with period `duration`. /// @@ -219,12 +239,14 @@ class AndroidAlarmManager { static Future periodic( Duration duration, int id, - dynamic Function() callback, { + Function callback, { DateTime startAt, bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, }) async { + assert(callback is Function() || callback is Function(int)); + assert(id.bitLength < 32); final int now = DateTime.now().millisecondsSinceEpoch; final int period = duration.inMilliseconds; final int first = diff --git a/packages/android_alarm_manager/pubspec.yaml b/packages/android_alarm_manager/pubspec.yaml index b164970fcc97..9742dae02f81 100644 --- a/packages/android_alarm_manager/pubspec.yaml +++ b/packages/android_alarm_manager/pubspec.yaml @@ -1,7 +1,7 @@ name: android_alarm_manager description: Flutter plugin for accessing the Android AlarmManager service, and running Dart code in the background when alarms fire. -version: 0.4.3 +version: 0.4.4 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager From 1375af3f22fcc3292f80b6049b417b6ea87991b8 Mon Sep 17 00:00:00 2001 From: duzenko Date: Tue, 20 Aug 2019 01:47:11 +0300 Subject: [PATCH 028/133] [google_maps_flutter]Marker drag event (#1702) Add support for marker drag events. --- packages/google_maps_flutter/CHANGELOG.md | 4 +++ .../googlemaps/GoogleMapController.java | 13 +++++++++ .../plugins/googlemaps/MarkersController.java | 12 ++++++++ .../example/lib/place_marker.dart | 29 +++++++++++++++++++ .../ios/Classes/GoogleMapController.m | 5 ++++ .../ios/Classes/GoogleMapMarkerController.h | 1 + .../ios/Classes/GoogleMapMarkerController.m | 11 +++++++ .../lib/src/controller.dart | 4 +++ .../lib/src/google_map.dart | 8 +++++ .../google_maps_flutter/lib/src/marker.dart | 5 ++++ packages/google_maps_flutter/pubspec.yaml | 2 +- 11 files changed, 93 insertions(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 92e490a5f313..72e459b13453 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.20+4 + +* Marker drag event + ## 0.5.20+3 * Update Android play-services-maps to 17.0.0 diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index fe0d3d7c3e48..0ce82b29491f 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -60,6 +60,7 @@ final class GoogleMapController OnMapReadyCallback, GoogleMap.OnMapClickListener, GoogleMap.OnMapLongClickListener, + GoogleMap.OnMarkerDragListener, PlatformView { private static final String TAG = "GoogleMapController"; @@ -177,6 +178,7 @@ public void onMapReady(GoogleMap googleMap) { googleMap.setOnCameraMoveListener(this); googleMap.setOnCameraIdleListener(this); googleMap.setOnMarkerClickListener(this); + googleMap.setOnMarkerDragListener(this); googleMap.setOnPolygonClickListener(this); googleMap.setOnPolylineClickListener(this); googleMap.setOnCircleClickListener(this); @@ -395,6 +397,17 @@ public boolean onMarkerClick(Marker marker) { return markersController.onMarkerTap(marker.getId()); } + @Override + public void onMarkerDragStart(Marker marker) {} + + @Override + public void onMarkerDrag(Marker marker) {} + + @Override + public void onMarkerDragEnd(Marker marker) { + markersController.onMarkerDragEnd(marker.getId(), marker.getPosition()); + } + @Override public void onPolygonClick(Polygon polygon) { polygonsController.onPolygonTap(polygon.getId()); diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java index 6923a23fd586..1f863467f977 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java @@ -5,6 +5,7 @@ package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import io.flutter.plugin.common.MethodChannel; @@ -75,6 +76,17 @@ boolean onMarkerTap(String googleMarkerId) { return false; } + void onMarkerDragEnd(String googleMarkerId, LatLng latLng) { + String markerId = googleMapsMarkerIdToDartMarkerId.get(googleMarkerId); + if (markerId == null) { + return; + } + final Map data = new HashMap<>(); + data.put("markerId", markerId); + data.put("position", Convert.latLngToJson(latLng)); + methodChannel.invokeMethod("marker#onDragEnd", data); + } + void onInfoWindowTap(String googleMarkerId) { String markerId = googleMapsMarkerIdToDartMarkerId.get(googleMarkerId); if (markerId == null) { diff --git a/packages/google_maps_flutter/example/lib/place_marker.dart b/packages/google_maps_flutter/example/lib/place_marker.dart index e24b0a6cd954..f38ee4320867 100644 --- a/packages/google_maps_flutter/example/lib/place_marker.dart +++ b/packages/google_maps_flutter/example/lib/place_marker.dart @@ -67,6 +67,32 @@ class PlaceMarkerBodyState extends State { } } + void _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async { + final Marker tappedMarker = markers[markerId]; + if (tappedMarker != null) { + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + actions: [ + FlatButton( + child: const Text('OK'), + onPressed: () => Navigator.of(context).pop(), + ) + ], + content: Padding( + padding: const EdgeInsets.symmetric(vertical: 66), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Old position: ${tappedMarker.position}'), + Text('New position: $newPosition'), + ], + ))); + }); + } + } + void _add() { final int markerCount = markers.length; @@ -88,6 +114,9 @@ class PlaceMarkerBodyState extends State { onTap: () { _onMarkerTapped(markerId); }, + onDragEnd: (LatLng position) { + _onMarkerDragEnd(markerId, position); + }, ); setState(() { diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index f7fcef1a29e2..38a95ca8d882 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -373,6 +373,11 @@ - (BOOL)mapView:(GMSMapView*)mapView didTapMarker:(GMSMarker*)marker { return [_markersController onMarkerTap:markerId]; } +- (void)mapView:(GMSMapView*)mapView didEndDraggingMarker:(GMSMarker*)marker { + NSString* markerId = marker.userData[0]; + [_markersController onMarkerDragEnd:markerId coordinate:marker.position]; +} + - (void)mapView:(GMSMapView*)mapView didTapInfoWindowOfMarker:(GMSMarker*)marker { NSString* markerId = marker.userData[0]; [_markersController onInfoWindowTap:markerId]; diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h index 898eddeb0792..7b8bccd7b462 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h @@ -40,5 +40,6 @@ - (void)changeMarkers:(NSArray*)markersToChange; - (void)removeMarkerIds:(NSArray*)markerIdsToRemove; - (BOOL)onMarkerTap:(NSString*)markerId; +- (void)onMarkerDragEnd:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate; - (void)onInfoWindowTap:(NSString*)markerId; @end diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m index cb5ef461c38c..91b4e7bce2b7 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m @@ -284,6 +284,17 @@ - (BOOL)onMarkerTap:(NSString*)markerId { [_methodChannel invokeMethod:@"marker#onTap" arguments:@{@"markerId" : markerId}]; return controller.consumeTapEvents; } +- (void)onMarkerDragEnd:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate { + if (!markerId) { + return; + } + FLTGoogleMapMarkerController* controller = _markerIdToController[markerId]; + if (!controller) { + return; + } + [_methodChannel invokeMethod:@"marker#onDragEnd" + arguments:@{@"markerId" : markerId, @"position" : PositionToJson(coordinate)}]; +} - (void)onInfoWindowTap:(NSString*)markerId { if (markerId && _markerIdToController[markerId]) { [_methodChannel invokeMethod:@"infoWindow#onTap" arguments:@{@"markerId" : markerId}]; diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart index 97899b9909f8..ec77111bae9d 100644 --- a/packages/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/lib/src/controller.dart @@ -57,6 +57,10 @@ class GoogleMapController { case 'marker#onTap': _googleMapState.onMarkerTap(call.arguments['markerId']); break; + case 'marker#onDragEnd': + _googleMapState.onMarkerDragEnd(call.arguments['markerId'], + LatLng._fromJson(call.arguments['position'])); + break; case 'infoWindow#onTap': _googleMapState.onInfoWindowTap(call.arguments['markerId']); break; diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart index 1cf641f4c25a..11a83905a74e 100644 --- a/packages/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/lib/src/google_map.dart @@ -301,6 +301,14 @@ class _GoogleMapState extends State { } } + void onMarkerDragEnd(String markerIdParam, LatLng position) { + assert(markerIdParam != null); + final MarkerId markerId = MarkerId(markerIdParam); + if (_markers[markerId]?.onDragEnd != null) { + _markers[markerId].onDragEnd(position); + } + } + void onPolygonTap(String polygonIdParam) { assert(polygonIdParam != null); final PolygonId polygonId = PolygonId(polygonIdParam); diff --git a/packages/google_maps_flutter/lib/src/marker.dart b/packages/google_maps_flutter/lib/src/marker.dart index cd39f689422d..1f64f0ee19ff 100644 --- a/packages/google_maps_flutter/lib/src/marker.dart +++ b/packages/google_maps_flutter/lib/src/marker.dart @@ -160,6 +160,7 @@ class Marker { this.visible = true, this.zIndex = 0.0, this.onTap, + this.onDragEnd, }) : assert(alpha == null || (0.0 <= alpha && alpha <= 1.0)); /// Uniquely identifies a [Marker]. @@ -216,6 +217,8 @@ class Marker { /// Callbacks to receive tap events for markers placed on this map. final VoidCallback onTap; + final ValueChanged onDragEnd; + /// Creates a new [Marker] object whose values are the same as this instance, /// unless overwritten by the specified parameters. Marker copyWith({ @@ -231,6 +234,7 @@ class Marker { bool visibleParam, double zIndexParam, VoidCallback onTapParam, + ValueChanged onDragEndParam, }) { return Marker( markerId: markerId, @@ -246,6 +250,7 @@ class Marker { visible: visibleParam ?? visible, zIndex: zIndexParam ?? zIndex, onTap: onTapParam ?? onTap, + onDragEnd: onDragEndParam ?? onDragEnd, ); } diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 60573e275c40..0bcf6dee186a 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+3 +version: 0.5.20+4 dependencies: flutter: From 05c25052c5dca98c411da925196d7eff766e9dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Huulb=C3=A6k?= Date: Tue, 20 Aug 2019 00:58:22 +0200 Subject: [PATCH 029/133] [camera] Pause/resume video recording for Android (#1370) * Pause/resume video recording for Android * Specify type * Add pausing and resuming to example app * iOS side of pausing/resuming * More documentation * Version bump * Add video pausing and resuming * get pausing and recording to work for no audio * It works * Formatting * Add test for pausing and resuming * Call success outside try catch block * formatting * Disable audio in test and call result on iOS --- packages/camera/CHANGELOG.md | 4 + .../io/flutter/plugins/camera/Camera.java | 32 +++++ .../flutter/plugins/camera/CameraPlugin.java | 10 ++ packages/camera/example/lib/main.dart | 53 +++++++++ .../camera/example/test_driver/camera.dart | 56 +++++++++ packages/camera/ios/Classes/CameraPlugin.m | 110 +++++++++++++++++- packages/camera/lib/camera.dart | 76 +++++++++++- packages/camera/pubspec.yaml | 2 +- 8 files changed, 331 insertions(+), 12 deletions(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index ff0593ad2c5d..49535b74e79d 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.4 + +* Add feature to pause and resume video recording. + ## 0.5.3+1 * Fix too large request code for FragmentActivity users. diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 763e3b516a62..110c5b690b09 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -388,6 +388,38 @@ public void stopVideoRecording(@NonNull final Result result) { } } + public void pauseVideoRecording(@NonNull final Result result) { + if (!recordingVideo) { + result.success(null); + return; + } + + try { + mediaRecorder.pause(); + } catch (IllegalStateException e) { + result.error("videoRecordingFailed", e.getMessage(), null); + return; + } + + result.success(null); + } + + public void resumeVideoRecording(@NonNull final Result result) { + if (!recordingVideo) { + result.success(null); + return; + } + + try { + mediaRecorder.resume(); + } catch (IllegalStateException e) { + result.error("videoRecordingFailed", e.getMessage(), null); + return; + } + + result.success(null); + } + public void startPreview() throws CameraAccessException { createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, pictureImageReader.getSurface()); } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java index 69633a499d2a..b3a1da8b1b09 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java @@ -112,6 +112,16 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) camera.stopVideoRecording(result); break; } + case "pauseVideoRecording": + { + camera.pauseVideoRecording(result); + break; + } + case "resumeVideoRecording": + { + camera.resumeVideoRecording(result); + break; + } case "startImageStream": { try { diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index f66b5b937345..cfdcd1d30bc6 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -214,6 +214,19 @@ class _CameraExampleHomeState extends State ? onVideoRecordButtonPressed : null, ), + IconButton( + icon: controller != null && controller.value.isRecordingPaused + ? Icon(Icons.play_arrow) + : Icon(Icons.pause), + color: Colors.blue, + onPressed: controller != null && + controller.value.isInitialized && + controller.value.isRecordingVideo + ? (controller != null && controller.value.isRecordingPaused + ? onResumeButtonPressed + : onPauseButtonPressed) + : null, + ), IconButton( icon: const Icon(Icons.stop), color: Colors.red, @@ -316,6 +329,20 @@ class _CameraExampleHomeState extends State }); } + void onPauseButtonPressed() { + pauseVideoRecording().then((_) { + if (mounted) setState(() {}); + showInSnackBar('Video recording paused'); + }); + } + + void onResumeButtonPressed() { + resumeVideoRecording().then((_) { + if (mounted) setState(() {}); + showInSnackBar('Video recording resumed'); + }); + } + Future startVideoRecording() async { if (!controller.value.isInitialized) { showInSnackBar('Error: select a camera first.'); @@ -357,6 +384,32 @@ class _CameraExampleHomeState extends State await _startVideoPlayer(); } + Future pauseVideoRecording() async { + if (!controller.value.isRecordingVideo) { + return null; + } + + try { + await controller.pauseVideoRecording(); + } on CameraException catch (e) { + _showCameraException(e); + return null; + } + } + + Future resumeVideoRecording() async { + if (!controller.value.isRecordingVideo) { + return null; + } + + try { + await controller.resumeVideoRecording(); + } on CameraException catch (e) { + _showCameraException(e); + return null; + } + } + Future _startVideoPlayer() async { final VideoPlayerController vcontroller = VideoPlayerController.file(File(videoPath)); diff --git a/packages/camera/example/test_driver/camera.dart b/packages/camera/example/test_driver/camera.dart index 7d59016ff0b1..d68b8c5ba1fc 100644 --- a/packages/camera/example/test_driver/camera.dart +++ b/packages/camera/example/test_driver/camera.dart @@ -143,4 +143,60 @@ void main() { } } }); + + test('Pause and resume video recording', () async { + final List cameras = await availableCameras(); + if (cameras.isEmpty) { + return; + } + + final CameraController controller = CameraController( + cameras[0], + ResolutionPreset.low, + enableAudio: false, + ); + + await controller.initialize(); + await controller.prepareForVideoRecording(); + + final String filePath = + '${testDir.path}/${DateTime.now().millisecondsSinceEpoch}.mp4'; + + int startPause; + int timePaused = 0; + + await controller.startVideoRecording(filePath); + final int recordingStart = DateTime.now().millisecondsSinceEpoch; + sleep(const Duration(milliseconds: 500)); + + await controller.pauseVideoRecording(); + startPause = DateTime.now().millisecondsSinceEpoch; + sleep(const Duration(milliseconds: 500)); + await controller.resumeVideoRecording(); + timePaused += DateTime.now().millisecondsSinceEpoch - startPause; + + sleep(const Duration(milliseconds: 500)); + + await controller.pauseVideoRecording(); + startPause = DateTime.now().millisecondsSinceEpoch; + sleep(const Duration(milliseconds: 500)); + await controller.resumeVideoRecording(); + timePaused += DateTime.now().millisecondsSinceEpoch - startPause; + + sleep(const Duration(milliseconds: 500)); + + await controller.stopVideoRecording(); + final int recordingTime = + DateTime.now().millisecondsSinceEpoch - recordingStart; + + final File videoFile = File(filePath); + final VideoPlayerController videoController = VideoPlayerController.file( + videoFile, + ); + await videoController.initialize(); + final int duration = videoController.value.duration.inMilliseconds; + await videoController.dispose(); + + expect(duration, lessThan(recordingTime - timePaused)); + }); } diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 8a08c435861a..42cdb6d5fdf9 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -180,10 +180,18 @@ @interface FLTCam : NSObject 0) { + currentSampleTime = CMTimeAdd(currentSampleTime, dur); + } + + if (_audioIsDisconnected) { + _audioIsDisconnected = NO; + + if (_audioTimeOffset.value == 0) { + _audioTimeOffset = CMTimeSubtract(currentSampleTime, _lastAudioSampleTime); + } else { + CMTime offset = CMTimeSubtract(currentSampleTime, _lastAudioSampleTime); + _audioTimeOffset = CMTimeAdd(_audioTimeOffset, offset); + } + + return; + } + + _lastAudioSampleTime = currentSampleTime; + + if (_audioTimeOffset.value != 0) { + CFRelease(sampleBuffer); + sampleBuffer = [self adjustTime:sampleBuffer by:_audioTimeOffset]; + } + [self newAudioSample:sampleBuffer]; } + + CFRelease(sampleBuffer); + } +} + +- (CMSampleBufferRef)adjustTime:(CMSampleBufferRef)sample by:(CMTime)offset { + CMItemCount count; + CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count); + CMSampleTimingInfo *pInfo = malloc(sizeof(CMSampleTimingInfo) * count); + CMSampleBufferGetSampleTimingInfoArray(sample, count, pInfo, &count); + for (CMItemCount i = 0; i < count; i++) { + pInfo[i].decodeTimeStamp = CMTimeSubtract(pInfo[i].decodeTimeStamp, offset); + pInfo[i].presentationTimeStamp = CMTimeSubtract(pInfo[i].presentationTimeStamp, offset); } + CMSampleBufferRef sout; + CMSampleBufferCreateCopyWithNewTiming(nil, sample, count, pInfo, &sout); + free(pInfo); + return sout; } - (void)newVideoSample:(CMSampleBufferRef)sampleBuffer { @@ -526,6 +598,11 @@ - (void)startVideoRecordingAtPath:(NSString *)path result:(FlutterResult)result return; } _isRecording = YES; + _isRecordingPaused = NO; + _videoTimeOffset = CMTimeMake(0, 1); + _audioTimeOffset = CMTimeMake(0, 1); + _videoIsDisconnected = NO; + _audioIsDisconnected = NO; result(nil); } else { _eventSink(@{@"event" : @"error", @"errorDescription" : @"Video is already recording!"}); @@ -556,6 +633,16 @@ - (void)stopVideoRecordingWithResult:(FlutterResult)result { } } +- (void)pauseVideoRecording { + _isRecordingPaused = YES; + _videoIsDisconnected = YES; + _audioIsDisconnected = YES; +} + +- (void)resumeVideoRecording { + _isRecordingPaused = NO; +} + - (void)startImageStreamWithMessenger:(NSObject *)messenger { if (!_isStreamingImages) { FlutterEventChannel *eventChannel = @@ -608,6 +695,13 @@ - (BOOL)setupWriterForPath:(NSString *)path { nil]; _videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings]; + + _videoAdaptor = [AVAssetWriterInputPixelBufferAdaptor + assetWriterInputPixelBufferAdaptorWithAssetWriterInput:_videoWriterInput + sourcePixelBufferAttributes:@{ + (NSString *)kCVPixelBufferPixelFormatTypeKey : @(videoFormat) + }]; + NSParameterAssert(_videoWriterInput); _videoWriterInput.expectsMediaDataInRealTime = YES; @@ -777,6 +871,12 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re } else if ([@"stopImageStream" isEqualToString:call.method]) { [_camera stopImageStream]; result(nil); + } else if ([@"pauseVideoRecording" isEqualToString:call.method]) { + [_camera pauseVideoRecording]; + result(nil); + } else if ([@"resumeVideoRecording" isEqualToString:call.method]) { + [_camera resumeVideoRecording]; + result(nil); } else { NSDictionary *argsMap = call.arguments; NSUInteger textureId = ((NSNumber *)argsMap[@"textureId"]).unsignedIntegerValue; diff --git a/packages/camera/lib/camera.dart b/packages/camera/lib/camera.dart index cd2b3991bbb7..ee1892c4cbc0 100644 --- a/packages/camera/lib/camera.dart +++ b/packages/camera/lib/camera.dart @@ -157,14 +157,17 @@ class CameraValue { this.isRecordingVideo, this.isTakingPicture, this.isStreamingImages, - }); + bool isRecordingPaused, + }) : _isRecordingPaused = isRecordingPaused; const CameraValue.uninitialized() : this( - isInitialized: false, - isRecordingVideo: false, - isTakingPicture: false, - isStreamingImages: false); + isInitialized: false, + isRecordingVideo: false, + isTakingPicture: false, + isStreamingImages: false, + isRecordingPaused: false, + ); /// True after [CameraController.initialize] has completed successfully. final bool isInitialized; @@ -178,6 +181,11 @@ class CameraValue { /// True when images from the camera are being streamed. final bool isStreamingImages; + final bool _isRecordingPaused; + + /// True when camera [isRecordingVideo] and recording is paused. + bool get isRecordingPaused => isRecordingVideo && _isRecordingPaused; + final String errorDescription; /// The size of the preview in pixels. @@ -199,6 +207,7 @@ class CameraValue { bool isStreamingImages, String errorDescription, Size previewSize, + bool isRecordingPaused, }) { return CameraValue( isInitialized: isInitialized ?? this.isInitialized, @@ -207,6 +216,7 @@ class CameraValue { isRecordingVideo: isRecordingVideo ?? this.isRecordingVideo, isTakingPicture: isTakingPicture ?? this.isTakingPicture, isStreamingImages: isStreamingImages ?? this.isStreamingImages, + isRecordingPaused: isRecordingPaused ?? _isRecordingPaused, ); } @@ -473,7 +483,7 @@ class CameraController extends ValueNotifier { 'startVideoRecording', {'textureId': _textureId, 'filePath': filePath}, ); - value = value.copyWith(isRecordingVideo: true); + value = value.copyWith(isRecordingVideo: true, isRecordingPaused: false); } on PlatformException catch (e) { throw CameraException(e.code, e.message); } @@ -504,6 +514,60 @@ class CameraController extends ValueNotifier { } } + /// Pause video recording. + /// + /// This feature is only available on iOS and Android sdk 24+. + Future pauseVideoRecording() async { + if (!value.isInitialized || _isDisposed) { + throw CameraException( + 'Uninitialized CameraController', + 'pauseVideoRecording was called on uninitialized CameraController', + ); + } + if (!value.isRecordingVideo) { + throw CameraException( + 'No video is recording', + 'pauseVideoRecording was called when no video is recording.', + ); + } + try { + value = value.copyWith(isRecordingPaused: true); + await _channel.invokeMethod( + 'pauseVideoRecording', + {'textureId': _textureId}, + ); + } on PlatformException catch (e) { + throw CameraException(e.code, e.message); + } + } + + /// Resume video recording after pausing. + /// + /// This feature is only available on iOS and Android sdk 24+. + Future resumeVideoRecording() async { + if (!value.isInitialized || _isDisposed) { + throw CameraException( + 'Uninitialized CameraController', + 'resumeVideoRecording was called on uninitialized CameraController', + ); + } + if (!value.isRecordingVideo) { + throw CameraException( + 'No video is recording', + 'resumeVideoRecording was called when no video is recording.', + ); + } + try { + value = value.copyWith(isRecordingPaused: false); + await _channel.invokeMethod( + 'resumeVideoRecording', + {'textureId': _textureId}, + ); + } on PlatformException catch (e) { + throw CameraException(e.code, e.message); + } + } + /// Releases the resources of this camera. @override Future dispose() async { diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 3a82ee425e34..e94d4bd979f0 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.3+1 +version: 0.5.4 authors: - Flutter Team From f31cb36488554076b667367f53955788b59aeb5e Mon Sep 17 00:00:00 2001 From: duzenko Date: Tue, 20 Aug 2019 21:41:28 +0300 Subject: [PATCH 030/133] [google_maps_flutter] Allow (de-)serialization of CameraPosition (#1784) * Allow (de-)serialization of CameraPosition * Camera position toMap use fixes * Updated the pubspec and changelog --- packages/google_maps_flutter/CHANGELOG.md | 4 ++++ packages/google_maps_flutter/lib/src/camera.dart | 5 ++--- packages/google_maps_flutter/lib/src/google_map.dart | 2 +- packages/google_maps_flutter/pubspec.yaml | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 72e459b13453..1efbd869633a 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.20+5 + +* Allow (de-)serialization of CameraPosition + ## 0.5.20+4 * Marker drag event diff --git a/packages/google_maps_flutter/lib/src/camera.dart b/packages/google_maps_flutter/lib/src/camera.dart index ceb4289ca663..78d624b76f50 100644 --- a/packages/google_maps_flutter/lib/src/camera.dart +++ b/packages/google_maps_flutter/lib/src/camera.dart @@ -51,14 +51,13 @@ class CameraPosition { /// will be silently clamped to the supported range. final double zoom; - dynamic _toMap() => { + dynamic toMap() => { 'bearing': bearing, 'target': target._toJson(), 'tilt': tilt, 'zoom': zoom, }; - @visibleForTesting static CameraPosition fromMap(dynamic json) { if (json == null) { return null; @@ -98,7 +97,7 @@ class CameraUpdate { /// Returns a camera update that moves the camera to the specified position. static CameraUpdate newCameraPosition(CameraPosition cameraPosition) { return CameraUpdate._( - ['newCameraPosition', cameraPosition._toMap()], + ['newCameraPosition', cameraPosition.toMap()], ); } diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart index 11a83905a74e..5c802a2f052f 100644 --- a/packages/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/lib/src/google_map.dart @@ -192,7 +192,7 @@ class _GoogleMapState extends State { @override Widget build(BuildContext context) { final Map creationParams = { - 'initialCameraPosition': widget.initialCameraPosition?._toMap(), + 'initialCameraPosition': widget.initialCameraPosition?.toMap(), 'options': _googleMapOptions.toMap(), 'markersToAdd': _serializeMarkerSet(widget.markers), 'polygonsToAdd': _serializePolygonSet(widget.polygons), diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 0bcf6dee186a..b99203fafbd6 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+4 +version: 0.5.20+5 dependencies: flutter: From a3f9ce7f3d8437d314001d77f9b8e797fcbfea78 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Tue, 20 Aug 2019 15:04:50 -0700 Subject: [PATCH 031/133] [pathprovider] Fix fall through bug (#1993) * [pathprovider] Fix fall through bug --- packages/path_provider/CHANGELOG.md | 4 ++++ .../io/flutter/plugins/pathprovider/PathProviderPlugin.java | 1 + packages/path_provider/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/path_provider/CHANGELOG.md b/packages/path_provider/CHANGELOG.md index 2e7f5ad33464..7546844b3549 100644 --- a/packages/path_provider/CHANGELOG.md +++ b/packages/path_provider/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.1 + +* Fix fall through bug. + ## 1.2.0 * On Android, `getApplicationSupportDirectory` is now supported using `getFilesDir`. diff --git a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java index b53f0cbbe2ea..271236be060a 100644 --- a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java +++ b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java @@ -40,6 +40,7 @@ public void onMethodCall(MethodCall call, Result result) { break; case "getApplicationSupportDirectory": result.success(getApplicationSupportDirectory()); + break; default: result.notImplemented(); } diff --git a/packages/path_provider/pubspec.yaml b/packages/path_provider/pubspec.yaml index 2eed0ae7bd9d..634ba1ce834b 100644 --- a/packages/path_provider/pubspec.yaml +++ b/packages/path_provider/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for getting commonly used locations on the Android & iOS file systems, such as the temp and app data directories. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider -version: 1.2.0 +version: 1.2.1 flutter: plugin: From f401ca1ce107f3ac7a589715cf69e101ac9f40d3 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Thu, 22 Aug 2019 10:46:10 -0700 Subject: [PATCH 032/133] [video_player] Fix deprecated member use (#1998) * Fix build failure due to deprecated member use --- packages/video_player/CHANGELOG.md | 4 ++++ packages/video_player/example/lib/main.dart | 2 ++ packages/video_player/pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index 207a9ca272ce..795d97fdb960 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.1+7 + +* Fix tests by ignoring deprecated member use. + ## 0.10.1+6 * [iOS] Fixed a memory leak with notification observing. diff --git a/packages/video_player/example/lib/main.dart b/packages/video_player/example/lib/main.dart index 320df27c8e3e..dea1086593df 100644 --- a/packages/video_player/example/lib/main.dart +++ b/packages/video_player/example/lib/main.dart @@ -246,6 +246,8 @@ Widget buildCard(String title) { leading: const Icon(Icons.airline_seat_flat_angled), title: Text(title), ), + // TODO(jackson): Remove when deprecation is on stable branch + // ignore: deprecated_member_use ButtonTheme.bar( child: ButtonBar( children: [ diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 218c50f64349..72ec7fa55b62 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.1+6 +version: 0.10.1+7 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: From 3ad2d1d300b0d901ea9739e3b9f08eeebda8be04 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Thu, 22 Aug 2019 12:40:29 -0700 Subject: [PATCH 033/133] Remove Flutterfire plugins (moved to FirebaseExtended) (#1984) * Remove Flutterfire plugins (moved to FirebaseExtended) * Remove Flutterfire references from build_all_plugins_app --- CODEOWNERS | 15 - FlutterFire.md | 107 -- README.md | 19 - examples/all_plugins/android/app/build.gradle | 1 + examples/all_plugins/android/build.gradle | 2 +- packages/cloud_firestore/.gitignore | 1 - packages/cloud_firestore/CHANGELOG.md | 420 ------ packages/cloud_firestore/LICENSE | 26 - packages/cloud_firestore/README.md | 104 -- packages/cloud_firestore/android/build.gradle | 56 - .../cloud_firestore/android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../cloudfirestore/CloudFirestorePlugin.java | 900 ----------- .../FlutterFirebaseAppRegistrar.java | 19 - .../cloud_firestore/android/user-agent.gradle | 22 - packages/cloud_firestore/example/README.md | 8 - packages/cloud_firestore/example/android.iml | 12 - .../example/android/app/build.gradle | 63 - .../example/android/app/google-services.json | 42 - .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 19 - .../firestoreexample/MainActivity.java | 17 - .../firebasedatabaseexample/MainActivity.java | 17 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 32 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../example/android/settings.gradle | 15 - .../example/firestore_example.iml | 16 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 500 ------- .../contents.xcworkspacedata | 10 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../example/ios/Runner/AppDelegate.h | 10 - .../example/ios/Runner/AppDelegate.m | 16 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 49 - .../cloud_firestore/example/ios/Runner/main.m | 13 - .../cloud_firestore/example/lib/main.dart | 86 -- packages/cloud_firestore/example/pubspec.yaml | 17 - .../example/test_driver/cloud_firestore.dart | 297 ---- .../test_driver/cloud_firestore_test.dart | 7 - packages/cloud_firestore/ios/Assets/.gitkeep | 0 .../ios/Classes/CloudFirestorePlugin.h | 8 - .../ios/Classes/CloudFirestorePlugin.m | 668 --------- .../ios/cloud_firestore.podspec | 32 - .../cloud_firestore/lib/cloud_firestore.dart | 35 - packages/cloud_firestore/lib/src/blob.dart | 19 - .../lib/src/collection_reference.dart | 61 - .../lib/src/document_change.dart | 61 - .../lib/src/document_reference.dart | 151 -- .../lib/src/document_snapshot.dart | 45 - .../cloud_firestore/lib/src/field_value.dart | 68 - .../cloud_firestore/lib/src/firestore.dart | 163 -- .../lib/src/firestore_message_codec.dart | 111 -- .../cloud_firestore/lib/src/geo_point.dart | 19 - packages/cloud_firestore/lib/src/query.dart | 362 ----- .../lib/src/query_snapshot.dart | 44 - .../lib/src/snapshot_metadata.dart | 28 - packages/cloud_firestore/lib/src/source.dart | 37 - .../cloud_firestore/lib/src/timestamp.dart | 98 -- .../cloud_firestore/lib/src/transaction.dart | 109 -- .../lib/src/utils/auto_id_generator.dart | 34 - .../cloud_firestore/lib/src/write_batch.dart | 112 -- packages/cloud_firestore/pubspec.yaml | 30 - .../test/cloud_firestore_test.dart | 1279 ---------------- packages/cloud_functions/.gitignore | 35 - packages/cloud_functions/CHANGELOG.md | 103 -- packages/cloud_functions/LICENSE | 26 - packages/cloud_functions/README.md | 56 - packages/cloud_functions/android/build.gradle | 54 - .../cloud_functions/android/gradle.properties | 1 - .../cloud_functions/android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../cloudfunctions/CloudFunctionsPlugin.java | 88 -- .../FlutterFirebaseAppRegistrar.java | 19 - .../cloud_functions/android/user-agent.gradle | 22 - packages/cloud_functions/example/.metadata | 8 - packages/cloud_functions/example/README.md | 26 - .../example/android/app/build.gradle | 62 - .../example/android/app/google-services.json | 265 ---- .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 39 - .../cloudfunctionsexample/MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../example/android/build.gradle | 30 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 15 - .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 499 ------- .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 93 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 122 -- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 45 - .../cloud_functions/example/ios/Runner/main.m | 9 - .../cloud_functions/example/lib/main.dart | 68 - packages/cloud_functions/example/pubspec.yaml | 24 - .../example/test/cloud_functions.dart | 38 - .../example/test/cloud_functions_test.dart | 15 - .../test_driver/cloud_functions_test.dart | 11 - packages/cloud_functions/ios/Assets/.gitkeep | 0 .../ios/Classes/CloudFunctionsPlugin.h | 8 - .../ios/Classes/CloudFunctionsPlugin.m | 137 -- .../ios/cloud_functions.podspec | 34 - .../cloud_functions/lib/cloud_functions.dart | 14 - .../lib/src/cloud_functions.dart | 52 - .../lib/src/https_callable.dart | 59 - .../lib/src/https_callable_result.dart | 13 - packages/cloud_functions/pubspec.yaml | 27 - .../test/cloud_functions_test.dart | 85 -- packages/firebase_admob/CHANGELOG.md | 165 -- packages/firebase_admob/LICENSE | 27 - packages/firebase_admob/README.md | 216 --- packages/firebase_admob/android/build.gradle | 50 - .../firebase_admob/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../firebase_admob/android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../AdRequestBuilderFactory.java | 130 -- .../firebaseadmob/FirebaseAdMobPlugin.java | 236 --- .../plugins/firebaseadmob/MobileAd.java | 225 --- .../firebaseadmob/RewardedVideoAdWrapper.java | 107 -- packages/firebase_admob/example/README.md | 8 - packages/firebase_admob/example/android.iml | 12 - .../example/android/app/build.gradle | 62 - .../example/android/app/google-services.json | 99 -- .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 22 - .../firebaseadmobexample/MainActivity.java | 17 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 32 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../example/android/settings.gradle | 15 - .../example/firebase_admob_example.iml | 15 - .../firebase_admob_example_android.iml | 12 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 485 ------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/AppDelegate.h | 10 - .../example/ios/Runner/AppDelegate.m | 17 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 51 - .../firebase_admob/example/ios/Runner/main.m | 13 - packages/firebase_admob/example/lib/main.dart | 153 -- packages/firebase_admob/example/pubspec.yaml | 12 - .../firebase_admob/firebase_admob_android.iml | 12 - packages/firebase_admob/ios/Assets/.gitkeep | 0 .../firebase_admob/ios/Classes/FLTMobileAd.h | 36 - .../firebase_admob/ios/Classes/FLTMobileAd.m | 289 ---- .../ios/Classes/FLTRequestFactory.h | 12 - .../ios/Classes/FLTRequestFactory.m | 135 -- .../ios/Classes/FLTRewardedVideoAdWrapper.h | 20 - .../ios/Classes/FLTRewardedVideoAdWrapper.m | 115 -- .../ios/Classes/FirebaseAdMobPlugin.h | 10 - .../ios/Classes/FirebaseAdMobPlugin.m | 291 ---- .../firebase_admob/ios/firebase_admob.podspec | 24 - .../firebase_admob/lib/firebase_admob.dart | 528 ------- packages/firebase_admob/pubspec.yaml | 28 - .../test/firebase_admob_test.dart | 140 -- packages/firebase_analytics/.gitignore | 1 - packages/firebase_analytics/CHANGELOG.md | 230 --- packages/firebase_analytics/LICENSE | 27 - packages/firebase_analytics/README.md | 40 - .../firebase_analytics/android/build.gradle | 53 - .../android/gradle.properties | 1 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 14 - .../FirebaseAnalyticsPlugin.java | 145 -- .../FlutterFirebaseAppRegistrar.java | 19 - .../android/user-agent.gradle | 22 - packages/firebase_analytics/example/README.md | 8 - .../firebase_analytics/example/android.iml | 12 - .../example/android/app/build.gradle | 59 - .../example/android/app/google-services.json | 55 - .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 19 - .../main/java/io/flutter/plugins/.gitignore | 3 - .../MainActivity.java | 17 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 32 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 15 - .../example/firebase_analytics_example.iml | 16 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 482 ------ .../contents.xcworkspacedata | 10 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/AppDelegate.h | 10 - .../example/ios/Runner/AppDelegate.m | 16 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 49 - .../example/ios/Runner/main.m | 13 - .../firebase_analytics/example/lib/main.dart | 319 ---- .../example/lib/tabs_page.dart | 95 -- .../firebase_analytics/example/pubspec.yaml | 61 - .../test_driver/firebase_analytics.dart | 38 - .../test_driver/firebase_analytics_test.dart | 11 - .../firebase_analytics/ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseAnalyticsPlugin.h | 8 - .../ios/Classes/FirebaseAnalyticsPlugin.m | 76 - .../ios/firebase_analytics.podspec | 33 - .../lib/firebase_analytics.dart | 1097 -------------- packages/firebase_analytics/lib/observer.dart | 116 -- packages/firebase_analytics/pubspec.yaml | 29 - .../test/firebase_analytics_test.dart | 420 ------ .../test/observer_test.dart | 147 -- packages/firebase_auth/.gitignore | 1 - packages/firebase_auth/CHANGELOG.md | 465 ------ packages/firebase_auth/LICENSE | 27 - packages/firebase_auth/README.md | 142 -- packages/firebase_auth/android/build.gradle | 56 - .../firebase_auth/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../firebase_auth/android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../firebaseauth/FirebaseAuthPlugin.java | 807 ---------- .../FlutterFirebaseAppRegistrar.java | 19 - .../firebase_auth/android/user-agent.gradle | 22 - packages/firebase_auth/example/README.md | 25 - packages/firebase_auth/example/android.iml | 12 - .../example/android/app/build.gradle | 62 - .../example/android/app/google-services.json | 303 ---- .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 19 - .../main/java/io/flutter/plugins/.gitignore | 1 - .../firebaseauthexample/MainActivity.java | 17 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 30 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../example/android/settings.gradle | 15 - .../example/firebase_auth_example.iml | 16 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 502 ------- .../contents.xcworkspacedata | 10 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../xcshareddata/Runner.xcscmblueprint | 30 - .../example/ios/Runner/AppDelegate.h | 10 - .../example/ios/Runner/AppDelegate.m | 16 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 38 - .../example/ios/Runner/Info.plist | 63 - .../firebase_auth/example/ios/Runner/main.m | 13 - packages/firebase_auth/example/lib/main.dart | 70 - .../example/lib/register_page.dart | 103 -- .../example/lib/signin_page.dart | 772 ---------- packages/firebase_auth/example/pubspec.yaml | 21 - .../example/test/firebase_auth.dart | 101 -- .../example/test/firebase_auth_test.dart | 16 - .../test_driver/firebase_auth_test.dart | 11 - packages/firebase_auth/ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseAuthPlugin.h | 8 - .../ios/Classes/FirebaseAuthPlugin.m | 483 ------ .../firebase_auth/ios/firebase_auth.podspec | 33 - packages/firebase_auth/lib/firebase_auth.dart | 28 - .../lib/src/additional_user_info.dart | 26 - .../lib/src/auth_credential.dart | 13 - .../firebase_auth/lib/src/auth_exception.dart | 14 - .../auth_provider/email_auth_provider.dart | 29 - .../auth_provider/facebook_auth_provider.dart | 16 - .../auth_provider/github_auth_provider.dart | 13 - .../auth_provider/google_auth_provider.dart | 19 - .../auth_provider/phone_auth_provider.dart | 29 - .../auth_provider/twitter_auth_provider.dart | 19 - .../firebase_auth/lib/src/auth_result.dart | 31 - .../firebase_auth/lib/src/firebase_auth.dart | 451 ------ .../firebase_auth/lib/src/firebase_user.dart | 241 --- .../lib/src/id_token_result.dart | 51 - packages/firebase_auth/lib/src/user_info.dart | 37 - .../firebase_auth/lib/src/user_metadata.dart | 22 - .../lib/src/user_update_info.dart | 23 - packages/firebase_auth/pubspec.yaml | 34 - .../test/firebase_auth_test.dart | 1326 ----------------- packages/firebase_core/.gitignore | 1 - packages/firebase_core/CHANGELOG.md | 153 -- packages/firebase_core/LICENSE | 27 - packages/firebase_core/README.md | 16 - packages/firebase_core/android/build.gradle | 53 - .../firebase_core/android/gradle.properties | 1 - .../firebase_core/android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../firebase/core/FirebaseCorePlugin.java | 100 -- .../core/FlutterFirebaseAppRegistrar.java | 19 - .../firebase_core/android/user-agent.gradle | 22 - packages/firebase_core/example/.metadata | 8 - packages/firebase_core/example/README.md | 8 - packages/firebase_core/example/android.iml | 12 - .../example/android/app/build.gradle | 60 - .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 26 - .../firebasecoreexample/MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../example/android/build.gradle | 29 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 16 - .../example/firebase_core_example.iml | 17 - .../example/firebase_core_example_android.iml | 26 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 478 ------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../example/ios/Runner/Info.plist | 49 - .../firebase_core/example/ios/Runner/main.m | 9 - packages/firebase_core/example/lib/main.dart | 62 - packages/firebase_core/example/pubspec.yaml | 24 - .../firebase_core/firebase_core_android.iml | 29 - packages/firebase_core/ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseCorePlugin.h | 8 - .../ios/Classes/FirebaseCorePlugin.m | 94 -- .../firebase_core/ios/firebase_core.podspec | 32 - packages/firebase_core/lib/firebase_core.dart | 15 - .../firebase_core/lib/src/firebase_app.dart | 104 -- .../lib/src/firebase_options.dart | 150 -- packages/firebase_core/pubspec.yaml | 25 - .../test/firebase_core_test.dart | 137 -- packages/firebase_crashlytics/.gitignore | 11 - packages/firebase_crashlytics/.metadata | 10 - packages/firebase_crashlytics/CHANGELOG.md | 94 -- packages/firebase_crashlytics/LICENSE | 27 - packages/firebase_crashlytics/README.md | 128 -- .../firebase_crashlytics/android/.gitignore | 8 - .../firebase_crashlytics/android/build.gradle | 44 - .../android/gradle.properties | 1 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../FirebaseCrashlyticsPlugin.java | 126 -- .../FlutterFirebaseAppRegistrar.java | 19 - .../android/user-agent.gradle | 22 - .../firebase_crashlytics/example/.gitignore | 71 - .../firebase_crashlytics/example/.metadata | 10 - .../firebase_crashlytics/example/README.md | 17 - .../example/android/app/build.gradle | 61 - .../example/android/app/google-services.json | 545 ------- .../android/app/src/main/AndroidManifest.xml | 39 - .../MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../example/android/build.gradle | 34 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 15 - .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../example/ios/GoogleService-Info.plist | 40 - .../ios/Runner.xcodeproj/project.pbxproj | 605 -------- .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 97 -- .../contents.xcworkspacedata | 10 - .../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 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 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 | 88 -- .../firebase_crashlytics/example/pubspec.yaml | 23 - .../example/test_driver/crashlytics.dart | 36 - .../example/test_driver/crashlytics_test.dart | 13 - packages/firebase_crashlytics/ios/.gitignore | 36 - .../firebase_crashlytics/ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseCrashlyticsPlugin.h | 8 - .../ios/Classes/FirebaseCrashlyticsPlugin.m | 123 -- .../ios/firebase_crashlytics.podspec | 34 - .../lib/firebase_crashlytics.dart | 15 - .../lib/src/firebase_crashlytics.dart | 258 ---- packages/firebase_crashlytics/pubspec.yaml | 28 - .../test/firebase_crashlytics_test.dart | 195 --- packages/firebase_database/.gitignore | 1 - packages/firebase_database/CHANGELOG.md | 268 ---- packages/firebase_database/LICENSE | 27 - packages/firebase_database/README.md | 16 - .../firebase_database/android/build.gradle | 53 - .../android/gradle.properties | 1 - .../firebase_database/android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../database/FirebaseDatabasePlugin.java | 531 ------- .../database/FlutterFirebaseAppRegistrar.java | 19 - .../android/user-agent.gradle | 22 - packages/firebase_database/example/README.md | 8 - .../firebase_database/example/android.iml | 12 - .../example/android/app/build.gradle | 62 - .../example/android/app/google-services.json | 42 - .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 19 - .../firebasedatabaseexample/MainActivity.java | 17 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 30 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../example/android/settings.gradle | 15 - .../example/firebase_database_example.iml | 16 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 481 ------ .../contents.xcworkspacedata | 10 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/AppDelegate.h | 10 - .../example/ios/Runner/AppDelegate.m | 16 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 49 - .../example/ios/Runner/main.m | 13 - .../firebase_database/example/lib/main.dart | 172 --- .../firebase_database/example/pubspec.yaml | 17 - .../test_driver/firebase_database.dart | 27 - .../test_driver/firebase_database_test.dart | 10 - .../firebase_database/ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseDatabasePlugin.h | 11 - .../ios/Classes/FirebaseDatabasePlugin.m | 341 ----- .../ios/firebase_database.podspec | 32 - .../lib/firebase_database.dart | 19 - .../lib/src/database_reference.dart | 205 --- packages/firebase_database/lib/src/event.dart | 73 - .../lib/src/firebase_database.dart | 174 --- .../lib/src/on_disconnect.dart | 51 - packages/firebase_database/lib/src/query.dart | 220 --- .../lib/src/utils/push_id_generator.dart | 63 - .../lib/ui/firebase_animated_list.dart | 230 --- .../lib/ui/firebase_list.dart | 140 -- .../lib/ui/firebase_sorted_list.dart | 121 -- .../lib/ui/utils/stream_subscriber_mixin.dart | 24 - packages/firebase_database/pubspec.yaml | 29 - .../test/firebase_database_test.dart | 594 -------- .../test/firebase_list_test.dart | 264 ---- packages/firebase_dynamic_links/.gitignore | 1 - packages/firebase_dynamic_links/CHANGELOG.md | 112 -- packages/firebase_dynamic_links/LICENSE | 27 - packages/firebase_dynamic_links/README.md | 156 -- .../android/build.gradle | 54 - .../android/gradle.properties | 1 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 11 - .../FirebaseDynamicLinksPlugin.java | 325 ---- .../FlutterFirebaseAppRegistrar.java | 19 - .../android/user-agent.gradle | 22 - .../firebase_dynamic_links/example/.metadata | 8 - .../firebase_dynamic_links/example/README.md | 12 - .../example/android/app/build.gradle | 57 - .../example/android/app/google-services.json | 113 -- .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 26 - .../MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../example/android/build.gradle | 31 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../example/android/settings.gradle | 15 - .../firebase_dynamic_links_example.iml | 18 - ...firebase_dynamic_links_example_android.iml | 27 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 519 ------- .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 93 -- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 122 -- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 42 - .../example/ios/Runner/Info.plist | 62 - .../example/ios/Runner/Runner.entitlements | 5 - .../example/ios/Runner/main.m | 9 - .../example/lib/main.dart | 169 --- .../example/pubspec.yaml | 15 - .../firebase_dynamic_links_android.iml | 30 - .../ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseDynamicLinksPlugin.h | 8 - .../ios/Classes/FirebaseDynamicLinksPlugin.m | 338 ----- .../ios/firebase_dynamic_links.podspec | 33 - .../lib/firebase_dynamic_links.dart | 13 - .../lib/src/dynamic_link_parameters.dart | 328 ---- .../lib/src/firebase_dynamic_links.dart | 155 -- packages/firebase_dynamic_links/pubspec.yaml | 27 - .../test/firebase_dynamic_links_test.dart | 480 ------ packages/firebase_in_app_messaging/.gitignore | 7 - packages/firebase_in_app_messaging/.metadata | 10 - .../firebase_in_app_messaging/CHANGELOG.md | 15 - packages/firebase_in_app_messaging/LICENSE | 26 - packages/firebase_in_app_messaging/README.md | 90 -- .../android/.gitignore | 8 - .../android/build.gradle | 37 - .../android/gradle.properties | 2 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 3 - .../FirebaseInAppMessagingPlugin.java | 59 - .../example/.gitignore | 72 - .../example/.metadata | 10 - .../example/README.md | 4 - .../example/android/app/build.gradle | 63 - .../example/android/app/google-services.json | 83 -- .../example/android/app/gradle.properties | 2 - .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 33 - .../MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../app/src/profile/AndroidManifest.xml | 7 - .../example/android/build.gradle | 31 - .../example/android/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 15 - .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 600 -------- .../xcshareddata/xcschemes/Runner.xcscheme | 97 -- .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 122 -- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 30 - .../ios/Runner/GoogleService-Info.plist | 36 - .../example/ios/Runner/Info.plist | 45 - .../example/ios/Runner/main.m | 9 - .../example/lib/main.dart | 123 -- .../example/pubspec.yaml | 26 - .../firebase_in_app_messaging.dart | 32 - .../firebase_in_app_messaging_test.dart | 7 - .../firebase_in_app_messaging/ios/.gitignore | 36 - .../ios/Assets/.gitkeep | 0 .../Classes/FirebaseInAppMessagingPlugin.h | 8 - .../Classes/FirebaseInAppMessagingPlugin.m | 51 - .../ios/firebase_in_app_messaging.podspec | 24 - .../lib/firebase_in_app_messaging.dart | 42 - .../firebase_in_app_messaging/pubspec.yaml | 25 - .../test/firebase_in_app_messaging_test.dart | 58 - packages/firebase_messaging/.gitignore | 1 - packages/firebase_messaging/CHANGELOG.md | 262 ---- packages/firebase_messaging/LICENSE | 27 - packages/firebase_messaging/README.md | 123 -- .../firebase_messaging/android/android.iml | 20 - .../firebase_messaging/android/build.gradle | 55 - .../android/firebase_messaging.iml | 146 -- .../android/gradle.properties | 1 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 15 - .../FirebaseMessagingPlugin.java | 254 ---- .../FlutterFirebaseAppRegistrar.java | 19 - .../FlutterFirebaseMessagingService.java | 45 - .../android/user-agent.gradle | 22 - packages/firebase_messaging/example/README.md | 8 - .../firebase_messaging/example/android.iml | 12 - .../example/android/app/build.gradle | 62 - .../example/android/app/google-services.json | 93 -- .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 23 - .../main/java/io/flutter/plugins/.gitignore | 1 - .../MainActivity.java | 18 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 30 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../example/android/settings.gradle | 15 - .../firebase_messaging/example/example.iml | 15 - .../example/firebase_messaging_example.iml | 15 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 500 ------- .../contents.xcworkspacedata | 10 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/.gitignore | 2 - .../example/ios/Runner/AppDelegate.h | 10 - .../example/ios/Runner/AppDelegate.m | 16 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 51 - .../example/ios/Runner/Runner.entitlements | 8 - .../example/ios/Runner/main.m | 13 - .../firebase_messaging/example/lib/main.dart | 243 --- .../firebase_messaging/example/pubspec.yaml | 20 - .../test_driver/firebase_messaging.dart | 36 - .../test_driver/firebase_messaging_test.dart | 7 - .../firebase_messaging/ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseMessagingPlugin.h | 8 - .../ios/Classes/FirebaseMessagingPlugin.m | 217 --- .../ios/firebase_messaging.podspec | 33 - .../lib/firebase_messaging.dart | 162 -- packages/firebase_messaging/pubspec.yaml | 31 - .../test/firebase_messaging_test.dart | 168 --- packages/firebase_ml_vision/.gitignore | 1 - packages/firebase_ml_vision/CHANGELOG.md | 163 -- packages/firebase_ml_vision/LICENSE | 27 - packages/firebase_ml_vision/README.md | 206 --- .../firebase_ml_vision/android/build.gradle | 55 - .../android/gradle.properties | 1 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../firebasemlvision/BarcodeDetector.java | 243 --- .../plugins/firebasemlvision/Detector.java | 15 - .../firebasemlvision/FaceDetector.java | 206 --- .../FirebaseMlVisionPlugin.java | 207 --- .../FlutterFirebaseAppRegistrar.java | 19 - .../firebasemlvision/ImageLabeler.java | 87 -- .../firebasemlvision/TextRecognizer.java | 145 -- .../android/user-agent.gradle | 22 - packages/firebase_ml_vision/example/.metadata | 8 - packages/firebase_ml_vision/example/README.md | 18 - .../example/android/app/build.gradle | 59 - .../example/android/app/google-services.json | 179 --- .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 42 - .../firebasemlvisionexample/MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../example/android/build.gradle | 31 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 15 - .../example/assets/span_book.jpg | Bin 73364 -> 0 bytes .../example/assets/test_barcode.jpg | Bin 58252 -> 0 bytes .../example/assets/test_contact_barcode.png | Bin 16598 -> 0 bytes .../example/assets/test_face.jpg | Bin 35944 -> 0 bytes .../example/assets/test_text.png | Bin 5870 -> 0 bytes .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../firebase_ml_vision/example/ios/Podfile | 71 - .../ios/Runner.xcodeproj/project.pbxproj | 518 ------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 122 -- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 53 - .../example/ios/Runner/main.m | 9 - .../example/lib/camera_preview_scanner.dart | 240 --- .../example/lib/colors.dart | 10 - .../example/lib/detector_painters.dart | 169 --- .../firebase_ml_vision/example/lib/main.dart | 62 - .../example/lib/material_barcode_scanner.dart | 763 ---------- .../example/lib/picture_scanner.dart | 225 --- .../example/lib/scanner_utils.dart | 78 - .../firebase_ml_vision/example/pubspec.yaml | 32 - .../example/test_driver/barcode_detector.dart | 72 - .../example/test_driver/face_detector.dart | 32 - .../test_driver/firebase_ml_vision.dart | 55 - .../test_driver/firebase_ml_vision_test.dart | 11 - .../example/test_driver/image_labeler.dart | 25 - .../example/test_driver/text_recognizer.dart | 25 - .../firebase_ml_vision/ios/Assets/.gitkeep | 0 .../ios/Classes/BarcodeDetector.m | 215 --- .../ios/Classes/FaceDetector.m | 176 --- .../ios/Classes/FirebaseMlVisionPlugin.h | 30 - .../ios/Classes/FirebaseMlVisionPlugin.m | 237 --- .../ios/Classes/ImageLabeler.m | 72 - .../ios/Classes/TextRecognizer.m | 123 -- .../ios/firebase_ml_vision.podspec | 34 - .../lib/firebase_ml_vision.dart | 19 - .../lib/src/barcode_detector.dart | 661 -------- .../lib/src/face_detector.dart | 289 ---- .../lib/src/firebase_vision.dart | 271 ---- .../lib/src/image_labeler.dart | 148 -- .../lib/src/text_recognizer.dart | 177 --- packages/firebase_ml_vision/pubspec.yaml | 30 - .../test/firebase_ml_vision_test.dart | 1294 ---------------- .../test/image_labeler_test.dart | 169 --- packages/firebase_performance/.gitignore | 1 - packages/firebase_performance/CHANGELOG.md | 94 -- packages/firebase_performance/LICENSE | 27 - packages/firebase_performance/README.md | 88 -- .../firebase_performance/android/build.gradle | 53 - .../android/gradle.properties | 1 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 11 - .../FirebasePerformancePlugin.java | 58 - .../FlutterFirebaseAppRegistrar.java | 19 - .../FlutterFirebasePerformance.java | 107 -- .../FlutterHttpMetric.java | 116 -- .../firebaseperformance/FlutterTrace.java | 111 -- .../android/user-agent.gradle | 22 - .../firebase_performance/example/.metadata | 8 - .../firebase_performance/example/README.md | 8 - .../example/android/app/build.gradle | 57 - .../example/android/app/google-services.json | 62 - .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 26 - .../MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../example/android/build.gradle | 32 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 15 - .../example/firebase_performance_example.iml | 18 - .../firebase_performance_example_android.iml | 27 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 501 ------- .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 93 -- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 122 -- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 49 - .../example/ios/Runner/main.m | 9 - .../example/lib/main.dart | 156 -- .../firebase_performance/example/pubspec.yaml | 20 - .../test_driver/firebase_performance.dart | 182 --- .../firebase_performance_test.dart | 11 - .../firebase_performance_android.iml | 30 - .../firebase_performance/ios/Assets/.gitkeep | 0 .../ios/Classes/FLTFirebasePerformance.m | 94 -- .../ios/Classes/FLTHttpMetric.m | 111 -- .../ios/Classes/FLTTrace.m | 98 -- .../FirebasePerformancePlugin+Internal.h | 28 - .../ios/Classes/FirebasePerformancePlugin.h | 9 - .../ios/Classes/FirebasePerformancePlugin.m | 73 - .../ios/firebase_performance.podspec | 33 - .../lib/firebase_performance.dart | 15 - .../lib/src/firebase_performance.dart | 99 -- .../lib/src/http_metric.dart | 154 -- .../lib/src/performance_attributes.dart | 92 -- .../firebase_performance/lib/src/trace.dart | 123 -- packages/firebase_performance/pubspec.yaml | 30 - .../test/firebase_performance_test.dart | 493 ------ packages/firebase_remote_config/.gitignore | 1 - packages/firebase_remote_config/CHANGELOG.md | 81 - packages/firebase_remote_config/LICENSE | 26 - packages/firebase_remote_config/README.md | 76 - .../android/build.gradle | 54 - .../android/gradle.properties | 1 - .../android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../FirebaseRemoteConfigPlugin.java | 196 --- .../FlutterFirebaseAppRegistrar.java | 19 - .../android/user-agent.gradle | 22 - .../firebase_remote_config/example/.metadata | 8 - .../firebase_remote_config/example/README.md | 8 - .../example/android.iml | 12 - .../example/android/app/build.gradle | 62 - .../example/android/app/google-services.json | 234 --- .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 39 - .../MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../example/android/build.gradle | 30 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../example/android/settings.gradle | 15 - .../firebase_remote_config_example.iml | 17 - ...firebase_remote_config_example_android.iml | 26 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 493 ------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 93 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 49 - .../example/ios/Runner/main.m | 9 - .../example/lib/main.dart | 64 - .../example/pubspec.yaml | 20 - .../test_driver/firebase_remote_config.dart | 43 - .../firebase_remote_config_test.dart | 7 - .../firebase_remote_config_android.iml | 29 - .../ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseRemoteConfigPlugin.h | 8 - .../ios/Classes/FirebaseRemoteConfigPlugin.m | 175 --- .../ios/firebase_remote_config.podspec | 33 - .../lib/firebase_remote_config.dart | 17 - .../lib/src/remote_config.dart | 241 --- ...mote_config_fetch_throttled_exception.dart | 23 - .../src/remote_config_last_fetch_status.dart | 8 - .../lib/src/remote_config_settings.dart | 18 - .../lib/src/remote_config_value.dart | 60 - packages/firebase_remote_config/pubspec.yaml | 27 - .../test/firebase_remote_config_test.dart | 237 --- packages/firebase_storage/.gitignore | 1 - packages/firebase_storage/CHANGELOG.md | 244 --- packages/firebase_storage/LICENSE | 27 - packages/firebase_storage/README.md | 42 - .../firebase_storage/android/build.gradle | 62 - .../android/gradle.properties | 1 - .../firebase_storage/android/settings.gradle | 1 - .../android/src/main/AndroidManifest.xml | 9 - .../storage/FirebaseStoragePlugin.java | 510 ------- .../storage/FlutterFirebaseAppRegistrar.java | 19 - .../android/user-agent.gradle | 22 - packages/firebase_storage/example/README.md | 8 - packages/firebase_storage/example/android.iml | 12 - .../example/android/app/build.gradle | 62 - .../example/android/app/google-services.json | 42 - .../example/android/app/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/app/src/main/AndroidManifest.xml | 19 - .../firebasestorageexample/MainActivity.java | 17 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 32 - .../example/android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../example/android/settings.gradle | 15 - .../example/firebase_storage_example.iml | 16 - .../ios/Flutter/AppFrameworkInfo.plist | 30 - .../example/ios/Flutter/Debug.xcconfig | 2 - .../example/ios/Flutter/Release.xcconfig | 2 - .../ios/Runner.xcodeproj/project.pbxproj | 481 ------ .../contents.xcworkspacedata | 10 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 -- .../contents.xcworkspacedata | 10 - .../example/ios/Runner/AppDelegate.h | 10 - .../example/ios/Runner/AppDelegate.m | 16 - .../AppIcon.appiconset/Contents.json | 116 -- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 27 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../ios/Runner/GoogleService-Info.plist | 40 - .../example/ios/Runner/Info.plist | 49 - .../example/ios/Runner/main.m | 13 - .../firebase_storage/example/lib/main.dart | 234 --- .../firebase_storage/example/pubspec.yaml | 23 - .../example/test_driver/firebase_storage.dart | 61 - .../test_driver/firebase_storage_test.dart | 7 - packages/firebase_storage/ios/Assets/.gitkeep | 0 .../ios/Classes/FirebaseStoragePlugin.h | 8 - .../ios/Classes/FirebaseStoragePlugin.m | 467 ------ .../ios/firebase_storage.podspec | 32 - .../lib/firebase_storage.dart | 19 - packages/firebase_storage/lib/src/error.dart | 18 - packages/firebase_storage/lib/src/event.dart | 44 - .../lib/src/firebase_storage.dart | 158 -- .../lib/src/storage_metadata.dart | 95 -- .../lib/src/storage_reference.dart | 189 --- .../firebase_storage/lib/src/upload_task.dart | 176 --- packages/firebase_storage/pubspec.yaml | 30 - .../test/firebase_storage_test.dart | 530 ------- script/build_all_plugins_app.sh | 2 +- 1244 files changed, 3 insertions(+), 63860 deletions(-) delete mode 100644 FlutterFire.md delete mode 100644 packages/cloud_firestore/.gitignore delete mode 100644 packages/cloud_firestore/CHANGELOG.md delete mode 100755 packages/cloud_firestore/LICENSE delete mode 100755 packages/cloud_firestore/README.md delete mode 100755 packages/cloud_firestore/android/build.gradle delete mode 100755 packages/cloud_firestore/android/settings.gradle delete mode 100755 packages/cloud_firestore/android/src/main/AndroidManifest.xml delete mode 100644 packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/CloudFirestorePlugin.java delete mode 100644 packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/cloud_firestore/android/user-agent.gradle delete mode 100755 packages/cloud_firestore/example/README.md delete mode 100755 packages/cloud_firestore/example/android.iml delete mode 100755 packages/cloud_firestore/example/android/app/build.gradle delete mode 100644 packages/cloud_firestore/example/android/app/google-services.json delete mode 100644 packages/cloud_firestore/example/android/app/gradle.properties delete mode 100644 packages/cloud_firestore/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/cloud_firestore/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebase/firestoreexample/MainActivity.java delete mode 100644 packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java delete mode 100755 packages/cloud_firestore/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100755 packages/cloud_firestore/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100755 packages/cloud_firestore/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100755 packages/cloud_firestore/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100755 packages/cloud_firestore/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100755 packages/cloud_firestore/example/android/build.gradle delete mode 100755 packages/cloud_firestore/example/android/gradle.properties delete mode 100644 packages/cloud_firestore/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/cloud_firestore/example/android/settings.gradle delete mode 100755 packages/cloud_firestore/example/firestore_example.iml delete mode 100755 packages/cloud_firestore/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100755 packages/cloud_firestore/example/ios/Flutter/Debug.xcconfig delete mode 100755 packages/cloud_firestore/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/cloud_firestore/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100755 packages/cloud_firestore/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100755 packages/cloud_firestore/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100755 packages/cloud_firestore/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/cloud_firestore/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/cloud_firestore/example/ios/Runner/AppDelegate.h delete mode 100644 packages/cloud_firestore/example/ios/Runner/AppDelegate.m delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100755 packages/cloud_firestore/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100755 packages/cloud_firestore/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/cloud_firestore/example/ios/Runner/GoogleService-Info.plist delete mode 100755 packages/cloud_firestore/example/ios/Runner/Info.plist delete mode 100644 packages/cloud_firestore/example/ios/Runner/main.m delete mode 100755 packages/cloud_firestore/example/lib/main.dart delete mode 100755 packages/cloud_firestore/example/pubspec.yaml delete mode 100644 packages/cloud_firestore/example/test_driver/cloud_firestore.dart delete mode 100644 packages/cloud_firestore/example/test_driver/cloud_firestore_test.dart delete mode 100755 packages/cloud_firestore/ios/Assets/.gitkeep delete mode 100644 packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.h delete mode 100644 packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.m delete mode 100755 packages/cloud_firestore/ios/cloud_firestore.podspec delete mode 100755 packages/cloud_firestore/lib/cloud_firestore.dart delete mode 100644 packages/cloud_firestore/lib/src/blob.dart delete mode 100644 packages/cloud_firestore/lib/src/collection_reference.dart delete mode 100644 packages/cloud_firestore/lib/src/document_change.dart delete mode 100644 packages/cloud_firestore/lib/src/document_reference.dart delete mode 100644 packages/cloud_firestore/lib/src/document_snapshot.dart delete mode 100644 packages/cloud_firestore/lib/src/field_value.dart delete mode 100644 packages/cloud_firestore/lib/src/firestore.dart delete mode 100644 packages/cloud_firestore/lib/src/firestore_message_codec.dart delete mode 100644 packages/cloud_firestore/lib/src/geo_point.dart delete mode 100644 packages/cloud_firestore/lib/src/query.dart delete mode 100644 packages/cloud_firestore/lib/src/query_snapshot.dart delete mode 100644 packages/cloud_firestore/lib/src/snapshot_metadata.dart delete mode 100644 packages/cloud_firestore/lib/src/source.dart delete mode 100644 packages/cloud_firestore/lib/src/timestamp.dart delete mode 100644 packages/cloud_firestore/lib/src/transaction.dart delete mode 100644 packages/cloud_firestore/lib/src/utils/auto_id_generator.dart delete mode 100644 packages/cloud_firestore/lib/src/write_batch.dart delete mode 100755 packages/cloud_firestore/pubspec.yaml delete mode 100755 packages/cloud_firestore/test/cloud_firestore_test.dart delete mode 100644 packages/cloud_functions/.gitignore delete mode 100644 packages/cloud_functions/CHANGELOG.md delete mode 100644 packages/cloud_functions/LICENSE delete mode 100644 packages/cloud_functions/README.md delete mode 100644 packages/cloud_functions/android/build.gradle delete mode 100644 packages/cloud_functions/android/gradle.properties delete mode 100644 packages/cloud_functions/android/settings.gradle delete mode 100644 packages/cloud_functions/android/src/main/AndroidManifest.xml delete mode 100644 packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/CloudFunctionsPlugin.java delete mode 100644 packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/cloud_functions/android/user-agent.gradle delete mode 100644 packages/cloud_functions/example/.metadata delete mode 100644 packages/cloud_functions/example/README.md delete mode 100644 packages/cloud_functions/example/android/app/build.gradle delete mode 100644 packages/cloud_functions/example/android/app/google-services.json delete mode 100644 packages/cloud_functions/example/android/app/gradle.properties delete mode 100644 packages/cloud_functions/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/cloud_functions/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/cloud_functions/example/android/app/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctionsexample/MainActivity.java delete mode 100644 packages/cloud_functions/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/cloud_functions/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/cloud_functions/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/cloud_functions/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/cloud_functions/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/cloud_functions/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/cloud_functions/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/cloud_functions/example/android/build.gradle delete mode 100644 packages/cloud_functions/example/android/gradle.properties delete mode 100644 packages/cloud_functions/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/cloud_functions/example/android/settings.gradle delete mode 100644 packages/cloud_functions/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/cloud_functions/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/cloud_functions/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/cloud_functions/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/cloud_functions/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/cloud_functions/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/cloud_functions/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/cloud_functions/example/ios/Runner/AppDelegate.h delete mode 100644 packages/cloud_functions/example/ios/Runner/AppDelegate.m delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/cloud_functions/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/cloud_functions/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/cloud_functions/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/cloud_functions/example/ios/Runner/Info.plist delete mode 100644 packages/cloud_functions/example/ios/Runner/main.m delete mode 100644 packages/cloud_functions/example/lib/main.dart delete mode 100644 packages/cloud_functions/example/pubspec.yaml delete mode 100644 packages/cloud_functions/example/test/cloud_functions.dart delete mode 100644 packages/cloud_functions/example/test/cloud_functions_test.dart delete mode 100644 packages/cloud_functions/example/test_driver/cloud_functions_test.dart delete mode 100644 packages/cloud_functions/ios/Assets/.gitkeep delete mode 100644 packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h delete mode 100644 packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m delete mode 100644 packages/cloud_functions/ios/cloud_functions.podspec delete mode 100644 packages/cloud_functions/lib/cloud_functions.dart delete mode 100644 packages/cloud_functions/lib/src/cloud_functions.dart delete mode 100644 packages/cloud_functions/lib/src/https_callable.dart delete mode 100644 packages/cloud_functions/lib/src/https_callable_result.dart delete mode 100644 packages/cloud_functions/pubspec.yaml delete mode 100644 packages/cloud_functions/test/cloud_functions_test.dart delete mode 100644 packages/firebase_admob/CHANGELOG.md delete mode 100644 packages/firebase_admob/LICENSE delete mode 100644 packages/firebase_admob/README.md delete mode 100644 packages/firebase_admob/android/build.gradle delete mode 100644 packages/firebase_admob/android/gradle.properties delete mode 100644 packages/firebase_admob/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_admob/android/settings.gradle delete mode 100644 packages/firebase_admob/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/AdRequestBuilderFactory.java delete mode 100644 packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java delete mode 100644 packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java delete mode 100644 packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/RewardedVideoAdWrapper.java delete mode 100644 packages/firebase_admob/example/README.md delete mode 100644 packages/firebase_admob/example/android.iml delete mode 100644 packages/firebase_admob/example/android/app/build.gradle delete mode 100644 packages/firebase_admob/example/android/app/google-services.json delete mode 100644 packages/firebase_admob/example/android/app/gradle.properties delete mode 100644 packages/firebase_admob/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_admob/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_admob/example/android/app/src/main/java/io/flutter/plugins/firebaseadmobexample/MainActivity.java delete mode 100644 packages/firebase_admob/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_admob/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_admob/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_admob/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_admob/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_admob/example/android/build.gradle delete mode 100644 packages/firebase_admob/example/android/gradle.properties delete mode 100644 packages/firebase_admob/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_admob/example/android/settings.gradle delete mode 100644 packages/firebase_admob/example/firebase_admob_example.iml delete mode 100644 packages/firebase_admob/example/firebase_admob_example_android.iml delete mode 100644 packages/firebase_admob/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_admob/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_admob/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_admob/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_admob/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_admob/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_admob/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_admob/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_admob/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_admob/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_admob/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_admob/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/firebase_admob/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_admob/example/ios/Runner/main.m delete mode 100644 packages/firebase_admob/example/lib/main.dart delete mode 100644 packages/firebase_admob/example/pubspec.yaml delete mode 100644 packages/firebase_admob/firebase_admob_android.iml delete mode 100644 packages/firebase_admob/ios/Assets/.gitkeep delete mode 100644 packages/firebase_admob/ios/Classes/FLTMobileAd.h delete mode 100644 packages/firebase_admob/ios/Classes/FLTMobileAd.m delete mode 100644 packages/firebase_admob/ios/Classes/FLTRequestFactory.h delete mode 100644 packages/firebase_admob/ios/Classes/FLTRequestFactory.m delete mode 100644 packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.h delete mode 100644 packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.m delete mode 100644 packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.h delete mode 100644 packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m delete mode 100644 packages/firebase_admob/ios/firebase_admob.podspec delete mode 100644 packages/firebase_admob/lib/firebase_admob.dart delete mode 100644 packages/firebase_admob/pubspec.yaml delete mode 100644 packages/firebase_admob/test/firebase_admob_test.dart delete mode 100644 packages/firebase_analytics/.gitignore delete mode 100644 packages/firebase_analytics/CHANGELOG.md delete mode 100755 packages/firebase_analytics/LICENSE delete mode 100755 packages/firebase_analytics/README.md delete mode 100755 packages/firebase_analytics/android/build.gradle delete mode 100755 packages/firebase_analytics/android/gradle.properties delete mode 100755 packages/firebase_analytics/android/settings.gradle delete mode 100755 packages/firebase_analytics/android/src/main/AndroidManifest.xml delete mode 100755 packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java delete mode 100644 packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_analytics/android/user-agent.gradle delete mode 100755 packages/firebase_analytics/example/README.md delete mode 100755 packages/firebase_analytics/example/android.iml delete mode 100755 packages/firebase_analytics/example/android/app/build.gradle delete mode 100755 packages/firebase_analytics/example/android/app/google-services.json delete mode 100644 packages/firebase_analytics/example/android/app/gradle.properties delete mode 100644 packages/firebase_analytics/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_analytics/example/android/app/src/main/AndroidManifest.xml delete mode 100755 packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/.gitignore delete mode 100644 packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/firebaseanalyticsexample/MainActivity.java delete mode 100755 packages/firebase_analytics/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100755 packages/firebase_analytics/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100755 packages/firebase_analytics/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100755 packages/firebase_analytics/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100755 packages/firebase_analytics/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100755 packages/firebase_analytics/example/android/build.gradle delete mode 100755 packages/firebase_analytics/example/android/gradle.properties delete mode 100644 packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_analytics/example/android/settings.gradle delete mode 100755 packages/firebase_analytics/example/firebase_analytics_example.iml delete mode 100755 packages/firebase_analytics/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100755 packages/firebase_analytics/example/ios/Flutter/Debug.xcconfig delete mode 100755 packages/firebase_analytics/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_analytics/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100755 packages/firebase_analytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100755 packages/firebase_analytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100755 packages/firebase_analytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_analytics/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_analytics/example/ios/Runner/AppDelegate.m delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100755 packages/firebase_analytics/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100755 packages/firebase_analytics/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_analytics/example/ios/Runner/GoogleService-Info.plist delete mode 100755 packages/firebase_analytics/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_analytics/example/ios/Runner/main.m delete mode 100755 packages/firebase_analytics/example/lib/main.dart delete mode 100644 packages/firebase_analytics/example/lib/tabs_page.dart delete mode 100755 packages/firebase_analytics/example/pubspec.yaml delete mode 100644 packages/firebase_analytics/example/test_driver/firebase_analytics.dart delete mode 100644 packages/firebase_analytics/example/test_driver/firebase_analytics_test.dart delete mode 100755 packages/firebase_analytics/ios/Assets/.gitkeep delete mode 100644 packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.h delete mode 100644 packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.m delete mode 100755 packages/firebase_analytics/ios/firebase_analytics.podspec delete mode 100755 packages/firebase_analytics/lib/firebase_analytics.dart delete mode 100644 packages/firebase_analytics/lib/observer.dart delete mode 100755 packages/firebase_analytics/pubspec.yaml delete mode 100755 packages/firebase_analytics/test/firebase_analytics_test.dart delete mode 100644 packages/firebase_analytics/test/observer_test.dart delete mode 100644 packages/firebase_auth/.gitignore delete mode 100644 packages/firebase_auth/CHANGELOG.md delete mode 100755 packages/firebase_auth/LICENSE delete mode 100755 packages/firebase_auth/README.md delete mode 100755 packages/firebase_auth/android/build.gradle delete mode 100755 packages/firebase_auth/android/gradle.properties delete mode 100644 packages/firebase_auth/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_auth/android/settings.gradle delete mode 100755 packages/firebase_auth/android/src/main/AndroidManifest.xml delete mode 100755 packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java delete mode 100644 packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_auth/android/user-agent.gradle delete mode 100755 packages/firebase_auth/example/README.md delete mode 100755 packages/firebase_auth/example/android.iml delete mode 100755 packages/firebase_auth/example/android/app/build.gradle delete mode 100644 packages/firebase_auth/example/android/app/google-services.json delete mode 100644 packages/firebase_auth/example/android/app/gradle.properties delete mode 100644 packages/firebase_auth/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_auth/example/android/app/src/main/AndroidManifest.xml delete mode 100755 packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/.gitignore delete mode 100644 packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/firebaseauthexample/MainActivity.java delete mode 100755 packages/firebase_auth/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100755 packages/firebase_auth/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100755 packages/firebase_auth/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100755 packages/firebase_auth/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100755 packages/firebase_auth/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100755 packages/firebase_auth/example/android/build.gradle delete mode 100755 packages/firebase_auth/example/android/gradle.properties delete mode 100644 packages/firebase_auth/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_auth/example/android/settings.gradle delete mode 100755 packages/firebase_auth/example/firebase_auth_example.iml delete mode 100755 packages/firebase_auth/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100755 packages/firebase_auth/example/ios/Flutter/Debug.xcconfig delete mode 100755 packages/firebase_auth/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_auth/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100755 packages/firebase_auth/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100755 packages/firebase_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100755 packages/firebase_auth/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_auth/example/ios/Runner.xcworkspace/xcshareddata/Runner.xcscmblueprint delete mode 100644 packages/firebase_auth/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_auth/example/ios/Runner/AppDelegate.m delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100755 packages/firebase_auth/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100755 packages/firebase_auth/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_auth/example/ios/Runner/GoogleService-Info.plist delete mode 100755 packages/firebase_auth/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_auth/example/ios/Runner/main.m delete mode 100755 packages/firebase_auth/example/lib/main.dart delete mode 100644 packages/firebase_auth/example/lib/register_page.dart delete mode 100644 packages/firebase_auth/example/lib/signin_page.dart delete mode 100755 packages/firebase_auth/example/pubspec.yaml delete mode 100644 packages/firebase_auth/example/test/firebase_auth.dart delete mode 100644 packages/firebase_auth/example/test/firebase_auth_test.dart delete mode 100644 packages/firebase_auth/example/test_driver/firebase_auth_test.dart delete mode 100755 packages/firebase_auth/ios/Assets/.gitkeep delete mode 100644 packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.h delete mode 100644 packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m delete mode 100755 packages/firebase_auth/ios/firebase_auth.podspec delete mode 100755 packages/firebase_auth/lib/firebase_auth.dart delete mode 100644 packages/firebase_auth/lib/src/additional_user_info.dart delete mode 100644 packages/firebase_auth/lib/src/auth_credential.dart delete mode 100644 packages/firebase_auth/lib/src/auth_exception.dart delete mode 100644 packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart delete mode 100644 packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart delete mode 100644 packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart delete mode 100644 packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart delete mode 100644 packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart delete mode 100644 packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart delete mode 100644 packages/firebase_auth/lib/src/auth_result.dart delete mode 100644 packages/firebase_auth/lib/src/firebase_auth.dart delete mode 100644 packages/firebase_auth/lib/src/firebase_user.dart delete mode 100644 packages/firebase_auth/lib/src/id_token_result.dart delete mode 100644 packages/firebase_auth/lib/src/user_info.dart delete mode 100644 packages/firebase_auth/lib/src/user_metadata.dart delete mode 100644 packages/firebase_auth/lib/src/user_update_info.dart delete mode 100755 packages/firebase_auth/pubspec.yaml delete mode 100755 packages/firebase_auth/test/firebase_auth_test.dart delete mode 100644 packages/firebase_core/.gitignore delete mode 100644 packages/firebase_core/CHANGELOG.md delete mode 100644 packages/firebase_core/LICENSE delete mode 100644 packages/firebase_core/README.md delete mode 100644 packages/firebase_core/android/build.gradle delete mode 100644 packages/firebase_core/android/gradle.properties delete mode 100644 packages/firebase_core/android/settings.gradle delete mode 100644 packages/firebase_core/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java delete mode 100644 packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_core/android/user-agent.gradle delete mode 100644 packages/firebase_core/example/.metadata delete mode 100644 packages/firebase_core/example/README.md delete mode 100644 packages/firebase_core/example/android.iml delete mode 100644 packages/firebase_core/example/android/app/build.gradle delete mode 100644 packages/firebase_core/example/android/app/gradle.properties delete mode 100644 packages/firebase_core/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_core/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_core/example/android/app/src/main/java/io/flutter/plugins/firebasecoreexample/MainActivity.java delete mode 100644 packages/firebase_core/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/firebase_core/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_core/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_core/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_core/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_core/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_core/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/firebase_core/example/android/build.gradle delete mode 100644 packages/firebase_core/example/android/gradle.properties delete mode 100644 packages/firebase_core/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_core/example/android/settings.gradle delete mode 100644 packages/firebase_core/example/firebase_core_example.iml delete mode 100644 packages/firebase_core/example/firebase_core_example_android.iml delete mode 100644 packages/firebase_core/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_core/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_core/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_core/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_core/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_core/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_core/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_core/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/firebase_core/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_core/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_core/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_core/example/ios/Runner/main.m delete mode 100644 packages/firebase_core/example/lib/main.dart delete mode 100644 packages/firebase_core/example/pubspec.yaml delete mode 100644 packages/firebase_core/firebase_core_android.iml delete mode 100644 packages/firebase_core/ios/Assets/.gitkeep delete mode 100644 packages/firebase_core/ios/Classes/FirebaseCorePlugin.h delete mode 100644 packages/firebase_core/ios/Classes/FirebaseCorePlugin.m delete mode 100644 packages/firebase_core/ios/firebase_core.podspec delete mode 100644 packages/firebase_core/lib/firebase_core.dart delete mode 100644 packages/firebase_core/lib/src/firebase_app.dart delete mode 100644 packages/firebase_core/lib/src/firebase_options.dart delete mode 100644 packages/firebase_core/pubspec.yaml delete mode 100755 packages/firebase_core/test/firebase_core_test.dart delete mode 100644 packages/firebase_crashlytics/.gitignore delete mode 100644 packages/firebase_crashlytics/.metadata delete mode 100644 packages/firebase_crashlytics/CHANGELOG.md delete mode 100644 packages/firebase_crashlytics/LICENSE delete mode 100644 packages/firebase_crashlytics/README.md delete mode 100644 packages/firebase_crashlytics/android/.gitignore delete mode 100644 packages/firebase_crashlytics/android/build.gradle delete mode 100644 packages/firebase_crashlytics/android/gradle.properties delete mode 100644 packages/firebase_crashlytics/android/settings.gradle delete mode 100644 packages/firebase_crashlytics/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java delete mode 100644 packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_crashlytics/android/user-agent.gradle delete mode 100644 packages/firebase_crashlytics/example/.gitignore delete mode 100644 packages/firebase_crashlytics/example/.metadata delete mode 100644 packages/firebase_crashlytics/example/README.md delete mode 100644 packages/firebase_crashlytics/example/android/app/build.gradle delete mode 100644 packages/firebase_crashlytics/example/android/app/google-services.json delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlyticsexample/MainActivity.java delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_crashlytics/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/firebase_crashlytics/example/android/build.gradle delete mode 100644 packages/firebase_crashlytics/example/android/gradle.properties delete mode 100644 packages/firebase_crashlytics/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_crashlytics/example/android/settings.gradle delete mode 100644 packages/firebase_crashlytics/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_crashlytics/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_crashlytics/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_crashlytics/example/ios/GoogleService-Info.plist delete mode 100644 packages/firebase_crashlytics/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_crashlytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_crashlytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_crashlytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_crashlytics/example/ios/Runner/main.m delete mode 100644 packages/firebase_crashlytics/example/lib/main.dart delete mode 100644 packages/firebase_crashlytics/example/pubspec.yaml delete mode 100644 packages/firebase_crashlytics/example/test_driver/crashlytics.dart delete mode 100644 packages/firebase_crashlytics/example/test_driver/crashlytics_test.dart delete mode 100644 packages/firebase_crashlytics/ios/.gitignore delete mode 100644 packages/firebase_crashlytics/ios/Assets/.gitkeep delete mode 100644 packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h delete mode 100644 packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m delete mode 100644 packages/firebase_crashlytics/ios/firebase_crashlytics.podspec delete mode 100644 packages/firebase_crashlytics/lib/firebase_crashlytics.dart delete mode 100644 packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart delete mode 100644 packages/firebase_crashlytics/pubspec.yaml delete mode 100644 packages/firebase_crashlytics/test/firebase_crashlytics_test.dart delete mode 100644 packages/firebase_database/.gitignore delete mode 100644 packages/firebase_database/CHANGELOG.md delete mode 100755 packages/firebase_database/LICENSE delete mode 100755 packages/firebase_database/README.md delete mode 100755 packages/firebase_database/android/build.gradle delete mode 100755 packages/firebase_database/android/gradle.properties delete mode 100755 packages/firebase_database/android/settings.gradle delete mode 100755 packages/firebase_database/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java delete mode 100644 packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_database/android/user-agent.gradle delete mode 100755 packages/firebase_database/example/README.md delete mode 100755 packages/firebase_database/example/android.iml delete mode 100755 packages/firebase_database/example/android/app/build.gradle delete mode 100644 packages/firebase_database/example/android/app/google-services.json delete mode 100644 packages/firebase_database/example/android/app/gradle.properties delete mode 100644 packages/firebase_database/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_database/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_database/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java delete mode 100755 packages/firebase_database/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100755 packages/firebase_database/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100755 packages/firebase_database/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100755 packages/firebase_database/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100755 packages/firebase_database/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100755 packages/firebase_database/example/android/build.gradle delete mode 100755 packages/firebase_database/example/android/gradle.properties delete mode 100644 packages/firebase_database/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_database/example/android/settings.gradle delete mode 100755 packages/firebase_database/example/firebase_database_example.iml delete mode 100755 packages/firebase_database/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100755 packages/firebase_database/example/ios/Flutter/Debug.xcconfig delete mode 100755 packages/firebase_database/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_database/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100755 packages/firebase_database/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100755 packages/firebase_database/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100755 packages/firebase_database/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_database/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_database/example/ios/Runner/AppDelegate.m delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100755 packages/firebase_database/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100755 packages/firebase_database/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_database/example/ios/Runner/GoogleService-Info.plist delete mode 100755 packages/firebase_database/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_database/example/ios/Runner/main.m delete mode 100755 packages/firebase_database/example/lib/main.dart delete mode 100755 packages/firebase_database/example/pubspec.yaml delete mode 100644 packages/firebase_database/example/test_driver/firebase_database.dart delete mode 100644 packages/firebase_database/example/test_driver/firebase_database_test.dart delete mode 100755 packages/firebase_database/ios/Assets/.gitkeep delete mode 100644 packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.h delete mode 100644 packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.m delete mode 100755 packages/firebase_database/ios/firebase_database.podspec delete mode 100755 packages/firebase_database/lib/firebase_database.dart delete mode 100644 packages/firebase_database/lib/src/database_reference.dart delete mode 100644 packages/firebase_database/lib/src/event.dart delete mode 100644 packages/firebase_database/lib/src/firebase_database.dart delete mode 100644 packages/firebase_database/lib/src/on_disconnect.dart delete mode 100644 packages/firebase_database/lib/src/query.dart delete mode 100644 packages/firebase_database/lib/src/utils/push_id_generator.dart delete mode 100755 packages/firebase_database/lib/ui/firebase_animated_list.dart delete mode 100644 packages/firebase_database/lib/ui/firebase_list.dart delete mode 100644 packages/firebase_database/lib/ui/firebase_sorted_list.dart delete mode 100644 packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart delete mode 100755 packages/firebase_database/pubspec.yaml delete mode 100755 packages/firebase_database/test/firebase_database_test.dart delete mode 100644 packages/firebase_database/test/firebase_list_test.dart delete mode 100644 packages/firebase_dynamic_links/.gitignore delete mode 100644 packages/firebase_dynamic_links/CHANGELOG.md delete mode 100644 packages/firebase_dynamic_links/LICENSE delete mode 100644 packages/firebase_dynamic_links/README.md delete mode 100644 packages/firebase_dynamic_links/android/build.gradle delete mode 100644 packages/firebase_dynamic_links/android/gradle.properties delete mode 100644 packages/firebase_dynamic_links/android/settings.gradle delete mode 100644 packages/firebase_dynamic_links/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java delete mode 100644 packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_dynamic_links/android/user-agent.gradle delete mode 100644 packages/firebase_dynamic_links/example/.metadata delete mode 100644 packages/firebase_dynamic_links/example/README.md delete mode 100644 packages/firebase_dynamic_links/example/android/app/build.gradle delete mode 100644 packages/firebase_dynamic_links/example/android/app/google-services.json delete mode 100644 packages/firebase_dynamic_links/example/android/app/gradle.properties delete mode 100644 packages/firebase_dynamic_links/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/java/io/flutter/plugins/firebasedynamiclinksexample/MainActivity.java delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_dynamic_links/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/firebase_dynamic_links/example/android/build.gradle delete mode 100644 packages/firebase_dynamic_links/example/android/gradle.properties delete mode 100644 packages/firebase_dynamic_links/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_dynamic_links/example/android/settings.gradle delete mode 100644 packages/firebase_dynamic_links/example/firebase_dynamic_links_example.iml delete mode 100644 packages/firebase_dynamic_links/example/firebase_dynamic_links_example_android.iml delete mode 100644 packages/firebase_dynamic_links/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_dynamic_links/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_dynamic_links/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/Runner.entitlements delete mode 100644 packages/firebase_dynamic_links/example/ios/Runner/main.m delete mode 100644 packages/firebase_dynamic_links/example/lib/main.dart delete mode 100644 packages/firebase_dynamic_links/example/pubspec.yaml delete mode 100644 packages/firebase_dynamic_links/firebase_dynamic_links_android.iml delete mode 100644 packages/firebase_dynamic_links/ios/Assets/.gitkeep delete mode 100644 packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h delete mode 100644 packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m delete mode 100644 packages/firebase_dynamic_links/ios/firebase_dynamic_links.podspec delete mode 100644 packages/firebase_dynamic_links/lib/firebase_dynamic_links.dart delete mode 100644 packages/firebase_dynamic_links/lib/src/dynamic_link_parameters.dart delete mode 100644 packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart delete mode 100644 packages/firebase_dynamic_links/pubspec.yaml delete mode 100644 packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart delete mode 100644 packages/firebase_in_app_messaging/.gitignore delete mode 100644 packages/firebase_in_app_messaging/.metadata delete mode 100644 packages/firebase_in_app_messaging/CHANGELOG.md delete mode 100644 packages/firebase_in_app_messaging/LICENSE delete mode 100644 packages/firebase_in_app_messaging/README.md delete mode 100644 packages/firebase_in_app_messaging/android/.gitignore delete mode 100644 packages/firebase_in_app_messaging/android/build.gradle delete mode 100644 packages/firebase_in_app_messaging/android/gradle.properties delete mode 100644 packages/firebase_in_app_messaging/android/settings.gradle delete mode 100644 packages/firebase_in_app_messaging/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java delete mode 100644 packages/firebase_in_app_messaging/example/.gitignore delete mode 100644 packages/firebase_in_app_messaging/example/.metadata delete mode 100644 packages/firebase_in_app_messaging/example/README.md delete mode 100644 packages/firebase_in_app_messaging/example/android/app/build.gradle delete mode 100644 packages/firebase_in_app_messaging/example/android/app/google-services.json delete mode 100644 packages/firebase_in_app_messaging/example/android/app/gradle.properties delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/debug/AndroidManifest.xml delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/java/com/example/firebase_in_app_messaging_example/MainActivity.java delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/firebase_in_app_messaging/example/android/app/src/profile/AndroidManifest.xml delete mode 100644 packages/firebase_in_app_messaging/example/android/build.gradle delete mode 100644 packages/firebase_in_app_messaging/example/android/gradle.properties delete mode 100644 packages/firebase_in_app_messaging/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_in_app_messaging/example/android/settings.gradle delete mode 100644 packages/firebase_in_app_messaging/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_in_app_messaging/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_in_app_messaging/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_in_app_messaging/example/ios/Runner/main.m delete mode 100644 packages/firebase_in_app_messaging/example/lib/main.dart delete mode 100644 packages/firebase_in_app_messaging/example/pubspec.yaml delete mode 100644 packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging.dart delete mode 100644 packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging_test.dart delete mode 100644 packages/firebase_in_app_messaging/ios/.gitignore delete mode 100644 packages/firebase_in_app_messaging/ios/Assets/.gitkeep delete mode 100644 packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h delete mode 100644 packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m delete mode 100644 packages/firebase_in_app_messaging/ios/firebase_in_app_messaging.podspec delete mode 100644 packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart delete mode 100644 packages/firebase_in_app_messaging/pubspec.yaml delete mode 100644 packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart delete mode 100644 packages/firebase_messaging/.gitignore delete mode 100644 packages/firebase_messaging/CHANGELOG.md delete mode 100644 packages/firebase_messaging/LICENSE delete mode 100644 packages/firebase_messaging/README.md delete mode 100644 packages/firebase_messaging/android/android.iml delete mode 100644 packages/firebase_messaging/android/build.gradle delete mode 100644 packages/firebase_messaging/android/firebase_messaging.iml delete mode 100644 packages/firebase_messaging/android/gradle.properties delete mode 100644 packages/firebase_messaging/android/settings.gradle delete mode 100644 packages/firebase_messaging/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java delete mode 100644 packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseMessagingService.java delete mode 100644 packages/firebase_messaging/android/user-agent.gradle delete mode 100644 packages/firebase_messaging/example/README.md delete mode 100644 packages/firebase_messaging/example/android.iml delete mode 100644 packages/firebase_messaging/example/android/app/build.gradle delete mode 100644 packages/firebase_messaging/example/android/app/google-services.json delete mode 100644 packages/firebase_messaging/example/android/app/gradle.properties delete mode 100644 packages/firebase_messaging/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_messaging/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/.gitignore delete mode 100644 packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/firebasemessagingexample/MainActivity.java delete mode 100644 packages/firebase_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_messaging/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_messaging/example/android/build.gradle delete mode 100644 packages/firebase_messaging/example/android/gradle.properties delete mode 100644 packages/firebase_messaging/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_messaging/example/android/settings.gradle delete mode 100644 packages/firebase_messaging/example/example.iml delete mode 100644 packages/firebase_messaging/example/firebase_messaging_example.iml delete mode 100644 packages/firebase_messaging/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_messaging/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_messaging/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_messaging/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_messaging/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_messaging/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_messaging/example/ios/Runner/.gitignore delete mode 100644 packages/firebase_messaging/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_messaging/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_messaging/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_messaging/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/firebase_messaging/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_messaging/example/ios/Runner/Runner.entitlements delete mode 100644 packages/firebase_messaging/example/ios/Runner/main.m delete mode 100644 packages/firebase_messaging/example/lib/main.dart delete mode 100644 packages/firebase_messaging/example/pubspec.yaml delete mode 100644 packages/firebase_messaging/example/test_driver/firebase_messaging.dart delete mode 100644 packages/firebase_messaging/example/test_driver/firebase_messaging_test.dart delete mode 100644 packages/firebase_messaging/ios/Assets/.gitkeep delete mode 100644 packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.h delete mode 100644 packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.m delete mode 100644 packages/firebase_messaging/ios/firebase_messaging.podspec delete mode 100644 packages/firebase_messaging/lib/firebase_messaging.dart delete mode 100644 packages/firebase_messaging/pubspec.yaml delete mode 100644 packages/firebase_messaging/test/firebase_messaging_test.dart delete mode 100644 packages/firebase_ml_vision/.gitignore delete mode 100644 packages/firebase_ml_vision/CHANGELOG.md delete mode 100644 packages/firebase_ml_vision/LICENSE delete mode 100644 packages/firebase_ml_vision/README.md delete mode 100644 packages/firebase_ml_vision/android/build.gradle delete mode 100644 packages/firebase_ml_vision/android/gradle.properties delete mode 100644 packages/firebase_ml_vision/android/settings.gradle delete mode 100644 packages/firebase_ml_vision/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java delete mode 100644 packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java delete mode 100644 packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java delete mode 100644 packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java delete mode 100644 packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java delete mode 100644 packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java delete mode 100644 packages/firebase_ml_vision/android/user-agent.gradle delete mode 100644 packages/firebase_ml_vision/example/.metadata delete mode 100644 packages/firebase_ml_vision/example/README.md delete mode 100644 packages/firebase_ml_vision/example/android/app/build.gradle delete mode 100644 packages/firebase_ml_vision/example/android/app/google-services.json delete mode 100644 packages/firebase_ml_vision/example/android/app/gradle.properties delete mode 100644 packages/firebase_ml_vision/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/java/io/flutter/plugins/firebasemlvisionexample/MainActivity.java delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_ml_vision/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/firebase_ml_vision/example/android/build.gradle delete mode 100644 packages/firebase_ml_vision/example/android/gradle.properties delete mode 100644 packages/firebase_ml_vision/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_ml_vision/example/android/settings.gradle delete mode 100644 packages/firebase_ml_vision/example/assets/span_book.jpg delete mode 100644 packages/firebase_ml_vision/example/assets/test_barcode.jpg delete mode 100644 packages/firebase_ml_vision/example/assets/test_contact_barcode.png delete mode 100644 packages/firebase_ml_vision/example/assets/test_face.jpg delete mode 100644 packages/firebase_ml_vision/example/assets/test_text.png delete mode 100644 packages/firebase_ml_vision/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_ml_vision/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_ml_vision/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_ml_vision/example/ios/Podfile delete mode 100644 packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/firebase_ml_vision/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_ml_vision/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_ml_vision/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_ml_vision/example/ios/Runner/main.m delete mode 100644 packages/firebase_ml_vision/example/lib/camera_preview_scanner.dart delete mode 100644 packages/firebase_ml_vision/example/lib/colors.dart delete mode 100644 packages/firebase_ml_vision/example/lib/detector_painters.dart delete mode 100644 packages/firebase_ml_vision/example/lib/main.dart delete mode 100644 packages/firebase_ml_vision/example/lib/material_barcode_scanner.dart delete mode 100644 packages/firebase_ml_vision/example/lib/picture_scanner.dart delete mode 100644 packages/firebase_ml_vision/example/lib/scanner_utils.dart delete mode 100644 packages/firebase_ml_vision/example/pubspec.yaml delete mode 100644 packages/firebase_ml_vision/example/test_driver/barcode_detector.dart delete mode 100644 packages/firebase_ml_vision/example/test_driver/face_detector.dart delete mode 100644 packages/firebase_ml_vision/example/test_driver/firebase_ml_vision.dart delete mode 100644 packages/firebase_ml_vision/example/test_driver/firebase_ml_vision_test.dart delete mode 100644 packages/firebase_ml_vision/example/test_driver/image_labeler.dart delete mode 100644 packages/firebase_ml_vision/example/test_driver/text_recognizer.dart delete mode 100644 packages/firebase_ml_vision/ios/Assets/.gitkeep delete mode 100644 packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m delete mode 100644 packages/firebase_ml_vision/ios/Classes/FaceDetector.m delete mode 100644 packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h delete mode 100644 packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m delete mode 100644 packages/firebase_ml_vision/ios/Classes/ImageLabeler.m delete mode 100644 packages/firebase_ml_vision/ios/Classes/TextRecognizer.m delete mode 100644 packages/firebase_ml_vision/ios/firebase_ml_vision.podspec delete mode 100644 packages/firebase_ml_vision/lib/firebase_ml_vision.dart delete mode 100644 packages/firebase_ml_vision/lib/src/barcode_detector.dart delete mode 100644 packages/firebase_ml_vision/lib/src/face_detector.dart delete mode 100644 packages/firebase_ml_vision/lib/src/firebase_vision.dart delete mode 100644 packages/firebase_ml_vision/lib/src/image_labeler.dart delete mode 100644 packages/firebase_ml_vision/lib/src/text_recognizer.dart delete mode 100644 packages/firebase_ml_vision/pubspec.yaml delete mode 100644 packages/firebase_ml_vision/test/firebase_ml_vision_test.dart delete mode 100644 packages/firebase_ml_vision/test/image_labeler_test.dart delete mode 100644 packages/firebase_performance/.gitignore delete mode 100644 packages/firebase_performance/CHANGELOG.md delete mode 100644 packages/firebase_performance/LICENSE delete mode 100644 packages/firebase_performance/README.md delete mode 100644 packages/firebase_performance/android/build.gradle delete mode 100644 packages/firebase_performance/android/gradle.properties delete mode 100644 packages/firebase_performance/android/settings.gradle delete mode 100644 packages/firebase_performance/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FirebasePerformancePlugin.java delete mode 100644 packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebasePerformance.java delete mode 100644 packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterHttpMetric.java delete mode 100644 packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterTrace.java delete mode 100644 packages/firebase_performance/android/user-agent.gradle delete mode 100644 packages/firebase_performance/example/.metadata delete mode 100644 packages/firebase_performance/example/README.md delete mode 100644 packages/firebase_performance/example/android/app/build.gradle delete mode 100644 packages/firebase_performance/example/android/app/google-services.json delete mode 100644 packages/firebase_performance/example/android/app/gradle.properties delete mode 100644 packages/firebase_performance/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_performance/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_performance/example/android/app/src/main/java/io/flutter/plugins/firebaseperformanceexample/MainActivity.java delete mode 100644 packages/firebase_performance/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/firebase_performance/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_performance/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_performance/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_performance/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_performance/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_performance/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/firebase_performance/example/android/build.gradle delete mode 100644 packages/firebase_performance/example/android/gradle.properties delete mode 100644 packages/firebase_performance/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_performance/example/android/settings.gradle delete mode 100644 packages/firebase_performance/example/firebase_performance_example.iml delete mode 100644 packages/firebase_performance/example/firebase_performance_example_android.iml delete mode 100644 packages/firebase_performance/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_performance/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_performance/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_performance/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_performance/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_performance/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_performance/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_performance/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/firebase_performance/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_performance/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/firebase_performance/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_performance/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_performance/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/firebase_performance/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_performance/example/ios/Runner/main.m delete mode 100644 packages/firebase_performance/example/lib/main.dart delete mode 100644 packages/firebase_performance/example/pubspec.yaml delete mode 100644 packages/firebase_performance/example/test_driver/firebase_performance.dart delete mode 100644 packages/firebase_performance/example/test_driver/firebase_performance_test.dart delete mode 100644 packages/firebase_performance/firebase_performance_android.iml delete mode 100644 packages/firebase_performance/ios/Assets/.gitkeep delete mode 100644 packages/firebase_performance/ios/Classes/FLTFirebasePerformance.m delete mode 100644 packages/firebase_performance/ios/Classes/FLTHttpMetric.m delete mode 100644 packages/firebase_performance/ios/Classes/FLTTrace.m delete mode 100644 packages/firebase_performance/ios/Classes/FirebasePerformancePlugin+Internal.h delete mode 100644 packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h delete mode 100644 packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.m delete mode 100644 packages/firebase_performance/ios/firebase_performance.podspec delete mode 100644 packages/firebase_performance/lib/firebase_performance.dart delete mode 100644 packages/firebase_performance/lib/src/firebase_performance.dart delete mode 100644 packages/firebase_performance/lib/src/http_metric.dart delete mode 100644 packages/firebase_performance/lib/src/performance_attributes.dart delete mode 100644 packages/firebase_performance/lib/src/trace.dart delete mode 100644 packages/firebase_performance/pubspec.yaml delete mode 100644 packages/firebase_performance/test/firebase_performance_test.dart delete mode 100644 packages/firebase_remote_config/.gitignore delete mode 100644 packages/firebase_remote_config/CHANGELOG.md delete mode 100644 packages/firebase_remote_config/LICENSE delete mode 100644 packages/firebase_remote_config/README.md delete mode 100644 packages/firebase_remote_config/android/build.gradle delete mode 100644 packages/firebase_remote_config/android/gradle.properties delete mode 100644 packages/firebase_remote_config/android/settings.gradle delete mode 100644 packages/firebase_remote_config/android/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java delete mode 100644 packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_remote_config/android/user-agent.gradle delete mode 100644 packages/firebase_remote_config/example/.metadata delete mode 100644 packages/firebase_remote_config/example/README.md delete mode 100644 packages/firebase_remote_config/example/android.iml delete mode 100644 packages/firebase_remote_config/example/android/app/build.gradle delete mode 100644 packages/firebase_remote_config/example/android/app/google-services.json delete mode 100644 packages/firebase_remote_config/example/android/app/gradle.properties delete mode 100644 packages/firebase_remote_config/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfigexample/MainActivity.java delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/firebase_remote_config/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/firebase_remote_config/example/android/build.gradle delete mode 100644 packages/firebase_remote_config/example/android/gradle.properties delete mode 100644 packages/firebase_remote_config/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/firebase_remote_config/example/android/settings.gradle delete mode 100644 packages/firebase_remote_config/example/firebase_remote_config_example.iml delete mode 100644 packages/firebase_remote_config/example/firebase_remote_config_example_android.iml delete mode 100644 packages/firebase_remote_config/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 packages/firebase_remote_config/example/ios/Flutter/Debug.xcconfig delete mode 100644 packages/firebase_remote_config/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_remote_config/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 packages/firebase_remote_config/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_remote_config/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_remote_config/example/ios/Runner/AppDelegate.m delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 packages/firebase_remote_config/example/ios/Runner/GoogleService-Info.plist delete mode 100644 packages/firebase_remote_config/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_remote_config/example/ios/Runner/main.m delete mode 100644 packages/firebase_remote_config/example/lib/main.dart delete mode 100644 packages/firebase_remote_config/example/pubspec.yaml delete mode 100644 packages/firebase_remote_config/example/test_driver/firebase_remote_config.dart delete mode 100644 packages/firebase_remote_config/example/test_driver/firebase_remote_config_test.dart delete mode 100644 packages/firebase_remote_config/firebase_remote_config_android.iml delete mode 100644 packages/firebase_remote_config/ios/Assets/.gitkeep delete mode 100644 packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h delete mode 100644 packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m delete mode 100644 packages/firebase_remote_config/ios/firebase_remote_config.podspec delete mode 100644 packages/firebase_remote_config/lib/firebase_remote_config.dart delete mode 100644 packages/firebase_remote_config/lib/src/remote_config.dart delete mode 100644 packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart delete mode 100644 packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart delete mode 100644 packages/firebase_remote_config/lib/src/remote_config_settings.dart delete mode 100644 packages/firebase_remote_config/lib/src/remote_config_value.dart delete mode 100644 packages/firebase_remote_config/pubspec.yaml delete mode 100644 packages/firebase_remote_config/test/firebase_remote_config_test.dart delete mode 100644 packages/firebase_storage/.gitignore delete mode 100644 packages/firebase_storage/CHANGELOG.md delete mode 100755 packages/firebase_storage/LICENSE delete mode 100755 packages/firebase_storage/README.md delete mode 100755 packages/firebase_storage/android/build.gradle delete mode 100755 packages/firebase_storage/android/gradle.properties delete mode 100755 packages/firebase_storage/android/settings.gradle delete mode 100755 packages/firebase_storage/android/src/main/AndroidManifest.xml delete mode 100755 packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java delete mode 100644 packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java delete mode 100644 packages/firebase_storage/android/user-agent.gradle delete mode 100755 packages/firebase_storage/example/README.md delete mode 100755 packages/firebase_storage/example/android.iml delete mode 100755 packages/firebase_storage/example/android/app/build.gradle delete mode 100755 packages/firebase_storage/example/android/app/google-services.json delete mode 100644 packages/firebase_storage/example/android/app/gradle.properties delete mode 100644 packages/firebase_storage/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_storage/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/firebase_storage/example/android/app/src/main/java/io/flutter/plugins/firebasestorageexample/MainActivity.java delete mode 100755 packages/firebase_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100755 packages/firebase_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100755 packages/firebase_storage/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100755 packages/firebase_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100755 packages/firebase_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100755 packages/firebase_storage/example/android/build.gradle delete mode 100755 packages/firebase_storage/example/android/gradle.properties delete mode 100644 packages/firebase_storage/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/firebase_storage/example/android/settings.gradle delete mode 100755 packages/firebase_storage/example/firebase_storage_example.iml delete mode 100755 packages/firebase_storage/example/ios/Flutter/AppFrameworkInfo.plist delete mode 100755 packages/firebase_storage/example/ios/Flutter/Debug.xcconfig delete mode 100755 packages/firebase_storage/example/ios/Flutter/Release.xcconfig delete mode 100644 packages/firebase_storage/example/ios/Runner.xcodeproj/project.pbxproj delete mode 100755 packages/firebase_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100755 packages/firebase_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100755 packages/firebase_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/firebase_storage/example/ios/Runner/AppDelegate.h delete mode 100644 packages/firebase_storage/example/ios/Runner/AppDelegate.m delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100755 packages/firebase_storage/example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100755 packages/firebase_storage/example/ios/Runner/Base.lproj/Main.storyboard delete mode 100755 packages/firebase_storage/example/ios/Runner/GoogleService-Info.plist delete mode 100755 packages/firebase_storage/example/ios/Runner/Info.plist delete mode 100644 packages/firebase_storage/example/ios/Runner/main.m delete mode 100755 packages/firebase_storage/example/lib/main.dart delete mode 100755 packages/firebase_storage/example/pubspec.yaml delete mode 100644 packages/firebase_storage/example/test_driver/firebase_storage.dart delete mode 100644 packages/firebase_storage/example/test_driver/firebase_storage_test.dart delete mode 100755 packages/firebase_storage/ios/Assets/.gitkeep delete mode 100644 packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.h delete mode 100644 packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.m delete mode 100755 packages/firebase_storage/ios/firebase_storage.podspec delete mode 100755 packages/firebase_storage/lib/firebase_storage.dart delete mode 100644 packages/firebase_storage/lib/src/error.dart delete mode 100644 packages/firebase_storage/lib/src/event.dart delete mode 100644 packages/firebase_storage/lib/src/firebase_storage.dart delete mode 100644 packages/firebase_storage/lib/src/storage_metadata.dart delete mode 100644 packages/firebase_storage/lib/src/storage_reference.dart delete mode 100644 packages/firebase_storage/lib/src/upload_task.dart delete mode 100755 packages/firebase_storage/pubspec.yaml delete mode 100644 packages/firebase_storage/test/firebase_storage_test.dart diff --git a/CODEOWNERS b/CODEOWNERS index 802ffe484501..2cbefae02a3a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -8,22 +8,7 @@ packages/android_alarm_manager/* @bkonyi packages/android_intent/* @mklim packages/battery/* @amirh packages/camera/* @bparrishMines @mklim -packages/cloud_firestore/* @collinjackson @kroikie -packages/cloud_functions/* @collinjackson @kroikie packages/connectivity/* @cyanglaz -packages/firebase_admob/* @amirh @bparrishMines -packages/firebase_analytics/* @collinjackson @kroikie -packages/firebase_auth/* @collinjackson @kroikie -packages/firebase_core/* @collinjackson @kroikie -packages/firebase_crashlytics/* @kroikie @collinjackson -packages/firebase_database/* @collinjackson @kroikie -packages/firebase_dynamic_links/* @bparrishMines -packages/firebase_in_app_messaging/* @collinjackson -packages/firebase_messaging/* @collinjackson @kroikie -packages/firebase_ml_vision/* @bparrishMines -packages/firebase_performance/* @bparrishMines @collinjackson -packages/firebase_remote_config/* @collinjackson @kroikie -packages/firebase_storage/* @collinjackson @kroikie packages/google_maps_flutter/* @iskakaushik packages/google_sign_in/* @cyanglaz @mehmetf packages/image_picker/* @cyanglaz diff --git a/FlutterFire.md b/FlutterFire.md deleted file mode 100644 index ae039e6062d1..000000000000 --- a/FlutterFire.md +++ /dev/null @@ -1,107 +0,0 @@ -# FlutterFire - -FlutterFire is a set of [Flutter plugins](https://flutter.io/platform-plugins/) -that enable Flutter apps to use one or more [Firebase](https://firebase.google.com/) services. You can follow an example that shows how to use these plugins in the [Firebase for Flutter](https://codelabs.developers.google.com/codelabs/flutter-firebase/index.html#0) codelab. - -[Flutter](https://flutter.io) is a new mobile app SDK to help developers and -designers build modern mobile apps for iOS and Android. - -*Note*: These plugins are part of the [Flutter open source project](https://github.com/flutter). -The plugins are still under development, and some APIs might not be available yet. -[Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Available FlutterFire plugins - -| Plugin | Version | Firebase feature | Source code | -|---|---|---|---| -| [cloud_firestore][firestore_pub] | ![pub package][firestore_badge] | [Cloud Firestore][firestore_product] | [`packages/cloud_firestore`][firestore_code] | -| [cloud_functions][functions_pub] | ![pub package][functions_badge] | [Cloud Functions][functions_product] | [`packages/cloud_functions`][functions_code] | -| [firebase_admob][admob_pub] | ![pub package][admob_badge] | [Firebase AdMob][admob_product] | [`packages/firebase_admob`][admob_code] | -| [firebase_analytics][analytics_pub] | ![pub package][analytics_badge] | [Firebase Analytics][analytics_product] | [`packages/firebase_analytics`][analytics_code] | -| [firebase_auth][auth_pub] | ![pub package][auth_badge] | [Firebase Authentication][auth_product] | [`packages/firebase_auth`][auth_code] | -| [firebase_core][core_pub] | ![pub package][core_badge] | [Firebase Core][core_product] | [`packages/firebase_core`][core_code] | -| [firebase_crashlytics][crash_pub] | ![pub package][crash_badge] | [Firebase Crashlytics][crash_product] | [`packages/firebase_crashlytics`][crash_code] | -| [firebase_database][database_pub] | ![pub package][database_badge] | [Firebase Realtime Database][database_product] | [`packages/firebase_database`][database_code] | -| [firebase_dynamic_links][dynamic_links_pub] | ![pub package][dynamic_links_badge] | [Firebase Dynamic Links][dynamic_links_product] | [`packages/firebase_dynamic_links`][dynamic_links_code] | -| [in_app_messaging][in_app_messaging_pub] | ![pub package][in_app_messaging_badge] | [Firebase In-App Messaging][in_app_messaging_product] | [`packages/firebase_in_app_messaging`][in_app_messaging_code] | -| [firebase_messaging][messaging_pub] | ![pub package][messaging_badge] | [Firebase Cloud Messaging][messaging_product] | [`packages/firebase_messaging`][messaging_code] | -| [firebase_ml_vision][ml_vision_pub] | ![pub package][ml_vision_badge] | [Firebase ML Kit][ml_vision_product] | [`packages/firebase_ml_vision`][ml_vision_code] | -| [firebase_performance][performance_pub] | ![pub package][performance_badge] | [Firebase Performance Monitoring][performance_product] | [`packages/firebase_performance`][performance_code] | -| [firebase_remote_config][remote_config_pub] | ![pub package][remote_config_badge] | [Firebase Remote Config][remote_config_product] | [`packages/firebase_remote_config`][remote_config_code] | -| [firebase_storage][storage_pub] | ![pub package][storage_badge] | [Firebase Cloud Storage][storage_product] | [`packages/firebase_storage`][storage_code] | - -[admob_pub]: https://pub.dartlang.org/packages/firebase_admob -[admob_product]: https://firebase.google.com/docs/admob/ -[admob_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_admob -[admob_badge]: https://img.shields.io/pub/v/firebase_admob.svg - -[analytics_pub]: https://pub.dartlang.org/packages/firebase_analytics -[analytics_product]: https://firebase.google.com/products/analytics/ -[analytics_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_analytics -[analytics_badge]: https://img.shields.io/pub/v/firebase_analytics.svg - -[auth_pub]: https://pub.dartlang.org/packages/firebase_auth -[auth_product]: https://firebase.google.com/products/auth/ -[auth_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_auth -[auth_badge]: https://img.shields.io/pub/v/firebase_auth.svg - -[core_pub]: https://pub.dartlang.org/packages/firebase_core -[core_product]: https://firebase.google.com/ -[core_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_core -[core_badge]: https://img.shields.io/pub/v/firebase_core.svg - -[crash_pub]: https://pub.dartlang.org/packages/firebase_crashlytics -[crash_product]: https://firebase.google.com/products/crashlytics/ -[crash_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_crashlytics -[crash_badge]: https://img.shields.io/pub/v/firebase_crashlytics.svg - -[database_pub]: https://pub.dartlang.org/packages/firebase_database -[database_product]: https://firebase.google.com/products/database/ -[database_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_database -[database_badge]: https://img.shields.io/pub/v/firebase_database.svg - -[dynamic_links_pub]: https://pub.dartlang.org/packages/firebase_dynamic_links -[dynamic_links_product]: https://firebase.google.com/products/dynamic-links/ -[dynamic_links_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_dynamic_links -[dynamic_links_badge]: https://img.shields.io/pub/v/firebase_dynamic_links.svg - -[firestore_pub]: https://pub.dartlang.org/packages/cloud_firestore -[firestore_product]: https://firebase.google.com/products/firestore/ -[firestore_code]: https://github.com/flutter/plugins/tree/master/packages/cloud_firestore -[firestore_badge]: https://img.shields.io/pub/v/cloud_firestore.svg - -[functions_pub]: https://pub.dartlang.org/packages/cloud_functions -[functions_product]: https://firebase.google.com/products/functions/ -[functions_code]: https://github.com/flutter/plugins/tree/master/packages/cloud_functions -[functions_badge]: https://img.shields.io/pub/v/cloud_functions.svg - -[in_app_messaging_pub]: https://pub.dartlang.org/packages/firebase_in_app_messaging -[in_app_messaging_product]: https://firebase.google.com/products/in-app-messaging/ -[in_app_messaging_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_in_app_messaging -[in_app_messaging_badge]: https://img.shields.io/pub/v/firebase_in_app_messaging.svg - -[messaging_pub]: https://pub.dartlang.org/packages/firebase_messaging -[messaging_product]: https://firebase.google.com/products/cloud-messaging/ -[messaging_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_messaging -[messaging_badge]: https://img.shields.io/pub/v/firebase_messaging.svg - -[ml_vision_pub]: https://pub.dartlang.org/packages/firebase_ml_vision -[ml_vision_product]: https://firebase.google.com/products/ml-kit/ -[ml_vision_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_ml_vision -[ml_vision_badge]: https://img.shields.io/pub/v/firebase_ml_vision.svg - -[performance_pub]: https://pub.dartlang.org/packages/firebase_performance -[performance_product]: https://firebase.google.com/products/performance/ -[performance_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_performance -[performance_badge]: https://img.shields.io/pub/v/firebase_performance.svg - -[remote_config_pub]: https://pub.dartlang.org/packages/firebase_remote_config -[remote_config_product]: https://firebase.google.com/products/remote-config/ -[remote_config_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_remote_config -[remote_config_badge]: https://img.shields.io/pub/v/firebase_remote_config.svg - -[storage_pub]: https://pub.dartlang.org/packages/firebase_storage -[storage_product]: https://firebase.google.com/products/storage/ -[storage_code]: https://github.com/flutter/plugins/tree/master/packages/firebase_storage -[storage_badge]: https://img.shields.io/pub/v/firebase_storage.svg - diff --git a/README.md b/README.md index f6695a7658a6..aeb03ffa23ac 100644 --- a/README.md +++ b/README.md @@ -58,22 +58,3 @@ These are the available plugins in this repository. | [url_launcher](./packages/url_launcher/) | [![pub package](https://img.shields.io/pub/v/url_launcher.svg)](https://pub.dev/packages/url_launcher) | | [video_player](./packages/video_player/) | [![pub package](https://img.shields.io/pub/v/video_player.svg)](https://pub.dev/packages/video_player) | | [webview_flutter](./packages/webview_flutter/) | [![pub package](https://img.shields.io/pub/v/webview_flutter.svg)](https://pub.dev/packages/webview_flutter) | -| | | -| **FlutterFire Plugins** | | -| [cloud_firestore](./packages/cloud_firestore/) | [![pub package](https://img.shields.io/pub/v/cloud_firestore.svg)](https://pub.dev/packages/cloud_firestore) -| [cloud_functions](./packages/cloud_functions/) | [![pub package](https://img.shields.io/pub/v/cloud_functions.svg)](https://pub.dev/packages/cloud_functions) | -| [firebase_admob](./packages/firebase_admob/) | [![pub package](https://img.shields.io/pub/v/firebase_admob.svg)](https://pub.dev/packages/firebase_admob) | -| [firebase_analytics](./packages/firebase_analytics/) | [![pub package](https://img.shields.io/pub/v/firebase_analytics.svg)](https://pub.dev/packages/firebase_analytics) | -| [firebase_auth](./packages/firebase_auth/) | [![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dev/packages/firebase_auth) | -| [firebase_core](./packages/firebase_core/) | [![pub package](https://img.shields.io/pub/v/firebase_core.svg)](https://pub.dev/packages/firebase_core) | -| [firebase_crashlytics](./packages/firebase_crashlytics/) | [![pub package](https://img.shields.io/pub/v/firebase_crashlytics.svg)](https://pub.dev/packages/firebase_crashlytics) | -| [firebase_database](./packages/firebase_database/) | [![pub package](https://img.shields.io/pub/v/firebase_database.svg)](https://pub.dev/packages/firebase_database) | -| [firebase_dynamic_links](./packages/firebase_dynamic_links/) | [![pub package](https://img.shields.io/pub/v/firebase_dynamic_links.svg)](https://pub.dev/packages/firebase_dynamic_links) | -| [firebase_in_app_messaging](./packages/firebase_in_app_messaging/) | [![pub package](https://img.shields.io/pub/v/firebase_in_app_messaging.svg)](https://pub.dev/packages/firebase_in_app_messaging) | -| [firebase_messaging](./packages/firebase_messaging/) | [![pub package](https://img.shields.io/pub/v/firebase_messaging.svg)](https://pub.dev/packages/firebase_messaging) | -| [firebase_ml_vision](./packages/firebase_ml_vision/) | [![pub package](https://img.shields.io/pub/v/firebase_ml_vision.svg)](https://pub.dev/packages/firebase_ml_vision) | -| [firebase_performance](./packages/firebase_performance/) | [![pub package](https://img.shields.io/pub/v/firebase_performance.svg)](https://pub.dev/packages/firebase_performance) | -| [firebase_remote_config](./packages/firebase_remote_config/) | [![pub package](https://img.shields.io/pub/v/firebase_remote_config.svg)](https://pub.dev/packages/firebase_remote_config) | -| [firebase_storage](./packages/firebase_storage/) | [![pub package](https://img.shields.io/pub/v/firebase_storage.svg)](https://pub.dev/packages/firebase_storage) | - -Learn more about [FlutterFire](https://github.com/flutter/plugins/blob/master/FlutterFire.md). diff --git a/examples/all_plugins/android/app/build.gradle b/examples/all_plugins/android/app/build.gradle index f4100d3139bd..9fbd496f70df 100644 --- a/examples/all_plugins/android/app/build.gradle +++ b/examples/all_plugins/android/app/build.gradle @@ -59,6 +59,7 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' + implementation 'com.google.guava:guava:27.0.1-android' androidTestImplementation 'androidx.test:runner:1.1.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' api 'androidx.exifinterface:exifinterface:1.0.0' diff --git a/examples/all_plugins/android/build.gradle b/examples/all_plugins/android/build.gradle index 95bbaca8b8a5..ad6301ce2ad9 100644 --- a/examples/all_plugins/android/build.gradle +++ b/examples/all_plugins/android/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.3.1' } } diff --git a/packages/cloud_firestore/.gitignore b/packages/cloud_firestore/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/cloud_firestore/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/cloud_firestore/CHANGELOG.md b/packages/cloud_firestore/CHANGELOG.md deleted file mode 100644 index f5d647e0b9db..000000000000 --- a/packages/cloud_firestore/CHANGELOG.md +++ /dev/null @@ -1,420 +0,0 @@ -## 0.12.9 - -* New optional `includeMetadataChanges` parameter added to `DocumentReference.snapshots()` - and `Query.snapshots()` -* Fix example app crash when the `message` field was not a string -* Internal renaming of method names. - -## 0.12.8+1 - -* Add `metadata` to `QuerySnapshot`. - -## 0.12.8 - -* Updated how document ids are generated to more closely match native implementations. - -## 0.12.7+1 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.12.7 - -* Methods of `Transaction` no longer require `await`. -* Added documentation to methods of `Transaction`. -* Removed an unnecessary log on Android. -* Added an integration test for rapidly incrementing field value. - -## 0.12.6 - -* Support for `orderBy` on map fields (e.g. `orderBy('cake.flavor')`) for - `startAtDocument`, `startAfterDocument`, `endAtDocument`, and `endBeforeDocument` added. - -## 0.12.5+2 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.12.5+1 -* Added support for combining any of `Query.startAtDocument` and `Query.startAfterDocument` - with any of `Query.endAtDocument` and `Query.endBeforeDocument`. - -## 0.12.5 - -* Makes `startAtDocument`, `startAfterDocument`, `endAtDocument` and `endBeforeDocument` work - with `Query.collectionGroup` queries. -* Fixes `startAtDocument`, `startAfterDocument`, `endAtDocument` and `endBeforeDocument` to - also work with a descending order as the last explicit sort order. -* Fixed an integration test by increasing the value of `cacheSizeBytes` to a valid value. - -## 0.12.4 - -* Added support for `Query.collectionGroup`. - -## 0.12.3 - -* Added support for `cacheSizeBytes` to `Firestore.settings`. - -## 0.12.2 - -* Ensure that all channel calls to the Dart side from the Java side are done - on the UI thread. This change allows Transactions to work with upcoming - Engine restrictions, which require channel calls be made on the UI thread. - **Note** this is an Android only change, the iOS implementation was not impacted. -* Updated the Firebase reporting string to `flutter-fire-fst` to be consistent - with other reporting libraries. - -## 0.12.1 - -* Added support for `Source` to `Query.getDocuments()` and `DocumentReference.get()`. - -## 0.12.0+2 - -* Bump the minimum Flutter version to 1.5. -* Replace invokeMethod with invokeMapMethod wherever necessary. - -## 0.12.0+1 - -* Send user agent to Firebase. - -## 0.12.0 - -* **Breaking change**. Fixed `CollectionReference.parent` to correctly return a `DocumentReference`. - If you were using the method previously to obtain the parent - document's id via `collectionReference.parent().id`, - you will have to use `collectionReference.parent().documentID` now. -* Added `DocumentReference.parent`. - -## 0.11.0+2 - -* Remove iOS dependency on Firebase/Database and Firebase/Auth CocoaPods. - -## 0.11.0+1 - -* Update iOS CocoaPod dependencies to '~> 6.0' to ensure support for `FieldValue.increment`. - -## 0.11.0 - -* Update Android dependencies to latest. - -## 0.10.1 - -* Support for `startAtDocument`, `startAfterDocument`, `endAtDocument`, `endBeforeDocument`. -* Added additional unit and integration tests. - -## 0.10.0 - -* Support for `FieldValue.increment`. -* Remove `FieldValue.type` and `FieldValue.value` from public API. -* Additional integration testing. - -## 0.9.13+1 - -* Added an integration test for transactions. - -## 0.9.13 - -* Remove Gradle BoM to avoid Gradle version issues. - -## 0.9.12 - -* Move Android dependency to Gradle BoM to help maintain compatibility - with other FlutterFire plugins. - -## 0.9.11 - -* Bump Android dependencies to latest. - -# 0.9.10 - -* Support for cloud_firestore running in the background on Android. -* Fixed a bug in cleanup for DocumentReference.snapshots(). -* Additional integration testing. - -## 0.9.9 - -* Remove `invokeMapMethod` calls to prevent crash. - -## 0.9.8 - -* Add metadata field to DocumentSnapshot. - -## 0.9.7+2 - -* Bump the minimum Flutter version to 1.2.0. -* Add template type parameter to `invokeMethod` calls. - -## 0.9.7+1 - -* Update README with example of getting a document. - -## 0.9.7 - -* Fixes a NoSuchMethodError when using getDocuments on iOS (introduced in 0.9.6). -* Adds a driver test for getDocuments. - -## 0.9.6 - -* On iOS, update null checking to match the recommended pattern usage in the Firebase documentation. -* Fixes a case where snapshot errors might result in plugin crash. - -## 0.9.5+2 - -* Fixing PlatformException(Error 0, null, null) which happened when a successful operation was performed. - -## 0.9.5+1 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.9.5 - -* Fix an issue on some iOS devices that results in reading incorrect dates. - -## 0.9.4 - -* No longer sends empty snapshot events on iOS when encountering errors. - -## 0.9.3 - -* Fix transactions on iOS when getting snapshot that doesn't exist. - -## 0.9.2 - -* Fix IllegalStateException errors when using transactions on Android. - -## 0.9.1 - -* Fixed Firebase multiple app support in transactions and document snapshots. - -## 0.9.0+2 - -* Remove categories. - -## 0.9.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.9.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.8.2+3 - -* Resolved "explicit self reference" and "loses accuracy" compiler warnings. - -## 0.8.2+2 - -* Clean up Android build logs. @SuppressWarnings("unchecked") - -## 0.8.2+1 - -* Avoid crash in document snapshot callback. - -## 0.8.2 - -* Added `Firestore.settings` -* Added `Timestamp` class - -## 0.8.1+1 - -* Bump Android dependencies to latest. - -## 0.8.1 - -* Fixed bug where updating arrays in with `FieldValue` always throws an Exception on Android. - -## 0.8.0 - -Note: this version depends on features available in iOS SDK versions 5.5.0 or later. -To update iOS SDK in existing projects run `pod update Firebase/Firestore`. - -* Added `Firestore.enablePersistence` -* Added `FieldValue` with all currently supported values: `arrayUnion`, `arrayRemove`, `delete` and - `serverTimestamp`. -* Added `arrayContains` argument in `Query.where` method. - -## 0.7.4 - -* Bump Android and Firebase dependency versions. - -## 0.7.3 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.7.2 - -* Fixes crash on Android if a FirebaseFirestoreException happened. - -## 0.7.1 - -* Updated iOS implementation to reflect Firebase API changes. -* Fixed bug in Transaction.get that would fail on no data. -* Fixed error in README.md code sample. - -## 0.7.0+2 - -* Update transactions example in README to add `await`. - -## 0.7.0+1 - -* Add transactions example to README. - -## 0.7.0 - -* **Breaking change**. `snapshots` is now a method instead of a getter. -* **Breaking change**. `setData` uses named arguments instead of `SetOptions`. - -## 0.6.3 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.6.2 - -* Support for BLOB data type. - -## 0.6.1 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.6.0 - -* **Breaking change**. Renamed 'getCollection()' to 'collection().' - -## 0.5.1 - -* Expose the Firebase app corresponding to a Firestore -* Expose a constructor for a Firestore with a non-default Firebase app - -## 0.5.0 - -* **Breaking change**. Move path getter to CollectionReference -* Add id getter to CollectionReference - -## 0.4.0 - -* **Breaking change**. Hide Firestore codec class from public API. -* Adjusted Flutter SDK constraint to match Flutter release with extensible - platform message codec, required already by version 0.3.1. -* Move each class into separate files - -## 0.3.2 - -* Support for batched writes. - -## 0.3.1 - -* Add GeoPoint class -* Allow for reading and writing DocumentReference, DateTime, and GeoPoint - values from and to Documents. - -## 0.3.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.2.12 - -* Fix handling of `null` document snapshots (document not exists). -* Add `DocumentSnapshot.exists`. - -## 0.2.11 -* Fix Dart 2 type errors. - -## 0.2.10 -* Fix Dart 2 type errors. - -## 0.2.9 -* Relax sdk upper bound constraint to '<2.0.0' to allow 'edge' dart sdk use. - -## 0.2.8 -* Support for Query.getDocuments - -## 0.2.7 - -* Add transaction support. - -## 0.2.6 - -* Build fixes for iOS -* Null checking in newly added Query methods - -## 0.2.5 - -* Query can now have more than one orderBy field. -* startAt, startAfter, endAt, and endBefore support -* limit support - -## 0.2.4 - -* Support for DocumentReference.documentID -* Support for CollectionReference.add - -## 0.2.3 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.2.2 - -* Add `get` to DocumentReference. - -## 0.2.1 - -* Fix bug on Android where removeListener is sometimes called without a handle - -## 0.2.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.1.2 - -* Support for `DocumentReference` update and merge writes -* Suppress unchecked warnings and package name warnings on Android - -## 0.1.1 - -* Added FLT prefix to iOS types. - -## 0.1.0 - -* Added reference to DocumentSnapshot -* Breaking: removed path from DocumentSnapshot -* Additional test coverage for reading collections and documents -* Fixed typo in DocumentChange documentation - -## 0.0.6 - -* Support for getCollection - -## 0.0.5 - -* Support `isNull` filtering in `Query.where` -* Fixed `DocumentChange.oldIndex` and `DocumentChange.newIndex` to be signed - integers (iOS) - -## 0.0.4 - -* Support for where clauses -* Support for deletion - -## 0.0.3 - -* Renamed package to cloud_firestore - -## 0.0.2 - -* Add path property to DocumentSnapshot - -## 0.0.1+1 - -* Update project homepage - -## 0.0.1 - -* Initial Release diff --git a/packages/cloud_firestore/LICENSE b/packages/cloud_firestore/LICENSE deleted file mode 100755 index 5b8ff6261110..000000000000 --- a/packages/cloud_firestore/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2017, the Chromium project 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. diff --git a/packages/cloud_firestore/README.md b/packages/cloud_firestore/README.md deleted file mode 100755 index c34e2fa4709e..000000000000 --- a/packages/cloud_firestore/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# Cloud Firestore Plugin for Flutter - -A Flutter plugin to use the [Cloud Firestore API](https://firebase.google.com/docs/firestore/). - -[![pub package](https://img.shields.io/pub/v/cloud_firestore.svg)](https://pub.dartlang.org/packages/cloud_firestore) - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Setup - -To use this plugin: - -1. Using the [Firebase Console](http://console.firebase.google.com/), add an Android app to your project: -Follow the assistant, download the generated google-services.json file and place it inside android/app. Next, -modify the android/build.gradle file and the android/app/build.gradle file to add the Google services plugin -as described by the Firebase assistant. Ensure that your `android/build.gradle` file contains the -`maven.google.com` as [described here](https://firebase.google.com/docs/android/setup#add_the_sdk). -1. Using the [Firebase Console](http://console.firebase.google.com/), add an iOS app to your project: -Follow the assistant, download the generated GoogleService-Info.plist file, open ios/Runner.xcworkspace -with Xcode, and within Xcode place the file inside ios/Runner. Don't follow the steps named -"Add Firebase SDK" and "Add initialization code" in the Firebase assistant. -1. Add `cloud_firestore` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Usage - -```dart -import 'package:cloud_firestore/cloud_firestore.dart'; -``` - -Adding a new `DocumentReference`: - -```dart -Firestore.instance.collection('books').document() - .setData({ 'title': 'title', 'author': 'author' }); -``` - -Binding a `CollectionReference` to a `ListView`: - -```dart -class BookList extends StatelessWidget { - @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: Firestore.instance.collection('books').snapshots(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) - return new Text('Error: ${snapshot.error}'); - switch (snapshot.connectionState) { - case ConnectionState.waiting: return new Text('Loading...'); - default: - return new ListView( - children: snapshot.data.documents.map((DocumentSnapshot document) { - return new ListTile( - title: new Text(document['title']), - subtitle: new Text(document['author']), - ); - }).toList(), - ); - } - }, - ); - } -} -``` - -Performing a query: -```dart -Firestore.instance - .collection('talks') - .where("topic", isEqualTo: "flutter") - .snapshots() - .listen((data) => - data.documents.forEach((doc) => print(doc["title"]))); -``` - -Get a specific document: - -```dart -Firestore.instance - .collection('talks') - .document('document-name') - .get() - .then((DocumentSnapshot ds) { - // use ds as a snapshot - }); -``` - -Running a transaction: - -```dart -final DocumentReference postRef = Firestore.instance.document('posts/123'); -Firestore.instance.runTransaction((Transaction tx) async { - DocumentSnapshot postSnapshot = await tx.get(postRef); - if (postSnapshot.exists) { - await tx.update(postRef, {'likesCount': postSnapshot.data['likesCount'] + 1}); - } -}); -``` - -## Getting Started - -See the `example` directory for a complete sample app using Cloud Firestore. diff --git a/packages/cloud_firestore/android/build.gradle b/packages/cloud_firestore/android/build.gradle deleted file mode 100755 index c6198f3a37ba..000000000000 --- a/packages/cloud_firestore/android/build.gradle +++ /dev/null @@ -1,56 +0,0 @@ -def PLUGIN = "cloud_firestore"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebase.cloudfirestore' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - mavenLocal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-firestore:19.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - implementation 'androidx.annotation:annotation:1.0.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/cloud_firestore/android/settings.gradle b/packages/cloud_firestore/android/settings.gradle deleted file mode 100755 index caf10656889a..000000000000 --- a/packages/cloud_firestore/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'cloud_firestore' diff --git a/packages/cloud_firestore/android/src/main/AndroidManifest.xml b/packages/cloud_firestore/android/src/main/AndroidManifest.xml deleted file mode 100755 index b7effa8ac694..000000000000 --- a/packages/cloud_firestore/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/CloudFirestorePlugin.java b/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/CloudFirestorePlugin.java deleted file mode 100644 index e13697ab4c7d..000000000000 --- a/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/CloudFirestorePlugin.java +++ /dev/null @@ -1,900 +0,0 @@ -// Copyright 2017 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.cloudfirestore; - -import android.app.Activity; -import android.os.AsyncTask; -import android.util.Log; -import android.util.SparseArray; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.android.gms.tasks.Task; -import com.google.android.gms.tasks.TaskCompletionSource; -import com.google.android.gms.tasks.Tasks; -import com.google.firebase.FirebaseApp; -import com.google.firebase.Timestamp; -import com.google.firebase.firestore.Blob; -import com.google.firebase.firestore.CollectionReference; -import com.google.firebase.firestore.DocumentChange; -import com.google.firebase.firestore.DocumentReference; -import com.google.firebase.firestore.DocumentSnapshot; -import com.google.firebase.firestore.EventListener; -import com.google.firebase.firestore.FieldPath; -import com.google.firebase.firestore.FieldValue; -import com.google.firebase.firestore.FirebaseFirestore; -import com.google.firebase.firestore.FirebaseFirestoreException; -import com.google.firebase.firestore.FirebaseFirestoreSettings; -import com.google.firebase.firestore.GeoPoint; -import com.google.firebase.firestore.ListenerRegistration; -import com.google.firebase.firestore.MetadataChanges; -import com.google.firebase.firestore.Query; -import com.google.firebase.firestore.QuerySnapshot; -import com.google.firebase.firestore.SetOptions; -import com.google.firebase.firestore.Source; -import com.google.firebase.firestore.Transaction; -import com.google.firebase.firestore.WriteBatch; -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.plugin.common.PluginRegistry; -import io.flutter.plugin.common.StandardMessageCodec; -import io.flutter.plugin.common.StandardMethodCodec; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -public class CloudFirestorePlugin implements MethodCallHandler { - - private static final String TAG = "CloudFirestorePlugin"; - private final MethodChannel channel; - private final Activity activity; - - // Handles are ints used as indexes into the sparse array of active observers - private int nextListenerHandle = 0; - private int nextBatchHandle = 0; - private final SparseArray observers = new SparseArray<>(); - private final SparseArray documentObservers = new SparseArray<>(); - private final SparseArray listenerRegistrations = new SparseArray<>(); - private final SparseArray batches = new SparseArray<>(); - private final SparseArray transactions = new SparseArray<>(); - private final SparseArray completionTasks = new SparseArray<>(); - - public static void registerWith(PluginRegistry.Registrar registrar) { - final MethodChannel channel = - new MethodChannel( - registrar.messenger(), - "plugins.flutter.io/cloud_firestore", - new StandardMethodCodec(FirestoreMessageCodec.INSTANCE)); - channel.setMethodCallHandler(new CloudFirestorePlugin(channel, registrar.activity())); - } - - private CloudFirestorePlugin(MethodChannel channel, Activity activity) { - this.channel = channel; - this.activity = activity; - } - - private FirebaseFirestore getFirestore(Map arguments) { - String appName = (String) arguments.get("app"); - return FirebaseFirestore.getInstance(FirebaseApp.getInstance(appName)); - } - - private Query getReference(Map arguments) { - if ((boolean) arguments.get("isCollectionGroup")) return getCollectionGroupReference(arguments); - else return getCollectionReference(arguments); - } - - private Query getCollectionGroupReference(Map arguments) { - String path = (String) arguments.get("path"); - return getFirestore(arguments).collectionGroup(path); - } - - private CollectionReference getCollectionReference(Map arguments) { - String path = (String) arguments.get("path"); - return getFirestore(arguments).collection(path); - } - - private DocumentReference getDocumentReference(Map arguments) { - String path = (String) arguments.get("path"); - return getFirestore(arguments).document(path); - } - - private Source getSource(Map arguments) { - String source = (String) arguments.get("source"); - switch (source) { - case "server": - return Source.SERVER; - case "cache": - return Source.CACHE; - default: - return Source.DEFAULT; - } - } - - private Object[] getDocumentValues( - Map document, List> orderBy, Map arguments) { - String documentId = (String) document.get("id"); - Map documentData = (Map) document.get("data"); - List data = new ArrayList<>(); - if (orderBy != null) { - for (List order : orderBy) { - String orderByFieldName = (String) order.get(0); - if (orderByFieldName.contains(".")) { - String[] fieldNameParts = orderByFieldName.split("\\."); - Map current = (Map) documentData.get(fieldNameParts[0]); - for (int i = 1; i < fieldNameParts.length - 1; i++) { - current = (Map) current.get(fieldNameParts[i]); - } - data.add(current.get(fieldNameParts[fieldNameParts.length - 1])); - } else { - data.add(documentData.get(orderByFieldName)); - } - } - } - data.add((boolean) arguments.get("isCollectionGroup") ? document.get("path") : documentId); - return data.toArray(); - } - - private Map parseQuerySnapshot(QuerySnapshot querySnapshot) { - if (querySnapshot == null) return new HashMap<>(); - Map data = new HashMap<>(); - List paths = new ArrayList<>(); - List> documents = new ArrayList<>(); - List> metadatas = new ArrayList<>(); - for (DocumentSnapshot document : querySnapshot.getDocuments()) { - paths.add(document.getReference().getPath()); - documents.add(document.getData()); - Map metadata = new HashMap(); - metadata.put("hasPendingWrites", document.getMetadata().hasPendingWrites()); - metadata.put("isFromCache", document.getMetadata().isFromCache()); - metadatas.add(metadata); - } - data.put("paths", paths); - data.put("documents", documents); - data.put("metadatas", metadatas); - - List> documentChanges = new ArrayList<>(); - for (DocumentChange documentChange : querySnapshot.getDocumentChanges()) { - Map change = new HashMap<>(); - String type = null; - switch (documentChange.getType()) { - case ADDED: - type = "DocumentChangeType.added"; - break; - case MODIFIED: - type = "DocumentChangeType.modified"; - break; - case REMOVED: - type = "DocumentChangeType.removed"; - break; - } - change.put("type", type); - change.put("oldIndex", documentChange.getOldIndex()); - change.put("newIndex", documentChange.getNewIndex()); - change.put("document", documentChange.getDocument().getData()); - change.put("path", documentChange.getDocument().getReference().getPath()); - Map metadata = new HashMap(); - metadata.put( - "hasPendingWrites", documentChange.getDocument().getMetadata().hasPendingWrites()); - metadata.put("isFromCache", documentChange.getDocument().getMetadata().isFromCache()); - change.put("metadata", metadata); - documentChanges.add(change); - } - data.put("documentChanges", documentChanges); - - Map metadata = new HashMap<>(); - metadata.put("hasPendingWrites", querySnapshot.getMetadata().hasPendingWrites()); - metadata.put("isFromCache", querySnapshot.getMetadata().isFromCache()); - data.put("metadata", metadata); - - return data; - } - - private Transaction getTransaction(Map arguments) { - return transactions.get((Integer) arguments.get("transactionId")); - } - - private Query getQuery(Map arguments) { - Query query = getReference(arguments); - @SuppressWarnings("unchecked") - Map parameters = (Map) arguments.get("parameters"); - if (parameters == null) return query; - @SuppressWarnings("unchecked") - List> whereConditions = (List>) parameters.get("where"); - for (List condition : whereConditions) { - String fieldName = (String) condition.get(0); - String operator = (String) condition.get(1); - Object value = condition.get(2); - if ("==".equals(operator)) { - query = query.whereEqualTo(fieldName, value); - } else if ("<".equals(operator)) { - query = query.whereLessThan(fieldName, value); - } else if ("<=".equals(operator)) { - query = query.whereLessThanOrEqualTo(fieldName, value); - } else if (">".equals(operator)) { - query = query.whereGreaterThan(fieldName, value); - } else if (">=".equals(operator)) { - query = query.whereGreaterThanOrEqualTo(fieldName, value); - } else if ("array-contains".equals(operator)) { - query = query.whereArrayContains(fieldName, value); - } else { - // Invalid operator. - } - } - @SuppressWarnings("unchecked") - Number limit = (Number) parameters.get("limit"); - if (limit != null) query = query.limit(limit.longValue()); - @SuppressWarnings("unchecked") - List> orderBy = (List>) parameters.get("orderBy"); - if (orderBy == null) return query; - for (List order : orderBy) { - String orderByFieldName = (String) order.get(0); - boolean descending = (boolean) order.get(1); - Query.Direction direction = - descending ? Query.Direction.DESCENDING : Query.Direction.ASCENDING; - query = query.orderBy(orderByFieldName, direction); - } - @SuppressWarnings("unchecked") - Map startAtDocument = (Map) parameters.get("startAtDocument"); - @SuppressWarnings("unchecked") - Map startAfterDocument = - (Map) parameters.get("startAfterDocument"); - @SuppressWarnings("unchecked") - Map endAtDocument = (Map) parameters.get("endAtDocument"); - @SuppressWarnings("unchecked") - Map endBeforeDocument = - (Map) parameters.get("endBeforeDocument"); - if (startAtDocument != null - || startAfterDocument != null - || endAtDocument != null - || endBeforeDocument != null) { - boolean descending = (boolean) orderBy.get(orderBy.size() - 1).get(1); - Query.Direction direction = - descending ? Query.Direction.DESCENDING : Query.Direction.ASCENDING; - query = query.orderBy(FieldPath.documentId(), direction); - } - if (startAtDocument != null) { - query = query.startAt(getDocumentValues(startAtDocument, orderBy, arguments)); - } - if (startAfterDocument != null) { - query = query.startAfter(getDocumentValues(startAfterDocument, orderBy, arguments)); - } - @SuppressWarnings("unchecked") - List startAt = (List) parameters.get("startAt"); - if (startAt != null) query = query.startAt(startAt.toArray()); - @SuppressWarnings("unchecked") - List startAfter = (List) parameters.get("startAfter"); - if (startAfter != null) query = query.startAfter(startAfter.toArray()); - if (endAtDocument != null) { - query = query.endAt(getDocumentValues(endAtDocument, orderBy, arguments)); - } - if (endBeforeDocument != null) { - query = query.endBefore(getDocumentValues(endBeforeDocument, orderBy, arguments)); - } - @SuppressWarnings("unchecked") - List endAt = (List) parameters.get("endAt"); - if (endAt != null) query = query.endAt(endAt.toArray()); - @SuppressWarnings("unchecked") - List endBefore = (List) parameters.get("endBefore"); - if (endBefore != null) query = query.endBefore(endBefore.toArray()); - return query; - } - - private class DocumentObserver implements EventListener { - private int handle; - - DocumentObserver(int handle) { - this.handle = handle; - } - - @Override - public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) { - if (e != null) { - // TODO: send error - System.out.println(e); - return; - } - Map arguments = new HashMap<>(); - Map metadata = new HashMap<>(); - arguments.put("handle", handle); - metadata.put("hasPendingWrites", documentSnapshot.getMetadata().hasPendingWrites()); - metadata.put("isFromCache", documentSnapshot.getMetadata().isFromCache()); - arguments.put("metadata", metadata); - if (documentSnapshot.exists()) { - arguments.put("data", documentSnapshot.getData()); - arguments.put("path", documentSnapshot.getReference().getPath()); - } else { - arguments.put("data", null); - arguments.put("path", documentSnapshot.getReference().getPath()); - } - channel.invokeMethod("DocumentSnapshot", arguments); - } - } - - private class EventObserver implements EventListener { - private int handle; - - EventObserver(int handle) { - this.handle = handle; - } - - @Override - public void onEvent(QuerySnapshot querySnapshot, FirebaseFirestoreException e) { - if (e != null) { - // TODO: send error - System.out.println(e); - return; - } - - Map arguments = parseQuerySnapshot(querySnapshot); - arguments.put("handle", handle); - - channel.invokeMethod("QuerySnapshot", arguments); - } - } - - private void addDefaultListeners(final String description, Task task, final Result result) { - task.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(Void ignored) { - result.success(null); - } - }); - task.addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("Error performing " + description, e.getMessage(), null); - } - }); - } - - @Override - public void onMethodCall(MethodCall call, final Result result) { - switch (call.method) { - case "Firestore#runTransaction": - { - final TaskCompletionSource> transactionTCS = - new TaskCompletionSource<>(); - final Task> transactionTCSTask = transactionTCS.getTask(); - - final Map arguments = call.arguments(); - getFirestore(arguments) - .runTransaction( - new Transaction.Function>() { - @Nullable - @Override - public Map apply(@NonNull Transaction transaction) { - // Store transaction. - int transactionId = (Integer) arguments.get("transactionId"); - transactions.append(transactionId, transaction); - completionTasks.append(transactionId, transactionTCS); - - // Start operations on Dart side. - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - channel.invokeMethod( - "DoTransaction", - arguments, - new Result() { - @SuppressWarnings("unchecked") - @Override - public void success(Object doTransactionResult) { - transactionTCS.trySetResult( - (Map) doTransactionResult); - } - - @Override - public void error( - String errorCode, - String errorMessage, - Object errorDetails) { - transactionTCS.trySetException( - new Exception("DoTransaction failed: " + errorMessage)); - } - - @Override - public void notImplemented() { - transactionTCS.trySetException( - new Exception("DoTransaction not implemented")); - } - }); - } - }); - - // Wait till transaction is complete. - try { - String timeoutKey = "transactionTimeout"; - long timeout = ((Number) arguments.get(timeoutKey)).longValue(); - final Map transactionResult = - Tasks.await(transactionTCSTask, timeout, TimeUnit.MILLISECONDS); - - // Once transaction completes return the result to the Dart side. - return transactionResult; - } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); - result.error("Error performing transaction", e.getMessage(), null); - } - return null; - } - }) - .addOnCompleteListener( - new OnCompleteListener>() { - @Override - public void onComplete(Task> task) { - if (task.isSuccessful()) { - result.success(task.getResult()); - } else { - result.error( - "Error performing transaction", task.getException().getMessage(), null); - } - } - }); - break; - } - case "Transaction#get": - { - final Map arguments = call.arguments(); - final Transaction transaction = getTransaction(arguments); - new AsyncTask() { - @Override - protected Void doInBackground(Void... voids) { - try { - DocumentSnapshot documentSnapshot = - transaction.get(getDocumentReference(arguments)); - final Map snapshotMap = new HashMap<>(); - snapshotMap.put("path", documentSnapshot.getReference().getPath()); - if (documentSnapshot.exists()) { - snapshotMap.put("data", documentSnapshot.getData()); - } else { - snapshotMap.put("data", null); - } - Map metadata = new HashMap(); - metadata.put("hasPendingWrites", documentSnapshot.getMetadata().hasPendingWrites()); - metadata.put("isFromCache", documentSnapshot.getMetadata().isFromCache()); - snapshotMap.put("metadata", metadata); - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - result.success(snapshotMap); - } - }); - } catch (final FirebaseFirestoreException e) { - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - result.error("Error performing Transaction#get", e.getMessage(), null); - } - }); - } - return null; - } - }.execute(); - break; - } - case "Transaction#update": - { - final Map arguments = call.arguments(); - final Transaction transaction = getTransaction(arguments); - new AsyncTask() { - @SuppressWarnings("unchecked") - @Override - protected Void doInBackground(Void... voids) { - Map data = (Map) arguments.get("data"); - try { - transaction.update(getDocumentReference(arguments), data); - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - result.success(null); - } - }); - } catch (final IllegalStateException e) { - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - result.error("Error performing Transaction#update", e.getMessage(), null); - } - }); - } - return null; - } - }.execute(); - break; - } - case "Transaction#set": - { - final Map arguments = call.arguments(); - final Transaction transaction = getTransaction(arguments); - new AsyncTask() { - @SuppressWarnings("unchecked") - @Override - protected Void doInBackground(Void... voids) { - Map data = (Map) arguments.get("data"); - transaction.set(getDocumentReference(arguments), data); - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - result.success(null); - } - }); - return null; - } - }.execute(); - break; - } - case "Transaction#delete": - { - final Map arguments = call.arguments(); - final Transaction transaction = getTransaction(arguments); - new AsyncTask() { - @Override - protected Void doInBackground(Void... voids) { - transaction.delete(getDocumentReference(arguments)); - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - result.success(null); - } - }); - return null; - } - }.execute(); - break; - } - case "WriteBatch#create": - { - int handle = nextBatchHandle++; - final Map arguments = call.arguments(); - WriteBatch batch = getFirestore(arguments).batch(); - batches.put(handle, batch); - result.success(handle); - break; - } - case "WriteBatch#setData": - { - Map arguments = call.arguments(); - int handle = (Integer) arguments.get("handle"); - DocumentReference reference = getDocumentReference(arguments); - @SuppressWarnings("unchecked") - Map options = (Map) arguments.get("options"); - WriteBatch batch = batches.get(handle); - if (options != null && (boolean) options.get("merge")) { - batch.set(reference, arguments.get("data"), SetOptions.merge()); - } else { - batch.set(reference, arguments.get("data")); - } - result.success(null); - break; - } - case "WriteBatch#updateData": - { - Map arguments = call.arguments(); - int handle = (Integer) arguments.get("handle"); - DocumentReference reference = getDocumentReference(arguments); - @SuppressWarnings("unchecked") - Map data = (Map) arguments.get("data"); - WriteBatch batch = batches.get(handle); - batch.update(reference, data); - result.success(null); - break; - } - case "WriteBatch#delete": - { - Map arguments = call.arguments(); - int handle = (Integer) arguments.get("handle"); - DocumentReference reference = getDocumentReference(arguments); - WriteBatch batch = batches.get(handle); - batch.delete(reference); - result.success(null); - break; - } - case "WriteBatch#commit": - { - Map arguments = call.arguments(); - int handle = (Integer) arguments.get("handle"); - WriteBatch batch = batches.get(handle); - Task task = batch.commit(); - batches.delete(handle); - addDefaultListeners("commit", task, result); - break; - } - case "Query#addSnapshotListener": - { - Map arguments = call.arguments(); - int handle = nextListenerHandle++; - EventObserver observer = new EventObserver(handle); - observers.put(handle, observer); - MetadataChanges metadataChanges = - (Boolean) arguments.get("includeMetadataChanges") - ? MetadataChanges.INCLUDE - : MetadataChanges.EXCLUDE; - listenerRegistrations.put( - handle, getQuery(arguments).addSnapshotListener(metadataChanges, observer)); - result.success(handle); - break; - } - case "DocumentReference#addSnapshotListener": - { - Map arguments = call.arguments(); - int handle = nextListenerHandle++; - DocumentObserver observer = new DocumentObserver(handle); - documentObservers.put(handle, observer); - MetadataChanges metadataChanges = - (Boolean) arguments.get("includeMetadataChanges") - ? MetadataChanges.INCLUDE - : MetadataChanges.EXCLUDE; - listenerRegistrations.put( - handle, - getDocumentReference(arguments).addSnapshotListener(metadataChanges, observer)); - result.success(handle); - break; - } - case "removeListener": - { - Map arguments = call.arguments(); - int handle = (Integer) arguments.get("handle"); - listenerRegistrations.get(handle).remove(); - listenerRegistrations.remove(handle); - observers.remove(handle); - result.success(null); - break; - } - case "Query#getDocuments": - { - Map arguments = call.arguments(); - Query query = getQuery(arguments); - Source source = getSource(arguments); - Task task = query.get(source); - task.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(QuerySnapshot querySnapshot) { - result.success(parseQuerySnapshot(querySnapshot)); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("Error performing getDocuments", e.getMessage(), null); - } - }); - break; - } - case "DocumentReference#setData": - { - Map arguments = call.arguments(); - DocumentReference documentReference = getDocumentReference(arguments); - @SuppressWarnings("unchecked") - Map options = (Map) arguments.get("options"); - @SuppressWarnings("unchecked") - Map data = (Map) arguments.get("data"); - Task task; - if (options != null && (boolean) options.get("merge")) { - task = documentReference.set(data, SetOptions.merge()); - } else { - task = documentReference.set(data); - } - addDefaultListeners("setData", task, result); - break; - } - case "DocumentReference#updateData": - { - Map arguments = call.arguments(); - DocumentReference documentReference = getDocumentReference(arguments); - @SuppressWarnings("unchecked") - Map data = (Map) arguments.get("data"); - Task task = documentReference.update(data); - addDefaultListeners("updateData", task, result); - break; - } - case "DocumentReference#get": - { - Map arguments = call.arguments(); - DocumentReference documentReference = getDocumentReference(arguments); - Source source = getSource(arguments); - Task task = documentReference.get(source); - task.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(DocumentSnapshot documentSnapshot) { - Map snapshotMap = new HashMap<>(); - Map metadata = new HashMap<>(); - metadata.put( - "hasPendingWrites", documentSnapshot.getMetadata().hasPendingWrites()); - metadata.put("isFromCache", documentSnapshot.getMetadata().isFromCache()); - snapshotMap.put("metadata", metadata); - snapshotMap.put("path", documentSnapshot.getReference().getPath()); - if (documentSnapshot.exists()) { - snapshotMap.put("data", documentSnapshot.getData()); - } else { - snapshotMap.put("data", null); - } - result.success(snapshotMap); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("Error performing get", e.getMessage(), null); - } - }); - break; - } - case "DocumentReference#delete": - { - Map arguments = call.arguments(); - DocumentReference documentReference = getDocumentReference(arguments); - Task task = documentReference.delete(); - addDefaultListeners("delete", task, result); - break; - } - case "Firestore#enablePersistence": - { - Map arguments = call.arguments(); - boolean enable = (boolean) arguments.get("enable"); - FirebaseFirestoreSettings.Builder builder = new FirebaseFirestoreSettings.Builder(); - builder.setPersistenceEnabled(enable); - FirebaseFirestoreSettings settings = builder.build(); - getFirestore(arguments).setFirestoreSettings(settings); - result.success(null); - break; - } - case "Firestore#settings": - { - final Map arguments = call.arguments(); - final FirebaseFirestoreSettings.Builder builder = new FirebaseFirestoreSettings.Builder(); - - if (arguments.get("persistenceEnabled") != null) { - builder.setPersistenceEnabled((boolean) arguments.get("persistenceEnabled")); - } - - if (arguments.get("host") != null) { - builder.setHost((String) arguments.get("host")); - } - - if (arguments.get("sslEnabled") != null) { - builder.setSslEnabled((boolean) arguments.get("sslEnabled")); - } - - if (arguments.get("timestampsInSnapshotsEnabled") != null) { - builder.setTimestampsInSnapshotsEnabled( - (boolean) arguments.get("timestampsInSnapshotsEnabled")); - } - - if (arguments.get("cacheSizeBytes") != null) { - builder.setCacheSizeBytes(((Integer) arguments.get("cacheSizeBytes")).longValue()); - } - - FirebaseFirestoreSettings settings = builder.build(); - getFirestore(arguments).setFirestoreSettings(settings); - result.success(null); - break; - } - default: - { - result.notImplemented(); - break; - } - } - } -} - -final class FirestoreMessageCodec extends StandardMessageCodec { - public static final FirestoreMessageCodec INSTANCE = new FirestoreMessageCodec(); - private static final Charset UTF8 = Charset.forName("UTF8"); - private static final byte DATE_TIME = (byte) 128; - private static final byte GEO_POINT = (byte) 129; - private static final byte DOCUMENT_REFERENCE = (byte) 130; - private static final byte BLOB = (byte) 131; - private static final byte ARRAY_UNION = (byte) 132; - private static final byte ARRAY_REMOVE = (byte) 133; - private static final byte DELETE = (byte) 134; - private static final byte SERVER_TIMESTAMP = (byte) 135; - private static final byte TIMESTAMP = (byte) 136; - private static final byte INCREMENT_DOUBLE = (byte) 137; - private static final byte INCREMENT_INTEGER = (byte) 138; - - @Override - protected void writeValue(ByteArrayOutputStream stream, Object value) { - if (value instanceof Date) { - stream.write(DATE_TIME); - writeLong(stream, ((Date) value).getTime()); - } else if (value instanceof Timestamp) { - stream.write(TIMESTAMP); - writeLong(stream, ((Timestamp) value).getSeconds()); - writeInt(stream, ((Timestamp) value).getNanoseconds()); - } else if (value instanceof GeoPoint) { - stream.write(GEO_POINT); - writeAlignment(stream, 8); - writeDouble(stream, ((GeoPoint) value).getLatitude()); - writeDouble(stream, ((GeoPoint) value).getLongitude()); - } else if (value instanceof DocumentReference) { - stream.write(DOCUMENT_REFERENCE); - writeBytes( - stream, ((DocumentReference) value).getFirestore().getApp().getName().getBytes(UTF8)); - writeBytes(stream, ((DocumentReference) value).getPath().getBytes(UTF8)); - } else if (value instanceof Blob) { - stream.write(BLOB); - writeBytes(stream, ((Blob) value).toBytes()); - } else { - super.writeValue(stream, value); - } - } - - @Override - protected Object readValueOfType(byte type, ByteBuffer buffer) { - switch (type) { - case DATE_TIME: - return new Date(buffer.getLong()); - case TIMESTAMP: - return new Timestamp(buffer.getLong(), buffer.getInt()); - case GEO_POINT: - readAlignment(buffer, 8); - return new GeoPoint(buffer.getDouble(), buffer.getDouble()); - case DOCUMENT_REFERENCE: - final byte[] appNameBytes = readBytes(buffer); - String appName = new String(appNameBytes, UTF8); - final FirebaseFirestore firestore = - FirebaseFirestore.getInstance(FirebaseApp.getInstance(appName)); - final byte[] pathBytes = readBytes(buffer); - final String path = new String(pathBytes, UTF8); - return firestore.document(path); - case BLOB: - final byte[] bytes = readBytes(buffer); - return Blob.fromBytes(bytes); - case ARRAY_UNION: - return FieldValue.arrayUnion(toArray(readValue(buffer))); - case ARRAY_REMOVE: - return FieldValue.arrayRemove(toArray(readValue(buffer))); - case DELETE: - return FieldValue.delete(); - case SERVER_TIMESTAMP: - return FieldValue.serverTimestamp(); - case INCREMENT_INTEGER: - final Number integerIncrementValue = (Number) readValue(buffer); - return FieldValue.increment(integerIncrementValue.intValue()); - case INCREMENT_DOUBLE: - final Number doubleIncrementValue = (Number) readValue(buffer); - return FieldValue.increment(doubleIncrementValue.doubleValue()); - default: - return super.readValueOfType(type, buffer); - } - } - - private Object[] toArray(Object source) { - if (source instanceof List) { - return ((List) source).toArray(); - } - - if (source == null) { - return new Object[0]; - } - - String sourceType = source.getClass().getCanonicalName(); - String message = "java.util.List was expected, unable to convert '%s' to an object array"; - throw new IllegalArgumentException(String.format(message, sourceType)); - } -} diff --git a/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java b/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index c9d0c3c8db3d..000000000000 --- a/packages/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/cloudfirestore/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.cloudfirestore; - -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; - -public class FlutterFirebaseAppRegistrar implements ComponentRegistrar { - @Override - public List> getComponents() { - return Collections.>singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); - } -} diff --git a/packages/cloud_firestore/android/user-agent.gradle b/packages/cloud_firestore/android/user-agent.gradle deleted file mode 100644 index a445384c1b89..000000000000 --- a/packages/cloud_firestore/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-fst" -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/cloud_firestore/example/README.md b/packages/cloud_firestore/example/README.md deleted file mode 100755 index a85ddb780a74..000000000000 --- a/packages/cloud_firestore/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firestore_example - -Demonstrates how to use the firestore plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/cloud_firestore/example/android.iml b/packages/cloud_firestore/example/android.iml deleted file mode 100755 index 462b903e05b6..000000000000 --- a/packages/cloud_firestore/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/cloud_firestore/example/android/app/build.gradle b/packages/cloud_firestore/example/android/app/build.gradle deleted file mode 100755 index 335003e1414f..000000000000 --- a/packages/cloud_firestore/example/android/app/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId 'io.flutter.plugins.firebase.firestoreexample' - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - multiDexEnabled true - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/cloud_firestore/example/android/app/google-services.json b/packages/cloud_firestore/example/android/app/google-services.json deleted file mode 100644 index 5616df5cb338..000000000000 --- a/packages/cloud_firestore/example/android/app/google-services.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "project_info": { - "project_number": "159623150305", - "firebase_url": "https://flutter-firebase-plugins.firebaseio.com", - "project_id": "flutter-firebase-plugins", - "storage_bucket": "flutter-firebase-plugins.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:236f9daea101f77e", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} diff --git a/packages/cloud_firestore/example/android/app/gradle.properties b/packages/cloud_firestore/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/cloud_firestore/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/cloud_firestore/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/cloud_firestore/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/cloud_firestore/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/cloud_firestore/example/android/app/src/main/AndroidManifest.xml b/packages/cloud_firestore/example/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index d116d58dd97a..000000000000 --- a/packages/cloud_firestore/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebase/firestoreexample/MainActivity.java b/packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebase/firestoreexample/MainActivity.java deleted file mode 100644 index 3e63aa8619eb..000000000000 --- a/packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebase/firestoreexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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.firestoreexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java b/packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java deleted file mode 100644 index 0c58e26a5c1b..000000000000 --- a/packages/cloud_firestore/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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.firebasedatabaseexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/cloud_firestore/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/cloud_firestore/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100755 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/cloud_firestore/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/cloud_firestore/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100755 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/cloud_firestore/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/cloud_firestore/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100755 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/cloud_firestore/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/cloud_firestore/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100755 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/cloud_firestore/example/android/build.gradle b/packages/cloud_firestore/example/android/build.gradle deleted file mode 100755 index 695de848ec30..000000000000 --- a/packages/cloud_firestore/example/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - mavenLocal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/cloud_firestore/example/android/gradle.properties b/packages/cloud_firestore/example/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/cloud_firestore/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/cloud_firestore/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/cloud_firestore/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/cloud_firestore/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/cloud_firestore/example/android/settings.gradle b/packages/cloud_firestore/example/android/settings.gradle deleted file mode 100755 index 6cb349eef1b6..000000000000 --- a/packages/cloud_firestore/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} \ No newline at end of file diff --git a/packages/cloud_firestore/example/firestore_example.iml b/packages/cloud_firestore/example/firestore_example.iml deleted file mode 100755 index 1ae40a0f7f54..000000000000 --- a/packages/cloud_firestore/example/firestore_example.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/cloud_firestore/example/ios/Flutter/AppFrameworkInfo.plist b/packages/cloud_firestore/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 6c2de8086bcd..000000000000 --- a/packages/cloud_firestore/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/cloud_firestore/example/ios/Flutter/Debug.xcconfig b/packages/cloud_firestore/example/ios/Flutter/Debug.xcconfig deleted file mode 100755 index 9803018ca79d..000000000000 --- a/packages/cloud_firestore/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/packages/cloud_firestore/example/ios/Flutter/Release.xcconfig b/packages/cloud_firestore/example/ios/Flutter/Release.xcconfig deleted file mode 100755 index a4a8c604e13d..000000000000 --- a/packages/cloud_firestore/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/packages/cloud_firestore/example/ios/Runner.xcodeproj/project.pbxproj b/packages/cloud_firestore/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 80980c30cd85..000000000000 --- a/packages/cloud_firestore/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,500 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C6F5A711EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */; }; - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 */; }; - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */, - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */, - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */, - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */, - 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 = ( - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; - }; - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/gRPC/gRPCCertificates.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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 */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C6F5A711EC3CCCC008D64B5 /* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firestoreExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firestoreExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/cloud_firestore/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/cloud_firestore/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/cloud_firestore/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/cloud_firestore/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/cloud_firestore/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index 1c9580788197..000000000000 --- a/packages/cloud_firestore/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/cloud_firestore/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/cloud_firestore/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/cloud_firestore/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/cloud_firestore/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/cloud_firestore/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d68..000000000000 --- a/packages/cloud_firestore/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/packages/cloud_firestore/example/ios/Runner/AppDelegate.h b/packages/cloud_firestore/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e990f2e..000000000000 --- a/packages/cloud_firestore/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/cloud_firestore/example/ios/Runner/AppDelegate.m b/packages/cloud_firestore/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c88eb60..000000000000 --- a/packages/cloud_firestore/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 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. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index d22f10b2ab63..000000000000 --- a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100755 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100755 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100755 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100755 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100755 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/cloud_firestore/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100755 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/cloud_firestore/example/ios/Runner/Base.lproj/Main.storyboard b/packages/cloud_firestore/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index f3c28516fb38..000000000000 --- a/packages/cloud_firestore/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/cloud_firestore/example/ios/Runner/GoogleService-Info.plist b/packages/cloud_firestore/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 9edb534e78d8..000000000000 --- a/packages/cloud_firestore/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 159623150305-1iiqqggbff817a8bpnalo64nuc3qobid.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.159623150305-1iiqqggbff817a8bpnalo64nuc3qobid - API_KEY - AIzaSyDyzecVw1zXTpBKwfFHxpl7QyYBhimNhUk - GCM_SENDER_ID - 159623150305 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firestoreExample - PROJECT_ID - flutter-firebase-plugins - STORAGE_BUCKET - flutter-firebase-plugins.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:159623150305:ios:7e8aafdf0bd8d289 - DATABASE_URL - https://flutter-firebase-plugins.firebaseio.com - - diff --git a/packages/cloud_firestore/example/ios/Runner/Info.plist b/packages/cloud_firestore/example/ios/Runner/Info.plist deleted file mode 100755 index 4715632a5ee2..000000000000 --- a/packages/cloud_firestore/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firestore_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/cloud_firestore/example/ios/Runner/main.m b/packages/cloud_firestore/example/ios/Runner/main.m deleted file mode 100644 index bec320c0bee0..000000000000 --- a/packages/cloud_firestore/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/cloud_firestore/example/lib/main.dart b/packages/cloud_firestore/example/lib/main.dart deleted file mode 100755 index 30c1e2ce3036..000000000000 --- a/packages/cloud_firestore/example/lib/main.dart +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2017, 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'; - -import 'package:flutter/material.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:cloud_firestore/cloud_firestore.dart'; - -Future main() async { - final FirebaseApp app = await FirebaseApp.configure( - name: 'test', - options: const FirebaseOptions( - googleAppID: '1:79601577497:ios:5f2bcc6ba8cecddd', - gcmSenderID: '79601577497', - apiKey: 'AIzaSyArgmRGfB5kiQT6CunAOmKRVKEsxKmy6YI-G72PVU', - projectID: 'flutter-firestore', - ), - ); - final Firestore firestore = Firestore(app: app); - await firestore.settings(timestampsInSnapshotsEnabled: true); - - runApp(MaterialApp( - title: 'Firestore Example', home: MyHomePage(firestore: firestore))); -} - -class MessageList extends StatelessWidget { - MessageList({this.firestore}); - - final Firestore firestore; - - @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: firestore.collection('messages').snapshots(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (!snapshot.hasData) return const Text('Loading...'); - final int messageCount = snapshot.data.documents.length; - return ListView.builder( - itemCount: messageCount, - itemBuilder: (_, int index) { - final DocumentSnapshot document = snapshot.data.documents[index]; - final dynamic message = document['message']; - return ListTile( - title: Text( - message != null ? message.toString() : '', - ), - subtitle: Text('Message ${index + 1} of $messageCount'), - ); - }, - ); - }, - ); - } -} - -class MyHomePage extends StatelessWidget { - MyHomePage({this.firestore}); - - final Firestore firestore; - - CollectionReference get messages => firestore.collection('messages'); - - Future _addMessage() async { - await messages.add({ - 'message': 'Hello world!', - 'created_at': FieldValue.serverTimestamp(), - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Firestore Example'), - ), - body: MessageList(firestore: firestore), - floatingActionButton: FloatingActionButton( - onPressed: _addMessage, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), - ); - } -} diff --git a/packages/cloud_firestore/example/pubspec.yaml b/packages/cloud_firestore/example/pubspec.yaml deleted file mode 100755 index 004c491062e9..000000000000 --- a/packages/cloud_firestore/example/pubspec.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: firestore_example -description: Demonstrates how to use the firestore plugin. - -dependencies: - flutter: - sdk: flutter - cloud_firestore: - path: ../ - firebase_core: "^0.4.0" - -dev_dependencies: - flutter_driver: - sdk: flutter - test: any - -flutter: - uses-material-design: true diff --git a/packages/cloud_firestore/example/test_driver/cloud_firestore.dart b/packages/cloud_firestore/example/test_driver/cloud_firestore.dart deleted file mode 100644 index 2c984f7d6985..000000000000 --- a/packages/cloud_firestore/example/test_driver/cloud_firestore.dart +++ /dev/null @@ -1,297 +0,0 @@ -import 'dart:async'; - -import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$Firestore', () { - Firestore firestore; - Firestore firestoreWithSettings; - - setUp(() async { - final FirebaseOptions firebaseOptions = const FirebaseOptions( - googleAppID: '1:79601577497:ios:5f2bcc6ba8cecddd', - gcmSenderID: '79601577497', - apiKey: 'AIzaSyArgmRGfB5kiQT6CunAOmKRVKEsxKmy6YI-G72PVU', - projectID: 'flutter-firestore', - ); - final FirebaseApp app = await FirebaseApp.configure( - name: 'test', - options: firebaseOptions, - ); - final FirebaseApp app2 = await FirebaseApp.configure( - name: 'test2', - options: firebaseOptions, - ); - firestore = Firestore(app: app); - firestoreWithSettings = Firestore(app: app2); - await firestoreWithSettings.settings( - persistenceEnabled: true, - host: null, - sslEnabled: true, - timestampsInSnapshotsEnabled: true, - cacheSizeBytes: 1048576, - ); - }); - - test('getDocumentsWithFirestoreSettings', () async { - final Query query = firestoreWithSettings.collection('messages').limit(1); - final QuerySnapshot querySnapshot = await query.getDocuments(); - expect(querySnapshot.documents.length, 1); - }); - - test('getDocumentsFromCollection', () async { - final Query query = firestore - .collection('messages') - .where('message', isEqualTo: 'Hello world!') - .limit(1); - final QuerySnapshot querySnapshot = await query.getDocuments(); - expect(querySnapshot.metadata, isNotNull); - expect(querySnapshot.documents.first['message'], 'Hello world!'); - final DocumentReference firstDoc = - querySnapshot.documents.first.reference; - final DocumentSnapshot documentSnapshot = await firstDoc.get(); - expect(documentSnapshot.data['message'], 'Hello world!'); - final DocumentSnapshot cachedSnapshot = - await firstDoc.get(source: Source.cache); - expect(cachedSnapshot.data['message'], 'Hello world!'); - final DocumentSnapshot snapshot = await firstDoc.snapshots().first; - expect(snapshot.data['message'], 'Hello world!'); - }); - - test('getDocumentsFromCollectionGroup', () async { - final Query query = firestore - .collectionGroup('reviews') - .where('stars', isEqualTo: 5) - .limit(1); - final QuerySnapshot querySnapshot = await query.getDocuments(); - expect(querySnapshot.documents.first['stars'], 5); - expect(querySnapshot.metadata, isNotNull); - }); - - test('increment', () async { - final DocumentReference ref = firestore.collection('messages').document(); - await ref.setData({ - 'message': 1, - 'created_at': FieldValue.serverTimestamp(), - }); - DocumentSnapshot snapshot = await ref.get(); - expect(snapshot.data['message'], 1); - await ref.updateData({ - 'message': FieldValue.increment(1), - }); - snapshot = await ref.get(); - expect(snapshot.data['message'], 2); - await ref.updateData({ - 'message': FieldValue.increment(40.1), - }); - snapshot = await ref.get(); - expect(snapshot.data['message'], 42.1); - - // Call several times without awaiting the result - await Future.wait(List>.generate( - 3, - (int i) => ref.updateData({ - 'message': FieldValue.increment(i), - }), - )); - snapshot = await ref.get(); - expect(snapshot.data['message'], 45.1); - await ref.delete(); - }); - - test('includeMetadataChanges', () async { - final DocumentReference ref = firestore.collection('messages').document(); - final Stream snapshotWithoutMetadataChanges = - ref.snapshots(includeMetadataChanges: false).take(1); - final Stream snapshotsWithMetadataChanges = - ref.snapshots(includeMetadataChanges: true).take(3); - - ref.setData({'hello': 'world'}); - - final DocumentSnapshot snapshot = - await snapshotWithoutMetadataChanges.first; - expect(snapshot.metadata.hasPendingWrites, true); - expect(snapshot.metadata.isFromCache, true); - expect(snapshot.data['hello'], 'world'); - - final List snapshots = - await snapshotsWithMetadataChanges.toList(); - expect(snapshots[0].metadata.hasPendingWrites, true); - expect(snapshots[0].metadata.isFromCache, true); - expect(snapshots[0].data['hello'], 'world'); - expect(snapshots[1].metadata.hasPendingWrites, true); - expect(snapshots[1].metadata.isFromCache, false); - expect(snapshots[1].data['hello'], 'world'); - expect(snapshots[2].metadata.hasPendingWrites, false); - expect(snapshots[2].metadata.isFromCache, false); - expect(snapshots[2].data['hello'], 'world'); - - await ref.delete(); - }); - - test('runTransaction', () async { - final DocumentReference ref = firestore.collection('messages').document(); - await ref.setData({ - 'message': 'testing', - 'created_at': FieldValue.serverTimestamp(), - }); - final DocumentSnapshot initialSnapshot = await ref.get(); - expect(initialSnapshot.data['message'], 'testing'); - final dynamic result = await firestore.runTransaction( - (Transaction tx) async { - final DocumentSnapshot snapshot = await tx.get(ref); - final Map updatedData = - Map.from(snapshot.data); - updatedData['message'] = 'testing2'; - tx.update(ref, updatedData); // calling await here is optional - return updatedData; - }, - ); - expect(result['message'], 'testing2'); - - await ref.delete(); - final DocumentSnapshot nonexistentSnapshot = await ref.get(); - expect(nonexistentSnapshot.data, null); - expect(nonexistentSnapshot.exists, false); - }); - - test('pagination', () async { - // Populate the database with two test documents - final CollectionReference messages = firestore.collection('messages'); - final DocumentReference doc1 = messages.document(); - // Use document ID as a unique identifier to ensure that we don't - // collide with other tests running against this database. - final String testRun = doc1.documentID; - await doc1.setData({ - 'message': 'pagination testing1', - 'test_run': testRun, - 'created_at': FieldValue.serverTimestamp(), - }); - final DocumentSnapshot snapshot1 = await doc1.get(); - final DocumentReference doc2 = messages.document(); - await doc2.setData({ - 'message': 'pagination testing2', - 'test_run': testRun, - 'created_at': FieldValue.serverTimestamp(), - }); - final DocumentSnapshot snapshot2 = await doc2.get(); - - QuerySnapshot snapshot; - List results; - - // startAtDocument - snapshot = await messages - .orderBy('created_at') - .where('test_run', isEqualTo: testRun) - .startAtDocument(snapshot1) - .getDocuments(); - results = snapshot.documents; - expect(results.length, 2); - expect(results[0].data['message'], 'pagination testing1'); - expect(results[1].data['message'], 'pagination testing2'); - - // startAfterDocument - snapshot = await messages - .orderBy('created_at') - .where('test_run', isEqualTo: testRun) - .startAfterDocument(snapshot1) - .getDocuments(); - results = snapshot.documents; - expect(results.length, 1); - expect(results[0].data['message'], 'pagination testing2'); - - // endAtDocument - snapshot = await messages - .orderBy('created_at') - .where('test_run', isEqualTo: testRun) - .endAtDocument(snapshot2) - .getDocuments(); - results = snapshot.documents; - expect(results.length, 2); - expect(results[0].data['message'], 'pagination testing1'); - expect(results[1].data['message'], 'pagination testing2'); - - // endBeforeDocument - snapshot = await messages - .orderBy('created_at') - .where('test_run', isEqualTo: testRun) - .endBeforeDocument(snapshot2) - .getDocuments(); - results = snapshot.documents; - expect(results.length, 1); - expect(results[0].data['message'], 'pagination testing1'); - - // startAtDocument - endAtDocument - snapshot = await messages - .orderBy('created_at') - .where('test_run', isEqualTo: testRun) - .startAtDocument(snapshot1) - .endAtDocument(snapshot2) - .getDocuments(); - results = snapshot.documents; - expect(results.length, 2); - expect(results[0].data['message'], 'pagination testing1'); - expect(results[1].data['message'], 'pagination testing2'); - - // startAfterDocument - endBeforeDocument - snapshot = await messages - .orderBy('created_at') - .where('test_run', isEqualTo: testRun) - .startAfterDocument(snapshot1) - .endBeforeDocument(snapshot2) - .getDocuments(); - results = snapshot.documents; - expect(results.length, 0); - - // Clean up - await doc1.delete(); - await doc2.delete(); - }); - - test('pagination with map', () async { - // Populate the database with two test documents. - final CollectionReference messages = firestore.collection('messages'); - final DocumentReference doc1 = messages.document(); - // Use document ID as a unique identifier to ensure that we don't - // collide with other tests running against this database. - final String testRun = doc1.documentID; - await doc1.setData({ - 'cake': { - 'flavor': {'type': 1, 'test_run': testRun} - } - }); - - final DocumentSnapshot snapshot1 = await doc1.get(); - final DocumentReference doc2 = await messages.add({ - 'cake': { - 'flavor': {'type': 2, 'test_run': testRun} - } - }); - - QuerySnapshot snapshot; - List results; - - // One pagination call is enough as all of the pagination methods use the same method to get data internally. - snapshot = await messages - .orderBy('cake.flavor.type') - .where('cake.flavor.test_run', isEqualTo: testRun) - .startAtDocument(snapshot1) - .getDocuments(); - results = snapshot.documents; - - expect(results.length, 2); - expect(results[0].data['cake']['flavor']['type'], 1); - expect(results[1].data['cake']['flavor']['type'], 2); - - await doc1.delete(); - await doc2.delete(); - }); - }); -} diff --git a/packages/cloud_firestore/example/test_driver/cloud_firestore_test.dart b/packages/cloud_firestore/example/test_driver/cloud_firestore_test.dart deleted file mode 100644 index cc11eae240e3..000000000000 --- a/packages/cloud_firestore/example/test_driver/cloud_firestore_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; - -void main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/cloud_firestore/ios/Assets/.gitkeep b/packages/cloud_firestore/ios/Assets/.gitkeep deleted file mode 100755 index e69de29bb2d1..000000000000 diff --git a/packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.h b/packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.h deleted file mode 100644 index 3a9035a10fd9..000000000000 --- a/packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 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 - -@interface FLTCloudFirestorePlugin : NSObject -@end diff --git a/packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.m b/packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.m deleted file mode 100644 index 71c4232af682..000000000000 --- a/packages/cloud_firestore/ios/Classes/CloudFirestorePlugin.m +++ /dev/null @@ -1,668 +0,0 @@ -// Copyright 2017 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 "CloudFirestorePlugin.h" -#import "UserAgent.h" - -#import - -static FlutterError *getFlutterError(NSError *error) { - if (error == nil) return nil; - - return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %ld", error.code] - message:error.domain - details:error.localizedDescription]; -} - -static FIRFirestore *getFirestore(NSDictionary *arguments) { - FIRApp *app = [FIRApp appNamed:arguments[@"app"]]; - return [FIRFirestore firestoreForApp:app]; -} - -static FIRDocumentReference *getDocumentReference(NSDictionary *arguments) { - return [getFirestore(arguments) documentWithPath:arguments[@"path"]]; -} - -static NSArray *getDocumentValues(NSDictionary *document, NSArray *orderBy, - BOOL *isCollectionGroup) { - NSMutableArray *values = [[NSMutableArray alloc] init]; - NSDictionary *documentData = document[@"data"]; - if (orderBy) { - for (id item in orderBy) { - NSArray *orderByParameters = item; - NSString *fieldName = orderByParameters[0]; - if ([fieldName rangeOfString:@"."].location != NSNotFound) { - NSArray *fieldNameParts = [fieldName componentsSeparatedByString:@"."]; - NSDictionary *currentMap = [documentData objectForKey:[fieldNameParts objectAtIndex:0]]; - for (int i = 1; i < [fieldNameParts count] - 1; i++) { - currentMap = [currentMap objectForKey:[fieldNameParts objectAtIndex:i]]; - } - [values addObject:[currentMap objectForKey:[fieldNameParts - objectAtIndex:[fieldNameParts count] - 1]]]; - } else { - [values addObject:[documentData objectForKey:fieldName]]; - } - } - } - if (isCollectionGroup) { - NSString *path = document[@"path"]; - [values addObject:path]; - } else { - NSString *documentId = document[@"id"]; - [values addObject:documentId]; - } - return values; -} - -static FIRQuery *getQuery(NSDictionary *arguments) { - NSNumber *data = arguments[@"isCollectionGroup"]; - BOOL isCollectionGroup = data.boolValue; - FIRQuery *query; - if (isCollectionGroup) { - query = [getFirestore(arguments) collectionGroupWithID:arguments[@"path"]]; - } else { - query = [getFirestore(arguments) collectionWithPath:arguments[@"path"]]; - } - NSDictionary *parameters = arguments[@"parameters"]; - NSArray *whereConditions = parameters[@"where"]; - for (id item in whereConditions) { - NSArray *condition = item; - NSString *fieldName = condition[0]; - NSString *op = condition[1]; - id value = condition[2]; - if ([op isEqualToString:@"=="]) { - query = [query queryWhereField:fieldName isEqualTo:value]; - } else if ([op isEqualToString:@"<"]) { - query = [query queryWhereField:fieldName isLessThan:value]; - } else if ([op isEqualToString:@"<="]) { - query = [query queryWhereField:fieldName isLessThanOrEqualTo:value]; - } else if ([op isEqualToString:@">"]) { - query = [query queryWhereField:fieldName isGreaterThan:value]; - } else if ([op isEqualToString:@">="]) { - query = [query queryWhereField:fieldName isGreaterThanOrEqualTo:value]; - } else if ([op isEqualToString:@"array-contains"]) { - query = [query queryWhereField:fieldName arrayContains:value]; - } else { - // Unsupported operator - } - } - id limit = parameters[@"limit"]; - if (limit) { - NSNumber *length = limit; - query = [query queryLimitedTo:[length intValue]]; - } - NSArray *orderBy = parameters[@"orderBy"]; - if (orderBy) { - for (NSArray *orderByParameters in orderBy) { - NSString *fieldName = orderByParameters[0]; - NSNumber *descending = orderByParameters[1]; - query = [query queryOrderedByField:fieldName descending:[descending boolValue]]; - } - } - id startAt = parameters[@"startAt"]; - if (startAt) { - NSArray *startAtValues = startAt; - query = [query queryStartingAtValues:startAtValues]; - } - id startAtDocument = parameters[@"startAtDocument"]; - id startAfterDocument = parameters[@"startAfterDocument"]; - id endAtDocument = parameters[@"endAtDocument"]; - id endBeforeDocument = parameters[@"endBeforeDocument"]; - if (startAtDocument || startAfterDocument || endAtDocument || endBeforeDocument) { - NSArray *orderByParameters = [orderBy lastObject]; - NSNumber *descending = orderByParameters[1]; - query = [query queryOrderedByFieldPath:FIRFieldPath.documentID - descending:[descending boolValue]]; - } - if (startAtDocument) { - query = [query - queryStartingAtValues:getDocumentValues(startAtDocument, orderBy, isCollectionGroup)]; - } - id startAfter = parameters[@"startAfter"]; - if (startAfter) { - NSArray *startAfterValues = startAfter; - query = [query queryStartingAfterValues:startAfterValues]; - } - if (startAfterDocument) { - query = [query - queryStartingAfterValues:getDocumentValues(startAfterDocument, orderBy, isCollectionGroup)]; - } - id endAt = parameters[@"endAt"]; - if (endAt) { - NSArray *endAtValues = endAt; - query = [query queryEndingAtValues:endAtValues]; - } - if (endAtDocument) { - query = - [query queryEndingAtValues:getDocumentValues(endAtDocument, orderBy, isCollectionGroup)]; - } - id endBefore = parameters[@"endBefore"]; - if (endBefore) { - NSArray *endBeforeValues = endBefore; - query = [query queryEndingBeforeValues:endBeforeValues]; - } - if (endBeforeDocument) { - query = [query - queryEndingBeforeValues:getDocumentValues(endBeforeDocument, orderBy, isCollectionGroup)]; - } - return query; -} - -static FIRFirestoreSource getSource(NSDictionary *arguments) { - NSString *source = arguments[@"source"]; - if ([@"server" isEqualToString:source]) { - return FIRFirestoreSourceServer; - } - if ([@"cache" isEqualToString:source]) { - return FIRFirestoreSourceCache; - } - return FIRFirestoreSourceDefault; -} - -static NSDictionary *parseQuerySnapshot(FIRQuerySnapshot *snapshot) { - NSMutableArray *paths = [NSMutableArray array]; - NSMutableArray *documents = [NSMutableArray array]; - NSMutableArray *metadatas = [NSMutableArray array]; - for (FIRDocumentSnapshot *document in snapshot.documents) { - [paths addObject:document.reference.path]; - [documents addObject:document.data]; - [metadatas addObject:@{ - @"hasPendingWrites" : @(document.metadata.hasPendingWrites), - @"isFromCache" : @(document.metadata.isFromCache), - }]; - } - NSMutableArray *documentChanges = [NSMutableArray array]; - for (FIRDocumentChange *documentChange in snapshot.documentChanges) { - NSString *type; - switch (documentChange.type) { - case FIRDocumentChangeTypeAdded: - type = @"DocumentChangeType.added"; - break; - case FIRDocumentChangeTypeModified: - type = @"DocumentChangeType.modified"; - break; - case FIRDocumentChangeTypeRemoved: - type = @"DocumentChangeType.removed"; - break; - } - [documentChanges addObject:@{ - @"type" : type, - @"document" : documentChange.document.data, - @"path" : documentChange.document.reference.path, - @"oldIndex" : [NSNumber numberWithUnsignedInteger:documentChange.oldIndex], - @"newIndex" : [NSNumber numberWithUnsignedInteger:documentChange.newIndex], - @"metadata" : @{ - @"hasPendingWrites" : @(documentChange.document.metadata.hasPendingWrites), - @"isFromCache" : @(documentChange.document.metadata.isFromCache), - }, - }]; - } - return @{ - @"paths" : paths, - @"documentChanges" : documentChanges, - @"documents" : documents, - @"metadatas" : metadatas, - @"metadata" : @{ - @"hasPendingWrites" : @(snapshot.metadata.hasPendingWrites), - @"isFromCache" : @(snapshot.metadata.isFromCache), - } - }; -} - -const UInt8 DATE_TIME = 128; -const UInt8 GEO_POINT = 129; -const UInt8 DOCUMENT_REFERENCE = 130; -const UInt8 BLOB = 131; -const UInt8 ARRAY_UNION = 132; -const UInt8 ARRAY_REMOVE = 133; -const UInt8 DELETE = 134; -const UInt8 SERVER_TIMESTAMP = 135; -const UInt8 TIMESTAMP = 136; -const UInt8 INCREMENT_DOUBLE = 137; -const UInt8 INCREMENT_INTEGER = 138; - -@interface FirestoreWriter : FlutterStandardWriter -- (void)writeValue:(id)value; -@end - -@implementation FirestoreWriter : FlutterStandardWriter -- (void)writeValue:(id)value { - if ([value isKindOfClass:[NSDate class]]) { - [self writeByte:DATE_TIME]; - NSDate *date = value; - NSTimeInterval time = date.timeIntervalSince1970; - SInt64 ms = (SInt64)(time * 1000.0); - [self writeBytes:&ms length:8]; - } else if ([value isKindOfClass:[FIRTimestamp class]]) { - FIRTimestamp *timestamp = value; - SInt64 seconds = timestamp.seconds; - int nanoseconds = timestamp.nanoseconds; - [self writeByte:TIMESTAMP]; - [self writeBytes:(UInt8 *)&seconds length:8]; - [self writeBytes:(UInt8 *)&nanoseconds length:4]; - } else if ([value isKindOfClass:[FIRGeoPoint class]]) { - FIRGeoPoint *geoPoint = value; - Float64 latitude = geoPoint.latitude; - Float64 longitude = geoPoint.longitude; - [self writeByte:GEO_POINT]; - [self writeAlignment:8]; - [self writeBytes:(UInt8 *)&latitude length:8]; - [self writeBytes:(UInt8 *)&longitude length:8]; - } else if ([value isKindOfClass:[FIRDocumentReference class]]) { - FIRDocumentReference *document = value; - NSString *documentPath = [document path]; - [self writeByte:DOCUMENT_REFERENCE]; - [self writeUTF8:document.firestore.app.name]; - [self writeUTF8:documentPath]; - } else if ([value isKindOfClass:[NSData class]]) { - NSData *blob = value; - [self writeByte:BLOB]; - [self writeSize:(UInt32)blob.length]; - [self writeData:blob]; - } else { - [super writeValue:value]; - } -} -@end - -@interface FirestoreReader : FlutterStandardReader -- (id)readValueOfType:(UInt8)type; -@end - -@implementation FirestoreReader -- (id)readValueOfType:(UInt8)type { - switch (type) { - case DATE_TIME: { - SInt64 value; - [self readBytes:&value length:8]; - return [NSDate dateWithTimeIntervalSince1970:(value / 1000.0)]; - } - case TIMESTAMP: { - SInt64 seconds; - int nanoseconds; - [self readBytes:&seconds length:8]; - [self readBytes:&nanoseconds length:4]; - return [[FIRTimestamp alloc] initWithSeconds:seconds nanoseconds:nanoseconds]; - } - case GEO_POINT: { - Float64 latitude; - Float64 longitude; - [self readAlignment:8]; - [self readBytes:&latitude length:8]; - [self readBytes:&longitude length:8]; - return [[FIRGeoPoint alloc] initWithLatitude:latitude longitude:longitude]; - } - case DOCUMENT_REFERENCE: { - NSString *appName = [self readUTF8]; - FIRFirestore *firestore = [FIRFirestore firestoreForApp:[FIRApp appNamed:appName]]; - NSString *documentPath = [self readUTF8]; - return [firestore documentWithPath:documentPath]; - } - case BLOB: { - UInt32 elementCount = [self readSize]; - return [self readData:elementCount]; - } - case ARRAY_UNION: { - return [FIRFieldValue fieldValueForArrayUnion:[self readValue]]; - } - case ARRAY_REMOVE: { - return [FIRFieldValue fieldValueForArrayRemove:[self readValue]]; - } - case DELETE: { - return [FIRFieldValue fieldValueForDelete]; - } - case SERVER_TIMESTAMP: { - return [FIRFieldValue fieldValueForServerTimestamp]; - } - case INCREMENT_DOUBLE: { - NSNumber *value = [self readValue]; - return [FIRFieldValue fieldValueForDoubleIncrement:value.doubleValue]; - } - case INCREMENT_INTEGER: { - NSNumber *value = [self readValue]; - return [FIRFieldValue fieldValueForIntegerIncrement:value.intValue]; - } - default: - return [super readValueOfType:type]; - } -} -@end - -@interface FirestoreReaderWriter : FlutterStandardReaderWriter -- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data; -- (FlutterStandardReader *)readerWithData:(NSData *)data; -@end - -@implementation FirestoreReaderWriter -- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { - return [[FirestoreWriter alloc] initWithData:data]; -} -- (FlutterStandardReader *)readerWithData:(NSData *)data { - return [[FirestoreReader alloc] initWithData:data]; -} -@end - -@interface FLTCloudFirestorePlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FLTCloudFirestorePlugin { - NSMutableDictionary> *_listeners; - int _nextListenerHandle; - NSMutableDictionary *transactions; - NSMutableDictionary *transactionResults; - NSMutableDictionary *_batches; - int _nextBatchHandle; -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FirestoreReaderWriter *firestoreReaderWriter = [FirestoreReaderWriter new]; - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/cloud_firestore" - binaryMessenger:[registrar messenger] - codec:[FlutterStandardMethodCodec - codecWithReaderWriter:firestoreReaderWriter]]; - FLTCloudFirestorePlugin *instance = [[FLTCloudFirestorePlugin alloc] init]; - instance.channel = channel; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - _listeners = [NSMutableDictionary> dictionary]; - _batches = [NSMutableDictionary dictionary]; - _nextListenerHandle = 0; - _nextBatchHandle = 0; - transactions = [NSMutableDictionary dictionary]; - transactionResults = [NSMutableDictionary dictionary]; - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - __weak __typeof__(self) weakSelf = self; - void (^defaultCompletionBlock)(NSError *) = ^(NSError *error) { - result(getFlutterError(error)); - }; - if ([@"Firestore#runTransaction" isEqualToString:call.method]) { - [getFirestore(call.arguments) - runTransactionWithBlock:^id(FIRTransaction *transaction, NSError **pError) { - NSNumber *transactionId = call.arguments[@"transactionId"]; - NSNumber *transactionTimeout = call.arguments[@"transactionTimeout"]; - - self->transactions[transactionId] = transaction; - - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - - [weakSelf.channel invokeMethod:@"DoTransaction" - arguments:call.arguments - result:^(id doTransactionResult) { - FLTCloudFirestorePlugin *currentSelf = weakSelf; - currentSelf->transactionResults[transactionId] = - doTransactionResult; - dispatch_semaphore_signal(semaphore); - }]; - - dispatch_semaphore_wait( - semaphore, - dispatch_time(DISPATCH_TIME_NOW, [transactionTimeout integerValue] * 1000000)); - - return self->transactionResults[transactionId]; - } - completion:^(id transactionResult, NSError *error) { - if (error != nil) { - result([FlutterError errorWithCode:[NSString stringWithFormat:@"%ld", error.code] - message:error.localizedDescription - details:nil]); - } - result(transactionResult); - }]; - } else if ([@"Transaction#get" isEqualToString:call.method]) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSNumber *transactionId = call.arguments[@"transactionId"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRTransaction *transaction = self->transactions[transactionId]; - NSError *error = [[NSError alloc] init]; - - FIRDocumentSnapshot *snapshot = [transaction getDocument:document error:&error]; - - if (error != nil) { - result([FlutterError errorWithCode:[NSString stringWithFormat:@"%tu", [error code]] - message:[error localizedDescription] - details:nil]); - } else if (snapshot != nil) { - result(@{ - @"path" : snapshot.reference.path, - @"data" : snapshot.exists ? snapshot.data : [NSNull null], - @"metadata" : @{ - @"hasPendingWrites" : @(snapshot.metadata.hasPendingWrites), - @"isFromCache" : @(snapshot.metadata.isFromCache), - }, - }); - } else { - result(nil); - } - }); - } else if ([@"Transaction#update" isEqualToString:call.method]) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSNumber *transactionId = call.arguments[@"transactionId"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRTransaction *transaction = self->transactions[transactionId]; - - [transaction updateData:call.arguments[@"data"] forDocument:document]; - result(nil); - }); - } else if ([@"Transaction#set" isEqualToString:call.method]) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSNumber *transactionId = call.arguments[@"transactionId"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRTransaction *transaction = self->transactions[transactionId]; - - [transaction setData:call.arguments[@"data"] forDocument:document]; - result(nil); - }); - } else if ([@"Transaction#delete" isEqualToString:call.method]) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSNumber *transactionId = call.arguments[@"transactionId"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRTransaction *transaction = self->transactions[transactionId]; - - [transaction deleteDocument:document]; - result(nil); - }); - } else if ([@"DocumentReference#setData" isEqualToString:call.method]) { - NSDictionary *options = call.arguments[@"options"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - if (![options isEqual:[NSNull null]] && - [options[@"merge"] isEqual:[NSNumber numberWithBool:YES]]) { - [document setData:call.arguments[@"data"] merge:YES completion:defaultCompletionBlock]; - } else { - [document setData:call.arguments[@"data"] completion:defaultCompletionBlock]; - } - } else if ([@"DocumentReference#updateData" isEqualToString:call.method]) { - FIRDocumentReference *document = getDocumentReference(call.arguments); - [document updateData:call.arguments[@"data"] completion:defaultCompletionBlock]; - } else if ([@"DocumentReference#delete" isEqualToString:call.method]) { - FIRDocumentReference *document = getDocumentReference(call.arguments); - [document deleteDocumentWithCompletion:defaultCompletionBlock]; - } else if ([@"DocumentReference#get" isEqualToString:call.method]) { - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRFirestoreSource source = getSource(call.arguments); - [document - getDocumentWithSource:source - completion:^(FIRDocumentSnapshot *_Nullable snapshot, NSError *_Nullable error) { - if (snapshot == nil) { - result(getFlutterError(error)); - } else { - result(@{ - @"path" : snapshot.reference.path, - @"data" : snapshot.exists ? snapshot.data : [NSNull null], - @"metadata" : @{ - @"hasPendingWrites" : @(snapshot.metadata.hasPendingWrites), - @"isFromCache" : @(snapshot.metadata.isFromCache), - }, - }); - } - }]; - } else if ([@"Query#addSnapshotListener" isEqualToString:call.method]) { - __block NSNumber *handle = [NSNumber numberWithInt:_nextListenerHandle++]; - FIRQuery *query; - @try { - query = getQuery(call.arguments); - } @catch (NSException *exception) { - result([FlutterError errorWithCode:@"invalid_query" - message:[exception name] - details:[exception reason]]); - } - NSNumber *includeMetadataChanges = call.arguments[@"includeMetadataChanges"]; - id listener = [query - addSnapshotListenerWithIncludeMetadataChanges:includeMetadataChanges.boolValue - listener:^(FIRQuerySnapshot *_Nullable snapshot, - NSError *_Nullable error) { - if (snapshot == nil) { - result(getFlutterError(error)); - return; - } - NSMutableDictionary *arguments = - [parseQuerySnapshot(snapshot) mutableCopy]; - [arguments setObject:handle forKey:@"handle"]; - [weakSelf.channel invokeMethod:@"QuerySnapshot" - arguments:arguments]; - }]; - _listeners[handle] = listener; - result(handle); - } else if ([@"DocumentReference#addSnapshotListener" isEqualToString:call.method]) { - __block NSNumber *handle = [NSNumber numberWithInt:_nextListenerHandle++]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - NSNumber *includeMetadataChanges = call.arguments[@"includeMetadataChanges"]; - id listener = [document - addSnapshotListenerWithIncludeMetadataChanges:includeMetadataChanges.boolValue - listener:^(FIRDocumentSnapshot *snapshot, - NSError *_Nullable error) { - if (snapshot == nil) { - result(getFlutterError(error)); - return; - } - [weakSelf.channel - invokeMethod:@"DocumentSnapshot" - arguments:@{ - @"handle" : handle, - @"path" : snapshot ? snapshot.reference.path - : [NSNull null], - @"data" : snapshot.exists ? snapshot.data - : [NSNull null], - @"metadata" : snapshot ? @{ - @"hasPendingWrites" : - @(snapshot.metadata.hasPendingWrites), - @"isFromCache" : - @(snapshot.metadata.isFromCache), - } - : [NSNull null], - }]; - }]; - _listeners[handle] = listener; - result(handle); - } else if ([@"Query#getDocuments" isEqualToString:call.method]) { - FIRQuery *query; - FIRFirestoreSource source = getSource(call.arguments); - @try { - query = getQuery(call.arguments); - } @catch (NSException *exception) { - result([FlutterError errorWithCode:@"invalid_query" - message:[exception name] - details:[exception reason]]); - } - - [query - getDocumentsWithSource:source - completion:^(FIRQuerySnapshot *_Nullable snapshot, NSError *_Nullable error) { - if (snapshot == nil) { - result(getFlutterError(error)); - return; - } - result(parseQuerySnapshot(snapshot)); - }]; - } else if ([@"removeListener" isEqualToString:call.method]) { - NSNumber *handle = call.arguments[@"handle"]; - [[_listeners objectForKey:handle] remove]; - [_listeners removeObjectForKey:handle]; - result(nil); - } else if ([@"WriteBatch#create" isEqualToString:call.method]) { - __block NSNumber *handle = [NSNumber numberWithInt:_nextBatchHandle++]; - FIRWriteBatch *batch = [getFirestore(call.arguments) batch]; - _batches[handle] = batch; - result(handle); - } else if ([@"WriteBatch#setData" isEqualToString:call.method]) { - NSNumber *handle = call.arguments[@"handle"]; - NSDictionary *options = call.arguments[@"options"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRWriteBatch *batch = [_batches objectForKey:handle]; - if (![options isEqual:[NSNull null]] && - [options[@"merge"] isEqual:[NSNumber numberWithBool:YES]]) { - [batch setData:call.arguments[@"data"] forDocument:document merge:YES]; - } else { - [batch setData:call.arguments[@"data"] forDocument:document]; - } - result(nil); - } else if ([@"WriteBatch#updateData" isEqualToString:call.method]) { - NSNumber *handle = call.arguments[@"handle"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRWriteBatch *batch = [_batches objectForKey:handle]; - [batch updateData:call.arguments[@"data"] forDocument:document]; - result(nil); - } else if ([@"WriteBatch#delete" isEqualToString:call.method]) { - NSNumber *handle = call.arguments[@"handle"]; - FIRDocumentReference *document = getDocumentReference(call.arguments); - FIRWriteBatch *batch = [_batches objectForKey:handle]; - [batch deleteDocument:document]; - result(nil); - } else if ([@"WriteBatch#commit" isEqualToString:call.method]) { - NSNumber *handle = call.arguments[@"handle"]; - FIRWriteBatch *batch = [_batches objectForKey:handle]; - [batch commitWithCompletion:defaultCompletionBlock]; - [_batches removeObjectForKey:handle]; - } else if ([@"Firestore#enablePersistence" isEqualToString:call.method]) { - bool enable = (bool)call.arguments[@"enable"]; - FIRFirestoreSettings *settings = [[FIRFirestoreSettings alloc] init]; - settings.persistenceEnabled = enable; - FIRFirestore *db = getFirestore(call.arguments); - db.settings = settings; - result(nil); - } else if ([@"Firestore#settings" isEqualToString:call.method]) { - FIRFirestoreSettings *settings = [[FIRFirestoreSettings alloc] init]; - if (![call.arguments[@"persistenceEnabled"] isEqual:[NSNull null]]) { - settings.persistenceEnabled = (bool)call.arguments[@"persistenceEnabled"]; - } - if (![call.arguments[@"host"] isEqual:[NSNull null]]) { - settings.host = (NSString *)call.arguments[@"host"]; - } - if (![call.arguments[@"sslEnabled"] isEqual:[NSNull null]]) { - settings.sslEnabled = (bool)call.arguments[@"sslEnabled"]; - } - if (![call.arguments[@"timestampsInSnapshotsEnabled"] isEqual:[NSNull null]]) { - settings.timestampsInSnapshotsEnabled = (bool)call.arguments[@"timestampsInSnapshotsEnabled"]; - } - if (![call.arguments[@"cacheSizeBytes"] isEqual:[NSNull null]]) { - settings.cacheSizeBytes = ((NSNumber *)call.arguments[@"cacheSizeBytes"]).intValue; - } - FIRFirestore *db = getFirestore(call.arguments); - db.settings = settings; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -@end diff --git a/packages/cloud_firestore/ios/cloud_firestore.podspec b/packages/cloud_firestore/ios/cloud_firestore.podspec deleted file mode 100755 index 8b4f4e8b917d..000000000000 --- a/packages/cloud_firestore/ios/cloud_firestore.podspec +++ /dev/null @@ -1,32 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'cloud_firestore' - s.version = '0.0.1' - s.summary = 'Firestore plugin for Flutter.' - s.description = <<-DESC -Firestore plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/firestore' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/Firestore', '~> 6.0' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-fst\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/cloud_firestore/lib/cloud_firestore.dart b/packages/cloud_firestore/lib/cloud_firestore.dart deleted file mode 100755 index fba72b049cb6..000000000000 --- a/packages/cloud_firestore/lib/cloud_firestore.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2017, 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. - -library cloud_firestore; - -import 'dart:async'; -import 'dart:convert'; -import 'dart:typed_data'; -import 'dart:ui' show hashValues, hashList; - -import 'package:collection/collection.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -import 'src/utils/auto_id_generator.dart'; - -part 'src/blob.dart'; -part 'src/collection_reference.dart'; -part 'src/document_change.dart'; -part 'src/document_reference.dart'; -part 'src/document_snapshot.dart'; -part 'src/field_value.dart'; -part 'src/firestore.dart'; -part 'src/firestore_message_codec.dart'; -part 'src/geo_point.dart'; -part 'src/query.dart'; -part 'src/query_snapshot.dart'; -part 'src/snapshot_metadata.dart'; -part 'src/timestamp.dart'; -part 'src/transaction.dart'; -part 'src/write_batch.dart'; -part 'src/source.dart'; diff --git a/packages/cloud_firestore/lib/src/blob.dart b/packages/cloud_firestore/lib/src/blob.dart deleted file mode 100644 index 665efead5622..000000000000 --- a/packages/cloud_firestore/lib/src/blob.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, 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. - -part of cloud_firestore; - -class Blob { - const Blob(this.bytes); - - final Uint8List bytes; - - @override - bool operator ==(dynamic other) => - other is Blob && - const DeepCollectionEquality().equals(other.bytes, bytes); - - @override - int get hashCode => hashList(bytes); -} diff --git a/packages/cloud_firestore/lib/src/collection_reference.dart b/packages/cloud_firestore/lib/src/collection_reference.dart deleted file mode 100644 index f1de3a8ba4b9..000000000000 --- a/packages/cloud_firestore/lib/src/collection_reference.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// A CollectionReference object can be used for adding documents, getting -/// document references, and querying for documents (using the methods -/// inherited from [Query]). -class CollectionReference extends Query { - CollectionReference._(Firestore firestore, List pathComponents) - : super._(firestore: firestore, pathComponents: pathComponents); - - /// ID of the referenced collection. - String get id => _pathComponents.isEmpty ? null : _pathComponents.last; - - /// For subcollections, parent returns the containing [DocumentReference]. - /// - /// For root collections, null is returned. - DocumentReference parent() { - if (_pathComponents.length < 2) { - return null; - } - return DocumentReference._( - firestore, - (List.from(_pathComponents)..removeLast()), - ); - } - - /// A string containing the slash-separated path to this CollectionReference - /// (relative to the root of the database). - String get path => _path; - - /// Returns a `DocumentReference` with the provided path. - /// - /// If no [path] is provided, an auto-generated ID is used. - /// - /// The unique key generated is prefixed with a client-generated timestamp - /// so that the resulting list will be chronologically-sorted. - DocumentReference document([String path]) { - List childPath; - if (path == null) { - final String key = AutoIdGenerator.autoId(); - childPath = List.from(_pathComponents)..add(key); - } else { - childPath = List.from(_pathComponents)..addAll(path.split(('/'))); - } - return DocumentReference._(firestore, childPath); - } - - /// Returns a `DocumentReference` with an auto-generated ID, after - /// populating it with provided [data]. - /// - /// The unique key generated is prefixed with a client-generated timestamp - /// so that the resulting list will be chronologically-sorted. - Future add(Map data) async { - final DocumentReference newDocument = document(); - await newDocument.setData(data); - return newDocument; - } -} diff --git a/packages/cloud_firestore/lib/src/document_change.dart b/packages/cloud_firestore/lib/src/document_change.dart deleted file mode 100644 index 8409d512a43e..000000000000 --- a/packages/cloud_firestore/lib/src/document_change.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// An enumeration of document change types. -enum DocumentChangeType { - /// Indicates a new document was added to the set of documents matching the - /// query. - added, - - /// Indicates a document within the query was modified. - modified, - - /// Indicates a document within the query was removed (either deleted or no - /// longer matches the query. - removed, -} - -/// A DocumentChange represents a change to the documents matching a query. -/// -/// It contains the document affected and the type of change that occurred -/// (added, modified, or removed). -class DocumentChange { - DocumentChange._(Map data, this._firestore) - : oldIndex = data['oldIndex'], - newIndex = data['newIndex'], - document = DocumentSnapshot._( - data['path'], - _asStringKeyedMap(data['document']), - SnapshotMetadata._(data["metadata"]["hasPendingWrites"], - data["metadata"]["isFromCache"]), - _firestore, - ), - type = DocumentChangeType.values.firstWhere((DocumentChangeType type) { - return type.toString() == data['type']; - }); - - final Firestore _firestore; - - /// The type of change that occurred (added, modified, or removed). - final DocumentChangeType type; - - /// The index of the changed document in the result set immediately prior to - /// this [DocumentChange] (i.e. supposing that all prior DocumentChange objects - /// have been applied). - /// - /// -1 for [DocumentChangeType.added] events. - final int oldIndex; - - /// The index of the changed document in the result set immediately after this - /// DocumentChange (i.e. supposing that all prior [DocumentChange] objects - /// and the current [DocumentChange] object have been applied). - /// - /// -1 for [DocumentChangeType.removed] events. - final int newIndex; - - /// The document affected by this change. - final DocumentSnapshot document; -} diff --git a/packages/cloud_firestore/lib/src/document_reference.dart b/packages/cloud_firestore/lib/src/document_reference.dart deleted file mode 100644 index 413cf41be0be..000000000000 --- a/packages/cloud_firestore/lib/src/document_reference.dart +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// A [DocumentReference] refers to a document location in a Firestore database -/// and can be used to write, read, or listen to the location. -/// -/// The document at the referenced location may or may not exist. -/// A [DocumentReference] can also be used to create a [CollectionReference] -/// to a subcollection. -class DocumentReference { - DocumentReference._(this.firestore, List pathComponents) - : _pathComponents = pathComponents, - assert(firestore != null); - - /// The Firestore instance associated with this document reference - final Firestore firestore; - - final List _pathComponents; - - @override - bool operator ==(dynamic o) => - o is DocumentReference && o.firestore == firestore && o.path == path; - - @override - int get hashCode => hashList(_pathComponents); - - /// Parent returns the containing [CollectionReference]. - CollectionReference parent() { - return CollectionReference._( - firestore, - (List.from(_pathComponents)..removeLast()), - ); - } - - /// Slash-delimited path representing the database location of this query. - String get path => _pathComponents.join('/'); - - /// This document's given or generated ID in the collection. - String get documentID => _pathComponents.last; - - /// Writes to the document referred to by this [DocumentReference]. - /// - /// If the document does not yet exist, it will be created. - /// - /// If [merge] is true, the provided data will be merged into an - /// existing document instead of overwriting. - Future setData(Map data, {bool merge = false}) { - return Firestore.channel.invokeMethod( - 'DocumentReference#setData', - { - 'app': firestore.app.name, - 'path': path, - 'data': data, - 'options': {'merge': merge}, - }, - ); - } - - /// Updates fields in the document referred to by this [DocumentReference]. - /// - /// Values in [data] may be of any supported Firestore type as well as - /// special sentinel [FieldValue] type. - /// - /// If no document exists yet, the update will fail. - Future updateData(Map data) { - return Firestore.channel.invokeMethod( - 'DocumentReference#updateData', - { - 'app': firestore.app.name, - 'path': path, - 'data': data, - }, - ); - } - - /// Reads the document referenced by this [DocumentReference]. - /// - /// If no document exists, the read will return null. - Future get({Source source = Source.serverAndCache}) async { - final Map data = - await Firestore.channel.invokeMapMethod( - 'DocumentReference#get', - { - 'app': firestore.app.name, - 'path': path, - 'source': _getSourceString(source), - }, - ); - return DocumentSnapshot._( - data['path'], - _asStringKeyedMap(data['data']), - SnapshotMetadata._(data['metadata']['hasPendingWrites'], - data['metadata']['isFromCache']), - firestore, - ); - } - - /// Deletes the document referred to by this [DocumentReference]. - Future delete() { - return Firestore.channel.invokeMethod( - 'DocumentReference#delete', - {'app': firestore.app.name, 'path': path}, - ); - } - - /// Returns the reference of a collection contained inside of this - /// document. - CollectionReference collection(String collectionPath) { - return firestore.collection( - [path, collectionPath].join('/'), - ); - } - - /// Notifies of documents at this location - // TODO(jackson): Reduce code duplication with [Query] - Stream snapshots({bool includeMetadataChanges = false}) { - assert(includeMetadataChanges != null); - Future _handle; - // It's fine to let the StreamController be garbage collected once all the - // subscribers have cancelled; this analyzer warning is safe to ignore. - StreamController controller; // ignore: close_sinks - controller = StreamController.broadcast( - onListen: () { - _handle = Firestore.channel.invokeMethod( - 'DocumentReference#addSnapshotListener', - { - 'app': firestore.app.name, - 'path': path, - 'includeMetadataChanges': includeMetadataChanges, - }, - ).then((dynamic result) => result); - _handle.then((int handle) { - Firestore._documentObservers[handle] = controller; - }); - }, - onCancel: () { - _handle.then((int handle) async { - await Firestore.channel.invokeMethod( - 'removeListener', - {'handle': handle}, - ); - Firestore._documentObservers.remove(handle); - }); - }, - ); - return controller.stream; - } -} diff --git a/packages/cloud_firestore/lib/src/document_snapshot.dart b/packages/cloud_firestore/lib/src/document_snapshot.dart deleted file mode 100644 index 45508566674a..000000000000 --- a/packages/cloud_firestore/lib/src/document_snapshot.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// A DocumentSnapshot contains data read from a document in your Firestore -/// database. -/// -/// The data can be extracted with the data property or by using subscript -/// syntax to access a specific field. -class DocumentSnapshot { - DocumentSnapshot._(this._path, this.data, this.metadata, this._firestore); - - final String _path; - final Firestore _firestore; - - /// The reference that produced this snapshot - DocumentReference get reference => _firestore.document(_path); - - /// Contains all the data of this snapshot - final Map data; - - /// Metadata about this snapshot concerning its source and if it has local - /// modifications. - final SnapshotMetadata metadata; - - /// Reads individual values from the snapshot - dynamic operator [](String key) => data[key]; - - /// Returns the ID of the snapshot's document - String get documentID => _path.split('/').last; - - /// Returns `true` if the document exists. - bool get exists => data != null; -} - -Map _asStringKeyedMap(Map map) { - if (map == null) return null; - if (map is Map) { - return map; - } else { - return Map.from(map); - } -} diff --git a/packages/cloud_firestore/lib/src/field_value.dart b/packages/cloud_firestore/lib/src/field_value.dart deleted file mode 100644 index 4ab12b0411f3..000000000000 --- a/packages/cloud_firestore/lib/src/field_value.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -@visibleForTesting -enum FieldValueType { - arrayUnion, - arrayRemove, - delete, - serverTimestamp, - incrementDouble, - incrementInteger, -} - -/// Sentinel values that can be used when writing document fields with set() or -/// update(). -class FieldValue { - FieldValue._(this.type, this.value); - - @visibleForTesting - final FieldValueType type; - - @visibleForTesting - final dynamic value; - - /// Returns a special value that tells the server to union the given elements - /// with any array value that already exists on the server. - /// - /// Each specified element that doesn't already exist in the array will be - /// added to the end. If the field being modified is not already an array it - /// will be overwritten with an array containing exactly the specified - /// elements. - static FieldValue arrayUnion(List elements) => - FieldValue._(FieldValueType.arrayUnion, elements); - - /// Returns a special value that tells the server to remove the given - /// elements from any array value that already exists on the server. - /// - /// All instances of each element specified will be removed from the array. - /// If the field being modified is not already an array it will be overwritten - /// with an empty array. - static FieldValue arrayRemove(List elements) => - FieldValue._(FieldValueType.arrayRemove, elements); - - /// Returns a sentinel for use with update() to mark a field for deletion. - static FieldValue delete() => FieldValue._(FieldValueType.delete, null); - - /// Returns a sentinel for use with set() or update() to include a - /// server-generated timestamp in the written data. - static FieldValue serverTimestamp() => - FieldValue._(FieldValueType.serverTimestamp, null); - - /// Returns a special value for use with set() or update() that tells the - /// server to increment the field’s current value by the given value. - static FieldValue increment(num value) { - // It is a compile-time error for any type other than int or double to - // attempt to extend or implement num. - assert(value is int || value is double); - if (value is double) { - return FieldValue._(FieldValueType.incrementDouble, value); - } else if (value is int) { - return FieldValue._(FieldValueType.incrementInteger, value); - } - return null; - } -} diff --git a/packages/cloud_firestore/lib/src/firestore.dart b/packages/cloud_firestore/lib/src/firestore.dart deleted file mode 100644 index c2fa17720995..000000000000 --- a/packages/cloud_firestore/lib/src/firestore.dart +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// The entry point for accessing a Firestore. -/// -/// You can get an instance by calling [Firestore.instance]. -class Firestore { - Firestore({FirebaseApp app}) : app = app ?? FirebaseApp.instance { - if (_initialized) return; - channel.setMethodCallHandler((MethodCall call) async { - if (call.method == 'QuerySnapshot') { - final QuerySnapshot snapshot = QuerySnapshot._(call.arguments, this); - _queryObservers[call.arguments['handle']].add(snapshot); - } else if (call.method == 'DocumentSnapshot') { - final DocumentSnapshot snapshot = DocumentSnapshot._( - call.arguments['path'], - _asStringKeyedMap(call.arguments['data']), - SnapshotMetadata._(call.arguments['metadata']['hasPendingWrites'], - call.arguments['metadata']['isFromCache']), - this, - ); - _documentObservers[call.arguments['handle']].add(snapshot); - } else if (call.method == 'DoTransaction') { - final int transactionId = call.arguments['transactionId']; - final Transaction transaction = Transaction(transactionId, this); - final dynamic result = - await _transactionHandlers[transactionId](transaction); - await transaction._finish(); - return result; - } - }); - _initialized = true; - } - - /// Gets the instance of Firestore for the default Firebase app. - static final Firestore instance = Firestore(); - - /// The [FirebaseApp] instance to which this [FirebaseDatabase] belongs. - /// - /// If null, the default [FirebaseApp] is used. - final FirebaseApp app; - - static bool _initialized = false; - - @visibleForTesting - static const MethodChannel channel = MethodChannel( - 'plugins.flutter.io/cloud_firestore', - StandardMethodCodec(FirestoreMessageCodec()), - ); - - static final Map> _queryObservers = - >{}; - - static final Map> _documentObservers = - >{}; - - static final Map _transactionHandlers = - {}; - static int _transactionHandlerId = 0; - - @override - bool operator ==(dynamic o) => o is Firestore && o.app == app; - - @override - int get hashCode => app.hashCode; - - /// Gets a [CollectionReference] for the specified Firestore path. - CollectionReference collection(String path) { - assert(path != null); - return CollectionReference._(this, path.split('/')); - } - - /// Gets a [Query] for the specified collection group. - Query collectionGroup(String path) { - assert(path != null); - assert(!path.contains("/"), "Collection IDs must not contain '/'."); - return Query._( - firestore: this, - isCollectionGroup: true, - pathComponents: path.split('/'), - ); - } - - /// Gets a [DocumentReference] for the specified Firestore path. - DocumentReference document(String path) { - assert(path != null); - return DocumentReference._(this, path.split('/')); - } - - /// Creates a write batch, used for performing multiple writes as a single - /// atomic operation. - /// - /// Unlike transactions, write batches are persisted offline and therefore are - /// preferable when you don’t need to condition your writes on read data. - WriteBatch batch() => WriteBatch._(this); - - /// Executes the given TransactionHandler and then attempts to commit the - /// changes applied within an atomic transaction. - /// - /// In the TransactionHandler, a set of reads and writes can be performed - /// atomically using the Transaction object passed to the TransactionHandler. - /// After the TransactionHandler is run, Firestore will attempt to apply the - /// changes to the server. If any of the data read has been modified outside - /// of this transaction since being read, then the transaction will be - /// retried by executing the updateBlock again. If the transaction still - /// fails after 5 retries, then the transaction will fail. - /// - /// The TransactionHandler may be executed multiple times, it should be able - /// to handle multiple executions. - /// - /// Data accessed with the transaction will not reflect local changes that - /// have not been committed. For this reason, it is required that all - /// reads are performed before any writes. Transactions must be performed - /// while online. Otherwise, reads will fail, and the final commit will fail. - /// - /// By default transactions are limited to 5 seconds of execution time. This - /// timeout can be adjusted by setting the timeout parameter. - Future> runTransaction( - TransactionHandler transactionHandler, - {Duration timeout = const Duration(seconds: 5)}) async { - assert(timeout.inMilliseconds > 0, - 'Transaction timeout must be more than 0 milliseconds'); - final int transactionId = _transactionHandlerId++; - _transactionHandlers[transactionId] = transactionHandler; - final Map result = await channel - .invokeMapMethod( - 'Firestore#runTransaction', { - 'app': app.name, - 'transactionId': transactionId, - 'transactionTimeout': timeout.inMilliseconds - }); - return result ?? {}; - } - - @deprecated - Future enablePersistence(bool enable) async { - assert(enable != null); - await channel - .invokeMethod('Firestore#enablePersistence', { - 'app': app.name, - 'enable': enable, - }); - } - - Future settings( - {bool persistenceEnabled, - String host, - bool sslEnabled, - bool timestampsInSnapshotsEnabled, - int cacheSizeBytes}) async { - await channel.invokeMethod('Firestore#settings', { - 'app': app.name, - 'persistenceEnabled': persistenceEnabled, - 'host': host, - 'sslEnabled': sslEnabled, - 'timestampsInSnapshotsEnabled': timestampsInSnapshotsEnabled, - 'cacheSizeBytes': cacheSizeBytes, - }); - } -} diff --git a/packages/cloud_firestore/lib/src/firestore_message_codec.dart b/packages/cloud_firestore/lib/src/firestore_message_codec.dart deleted file mode 100644 index 14f6e020675c..000000000000 --- a/packages/cloud_firestore/lib/src/firestore_message_codec.dart +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -@visibleForTesting -class FirestoreMessageCodec extends StandardMessageCodec { - const FirestoreMessageCodec(); - - static const int _kDateTime = 128; - static const int _kGeoPoint = 129; - static const int _kDocumentReference = 130; - static const int _kBlob = 131; - static const int _kArrayUnion = 132; - static const int _kArrayRemove = 133; - static const int _kDelete = 134; - static const int _kServerTimestamp = 135; - static const int _kTimestamp = 136; - static const int _kIncrementDouble = 137; - static const int _kIncrementInteger = 138; - - static const Map _kFieldValueCodes = - { - FieldValueType.arrayUnion: _kArrayUnion, - FieldValueType.arrayRemove: _kArrayRemove, - FieldValueType.delete: _kDelete, - FieldValueType.serverTimestamp: _kServerTimestamp, - FieldValueType.incrementDouble: _kIncrementDouble, - FieldValueType.incrementInteger: _kIncrementInteger, - }; - - @override - void writeValue(WriteBuffer buffer, dynamic value) { - if (value is DateTime) { - buffer.putUint8(_kDateTime); - buffer.putInt64(value.millisecondsSinceEpoch); - } else if (value is Timestamp) { - buffer.putUint8(_kTimestamp); - buffer.putInt64(value.seconds); - buffer.putInt32(value.nanoseconds); - } else if (value is GeoPoint) { - buffer.putUint8(_kGeoPoint); - buffer.putFloat64(value.latitude); - buffer.putFloat64(value.longitude); - } else if (value is DocumentReference) { - buffer.putUint8(_kDocumentReference); - final List appName = utf8.encoder.convert(value.firestore.app.name); - writeSize(buffer, appName.length); - buffer.putUint8List(appName); - final List bytes = utf8.encoder.convert(value.path); - writeSize(buffer, bytes.length); - buffer.putUint8List(bytes); - } else if (value is Blob) { - buffer.putUint8(_kBlob); - writeSize(buffer, value.bytes.length); - buffer.putUint8List(value.bytes); - } else if (value is FieldValue) { - final int code = _kFieldValueCodes[value.type]; - assert(code != null); - buffer.putUint8(code); - if (value.value != null) writeValue(buffer, value.value); - } else { - super.writeValue(buffer, value); - } - } - - @override - dynamic readValueOfType(int type, ReadBuffer buffer) { - switch (type) { - case _kDateTime: - return DateTime.fromMillisecondsSinceEpoch(buffer.getInt64()); - case _kTimestamp: - return Timestamp(buffer.getInt64(), buffer.getInt32()); - case _kGeoPoint: - return GeoPoint(buffer.getFloat64(), buffer.getFloat64()); - case _kDocumentReference: - final int appNameLength = readSize(buffer); - final String appName = - utf8.decoder.convert(buffer.getUint8List(appNameLength)); - final FirebaseApp app = FirebaseApp(name: appName); - final Firestore firestore = Firestore(app: app); - final int pathLength = readSize(buffer); - final String path = - utf8.decoder.convert(buffer.getUint8List(pathLength)); - return firestore.document(path); - case _kBlob: - final int length = readSize(buffer); - final List bytes = buffer.getUint8List(length); - return Blob(bytes); - case _kArrayUnion: - final List value = readValue(buffer); - return FieldValue.arrayUnion(value); - case _kArrayRemove: - final List value = readValue(buffer); - return FieldValue.arrayRemove(value); - case _kDelete: - return FieldValue.delete(); - case _kServerTimestamp: - return FieldValue.serverTimestamp(); - case _kIncrementDouble: - final double value = readValue(buffer); - return FieldValue.increment(value); - case _kIncrementInteger: - final int value = readValue(buffer); - return FieldValue.increment(value); - default: - return super.readValueOfType(type, buffer); - } - } -} diff --git a/packages/cloud_firestore/lib/src/geo_point.dart b/packages/cloud_firestore/lib/src/geo_point.dart deleted file mode 100644 index bc91d4d16712..000000000000 --- a/packages/cloud_firestore/lib/src/geo_point.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -class GeoPoint { - const GeoPoint(this.latitude, this.longitude); - - final double latitude; - final double longitude; - - @override - bool operator ==(dynamic o) => - o is GeoPoint && o.latitude == latitude && o.longitude == longitude; - - @override - int get hashCode => hashValues(latitude, longitude); -} diff --git a/packages/cloud_firestore/lib/src/query.dart b/packages/cloud_firestore/lib/src/query.dart deleted file mode 100644 index 114b48a6df57..000000000000 --- a/packages/cloud_firestore/lib/src/query.dart +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// Represents a query over the data at a particular location. -class Query { - Query._( - {@required this.firestore, - @required List pathComponents, - bool isCollectionGroup = false, - Map parameters}) - : _pathComponents = pathComponents, - _isCollectionGroup = isCollectionGroup, - _parameters = parameters ?? - Map.unmodifiable({ - 'where': List>.unmodifiable(>[]), - 'orderBy': List>.unmodifiable(>[]), - }), - assert(firestore != null), - assert(pathComponents != null); - - /// The Firestore instance associated with this query - final Firestore firestore; - - final List _pathComponents; - final Map _parameters; - final bool _isCollectionGroup; - - String get _path => _pathComponents.join('/'); - - Query _copyWithParameters(Map parameters) { - return Query._( - firestore: firestore, - isCollectionGroup: _isCollectionGroup, - pathComponents: _pathComponents, - parameters: Map.unmodifiable( - Map.from(_parameters)..addAll(parameters), - ), - ); - } - - Map buildArguments() { - return Map.from(_parameters) - ..addAll({ - 'path': _path, - }); - } - - /// Notifies of query results at this location - // TODO(jackson): Reduce code duplication with [DocumentReference] - Stream snapshots({bool includeMetadataChanges = false}) { - assert(includeMetadataChanges != null); - Future _handle; - // It's fine to let the StreamController be garbage collected once all the - // subscribers have cancelled; this analyzer warning is safe to ignore. - StreamController controller; // ignore: close_sinks - controller = StreamController.broadcast( - onListen: () { - _handle = Firestore.channel.invokeMethod( - 'Query#addSnapshotListener', - { - 'app': firestore.app.name, - 'path': _path, - 'isCollectionGroup': _isCollectionGroup, - 'parameters': _parameters, - 'includeMetadataChanges': includeMetadataChanges, - }, - ).then((dynamic result) => result); - _handle.then((int handle) { - Firestore._queryObservers[handle] = controller; - }); - }, - onCancel: () { - _handle.then((int handle) async { - await Firestore.channel.invokeMethod( - 'removeListener', - {'handle': handle}, - ); - Firestore._queryObservers.remove(handle); - }); - }, - ); - return controller.stream; - } - - /// Fetch the documents for this query - Future getDocuments( - {Source source = Source.serverAndCache}) async { - assert(source != null); - final Map data = - await Firestore.channel.invokeMapMethod( - 'Query#getDocuments', - { - 'app': firestore.app.name, - 'path': _path, - 'isCollectionGroup': _isCollectionGroup, - 'parameters': _parameters, - 'source': _getSourceString(source), - }, - ); - return QuerySnapshot._(data, firestore); - } - - /// Obtains a CollectionReference corresponding to this query's location. - CollectionReference reference() => - CollectionReference._(firestore, _pathComponents); - - /// Creates and returns a new [Query] with additional filter on specified - /// [field]. [field] refers to a field in a document. - /// - /// The [field] may consist of a single field name (referring to a top level - /// field in the document), or a series of field names seperated by dots '.' - /// (referring to a nested field in the document). - /// - /// Only documents satisfying provided condition are included in the result - /// set. - Query where( - String field, { - dynamic isEqualTo, - dynamic isLessThan, - dynamic isLessThanOrEqualTo, - dynamic isGreaterThan, - dynamic isGreaterThanOrEqualTo, - dynamic arrayContains, - bool isNull, - }) { - final ListEquality equality = const ListEquality(); - final List> conditions = - List>.from(_parameters['where']); - - void addCondition(String field, String operator, dynamic value) { - final List condition = [field, operator, value]; - assert( - conditions - .where((List item) => equality.equals(condition, item)) - .isEmpty, - 'Condition $condition already exists in this query.'); - conditions.add(condition); - } - - if (isEqualTo != null) addCondition(field, '==', isEqualTo); - if (isLessThan != null) addCondition(field, '<', isLessThan); - if (isLessThanOrEqualTo != null) - addCondition(field, '<=', isLessThanOrEqualTo); - if (isGreaterThan != null) addCondition(field, '>', isGreaterThan); - if (isGreaterThanOrEqualTo != null) - addCondition(field, '>=', isGreaterThanOrEqualTo); - if (arrayContains != null) - addCondition(field, 'array-contains', arrayContains); - if (isNull != null) { - assert( - isNull, - 'isNull can only be set to true. ' - 'Use isEqualTo to filter on non-null values.'); - addCondition(field, '==', null); - } - - return _copyWithParameters({'where': conditions}); - } - - /// Creates and returns a new [Query] that's additionally sorted by the specified - /// [field]. - Query orderBy(String field, {bool descending = false}) { - final List> orders = - List>.from(_parameters['orderBy']); - - final List order = [field, descending]; - assert(orders.where((List item) => field == item[0]).isEmpty, - 'OrderBy $field already exists in this query'); - orders.add(order); - return _copyWithParameters({'orderBy': orders}); - } - - /// Creates and returns a new [Query] that starts after the provided document - /// (exclusive). The starting position is relative to the order of the query. - /// The document must contain all of the fields provided in the orderBy of - /// this query. - /// - /// Cannot be used in combination with [startAtDocument], [startAt], or - /// [startAfter], but can be used in combination with [endAt], - /// [endBefore], [endAtDocument] and [endBeforeDocument]. - /// - /// See also: - /// * [endAfterDocument] for a query that ends after a document. - /// * [startAtDocument] for a query that starts at a document. - /// * [endAtDocument] for a query that ends at a document. - Query startAfterDocument(DocumentSnapshot documentSnapshot) { - assert(documentSnapshot != null); - assert(!_parameters.containsKey('startAfter')); - assert(!_parameters.containsKey('startAt')); - assert(!_parameters.containsKey('startAfterDocument')); - assert(!_parameters.containsKey('startAtDocument')); - return _copyWithParameters({ - 'startAfterDocument': { - 'id': documentSnapshot.documentID, - 'path': documentSnapshot.reference.path, - 'data': documentSnapshot.data - } - }); - } - - /// Creates and returns a new [Query] that starts at the provided document - /// (inclusive). The starting position is relative to the order of the query. - /// The document must contain all of the fields provided in the orderBy of - /// this query. - /// - /// Cannot be used in combination with [startAfterDocument], [startAfter], or - /// [startAt], but can be used in combination with [endAt], - /// [endBefore], [endAtDocument] and [endBeforeDocument]. - /// - /// See also: - /// * [startAfterDocument] for a query that starts after a document. - /// * [endAtDocument] for a query that ends at a document. - /// * [endBeforeDocument] for a query that ends before a document. - Query startAtDocument(DocumentSnapshot documentSnapshot) { - assert(documentSnapshot != null); - assert(!_parameters.containsKey('startAfter')); - assert(!_parameters.containsKey('startAt')); - assert(!_parameters.containsKey('startAfterDocument')); - assert(!_parameters.containsKey('startAtDocument')); - return _copyWithParameters({ - 'startAtDocument': { - 'id': documentSnapshot.documentID, - 'path': documentSnapshot.reference.path, - 'data': documentSnapshot.data - }, - }); - } - - /// Takes a list of [values], creates and returns a new [Query] that starts - /// after the provided fields relative to the order of the query. - /// - /// The [values] must be in order of [orderBy] filters. - /// - /// Cannot be used in combination with [startAt], [startAfterDocument], or - /// [startAtDocument], but can be used in combination with [endAt], - /// [endBefore], [endAtDocument] and [endBeforeDocument]. - Query startAfter(List values) { - assert(values != null); - assert(!_parameters.containsKey('startAfter')); - assert(!_parameters.containsKey('startAt')); - assert(!_parameters.containsKey('startAfterDocument')); - assert(!_parameters.containsKey('startAtDocument')); - return _copyWithParameters({'startAfter': values}); - } - - /// Takes a list of [values], creates and returns a new [Query] that starts at - /// the provided fields relative to the order of the query. - /// - /// The [values] must be in order of [orderBy] filters. - /// - /// Cannot be used in combination with [startAfter], [startAfterDocument], - /// or [startAtDocument], but can be used in combination with [endAt], - /// [endBefore], [endAtDocument] and [endBeforeDocument]. - Query startAt(List values) { - assert(values != null); - assert(!_parameters.containsKey('startAfter')); - assert(!_parameters.containsKey('startAt')); - assert(!_parameters.containsKey('startAfterDocument')); - assert(!_parameters.containsKey('startAtDocument')); - return _copyWithParameters({'startAt': values}); - } - - /// Creates and returns a new [Query] that ends at the provided document - /// (inclusive). The end position is relative to the order of the query. - /// The document must contain all of the fields provided in the orderBy of - /// this query. - /// - /// Cannot be used in combination with [endBefore], [endBeforeDocument], or - /// [endAt], but can be used in combination with [startAt], - /// [startAfter], [startAtDocument] and [startAfterDocument]. - /// - /// See also: - /// * [startAfterDocument] for a query that starts after a document. - /// * [startAtDocument] for a query that starts at a document. - /// * [endBeforeDocument] for a query that ends before a document. - Query endAtDocument(DocumentSnapshot documentSnapshot) { - assert(documentSnapshot != null); - assert(!_parameters.containsKey('endBefore')); - assert(!_parameters.containsKey('endAt')); - assert(!_parameters.containsKey('endBeforeDocument')); - assert(!_parameters.containsKey('endAtDocument')); - return _copyWithParameters({ - 'endAtDocument': { - 'id': documentSnapshot.documentID, - 'path': documentSnapshot.reference.path, - 'data': documentSnapshot.data - }, - }); - } - - /// Takes a list of [values], creates and returns a new [Query] that ends at the - /// provided fields relative to the order of the query. - /// - /// The [values] must be in order of [orderBy] filters. - /// - /// Cannot be used in combination with [endBefore], [endBeforeDocument], or - /// [endAtDocument], but can be used in combination with [startAt], - /// [startAfter], [startAtDocument] and [startAfterDocument]. - Query endAt(List values) { - assert(values != null); - assert(!_parameters.containsKey('endBefore')); - assert(!_parameters.containsKey('endAt')); - assert(!_parameters.containsKey('endBeforeDocument')); - assert(!_parameters.containsKey('endAtDocument')); - return _copyWithParameters({'endAt': values}); - } - - /// Creates and returns a new [Query] that ends before the provided document - /// (exclusive). The end position is relative to the order of the query. - /// The document must contain all of the fields provided in the orderBy of - /// this query. - /// - /// Cannot be used in combination with [endAt], [endBefore], or - /// [endAtDocument], but can be used in combination with [startAt], - /// [startAfter], [startAtDocument] and [startAfterDocument]. - /// - /// See also: - /// * [startAfterDocument] for a query that starts after document. - /// * [startAtDocument] for a query that starts at a document. - /// * [endAtDocument] for a query that ends at a document. - Query endBeforeDocument(DocumentSnapshot documentSnapshot) { - assert(documentSnapshot != null); - assert(!_parameters.containsKey('endBefore')); - assert(!_parameters.containsKey('endAt')); - assert(!_parameters.containsKey('endBeforeDocument')); - assert(!_parameters.containsKey('endAtDocument')); - return _copyWithParameters({ - 'endBeforeDocument': { - 'id': documentSnapshot.documentID, - 'path': documentSnapshot.reference.path, - 'data': documentSnapshot.data, - }, - }); - } - - /// Takes a list of [values], creates and returns a new [Query] that ends before - /// the provided fields relative to the order of the query. - /// - /// The [values] must be in order of [orderBy] filters. - /// - /// Cannot be used in combination with [endAt], [endBeforeDocument], or - /// [endBeforeDocument], but can be used in combination with [startAt], - /// [startAfter], [startAtDocument] and [startAfterDocument]. - Query endBefore(List values) { - assert(values != null); - assert(!_parameters.containsKey('endBefore')); - assert(!_parameters.containsKey('endAt')); - assert(!_parameters.containsKey('endBeforeDocument')); - assert(!_parameters.containsKey('endAtDocument')); - return _copyWithParameters({'endBefore': values}); - } - - /// Creates and returns a new Query that's additionally limited to only return up - /// to the specified number of documents. - Query limit(int length) { - assert(!_parameters.containsKey('limit')); - return _copyWithParameters({'limit': length}); - } -} diff --git a/packages/cloud_firestore/lib/src/query_snapshot.dart b/packages/cloud_firestore/lib/src/query_snapshot.dart deleted file mode 100644 index 1ecb0bd54fe1..000000000000 --- a/packages/cloud_firestore/lib/src/query_snapshot.dart +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// A QuerySnapshot contains zero or more DocumentSnapshot objects. -class QuerySnapshot { - QuerySnapshot._(Map data, this._firestore) - : documents = List.generate(data['documents'].length, - (int index) { - return DocumentSnapshot._( - data['paths'][index], - _asStringKeyedMap(data['documents'][index]), - SnapshotMetadata._( - data['metadatas'][index]['hasPendingWrites'], - data['metadatas'][index]['isFromCache'], - ), - _firestore, - ); - }), - documentChanges = List.generate( - data['documentChanges'].length, (int index) { - return DocumentChange._( - data['documentChanges'][index], - _firestore, - ); - }), - metadata = SnapshotMetadata._( - data['metadata']['hasPendingWrites'], - data['metadata']['isFromCache'], - ); - - /// Gets a list of all the documents included in this snapshot - final List documents; - - /// An array of the documents that changed since the last snapshot. If this - /// is the first snapshot, all documents will be in the list as Added changes. - final List documentChanges; - - final SnapshotMetadata metadata; - - final Firestore _firestore; -} diff --git a/packages/cloud_firestore/lib/src/snapshot_metadata.dart b/packages/cloud_firestore/lib/src/snapshot_metadata.dart deleted file mode 100644 index 39f51f5928e8..000000000000 --- a/packages/cloud_firestore/lib/src/snapshot_metadata.dart +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// Metadata about a snapshot, describing the state of the snapshot. -class SnapshotMetadata { - SnapshotMetadata._(this.hasPendingWrites, this.isFromCache); - - /// Whether the snapshot contains the result of local writes that have not yet - /// been committed to the backend. - /// - /// If your listener has opted into metadata updates (via - /// [DocumentListenOptions] or [QueryListenOptions]) you will receive another - /// snapshot with `hasPendingWrites` equal to `false` once the writes have been - /// committed to the backend. - final bool hasPendingWrites; - - /// Whether the snapshot was created from cached data rather than guaranteed - /// up-to-date server data. - /// - /// If your listener has opted into metadata updates (via - /// [DocumentListenOptions] or [QueryListenOptions]) you will receive another - /// snapshot with `isFomCache` equal to `false` once the client has received - /// up-to-date data from the backend. - final bool isFromCache; -} diff --git a/packages/cloud_firestore/lib/src/source.dart b/packages/cloud_firestore/lib/src/source.dart deleted file mode 100644 index 0a0a43eef8f3..000000000000 --- a/packages/cloud_firestore/lib/src/source.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -/// An enumeration of firestore source types. -enum Source { - /// Causes Firestore to try to retrieve an up-to-date (server-retrieved) snapshot, but fall back to - /// returning cached data if the server can't be reached. - serverAndCache, - - /// Causes Firestore to avoid the cache, generating an error if the server cannot be reached. Note - /// that the cache will still be updated if the server request succeeds. Also note that - /// latency-compensation still takes effect, so any pending write operations will be visible in the - /// returned data (merged into the server-provided data). - server, - - /// Causes Firestore to immediately return a value from the cache, ignoring the server completely - /// (implying that the returned value may be stale with respect to the value on the server). If - /// there is no data in the cache to satisfy the [get()] or [getDocuments()] call, - /// [DocumentReference.get()] will return an error and [Query.getDocuments()] will return an empty - /// [QuerySnapshot] with no documents. - cache, -} - -/// Converts [Source] to [String] -String _getSourceString(Source source) { - assert(source != null); - if (source == Source.server) { - return 'server'; - } - if (source == Source.cache) { - return 'cache'; - } - return 'default'; -} diff --git a/packages/cloud_firestore/lib/src/timestamp.dart b/packages/cloud_firestore/lib/src/timestamp.dart deleted file mode 100644 index 027f5a55ed76..000000000000 --- a/packages/cloud_firestore/lib/src/timestamp.dart +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2018, 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. - -part of cloud_firestore; - -const int _kThousand = 1000; -const int _kMillion = 1000000; -const int _kBillion = 1000000000; - -void _check(bool expr, String name, int value) { - if (!expr) { - throw ArgumentError("Timestamp $name out of range: $value"); - } -} - -/// A Timestamp represents a point in time independent of any time zone or calendar, -/// represented as seconds and fractions of seconds at nanosecond resolution in UTC -/// Epoch time. It is encoded using the Proleptic Gregorian Calendar which extends -/// the Gregorian calendar backwards to year one. It is encoded assuming all minutes -/// are 60 seconds long, i.e. leap seconds are "smeared" so that no leap second table -/// is needed for interpretation. Range is from 0001-01-01T00:00:00Z to -/// 9999-12-31T23:59:59.999999999Z. By restricting to that range, we ensure that we -/// can convert to and from RFC 3339 date strings. -/// -/// For more information, see [the reference timestamp definition](https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto) -class Timestamp implements Comparable { - Timestamp(this._seconds, this._nanoseconds) { - _validateRange(_seconds, _nanoseconds); - } - - factory Timestamp.fromMillisecondsSinceEpoch(int milliseconds) { - final int seconds = (milliseconds / _kThousand).floor(); - final int nanoseconds = (milliseconds - seconds * _kThousand) * _kMillion; - return Timestamp(seconds, nanoseconds); - } - - factory Timestamp.fromMicrosecondsSinceEpoch(int microseconds) { - final int seconds = (microseconds / _kMillion).floor(); - final int nanoseconds = (microseconds - seconds * _kMillion) * _kThousand; - return Timestamp(seconds, nanoseconds); - } - - factory Timestamp.fromDate(DateTime date) { - return Timestamp.fromMicrosecondsSinceEpoch(date.microsecondsSinceEpoch); - } - - factory Timestamp.now() { - return Timestamp.fromMicrosecondsSinceEpoch( - DateTime.now().microsecondsSinceEpoch); - } - - final int _seconds; - final int _nanoseconds; - - static const int _kStartOfTime = -62135596800; - static const int _kEndOfTime = 253402300800; - - int get seconds => _seconds; - - int get nanoseconds => _nanoseconds; - - int get millisecondsSinceEpoch => - (seconds * _kThousand + nanoseconds / _kMillion).floor(); - - int get microsecondsSinceEpoch => - (seconds * _kMillion + nanoseconds / _kThousand).floor(); - - DateTime toDate() { - return DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch); - } - - @override - int get hashCode => hashValues(seconds, nanoseconds); - @override - bool operator ==(dynamic o) => - o is Timestamp && o.seconds == seconds && o.nanoseconds == nanoseconds; - @override - int compareTo(Timestamp other) { - if (seconds == other.seconds) { - return nanoseconds.compareTo(other.nanoseconds); - } - - return seconds.compareTo(other.seconds); - } - - @override - String toString() { - return "Timestamp(seconds=$seconds, nanoseconds=$nanoseconds)"; - } - - static void _validateRange(int seconds, int nanoseconds) { - _check(nanoseconds >= 0, 'nanoseconds', nanoseconds); - _check(nanoseconds < _kBillion, 'nanoseconds', nanoseconds); - _check(seconds >= _kStartOfTime, 'seconds', seconds); - _check(seconds < _kEndOfTime, 'seconds', seconds); - } -} diff --git a/packages/cloud_firestore/lib/src/transaction.dart b/packages/cloud_firestore/lib/src/transaction.dart deleted file mode 100644 index d13e3f19f9b2..000000000000 --- a/packages/cloud_firestore/lib/src/transaction.dart +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2017, 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. - -part of cloud_firestore; - -typedef Future TransactionHandler(Transaction transaction); - -class Transaction { - @visibleForTesting - Transaction(this._transactionId, this._firestore); - - int _transactionId; - Firestore _firestore; - List> _pendingResults = >[]; - Future _finish() => Future.wait(_pendingResults); - - /// Reads the document referenced by the provided DocumentReference. - Future get(DocumentReference documentReference) { - final Future result = _get(documentReference); - _pendingResults.add(result); - return result; - } - - Future _get(DocumentReference documentReference) async { - final Map result = await Firestore.channel - .invokeMapMethod('Transaction#get', { - 'app': _firestore.app.name, - 'transactionId': _transactionId, - 'path': documentReference.path, - }); - if (result != null) { - return DocumentSnapshot._( - documentReference.path, - result['data']?.cast(), - SnapshotMetadata._(result['metadata']['hasPendingWrites'], - result['metadata']['isFromCache']), - _firestore); - } else { - return null; - } - } - - /// Deletes the document referred to by the provided [documentReference]. - /// - /// Awaiting the returned [Future] is optional and will be done automatically - /// when the transaction handler completes. - Future delete(DocumentReference documentReference) { - final Future result = _delete(documentReference); - _pendingResults.add(result); - return result; - } - - Future _delete(DocumentReference documentReference) async { - return Firestore.channel - .invokeMethod('Transaction#delete', { - 'app': _firestore.app.name, - 'transactionId': _transactionId, - 'path': documentReference.path, - }); - } - - /// Updates fields in the document referred to by [documentReference]. - /// The update will fail if applied to a document that does not exist. - /// - /// Awaiting the returned [Future] is optional and will be done automatically - /// when the transaction handler completes. - Future update( - DocumentReference documentReference, Map data) async { - final Future result = _update(documentReference, data); - _pendingResults.add(result); - return result; - } - - Future _update( - DocumentReference documentReference, Map data) async { - return Firestore.channel - .invokeMethod('Transaction#update', { - 'app': _firestore.app.name, - 'transactionId': _transactionId, - 'path': documentReference.path, - 'data': data, - }); - } - - /// Writes to the document referred to by the provided [DocumentReference]. - /// If the document does not exist yet, it will be created. If you pass - /// SetOptions, the provided data can be merged into the existing document. - /// - /// Awaiting the returned [Future] is optional and will be done automatically - /// when the transaction handler completes. - Future set( - DocumentReference documentReference, Map data) { - final Future result = _set(documentReference, data); - _pendingResults.add(result); - return result; - } - - Future _set( - DocumentReference documentReference, Map data) async { - return Firestore.channel - .invokeMethod('Transaction#set', { - 'app': _firestore.app.name, - 'transactionId': _transactionId, - 'path': documentReference.path, - 'data': data, - }); - } -} diff --git a/packages/cloud_firestore/lib/src/utils/auto_id_generator.dart b/packages/cloud_firestore/lib/src/utils/auto_id_generator.dart deleted file mode 100644 index e2e1cc57138a..000000000000 --- a/packages/cloud_firestore/lib/src/utils/auto_id_generator.dart +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2017, 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:math'; - -/// Utility class for generating Firebase child node keys. -/// -/// Since the Flutter plugin API is asynchronous, there's no way for us -/// to use the native SDK to generate the node key synchronously and we -/// have to do it ourselves if we want to be able to reference the -/// newly-created node synchronously. -/// -/// This code is based largely on the Android implementation and ported to Dart. - -class AutoIdGenerator { - static const int _AUTO_ID_LENGTH = 20; - - static const String _AUTO_ID_ALPHABET = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - - static final Random _random = Random(); - - static String autoId() { - final StringBuffer stringBuffer = StringBuffer(); - final int maxRandom = _AUTO_ID_ALPHABET.length; - - for (int i = 0; i < _AUTO_ID_LENGTH; ++i) { - stringBuffer.write(_AUTO_ID_ALPHABET[_random.nextInt(maxRandom)]); - } - - return stringBuffer.toString(); - } -} diff --git a/packages/cloud_firestore/lib/src/write_batch.dart b/packages/cloud_firestore/lib/src/write_batch.dart deleted file mode 100644 index 6a41ee7bfec3..000000000000 --- a/packages/cloud_firestore/lib/src/write_batch.dart +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2018, 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. - -part of cloud_firestore; - -/// A [WriteBatch] is a series of write operations to be performed as one unit. -/// -/// Operations done on a [WriteBatch] do not take effect until you [commit]. -/// -/// Once committed, no further operations can be performed on the [WriteBatch], -/// nor can it be committed again. -class WriteBatch { - WriteBatch._(this._firestore) - : _handle = Firestore.channel.invokeMethod( - 'WriteBatch#create', {'app': _firestore.app.name}); - - final Firestore _firestore; - Future _handle; - final List> _actions = >[]; - - /// Indicator to whether or not this [WriteBatch] has been committed. - bool _committed = false; - - /// Commits all of the writes in this write batch as a single atomic unit. - /// - /// Calling this method prevents any future operations from being added. - Future commit() async { - if (!_committed) { - _committed = true; - await Future.wait(_actions); - await Firestore.channel.invokeMethod( - 'WriteBatch#commit', {'handle': await _handle}); - } else { - throw StateError("This batch has already been committed."); - } - } - - /// Deletes the document referred to by [document]. - void delete(DocumentReference document) { - if (!_committed) { - _handle.then((dynamic handle) { - _actions.add( - Firestore.channel.invokeMethod( - 'WriteBatch#delete', - { - 'app': _firestore.app.name, - 'handle': handle, - 'path': document.path, - }, - ), - ); - }); - } else { - throw StateError( - "This batch has been committed and can no longer be changed."); - } - } - - /// Writes to the document referred to by [document]. - /// - /// If the document does not yet exist, it will be created. - /// - /// If [merge] is true, the provided data will be merged into an - /// existing document instead of overwriting. - void setData(DocumentReference document, Map data, - {bool merge = false}) { - if (!_committed) { - _handle.then((dynamic handle) { - _actions.add( - Firestore.channel.invokeMethod( - 'WriteBatch#setData', - { - 'app': _firestore.app.name, - 'handle': handle, - 'path': document.path, - 'data': data, - 'options': {'merge': merge}, - }, - ), - ); - }); - } else { - throw StateError( - "This batch has been committed and can no longer be changed."); - } - } - - /// Updates fields in the document referred to by [document]. - /// - /// If the document does not exist, the operation will fail. - void updateData(DocumentReference document, Map data) { - if (!_committed) { - _handle.then((dynamic handle) { - _actions.add( - Firestore.channel.invokeMethod( - 'WriteBatch#updateData', - { - 'app': _firestore.app.name, - 'handle': handle, - 'path': document.path, - 'data': data, - }, - ), - ); - }); - } else { - throw StateError( - "This batch has been committed and can no longer be changed."); - } - } -} diff --git a/packages/cloud_firestore/pubspec.yaml b/packages/cloud_firestore/pubspec.yaml deleted file mode 100755 index 475130fbb5f5..000000000000 --- a/packages/cloud_firestore/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: cloud_firestore -description: Flutter plugin for Cloud Firestore, a cloud-hosted, noSQL database with - live synchronization and offline support on Android and iOS. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/cloud_firestore -version: 0.12.9 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.cloudfirestore - iosPrefix: FLT - pluginClass: CloudFirestorePlugin - -dependencies: - flutter: - sdk: flutter - meta: "^1.0.5" - collection: "^1.14.3" - firebase_core: "^0.4.0" - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/cloud_firestore/test/cloud_firestore_test.dart b/packages/cloud_firestore/test/cloud_firestore_test.dart deleted file mode 100755 index c68f04405009..000000000000 --- a/packages/cloud_firestore/test/cloud_firestore_test.dart +++ /dev/null @@ -1,1279 +0,0 @@ -// Copyright 2017 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 'dart:typed_data'; - -import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$Firestore', () { - int mockHandleId = 0; - FirebaseApp app; - Firestore firestore; - final List log = []; - CollectionReference collectionReference; - Query collectionGroupQuery; - Transaction transaction; - const Map kMockDocumentSnapshotData = { - '1': 2 - }; - const Map kMockSnapshotMetadata = { - "hasPendingWrites": false, - "isFromCache": false, - }; - setUp(() async { - mockHandleId = 0; - // Required for FirebaseApp.configure - FirebaseApp.channel.setMockMethodCallHandler( - (MethodCall methodCall) async {}, - ); - app = await FirebaseApp.configure( - name: 'testApp', - options: const FirebaseOptions( - googleAppID: '1:1234567890:ios:42424242424242', - gcmSenderID: '1234567890', - ), - ); - firestore = Firestore(app: app); - collectionReference = firestore.collection('foo'); - collectionGroupQuery = firestore.collectionGroup('bar'); - transaction = Transaction(0, firestore); - Firestore.channel.setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'Query#addSnapshotListener': - final int handle = mockHandleId++; - // Wait before sending a message back. - // Otherwise the first request didn't have the time to finish. - Future.delayed(Duration.zero).then((_) { - // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. - // https://github.com/flutter/flutter/issues/33446 - // ignore: deprecated_member_use - BinaryMessages.handlePlatformMessage( - Firestore.channel.name, - Firestore.channel.codec.encodeMethodCall( - MethodCall('QuerySnapshot', { - 'app': app.name, - 'handle': handle, - 'paths': ["${methodCall.arguments['path']}/0"], - 'documents': [kMockDocumentSnapshotData], - 'metadatas': >[kMockSnapshotMetadata], - 'metadata': kMockSnapshotMetadata, - 'documentChanges': [ - { - 'oldIndex': -1, - 'newIndex': 0, - 'type': 'DocumentChangeType.added', - 'document': kMockDocumentSnapshotData, - 'metadata': kMockSnapshotMetadata, - }, - ], - }), - ), - (_) {}, - ); - }); - return handle; - case 'DocumentReference#addSnapshotListener': - final int handle = mockHandleId++; - // Wait before sending a message back. - // Otherwise the first request didn't have the time to finish. - Future.delayed(Duration.zero).then((_) { - // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. - // https://github.com/flutter/flutter/issues/33446 - // ignore: deprecated_member_use - BinaryMessages.handlePlatformMessage( - Firestore.channel.name, - Firestore.channel.codec.encodeMethodCall( - MethodCall('DocumentSnapshot', { - 'handle': handle, - 'path': methodCall.arguments['path'], - 'data': kMockDocumentSnapshotData, - 'metadata': kMockSnapshotMetadata, - }), - ), - (_) {}, - ); - }); - return handle; - case 'Query#getDocuments': - return { - 'paths': ["${methodCall.arguments['path']}/0"], - 'documents': [kMockDocumentSnapshotData], - 'metadatas': >[kMockSnapshotMetadata], - 'metadata': kMockSnapshotMetadata, - 'documentChanges': [ - { - 'oldIndex': -1, - 'newIndex': 0, - 'type': 'DocumentChangeType.added', - 'document': kMockDocumentSnapshotData, - 'metadata': kMockSnapshotMetadata, - }, - ], - }; - case 'DocumentReference#setData': - return true; - case 'DocumentReference#get': - if (methodCall.arguments['path'] == 'foo/bar') { - return { - 'path': 'foo/bar', - 'data': {'key1': 'val1'}, - 'metadata': kMockSnapshotMetadata, - }; - } else if (methodCall.arguments['path'] == 'foo/notExists') { - return { - 'path': 'foo/notExists', - 'data': null, - 'metadata': kMockSnapshotMetadata, - }; - } - throw PlatformException(code: 'UNKNOWN_PATH'); - case 'Firestore#runTransaction': - return {'1': 3}; - case 'Transaction#get': - if (methodCall.arguments['path'] == 'foo/bar') { - return { - 'path': 'foo/bar', - 'data': {'key1': 'val1'}, - 'metadata': kMockSnapshotMetadata, - }; - } else if (methodCall.arguments['path'] == 'foo/notExists') { - return { - 'path': 'foo/notExists', - 'data': null, - 'metadata': kMockSnapshotMetadata, - }; - } - throw PlatformException(code: 'UNKNOWN_PATH'); - case 'Transaction#set': - return null; - case 'Transaction#update': - return null; - case 'Transaction#delete': - return null; - case 'WriteBatch#create': - return 1; - default: - return null; - } - }); - log.clear(); - }); - - test('multiple apps', () async { - expect(Firestore.instance, equals(Firestore())); - final FirebaseApp app = FirebaseApp(name: firestore.app.name); - expect(firestore, equals(Firestore(app: app))); - }); - - test('settings', () async { - final FirebaseApp app = const FirebaseApp(name: "testApp2"); - final Firestore firestoreWithSettings = Firestore(app: app); - await firestoreWithSettings.settings( - persistenceEnabled: true, - host: null, - sslEnabled: true, - timestampsInSnapshotsEnabled: true, - cacheSizeBytes: 500000, - ); - expect(log, [ - isMethodCall('Firestore#settings', arguments: { - 'app': firestoreWithSettings.app.name, - 'persistenceEnabled': true, - 'host': null, - 'sslEnabled': true, - 'timestampsInSnapshotsEnabled': true, - 'cacheSizeBytes': 500000, - }), - ]); - }); - - group('Transaction', () { - test('runTransaction', () async { - final Map result = await firestore.runTransaction( - (Transaction tx) async {}, - timeout: const Duration(seconds: 3)); - - expect(log, [ - isMethodCall('Firestore#runTransaction', arguments: { - 'app': app.name, - 'transactionId': 0, - 'transactionTimeout': 3000 - }), - ]); - expect(result, equals({'1': 3})); - }); - - test('get', () async { - final DocumentReference documentReference = - firestore.document('foo/bar'); - final DocumentSnapshot snapshot = - await transaction.get(documentReference); - expect(snapshot.reference.firestore, firestore); - expect(log, [ - isMethodCall('Transaction#get', arguments: { - 'app': app.name, - 'transactionId': 0, - 'path': documentReference.path - }) - ]); - }); - - test('get notExists', () async { - final DocumentReference documentReference = - firestore.document('foo/notExists'); - await transaction.get(documentReference); - expect(log, [ - isMethodCall('Transaction#get', arguments: { - 'app': app.name, - 'transactionId': 0, - 'path': documentReference.path - }) - ]); - }); - - test('delete', () async { - final DocumentReference documentReference = - firestore.document('foo/bar'); - await transaction.delete(documentReference); - expect(log, [ - isMethodCall('Transaction#delete', arguments: { - 'app': app.name, - 'transactionId': 0, - 'path': documentReference.path - }) - ]); - }); - - test('update', () async { - final DocumentReference documentReference = - firestore.document('foo/bar'); - final DocumentSnapshot documentSnapshot = await documentReference.get(); - final Map data = documentSnapshot.data; - data['key2'] = 'val2'; - await transaction.set(documentReference, data); - expect(log, [ - isMethodCall('DocumentReference#get', arguments: { - 'app': app.name, - 'path': 'foo/bar', - 'source': 'default', - }), - isMethodCall('Transaction#set', arguments: { - 'app': app.name, - 'transactionId': 0, - 'path': documentReference.path, - 'data': {'key1': 'val1', 'key2': 'val2'} - }) - ]); - }); - - test('set', () async { - final DocumentReference documentReference = - firestore.document('foo/bar'); - final DocumentSnapshot documentSnapshot = await documentReference.get(); - final Map data = documentSnapshot.data; - data['key2'] = 'val2'; - await transaction.set(documentReference, data); - expect(log, [ - isMethodCall('DocumentReference#get', arguments: { - 'app': app.name, - 'path': 'foo/bar', - 'source': 'default', - }), - isMethodCall('Transaction#set', arguments: { - 'app': app.name, - 'transactionId': 0, - 'path': documentReference.path, - 'data': {'key1': 'val1', 'key2': 'val2'} - }) - ]); - }); - }); - - group('Blob', () { - test('hashCode equality', () async { - final Uint8List bytesA = Uint8List(8); - bytesA.setAll(0, [0, 2, 4, 6, 8, 10, 12, 14]); - final Blob a = Blob(bytesA); - final Uint8List bytesB = Uint8List(8); - bytesB.setAll(0, [0, 2, 4, 6, 8, 10, 12, 14]); - final Blob b = Blob(bytesB); - expect(a.hashCode == b.hashCode, isTrue); - }); - test('hashCode not equal', () async { - final Uint8List bytesA = Uint8List(8); - bytesA.setAll(0, [0, 2, 4, 6, 8, 10, 12, 14]); - final Blob a = Blob(bytesA); - final Uint8List bytesB = Uint8List(8); - bytesB.setAll(0, [1, 2, 4, 6, 8, 10, 12, 14]); - final Blob b = Blob(bytesB); - expect(a.hashCode == b.hashCode, isFalse); - }); - }); - - group('CollectionsReference', () { - test('id', () async { - expect(collectionReference.id, equals('foo')); - }); - test('parent', () async { - final DocumentReference docRef = collectionReference.document('bar'); - expect(docRef.parent().id, equals('foo')); - expect(collectionReference.parent(), isNull); - }); - test('path', () async { - expect(collectionReference.path, equals('foo')); - }); - test('listen', () async { - final QuerySnapshot snapshot = await collectionReference - .snapshots(includeMetadataChanges: true) - .first; - final DocumentSnapshot document = snapshot.documents[0]; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('foo/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - // Flush the async removeListener call - await Future.delayed(Duration.zero); - expect(log, [ - isMethodCall( - 'Query#addSnapshotListener', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'parameters': { - 'where': >[], - 'orderBy': >[], - }, - 'includeMetadataChanges': true, - }, - ), - isMethodCall( - 'removeListener', - arguments: {'handle': 0}, - ), - ]); - }); - test('where', () async { - final StreamSubscription subscription = - collectionReference - .where('createdAt', isLessThan: 100) - .snapshots() - .listen((QuerySnapshot querySnapshot) {}); - subscription.cancel(); - await Future.delayed(Duration.zero); - expect( - log, - equals([ - isMethodCall( - 'Query#addSnapshotListener', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'parameters': { - 'where': >[ - ['createdAt', '<', 100], - ], - 'orderBy': >[], - }, - 'includeMetadataChanges': false, - }, - ), - isMethodCall( - 'removeListener', - arguments: {'handle': 0}, - ), - ]), - ); - }); - test('where field isNull', () async { - final StreamSubscription subscription = - collectionReference - .where('profile', isNull: true) - .snapshots() - .listen((QuerySnapshot querySnapshot) {}); - subscription.cancel(); - await Future.delayed(Duration.zero); - expect( - log, - equals([ - isMethodCall( - 'Query#addSnapshotListener', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'parameters': { - 'where': >[ - ['profile', '==', null], - ], - 'orderBy': >[], - }, - 'includeMetadataChanges': false, - }, - ), - isMethodCall( - 'removeListener', - arguments: {'handle': 0}, - ), - ]), - ); - }); - test('orderBy', () async { - final StreamSubscription subscription = - collectionReference - .orderBy('createdAt') - .snapshots() - .listen((QuerySnapshot querySnapshot) {}); - subscription.cancel(); - await Future.delayed(Duration.zero); - expect( - log, - equals([ - isMethodCall( - 'Query#addSnapshotListener', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'parameters': { - 'where': >[], - 'orderBy': >[ - ['createdAt', false] - ], - }, - 'includeMetadataChanges': false, - }, - ), - isMethodCall( - 'removeListener', - arguments: {'handle': 0}, - ), - ]), - ); - }); - }); - - group('DocumentReference', () { - test('listen', () async { - final DocumentSnapshot snapshot = await firestore - .document('path/to/foo') - .snapshots(includeMetadataChanges: true) - .first; - expect(snapshot.documentID, equals('foo')); - expect(snapshot.reference.path, equals('path/to/foo')); - expect(snapshot.data, equals(kMockDocumentSnapshotData)); - // Flush the async removeListener call - await Future.delayed(Duration.zero); - expect( - log, - [ - isMethodCall( - 'DocumentReference#addSnapshotListener', - arguments: { - 'app': app.name, - 'path': 'path/to/foo', - 'includeMetadataChanges': true, - }, - ), - isMethodCall( - 'removeListener', - arguments: {'handle': 0}, - ), - ], - ); - }); - test('set', () async { - await collectionReference - .document('bar') - .setData({'bazKey': 'quxValue'}); - expect( - log, - [ - isMethodCall( - 'DocumentReference#setData', - arguments: { - 'app': app.name, - 'path': 'foo/bar', - 'data': {'bazKey': 'quxValue'}, - 'options': {'merge': false}, - }, - ), - ], - ); - }); - test('merge set', () async { - await collectionReference - .document('bar') - .setData({'bazKey': 'quxValue'}, merge: true); - expect( - log, - [ - isMethodCall( - 'DocumentReference#setData', - arguments: { - 'app': app.name, - 'path': 'foo/bar', - 'data': {'bazKey': 'quxValue'}, - 'options': {'merge': true}, - }, - ), - ], - ); - }); - test('update', () async { - await collectionReference - .document('bar') - .updateData({'bazKey': 'quxValue'}); - expect( - log, - [ - isMethodCall( - 'DocumentReference#updateData', - arguments: { - 'app': app.name, - 'path': 'foo/bar', - 'data': {'bazKey': 'quxValue'}, - }, - ), - ], - ); - }); - test('delete', () async { - await collectionReference.document('bar').delete(); - expect( - log, - equals([ - isMethodCall( - 'DocumentReference#delete', - arguments: { - 'app': app.name, - 'path': 'foo/bar', - }, - ), - ]), - ); - }); - test('get', () async { - final DocumentSnapshot snapshot = - await collectionReference.document('bar').get(source: Source.cache); - expect(snapshot.reference.firestore, firestore); - expect( - log, - equals([ - isMethodCall( - 'DocumentReference#get', - arguments: { - 'app': app.name, - 'path': 'foo/bar', - 'source': 'cache', - }, - ), - ]), - ); - log.clear(); - expect(snapshot.reference.path, equals('foo/bar')); - expect(snapshot.data.containsKey('key1'), equals(true)); - expect(snapshot.data['key1'], equals('val1')); - expect(snapshot.exists, isTrue); - - final DocumentSnapshot snapshot2 = await collectionReference - .document('notExists') - .get(source: Source.serverAndCache); - expect(snapshot2.data, isNull); - expect(snapshot2.exists, isFalse); - expect( - log, - equals([ - isMethodCall( - 'DocumentReference#get', - arguments: { - 'app': app.name, - 'path': 'foo/notExists', - 'source': 'default', - }, - ), - ]), - ); - - try { - await collectionReference.document('baz').get(); - } on PlatformException catch (e) { - expect(e.code, equals('UNKNOWN_PATH')); - } - }); - test('collection', () async { - final CollectionReference colRef = - collectionReference.document('bar').collection('baz'); - expect(colRef.path, equals('foo/bar/baz')); - }); - test('parent', () async { - final CollectionReference colRef = - collectionReference.document('bar').collection('baz'); - expect(colRef.parent().documentID, equals('bar')); - }); - }); - - group('Query', () { - test('getDocumentsFromCollection', () async { - QuerySnapshot snapshot = - await collectionReference.getDocuments(source: Source.server); - expect(snapshot.metadata.hasPendingWrites, - equals(kMockSnapshotMetadata['hasPendingWrites'])); - expect(snapshot.metadata.isFromCache, - equals(kMockSnapshotMetadata['isFromCache'])); - DocumentSnapshot document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('foo/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // startAtDocument - snapshot = - await collectionReference.startAtDocument(document).getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('foo/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // startAfterDocument - snapshot = await collectionReference - .startAfterDocument(document) - .getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('foo/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // endAtDocument - snapshot = - await collectionReference.endAtDocument(document).getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('foo/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // endBeforeDocument - snapshot = await collectionReference - .endBeforeDocument(document) - .getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('foo/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // startAtDocument - endAtDocument - snapshot = await collectionReference - .startAtDocument(document) - .endAtDocument(document) - .getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('foo/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - expect( - log, - equals( - [ - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'source': 'server', - 'parameters': { - 'where': >[], - 'orderBy': >[], - }, - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'source': 'default', - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'startAtDocument': { - 'id': '0', - 'path': 'foo/0', - 'data': kMockDocumentSnapshotData, - }, - }, - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'source': 'default', - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'startAfterDocument': { - 'id': '0', - 'path': 'foo/0', - 'data': kMockDocumentSnapshotData, - }, - }, - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'source': 'default', - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'endAtDocument': { - 'id': '0', - 'path': 'foo/0', - 'data': kMockDocumentSnapshotData, - }, - }, - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'source': 'default', - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'endBeforeDocument': { - 'id': '0', - 'path': 'foo/0', - 'data': kMockDocumentSnapshotData, - }, - }, - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'foo', - 'isCollectionGroup': false, - 'source': 'default', - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'startAtDocument': { - 'id': '0', - 'path': 'foo/0', - 'data': kMockDocumentSnapshotData, - }, - 'endAtDocument': { - 'id': '0', - 'path': 'foo/0', - 'data': kMockDocumentSnapshotData, - }, - }, - }, - ), - ], - ), - ); - }); - test('getDocumentsFromCollectionGroup', () async { - QuerySnapshot snapshot = await collectionGroupQuery.getDocuments(); - expect(snapshot.metadata.hasPendingWrites, - equals(kMockSnapshotMetadata['hasPendingWrites'])); - expect(snapshot.metadata.isFromCache, - equals(kMockSnapshotMetadata['isFromCache'])); - DocumentSnapshot document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('bar/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // startAtDocument - snapshot = - await collectionGroupQuery.startAtDocument(document).getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('bar/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // startAfterDocument - snapshot = await collectionGroupQuery - .startAfterDocument(document) - .getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('bar/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // endAtDocument - snapshot = - await collectionGroupQuery.endAtDocument(document).getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('bar/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // endBeforeDocument - snapshot = await collectionGroupQuery - .endBeforeDocument(document) - .getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('bar/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - // startAtDocument - endAtDocument - snapshot = await collectionGroupQuery - .startAtDocument(document) - .endAtDocument(document) - .getDocuments(); - document = snapshot.documents.first; - expect(document.documentID, equals('0')); - expect(document.reference.path, equals('bar/0')); - expect(document.data, equals(kMockDocumentSnapshotData)); - - expect( - log, - equals( - [ - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'bar', - 'isCollectionGroup': true, - 'parameters': { - 'where': >[], - 'orderBy': >[], - }, - 'source': 'default', - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'bar', - 'isCollectionGroup': true, - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'startAtDocument': { - 'id': '0', - 'path': 'bar/0', - 'data': kMockDocumentSnapshotData, - }, - }, - 'source': 'default', - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'bar', - 'isCollectionGroup': true, - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'startAfterDocument': { - 'id': '0', - 'path': 'bar/0', - 'data': kMockDocumentSnapshotData, - }, - }, - 'source': 'default', - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'bar', - 'isCollectionGroup': true, - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'endAtDocument': { - 'id': '0', - 'path': 'bar/0', - 'data': kMockDocumentSnapshotData, - }, - }, - 'source': 'default', - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'bar', - 'isCollectionGroup': true, - 'source': 'default', - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'endBeforeDocument': { - 'id': '0', - 'path': 'bar/0', - 'data': kMockDocumentSnapshotData, - }, - }, - 'source': 'default', - }, - ), - isMethodCall( - 'Query#getDocuments', - arguments: { - 'app': app.name, - 'path': 'bar', - 'isCollectionGroup': true, - 'source': 'default', - 'parameters': { - 'where': >[], - 'orderBy': >[], - 'startAtDocument': { - 'id': '0', - 'path': 'bar/0', - 'data': kMockDocumentSnapshotData, - }, - 'endAtDocument': { - 'id': '0', - 'path': 'bar/0', - 'data': kMockDocumentSnapshotData, - }, - }, - 'source': 'default', - }, - ), - ], - ), - ); - }); - }); - - group('FirestoreMessageCodec', () { - const MessageCodec codec = FirestoreMessageCodec(); - final DateTime testTime = DateTime(2015, 10, 30, 11, 16); - final Timestamp timestamp = Timestamp.fromDate(testTime); - test('should encode and decode simple messages', () { - _checkEncodeDecode(codec, testTime); - _checkEncodeDecode(codec, timestamp); - _checkEncodeDecode( - codec, const GeoPoint(37.421939, -122.083509)); - _checkEncodeDecode(codec, firestore.document('foo/bar')); - }); - test('should encode and decode composite message', () { - final List message = [ - testTime, - const GeoPoint(37.421939, -122.083509), - firestore.document('foo/bar'), - ]; - _checkEncodeDecode(codec, message); - }); - test('encode and decode blob', () { - final Uint8List bytes = Uint8List(4); - bytes[0] = 128; - final Blob message = Blob(bytes); - _checkEncodeDecode(codec, message); - }); - - test('encode and decode FieldValue', () { - _checkEncodeDecode(codec, FieldValue.arrayUnion([123])); - _checkEncodeDecode(codec, FieldValue.arrayRemove([123])); - _checkEncodeDecode(codec, FieldValue.delete()); - _checkEncodeDecode(codec, FieldValue.serverTimestamp()); - _checkEncodeDecode(codec, FieldValue.increment(1.0)); - _checkEncodeDecode(codec, FieldValue.increment(1)); - }); - }); - - group('Timestamp', () { - test('is accurate for dates after epoch', () { - final DateTime date = DateTime.fromMillisecondsSinceEpoch(22501); - final Timestamp timestamp = Timestamp.fromDate(date); - - expect(timestamp.seconds, equals(22)); - expect(timestamp.nanoseconds, equals(501000000)); - }); - - test('is accurate for dates before epoch', () { - final DateTime date = DateTime.fromMillisecondsSinceEpoch(-1250); - final Timestamp timestamp = Timestamp.fromDate(date); - - expect(timestamp.seconds, equals(-2)); - expect(timestamp.nanoseconds, equals(750000000)); - }); - - test('creates equivalent timestamps regardless of factory', () { - const int kMilliseconds = 22501; - const int kMicroseconds = 22501000; - final DateTime date = - DateTime.fromMicrosecondsSinceEpoch(kMicroseconds); - - final Timestamp timestamp = Timestamp(22, 501000000); - final Timestamp milliTimestamp = - Timestamp.fromMillisecondsSinceEpoch(kMilliseconds); - final Timestamp microTimestamp = - Timestamp.fromMicrosecondsSinceEpoch(kMicroseconds); - final Timestamp dateTimestamp = Timestamp.fromDate(date); - - expect(timestamp, equals(milliTimestamp)); - expect(milliTimestamp, equals(microTimestamp)); - expect(microTimestamp, equals(dateTimestamp)); - }); - - test('correctly compares timestamps', () { - final Timestamp alpha = Timestamp.fromDate(DateTime(2017, 5, 11)); - final Timestamp beta1 = Timestamp.fromDate(DateTime(2018, 2, 19)); - final Timestamp beta2 = Timestamp.fromDate(DateTime(2018, 4, 2)); - final Timestamp beta3 = Timestamp.fromDate(DateTime(2018, 4, 20)); - final Timestamp preview = Timestamp.fromDate(DateTime(2018, 6, 20)); - final List inOrder = [ - alpha, - beta1, - beta2, - beta3, - preview - ]; - - final List timestamps = [ - beta2, - beta3, - alpha, - preview, - beta1 - ]; - timestamps.sort(); - expect(_deepEqualsList(timestamps, inOrder), isTrue); - }); - - test('rejects dates outside RFC 3339 range', () { - final List invalidDates = [ - DateTime.fromMillisecondsSinceEpoch(-70000000000000), - DateTime.fromMillisecondsSinceEpoch(300000000000000), - ]; - - invalidDates.forEach((DateTime date) { - expect(() => Timestamp.fromDate(date), throwsArgumentError); - }); - }); - }); - - group('WriteBatch', () { - test('set', () async { - final WriteBatch batch = firestore.batch(); - batch.setData( - collectionReference.document('bar'), - {'bazKey': 'quxValue'}, - ); - await batch.commit(); - expect( - log, - [ - isMethodCall('WriteBatch#create', arguments: { - 'app': app.name, - }), - isMethodCall( - 'WriteBatch#setData', - arguments: { - 'app': app.name, - 'handle': 1, - 'path': 'foo/bar', - 'data': {'bazKey': 'quxValue'}, - 'options': {'merge': false}, - }, - ), - isMethodCall( - 'WriteBatch#commit', - arguments: { - 'handle': 1, - }, - ), - ], - ); - }); - test('merge set', () async { - final WriteBatch batch = firestore.batch(); - batch.setData( - collectionReference.document('bar'), - {'bazKey': 'quxValue'}, - merge: true, - ); - await batch.commit(); - expect( - log, - [ - isMethodCall('WriteBatch#create', arguments: { - 'app': app.name, - }), - isMethodCall('WriteBatch#setData', arguments: { - 'app': app.name, - 'handle': 1, - 'path': 'foo/bar', - 'data': {'bazKey': 'quxValue'}, - 'options': {'merge': true}, - }), - isMethodCall( - 'WriteBatch#commit', - arguments: { - 'handle': 1, - }, - ), - ], - ); - }); - test('update', () async { - final WriteBatch batch = firestore.batch(); - batch.updateData( - collectionReference.document('bar'), - {'bazKey': 'quxValue'}, - ); - await batch.commit(); - expect( - log, - [ - isMethodCall( - 'WriteBatch#create', - arguments: { - 'app': app.name, - }, - ), - isMethodCall( - 'WriteBatch#updateData', - arguments: { - 'app': app.name, - 'handle': 1, - 'path': 'foo/bar', - 'data': {'bazKey': 'quxValue'}, - }, - ), - isMethodCall( - 'WriteBatch#commit', - arguments: { - 'handle': 1, - }, - ), - ], - ); - }); - test('delete', () async { - final WriteBatch batch = firestore.batch(); - batch.delete(collectionReference.document('bar')); - await batch.commit(); - expect( - log, - [ - isMethodCall( - 'WriteBatch#create', - arguments: { - 'app': app.name, - }, - ), - isMethodCall( - 'WriteBatch#delete', - arguments: { - 'app': app.name, - 'handle': 1, - 'path': 'foo/bar', - }, - ), - isMethodCall( - 'WriteBatch#commit', - arguments: { - 'handle': 1, - }, - ), - ], - ); - }); - }); - }); -} - -void _checkEncodeDecode(MessageCodec codec, T message) { - final ByteData encoded = codec.encodeMessage(message); - final T decoded = codec.decodeMessage(encoded); - if (message == null) { - expect(encoded, isNull); - expect(decoded, isNull); - } else { - expect(_deepEquals(message, decoded), isTrue); - final ByteData encodedAgain = codec.encodeMessage(decoded); - expect( - encodedAgain.buffer.asUint8List(), - orderedEquals(encoded.buffer.asUint8List()), - ); - } -} - -bool _deepEquals(dynamic valueA, dynamic valueB) { - if (valueA is TypedData) - return valueB is TypedData && _deepEqualsTypedData(valueA, valueB); - if (valueA is List) return valueB is List && _deepEqualsList(valueA, valueB); - if (valueA is Map) return valueB is Map && _deepEqualsMap(valueA, valueB); - if (valueA is double && valueA.isNaN) return valueB is double && valueB.isNaN; - if (valueA is FieldValue) { - return valueB is FieldValue && _deepEqualsFieldValue(valueA, valueB); - } - return valueA == valueB; -} - -bool _deepEqualsTypedData(TypedData valueA, TypedData valueB) { - if (valueA is ByteData) { - return valueB is ByteData && - _deepEqualsList( - valueA.buffer.asUint8List(), valueB.buffer.asUint8List()); - } - if (valueA is Uint8List) - return valueB is Uint8List && _deepEqualsList(valueA, valueB); - if (valueA is Int32List) - return valueB is Int32List && _deepEqualsList(valueA, valueB); - if (valueA is Int64List) - return valueB is Int64List && _deepEqualsList(valueA, valueB); - if (valueA is Float64List) - return valueB is Float64List && _deepEqualsList(valueA, valueB); - throw 'Unexpected typed data: $valueA'; -} - -bool _deepEqualsList(List valueA, List valueB) { - if (valueA.length != valueB.length) return false; - for (int i = 0; i < valueA.length; i++) { - if (!_deepEquals(valueA[i], valueB[i])) return false; - } - return true; -} - -bool _deepEqualsMap( - Map valueA, Map valueB) { - if (valueA.length != valueB.length) return false; - for (final dynamic key in valueA.keys) { - if (!valueB.containsKey(key) || !_deepEquals(valueA[key], valueB[key])) - return false; - } - return true; -} - -bool _deepEqualsFieldValue(FieldValue valueA, FieldValue valueB) { - if (valueA.type != valueB.type) return false; - if (valueA.value == null) return valueB.value == null; - if (valueA.value is List) return _deepEqualsList(valueA.value, valueB.value); - if (valueA.value is Map) return _deepEqualsMap(valueA.value, valueB.value); - return valueA.value == valueB.value; -} diff --git a/packages/cloud_functions/.gitignore b/packages/cloud_functions/.gitignore deleted file mode 100644 index b7209965bef4..000000000000 --- a/packages/cloud_functions/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -.DS_Store -.atom/ -.idea/ -.vscode/ - -.packages -.pub/ -.dart_tool/ -pubspec.lock - -Podfile -Podfile.lock -Pods/ -.symlinks/ -**/Flutter/App.framework/ -**/Flutter/Flutter.framework/ -**/Flutter/Generated.xcconfig -**/Flutter/flutter_assets/ -ServiceDefinitions.json -xcuserdata/ - -local.properties -.gradle/ -gradlew -gradlew.bat -gradle-wrapper.jar -*.iml - -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m -GeneratedPluginRegistrant.java -build/ -.flutter-plugins - -ios/Classes/UserAgent.h diff --git a/packages/cloud_functions/CHANGELOG.md b/packages/cloud_functions/CHANGELOG.md deleted file mode 100644 index 57062fbbfa2c..000000000000 --- a/packages/cloud_functions/CHANGELOG.md +++ /dev/null @@ -1,103 +0,0 @@ -## 0.4.1 - -* Support for cloud functions emulators. - -## 0.4.0+3 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.4.0+2 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.4.0+1 - -* Remove reference to unused header file. - -## 0.4.0 - -* Removed unused `parameters` param from `getHttpsCallable`. - -## 0.3.0+1 - -* Update iOS dependencies to latest. - -## 0.3.0 - -* Update Android dependencies to latest. - -## 0.2.0+1 - -* Removed flaky timeout test. - -## 0.2.0 - -* **Breaking change**. Updated Dart API to replace `call` with `getHttpsCallable`. -* Added support for timeouts. -* Additional integration testing. - -## 0.1.2+1 - -* Added a driver test. - -## 0.1.2 - -* Specifying a version for Cloud Functions CocoaPod dependency to prevent build errors on iOS. -* Fix on iOS when using a null region. -* Upgrade the firebase_core dependency of the example app. - -## 0.1.1+1 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.1.1 - -* Support for regions and multiple apps - -## 0.1.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.1.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.0.5 - -* Set iOS deployment target to 8.0 (minimum supported by both Firebase SDKs and Flutter), fixes compilation errors. -* Fixes null pointer error when callable function fails with exception (iOS). - -## 0.0.4+1 - -* Bump Android dependencies to latest. - -## 0.0.4 - -* Fixed podspec to use static_framework - -## 0.0.3 - -* Added missing dependency on meta package. - -## 0.0.2 - -* Bump Android and Firebase dependency versions. - -## 0.0.1 - -* The Cloud Functions for Firebase client SDKs let you call functions - directly from a Firebase app. This plugin exposes this ability to - Flutter apps. - - [Callable functions](https://firebase.google.com/docs/functions/callable) - are similar to other HTTP functions, with these additional features: - - - With callables, Firebase Authentication and FCM tokens are - automatically included in requests. - - The functions.https.onCall trigger automatically deserializes - the request body and validates auth tokens. diff --git a/packages/cloud_functions/LICENSE b/packages/cloud_functions/LICENSE deleted file mode 100644 index 7319cc0d9e04..000000000000 --- a/packages/cloud_functions/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2018, the Chromium project 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. diff --git a/packages/cloud_functions/README.md b/packages/cloud_functions/README.md deleted file mode 100644 index 0e3440416ddf..000000000000 --- a/packages/cloud_functions/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Cloud Functions Plugin for Flutter - -A Flutter plugin to use the [Cloud Functions for Firebase API](https://firebase.google.com/docs/functions/callable) - -[![pub package](https://img.shields.io/pub/v/cloud_functions.svg)](https://pub.dartlang.org/packages/cloud_functions) - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Setup - -To use this plugin: - -1. Using the [Firebase Console](http://console.firebase.google.com/), add an Android app to your project: -Follow the assistant, download the generated google-services.json file and place it inside android/app. Next, -modify the android/build.gradle file and the android/app/build.gradle file to add the Google services plugin -as described by the Firebase assistant. Ensure that your `android/build.gradle` file contains the -`maven.google.com` as [described here](https://firebase.google.com/docs/android/setup#add_the_sdk). -1. Using the [Firebase Console](http://console.firebase.google.com/), add an iOS app to your project: -Follow the assistant, download the generated GoogleService-Info.plist file, open ios/Runner.xcworkspace -with Xcode, and within Xcode place the file inside ios/Runner. Don't follow the steps named -"Add Firebase SDK" and "Add initialization code" in the Firebase assistant. -1. Add `cloud_functions` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Usage - -```dart -import 'package:cloud_functions/cloud_functions.dart'; -``` - -Getting an instance of the callable function: - -```dart -final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable( - functionName: 'YOUR_CALLABLE_FUNCTION_NAME', -); -``` - -Calling the function: - -```dart -dynamic resp = await callable.call(); -``` - -Calling the function with parameters: - -```dart -dynamic resp = await callable.call({ - 'YOUR_PARAMETER_NAME': 'YOUR_PARAMETER_VALUE', -}); -``` - -## Getting Started - -See the `example` directory for a complete sample app using Cloud Functions for Firebase. diff --git a/packages/cloud_functions/android/build.gradle b/packages/cloud_functions/android/build.gradle deleted file mode 100644 index 6dab63091f8d..000000000000 --- a/packages/cloud_functions/android/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -def PLUGIN = "cloud_functions"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebase.cloudfunctions' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-functions:17.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - implementation 'androidx.annotation:annotation:1.0.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/cloud_functions/android/gradle.properties b/packages/cloud_functions/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/cloud_functions/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/cloud_functions/android/settings.gradle b/packages/cloud_functions/android/settings.gradle deleted file mode 100644 index 94986afd276c..000000000000 --- a/packages/cloud_functions/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'cloud_functions' diff --git a/packages/cloud_functions/android/src/main/AndroidManifest.xml b/packages/cloud_functions/android/src/main/AndroidManifest.xml deleted file mode 100644 index 9130c77645aa..000000000000 --- a/packages/cloud_functions/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/CloudFunctionsPlugin.java b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/CloudFunctionsPlugin.java deleted file mode 100644 index b99ddefec324..000000000000 --- a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/CloudFunctionsPlugin.java +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2018 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.cloudfunctions.cloudfunctions; - -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApp; -import com.google.firebase.functions.FirebaseFunctions; -import com.google.firebase.functions.FirebaseFunctionsException; -import com.google.firebase.functions.HttpsCallableReference; -import com.google.firebase.functions.HttpsCallableResult; -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.plugin.common.PluginRegistry.Registrar; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** CloudFunctionsPlugin */ -public class CloudFunctionsPlugin implements MethodCallHandler { - /** Plugin registration. */ - public static void registerWith(Registrar registrar) { - final MethodChannel channel = new MethodChannel(registrar.messenger(), "cloud_functions"); - channel.setMethodCallHandler(new CloudFunctionsPlugin()); - } - - @Override - public void onMethodCall(MethodCall call, final Result result) { - switch (call.method) { - case "CloudFunctions#call": - String functionName = call.argument("functionName"); - Map parameters = call.argument("parameters"); - String appName = call.argument("app"); - FirebaseApp app = FirebaseApp.getInstance(appName); - String region = call.argument("region"); - String origin = call.argument("origin"); - FirebaseFunctions functions; - if (region != null) { - functions = FirebaseFunctions.getInstance(app, region); - } else { - functions = FirebaseFunctions.getInstance(app); - } - if (origin != null) { - functions.useFunctionsEmulator(origin); - } - HttpsCallableReference httpsCallableReference = functions.getHttpsCallable(functionName); - Number timeoutMilliseconds = call.argument("timeoutMilliseconds"); - if (timeoutMilliseconds != null) { - httpsCallableReference.setTimeout(timeoutMilliseconds.longValue(), TimeUnit.MILLISECONDS); - } - httpsCallableReference - .call(parameters) - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - result.success(task.getResult().getData()); - } else { - if (task.getException() instanceof FirebaseFunctionsException) { - FirebaseFunctionsException exception = - (FirebaseFunctionsException) task.getException(); - Map exceptionMap = new HashMap<>(); - exceptionMap.put("code", exception.getCode().name()); - exceptionMap.put("message", exception.getMessage()); - exceptionMap.put("details", exception.getDetails()); - result.error( - "functionsError", - "Cloud function failed with exception.", - exceptionMap); - } else { - Exception exception = task.getException(); - result.error(null, exception.getMessage(), null); - } - } - } - }); - break; - default: - result.notImplemented(); - } - } -} diff --git a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 859db85b6ca8..000000000000 --- a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.cloudfunctions; - -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; - -public class FlutterFirebaseAppRegistrar implements ComponentRegistrar { - @Override - public List> getComponents() { - return Collections.>singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); - } -} diff --git a/packages/cloud_functions/android/user-agent.gradle b/packages/cloud_functions/android/user-agent.gradle deleted file mode 100644 index 4c1efff355d5..000000000000 --- a/packages/cloud_functions/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-fn" -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/cloud_functions/example/.metadata b/packages/cloud_functions/example/.metadata deleted file mode 100644 index e4328aa1f4e3..000000000000 --- a/packages/cloud_functions/example/.metadata +++ /dev/null @@ -1,8 +0,0 @@ -# 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: b135fb3795a16ab2b884820ed7a67d650338aac3 - channel: master diff --git a/packages/cloud_functions/example/README.md b/packages/cloud_functions/example/README.md deleted file mode 100644 index ddf6c6e905f5..000000000000 --- a/packages/cloud_functions/example/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# cloud_functions_example - -Demonstrates how to use the cloud_functions plugin. - -## Function - -This example assumes the existence of the following function: - -``` -import * as functions from 'firebase-functions'; - -export const repeat = functions.https.onCall((data, context) => { - return { - repeat_message: data.message, - repeat_count: data.count + 1, - } -}); -``` - -This function accepts a message and count from the client and responds with -the same message and an incremented count. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](https://flutter.io/). diff --git a/packages/cloud_functions/example/android/app/build.gradle b/packages/cloud_functions/example/android/app/build.gradle deleted file mode 100644 index 4b75a0d8eec4..000000000000 --- a/packages/cloud_functions/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebase.cloudfunctions.cloudfunctionsexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/cloud_functions/example/android/app/google-services.json b/packages/cloud_functions/example/android/app/google-services.json deleted file mode 100644 index e0cbef053078..000000000000 --- a/packages/cloud_functions/example/android/app/google-services.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "project_info": { - "project_number": "297855924061", - "firebase_url": "https://flutterfire-cd2f7.firebaseio.com", - "project_id": "flutterfire-cd2f7", - "storage_bucket": "flutterfire-cd2f7.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:669871c998cc21bd", - "android_client_info": { - "package_name": "com.yourcompany.firebaseauth.example" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-r1u58cnh4p6l1ghpkteil46erlkfll62.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.yourcompany.firebaseauth.example", - "certificate_hash": "c3adef7e7773e40e777d5c236dbba7461cbea5f0" - } - }, - { - "client_id": "297855924061-col4in4uubarifm60nbq8id01ec3ss4c.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.yourcompany.firebaseauth.example", - "certificate_hash": "8a4e194f5bfc3fb1075e7daae8dcddd526fde207" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "297855924061-kb5qcr80u5irm12sbkppfts5shui45rv.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.functions.firebaseFunctionsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:7521d73664dc56fc", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.cloudfunctions.cloudfunctionsexample" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:6ef94ae486218531", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firebaseremoteconfigexample" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:236f9daea101f77e", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-n8i063j2dib6goh5or4lrctg6sccpevi.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample", - "certificate_hash": "a8fc78a37cd4f0471580936de67a2cb2ae4657c7" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "297855924061-kb5qcr80u5irm12sbkppfts5shui45rv.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.functions.firebaseFunctionsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:db912bec12847bd9", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase_database_example" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-fbg7lp8bvtbibn2edns7d5fc3k0fhsa3.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebase_database_example", - "certificate_hash": "c3adef7e7773e40e777d5c236dbba7461cbea5f0" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "297855924061-kb5qcr80u5irm12sbkppfts5shui45rv.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.functions.firebaseFunctionsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:92efa9a0df6f077f", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase_storage_example" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/cloud_functions/example/android/app/gradle.properties b/packages/cloud_functions/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/cloud_functions/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/cloud_functions/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/cloud_functions/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/cloud_functions/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/cloud_functions/example/android/app/src/main/AndroidManifest.xml b/packages/cloud_functions/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index c202d0439f32..000000000000 --- a/packages/cloud_functions/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/packages/cloud_functions/example/android/app/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctionsexample/MainActivity.java b/packages/cloud_functions/example/android/app/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctionsexample/MainActivity.java deleted file mode 100644 index e9cea8f13290..000000000000 --- a/packages/cloud_functions/example/android/app/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctionsexample/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.firebase.cloudfunctions.cloudfunctionsexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/cloud_functions/example/android/app/src/main/res/drawable/launch_background.xml b/packages/cloud_functions/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/cloud_functions/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/cloud_functions/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/cloud_functions/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/cloud_functions/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/cloud_functions/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/cloud_functions/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/cloud_functions/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/cloud_functions/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/cloud_functions/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/cloud_functions/example/android/app/src/main/res/values/styles.xml b/packages/cloud_functions/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/cloud_functions/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/cloud_functions/example/android/build.gradle b/packages/cloud_functions/example/android/build.gradle deleted file mode 100644 index 359119307d55..000000000000 --- a/packages/cloud_functions/example/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/cloud_functions/example/android/gradle.properties b/packages/cloud_functions/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/cloud_functions/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/cloud_functions/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/cloud_functions/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f1fd..000000000000 --- a/packages/cloud_functions/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#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-4.10.2-all.zip diff --git a/packages/cloud_functions/example/android/settings.gradle b/packages/cloud_functions/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/cloud_functions/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/cloud_functions/example/ios/Flutter/AppFrameworkInfo.plist b/packages/cloud_functions/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 9367d483e44e..000000000000 --- a/packages/cloud_functions/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/packages/cloud_functions/example/ios/Flutter/Debug.xcconfig b/packages/cloud_functions/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/cloud_functions/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/cloud_functions/example/ios/Flutter/Release.xcconfig b/packages/cloud_functions/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/cloud_functions/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/cloud_functions/example/ios/Runner.xcodeproj/project.pbxproj b/packages/cloud_functions/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 63fc2b8af35d..000000000000 --- a/packages/cloud_functions/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,499 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; - 321A95AA20CF709900174684 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 321A95A920CF709800174684 /* GoogleService-Info.plist */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 8A0F7791B12524DDA0D8A3EA /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A5621CE483D44D1D6884687 /* libPods-Runner.a */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; - 321A95A920CF709800174684 /* 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 = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5A5621CE483D44D1D6884687 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 8A0F7791B12524DDA0D8A3EA /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3DF8FE6703033F0BCE4B5295 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5A5621CE483D44D1D6884687 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 8AF80AEEDE5B4CF194812581 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 8AF80AEEDE5B4CF194812581 /* Pods */, - 3DF8FE6703033F0BCE4B5295 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 321A95A920CF709800174684 /* GoogleService-Info.plist */, - 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 = ( - E8BAE8C0F3076226C64B5EF1 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 70F8FE3E9FCB1DECBF8E567D /* [CP] Embed Pods Frameworks */, - ); - 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 = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 321A95AA20CF709900174684 /* GoogleService-Info.plist in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets 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\" thin"; - }; - 70F8FE3E9FCB1DECBF8E567D /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - E8BAE8C0F3076226C64B5EF1 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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 */ - 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.cloudfunctions.cloudFunctionsExample; - 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; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.cloudfunctions.cloudFunctionsExample; - 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 */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/cloud_functions/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/cloud_functions/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/cloud_functions/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/cloud_functions/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/cloud_functions/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1263ac84b105..000000000000 --- a/packages/cloud_functions/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/cloud_functions/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/cloud_functions/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/cloud_functions/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/cloud_functions/example/ios/Runner/AppDelegate.h b/packages/cloud_functions/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/cloud_functions/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/cloud_functions/example/ios/Runner/AppDelegate.m b/packages/cloud_functions/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/cloud_functions/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d9d..000000000000 --- a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/cloud_functions/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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/cloud_functions/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/cloud_functions/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/cloud_functions/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/cloud_functions/example/ios/Runner/Base.lproj/Main.storyboard b/packages/cloud_functions/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/cloud_functions/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/cloud_functions/example/ios/Runner/GoogleService-Info.plist b/packages/cloud_functions/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 285747c33fba..000000000000 --- a/packages/cloud_functions/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 297855924061-6gkhkcr566enm8q2ds9d81quuh6mm6of.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.297855924061-6gkhkcr566enm8q2ds9d81quuh6mm6of - API_KEY - AIzaSyBq6mcufFXfyqr79uELCiqM_O_1-G72PVU - GCM_SENDER_ID - 297855924061 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebase.cloudfunctions.cloudFunctionsExample - PROJECT_ID - flutterfire-cd2f7 - STORAGE_BUCKET - flutterfire-cd2f7.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:297855924061:ios:ccfb5cc13360119c - DATABASE_URL - https://flutterfire-cd2f7.firebaseio.com - - \ No newline at end of file diff --git a/packages/cloud_functions/example/ios/Runner/Info.plist b/packages/cloud_functions/example/ios/Runner/Info.plist deleted file mode 100644 index 44a0467e2f2c..000000000000 --- a/packages/cloud_functions/example/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - cloud_functions_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/cloud_functions/example/ios/Runner/main.m b/packages/cloud_functions/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/cloud_functions/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/cloud_functions/example/lib/main.dart b/packages/cloud_functions/example/lib/main.dart deleted file mode 100644 index ae88e469b6a4..000000000000 --- a/packages/cloud_functions/example/lib/main.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2018, 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:flutter/material.dart'; -import 'package:cloud_functions/cloud_functions.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatefulWidget { - @override - _MyAppState createState() => _MyAppState(); -} - -class _MyAppState extends State { - String _response = 'no response'; - int _responseCount = 0; - - @override - Widget build(BuildContext context) { - final HttpsCallable callable = CloudFunctions.instance - .getHttpsCallable(functionName: 'repeat') - ..timeout = const Duration(seconds: 30); - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Cloud Functions example app'), - ), - body: Center( - child: Container( - margin: const EdgeInsets.only(top: 32.0, left: 16.0, right: 16.0), - child: Column( - children: [ - Text('Response $_responseCount: $_response'), - MaterialButton( - child: const Text('SEND REQUEST'), - onPressed: () async { - try { - final HttpsCallableResult result = await callable.call( - { - 'message': 'hello world!', - 'count': _responseCount, - }, - ); - print(result.data); - setState(() { - _response = result.data['repeat_message']; - _responseCount = result.data['repeat_count']; - }); - } on CloudFunctionsException catch (e) { - print('caught firebase functions exception'); - print(e.code); - print(e.message); - print(e.details); - } catch (e) { - print('caught generic exception'); - print(e); - } - }, - ), - ], - ), - ), - ), - ), - ); - } -} diff --git a/packages/cloud_functions/example/pubspec.yaml b/packages/cloud_functions/example/pubspec.yaml deleted file mode 100644 index 2619baf7dcb8..000000000000 --- a/packages/cloud_functions/example/pubspec.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: cloud_functions_example -description: Demonstrates how to use the cloud_functions plugin. -version: 1.0.0+1 -author: Flutter Team - -dependencies: - flutter: - sdk: flutter - cupertino_icons: ^0.1.2 - cloud_functions: - path: .. - firebase_core: ^0.4.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - - -flutter: - uses-material-design: true - diff --git a/packages/cloud_functions/example/test/cloud_functions.dart b/packages/cloud_functions/example/test/cloud_functions.dart deleted file mode 100644 index 4bccc1f0aed0..000000000000 --- a/packages/cloud_functions/example/test/cloud_functions.dart +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019, 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'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:cloud_functions/cloud_functions.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$CloudFunctions', () { - test('call', () async { - // default timeout - final HttpsCallable callable = - CloudFunctions.instance.getHttpsCallable(functionName: 'repeat'); - final HttpsCallableResult response = - await callable.call({ - 'message': 'foo', - 'count': 1, - }); - expect(response.data['repeat_message'], 'foo'); - - // long custom timeout - callable.timeout = const Duration(days: 300); - expect(response.data['repeat_count'], 2); - final dynamic response2 = await callable.call({ - 'message': 'bar', - 'count': 42, - }); - expect(response2.data['repeat_message'], 'bar'); - expect(response2.data['repeat_count'], 43); - }); - }); -} diff --git a/packages/cloud_functions/example/test/cloud_functions_test.dart b/packages/cloud_functions/example/test/cloud_functions_test.dart deleted file mode 100644 index f2c29d1115ac..000000000000 --- a/packages/cloud_functions/example/test/cloud_functions_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019, 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:flutter_test/flutter_test.dart'; - -import '../lib/main.dart'; - -void main() { - testWidgets('CloudFunctions example widget test', - (WidgetTester tester) async { - await tester.pumpWidget(MyApp()); - expect(find.text('Cloud Functions example app'), findsOneWidget); - }); -} diff --git a/packages/cloud_functions/example/test_driver/cloud_functions_test.dart b/packages/cloud_functions/example/test_driver/cloud_functions_test.dart deleted file mode 100644 index db46258dfebe..000000000000 --- a/packages/cloud_functions/example/test_driver/cloud_functions_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019, 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:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/cloud_functions/ios/Assets/.gitkeep b/packages/cloud_functions/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h deleted file mode 100644 index f49ddc6883d2..000000000000 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface CloudFunctionsPlugin : NSObject -@end diff --git a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m deleted file mode 100644 index e48c0fbc73cb..000000000000 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2018 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 "CloudFunctionsPlugin.h" -#import "UserAgent.h" - -#import "Firebase/Firebase.h" - -@interface CloudFunctionsPlugin () -@property(nonatomic, retain) FlutterMethodChannel *_channel; -@end - -@implementation CloudFunctionsPlugin - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"cloud_functions" - binaryMessenger:[registrar messenger]]; - CloudFunctionsPlugin *instance = [[CloudFunctionsPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"CloudFunctions#call" isEqualToString:call.method]) { - NSString *functionName = call.arguments[@"functionName"]; - NSObject *parameters = call.arguments[@"parameters"]; - NSString *appName = call.arguments[@"app"]; - NSString *region = call.arguments[@"region"]; - NSString *origin = call.arguments[@"origin"]; - NSNumber *timeoutMicroseconds = call.arguments[@"timeoutMicroseconds"]; - FIRApp *app = [FIRApp appNamed:appName]; - FIRFunctions *functions; - if (region != nil && region != (id)[NSNull null]) { - functions = [FIRFunctions functionsForApp:app region:region]; - } else { - functions = [FIRFunctions functionsForApp:app]; - } - if (origin != nil && origin != (id)[NSNull null]) { - [functions useFunctionsEmulatorOrigin:origin]; - } - FIRHTTPSCallable *function = [functions HTTPSCallableWithName:functionName]; - if (timeoutMicroseconds != nil && timeoutMicroseconds != [NSNull null]) { - [function setTimeoutInterval:(NSTimeInterval)timeoutMicroseconds.doubleValue / 1000000]; - } - [function callWithObject:parameters - completion:^(FIRHTTPSCallableResult *callableResult, NSError *error) { - if (error) { - FlutterError *flutterError; - if (error.domain == FIRFunctionsErrorDomain) { - NSDictionary *details = [NSMutableDictionary dictionary]; - [details setValue:[self mapFunctionsErrorCodes:error.code] forKey:@"code"]; - if (error.localizedDescription != nil) { - [details setValue:error.localizedDescription forKey:@"message"]; - } - if (error.userInfo[FIRFunctionsErrorDetailsKey] != nil) { - [details setValue:error.userInfo[FIRFunctionsErrorDetailsKey] - forKey:@"details"]; - } - - flutterError = - [FlutterError errorWithCode:@"functionsError" - message:@"Firebase function failed with exception." - details:details]; - } else { - flutterError = [FlutterError - errorWithCode:[NSString stringWithFormat:@"%ld", error.code] - message:error.localizedDescription - details:nil]; - } - result(flutterError); - } else { - result(callableResult.data); - } - }]; - } else { - result(FlutterMethodNotImplemented); - } -} - -// Map function error code objects to Strings that match error names on Android. -- (NSString *)mapFunctionsErrorCodes:(FIRFunctionsErrorCode)code { - if (code == FIRFunctionsErrorCodeAborted) { - return @"ABORTED"; - } else if (code == FIRFunctionsErrorCodeAlreadyExists) { - return @"ALREADY_EXISTS"; - } else if (code == FIRFunctionsErrorCodeCancelled) { - return @"CANCELLED"; - } else if (code == FIRFunctionsErrorCodeDataLoss) { - return @"DATA_LOSS"; - } else if (code == FIRFunctionsErrorCodeDeadlineExceeded) { - return @"DEADLINE_EXCEEDED"; - } else if (code == FIRFunctionsErrorCodeFailedPrecondition) { - return @"FAILED_PRECONDITION"; - } else if (code == FIRFunctionsErrorCodeInternal) { - return @"INTERNAL"; - } else if (code == FIRFunctionsErrorCodeInvalidArgument) { - return @"INVALID_ARGUMENT"; - } else if (code == FIRFunctionsErrorCodeNotFound) { - return @"NOT_FOUND"; - } else if (code == FIRFunctionsErrorCodeOK) { - return @"OK"; - } else if (code == FIRFunctionsErrorCodeOutOfRange) { - return @"OUT_OF_RANGE"; - } else if (code == FIRFunctionsErrorCodePermissionDenied) { - return @"PERMISSION_DENIED"; - } else if (code == FIRFunctionsErrorCodeResourceExhausted) { - return @"RESOURCE_EXHAUSTED"; - } else if (code == FIRFunctionsErrorCodeUnauthenticated) { - return @"UNAUTHENTICATED"; - } else if (code == FIRFunctionsErrorCodeUnavailable) { - return @"UNAVAILABLE"; - } else if (code == FIRFunctionsErrorCodeUnimplemented) { - return @"UNIMPLEMENTED"; - } else { - return @"UNKNOWN"; - } -} - -@end diff --git a/packages/cloud_functions/ios/cloud_functions.podspec b/packages/cloud_functions/ios/cloud_functions.podspec deleted file mode 100644 index 7ff410257bbe..000000000000 --- a/packages/cloud_functions/ios/cloud_functions.podspec +++ /dev/null @@ -1,34 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'cloud_functions' - 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.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/Functions', '~> 6.0' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-fn\\"" >> Classes/UserAgent.h - CMD -end - diff --git a/packages/cloud_functions/lib/cloud_functions.dart b/packages/cloud_functions/lib/cloud_functions.dart deleted file mode 100644 index 068d3040cfee..000000000000 --- a/packages/cloud_functions/lib/cloud_functions.dart +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2019, 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. - -library cloud_functions; - -import 'dart:async'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -part 'src/cloud_functions.dart'; -part 'src/https_callable.dart'; -part 'src/https_callable_result.dart'; diff --git a/packages/cloud_functions/lib/src/cloud_functions.dart b/packages/cloud_functions/lib/src/cloud_functions.dart deleted file mode 100644 index d15db7b49a1f..000000000000 --- a/packages/cloud_functions/lib/src/cloud_functions.dart +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2019, 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. - -part of cloud_functions; - -class CloudFunctionsException implements Exception { - CloudFunctionsException._(this.code, this.message, this.details); - - final String code; - final String message; - final dynamic details; -} - -/// The entry point for accessing a CloudFunctions. -/// -/// You can get an instance by calling [CloudFunctions.instance]. -class CloudFunctions { - CloudFunctions({FirebaseApp app, String region}) - : _app = app ?? FirebaseApp.instance, - _region = region; - - @visibleForTesting - static const MethodChannel channel = MethodChannel('cloud_functions'); - - static CloudFunctions _instance = CloudFunctions(); - - static CloudFunctions get instance => _instance; - - final FirebaseApp _app; - - final String _region; - - String _origin; - - /// Gets an instance of a Callable HTTPS trigger in Cloud Functions. - /// - /// Can then be executed by calling `call()` on it. - /// - /// @param functionName The name of the callable function. - HttpsCallable getHttpsCallable({@required String functionName}) { - return HttpsCallable._(this, functionName); - } - - /// Changes this instance to point to a Cloud Functions emulator running locally. - /// - /// @param origin The origin of the local emulator, such as "//10.0.2.2:5005". - CloudFunctions useFunctionsEmulator({@required String origin}) { - _origin = origin; - return this; - } -} diff --git a/packages/cloud_functions/lib/src/https_callable.dart b/packages/cloud_functions/lib/src/https_callable.dart deleted file mode 100644 index 6ae34dbf73f5..000000000000 --- a/packages/cloud_functions/lib/src/https_callable.dart +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2019, 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. - -part of cloud_functions; - -/// A reference to a particular Callable HTTPS trigger in Cloud Functions. -/// -/// You can get an instance by calling [CloudFunctions.instance.getHTTPSCallable]. -class HttpsCallable { - HttpsCallable._(this._cloudFunctions, this._functionName); - - final CloudFunctions _cloudFunctions; - final String _functionName; - - /// Executes this Callable HTTPS trigger asynchronously. - /// - /// The data passed into the trigger can be any of the following types: - /// - /// `null` - /// `String` - /// `num` - /// [List], where the contained objects are also one of these types. - /// [Map], where the values are also one of these types. - /// - /// The request to the Cloud Functions backend made by this method - /// automatically includes a Firebase Instance ID token to identify the app - /// instance. If a user is logged in with Firebase Auth, an auth ID token for - /// the user is also automatically included. - Future call([dynamic parameters]) async { - try { - final MethodChannel channel = CloudFunctions.channel; - final dynamic response = await channel - .invokeMethod('CloudFunctions#call', { - 'app': _cloudFunctions._app.name, - 'region': _cloudFunctions._region, - 'origin': _cloudFunctions._origin, - 'timeoutMicroseconds': timeout?.inMicroseconds, - 'functionName': _functionName, - 'parameters': parameters, - }); - return HttpsCallableResult._(response); - } on PlatformException catch (e) { - if (e.code == 'functionsError') { - final String code = e.details['code']; - final String message = e.details['message']; - final dynamic details = e.details['details']; - throw CloudFunctionsException._(code, message, details); - } else { - throw Exception('Unable to call function ' + _functionName); - } - } catch (e) { - rethrow; - } - } - - /// The timeout to use when calling the function. Defaults to 60 seconds. - Duration timeout; -} diff --git a/packages/cloud_functions/lib/src/https_callable_result.dart b/packages/cloud_functions/lib/src/https_callable_result.dart deleted file mode 100644 index 46f53f3a0e93..000000000000 --- a/packages/cloud_functions/lib/src/https_callable_result.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019, 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. - -part of cloud_functions; - -/// The result of calling a HttpsCallable function. -class HttpsCallableResult { - HttpsCallableResult._(this.data); - - /// Returns the data that was returned from the Callable HTTPS trigger. - final dynamic data; -} diff --git a/packages/cloud_functions/pubspec.yaml b/packages/cloud_functions/pubspec.yaml deleted file mode 100644 index d1e9bf14f4cd..000000000000 --- a/packages/cloud_functions/pubspec.yaml +++ /dev/null @@ -1,27 +0,0 @@ -name: cloud_functions -description: Flutter plugin for Cloud Functions. -version: 0.4.1 -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/cloud_functions - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.cloudfunctions.cloudfunctions - pluginClass: CloudFunctionsPlugin - -dependencies: - meta: ^1.1.6 - flutter: - sdk: flutter - firebase_core: ^0.4.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - -environment: - sdk: '>=2.0.0-dev.28.0 <3.0.0' - flutter: '>=0.2.4 <2.0.0' diff --git a/packages/cloud_functions/test/cloud_functions_test.dart b/packages/cloud_functions/test/cloud_functions_test.dart deleted file mode 100644 index 6e58c422423f..000000000000 --- a/packages/cloud_functions/test/cloud_functions_test.dart +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2018, 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:cloud_functions/cloud_functions.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$CloudFunctions', () { - final List log = []; - - setUp(() async { - CloudFunctions.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'FirebaseFunctions#call': - return { - 'foo': 'bar', - }; - default: - return true; - } - }); - log.clear(); - }); - - test('call', () async { - await CloudFunctions.instance - .getHttpsCallable(functionName: 'baz') - .call(); - final HttpsCallable callable = - CloudFunctions(app: const FirebaseApp(name: '1337'), region: 'space') - .getHttpsCallable(functionName: 'qux') - ..timeout = const Duration(days: 300); - await callable.call({ - 'quux': 'quuz', - }); - await CloudFunctions.instance - .useFunctionsEmulator(origin: 'http://localhost:5001') - .getHttpsCallable(functionName: 'bez') - .call(); - expect( - log, - [ - isMethodCall( - 'CloudFunctions#call', - arguments: { - 'app': '[DEFAULT]', - 'region': null, - 'origin': null, - 'functionName': 'baz', - 'timeoutMicroseconds': null, - 'parameters': null, - }, - ), - isMethodCall( - 'CloudFunctions#call', - arguments: { - 'app': '1337', - 'region': 'space', - 'origin': null, - 'functionName': 'qux', - 'timeoutMicroseconds': (const Duration(days: 300)).inMicroseconds, - 'parameters': {'quux': 'quuz'}, - }, - ), - isMethodCall( - 'CloudFunctions#call', - arguments: { - 'app': '[DEFAULT]', - 'region': null, - 'origin': 'http://localhost:5001', - 'functionName': 'bez', - 'timeoutMicroseconds': null, - 'parameters': null, - }, - ), - ], - ); - }); - }); -} diff --git a/packages/firebase_admob/CHANGELOG.md b/packages/firebase_admob/CHANGELOG.md deleted file mode 100644 index 7a44bfb131f5..000000000000 --- a/packages/firebase_admob/CHANGELOG.md +++ /dev/null @@ -1,165 +0,0 @@ -## 0.9.0+4 - -* Add the ability to horizontally adjust the ads banner location by specifying a pixel offset from the centre. - -## 0.9.0+3 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.9.0+2 - -* On Android, no longer crashes when registering the plugin if no activity is available. - -## 0.9.0+1 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. - -## 0.9.0 - -* Update Android dependencies to latest. - -## 0.8.0+4 - -* Update documentation to add AdMob App ID in Info.plist -* Add iOS AdMob App ID in Info.plist in example project - -## 0.8.0+3 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.8.0+2 - -* Remove categories. - -## 0.8.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.8.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.7.0 - -* Mark Dart code as deprecated where the newer version AdMob deprecates features (Birthday, Gender, and Family targeting). -* Update gradle dependencies. -* Add documentation for new AndroidManifest requirements. - -## 0.6.1+1 - -* Bump Android dependencies to latest. -* __THIS WAS AN UNINTENTIONAL BREAKING CHANGE__. Users should consume 0.6.1 instead if they need the old API, or 0.7.0 for the bumped version. -* Guide how to fix crash with admob version 17.0.0 in README - -## 0.6.1 - -* listener on MobileAd shouldn't be final. -* Ad listeners can to be set in or out of Ad initialization. - -## 0.6.0 - -* Add nonPersonalizedAds option to MobileAdTargetingInfo - -## 0.5.7 - -* Bumped mockito dependency to pick up Dart 2 support. - -## 0.5.6 - -* Bump Android and Firebase dependency versions. - -## 0.5.5 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.5.4+1 - -* Graduate to beta. - -## 0.5.4 - -* Fixed a bug that was causing rewarded video failure event to be called on the wrong listener. - -## 0.5.3 - -* Updated Google Play Services dependencies to version 15.0.0. -* Added handling of rewarded video completion event. - -## 0.5.2 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.5.1 - -* Fixed Dart 2 type errors. - -## 0.5.0 - -* **Breaking change**. The BannerAd constructor now requires an AdSize - parameter. BannerAds can be created with AdSize.smartBanner, or one of - the other predefined AdSize values. Previously BannerAds were always - defined with the smartBanner size. - -## 0.4.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.3.2 - -* Fixed Dart 2 type errors. - -## 0.3.1 - -* Enabled use in Swift projects. - -## 0.3.0 - -* Added support for rewarded video ads. -* **Breaking change**. The properties and parameters named "unitId" in BannerAd - and InterstitialAd have been renamed to "adUnitId" to better match AdMob's - documentation and UI. - -## 0.2.3 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.2.2 - -* Added platform-specific App IDs and ad unit IDs to example. -* Separated load and show functionality for interstitials in example. - -## 0.2.1 - -* Use safe area layout to place ad in iOS 11 - -## 0.2.0 - -* **Breaking change**. MobileAd TargetingInfo requestAgent is now hardcoded to 'flutter-alpha'. - -## 0.1.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.0.3 - -* Add FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.0.2 - -* Change GMS dependency to 11.+ - -## 0.0.1 - -* Initial Release: not ready for production use diff --git a/packages/firebase_admob/LICENSE b/packages/firebase_admob/LICENSE deleted file mode 100644 index c89293372cf3..000000000000 --- a/packages/firebase_admob/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 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. diff --git a/packages/firebase_admob/README.md b/packages/firebase_admob/README.md deleted file mode 100644 index a7a285249c49..000000000000 --- a/packages/firebase_admob/README.md +++ /dev/null @@ -1,216 +0,0 @@ -# firebase_admob - -A plugin for [Flutter](https://flutter.io) that supports loading and -displaying banner, interstitial (full-screen), and rewarded video ads using the -[Firebase AdMob API](https://firebase.google.com/docs/admob/). - -*Note*: This plugin is in beta, and may still have a few issues and missing APIs. -[Feedback](https://github.com/flutter/flutter/issues) and -[Pull Requests](https://github.com/flutter/plugins/pulls) are welcome. - -## AndroidManifest changes - -AdMob 17 requires the App ID to be included in the `AndroidManifest.xml`. Failure -to do so will result in a crash on launch of your app. The line should look like: - -```xml - -``` - -where `[ADMOB_APP_ID]` is your App ID. You must pass the same value when you -initialize the plugin in your Dart code. - -See https://goo.gl/fQ2neu for more information about configuring `AndroidManifest.xml` -and setting up your App ID. - -## Info.plist changes - -Admob 7.42.0 requires the App ID to be included in `Info.plist`. Failure to do so will result in a crash on launch of your app. The lines should look like: - -```xml -GADApplicationIdentifier -[ADMOB_APP_ID] -``` - -where `[ADMOB_APP_ID]` is your App ID. You must pass the same value when you initialize the plugin in your Dart code. - -See https://developers.google.com/admob/ios/quick-start#update_your_infoplist for more information about configuring `Info.plist` and setting up your App ID. - -## Initializing the plugin -The AdMob plugin must be initialized with an AdMob App ID. - -```dart -FirebaseAdMob.instance.initialize(appId: appId); -``` -### Android -Starting in version 17.0.0, if you are an AdMob publisher you are now required to add your AdMob app ID in your **AndroidManifest.xml** file. Once you find your AdMob app ID in the AdMob UI, add it to your manifest adding the following tag: - -```xml - - - - - - -``` - -Failure to add this tag will result in the app crashing at app launch with a message starting with *"The Google Mobile Ads SDK was initialized incorrectly."* - -On Android, this value must be the same as the App ID value set in your -`AndroidManifest.xml`. - -### iOS -Starting in version 7.42.0, you are required to add your AdMob app ID in your **Info.plist** file under the Runner directory. You can add it using Xcode or edit the file manually: - -```xml - - GADApplicationIdentifier - ca-app-pub-################~########## - -``` - -Failure to add this tag will result in the app crashing at app launch with a message including *"GADVerifyApplicationID."* - -## Using banners and interstitials -Banner and interstitial ads can be configured with target information. -And in the example below, the ads are given test ad unit IDs for a quick start. - -```dart -MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo( - keywords: ['flutterio', 'beautiful apps'], - contentUrl: 'https://flutter.io', - birthday: DateTime.now(), - childDirected: false, - designedForFamilies: false, - gender: MobileAdGender.male, // or MobileAdGender.female, MobileAdGender.unknown - testDevices: [], // Android emulators are considered test devices -); - -BannerAd myBanner = BannerAd( - // Replace the testAdUnitId with an ad unit id from the AdMob dash. - // https://developers.google.com/admob/android/test-ads - // https://developers.google.com/admob/ios/test-ads - adUnitId: BannerAd.testAdUnitId, - size: AdSize.smartBanner, - targetingInfo: targetingInfo, - listener: (MobileAdEvent event) { - print("BannerAd event is $event"); - }, -); - -InterstitialAd myInterstitial = InterstitialAd( - // Replace the testAdUnitId with an ad unit id from the AdMob dash. - // https://developers.google.com/admob/android/test-ads - // https://developers.google.com/admob/ios/test-ads - adUnitId: InterstitialAd.testAdUnitId, - targetingInfo: targetingInfo, - listener: (MobileAdEvent event) { - print("InterstitialAd event is $event"); - }, -); -``` - -Ads must be loaded before they're shown. -```dart -myBanner - // typically this happens well before the ad is shown - ..load() - ..show( - // Positions the banner ad 60 pixels from the bottom of the screen - anchorOffset: 60.0, - // Positions the banner ad 10 pixels from the center of the screen to the right - horizontalCenterOffset: 10.0, - // Banner Position - anchorType: AnchorType.bottom, - ); -``` - -Ads must be loaded before they're shown. -```dart -myBanner - // typically this happens well before the ad is shown - ..load() - ..show( - // Positions the banner ad 60 pixels from the bottom of the screen - anchorOffset: 60.0, - // Positions the banner ad 10 pixels from the center of the screen to the left - horizontalCenterOffset: -10.0, - // Banner Position - anchorType: AnchorType.bottom, - ); -``` - -```dart -myInterstitial - ..load() - ..show( - anchorType: AnchorType.bottom, - anchorOffset: 0.0, - horizontalCenterOffset: 0.0, - ); -``` - -`BannerAd` and `InterstitialAd` objects can be disposed to free up plugin -resources. Disposing a banner ad that's been shown removes it from the screen. -Interstitial ads, however, can't be programmatically removed from view. - -Banner and interstitial ads can be created with a `MobileAdEvent` listener. The -listener can be used to detect when the ad has actually finished loading -(or failed to load at all). - -## Using rewarded video ads - -Unlike banners and interstitials, rewarded video ads are loaded one at a time -via a singleton object, `RewardedVideoAd.instance`. Its `load` method takes an -AdMob ad unit ID and an instance of `MobileAdTargetingInfo`: -```dart -RewardedVideoAd.instance.load(myAdMobAdUnitId, targetingInfo); -``` - -To listen for events in the rewarded video ad lifecycle, apps can define a -function matching the `RewardedVideoAdListener` typedef, and assign it to the -`listener` instance variable in `RewardedVideoAd`. If set, the `listener` -function will be invoked whenever one of the events in the `RewardedVideAdEvent` -enum occurs. After a rewarded video ad loads, for example, the -`RewardedVideoAdEvent.loaded` is sent. Any time after that, apps can show the ad -by calling `show`: -```dart -RewardedVideoAd.instance.show(); -``` - -When the AdMob SDK decides it's time to grant an in-app reward, it does so via -the `RewardedVideoAdEvent.rewarded` event: -```dart -RewardedVideoAd.instance.listener = - (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) { - if (event == RewardedVideoAdEvent.rewarded) { - setState(() { - // Here, apps should update state to reflect the reward. - _goldCoins += rewardAmount; - }); - } -}; -``` - -Because `RewardedVideoAd` is a singleton object, it does not offer a `dispose` -method. - -## Limitations - -This is just an initial version of the plugin. There are still some -limitations: - -- Banner ads cannot be animated into view. -- It's not possible to specify a banner ad's size. -- There's no support for native ads. -- The existing tests are fairly rudimentary. -- There is no API doc. -- The example should demonstrate how to show gate a route push with an - interstitial ad - -For Flutter plugins for other Firebase products, see -[FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). diff --git a/packages/firebase_admob/android/build.gradle b/packages/firebase_admob/android/build.gradle deleted file mode 100644 index 846ec4851ca3..000000000000 --- a/packages/firebase_admob/android/build.gradle +++ /dev/null @@ -1,50 +0,0 @@ -def PLUGIN = "firebase_admob"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebaseadmob' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-ads:17.2.0' - } -} diff --git a/packages/firebase_admob/android/gradle.properties b/packages/firebase_admob/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_admob/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_admob/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_admob/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 96ffc2a20435..000000000000 --- a/packages/firebase_admob/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Thu Nov 01 21:03:34 PDT 2018 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_admob/android/settings.gradle b/packages/firebase_admob/android/settings.gradle deleted file mode 100644 index c8378038e665..000000000000 --- a/packages/firebase_admob/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_admob' diff --git a/packages/firebase_admob/android/src/main/AndroidManifest.xml b/packages/firebase_admob/android/src/main/AndroidManifest.xml deleted file mode 100644 index 42a48978de0d..000000000000 --- a/packages/firebase_admob/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/AdRequestBuilderFactory.java b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/AdRequestBuilderFactory.java deleted file mode 100644 index 9703241655c6..000000000000 --- a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/AdRequestBuilderFactory.java +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2017 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.firebaseadmob; - -import android.os.Bundle; -import android.util.Log; -import com.google.ads.mediation.admob.AdMobAdapter; -import com.google.android.gms.ads.AdRequest; -import java.util.ArrayList; -import java.util.Date; -import java.util.Map; - -class AdRequestBuilderFactory { - - private static final String TAG = "flutter"; - private final Map targetingInfo; - - AdRequestBuilderFactory(Map targetingInfo) { - this.targetingInfo = targetingInfo; - } - - private String getTargetingInfoString(String key, Object value) { - if (value == null) return null; - if (!(value instanceof String)) { - Log.w(TAG, "targeting info " + key + ": expected a String"); - return null; - } - String stringValue = (String) value; - if (stringValue.isEmpty()) { - Log.w(TAG, "targeting info " + key + ": expected a non-empty String"); - return null; - } - return stringValue; - } - - private Boolean getTargetingInfoBoolean(String key, Object value) { - if (value == null) return null; - if (!(value instanceof Boolean)) { - Log.w(TAG, "targeting info " + key + ": expected a boolean"); - return null; - } - return (Boolean) value; - } - - private Integer getTargetingInfoInteger(String key, Object value) { - if (value == null) return null; - if (!(value instanceof Integer)) { - Log.w(TAG, "targeting info " + key + ": expected an integer"); - return null; - } - return (Integer) value; - } - - private ArrayList getTargetingInfoArrayList(String key, Object value) { - if (value == null) return null; - if (!(value instanceof ArrayList)) { - Log.w(TAG, "targeting info " + key + ": expected an ArrayList"); - return null; - } - return (ArrayList) value; - } - - AdRequest.Builder createAdRequestBuilder() { - AdRequest.Builder builder = new AdRequest.Builder(); - if (targetingInfo == null) return builder; - - ArrayList testDevices = - getTargetingInfoArrayList("testDevices", targetingInfo.get("testDevices")); - if (testDevices != null) { - for (Object deviceValue : testDevices) { - String device = getTargetingInfoString("testDevices element", deviceValue); - if (device != null) builder.addTestDevice(device); - } - } - - ArrayList keywords = getTargetingInfoArrayList("keywords", targetingInfo.get("keywords")); - if (keywords != null) { - for (Object keywordValue : keywords) { - String keyword = getTargetingInfoString("keywords element", keywordValue); - if (keyword != null) builder.addKeyword(keyword); - } - } - - String contentUrl = getTargetingInfoString("contentUrl", targetingInfo.get("contentUrl")); - if (contentUrl != null) builder.setContentUrl(contentUrl); - - Object birthday = targetingInfo.get("birthday"); - if (birthday != null) { - if (!(birthday instanceof Long)) - Log.w(TAG, "targetingInfo birthday: expected a long integer"); - else builder.setBirthday(new Date((Long) birthday)); - } - - Integer gender = getTargetingInfoInteger("gender", targetingInfo.get("gender")); - if (gender != null) { - switch (gender) { - case 0: // MobileAdGender.unknown - case 1: // MobileAdGender.male - case 2: // MobileAdGender.female - builder.setGender(gender); - break; - default: - Log.w(TAG, "targetingInfo gender: invalid value"); - } - } - - Boolean designedForFamilies = - getTargetingInfoBoolean("designedForFamilies", targetingInfo.get("designedForFamilies")); - if (designedForFamilies != null) builder.setIsDesignedForFamilies(designedForFamilies); - - Boolean childDirected = - getTargetingInfoBoolean("childDirected", targetingInfo.get("childDirected")); - if (childDirected != null) builder.tagForChildDirectedTreatment(childDirected); - - String requestAgent = getTargetingInfoString("requestAgent", targetingInfo.get("requestAgent")); - if (requestAgent != null) builder.setRequestAgent(requestAgent); - - Boolean nonPersonalizedAds = - getTargetingInfoBoolean("nonPersonalizedAds", targetingInfo.get("nonPersonalizedAds")); - if (nonPersonalizedAds != null && nonPersonalizedAds) { - Bundle extras = new Bundle(); - extras.putString("npa", "1"); - builder.addNetworkExtrasBundle(AdMobAdapter.class, extras); - } - - return builder; - } -} diff --git a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java deleted file mode 100644 index 62e6fe4befeb..000000000000 --- a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2017 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.firebaseadmob; - -import android.app.Activity; -import android.view.Gravity; -import com.google.android.gms.ads.AdSize; -import com.google.android.gms.ads.MobileAds; -import com.google.firebase.FirebaseApp; -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.plugin.common.PluginRegistry.Registrar; -import java.util.Map; - -public class FirebaseAdMobPlugin implements MethodCallHandler { - - private final Registrar registrar; - private final MethodChannel channel; - - RewardedVideoAdWrapper rewardedWrapper; - - public static void registerWith(Registrar registrar) { - if (registrar.activity() == null) { - // If a background Flutter view tries to register the plugin, there will be no activity from the registrar. - // We stop the registering process immediately because the firebase_admob requires an activity. - return; - } - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_admob"); - channel.setMethodCallHandler(new FirebaseAdMobPlugin(registrar, channel)); - } - - private FirebaseAdMobPlugin(Registrar registrar, MethodChannel channel) { - this.registrar = registrar; - this.channel = channel; - FirebaseApp.initializeApp(registrar.context()); - rewardedWrapper = new RewardedVideoAdWrapper(registrar.activity(), channel); - } - - private void callInitialize(MethodCall call, Result result) { - String appId = call.argument("appId"); - if (appId == null || appId.isEmpty()) { - result.error("no_app_id", "a null or empty AdMob appId was provided", null); - return; - } - MobileAds.initialize(registrar.context(), appId); - result.success(Boolean.TRUE); - } - - private void callLoadBannerAd( - int id, Activity activity, MethodChannel channel, MethodCall call, Result result) { - String adUnitId = call.argument("adUnitId"); - if (adUnitId == null || adUnitId.isEmpty()) { - result.error("no_unit_id", "a null or empty adUnitId was provided for ad id=" + id, null); - return; - } - - int width = call.argument("width"); - int height = call.argument("height"); - String adSizeType = call.argument("adSizeType"); - - if (!adSizeType.equals("AdSizeType.WidthAndHeight") - && !adSizeType.equals("AdSizeType.SmartBanner")) { - String errMsg = - String.format("an invalid adSizeType (%s) was provided for banner id=%d", adSizeType, id); - result.error("invalid_adsizetype", errMsg, null); - } - - if (adSizeType.equals("AdSizeType.WidthAndHeight") && (width <= 0 || height <= 0)) { - String errMsg = - String.format( - "an invalid AdSize (%d, %d) was provided for banner id=%d", width, height, id); - result.error("invalid_adsize", errMsg, null); - } - - AdSize adSize; - if (adSizeType.equals("AdSizeType.SmartBanner")) { - adSize = AdSize.SMART_BANNER; - } else { - adSize = new AdSize(width, height); - } - - MobileAd.Banner banner = MobileAd.createBanner(id, adSize, activity, channel); - - if (banner.status != MobileAd.Status.CREATED) { - if (banner.status == MobileAd.Status.FAILED) - result.error("load_failed_ad", "cannot reload a failed ad, id=" + id, null); - else result.success(Boolean.TRUE); // The ad was already loaded. - return; - } - - Map targetingInfo = call.argument("targetingInfo"); - banner.load(adUnitId, targetingInfo); - result.success(Boolean.TRUE); - } - - private void callLoadInterstitialAd(MobileAd ad, MethodCall call, Result result) { - if (ad.status != MobileAd.Status.CREATED) { - if (ad.status == MobileAd.Status.FAILED) - result.error("load_failed_ad", "cannot reload a failed ad, id=" + ad.id, null); - else result.success(Boolean.TRUE); // The ad was already loaded. - return; - } - - String adUnitId = call.argument("adUnitId"); - if (adUnitId == null || adUnitId.isEmpty()) { - result.error( - "no_adunit_id", "a null or empty adUnitId was provided for ad id=" + ad.id, null); - return; - } - Map targetingInfo = call.argument("targetingInfo"); - ad.load(adUnitId, targetingInfo); - result.success(Boolean.TRUE); - } - - private void callLoadRewardedVideoAd(MethodCall call, Result result) { - if (rewardedWrapper.getStatus() != RewardedVideoAdWrapper.Status.CREATED - && rewardedWrapper.getStatus() != RewardedVideoAdWrapper.Status.FAILED) { - result.success(Boolean.TRUE); // The ad was already loading or loaded. - return; - } - - String adUnitId = call.argument("adUnitId"); - if (adUnitId == null || adUnitId.isEmpty()) { - result.error( - "no_ad_unit_id", "a non-empty adUnitId was not provided for rewarded video", null); - return; - } - - Map targetingInfo = call.argument("targetingInfo"); - if (targetingInfo == null) { - result.error( - "no_targeting_info", "a null targetingInfo object was provided for rewarded video", null); - return; - } - - rewardedWrapper.load(adUnitId, targetingInfo); - result.success(Boolean.TRUE); - } - - private void callShowAd(int id, MethodCall call, Result result) { - MobileAd ad = MobileAd.getAdForId(id); - if (ad == null) { - result.error("ad_not_loaded", "show failed, the specified ad was not loaded id=" + id, null); - return; - } - if (call.argument("anchorOffset") != null) { - ad.anchorOffset = Double.parseDouble((String) call.argument("anchorOffset")); - } - if (call.argument("horizontalCenterOffset") != null) { - ad.horizontalCenterOffset = - Double.parseDouble((String) call.argument("horizontalCenterOffset")); - } - if (call.argument("anchorType") != null) { - ad.anchorType = call.argument("anchorType").equals("bottom") ? Gravity.BOTTOM : Gravity.TOP; - } - - ad.show(); - result.success(Boolean.TRUE); - } - - private void callIsAdLoaded(int id, MethodCall call, Result result) { - MobileAd ad = MobileAd.getAdForId(id); - if (ad == null) { - result.error("no_ad_for_id", "isAdLoaded failed, no add exists for id=" + id, null); - return; - } - result.success(ad.status == MobileAd.Status.LOADED ? Boolean.TRUE : Boolean.FALSE); - } - - private void callShowRewardedVideoAd(MethodCall call, Result result) { - if (rewardedWrapper.getStatus() == RewardedVideoAdWrapper.Status.LOADED) { - rewardedWrapper.show(); - result.success(Boolean.TRUE); - } else { - result.error("ad_not_loaded", "show failed for rewarded video, no ad was loaded", null); - } - } - - private void callDisposeAd(int id, MethodCall call, Result result) { - MobileAd ad = MobileAd.getAdForId(id); - if (ad == null) { - result.error("no_ad_for_id", "dispose failed, no add exists for id=" + id, null); - return; - } - - ad.dispose(); - result.success(Boolean.TRUE); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("initialize")) { - callInitialize(call, result); - return; - } - - Activity activity = registrar.activity(); - if (activity == null) { - result.error("no_activity", "firebase_admob plugin requires a foreground activity", null); - return; - } - - Integer id = call.argument("id"); - - switch (call.method) { - case "loadBannerAd": - callLoadBannerAd(id, activity, channel, call, result); - break; - case "loadInterstitialAd": - callLoadInterstitialAd(MobileAd.createInterstitial(id, activity, channel), call, result); - break; - case "loadRewardedVideoAd": - callLoadRewardedVideoAd(call, result); - break; - case "showAd": - callShowAd(id, call, result); - break; - case "showRewardedVideoAd": - callShowRewardedVideoAd(call, result); - break; - case "disposeAd": - callDisposeAd(id, call, result); - break; - case "isAdLoaded": - callIsAdLoaded(id, call, result); - break; - default: - result.notImplemented(); - } - } -} diff --git a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java deleted file mode 100644 index a13573194c94..000000000000 --- a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/MobileAd.java +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2017 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.firebaseadmob; - -import android.app.Activity; -import android.util.Log; -import android.util.SparseArray; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import com.google.android.gms.ads.AdListener; -import com.google.android.gms.ads.AdSize; -import com.google.android.gms.ads.AdView; -import com.google.android.gms.ads.InterstitialAd; -import io.flutter.plugin.common.MethodChannel; -import java.util.HashMap; -import java.util.Map; - -abstract class MobileAd extends AdListener { - private static final String TAG = "flutter"; - private static SparseArray allAds = new SparseArray(); - - final Activity activity; - final MethodChannel channel; - final int id; - Status status; - double anchorOffset; - double horizontalCenterOffset; - int anchorType; - - enum Status { - CREATED, - LOADING, - FAILED, - PENDING, // The ad will be shown when status is changed to LOADED. - LOADED, - } - - private MobileAd(int id, Activity activity, MethodChannel channel) { - this.id = id; - this.activity = activity; - this.channel = channel; - this.status = Status.CREATED; - this.anchorOffset = 0.0; - this.horizontalCenterOffset = 0.0; - this.anchorType = Gravity.BOTTOM; - allAds.put(id, this); - } - - static Banner createBanner(Integer id, AdSize adSize, Activity activity, MethodChannel channel) { - MobileAd ad = getAdForId(id); - return (ad != null) ? (Banner) ad : new Banner(id, adSize, activity, channel); - } - - static Interstitial createInterstitial(Integer id, Activity activity, MethodChannel channel) { - MobileAd ad = getAdForId(id); - return (ad != null) ? (Interstitial) ad : new Interstitial(id, activity, channel); - } - - static MobileAd getAdForId(Integer id) { - return allAds.get(id); - } - - Status getStatus() { - return status; - } - - abstract void load(String adUnitId, Map targetingInfo); - - abstract void show(); - - void dispose() { - allAds.remove(id); - } - - private Map argumentsMap(Object... args) { - Map arguments = new HashMap(); - arguments.put("id", id); - for (int i = 0; i < args.length; i += 2) arguments.put(args[i].toString(), args[i + 1]); - return arguments; - } - - @Override - public void onAdLoaded() { - boolean statusWasPending = status == Status.PENDING; - status = Status.LOADED; - channel.invokeMethod("onAdLoaded", argumentsMap()); - if (statusWasPending) show(); - } - - @Override - public void onAdFailedToLoad(int errorCode) { - Log.w(TAG, "onAdFailedToLoad: " + errorCode); - status = Status.FAILED; - channel.invokeMethod("onAdFailedToLoad", argumentsMap("errorCode", errorCode)); - } - - @Override - public void onAdOpened() { - channel.invokeMethod("onAdOpened", argumentsMap()); - } - - @Override - public void onAdClicked() { - channel.invokeMethod("onAdClicked", argumentsMap()); - } - - @Override - public void onAdImpression() { - channel.invokeMethod("onAdImpression", argumentsMap()); - } - - @Override - public void onAdLeftApplication() { - channel.invokeMethod("onAdLeftApplication", argumentsMap()); - } - - @Override - public void onAdClosed() { - channel.invokeMethod("onAdClosed", argumentsMap()); - } - - static class Banner extends MobileAd { - private AdView adView; - private AdSize adSize; - - private Banner(Integer id, AdSize adSize, Activity activity, MethodChannel channel) { - super(id, activity, channel); - this.adSize = adSize; - } - - @Override - void load(String adUnitId, Map targetingInfo) { - if (status != Status.CREATED) return; - status = Status.LOADING; - - adView = new AdView(activity); - adView.setAdSize(adSize); - adView.setAdUnitId(adUnitId); - adView.setAdListener(this); - - AdRequestBuilderFactory factory = new AdRequestBuilderFactory(targetingInfo); - adView.loadAd(factory.createAdRequestBuilder().build()); - } - - @Override - void show() { - if (status == Status.LOADING) { - status = Status.PENDING; - return; - } - if (status != Status.LOADED) return; - - if (activity.findViewById(id) == null) { - LinearLayout content = new LinearLayout(activity); - content.setId(id); - content.setOrientation(LinearLayout.VERTICAL); - content.setGravity(anchorType); - content.addView(adView); - final float scale = activity.getResources().getDisplayMetrics().density; - - int left = horizontalCenterOffset > 0 ? (int) (horizontalCenterOffset * scale) : 0; - int right = - horizontalCenterOffset < 0 ? (int) (Math.abs(horizontalCenterOffset) * scale) : 0; - if (anchorType == Gravity.BOTTOM) { - content.setPadding(left, 0, right, (int) (anchorOffset * scale)); - } else { - content.setPadding(left, (int) (anchorOffset * scale), right, 0); - } - - activity.addContentView( - content, - new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - } - } - - @Override - void dispose() { - super.dispose(); - - View contentView = activity.findViewById(id); - if (contentView == null || !(contentView.getParent() instanceof ViewGroup)) return; - - adView.destroy(); - - ViewGroup contentParent = (ViewGroup) (contentView.getParent()); - contentParent.removeView(contentView); - } - } - - static class Interstitial extends MobileAd { - private InterstitialAd interstitial = null; - - private Interstitial(int id, Activity activity, MethodChannel channel) { - super(id, activity, channel); - } - - @Override - void load(String adUnitId, Map targetingInfo) { - status = Status.LOADING; - - interstitial = new InterstitialAd(activity); - interstitial.setAdUnitId(adUnitId); - - interstitial.setAdListener(this); - AdRequestBuilderFactory factory = new AdRequestBuilderFactory(targetingInfo); - interstitial.loadAd(factory.createAdRequestBuilder().build()); - } - - @Override - void show() { - if (status == Status.LOADING) { - status = Status.PENDING; - return; - } - interstitial.show(); - } - - // It is not possible to hide/remove/destroy an AdMob interstitial Ad. - } -} diff --git a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/RewardedVideoAdWrapper.java b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/RewardedVideoAdWrapper.java deleted file mode 100644 index cc96880163fb..000000000000 --- a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/RewardedVideoAdWrapper.java +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2017 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.firebaseadmob; - -import android.app.Activity; -import android.util.Log; -import com.google.android.gms.ads.MobileAds; -import com.google.android.gms.ads.reward.RewardItem; -import com.google.android.gms.ads.reward.RewardedVideoAd; -import com.google.android.gms.ads.reward.RewardedVideoAdListener; -import io.flutter.plugin.common.MethodChannel; -import java.util.HashMap; -import java.util.Map; - -public class RewardedVideoAdWrapper implements RewardedVideoAdListener { - private static final String TAG = "flutter"; - - final RewardedVideoAd rewardedInstance; - final Activity activity; - final MethodChannel channel; - Status status; - - @Override - public void onRewardedVideoAdLoaded() { - status = Status.LOADED; - channel.invokeMethod("onRewardedVideoAdLoaded", argumentsMap()); - } - - @Override - public void onRewardedVideoAdOpened() { - channel.invokeMethod("onRewardedVideoAdOpened", argumentsMap()); - } - - @Override - public void onRewardedVideoStarted() { - channel.invokeMethod("onRewardedVideoStarted", argumentsMap()); - } - - @Override - public void onRewardedVideoAdClosed() { - this.status = Status.CREATED; - channel.invokeMethod("onRewardedVideoAdClosed", argumentsMap()); - } - - @Override - public void onRewardedVideoCompleted() { - channel.invokeMethod("onRewardedVideoCompleted", argumentsMap()); - } - - @Override - public void onRewarded(RewardItem rewardItem) { - channel.invokeMethod( - "onRewarded", - argumentsMap("rewardType", rewardItem.getType(), "rewardAmount", rewardItem.getAmount())); - } - - @Override - public void onRewardedVideoAdLeftApplication() { - channel.invokeMethod("onRewardedVideoAdLeftApplication", argumentsMap()); - } - - @Override - public void onRewardedVideoAdFailedToLoad(int errorCode) { - Log.w(TAG, "onRewardedVideoAdFailedToLoad: " + errorCode); - status = Status.FAILED; - channel.invokeMethod("onRewardedVideoAdFailedToLoad", argumentsMap("errorCode", errorCode)); - } - - enum Status { - CREATED, - LOADING, - FAILED, - LOADED - } - - public RewardedVideoAdWrapper(Activity activity, MethodChannel channel) { - this.activity = activity; - this.channel = channel; - this.status = Status.CREATED; - this.rewardedInstance = MobileAds.getRewardedVideoAdInstance(activity); - this.rewardedInstance.setRewardedVideoAdListener(this); - } - - Status getStatus() { - return status; - } - - public void load(String adUnitId, Map targetingInfo) { - status = Status.LOADING; - AdRequestBuilderFactory factory = new AdRequestBuilderFactory(targetingInfo); - rewardedInstance.loadAd(adUnitId, factory.createAdRequestBuilder().build()); - } - - public void show() { - if (rewardedInstance.isLoaded()) { - rewardedInstance.show(); - } - } - - private Map argumentsMap(Object... args) { - Map arguments = new HashMap(); - for (int i = 0; i < args.length; i += 2) arguments.put(args[i].toString(), args[i + 1]); - return arguments; - } -} diff --git a/packages/firebase_admob/example/README.md b/packages/firebase_admob/example/README.md deleted file mode 100644 index 148a11720dd8..000000000000 --- a/packages/firebase_admob/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_admob_example - -Demonstrates how to use the firebase_admob plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_admob/example/android.iml b/packages/firebase_admob/example/android.iml deleted file mode 100644 index 462b903e05b6..000000000000 --- a/packages/firebase_admob/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_admob/example/android/app/build.gradle b/packages/firebase_admob/example/android/app/build.gradle deleted file mode 100644 index f919f535e16d..000000000000 --- a/packages/firebase_admob/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebaseadmobexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_admob/example/android/app/google-services.json b/packages/firebase_admob/example/android/app/google-services.json deleted file mode 100644 index ee45722eb3f3..000000000000 --- a/packages/firebase_admob/example/android/app/google-services.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "project_info": { - "project_number": "395789065833", - "firebase_url": "https://admob-test-66963.firebaseio.com", - "project_id": "admob-test-66963", - "storage_bucket": "admob-test-66963.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:395789065833:android:cf455c18665bfb73", - "android_client_info": { - "package_name": "com.yourcompany.ads" - } - }, - "oauth_client": [ - { - "client_id": "395789065833-72h13sj0ba0alalnijd26ni8q19d7s27.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.yourcompany.ads", - "certificate_hash": "266da292ae1273cd3bedde8f7e5d82080234d46f" - } - }, - { - "client_id": "395789065833-soebkshopimb9sbsugdqeohjcrqc1h5v.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyAckYXawYez8b74iXfGVM7OBowoqjhiZ38" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "395789065833-soebkshopimb9sbsugdqeohjcrqc1h5v.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:395789065833:android:d848e43bc35ca200", - "android_client_info": { - "package_name": "io.flutter.plugins.firebaseadmobexample" - } - }, - "oauth_client": [ - { - "client_id": "395789065833-jo1lkael0e4be0r2o2tan6qm3khfr6rs.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseadmobexample", - "certificate_hash": "266da292ae1273cd3bedde8f7e5d82080234d46f" - } - }, - { - "client_id": "395789065833-soebkshopimb9sbsugdqeohjcrqc1h5v.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyAckYXawYez8b74iXfGVM7OBowoqjhiZ38" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "395789065833-soebkshopimb9sbsugdqeohjcrqc1h5v.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_admob/example/android/app/gradle.properties b/packages/firebase_admob/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_admob/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_admob/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_admob/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_admob/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_admob/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_admob/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 2e3a97d95f94..000000000000 --- a/packages/firebase_admob/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/firebase_admob/example/android/app/src/main/java/io/flutter/plugins/firebaseadmobexample/MainActivity.java b/packages/firebase_admob/example/android/app/src/main/java/io/flutter/plugins/firebaseadmobexample/MainActivity.java deleted file mode 100644 index 14775bbf2fb7..000000000000 --- a/packages/firebase_admob/example/android/app/src/main/java/io/flutter/plugins/firebaseadmobexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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.firebaseadmobexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_admob/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_admob/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_admob/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_admob/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_admob/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_admob/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_admob/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_admob/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_admob/example/android/build.gradle b/packages/firebase_admob/example/android/build.gradle deleted file mode 100644 index 695de848ec30..000000000000 --- a/packages/firebase_admob/example/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - mavenLocal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_admob/example/android/gradle.properties b/packages/firebase_admob/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_admob/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_admob/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_admob/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/firebase_admob/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_admob/example/android/settings.gradle b/packages/firebase_admob/example/android/settings.gradle deleted file mode 100644 index 115da6cb4f4d..000000000000 --- a/packages/firebase_admob/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_admob/example/firebase_admob_example.iml b/packages/firebase_admob/example/firebase_admob_example.iml deleted file mode 100644 index 9d5dae19540c..000000000000 --- a/packages/firebase_admob/example/firebase_admob_example.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_admob/example/firebase_admob_example_android.iml b/packages/firebase_admob/example/firebase_admob_example_android.iml deleted file mode 100644 index 462b903e05b6..000000000000 --- a/packages/firebase_admob/example/firebase_admob_example_android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_admob/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_admob/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6c2de8086bcd..000000000000 --- a/packages/firebase_admob/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_admob/example/ios/Flutter/Debug.xcconfig b/packages/firebase_admob/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_admob/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_admob/example/ios/Flutter/Release.xcconfig b/packages/firebase_admob/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_admob/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_admob/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_admob/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index e2d0ec0f0e29..000000000000 --- a/packages/firebase_admob/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,485 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 6E27B1151F0DAFA70028FD65 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6E27B1141F0DAFA70028FD65 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 */; }; - FBE669D215209F1F44CEEB21 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 83F369F228D3A43519CEE308 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 6E27B1141F0DAFA70028FD65 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.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 = ""; }; - 83F369F228D3A43519CEE308 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - FBE669D215209F1F44CEEB21 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 07A52D07C2C05D9527204891 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 5B6AAA352BAC85BF7DD68C46 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 83F369F228D3A43519CEE308 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 07A52D07C2C05D9527204891 /* Pods */, - 5B6AAA352BAC85BF7DD68C46 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 6E27B1141F0DAFA70028FD65 /* GoogleService-Info.plist */, - 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 = ( - 2C1A4E9A6849F7CC6B679EA5 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E42D8ABA8B028F5FFACB19B6 /* [CP] Embed Pods Frameworks */, - ); - 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 = ( - 6E27B1151F0DAFA70028FD65 /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 2C1A4E9A6849F7CC6B679EA5 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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; - }; - 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\" 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"; - }; - E42D8ABA8B028F5FFACB19B6 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/.symlinks/flutter/ios/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseAdMobExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseAdMobExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_admob/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_admob/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/firebase_admob/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/firebase_admob/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_admob/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1c9580788197..000000000000 --- a/packages/firebase_admob/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_admob/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_admob/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_admob/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_admob/example/ios/Runner/AppDelegate.h b/packages/firebase_admob/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e990f2e..000000000000 --- a/packages/firebase_admob/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_admob/example/ios/Runner/AppDelegate.m b/packages/firebase_admob/example/ios/Runner/AppDelegate.m deleted file mode 100644 index f08675707182..000000000000 --- a/packages/firebase_admob/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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. - -#include "AppDelegate.h" -#include "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_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d22f10b2ab63..000000000000 --- a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_admob/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 zcmV-m2cP(fP)x~L`~4d)Rspd&<9kFh{hn*KP1LP0~$;u(LfAu zp%fx&qLBcRHx$G|3q(bv@+b;o0*D|jwD-Q9uQR(l*ST}s+uPgQ-MeFwZ#GS?b332? z&Tk$&_miXn3IGq)AmQ)3sisq{raD4(k*bHvpCe-TdWq^NRTEVM)i9xbgQ&ccnUVx* zEY%vS%gDcSg=!tuIK8$Th2_((_h^+7;R|G{n06&O2#6%LK`a}n?h_fL18btz<@lFG za}xS}u?#DBMB> zw^b($1Z)`9G?eP95EKi&$eOy@K%h;ryrR3la%;>|o*>CgB(s>dDcNOXg}CK9SPmD? zmr-s{0wRmxUnbDrYfRvnZ@d z6johZ2sMX{YkGSKWd}m|@V7`Degt-43=2M?+jR%8{(H$&MLLmS;-|JxnX2pnz;el1jsvqQz}pGSF<`mqEXRQ5sC4#BbwnB_4` zc5bFE-Gb#JV3tox9fp-vVEN{(tOCpRse`S+@)?%pz+zVJXSooTrNCUg`R6`hxwb{) zC@{O6MKY8tfZ5@!yy=p5Y|#+myRL=^{tc(6YgAnkg3I(Cd!r5l;|;l-MQ8B`;*SCE z{u)uP^C$lOPM z5d~UhKhRRmvv{LIa^|oavk1$QiEApSrP@~Jjbg`<*dW4TO?4qG%a%sTPUFz(QtW5( zM)lA+5)0TvH~aBaOAs|}?u2FO;yc-CZ1gNM1dAxJ?%m?YsGR`}-xk2*dxC}r5j$d* zE!#Vtbo69h>V4V`BL%_&$} z+oJAo@jQ^Tk`;%xw-4G>hhb&)B?##U+(6Fi7nno`C<|#PVA%$Y{}N-?(Gc$1%tr4Pc}}hm~yY#fTOe!@v9s-ik$dX~|ygArPhByaXn8 zpI^FUjNWMsTFKTP3X7m?UK)3m zp6rI^_zxRYrx6_QmhoWoDR`fp4R7gu6;gdO)!KexaoO2D88F9x#TM1(9Bn7g;|?|o z)~$n&Lh#hCP6_LOPD>a)NmhW})LADx2kq=X7}7wYRj-0?dXr&bHaRWCfSqvzFa=sn z-8^gSyn-RmH=BZ{AJZ~!8n5621GbUJV7Qvs%JNv&$%Q17s_X%s-41vAPfIR>;x0Wlqr5?09S>x#%Qkt>?(&XjFRY}*L6BeQ3 z<6XEBh^S7>AbwGm@XP{RkeEKj6@_o%oV?hDuUpUJ+r#JZO?!IUc;r0R?>mi)*ZpQ) z#((dn=A#i_&EQn|hd)N$#A*fjBFuiHcYvo?@y1 z5|fV=a^a~d!c-%ZbMNqkMKiSzM{Yq=7_c&1H!mXk60Uv32dV;vMg&-kQ)Q{+PFtwc zj|-uQ;b^gts??J*9VxxOro}W~Q9j4Em|zSRv)(WSO9$F$s=Ydu%Q+5DOid~lwk&we zY%W(Z@ofdwPHncEZzZgmqS|!gTj3wQq9rxQy+^eNYKr1mj&?tm@wkO*9@UtnRMG>c aR{jt9+;fr}hV%pg00001^@s67{VYS000c7NklQEG_j zup^)eW&WUIApqy$=APz8jE@awGp)!bsTjDbrJO`$x^ZR^dr;>)LW>{ zs70vpsD38v)19rI=GNk1b(0?Js9~rjsQsu*K;@SD40RB-3^gKU-MYC7G!Bw{fZsqp zih4iIi;Hr_xZ033Iu{sQxLS=}yBXgLMn40d++>aQ0#%8D1EbGZp7+ z5=mK?t31BkVYbGOxE9`i748x`YgCMwL$qMsChbSGSE1`p{nSmadR zcQ#R)(?!~dmtD0+D2!K zR9%!Xp1oOJzm(vbLvT^$IKp@+W2=-}qTzTgVtQ!#Y7Gxz}stUIm<1;oBQ^Sh2X{F4ibaOOx;5ZGSNK z0maF^@(UtV$=p6DXLgRURwF95C=|U8?osGhgOED*b z7woJ_PWXBD>V-NjQAm{~T%sjyJ{5tn2f{G%?J!KRSrrGvQ1(^`YLA5B!~eycY(e5_ z*%aa{at13SxC(=7JT7$IQF~R3sy`Nn%EMv!$-8ZEAryB*yB1k&stni)=)8-ODo41g zkJu~roIgAih94tb=YsL%iH5@^b~kU9M-=aqgXIrbtxMpFy5mekFm#edF9z7RQ6V}R zBIhbXs~pMzt0VWy1Fi$^fh+1xxLDoK09&5&MJl(q#THjPm(0=z2H2Yfm^a&E)V+a5 zbi>08u;bJsDRUKR9(INSc7XyuWv(JsD+BB*0hS)FO&l&7MdViuur@-<-EHw>kHRGY zqoT}3fDv2-m{NhBG8X}+rgOEZ;amh*DqN?jEfQdqxdj08`Sr=C-KmT)qU1 z+9Cl)a1mgXxhQiHVB}l`m;-RpmKy?0*|yl?FXvJkFxuu!fKlcmz$kN(a}i*saM3nr z0!;a~_%Xqy24IxA2rz<+08=B-Q|2PT)O4;EaxP^6qixOv7-cRh?*T?zZU`{nIM-at zTKYWr9rJ=tppQ9I#Z#mLgINVB!pO-^FOcvFw6NhV0gztuO?g ztoA*C-52Q-Z-P#xB4HAY3KQVd%dz1S4PA3vHp0aa=zAO?FCt zC_GaTyVBg2F!bBr3U@Zy2iJgIAt>1sf$JWA9kh{;L+P*HfUBX1Zy{4MgNbDfBV_ly z!y#+753arsZUt@366jIC0klaC@ckuk!qu=pAyf7&QmiBUT^L1&tOHzsK)4n|pmrVT zs2($4=?s~VejTFHbFdDOwG;_58LkIj1Fh@{glkO#F1>a==ymJS$z;gdedT1zPx4Kj ztjS`y_C}%af-RtpehdQDt3a<=W5C4$)9W@QAse;WUry$WYmr51ml9lkeunUrE`-3e zmq1SgSOPNEE-Mf+AGJ$g0M;3@w!$Ej;hMh=v=I+Lpz^n%Pg^MgwyqOkNyu2c^of)C z1~ALor3}}+RiF*K4+4{(1%1j3pif1>sv0r^mTZ?5Jd-It!tfPfiG_p$AY*Vfak%FG z4z#;wLtw&E&?}w+eKG^=#jF7HQzr8rV0mY<1YAJ_uGz~$E13p?F^fPSzXSn$8UcI$ z8er9{5w5iv0qf8%70zV71T1IBB1N}R5Kp%NO0=5wJalZt8;xYp;b{1K) zHY>2wW-`Sl{=NpR%iu3(u6l&)rc%%cSA#aV7WCowfbFR4wcc{LQZv~o1u_`}EJA3>ki`?9CKYTA!rhO)if*zRdd}Kn zEPfYbhoVE~!FI_2YbC5qAj1kq;xP6%J8+?2PAs?`V3}nyFVD#sV3+uP`pi}{$l9U^ zSz}_M9f7RgnnRhaoIJgT8us!1aB&4!*vYF07Hp&}L zCRlop0oK4DL@ISz{2_BPlezc;xj2|I z23RlDNpi9LgTG_#(w%cMaS)%N`e>~1&a3<{Xy}>?WbF>OOLuO+j&hc^YohQ$4F&ze z+hwnro1puQjnKm;vFG~o>`kCeUIlkA-2tI?WBKCFLMBY=J{hpSsQ=PDtU$=duS_hq zHpymHt^uuV1q@uc4bFb{MdG*|VoW@15Osrqt2@8ll0qO=j*uOXn{M0UJX#SUztui9FN4)K3{9!y8PC-AHHvpVTU;x|-7P+taAtyglk#rjlH2 z5Gq8ik}BPaGiM{#Woyg;*&N9R2{J0V+WGB69cEtH7F?U~Kbi6ksi*`CFXsi931q7Y zGO82?whBhN%w1iDetv%~wM*Y;E^)@Vl?VDj-f*RX>{;o_=$fU!&KAXbuadYZ46Zbg z&6jMF=49$uL^73y;;N5jaHYv)BTyfh&`qVLYn?`o6BCA_z-0niZz=qPG!vonK3MW_ zo$V96zM!+kJRs{P-5-rQVse0VBH*n6A58)4uc&gfHMa{gIhV2fGf{st>E8sKyP-$8zp~wJX^A*@DI&-;8>gANXZj zU)R+Y)PB?=)a|Kj>8NXEu^S_h^7R`~Q&7*Kn!xyvzVv&^>?^iu;S~R2e-2fJx-oUb cX)(b1KSk$MOV07*qoM6N<$f&6$jw%VRuvdN2+38CZWny1cRtlsl+0_KtW)EU14Ei(F!UtWuj4IK+3{sK@>rh zs1Z;=(DD&U6+tlyL?UnHVN^&g6QhFi2#HS+*qz;(>63G(`|jRtW|nz$Pv7qTovP!^ zP_jES{mr@O-02w%!^a?^1ZP!_KmQiz0L~jZ=W@Qt`8wzOoclQsAS<5YdH;a(4bGLE zk8s}1If(PSIgVi!XE!5kA?~z*sobvNyohr;=Q_@h2@$6Flyej3J)D-6YfheRGl`HEcPk|~huT_2-U?PfL=4BPV)f1o!%rQ!NMt_MYw-5bUSwQ9Z&zC>u zOrl~UJglJNa%f50Ok}?WB{on`Ci`p^Y!xBA?m@rcJXLxtrE0FhRF3d*ir>yzO|BD$ z3V}HpFcCh6bTzY}Nt_(W%QYd3NG)jJ4<`F<1Od) zfQblTdC&h2lCz`>y?>|9o2CdvC8qZeIZt%jN;B7Hdn2l*k4M4MFEtq`q_#5?}c$b$pf_3y{Y!cRDafZBEj-*OD|gz#PBDeu3QoueOesLzB+O zxjf2wvf6Wwz>@AiOo2mO4=TkAV+g~%_n&R;)l#!cBxjuoD$aS-`IIJv7cdX%2{WT7 zOm%5rs(wqyPE^k5SIpUZ!&Lq4<~%{*>_Hu$2|~Xa;iX*tz8~G6O3uFOS?+)tWtdi| zV2b#;zRN!m@H&jd=!$7YY6_}|=!IU@=SjvGDFtL;aCtw06U;-v^0%k0FOyESt z1Wv$={b_H&8FiRV?MrzoHWd>%v6KTRU;-v^Miiz+@q`(BoT!+<37CKhoKb)|8!+RG z6BQFU^@fRW;s8!mOf2QViKQGk0TVER6EG1`#;Nm39Do^PoT!+<37AD!%oJe86(=et zZ~|sLzU>V-qYiU6V8$0GmU7_K8|Fd0B?+9Un1BhKAz#V~Fk^`mJtlCX#{^8^M8!me z8Yg;8-~>!e<-iG;h*0B1kBKm}hItVGY6WnjVpgnTTAC$rqQ^v)4KvOtpY|sIj@WYg zyw##ZZ5AC2IKNC;^hwg9BPk0wLStlmBr;E|$5GoAo$&Ui_;S9WY62n3)i49|T%C#i017z3J=$RF|KyZWnci*@lW4 z=AKhNN6+m`Q!V3Ye68|8y@%=am>YD0nG99M)NWc20%)gwO!96j7muR}Fr&54SxKP2 zP30S~lt=a*qDlbu3+Av57=9v&vr<6g0&`!8E2fq>I|EJGKs}t|{h7+KT@)LfIV-3K zK)r_fr2?}FFyn*MYoLC>oV-J~eavL2ho4a4^r{E-8m2hi>~hA?_vIG4a*KT;2eyl1 zh_hUvUJpNCFwBvRq5BI*srSle>c6%n`#VNsyC|MGa{(P&08p=C9+WUw9Hl<1o9T4M zdD=_C0F7#o8A_bRR?sFNmU0R6tW`ElnF8p53IdHo#S9(JoZCz}fHwJ6F<&?qrpVqE zte|m%89JQD+XwaPU#%#lVs-@-OL);|MdfINd6!XwP2h(eyafTUsoRkA%&@fe?9m@jw-v(yTTiV2(*fthQH9}SqmsRPVnwwbV$1E(_lkmo&S zF-truCU914_$jpqjr(>Ha4HkM4YMT>m~NosUu&UZ>zirfHo%N6PPs9^_o$WqPA0#5 z%tG>qFCL+b*0s?sZ;Sht0nE7Kl>OVXy=gjWxxK;OJ3yGd7-pZf7JYNcZo2*1SF`u6 zHJyRRxGw9mDlOiXqVMsNe#WX`fC`vrtjSQ%KmLcl(lC>ZOQzG^%iql2w-f_K@r?OE zwCICifM#L-HJyc7Gm>Ern?+Sk3&|Khmu4(~3qa$(m6Ub^U0E5RHq49za|XklN#?kP zl;EstdW?(_4D>kwjWy2f!LM)y?F94kyU3`W!6+AyId-89v}sXJpuic^NLL7GJItl~ zsiuB98AI-(#Mnm|=A-R6&2fwJ0JVSY#Q>&3$zFh|@;#%0qeF=j5Ajq@4i0tIIW z&}sk$&fGwoJpe&u-JeGLi^r?dO`m=y(QO{@h zQqAC7$rvz&5+mo3IqE?h=a~6m>%r5Quapvzq;{y~p zJpyXOBgD9VrW7@#p6l7O?o3feml(DtSL>D^R) zZUY%T2b0-vBAFN7VB;M88!~HuOXi4KcI6aRQ&h|XQ0A?m%j2=l1f0cGP}h(oVfJ`N zz#PpmFC*ieab)zJK<4?^k=g%OjPnkANzbAbmGZHoVRk*mTfm75s_cWVa`l*f$B@xu z5E*?&@seIo#*Y~1rBm!7sF9~~u6Wrj5oICUOuz}CS)jdNIznfzCA(stJ(7$c^e5wN z?lt>eYgbA!kvAR7zYSD&*r1$b|(@;9dcZ^67R0 zXAXJKa|5Sdmj!g578Nwt6d$sXuc&MWezA0Whd`94$h{{?1IwXP4)Tx4obDK%xoFZ_Z zjjHJ_P@R_e5blG@yEjnaJb`l;s%Lb2&=8$&Ct-fV`E^4CUs)=jTk!I}2d&n!f@)bm z@ z_4Dc86+3l2*p|~;o-Sb~oXb_RuLmoifDU^&Te$*FevycC0*nE3Xws8gsWp|Rj2>SM zns)qcYj?^2sd8?N!_w~4v+f-HCF|a$TNZDoNl$I1Uq87euoNgKb6&r26TNrfkUa@o zfdiFA@p{K&mH3b8i!lcoz)V{n8Q@g(vR4ns4r6w;K z>1~ecQR0-<^J|Ndg5fvVUM9g;lbu-){#ghGw(fg>L zh)T5Ljb%lWE;V9L!;Cqk>AV1(rULYF07ZBJbGb9qbSoLAd;in9{)95YqX$J43-dY7YU*k~vrM25 zxh5_IqO0LYZW%oxQ5HOzmk4x{atE*vipUk}sh88$b2tn?!ujEHn`tQLe&vo}nMb&{ zio`xzZ&GG6&ZyN3jnaQy#iVqXE9VT(3tWY$n-)uWDQ|tc{`?fq2F`oQ{;d3aWPg4Hp-(iE{ry>MIPWL> iW8 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_admob/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_admob/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_admob/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_admob/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_admob/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 907bb24d3bd4..000000000000 --- a/packages/firebase_admob/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 395789065833-eo2pbi7673tisook4bem8jlhikgthqvd.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.395789065833-eo2pbi7673tisook4bem8jlhikgthqvd - API_KEY - AIzaSyAbCza-YTeE5nvWNGGzdlrS4JzZMtfArHY - GCM_SENDER_ID - 395789065833 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebaseadmobile - PROJECT_ID - admob-test-66963 - STORAGE_BUCKET - admob-test-66963.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:395789065833:ios:5c32deb7b961ebcf - DATABASE_URL - https://admob-test-66963.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_admob/example/ios/Runner/Info.plist b/packages/firebase_admob/example/ios/Runner/Info.plist deleted file mode 100644 index dc157b6af2ac..000000000000 --- a/packages/firebase_admob/example/ios/Runner/Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - GADApplicationIdentifier - ca-app-pub-3940256099942544~1458002511 - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_admob_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_admob/example/ios/Runner/main.m b/packages/firebase_admob/example/ios/Runner/main.m deleted file mode 100644 index bec320c0bee0..000000000000 --- a/packages/firebase_admob/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/firebase_admob/example/lib/main.dart b/packages/firebase_admob/example/lib/main.dart deleted file mode 100644 index e5014d652f13..000000000000 --- a/packages/firebase_admob/example/lib/main.dart +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2017 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:flutter/material.dart'; -import 'package:firebase_admob/firebase_admob.dart'; - -// You can also test with your own ad unit IDs by registering your device as a -// test device. Check the logs for your device's ID value. -const String testDevice = 'YOUR_DEVICE_ID'; - -class MyApp extends StatefulWidget { - @override - _MyAppState createState() => _MyAppState(); -} - -class _MyAppState extends State { - static const MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo( - testDevices: testDevice != null ? [testDevice] : null, - keywords: ['foo', 'bar'], - contentUrl: 'http://foo.com/bar.html', - childDirected: true, - nonPersonalizedAds: true, - ); - - BannerAd _bannerAd; - InterstitialAd _interstitialAd; - int _coins = 0; - - BannerAd createBannerAd() { - return BannerAd( - adUnitId: BannerAd.testAdUnitId, - size: AdSize.banner, - targetingInfo: targetingInfo, - listener: (MobileAdEvent event) { - print("BannerAd event $event"); - }, - ); - } - - InterstitialAd createInterstitialAd() { - return InterstitialAd( - adUnitId: InterstitialAd.testAdUnitId, - targetingInfo: targetingInfo, - listener: (MobileAdEvent event) { - print("InterstitialAd event $event"); - }, - ); - } - - @override - void initState() { - super.initState(); - FirebaseAdMob.instance.initialize(appId: FirebaseAdMob.testAppId); - _bannerAd = createBannerAd()..load(); - RewardedVideoAd.instance.listener = - (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) { - print("RewardedVideoAd event $event"); - if (event == RewardedVideoAdEvent.rewarded) { - setState(() { - _coins += rewardAmount; - }); - } - }; - } - - @override - void dispose() { - _bannerAd?.dispose(); - _interstitialAd?.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('AdMob Plugin example app'), - ), - body: SingleChildScrollView( - child: Center( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - RaisedButton( - child: const Text('SHOW BANNER'), - onPressed: () { - _bannerAd ??= createBannerAd(); - _bannerAd - ..load() - ..show(); - }), - RaisedButton( - child: const Text('SHOW BANNER WITH OFFSET'), - onPressed: () { - _bannerAd ??= createBannerAd(); - _bannerAd - ..load() - ..show(horizontalCenterOffset: -50, anchorOffset: 100); - }), - RaisedButton( - child: const Text('REMOVE BANNER'), - onPressed: () { - _bannerAd?.dispose(); - _bannerAd = null; - }), - RaisedButton( - child: const Text('LOAD INTERSTITIAL'), - onPressed: () { - _interstitialAd?.dispose(); - _interstitialAd = createInterstitialAd()..load(); - }, - ), - RaisedButton( - child: const Text('SHOW INTERSTITIAL'), - onPressed: () { - _interstitialAd?.show(); - }, - ), - RaisedButton( - child: const Text('LOAD REWARDED VIDEO'), - onPressed: () { - RewardedVideoAd.instance.load( - adUnitId: RewardedVideoAd.testAdUnitId, - targetingInfo: targetingInfo); - }, - ), - RaisedButton( - child: const Text('SHOW REWARDED VIDEO'), - onPressed: () { - RewardedVideoAd.instance.show(); - }, - ), - Text("You have $_coins coins."), - ].map((Widget button) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 16.0), - child: button, - ); - }).toList(), - ), - ), - ), - ), - ); - } -} - -void main() { - runApp(MyApp()); -} diff --git a/packages/firebase_admob/example/pubspec.yaml b/packages/firebase_admob/example/pubspec.yaml deleted file mode 100644 index 775e4852b10a..000000000000 --- a/packages/firebase_admob/example/pubspec.yaml +++ /dev/null @@ -1,12 +0,0 @@ -name: firebase_admob_example -description: Demonstrates how to use the firebase_admob plugin. - -dependencies: - flutter: - sdk: flutter - firebase_admob: - path: ../ - firebase_core: ^0.4.0 - -flutter: - uses-material-design: true diff --git a/packages/firebase_admob/firebase_admob_android.iml b/packages/firebase_admob/firebase_admob_android.iml deleted file mode 100644 index 462b903e05b6..000000000000 --- a/packages/firebase_admob/firebase_admob_android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_admob/ios/Assets/.gitkeep b/packages/firebase_admob/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_admob/ios/Classes/FLTMobileAd.h b/packages/firebase_admob/ios/Classes/FLTMobileAd.h deleted file mode 100644 index 1979be13eb4e..000000000000 --- a/packages/firebase_admob/ios/Classes/FLTMobileAd.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import "GoogleMobileAds/GoogleMobileAds.h" - -typedef enum : NSUInteger { - CREATED, - LOADING, - FAILED, - PENDING, // Will be shown when status is changed to LOADED. - LOADED, -} FLTMobileAdStatus; - -@interface FLTMobileAd : NSObject -+ (void)configureWithAppId:(NSString *)appId; -+ (FLTMobileAd *)getAdForId:(NSNumber *)mobileAdId; -- (FLTMobileAdStatus)status; -- (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targetingInfo; -- (void)show; -- (void)showAtOffset:(double)anchorOffset - hCenterOffset:(double)horizontalCenterOffset - fromAnchor:(int)anchorType; -- (void)dispose; -@end - -@interface FLTBannerAd : FLTMobileAd -+ (instancetype)withId:(NSNumber *)mobileAdId - adSize:(GADAdSize)adSize - channel:(FlutterMethodChannel *)channel; -@end - -@interface FLTInterstitialAd : FLTMobileAd -+ (instancetype)withId:(NSNumber *)mobileAdId channel:(FlutterMethodChannel *)channel; -@end diff --git a/packages/firebase_admob/ios/Classes/FLTMobileAd.m b/packages/firebase_admob/ios/Classes/FLTMobileAd.m deleted file mode 100644 index 9e263406d620..000000000000 --- a/packages/firebase_admob/ios/Classes/FLTMobileAd.m +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FLTMobileAd.h" -#import "FLTRequestFactory.h" -#import "FirebaseAdMobPlugin.h" - -static NSMutableDictionary *allAds = nil; -static NSDictionary *statusToString = nil; - -@implementation FLTMobileAd -NSNumber *_mobileAdId; -FlutterMethodChannel *_channel; -FLTMobileAdStatus _status; -double _anchorOffset; -double _horizontalCenterOffset; -int _anchorType; - -+ (void)initialize { - if (allAds == nil) { - allAds = [[NSMutableDictionary alloc] init]; - } - _anchorType = 0; - _anchorOffset = 0; - _horizontalCenterOffset = 0; - - if (statusToString == nil) { - statusToString = @{ - @(CREATED) : @"CREATED", - @(LOADING) : @"LOADING", - @(FAILED) : @"FAILED", - @(PENDING) : @"PENDING", - @(LOADED) : @"LOADED" - }; - } -} - -+ (void)configureWithAppId:(NSString *)appId { - [GADMobileAds configureWithApplicationID:appId]; -} - -+ (FLTMobileAd *)getAdForId:(NSNumber *)mobileAdId { - return allAds[mobileAdId]; -} - -+ (UIViewController *)rootViewController { - return [UIApplication sharedApplication].delegate.window.rootViewController; -} - -- (instancetype)initWithId:(NSNumber *)mobileAdId channel:(FlutterMethodChannel *)channel { - self = [super init]; - if (self) { - _mobileAdId = mobileAdId; - _channel = channel; - _status = CREATED; - _anchorOffset = 0; - _horizontalCenterOffset = 0; - _anchorType = 0; - allAds[mobileAdId] = self; - } - return self; -} - -- (FLTMobileAdStatus)status { - return _status; -} - -- (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targetingInfo { - // Implemented by the Banner and Interstitial subclasses -} - -- (void)showAtOffset:(double)anchorOffset - hCenterOffset:(double)horizontalCenterOffset - fromAnchor:(int)anchorType { - _anchorType = anchorType; - _anchorOffset = anchorOffset; - if (_anchorType == 0) { - _anchorOffset = -_anchorOffset; - } - _horizontalCenterOffset = horizontalCenterOffset; - [self show]; -} - -- (void)show { - // Implemented by the Banner and Interstitial subclasses -} - -- (void)dispose { - [allAds removeObjectForKey:_mobileAdId]; -} - -- (NSDictionary *)argumentsMap { - return @{@"id" : _mobileAdId}; -} - -- (NSString *)description { - NSString *statusString = (NSString *)statusToString[[NSNumber numberWithInt:_status]]; - return [NSString - stringWithFormat:@"%@ %@ mobileAdId:%@", super.description, statusString, _mobileAdId]; -} -@end - -@implementation FLTBannerAd -GADBannerView *_banner; -GADAdSize _adSize; - -+ (instancetype)withId:(NSNumber *)mobileAdId - adSize:(GADAdSize)adSize - channel:(FlutterMethodChannel *)channel { - FLTMobileAd *ad = [FLTMobileAd getAdForId:mobileAdId]; - return ad != nil ? (FLTBannerAd *)ad - : [[FLTBannerAd alloc] initWithId:mobileAdId adSize:adSize channel:channel]; -} - -- (instancetype)initWithId:mobileAdId - adSize:(GADAdSize)adSize - channel:(FlutterMethodChannel *)channel { - self = [super initWithId:mobileAdId channel:channel]; - if (self) { - _adSize = adSize; - return self; - } - - return nil; -} - -- (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targetingInfo { - if (_status != CREATED) return; - _status = LOADING; - _banner = [[GADBannerView alloc] initWithAdSize:_adSize]; - _banner.delegate = self; - _banner.adUnitID = adUnitId; - _banner.rootViewController = [FLTMobileAd rootViewController]; - FLTRequestFactory *factory = [[FLTRequestFactory alloc] initWithTargetingInfo:targetingInfo]; - [_banner loadRequest:[factory createRequest]]; -} - -- (void)show { - if (_status == LOADING) { - _status = PENDING; - return; - } - - if (_status != LOADED) return; - - _banner.translatesAutoresizingMaskIntoConstraints = NO; - UIView *screen = [FLTMobileAd rootViewController].view; - [screen addSubview:_banner]; - -#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0) - if (@available(ios 11.0, *)) { - UILayoutGuide *guide = screen.safeAreaLayoutGuide; - [NSLayoutConstraint activateConstraints:@[ - [_banner.centerXAnchor constraintEqualToAnchor:guide.centerXAnchor - constant:_horizontalCenterOffset], - [_banner.bottomAnchor - constraintEqualToAnchor:_anchorType == 0 ? guide.bottomAnchor : guide.topAnchor - constant:_anchorOffset] - ]]; - } else { - [self placeBannerPreIos11]; - } -#else - [self placeBannerPreIos11]; -#endif -} - -- (void)placeBannerPreIos11 { - UIView *screen = [FLTMobileAd rootViewController].view; - CGFloat x = screen.frame.size.width / 2 - _banner.frame.size.width / 2 + _horizontalCenterOffset; - CGFloat y; - if (_anchorType == 0) { - y = screen.frame.size.height - _banner.frame.size.height + _anchorOffset; - } else { - y = _anchorOffset; - } - _banner.frame = (CGRect){{x, y}, _banner.frame.size}; - [screen addSubview:_banner]; -} - -- (void)adViewDidReceiveAd:(GADBannerView *)adView { - bool statusWasPending = _status == PENDING; - _status = LOADED; - [_channel invokeMethod:@"onAdLoaded" arguments:[self argumentsMap]]; - if (statusWasPending) [self show]; -} - -- (void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error { - FLTLogWarning(@"adView:didFailToReceiveAdWithError: %@ (MobileAd %@)", - [error localizedDescription], self); - [_channel invokeMethod:@"onAdFailedToLoad" arguments:[self argumentsMap]]; -} - -- (void)adViewWillPresentScreen:(GADBannerView *)adView { - [_channel invokeMethod:@"onAdClicked" arguments:[self argumentsMap]]; -} - -- (void)adViewWillDismissScreen:(GADBannerView *)adView { - [_channel invokeMethod:@"onAdImpression" arguments:[self argumentsMap]]; -} - -- (void)adViewDidDismissScreen:(GADBannerView *)adView { - [_channel invokeMethod:@"onAdClosed" arguments:[self argumentsMap]]; -} - -- (void)adViewWillLeaveApplication:(GADBannerView *)adView { - [_channel invokeMethod:@"onAdLeftApplication" arguments:[self argumentsMap]]; -} - -- (void)dispose { - if (_banner.superview) [_banner removeFromSuperview]; - _banner = nil; - [super dispose]; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"%@ for: %@", super.description, _banner]; -} -@end - -@implementation FLTInterstitialAd -GADInterstitial *_interstitial; - -+ (instancetype)withId:(NSNumber *)mobileAdId channel:(FlutterMethodChannel *)channel { - FLTMobileAd *ad = [FLTMobileAd getAdForId:mobileAdId]; - return ad != nil ? (FLTInterstitialAd *)ad - : [[FLTInterstitialAd alloc] initWithId:mobileAdId channel:channel]; -} - -- (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targetingInfo { - if (_status != CREATED) return; - _status = LOADING; - - _interstitial = [[GADInterstitial alloc] initWithAdUnitID:adUnitId]; - _interstitial.delegate = self; - FLTRequestFactory *factory = [[FLTRequestFactory alloc] initWithTargetingInfo:targetingInfo]; - [_interstitial loadRequest:[factory createRequest]]; -} - -- (void)show { - if (_status == LOADING) { - _status = PENDING; - return; - } - if (_status != LOADED) return; - - [_interstitial presentFromRootViewController:[FLTMobileAd rootViewController]]; -} - -- (void)interstitialDidReceiveAd:(GADInterstitial *)ad { - bool statusWasPending = _status == PENDING; - _status = LOADED; - [_channel invokeMethod:@"onAdLoaded" arguments:[self argumentsMap]]; - if (statusWasPending) [self show]; -} - -- (void)interstitial:(GADInterstitial *)ad didFailToReceiveAdWithError:(GADRequestError *)error { - FLTLogWarning(@"interstitial:didFailToReceiveAdWithError: %@ (MobileAd %@)", - [error localizedDescription], self); - [_channel invokeMethod:@"onAdFailedToLoad" arguments:[self argumentsMap]]; -} - -- (void)interstitialWillPresentScreen:(GADInterstitial *)ad { - [_channel invokeMethod:@"onAdClicked" arguments:[self argumentsMap]]; -} - -- (void)interstitialWillDismissScreen:(GADInterstitial *)ad { - [_channel invokeMethod:@"onAdImpression" arguments:[self argumentsMap]]; -} - -- (void)interstitialDidDismissScreen:(GADInterstitial *)ad { - [_channel invokeMethod:@"onAdClosed" arguments:[self argumentsMap]]; -} - -- (void)interstitialWillLeaveApplication:(GADInterstitial *)ad { - [_channel invokeMethod:@"onAdLeftApplication" arguments:[self argumentsMap]]; -} - -- (void)dispose { - // It is not possible to hide/remove/destroy an AdMob interstitial Ad. - _interstitial = nil; - [super dispose]; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"%@ for: %@", super.description, _interstitial]; -} -@end diff --git a/packages/firebase_admob/ios/Classes/FLTRequestFactory.h b/packages/firebase_admob/ios/Classes/FLTRequestFactory.h deleted file mode 100644 index b1a304a8e3ed..000000000000 --- a/packages/firebase_admob/ios/Classes/FLTRequestFactory.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2017 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 "GoogleMobileAds/GoogleMobileAds.h" - -@interface FLTRequestFactory : NSObject - -- (instancetype)initWithTargetingInfo:(NSDictionary *)targetingInfo; -- (GADRequest *)createRequest; - -@end diff --git a/packages/firebase_admob/ios/Classes/FLTRequestFactory.m b/packages/firebase_admob/ios/Classes/FLTRequestFactory.m deleted file mode 100644 index 1b2e7f8e29e1..000000000000 --- a/packages/firebase_admob/ios/Classes/FLTRequestFactory.m +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2017 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 "FLTRequestFactory.h" -#import "FirebaseAdMobPlugin.h" -#import "GoogleMobileAds/GADExtras.h" -#import "GoogleMobileAds/GoogleMobileAds.h" - -@implementation FLTRequestFactory - -NSDictionary *_targetingInfo; - -- (instancetype)initWithTargetingInfo:(NSDictionary *)targetingInfo { - self = [super init]; - if (self) { - _targetingInfo = targetingInfo; - } - return self; -} - -- (NSArray *)targetingInfoArrayForKey:(NSString *)key info:(NSDictionary *)info { - NSObject *value = info[key]; - if (value == NULL) { - return nil; - } - if (![value isKindOfClass:[NSArray class]]) { - FLTLogWarning(@"targeting info %@: expected an array (MobileAd %@)", key, self); - return nil; - } - return (NSArray *)value; -} - -- (NSString *)targetingInfoStringForKey:(NSString *)key info:(NSDictionary *)info { - NSObject *value = info[key]; - if (value == NULL) { - return nil; - } - if (![value isKindOfClass:[NSString class]]) { - FLTLogWarning(@"targeting info %@: expected a string (MobileAd %@)", key, self); - return nil; - } - NSString *stringValue = (NSString *)value; - if ([stringValue length] == 0) { - FLTLogWarning(@"targeting info %@: expected a non-empty string (MobileAd %@)", key, self); - return nil; - } - return stringValue; -} - -- (NSNumber *)targetingInfoBoolForKey:(NSString *)key info:(NSDictionary *)info { - NSObject *value = info[key]; - if (value == NULL) { - return nil; - } - if (![value isKindOfClass:[NSNumber class]]) { - FLTLogWarning(@"targeting info %@: expected a boolean, (MobileAd %@)", key, self); - return nil; - } - return (NSNumber *)value; -} - -- (GADRequest *)createRequest { - GADRequest *request = [GADRequest request]; - if (_targetingInfo == nil) { - return request; - } - - NSArray *testDevices = [self targetingInfoArrayForKey:@"testDevices" info:_targetingInfo]; - if (testDevices != nil) { - request.testDevices = testDevices; - } - - NSArray *keywords = [self targetingInfoArrayForKey:@"keywords" info:_targetingInfo]; - if (keywords != nil) { - request.keywords = keywords; - } - - NSString *contentURL = [self targetingInfoStringForKey:@"contentUrl" info:_targetingInfo]; - if (contentURL != nil) { - request.contentURL = contentURL; - } - - NSObject *birthday = _targetingInfo[@"birthday"]; - if (birthday != NULL) { - if (![birthday isKindOfClass:[NSNumber class]]) { - FLTLogWarning(@"targeting info birthday: expected a long integer (MobileAd %@)", self); - } else { - // Incoming time value is milliseconds since the epoch, NSDate uses - // seconds. - request.birthday = - [NSDate dateWithTimeIntervalSince1970:((NSNumber *)birthday).longValue / 1000.0]; - } - } - - NSObject *gender = _targetingInfo[@"gender"]; - if (gender != NULL) { - if (![gender isKindOfClass:[NSNumber class]]) { - FLTLogWarning(@"targeting info gender: expected an integer (MobileAd %@)", self); - } else { - int genderValue = ((NSNumber *)gender).intValue; - switch (genderValue) { - case 0: // MobileAdGender.unknown - case 1: // MobileAdGender.male - case 2: // MobileAdGender.female - request.gender = genderValue; - break; - default: - FLTLogWarning(@"targeting info gender: not one of 0, 1, or 2 (MobileAd %@)", self); - } - } - } - - NSNumber *childDirected = [self targetingInfoBoolForKey:@"childDirected" info:_targetingInfo]; - if (childDirected != nil) { - [request tagForChildDirectedTreatment:childDirected.boolValue]; - } - - NSString *requestAgent = [self targetingInfoStringForKey:@"requestAgent" info:_targetingInfo]; - if (requestAgent != nil) { - request.requestAgent = requestAgent; - } - - NSNumber *nonPersonalizedAds = [self targetingInfoBoolForKey:@"nonPersonalizedAds" - info:_targetingInfo]; - if (nonPersonalizedAds != nil && [nonPersonalizedAds boolValue]) { - GADExtras *extras = [[GADExtras alloc] init]; - extras.additionalParameters = @{@"npa" : @"1"}; - [request registerAdNetworkExtras:extras]; - } - - return request; -} - -@end diff --git a/packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.h b/packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.h deleted file mode 100644 index 33ae96594308..000000000000 --- a/packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import "GoogleMobileAds/GoogleMobileAds.h" - -typedef enum : NSUInteger { - FLTRewardedVideoAdStatusCreated, - FLTRewardedVideoAdStatusLoading, - FLTRewardedVideoAdStatusFailed, - FLTRewardedVideoAdStatusLoaded, -} FLTRewardedVideoAdStatus; - -@interface FLTRewardedVideoAdWrapper : NSObject -- (instancetype)initWithChannel:(FlutterMethodChannel *)channel; -- (FLTRewardedVideoAdStatus)status; -- (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targetingInfo; -- (void)show; -@end diff --git a/packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.m b/packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.m deleted file mode 100644 index c05345eb92af..000000000000 --- a/packages/firebase_admob/ios/Classes/FLTRewardedVideoAdWrapper.m +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2017 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 "FLTRewardedVideoAdWrapper.h" -#import "FLTRequestFactory.h" -#import "FirebaseAdMobPlugin.h" - -static NSDictionary *rewardedStatusToString = nil; - -@interface FLTRewardedVideoAdWrapper () -@end - -@implementation FLTRewardedVideoAdWrapper - -FlutterMethodChannel *_rewardedChannel; -FLTRewardedVideoAdStatus _rewardedStatus; - -+ (void)initialize { - if (rewardedStatusToString == nil) { - rewardedStatusToString = @{ - @(FLTRewardedVideoAdStatusCreated) : @"CREATED", - @(FLTRewardedVideoAdStatusLoading) : @"LOADING", - @(FLTRewardedVideoAdStatusFailed) : @"FAILED", - @(FLTRewardedVideoAdStatusLoaded) : @"LOADED" - }; - } -} - -+ (UIViewController *)rootViewController { - return [UIApplication sharedApplication].delegate.window.rootViewController; -} - -- (instancetype)initWithChannel:(FlutterMethodChannel *)channel { - self = [super init]; - if (self) { - _rewardedChannel = channel; - _rewardedStatus = FLTRewardedVideoAdStatusCreated; - [GADRewardBasedVideoAd sharedInstance].delegate = self; - } - return self; -} - -- (FLTRewardedVideoAdStatus)status { - return _rewardedStatus; -} - -- (void)loadWithAdUnitId:(NSString *)adUnitId targetingInfo:(NSDictionary *)targetingInfo { - if (_rewardedStatus != FLTRewardedVideoAdStatusCreated && - _rewardedStatus != FLTRewardedVideoAdStatusFailed) { - return; - } - - _rewardedStatus = FLTRewardedVideoAdStatusLoading; - FLTRequestFactory *factory = [[FLTRequestFactory alloc] initWithTargetingInfo:targetingInfo]; - [[GADRewardBasedVideoAd sharedInstance] loadRequest:[factory createRequest] - withAdUnitID:adUnitId]; -} - -- (void)show { - [[GADRewardBasedVideoAd sharedInstance] - presentFromRootViewController:[FLTRewardedVideoAdWrapper rootViewController]]; -} - -- (NSString *)description { - NSString *statusString = - (NSString *)rewardedStatusToString[[NSNumber numberWithInt:_rewardedStatus]]; - return [NSString - stringWithFormat:@"%@ %@ FLTRewardedVideoAdWrapper", super.description, statusString]; -} - -- (void)rewardBasedVideoAd:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd - didRewardUserWithReward:(nonnull GADAdReward *)reward { - NSDictionary *arguments = @{ - @"rewardAmount" : [NSNumber numberWithInt:[reward.amount intValue]], - @"rewardType" : reward.type - }; - [_rewardedChannel invokeMethod:@"onRewarded" arguments:arguments]; -} - -- (void)rewardBasedVideoAd:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd - didFailToLoadWithError:(nonnull NSError *)error { - NSLog(@"interstitial:didFailToReceiveAdWithError: %@ (MobileAd %@)", [error localizedDescription], - self); - _rewardedStatus = FLTRewardedVideoAdStatusFailed; - [_rewardedChannel invokeMethod:@"onRewardedVideoAdFailedToLoad" arguments:@{}]; -} - -- (void)rewardBasedVideoAdDidReceiveAd:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd { - _rewardedStatus = FLTRewardedVideoAdStatusLoaded; - [_rewardedChannel invokeMethod:@"onRewardedVideoAdLoaded" arguments:@{}]; -} - -- (void)rewardBasedVideoAdDidOpen:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd { - [_rewardedChannel invokeMethod:@"onRewardedVideoAdOpened" arguments:@{}]; -} - -- (void)rewardBasedVideoAdDidStartPlaying:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd { - [_rewardedChannel invokeMethod:@"onRewardedVideoStarted" arguments:@{}]; -} - -- (void)rewardBasedVideoAdDidCompletePlaying:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd { - [_rewardedChannel invokeMethod:@"onRewardedVideoCompleted" arguments:@{}]; -} - -- (void)rewardBasedVideoAdDidClose:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd { - [_rewardedChannel invokeMethod:@"onRewardedVideoAdClosed" arguments:@{}]; - _rewardedStatus = FLTRewardedVideoAdStatusCreated; -} - -- (void)rewardBasedVideoAdWillLeaveApplication:(nonnull GADRewardBasedVideoAd *)rewardBasedVideoAd { - [_rewardedChannel invokeMethod:@"onRewardedVideoAdLeftApplication" arguments:@{}]; -} - -@end diff --git a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.h b/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.h deleted file mode 100644 index e09cedc6bbcb..000000000000 --- a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 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 - -#define FLTLogWarning(format, ...) NSLog((@"FirebaseAdMobPlugin " format), ##__VA_ARGS__) - -@interface FLTFirebaseAdMobPlugin : NSObject -@end diff --git a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m b/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m deleted file mode 100644 index d94762b9b61f..000000000000 --- a/packages/firebase_admob/ios/Classes/FirebaseAdMobPlugin.m +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseAdMobPlugin.h" - -#import - -#import "FLTMobileAd.h" -#import "FLTRewardedVideoAdWrapper.h" -#import "Firebase/Firebase.h" - -@interface FLTFirebaseAdMobPlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@property(nonatomic, strong) FLTRewardedVideoAdWrapper *rewardedWrapper; -@end - -@implementation FLTFirebaseAdMobPlugin - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FLTFirebaseAdMobPlugin *instance = [[FLTFirebaseAdMobPlugin alloc] init]; - instance.channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_admob" - binaryMessenger:[registrar messenger]]; - [registrar addMethodCallDelegate:instance channel:instance.channel]; - instance.rewardedWrapper = [[FLTRewardedVideoAdWrapper alloc] initWithChannel:instance.channel]; -} - -- (instancetype)init { - self = [super init]; - if (self && ![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - return self; -} - -- (void)dealloc { - [self.channel setMethodCallHandler:nil]; - self.channel = nil; -} - -- (void)callInitialize:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *appId = (NSString *)call.arguments[@"appId"]; - if (appId == nil || [appId length] == 0) { - result([FlutterError errorWithCode:@"no_app_id" - message:@"a non-empty AdMob appId was not provided" - details:nil]); - return; - } - [FLTMobileAd configureWithAppId:appId]; - result([NSNumber numberWithBool:YES]); -} - -- (void)callLoadBannerAdWithId:(NSNumber *)id - channel:(FlutterMethodChannel *)channel - call:(FlutterMethodCall *)call - result:(FlutterResult)result { - NSString *adUnitId = (NSString *)call.arguments[@"adUnitId"]; - if (adUnitId == nil || [adUnitId length] == 0) { - NSString *message = - [NSString stringWithFormat:@"a null or empty adUnitId was provided for %@", id]; - result([FlutterError errorWithCode:@"no_adunit_id" message:message details:nil]); - return; - } - - NSNumber *widthArg = (NSNumber *)call.arguments[@"width"]; - NSNumber *heightArg = (NSNumber *)call.arguments[@"height"]; - - if (widthArg == nil || heightArg == nil) { - NSString *message = - [NSString stringWithFormat:@"a null height or width was provided for banner id=%@", id]; - result([FlutterError errorWithCode:@"invalid_adsize" message:message details:nil]); - return; - } - - NSString *adSizeTypeArg = (NSString *)call.arguments[@"adSizeType"]; - FLTLogWarning(@"Size Type: %@", adSizeTypeArg); - if (adSizeTypeArg == nil || (![adSizeTypeArg isEqualToString:@"AdSizeType.SmartBanner"] && - ![adSizeTypeArg isEqualToString:@"AdSizeType.WidthAndHeight"])) { - NSString *message = [NSString - stringWithFormat:@"a null or invalid ad size type was provided for banner id=%@", id]; - result([FlutterError errorWithCode:@"invalid_adsizetype" message:message details:nil]); - return; - } - - int width = [widthArg intValue]; - int height = [heightArg intValue]; - - if ([adSizeTypeArg isEqualToString:@"AdSizeType.WidthAndHeight"] && (width <= 0 || height <= 0)) { - NSString *message = - [NSString stringWithFormat:@"an invalid AdSize (%d, %d) was provided for banner id=%@", - width, height, id]; - result([FlutterError errorWithCode:@"invalid_adsize" message:message details:nil]); - return; - } - - GADAdSize adSize; - if ([adSizeTypeArg isEqualToString:@"AdSizeType.SmartBanner"]) { - if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { - adSize = kGADAdSizeSmartBannerPortrait; - } else { - adSize = kGADAdSizeSmartBannerLandscape; - } - } else { - adSize = GADAdSizeFromCGSize(CGSizeMake(width, height)); - } - - FLTBannerAd *banner = [FLTBannerAd withId:id adSize:adSize channel:self.channel]; - - if (banner.status != CREATED) { - if (banner.status == FAILED) { - NSString *message = [NSString stringWithFormat:@"cannot reload a failed ad=%@", banner]; - result([FlutterError errorWithCode:@"load_failed_ad" message:message details:nil]); - } else { - result([NSNumber numberWithBool:YES]); // The ad was already loaded. - } - } - - NSDictionary *targetingInfo = (NSDictionary *)call.arguments[@"targetingInfo"]; - [banner loadWithAdUnitId:adUnitId targetingInfo:targetingInfo]; - result([NSNumber numberWithBool:YES]); -} - -- (void)callLoadInterstitialAd:(FLTMobileAd *)ad - call:(FlutterMethodCall *)call - result:(FlutterResult)result { - if (ad.status != CREATED) { - if (ad.status == FAILED) { - NSString *message = [NSString stringWithFormat:@"cannot reload a failed ad=%@", ad]; - result([FlutterError errorWithCode:@"load_failed_ad" message:message details:nil]); - } else { - result([NSNumber numberWithBool:YES]); // The ad was already loaded. - } - } - - NSString *adUnitId = (NSString *)call.arguments[@"adUnitId"]; - if (adUnitId == nil || [adUnitId length] == 0) { - NSString *message = - [NSString stringWithFormat:@"a null or emtpy adUnitId was provided for %@", ad]; - result([FlutterError errorWithCode:@"no_adunit_id" message:message details:nil]); - return; - } - - NSDictionary *targetingInfo = (NSDictionary *)call.arguments[@"targetingInfo"]; - [ad loadWithAdUnitId:adUnitId targetingInfo:targetingInfo]; - result([NSNumber numberWithBool:YES]); -} - -- (void)callLoadRewardedVideoAd:(FlutterMethodCall *)call result:(FlutterResult)result { - if (self.rewardedWrapper.status == FLTRewardedVideoAdStatusLoading || - self.rewardedWrapper.status == FLTRewardedVideoAdStatusLoaded) { - result([NSNumber numberWithBool:YES]); // The ad is loaded or about to be. - } - - NSString *adUnitId = (NSString *)call.arguments[@"adUnitId"]; - if (adUnitId == nil || [adUnitId length] == 0) { - result([FlutterError errorWithCode:@"no_ad_unit_id" - message:@"a non-empty adUnitId was not provided for rewarded video." - details:nil]); - return; - } - - NSDictionary *targetingInfo = (NSDictionary *)call.arguments[@"targetingInfo"]; - if (targetingInfo == nil) { - result([FlutterError - errorWithCode:@"no_targeting_info" - message:@"a null targetingInfo object was provided for rewarded video." - details:nil]); - return; - } - - [self.rewardedWrapper loadWithAdUnitId:adUnitId targetingInfo:targetingInfo]; - result([NSNumber numberWithBool:YES]); -} - -- (void)callShowAd:(NSNumber *)mobileAdId - call:(FlutterMethodCall *)call - result:(FlutterResult)result { - FLTMobileAd *ad = [FLTMobileAd getAdForId:mobileAdId]; - if (ad == nil) { - NSString *message = - [NSString stringWithFormat:@"show failed, the specified ad was not loaded id=%d", - mobileAdId.intValue]; - result([FlutterError errorWithCode:@"ad_not_loaded" message:message details:nil]); - } - - double offset = 0.0; - double horizontalCenterOffset = 0.0; - int type = 0; - if (call.arguments[@"anchorOffset"] != nil) { - offset = [call.arguments[@"anchorOffset"] doubleValue]; - } - if (call.arguments[@"horizontalCenterOffset"] != nil) { - horizontalCenterOffset = [call.arguments[@"horizontalCenterOffset"] doubleValue]; - } - if (call.arguments[@"anchorType"] != nil) { - type = [call.arguments[@"anchorType"] isEqualToString:@"bottom"] ? 0 : 1; - } - - [ad showAtOffset:offset hCenterOffset:horizontalCenterOffset fromAnchor:type]; - result([NSNumber numberWithBool:YES]); -} - -- (void)callIsAdLoaded:(NSNumber *)mobileAdId - call:(FlutterMethodCall *)call - result:(FlutterResult)result { - FLTMobileAd *ad = [FLTMobileAd getAdForId:mobileAdId]; - if (ad == nil) { - NSString *message = [NSString - stringWithFormat:@"isAdLoaded failed, no ad exists for id=%d", mobileAdId.intValue]; - result([FlutterError errorWithCode:@"no_ad_for_id" message:message details:nil]); - return; - } - if (ad.status == LOADED) { - result([NSNumber numberWithBool:YES]); - } else { - result([NSNumber numberWithBool:NO]); - } -} - -- (void)callShowRewardedVideoAd:(FlutterMethodCall *)call result:(FlutterResult)result { - if (self.rewardedWrapper.status != FLTRewardedVideoAdStatusLoaded) { - result([FlutterError errorWithCode:@"ad_not_loaded" - message:@"show failed for rewarded video, no ad was loaded" - details:nil]); - return; - } - - [self.rewardedWrapper show]; - result([NSNumber numberWithBool:YES]); -} - -- (void)callDisposeAd:(NSNumber *)mobileAdId - call:(FlutterMethodCall *)call - result:(FlutterResult)result { - FLTMobileAd *ad = [FLTMobileAd getAdForId:mobileAdId]; - if (ad == nil) { - NSString *message = - [NSString stringWithFormat:@"dispose failed, no ad exists for id=%d", mobileAdId.intValue]; - result([FlutterError errorWithCode:@"no_ad_for_id" message:message details:nil]); - } - - [ad dispose]; - result([NSNumber numberWithBool:YES]); -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([call.method isEqualToString:@"initialize"]) { - [self callInitialize:call result:result]; - return; - } - - if ([call.method isEqualToString:@"loadRewardedVideoAd"]) { - [self callLoadRewardedVideoAd:call result:result]; - return; - } - - if ([call.method isEqualToString:@"showRewardedVideoAd"]) { - [self callShowRewardedVideoAd:call result:result]; - return; - } - - NSNumber *mobileAdId = (NSNumber *)call.arguments[@"id"]; - if (mobileAdId == nil) { - NSString *message = @"FirebaseAdMobPlugin method calls for banners and " - @"interstitials must specify an " - @"integer mobile ad id"; - result([FlutterError errorWithCode:@"no_id" message:message details:nil]); - return; - } - - if ([call.method isEqualToString:@"loadBannerAd"]) { - [self callLoadBannerAdWithId:mobileAdId channel:self.channel call:call result:result]; - } else if ([call.method isEqualToString:@"loadInterstitialAd"]) { - [self callLoadInterstitialAd:[FLTInterstitialAd withId:mobileAdId channel:self.channel] - call:call - result:result]; - } else if ([call.method isEqualToString:@"showAd"]) { - [self callShowAd:mobileAdId call:call result:result]; - } else if ([call.method isEqualToString:@"isAdLoaded"]) { - [self callIsAdLoaded:mobileAdId call:call result:result]; - } else if ([call.method isEqualToString:@"disposeAd"]) { - [self callDisposeAd:mobileAdId call:call result:result]; - } else { - result(FlutterMethodNotImplemented); - } -} - -@end diff --git a/packages/firebase_admob/ios/firebase_admob.podspec b/packages/firebase_admob/ios/firebase_admob.podspec deleted file mode 100644 index 3992db721126..000000000000 --- a/packages/firebase_admob/ios/firebase_admob.podspec +++ /dev/null @@ -1,24 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -Pod::Spec.new do |s| - s.name = 'firebase_admob' - s.version = '0.0.1' - s.summary = 'Firebase Admob plugin for Flutter.' - s.description = <<-DESC -Firebase Admob plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_admob' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/AdMob' - - s.ios.deployment_target = '8.0' - - s.static_framework = true -end diff --git a/packages/firebase_admob/lib/firebase_admob.dart b/packages/firebase_admob/lib/firebase_admob.dart deleted file mode 100644 index 70289b2b5dc2..000000000000 --- a/packages/firebase_admob/lib/firebase_admob.dart +++ /dev/null @@ -1,528 +0,0 @@ -// Copyright 2017 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: deprecated_member_use_from_same_package - -import 'dart:async'; -import 'dart:io' show Platform; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -/// [MobileAd] status changes reported to [MobileAdListener]s. -/// -/// Applications can wait until an ad is [MobileAdEvent.loaded] before showing -/// it, to ensure that the ad is displayed promptly. -enum MobileAdEvent { - loaded, - failedToLoad, - clicked, - impression, - opened, - leftApplication, - closed, -} - -/// The user's gender for the sake of ad targeting using [MobileAdTargetingInfo]. -// Warning: the index values of the enums must match the values of the corresponding -// AdMob constants. For example MobileAdGender.female.index == kGADGenderFemale. -@Deprecated('This functionality is deprecated in AdMob without replacement.') -enum MobileAdGender { - unknown, - male, - female, -} - -/// Signature for a [MobileAd] status change callback. -typedef void MobileAdListener(MobileAdEvent event); - -/// Targeting info per the native AdMob API. -/// -/// This class's properties mirror the native AdRequest API. See for example: -/// [AdRequest.Builder for Android](https://firebase.google.com/docs/reference/android/com/google/android/gms/ads/AdRequest.Builder). -class MobileAdTargetingInfo { - const MobileAdTargetingInfo( - {this.keywords, - this.contentUrl, - @Deprecated('This functionality is deprecated in AdMob without replacement.') - this.birthday, - @Deprecated('This functionality is deprecated in AdMob without replacement.') - this.gender, - @Deprecated('Use `childDirected` instead.') - this.designedForFamilies, - this.childDirected, - this.testDevices, - this.nonPersonalizedAds}); - - final List keywords; - final String contentUrl; - @Deprecated('This functionality is deprecated in AdMob without replacement.') - final DateTime birthday; - @Deprecated('This functionality is deprecated in AdMob without replacement.') - final MobileAdGender gender; - @Deprecated( - 'This functionality is deprecated in AdMob. Use `childDirected` instead.') - final bool designedForFamilies; - final bool childDirected; - final List testDevices; - final bool nonPersonalizedAds; - - Map toJson() { - final Map json = { - 'requestAgent': 'flutter-alpha', - }; - - if (keywords != null && keywords.isNotEmpty) { - assert(keywords.every((String s) => s != null && s.isNotEmpty)); - json['keywords'] = keywords; - } - if (nonPersonalizedAds != null) - json['nonPersonalizedAds'] = nonPersonalizedAds; - if (contentUrl != null && contentUrl.isNotEmpty) - json['contentUrl'] = contentUrl; - if (birthday != null) json['birthday'] = birthday.millisecondsSinceEpoch; - if (gender != null) json['gender'] = gender.index; - if (designedForFamilies != null) - json['designedForFamilies'] = designedForFamilies; - if (childDirected != null) json['childDirected'] = childDirected; - if (testDevices != null && testDevices.isNotEmpty) { - assert(testDevices.every((String s) => s != null && s.isNotEmpty)); - json['testDevices'] = testDevices; - } - - return json; - } -} - -enum AnchorType { bottom, top } - -// The types of ad sizes supported for banners. The names of the values are used -// in MethodChannel calls to iOS and Android, and should not be changed. -enum AdSizeType { - WidthAndHeight, - SmartBanner, -} - -/// [AdSize] represents the size of a banner ad. There are six sizes available, -/// which are the same for both iOS and Android. See the guides for banners on -/// [Android](https://developers.google.com/admob/android/banner#banner_sizes) -/// and [iOS](https://developers.google.com/admob/ios/banner#banner_sizes) for -/// additional details. -class AdSize { - // Private constructor. Apps should use the static constants rather than - // create their own instances of [AdSize]. - const AdSize._({ - @required this.width, - @required this.height, - @required this.adSizeType, - }); - - final int height; - final int width; - final AdSizeType adSizeType; - - /// The standard banner (320x50) size. - static const AdSize banner = AdSize._( - width: 320, - height: 50, - adSizeType: AdSizeType.WidthAndHeight, - ); - - /// The large banner (320x100) size. - static const AdSize largeBanner = AdSize._( - width: 320, - height: 100, - adSizeType: AdSizeType.WidthAndHeight, - ); - - /// The medium rectangle (300x250) size. - static const AdSize mediumRectangle = AdSize._( - width: 300, - height: 250, - adSizeType: AdSizeType.WidthAndHeight, - ); - - /// The full banner (468x60) size. - static const AdSize fullBanner = AdSize._( - width: 468, - height: 60, - adSizeType: AdSizeType.WidthAndHeight, - ); - - /// The leaderboard (728x90) size. - static const AdSize leaderboard = AdSize._( - width: 728, - height: 90, - adSizeType: AdSizeType.WidthAndHeight, - ); - - /// The smart banner size. Smart banners are unique in that the width and - /// height values declared here aren't used. At runtime, the Mobile Ads SDK - /// will automatically adjust the banner's width to match the width of the - /// displaying device's screen. It will also set the banner's height using a - /// calculation based on the displaying device's height. For more info see the - /// [Android](https://developers.google.com/admob/android/banner) and - /// [iOS](https://developers.google.com/admob/ios/banner) banner ad guides. - static const AdSize smartBanner = AdSize._( - width: 0, - height: 0, - adSizeType: AdSizeType.SmartBanner, - ); -} - -/// A mobile [BannerAd] or [InterstitialAd] for the [FirebaseAdMobPlugin]. -/// -/// A [MobileAd] must be loaded with [load] before it is shown with [show]. -/// -/// A valid [adUnitId] is required. -abstract class MobileAd { - /// Default constructor, used by subclasses. - MobileAd( - {@required this.adUnitId, - MobileAdTargetingInfo targetingInfo, - this.listener}) - : _targetingInfo = targetingInfo ?? const MobileAdTargetingInfo() { - assert(adUnitId != null && adUnitId.isNotEmpty); - assert(_allAds[id] == null); - _allAds[id] = this; - } - - static final Map _allAds = {}; - - /// Optional targeting info per the native AdMob API. - MobileAdTargetingInfo get targetingInfo => _targetingInfo; - final MobileAdTargetingInfo _targetingInfo; - - /// Identifies the source of ads for your application. - /// - /// For testing use a [sample ad unit](https://developers.google.com/admob/ios/test-ads#sample_ad_units). - final String adUnitId; - - /// Called when the status of the ad changes. - MobileAdListener listener; - - /// An internal id that identifies this mobile ad to the native AdMob plugin. - /// - /// Plugin log messages will identify this property as the ad's `mobileAdId`. - int get id => hashCode; - - /// Start loading this ad. - Future load(); - - /// Show this ad. - /// - /// The ad must have been loaded with [load] first. If loading hasn't finished - /// the ad will not actually appear until the ad has finished loading. - /// - /// The [listener] will be notified when the ad has finished loading or fails - /// to do so. An ad that fails to load will not be shown. - /// - /// anchorOffset is the logical pixel offset from the edge of the screen (default 0.0) - /// anchorType place advert at top or bottom of screen (default bottom) - Future show( - {double anchorOffset = 0.0, - double horizontalCenterOffset = 0.0, - AnchorType anchorType = AnchorType.bottom}) { - return _invokeBooleanMethod("showAd", { - 'id': id, - 'anchorOffset': anchorOffset.toString(), - 'horizontalCenterOffset': horizontalCenterOffset.toString(), - 'anchorType': describeEnum(anchorType) - }); - } - - /// Free the plugin resources associated with this ad. - /// - /// Disposing a banner ad that's been shown removes it from the screen. - /// Interstitial ads can't be programmatically removed from view. - Future dispose() { - assert(_allAds[id] != null); - _allAds[id] = null; - return _invokeBooleanMethod("disposeAd", {'id': id}); - } - - Future isLoaded() { - return _invokeBooleanMethod("isAdLoaded", { - 'id': id, - }); - } -} - -/// A banner ad for the [FirebaseAdMobPlugin]. -class BannerAd extends MobileAd { - /// Create a BannerAd. - /// - /// A valid [adUnitId] is required. - BannerAd({ - @required String adUnitId, - @required this.size, - MobileAdTargetingInfo targetingInfo, - MobileAdListener listener, - }) : super( - adUnitId: adUnitId, - targetingInfo: targetingInfo, - listener: listener); - - final AdSize size; - - /// These are AdMob's test ad unit IDs, which always return test ads. You're - /// encouraged to use them for testing in your own apps. - static final String testAdUnitId = Platform.isAndroid - ? 'ca-app-pub-3940256099942544/6300978111' - : 'ca-app-pub-3940256099942544/2934735716'; - - @override - Future load() { - return _invokeBooleanMethod("loadBannerAd", { - 'id': id, - 'adUnitId': adUnitId, - 'targetingInfo': targetingInfo?.toJson(), - 'width': size.width, - 'height': size.height, - 'adSizeType': size.adSizeType.toString(), - }); - } -} - -/// A full-screen interstitial ad for the [FirebaseAdMobPlugin]. -class InterstitialAd extends MobileAd { - /// Create an Interstitial. - /// - /// A valid [adUnitId] is required. - InterstitialAd({ - String adUnitId, - MobileAdTargetingInfo targetingInfo, - MobileAdListener listener, - }) : super( - adUnitId: adUnitId, - targetingInfo: targetingInfo, - listener: listener); - - /// A platform-specific AdMob test ad unit ID for interstitials. This ad unit - /// has been specially configured to always return test ads, and developers - /// are encouraged to use it while building and testing their apps. - static final String testAdUnitId = Platform.isAndroid - ? 'ca-app-pub-3940256099942544/1033173712' - : 'ca-app-pub-3940256099942544/4411468910'; - - @override - Future load() { - return _invokeBooleanMethod("loadInterstitialAd", { - 'id': id, - 'adUnitId': adUnitId, - 'targetingInfo': targetingInfo?.toJson(), - }); - } -} - -/// [RewardedVideoAd] status changes reported to [RewardedVideoAdListener]s. -/// -/// The [rewarded] event is particularly important, since it indicates that the -/// user has watched a video for long enough to be given an in-app reward. -enum RewardedVideoAdEvent { - loaded, - failedToLoad, - opened, - leftApplication, - closed, - rewarded, - started, - completed, -} - -/// Signature for a [RewardedVideoAd] status change callback. The optional -/// parameters are only used when the [RewardedVideoAdEvent.rewarded] event -/// is sent, when they'll contain the reward amount and reward type that were -/// configured for the AdMob ad unit when it was created. They will be null for -/// all other events. -typedef void RewardedVideoAdListener(RewardedVideoAdEvent event, - {String rewardType, int rewardAmount}); - -/// An AdMob rewarded video ad. -/// -/// This class is a singleton, and [RewardedVideoAd.instance] provides a -/// reference to the single instance, which is created at launch. The native -/// Android and iOS APIs for AdMob use a singleton to manage rewarded video ad -/// objects, and that pattern is reflected here. -/// -/// Apps should assign a callback function to [RewardedVideoAd]'s listener -/// property in order to receive reward notifications from the AdMob SDK: -/// ``` -/// RewardedVideoAd.instance.listener = (RewardedVideoAdEvent event, -/// [String rewardType, int rewardAmount]) { -/// print("You were rewarded with $rewardAmount $rewardType!"); -/// } -/// }; -/// ``` -/// -/// The function will be invoked when any of the events in -/// [RewardedVideoAdEvent] occur. -/// -/// To load and show ads, call the load method: -/// ``` -/// RewardedVideoAd.instance.load(myAdUnitString, myTargetingInfoObj); -/// ``` -/// -/// Later (any point after your listener callback receives the -/// RewardedVideoAdEvent.loaded event), call the show method: -/// ``` -/// RewardedVideoAd.instance.show(); -/// ``` -/// -/// Only one rewarded video ad can be loaded at a time. Because the video assets -/// are so large, it's a good idea to start loading an ad well in advance of -/// when it's likely to be needed. -class RewardedVideoAd { - RewardedVideoAd._(); - - /// A platform-specific AdMob test ad unit ID for rewarded video ads. This ad - /// unit has been specially configured to always return test ads, and - /// developers are encouraged to use it while building and testing their apps. - static final String testAdUnitId = Platform.isAndroid - ? 'ca-app-pub-3940256099942544/5224354917' - : 'ca-app-pub-3940256099942544/1712485313'; - - static final RewardedVideoAd _instance = RewardedVideoAd._(); - - /// The one and only instance of this class. - static RewardedVideoAd get instance => _instance; - - /// Callback invoked for events in the rewarded video ad lifecycle. - RewardedVideoAdListener listener; - - /// Shows a rewarded video ad if one has been loaded. - Future show() { - return _invokeBooleanMethod("showRewardedVideoAd"); - } - - /// Loads a rewarded video ad using the provided ad unit ID. - Future load( - {@required String adUnitId, MobileAdTargetingInfo targetingInfo}) { - assert(adUnitId.isNotEmpty); - return _invokeBooleanMethod("loadRewardedVideoAd", { - 'adUnitId': adUnitId, - 'targetingInfo': targetingInfo?.toJson(), - }); - } -} - -/// Support for Google AdMob mobile ads. -/// -/// Before loading or showing an ad the plugin must be initialized with -/// an AdMob app id: -/// ``` -/// FirebaseAdMob.instance.initialize(appId: myAppId); -/// ``` -/// -/// Apps can create, load, and show mobile ads. For example: -/// ``` -/// BannerAd myBanner = BannerAd(unitId: myBannerAdUnitId) -/// ..load() -/// ..show(); -/// ``` -/// -/// See also: -/// -/// * The example associated with this plugin. -/// * [BannerAd], a small rectangular ad displayed at the bottom of the screen. -/// * [InterstitialAd], a full screen ad that must be dismissed by the user. -/// * [RewardedVideoAd], a full screen video ad that provides in-app user -/// rewards. -class FirebaseAdMob { - @visibleForTesting - FirebaseAdMob.private(MethodChannel channel) : _channel = channel { - _channel.setMethodCallHandler(_handleMethod); - } - - // A placeholder AdMob App ID for testing. AdMob App IDs and ad unit IDs are - // specific to a single operating system, so apps building for both Android and - // iOS will need a set for each platform. - static final String testAppId = Platform.isAndroid - ? 'ca-app-pub-3940256099942544~3347511713' - : 'ca-app-pub-3940256099942544~1458002511'; - - static final FirebaseAdMob _instance = FirebaseAdMob.private( - const MethodChannel('plugins.flutter.io/firebase_admob'), - ); - - /// The single shared instance of this plugin. - static FirebaseAdMob get instance => _instance; - - final MethodChannel _channel; - - static const Map _methodToMobileAdEvent = - { - 'onAdLoaded': MobileAdEvent.loaded, - 'onAdFailedToLoad': MobileAdEvent.failedToLoad, - 'onAdClicked': MobileAdEvent.clicked, - 'onAdImpression': MobileAdEvent.impression, - 'onAdOpened': MobileAdEvent.opened, - 'onAdLeftApplication': MobileAdEvent.leftApplication, - 'onAdClosed': MobileAdEvent.closed, - }; - - static const Map _methodToRewardedVideoAdEvent = - { - 'onRewarded': RewardedVideoAdEvent.rewarded, - 'onRewardedVideoAdClosed': RewardedVideoAdEvent.closed, - 'onRewardedVideoAdFailedToLoad': RewardedVideoAdEvent.failedToLoad, - 'onRewardedVideoAdLeftApplication': RewardedVideoAdEvent.leftApplication, - 'onRewardedVideoAdLoaded': RewardedVideoAdEvent.loaded, - 'onRewardedVideoAdOpened': RewardedVideoAdEvent.opened, - 'onRewardedVideoStarted': RewardedVideoAdEvent.started, - 'onRewardedVideoCompleted': RewardedVideoAdEvent.completed, - }; - - /// Initialize this plugin for the AdMob app specified by `appId`. - Future initialize( - {@required String appId, - String trackingId, - bool analyticsEnabled = false}) { - assert(appId != null && appId.isNotEmpty); - assert(analyticsEnabled != null); - return _invokeBooleanMethod("initialize", { - 'appId': appId, - 'trackingId': trackingId, - 'analyticsEnabled': analyticsEnabled, - }); - } - - Future _handleMethod(MethodCall call) { - assert(call.arguments is Map); - final Map argumentsMap = call.arguments; - final RewardedVideoAdEvent rewardedEvent = - _methodToRewardedVideoAdEvent[call.method]; - if (rewardedEvent != null) { - if (RewardedVideoAd.instance.listener != null) { - if (rewardedEvent == RewardedVideoAdEvent.rewarded) { - RewardedVideoAd.instance.listener(rewardedEvent, - rewardType: argumentsMap['rewardType'], - rewardAmount: argumentsMap['rewardAmount']); - } else { - RewardedVideoAd.instance.listener(rewardedEvent); - } - } - } else { - final int id = argumentsMap['id']; - if (id != null && MobileAd._allAds[id] != null) { - final MobileAd ad = MobileAd._allAds[id]; - final MobileAdEvent mobileAdEvent = _methodToMobileAdEvent[call.method]; - if (mobileAdEvent != null && ad.listener != null) { - ad.listener(mobileAdEvent); - } - } - } - - return Future.value(null); - } -} - -Future _invokeBooleanMethod(String method, [dynamic arguments]) async { - final bool result = await FirebaseAdMob.instance._channel.invokeMethod( - method, - arguments, - ); - return result; -} diff --git a/packages/firebase_admob/pubspec.yaml b/packages/firebase_admob/pubspec.yaml deleted file mode 100644 index e6ba7fa7271a..000000000000 --- a/packages/firebase_admob/pubspec.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: firebase_admob -description: Flutter plugin for Firebase AdMob, supporting - banner, interstitial (full-screen), and rewarded video ads -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_admob -version: 0.9.0+4 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebaseadmob - iosPrefix: FLT - pluginClass: FirebaseAdMobPlugin - -dependencies: - meta: ^1.0.4 - platform: ^2.0.0 - flutter: - sdk: flutter - -dev_dependencies: - mockito: ^3.0.0 - flutter_test: - sdk: flutter - firebase_core: ^0.4.0 - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_admob/test/firebase_admob_test.dart b/packages/firebase_admob/test/firebase_admob_test.dart deleted file mode 100644 index 4d85664fa614..000000000000 --- a/packages/firebase_admob/test/firebase_admob_test.dart +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2017 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_admob/firebase_admob.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('FirebaseAdMob', () { - const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_admob'); - - final List log = []; - final FirebaseAdMob admob = FirebaseAdMob.private(channel); - - setUp(() async { - channel.setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'initialize': - case 'loadBannerAd': - case 'loadInterstitialAd': - case 'loadRewardedVideoAd': - case 'showAd': - case 'showRewardedVideoAd': - case 'disposeAd': - return Future.value(true); - default: - assert(false); - return null; - } - }); - }); - - test('initialize', () async { - log.clear(); - - expect(await admob.initialize(appId: FirebaseAdMob.testAppId), true); - expect(log, [ - isMethodCall('initialize', arguments: { - 'appId': FirebaseAdMob.testAppId, - 'trackingId': null, - 'analyticsEnabled': false, - }), - ]); - }); - - test('banner', () async { - log.clear(); - - final BannerAd banner = BannerAd( - adUnitId: BannerAd.testAdUnitId, - size: AdSize.banner, - ); - final int id = banner.id; - - expect(await banner.load(), true); - expect(await banner.show(), true); - expect(await banner.dispose(), true); - - expect(log, [ - isMethodCall('loadBannerAd', arguments: { - 'id': id, - 'adUnitId': BannerAd.testAdUnitId, - 'targetingInfo': {'requestAgent': 'flutter-alpha'}, - 'width': 320, - 'height': 50, - 'adSizeType': 'AdSizeType.WidthAndHeight', - }), - isMethodCall('showAd', arguments: { - 'id': id, - 'anchorOffset': '0.0', - 'horizontalCenterOffset': '0.0', - 'anchorType': 'bottom', - }), - isMethodCall('disposeAd', arguments: { - 'id': id, - }), - ]); - }); - - test('interstitial', () async { - log.clear(); - - final InterstitialAd interstitial = InterstitialAd( - adUnitId: InterstitialAd.testAdUnitId, - ); - final int id = interstitial.id; - - expect(await interstitial.load(), true); - expect( - await interstitial.show( - anchorOffset: 60.0, - horizontalCenterOffset: 10.0, - anchorType: AnchorType.top), - true); - expect(await interstitial.dispose(), true); - - expect(log, [ - isMethodCall('loadInterstitialAd', arguments: { - 'id': id, - 'adUnitId': InterstitialAd.testAdUnitId, - 'targetingInfo': {'requestAgent': 'flutter-alpha'}, - }), - isMethodCall('showAd', arguments: { - 'id': id, - 'anchorOffset': '60.0', - 'horizontalCenterOffset': '10.0', - 'anchorType': 'top', - }), - isMethodCall('disposeAd', arguments: { - 'id': id, - }), - ]); - }); - - test('rewarded', () async { - log.clear(); - - expect( - await RewardedVideoAd.instance.load( - adUnitId: RewardedVideoAd.testAdUnitId, - targetingInfo: const MobileAdTargetingInfo()), - true); - - expect(await RewardedVideoAd.instance.show(), true); - - expect(log, [ - isMethodCall('loadRewardedVideoAd', arguments: { - 'adUnitId': RewardedVideoAd.testAdUnitId, - 'targetingInfo': {'requestAgent': 'flutter-alpha'}, - }), - isMethodCall('showRewardedVideoAd', arguments: null), - ]); - }); - }); -} diff --git a/packages/firebase_analytics/.gitignore b/packages/firebase_analytics/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_analytics/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_analytics/CHANGELOG.md b/packages/firebase_analytics/CHANGELOG.md deleted file mode 100644 index 16051241ebb9..000000000000 --- a/packages/firebase_analytics/CHANGELOG.md +++ /dev/null @@ -1,230 +0,0 @@ -## 5.0.0 - -* **Breaking change**. Remove deprecated method `setMinimumSessionDuration`. -* **Breaking change**. Removed `FirebaseAnalyticsAndroid.setAnalyticsCollectionEnabled`. Use - `FirebaseAnalytics.setAnalyticsCollectionEnabled` instead. -* Update Android gradle plugin and gradle version. -* Remove redundant casts on Android. - -## 4.0.2 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 4.0.1 - -* Refactor unit tests to use `setMockMethodCallHandler`. - -## 4.0.0 - -* Added new tracking events: - - `logLevelStart` - - `logLevelEnd` - - `logRemoveFromCart` - - `logSetCheckoutOption` -* **Breaking change**. Add new required parameter `method` to `logShare` event tracking. -* **Breaking change**. The following event names are reserved and cannot be used: - - `ad_activeview` - - `ad_click` - - `ad_exposure` - - `ad_impression` - - `ad_query` - - `adunit_exposure` - - `first_visit` - - `screen_view` - -## 3.0.3 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 3.0.2 - -* Bump minimum Flutter version to 1.5.0. -* Add missing template type parameter to `invokeMethod` calls. - -## 3.0.1 - -* Switch to using the `FIRAnalytics` version of `setAnalyticsCollectionEnabled` for - compatibility with Firebase Analytics iOS CocoaPod version 6.0. -* Update podspec to ensure availability of `setAnalyticsCollectionEnabled`. - -## 3.0.0 - -* Update Android dependencies to latest. - -## 2.1.1+3 - -* Added an initial integration test. - -## 2.1.1+2 - -* Fixed errors in code sample for `FirebaseAnalyticsObserver`. - -## 2.1.1+1 - -* Added hyperlinks to example app reference in README.md. - -## 2.1.1 - -* Added screen_view tracking of Navigator.pushReplacement - -## 2.1.0 - -* Add Login event support - -## 2.0.3 - -* Add resetAnalyticsData method - -## 2.0.2+1 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 2.0.2 - -* Enable setAnalyticsCollectionEnabled support for iOS - -## 2.0.1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 2.0.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - - This was originally incorrectly pushed in the `1.2.0` update. - -## 1.2.0+1 - -* **Revert the breaking 1.2.0 update**. 1.2.0 was known to be breaking and - should have incremented the major version number instead of the minor. This - revert is in and of itself breaking for anyone that has already migrated - however. Anyone who has already migrated their app to AndroidX should - immediately update to `2.0.0` instead. That's the correctly versioned new push - of `1.2.0`. - -## 1.2.0 - -* **BAD**. This was a breaking change that was incorrectly published on a minor - version upgrade, should never have happened. Reverted by 1.2.0+1. - - "**Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library." - -## 1.1.0 - -* Allow user to handle `PlatformException`s caught by `FirebaseAnalyticsObserver._sendScreenView()`. - -## 1.0.6 - -* Allow user ID to be set to null. - -## 1.0.5 - -* Update the `METHOD` Android constant used for `logSignUp` method. - -## 1.0.4 - -* Bump Android dependencies to latest. - -## 1.0.3 - -* Updated test and mockito dependencies to pick up Dart 2 support - -## 1.0.2 - -* Bump Android and Firebase dependency versions. - -## 1.0.1 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 1.0.0 - -* Bump to released version. - -## 0.3.3 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.3.2 - -* Updated package channel name - -## 0.3.1 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.3.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.2.3 - -* Enabled use in Swift projects. - -## 0.2.2+1 - -* Updated description to clarify this is 'Google Analytics for Firebase' - -## 0.2.2 - -* Moved to the io.flutter.plugins organization. - -## 0.2.1 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.2.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.1.2 - -* Added FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.1.1 - -* Change GMS dependency to 11.+ - -## 0.1.0+1 - -* Aligned author name with rest of repo. - -## 0.1.0 - -* Added `FirebaseAnalyticsObserver` (a `NavigatorObserver`) to automatically log `PageRoute` transitions - -## 0.0.5 - -* Support for long parameter values on Android - -## 0.0.4 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds - -## 0.0.3 - -* Updated to Firebase SDK Version 11.0.1 - -## 0.0.2 - -* Bumped buildToolsVersion to 25.0.3 -* Updated README.md - -## 0.0.1 - -* Initial Release diff --git a/packages/firebase_analytics/LICENSE b/packages/firebase_analytics/LICENSE deleted file mode 100755 index 000b4618d2bd..000000000000 --- a/packages/firebase_analytics/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 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_analytics/README.md b/packages/firebase_analytics/README.md deleted file mode 100755 index f8874acc1480..000000000000 --- a/packages/firebase_analytics/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Google Analytics for Firebase - -[![pub package](https://img.shields.io/pub/v/firebase_analytics.svg)](https://pub.dartlang.org/packages/firebase_analytics) - -A Flutter plugin to use the [Google Analytics for Firebase API](https://firebase.google.com/docs/analytics/). - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage -To use this plugin, add `firebase_analytics` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). You must also configure firebase analytics for each platform project: Android and iOS (see the example folder or https://codelabs.developers.google.com/codelabs/flutter-firebase/#4 for step by step details). - -## Track PageRoute Transitions - -To track `PageRoute` transitions, add a `FirebaseAnalyticsObserver` to the list of `NavigatorObservers` on your -`Navigator`, e.g. if you're using a `MaterialApp`: - -```dart - -FirebaseAnalytics analytics = FirebaseAnalytics(); - -MaterialApp( - home: MyAppHome(), - navigatorObservers: [ - FirebaseAnalyticsObserver(analytics: analytics), - ], -); -``` - -You can also track transitions within your `PageRoute` (e.g. when the user switches from one tab to another) by -implementing `RouteAware` and subscribing it to `FirebaseAnalyticsObserver`. See [`example/lib/tabs_page.dart`][tabs_page] -for an example of how to wire that up. - -## Getting Started - -See the [`example`][example] directory for a complete sample app using Google Analytics for Firebase. - -[example]: https://github.com/flutter/plugins/tree/master/packages/firebase_analytics/example -[tabs_page]: https://github.com/flutter/plugins/tree/master/packages/firebase_analytics/example/lib/tabs_page.dart \ No newline at end of file diff --git a/packages/firebase_analytics/android/build.gradle b/packages/firebase_analytics/android/build.gradle deleted file mode 100755 index 96633d9194bc..000000000000 --- a/packages/firebase_analytics/android/build.gradle +++ /dev/null @@ -1,53 +0,0 @@ -def PLUGIN = "firebase_analytics"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebaseanalytics' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-analytics:16.5.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_analytics/android/gradle.properties b/packages/firebase_analytics/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_analytics/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_analytics/android/settings.gradle b/packages/firebase_analytics/android/settings.gradle deleted file mode 100755 index 4b80dda8afc7..000000000000 --- a/packages/firebase_analytics/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_analytics' diff --git a/packages/firebase_analytics/android/src/main/AndroidManifest.xml b/packages/firebase_analytics/android/src/main/AndroidManifest.xml deleted file mode 100755 index d05df03b0c80..000000000000 --- a/packages/firebase_analytics/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java b/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java deleted file mode 100755 index 0ec15c7cc22b..000000000000 --- a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2017 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.firebaseanalytics; - -import android.app.Activity; -import android.os.Bundle; -import com.google.firebase.FirebaseApp; -import com.google.firebase.analytics.FirebaseAnalytics; -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.plugin.common.PluginRegistry; -import java.util.Map; - -/** Flutter plugin for Firebase Analytics. */ -public class FirebaseAnalyticsPlugin implements MethodCallHandler { - private final PluginRegistry.Registrar registrar; - private final FirebaseAnalytics firebaseAnalytics; - - public static void registerWith(PluginRegistry.Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_analytics"); - channel.setMethodCallHandler(new FirebaseAnalyticsPlugin(registrar)); - } - - private FirebaseAnalyticsPlugin(PluginRegistry.Registrar registrar) { - this.registrar = registrar; - FirebaseApp.initializeApp(registrar.context()); - this.firebaseAnalytics = FirebaseAnalytics.getInstance(registrar.context()); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "logEvent": - handleLogEvent(call, result); - break; - case "setUserId": - handleSetUserId(call, result); - break; - case "setCurrentScreen": - handleSetCurrentScreen(call, result); - break; - case "setAnalyticsCollectionEnabled": - handleSetAnalyticsCollectionEnabled(call, result); - break; - case "setSessionTimeoutDuration": - handleSetSessionTimeoutDuration(call, result); - break; - case "setUserProperty": - handleSetUserProperty(call, result); - break; - case "resetAnalyticsData": - handleResetAnalyticsData(result); - break; - default: - result.notImplemented(); - break; - } - } - - private void handleLogEvent(MethodCall call, Result result) { - - final String eventName = call.argument("name"); - final Map map = call.argument("parameters"); - final Bundle parameterBundle = createBundleFromMap(map); - firebaseAnalytics.logEvent(eventName, parameterBundle); - result.success(null); - } - - private void handleSetUserId(MethodCall call, Result result) { - final String id = (String) call.arguments; - firebaseAnalytics.setUserId(id); - result.success(null); - } - - private void handleSetCurrentScreen(MethodCall call, Result result) { - Activity activity = registrar.activity(); - if (activity == null) { - result.error("no_activity", "handleSetCurrentScreen requires a foreground activity", null); - return; - } - - final String screenName = call.argument("screenName"); - final String screenClassOverride = call.argument("screenClassOverride"); - - firebaseAnalytics.setCurrentScreen(activity, screenName, screenClassOverride); - result.success(null); - } - - private void handleSetAnalyticsCollectionEnabled(MethodCall call, Result result) { - final Boolean enabled = call.arguments(); - firebaseAnalytics.setAnalyticsCollectionEnabled(enabled); - result.success(null); - } - - private void handleSetSessionTimeoutDuration(MethodCall call, Result result) { - final Integer milliseconds = call.arguments(); - firebaseAnalytics.setSessionTimeoutDuration(milliseconds); - result.success(null); - } - - private void handleSetUserProperty(MethodCall call, Result result) { - final String name = call.argument("name"); - final String value = call.argument("value"); - - firebaseAnalytics.setUserProperty(name, value); - result.success(null); - } - - private void handleResetAnalyticsData(Result result) { - firebaseAnalytics.resetAnalyticsData(); - result.success(null); - } - - private static Bundle createBundleFromMap(Map map) { - if (map == null) { - return null; - } - - Bundle bundle = new Bundle(); - for (Map.Entry jsonParam : map.entrySet()) { - final Object value = jsonParam.getValue(); - final String key = jsonParam.getKey(); - if (value instanceof String) { - bundle.putString(key, (String) value); - } else if (value instanceof Integer) { - bundle.putInt(key, (Integer) value); - } else if (value instanceof Long) { - bundle.putLong(key, (Long) value); - } else if (value instanceof Double) { - bundle.putDouble(key, (Double) value); - } else if (value instanceof Boolean) { - bundle.putBoolean(key, (Boolean) value); - } else { - throw new IllegalArgumentException( - "Unsupported value type: " + value.getClass().getCanonicalName()); - } - } - return bundle; - } -} diff --git a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java b/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 01c08327078d..000000000000 --- a/packages/firebase_analytics/android/src/main/java/io/flutter/plugins/firebaseanalytics/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebaseanalytics; - -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; - -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_analytics/android/user-agent.gradle b/packages/firebase_analytics/android/user-agent.gradle deleted file mode 100644 index b41aa26c5d1d..000000000000 --- a/packages/firebase_analytics/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-analytics" -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_analytics/example/README.md b/packages/firebase_analytics/example/README.md deleted file mode 100755 index 101d033eea86..000000000000 --- a/packages/firebase_analytics/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_analytics_example - -Demonstrates how to use the firebase_analytics plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_analytics/example/android.iml b/packages/firebase_analytics/example/android.iml deleted file mode 100755 index 462b903e05b6..000000000000 --- a/packages/firebase_analytics/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_analytics/example/android/app/build.gradle b/packages/firebase_analytics/example/android/app/build.gradle deleted file mode 100755 index 3d617c0045f0..000000000000 --- a/packages/firebase_analytics/example/android/app/build.gradle +++ /dev/null @@ -1,59 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebaseanalyticsexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_analytics/example/android/app/google-services.json b/packages/firebase_analytics/example/android/app/google-services.json deleted file mode 100755 index d7828277516e..000000000000 --- a/packages/firebase_analytics/example/android/app/google-services.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "project_info": { - "project_number": "22422828327", - "firebase_url": "https://flutter-plugins-analytics.firebaseio.com", - "project_id": "flutter-plugins-analytics", - "storage_bucket": "flutter-plugins-analytics.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:22422828327:android:72a6b73c96532099", - "android_client_info": { - "package_name": "io.flutter.plugins.firebaseanalyticsexample" - } - }, - "oauth_client": [ - { - "client_id": "22422828327-i4s5s21mag6441kkl7l4sbp5ti3frbb3.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseanalyticsexample", - "certificate_hash": "f8323ac5fe6e7adc1ddc5612e16b5d04d7f1358b" - } - }, - { - "client_id": "22422828327-a63cmhasfhmvjckqkpe6ktkl953nf36f.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyDc6IWV13gfkOanJWSXwdmVzi8-E7qKrlo" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "22422828327-a63cmhasfhmvjckqkpe6ktkl953nf36f.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_analytics/example/android/app/gradle.properties b/packages/firebase_analytics/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_analytics/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_analytics/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_analytics/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_analytics/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_analytics/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_analytics/example/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index f6ddd6443c46..000000000000 --- a/packages/firebase_analytics/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/.gitignore b/packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/.gitignore deleted file mode 100755 index 0f2aeaa1dc2c..000000000000 --- a/packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -GeneratedPluginRegistrant.java - - diff --git a/packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/firebaseanalyticsexample/MainActivity.java b/packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/firebaseanalyticsexample/MainActivity.java deleted file mode 100644 index ac7abd0b9609..000000000000 --- a/packages/firebase_analytics/example/android/app/src/main/java/io/flutter/plugins/firebaseanalyticsexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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.firebaseanalyticsexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_analytics/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_analytics/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100755 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_analytics/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_analytics/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100755 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_analytics/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_analytics/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100755 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_analytics/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_analytics/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100755 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_analytics/example/android/build.gradle b/packages/firebase_analytics/example/android/build.gradle deleted file mode 100755 index 3f271ea72055..000000000000 --- a/packages/firebase_analytics/example/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - mavenLocal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_analytics/example/android/gradle.properties b/packages/firebase_analytics/example/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_analytics/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 0c59c158ca01..000000000000 --- a/packages/firebase_analytics/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Wed Jul 31 23:52:55 BRT 2019 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/packages/firebase_analytics/example/android/settings.gradle b/packages/firebase_analytics/example/android/settings.gradle deleted file mode 100755 index 115da6cb4f4d..000000000000 --- a/packages/firebase_analytics/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_analytics/example/firebase_analytics_example.iml b/packages/firebase_analytics/example/firebase_analytics_example.iml deleted file mode 100755 index 1ae40a0f7f54..000000000000 --- a/packages/firebase_analytics/example/firebase_analytics_example.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_analytics/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_analytics/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 6c2de8086bcd..000000000000 --- a/packages/firebase_analytics/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_analytics/example/ios/Flutter/Debug.xcconfig b/packages/firebase_analytics/example/ios/Flutter/Debug.xcconfig deleted file mode 100755 index 9803018ca79d..000000000000 --- a/packages/firebase_analytics/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/packages/firebase_analytics/example/ios/Flutter/Release.xcconfig b/packages/firebase_analytics/example/ios/Flutter/Release.xcconfig deleted file mode 100755 index a4a8c604e13d..000000000000 --- a/packages/firebase_analytics/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/packages/firebase_analytics/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_analytics/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 5d3acaf85694..000000000000 --- a/packages/firebase_analytics/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,482 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C6F5A6B1EC3AF0E008D64B5 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6F5A6A1EC3AF0E008D64B5 /* GeneratedPluginRegistrant.m */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 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 */; }; - B1F3D14E8117A6C9F65810E0 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D558BB7489B1C82B42A9097 /* libPods-Runner.a */; }; - B43DDBB51EA0304000A48ABE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B43DDBB41EA0304000A48ABE /* GoogleService-Info.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 4D558BB7489B1C82B42A9097 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 5C6F5A691EC3AF0E008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C6F5A6A1EC3AF0E008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - B43DDBB41EA0304000A48ABE /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - B1F3D14E8117A6C9F65810E0 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C6F5A691EC3AF0E008D64B5 /* GeneratedPluginRegistrant.h */, - 5C6F5A6A1EC3AF0E008D64B5 /* GeneratedPluginRegistrant.m */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - B43DDBB41EA0304000A48ABE /* GoogleService-Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 4D558BB7489B1C82B42A9097 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 = ( - B43DDBB51EA0304000A48ABE /* GoogleService-Info.plist in Resources */, - 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\" thin"; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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 */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C6F5A6B1EC3AF0E008D64B5 /* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseAnalyticsExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseAnalyticsExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_analytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_analytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_analytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_analytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_analytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index 1c9580788197..000000000000 --- a/packages/firebase_analytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_analytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_analytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_analytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_analytics/example/ios/Runner/AppDelegate.h b/packages/firebase_analytics/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e990f2e..000000000000 --- a/packages/firebase_analytics/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_analytics/example/ios/Runner/AppDelegate.m b/packages/firebase_analytics/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c88eb60..000000000000 --- a/packages/firebase_analytics/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 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. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index d22f10b2ab63..000000000000 --- a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100755 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100755 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100755 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100755 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100755 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_analytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100755 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_analytics/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_analytics/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index f3c28516fb38..000000000000 --- a/packages/firebase_analytics/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_analytics/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_analytics/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index ebf17fdc314a..000000000000 --- a/packages/firebase_analytics/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 22422828327-dht1d0h6vf8j2r7t4lslc44cqtunrgie.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.22422828327-dht1d0h6vf8j2r7t4lslc44cqtunrgie - API_KEY - AIzaSyDnzw8kNyq19zKkygY161hBuzaeoIcRtK8 - GCM_SENDER_ID - 22422828327 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebaseAnalyticsExample - PROJECT_ID - flutter-plugins-analytics - STORAGE_BUCKET - flutter-plugins-analytics.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:22422828327:ios:900bf026228cf65a - DATABASE_URL - https://flutter-plugins-analytics.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_analytics/example/ios/Runner/Info.plist b/packages/firebase_analytics/example/ios/Runner/Info.plist deleted file mode 100755 index 50d501fd1f7f..000000000000 --- a/packages/firebase_analytics/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_analytics_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_analytics/example/ios/Runner/main.m b/packages/firebase_analytics/example/ios/Runner/main.m deleted file mode 100644 index bec320c0bee0..000000000000 --- a/packages/firebase_analytics/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/firebase_analytics/example/lib/main.dart b/packages/firebase_analytics/example/lib/main.dart deleted file mode 100755 index 2c3affd29c1c..000000000000 --- a/packages/firebase_analytics/example/lib/main.dart +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright 2017 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:flutter/material.dart'; -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:firebase_analytics/observer.dart'; - -import 'tabs_page.dart'; - -void main() { - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - static FirebaseAnalytics analytics = FirebaseAnalytics(); - static FirebaseAnalyticsObserver observer = - FirebaseAnalyticsObserver(analytics: analytics); - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Firebase Analytics Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - navigatorObservers: [observer], - home: MyHomePage( - title: 'Firebase Analytics Demo', - analytics: analytics, - observer: observer, - ), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title, this.analytics, this.observer}) - : super(key: key); - - final String title; - final FirebaseAnalytics analytics; - final FirebaseAnalyticsObserver observer; - - @override - _MyHomePageState createState() => _MyHomePageState(analytics, observer); -} - -class _MyHomePageState extends State { - _MyHomePageState(this.analytics, this.observer); - - final FirebaseAnalyticsObserver observer; - final FirebaseAnalytics analytics; - String _message = ''; - - void setMessage(String message) { - setState(() { - _message = message; - }); - } - - Future _sendAnalyticsEvent() async { - await analytics.logEvent( - name: 'test_event', - parameters: { - 'string': 'string', - 'int': 42, - 'long': 12345678910, - 'double': 42.0, - 'bool': true, - }, - ); - setMessage('logEvent succeeded'); - } - - Future _testSetUserId() async { - await analytics.setUserId('some-user'); - setMessage('setUserId succeeded'); - } - - Future _testSetCurrentScreen() async { - await analytics.setCurrentScreen( - screenName: 'Analytics Demo', - screenClassOverride: 'AnalyticsDemo', - ); - setMessage('setCurrentScreen succeeded'); - } - - Future _testSetAnalyticsCollectionEnabled() async { - await analytics.setAnalyticsCollectionEnabled(false); - await analytics.setAnalyticsCollectionEnabled(true); - setMessage('setAnalyticsCollectionEnabled succeeded'); - } - - Future _testSetSessionTimeoutDuration() async { - await analytics.android?.setSessionTimeoutDuration(2000000); - setMessage('setSessionTimeoutDuration succeeded'); - } - - Future _testSetUserProperty() async { - await analytics.setUserProperty(name: 'regular', value: 'indeed'); - setMessage('setUserProperty succeeded'); - } - - Future _testAllEventTypes() async { - await analytics.logAddPaymentInfo(); - await analytics.logAddToCart( - currency: 'USD', - value: 123.0, - itemId: 'test item id', - itemName: 'test item name', - itemCategory: 'test item category', - quantity: 5, - price: 24.0, - origin: 'test origin', - itemLocationId: 'test location id', - destination: 'test destination', - startDate: '2015-09-14', - endDate: '2015-09-17', - ); - await analytics.logAddToWishlist( - itemId: 'test item id', - itemName: 'test item name', - itemCategory: 'test item category', - quantity: 5, - price: 24.0, - value: 123.0, - currency: 'USD', - itemLocationId: 'test location id', - ); - await analytics.logAppOpen(); - await analytics.logBeginCheckout( - value: 123.0, - currency: 'USD', - transactionId: 'test tx id', - numberOfNights: 2, - numberOfRooms: 3, - numberOfPassengers: 4, - origin: 'test origin', - destination: 'test destination', - startDate: '2015-09-14', - endDate: '2015-09-17', - travelClass: 'test travel class', - ); - await analytics.logCampaignDetails( - source: 'test source', - medium: 'test medium', - campaign: 'test campaign', - term: 'test term', - content: 'test content', - aclid: 'test aclid', - cp1: 'test cp1', - ); - await analytics.logEarnVirtualCurrency( - virtualCurrencyName: 'bitcoin', - value: 345.66, - ); - await analytics.logEcommercePurchase( - currency: 'USD', - value: 432.45, - transactionId: 'test tx id', - tax: 3.45, - shipping: 5.67, - coupon: 'test coupon', - location: 'test location', - numberOfNights: 3, - numberOfRooms: 4, - numberOfPassengers: 5, - origin: 'test origin', - destination: 'test destination', - startDate: '2015-09-13', - endDate: '2015-09-14', - travelClass: 'test travel class', - ); - await analytics.logGenerateLead( - currency: 'USD', - value: 123.45, - ); - await analytics.logJoinGroup( - groupId: 'test group id', - ); - await analytics.logLevelUp( - level: 5, - character: 'witch doctor', - ); - await analytics.logLogin(); - await analytics.logPostScore( - score: 1000000, - level: 70, - character: 'tiefling cleric', - ); - await analytics.logPresentOffer( - itemId: 'test item id', - itemName: 'test item name', - itemCategory: 'test item category', - quantity: 6, - price: 3.45, - value: 67.8, - currency: 'USD', - itemLocationId: 'test item location id', - ); - await analytics.logPurchaseRefund( - currency: 'USD', - value: 45.67, - transactionId: 'test tx id', - ); - await analytics.logSearch( - searchTerm: 'hotel', - numberOfNights: 2, - numberOfRooms: 1, - numberOfPassengers: 3, - origin: 'test origin', - destination: 'test destination', - startDate: '2015-09-14', - endDate: '2015-09-16', - travelClass: 'test travel class', - ); - await analytics.logSelectContent( - contentType: 'test content type', - itemId: 'test item id', - ); - await analytics.logShare( - contentType: 'test content type', - itemId: 'test item id', - method: 'facebook'); - await analytics.logSignUp( - signUpMethod: 'test sign up method', - ); - await analytics.logSpendVirtualCurrency( - itemName: 'test item name', - virtualCurrencyName: 'bitcoin', - value: 34, - ); - await analytics.logTutorialBegin(); - await analytics.logTutorialComplete(); - await analytics.logUnlockAchievement(id: 'all Firebase API covered'); - await analytics.logViewItem( - itemId: 'test item id', - itemName: 'test item name', - itemCategory: 'test item category', - itemLocationId: 'test item location id', - price: 3.45, - quantity: 6, - currency: 'USD', - value: 67.8, - flightNumber: 'test flight number', - numberOfPassengers: 3, - numberOfRooms: 1, - numberOfNights: 2, - origin: 'test origin', - destination: 'test destination', - startDate: '2015-09-14', - endDate: '2015-09-15', - searchTerm: 'test search term', - travelClass: 'test travel class', - ); - await analytics.logViewItemList( - itemCategory: 'test item category', - ); - await analytics.logViewSearchResults( - searchTerm: 'test search term', - ); - setMessage('All standard events logged successfully'); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Column( - children: [ - MaterialButton( - child: const Text('Test logEvent'), - onPressed: _sendAnalyticsEvent, - ), - MaterialButton( - child: const Text('Test standard event types'), - onPressed: _testAllEventTypes, - ), - MaterialButton( - child: const Text('Test setUserId'), - onPressed: _testSetUserId, - ), - MaterialButton( - child: const Text('Test setCurrentScreen'), - onPressed: _testSetCurrentScreen, - ), - MaterialButton( - child: const Text('Test setAnalyticsCollectionEnabled'), - onPressed: _testSetAnalyticsCollectionEnabled, - ), - MaterialButton( - child: const Text('Test setSessionTimeoutDuration'), - onPressed: _testSetSessionTimeoutDuration, - ), - MaterialButton( - child: const Text('Test setUserProperty'), - onPressed: _testSetUserProperty, - ), - Text(_message, - style: const TextStyle(color: Color.fromARGB(255, 0, 155, 0))), - ], - ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.tab), - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - settings: const RouteSettings(name: TabsPage.routeName), - builder: (BuildContext context) { - return TabsPage(observer); - })); - }), - ); - } -} diff --git a/packages/firebase_analytics/example/lib/tabs_page.dart b/packages/firebase_analytics/example/lib/tabs_page.dart deleted file mode 100644 index 9f09998a16e4..000000000000 --- a/packages/firebase_analytics/example/lib/tabs_page.dart +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2017 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:flutter/material.dart'; -import 'package:firebase_analytics/observer.dart'; - -class TabsPage extends StatefulWidget { - TabsPage(this.observer); - - final FirebaseAnalyticsObserver observer; - - static const String routeName = '/tab'; - - @override - State createState() => _TabsPageState(observer); -} - -class _TabsPageState extends State - with SingleTickerProviderStateMixin, RouteAware { - _TabsPageState(this.observer); - - final FirebaseAnalyticsObserver observer; - TabController _controller; - int selectedIndex = 0; - - final List tabs = [ - const Tab(text: 'LEFT'), - const Tab(text: 'RIGHT'), - ]; - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - observer.subscribe(this, ModalRoute.of(context)); - } - - @override - void dispose() { - observer.unsubscribe(this); - super.dispose(); - } - - @override - void initState() { - super.initState(); - _controller = TabController( - vsync: this, - length: tabs.length, - initialIndex: selectedIndex, - ); - _controller.addListener(() { - setState(() { - if (selectedIndex != _controller.index) { - selectedIndex = _controller.index; - _sendCurrentTabToAnalytics(); - } - }); - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - bottom: TabBar( - controller: _controller, - tabs: tabs, - ), - ), - body: TabBarView( - controller: _controller, - children: tabs.map((Tab tab) { - return Center(child: Text(tab.text)); - }).toList(), - ), - ); - } - - @override - void didPush() { - _sendCurrentTabToAnalytics(); - } - - @override - void didPopNext() { - _sendCurrentTabToAnalytics(); - } - - void _sendCurrentTabToAnalytics() { - observer.analytics.setCurrentScreen( - screenName: '${TabsPage.routeName}/tab$selectedIndex', - ); - } -} diff --git a/packages/firebase_analytics/example/pubspec.yaml b/packages/firebase_analytics/example/pubspec.yaml deleted file mode 100755 index 2207a8ecb318..000000000000 --- a/packages/firebase_analytics/example/pubspec.yaml +++ /dev/null @@ -1,61 +0,0 @@ -name: firebase_analytics_example -description: Demonstrates how to use the firebase_analytics plugin. - -dependencies: - flutter: - sdk: flutter - firebase_analytics: - path: ../ - firebase_core: ^0.4.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - -# For information on the generic Dart part of this file, see the -# following page: https://www.dartlang.org/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 Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section here, in - # this "flutter" section, as in: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # To add assets from package dependencies, first ensure the asset - # is in the lib/ directory of the dependency. Then, - # refer to the asset with a path prefixed with - # `packages/PACKAGE_NAME/`. Note: the `lib/` is implied, do not - # include `lib/` in the asset path. - # - # Here is an example: - # - # assets: - # - packages/PACKAGE_NAME/path/to/asset - - # 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 diff --git a/packages/firebase_analytics/example/test_driver/firebase_analytics.dart b/packages/firebase_analytics/example/test_driver/firebase_analytics.dart deleted file mode 100644 index ee09c9415527..000000000000 --- a/packages/firebase_analytics/example/test_driver/firebase_analytics.dart +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019, 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'; -import 'dart:io'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_analytics/firebase_analytics.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$FirebaseAnalytics', () { - FirebaseAnalytics analytics; - - setUp(() { - analytics = FirebaseAnalytics(); - }); - - test('Android-only functionality', () async { - if (Platform.isIOS) { - expect(analytics.android, isNull); - } - if (Platform.isAndroid) { - await analytics.android.setSessionTimeoutDuration(1000); - } - }); - - test('logging', () async { - expect(analytics.setAnalyticsCollectionEnabled(true), completes); - expect(analytics.setCurrentScreen(screenName: 'testing'), completes); - expect(analytics.logEvent(name: 'testing'), completes); - }); - }); -} diff --git a/packages/firebase_analytics/example/test_driver/firebase_analytics_test.dart b/packages/firebase_analytics/example/test_driver/firebase_analytics_test.dart deleted file mode 100644 index db46258dfebe..000000000000 --- a/packages/firebase_analytics/example/test_driver/firebase_analytics_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019, 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:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_analytics/ios/Assets/.gitkeep b/packages/firebase_analytics/ios/Assets/.gitkeep deleted file mode 100755 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.h b/packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.h deleted file mode 100644 index 0ddf1f57a7de..000000000000 --- a/packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 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 - -@interface FLTFirebaseAnalyticsPlugin : NSObject -@end diff --git a/packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.m b/packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.m deleted file mode 100644 index a96ff58caa93..000000000000 --- a/packages/firebase_analytics/ios/Classes/FirebaseAnalyticsPlugin.m +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2017 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 "FirebaseAnalyticsPlugin.h" -#import "UserAgent.h" - -#import "Firebase/Firebase.h" - -@implementation FLTFirebaseAnalyticsPlugin { -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_analytics" - binaryMessenger:[registrar messenger]]; - FLTFirebaseAnalyticsPlugin *instance = [[FLTFirebaseAnalyticsPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"logEvent" isEqualToString:call.method]) { - NSString *eventName = call.arguments[@"name"]; - id parameterMap = call.arguments[@"parameters"]; - - if (parameterMap != [NSNull null]) { - [FIRAnalytics logEventWithName:eventName parameters:parameterMap]; - } else { - [FIRAnalytics logEventWithName:eventName parameters:nil]; - } - - result(nil); - } else if ([@"setUserId" isEqualToString:call.method]) { - NSString *userId = call.arguments; - [FIRAnalytics setUserID:userId]; - result(nil); - } else if ([@"setCurrentScreen" isEqualToString:call.method]) { - NSString *screenName = call.arguments[@"screenName"]; - NSString *screenClassOverride = call.arguments[@"screenClassOverride"]; - [FIRAnalytics setScreenName:screenName screenClass:screenClassOverride]; - result(nil); - } else if ([@"setUserProperty" isEqualToString:call.method]) { - NSString *name = call.arguments[@"name"]; - NSString *value = call.arguments[@"value"]; - [FIRAnalytics setUserPropertyString:value forName:name]; - result(nil); - } else if ([@"setAnalyticsCollectionEnabled" isEqualToString:call.method]) { - NSNumber *enabled = [NSNumber numberWithBool:call.arguments]; - [FIRAnalytics setAnalyticsCollectionEnabled:[enabled boolValue]]; - result(nil); - } else if ([@"resetAnalyticsData" isEqualToString:call.method]) { - [FIRAnalytics resetAnalyticsData]; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -@end diff --git a/packages/firebase_analytics/ios/firebase_analytics.podspec b/packages/firebase_analytics/ios/firebase_analytics.podspec deleted file mode 100755 index 31c21add0d96..000000000000 --- a/packages/firebase_analytics/ios/firebase_analytics.podspec +++ /dev/null @@ -1,33 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_analytics' - s.version = '0.0.1' - s.summary = 'Firebase Analytics plugin for Flutter.' - s.description = <<-DESC -Firebase Analytics plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_analytics' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/Analytics', '~> 6.0' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-analytics\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_analytics/lib/firebase_analytics.dart b/packages/firebase_analytics/lib/firebase_analytics.dart deleted file mode 100755 index c04ac1c3e468..000000000000 --- a/packages/firebase_analytics/lib/firebase_analytics.dart +++ /dev/null @@ -1,1097 +0,0 @@ -// Copyright 2017 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:flutter/foundation.dart'; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -const MethodChannel firebaseChannel = - MethodChannel('plugins.flutter.io/firebase_analytics'); - -/// Firebase Analytics API. -class FirebaseAnalytics { - final MethodChannel _channel = firebaseChannel; - - /// Namespace for analytics API available on Android only. - /// - /// The value of this field is `null` on non-Android platforms. If you are - /// writing cross-platform code, consider using null-aware operator when - /// accessing it. - /// - /// Example: - /// - /// FirebaseAnalytics analytics = FirebaseAnalytics(); - /// analytics.android?.setSessionTimeoutDuration(true); - final FirebaseAnalyticsAndroid android = - defaultTargetPlatform == TargetPlatform.android - ? FirebaseAnalyticsAndroid() - : null; - - /// Logs a custom Flutter Analytics event with the given [name] and event [parameters]. - Future logEvent( - {@required String name, Map parameters}) async { - if (_reservedEventNames.contains(name)) { - throw ArgumentError.value( - name, 'name', 'Event name is reserved and cannot be used'); - } - - const String kReservedPrefix = 'firebase_'; - - if (name.startsWith(kReservedPrefix)) { - throw ArgumentError.value(name, 'name', - 'Prefix "$kReservedPrefix" is reserved and cannot be used.'); - } - - await _channel.invokeMethod('logEvent', { - 'name': name, - 'parameters': parameters, - }); - } - - /// Sets whether analytics collection is enabled for this app on this device. - /// - /// This setting is persisted across app sessions. By default it is enabled. - Future setAnalyticsCollectionEnabled(bool enabled) async { - if (enabled == null) { - throw ArgumentError.notNull('enabled'); - } - - await _channel.invokeMethod('setAnalyticsCollectionEnabled', enabled); - } - - /// Sets the user ID property. - /// - /// This feature must be used in accordance with [Google's Privacy Policy][1]. - /// - /// [1]: https://www.google.com/policies/privacy/ - Future setUserId(String id) async { - await _channel.invokeMethod('setUserId', id); - } - - /// Sets the current [screenName], which specifies the current visual context - /// in your app. - /// - /// This helps identify the areas in your app where users spend their time - /// and how they interact with your app. - /// - /// The class name can optionally be overridden by the [screenClassOverride] - /// parameter. - /// - /// The [screenName] and [screenClassOverride] remain in effect until the - /// current `Activity` (in Android) or `UIViewController` (in iOS) changes or - /// a new call to [setCurrentScreen] is made. - /// - /// See also: - /// - /// https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#setCurrentScreen(android.app.Activity, java.lang.String, java.lang.String) - /// https://firebase.google.com/docs/reference/ios/firebaseanalytics/api/reference/Classes/FIRAnalytics#setscreennamescreenclass - Future setCurrentScreen( - {@required String screenName, - String screenClassOverride = 'Flutter'}) async { - if (screenName == null) { - throw ArgumentError.notNull('screenName'); - } - - await _channel.invokeMethod('setCurrentScreen', { - 'screenName': screenName, - 'screenClassOverride': screenClassOverride, - }); - } - - static final RegExp _nonAlphaNumeric = RegExp(r'[^a-zA-Z0-9_]'); - static final RegExp _alpha = RegExp(r'[a-zA-Z]'); - - /// Sets a user property to a given value. - /// - /// Up to 25 user property names are supported. Once set, user property - /// values persist throughout the app lifecycle and across sessions. - /// - /// [name] is the name of the user property to set. Should contain 1 to 24 - /// alphanumeric characters or underscores and must start with an alphabetic - /// character. The "firebase_" prefix is reserved and should not be used for - /// user property names. - Future setUserProperty( - {@required String name, @required String value}) async { - if (name == null) { - throw ArgumentError.notNull('name'); - } - - if (name.isEmpty || - name.length > 24 || - name.indexOf(_alpha) != 0 || - name.contains(_nonAlphaNumeric)) - throw ArgumentError.value( - name, 'name', 'must contain 1 to 24 alphanumeric characters.'); - - if (name.startsWith('firebase_')) - throw ArgumentError.value(name, 'name', '"firebase_" prefix is reserved'); - - await _channel.invokeMethod('setUserProperty', { - 'name': name, - 'value': value, - }); - } - - /// Clears all analytics data for this app from the device and resets the app instance id. - Future resetAnalyticsData() async { - await _channel.invokeMethod('resetAnalyticsData'); - } - - /// Logs the standard `add_payment_info` event. - /// - /// This event signifies that a user has submitted their payment information - /// to your app. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#ADD_PAYMENT_INFO - Future logAddPaymentInfo() { - return logEvent(name: 'add_payment_info'); - } - - /// Logs the standard `add_to_cart` event. - /// - /// This event signifies that an item was added to a cart for purchase. Add - /// this event to a funnel with [logEcommercePurchase] to gauge the - /// effectiveness of your checkout process. Note: If you supply the - /// [value] parameter, you must also supply the [currency] parameter so that - /// revenue metrics can be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#ADD_TO_CART - Future logAddToCart({ - @required String itemId, - @required String itemName, - @required String itemCategory, - @required int quantity, - double price, - double value, - String currency, - String origin, - String itemLocationId, - String destination, - String startDate, - String endDate, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'add_to_cart', - parameters: filterOutNulls({ - _ITEM_ID: itemId, - _ITEM_NAME: itemName, - _ITEM_CATEGORY: itemCategory, - _QUANTITY: quantity, - _PRICE: price, - _VALUE: value, - _CURRENCY: currency, - _ORIGIN: origin, - _ITEM_LOCATION_ID: itemLocationId, - _DESTINATION: destination, - _START_DATE: startDate, - _END_DATE: endDate, - }), - ); - } - - /// Logs the standard `add_to_wishlist` event. - /// - /// This event signifies that an item was added to a wishlist. Use this event - /// to identify popular gift items in your app. Note: If you supply the - /// [value] parameter, you must also supply the [currency] parameter so that - /// revenue metrics can be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#ADD_TO_WISHLIST - Future logAddToWishlist({ - @required String itemId, - @required String itemName, - @required String itemCategory, - @required int quantity, - double price, - double value, - String currency, - String itemLocationId, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'add_to_wishlist', - parameters: filterOutNulls({ - _ITEM_ID: itemId, - _ITEM_NAME: itemName, - _ITEM_CATEGORY: itemCategory, - _QUANTITY: quantity, - _PRICE: price, - _VALUE: value, - _CURRENCY: currency, - _ITEM_LOCATION_ID: itemLocationId, - }), - ); - } - - /// Logs the standard `app_open` event. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#APP_OPEN - Future logAppOpen() { - return logEvent(name: 'app_open'); - } - - /// Logs the standard `begin_checkout` event. - /// - /// This event signifies that a user has begun the process of checking out. - /// Add this event to a funnel with your [logEcommercePurchase] event to - /// gauge the effectiveness of your checkout process. Note: If you supply the - /// [value] parameter, you must also supply the [currency] parameter so that - /// revenue metrics can be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#BEGIN_CHECKOUT - Future logBeginCheckout({ - double value, - String currency, - String transactionId, - int numberOfNights, - int numberOfRooms, - int numberOfPassengers, - String origin, - String destination, - String startDate, - String endDate, - String travelClass, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'begin_checkout', - parameters: filterOutNulls({ - _VALUE: value, - _CURRENCY: currency, - _TRANSACTION_ID: transactionId, - _NUMBER_OF_NIGHTS: numberOfNights, - _NUMBER_OF_ROOMS: numberOfRooms, - _NUMBER_OF_PASSENGERS: numberOfPassengers, - _ORIGIN: origin, - _DESTINATION: destination, - _START_DATE: startDate, - _END_DATE: endDate, - _TRAVEL_CLASS: travelClass, - }), - ); - } - - /// Logs the standard `campaign_details` event. - /// - /// Log this event to supply the referral details of a re-engagement campaign. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#CAMPAIGN_DETAILS - Future logCampaignDetails({ - @required String source, - @required String medium, - @required String campaign, - String term, - String content, - String aclid, - String cp1, - }) { - return logEvent( - name: 'campaign_details', - parameters: filterOutNulls({ - _SOURCE: source, - _MEDIUM: medium, - _CAMPAIGN: campaign, - _TERM: term, - _CONTENT: content, - _ACLID: aclid, - _CP1: cp1, - }), - ); - } - - /// Logs the standard `earn_virtual_currency` event. - /// - /// This event tracks the awarding of virtual currency in your app. Log this - /// along with [logSpendVirtualCurrency] to better understand your virtual - /// economy. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#EARN_VIRTUAL_CURRENCY - Future logEarnVirtualCurrency({ - @required String virtualCurrencyName, - @required num value, - }) { - return logEvent( - name: 'earn_virtual_currency', - parameters: filterOutNulls({ - _VIRTUAL_CURRENCY_NAME: virtualCurrencyName, - _VALUE: value, - }), - ); - } - - /// Logs the standard `ecommerce_purchase` event. - /// - /// This event signifies that an item was purchased by a user. Note: This is - /// different from the in-app purchase event, which is reported automatically - /// for Google Play-based apps. Note: If you supply the [value] parameter, - /// you must also supply the [currency] parameter so that revenue metrics can - /// be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#ECOMMERCE_PURCHASE - Future logEcommercePurchase({ - String currency, - double value, - String transactionId, - double tax, - double shipping, - String coupon, - String location, - int numberOfNights, - int numberOfRooms, - int numberOfPassengers, - String origin, - String destination, - String startDate, - String endDate, - String travelClass, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'ecommerce_purchase', - parameters: filterOutNulls({ - _CURRENCY: currency, - _VALUE: value, - _TRANSACTION_ID: transactionId, - _TAX: tax, - _SHIPPING: shipping, - _COUPON: coupon, - _LOCATION: location, - _NUMBER_OF_NIGHTS: numberOfNights, - _NUMBER_OF_ROOMS: numberOfRooms, - _NUMBER_OF_PASSENGERS: numberOfPassengers, - _ORIGIN: origin, - _DESTINATION: destination, - _START_DATE: startDate, - _END_DATE: endDate, - _TRAVEL_CLASS: travelClass, - }), - ); - } - - /// Logs the standard `generate_lead` event. - /// - /// Log this event when a lead has been generated in the app to understand - /// the efficacy of your install and re-engagement campaigns. Note: If you - /// supply the [value] parameter, you must also supply the [currency] - /// parameter so that revenue metrics can be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#GENERATE_LEAD - Future logGenerateLead({ - String currency, - double value, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'generate_lead', - parameters: filterOutNulls({ - _CURRENCY: currency, - _VALUE: value, - }), - ); - } - - /// Logs the standard `join_group` event. - /// - /// Log this event when a user joins a group such as a guild, team or family. - /// Use this event to analyze how popular certain groups or social features - /// are in your app. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#JOIN_GROUP - Future logJoinGroup({ - @required String groupId, - }) { - return logEvent( - name: 'join_group', - parameters: filterOutNulls({ - _GROUP_ID: groupId, - }), - ); - } - - /// Logs the standard `level_up` event. - /// - /// This event signifies that a player has leveled up in your gaming app. It - /// can help you gauge the level distribution of your userbase and help you - /// identify certain levels that are difficult to pass. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#LEVEL_UP - Future logLevelUp({ - @required int level, - String character, - }) { - return logEvent( - name: 'level_up', - parameters: filterOutNulls({ - _LEVEL: level, - _CHARACTER: character, - }), - ); - } - - /// Logs the standard `level_start` event. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#LEVEL_START - Future logLevelStart({ - @required String levelName, - }) { - return logEvent( - name: 'level_start', - parameters: filterOutNulls({ - _LEVEL_NAME: levelName, - }), - ); - } - - /// Logs the standard `level_end` event. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#LEVEL_END - Future logLevelEnd({ - @required String levelName, - int success, - }) { - return logEvent( - name: 'level_end', - parameters: filterOutNulls({ - _LEVEL_NAME: levelName, - _SUCCESS: success, - }), - ); - } - - /// Logs the standard `login` event. - /// - /// Apps with a login feature can report this event to signify that a user - /// has logged in. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#LOGIN - Future logLogin({String loginMethod}) { - return logEvent( - name: 'login', - parameters: filterOutNulls({ - _METHOD: loginMethod, - }), - ); - } - - /// Logs the standard `post_score` event. - /// - /// Log this event when the user posts a score in your gaming app. This event - /// can help you understand how users are actually performing in your game - /// and it can help you correlate high scores with certain audiences or - /// behaviors. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#POST_SCORE - Future logPostScore({ - @required int score, - int level, - String character, - }) { - return logEvent( - name: 'post_score', - parameters: filterOutNulls({ - _SCORE: score, - _LEVEL: level, - _CHARACTER: character, - }), - ); - } - - /// Logs the standard `present_offer` event. - /// - /// This event signifies that the app has presented a purchase offer to a - /// user. Add this event to a funnel with the [logAddToCart] and - /// [logEcommercePurchase] to gauge your conversion process. Note: If you - /// supply the [value] parameter, you must also supply the [currency] - /// parameter so that revenue metrics can be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#PRESENT_OFFER - Future logPresentOffer({ - @required String itemId, - @required String itemName, - @required String itemCategory, - @required int quantity, - double price, - double value, - String currency, - String itemLocationId, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'present_offer', - parameters: filterOutNulls({ - _ITEM_ID: itemId, - _ITEM_NAME: itemName, - _ITEM_CATEGORY: itemCategory, - _QUANTITY: quantity, - _PRICE: price, - _VALUE: value, - _CURRENCY: currency, - _ITEM_LOCATION_ID: itemLocationId, - }), - ); - } - - /// Logs the standard `purchase_refund` event. - /// - /// This event signifies that an item purchase was refunded. Note: If you - /// supply the [value] parameter, you must also supply the [currency] - /// parameter so that revenue metrics can be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#PURCHASE_REFUND - Future logPurchaseRefund({ - String currency, - double value, - String transactionId, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'purchase_refund', - parameters: filterOutNulls({ - _CURRENCY: currency, - _VALUE: value, - _TRANSACTION_ID: transactionId, - }), - ); - } - - /// Logs the standard `remove_from_cart` event. - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#REMOVE_FROM_CART - Future logRemoveFromCart({ - @required String itemId, - @required String itemName, - @required String itemCategory, - @required int quantity, - double price, - double value, - String currency, - String origin, - String itemLocationId, - String destination, - String startDate, - String endDate, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'remove_from_cart', - parameters: filterOutNulls({ - _QUANTITY: quantity, - _ITEM_CATEGORY: itemCategory, - _ITEM_NAME: itemName, - _ITEM_ID: itemId, - _VALUE: value, - _PRICE: price, - _CURRENCY: currency, - _ITEM_LOCATION_ID: itemLocationId, - _ORIGIN: origin, - _START_DATE: startDate, - _END_DATE: endDate, - _DESTINATION: destination, - }), - ); - } - - /// Logs the standard `search` event. - /// - /// Apps that support search features can use this event to contextualize - /// search operations by supplying the appropriate, corresponding parameters. - /// This event can help you identify the most popular content in your app. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SEARCH - Future logSearch({ - @required String searchTerm, - int numberOfNights, - int numberOfRooms, - int numberOfPassengers, - String origin, - String destination, - String startDate, - String endDate, - String travelClass, - }) { - return logEvent( - name: 'search', - parameters: filterOutNulls({ - _SEARCH_TERM: searchTerm, - _NUMBER_OF_NIGHTS: numberOfNights, - _NUMBER_OF_ROOMS: numberOfRooms, - _NUMBER_OF_PASSENGERS: numberOfPassengers, - _ORIGIN: origin, - _DESTINATION: destination, - _START_DATE: startDate, - _END_DATE: endDate, - _TRAVEL_CLASS: travelClass, - }), - ); - } - - /// Logs the standard `select_content` event. - /// - /// This general purpose event signifies that a user has selected some - /// content of a certain type in an app. The content can be any object in - /// your app. This event can help you identify popular content and categories - /// of content in your app. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SELECT_CONTENT - Future logSelectContent({ - @required String contentType, - @required String itemId, - }) { - return logEvent( - name: 'select_content', - parameters: filterOutNulls({ - _CONTENT_TYPE: contentType, - _ITEM_ID: itemId, - }), - ); - } - - /// Logs the standard `set_checkout_option` event. - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SET_CHECKOUT_OPTION - Future logSetCheckoutOption({ - @required int checkoutStep, - @required String checkoutOption, - }) { - return logEvent( - name: 'set_checkout_option', - parameters: filterOutNulls({ - _CHECKOUT_STEP: checkoutStep, - _CHECKOUT_OPTION: checkoutOption, - }), - ); - } - - /// Logs the standard `share` event. - /// - /// Apps with social features can log the Share event to identify the most - /// viral content. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SHARE - Future logShare({ - @required String contentType, - @required String itemId, - @required String method, - }) { - return logEvent( - name: 'share', - parameters: filterOutNulls({ - _CONTENT_TYPE: contentType, - _ITEM_ID: itemId, - _METHOD: method, - }), - ); - } - - /// Logs the standard `sign_up` event. - /// - /// This event indicates that a user has signed up for an account in your - /// app. The parameter signifies the method by which the user signed up. Use - /// this event to understand the different behaviors between logged in and - /// logged out users. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SIGN_UP - Future logSignUp({ - @required String signUpMethod, - }) { - return logEvent( - name: 'sign_up', - parameters: filterOutNulls({ - _METHOD: signUpMethod, - }), - ); - } - - /// Logs the standard `spend_virtual_currency` event. - /// - /// This event tracks the sale of virtual goods in your app and can help you - /// identify which virtual goods are the most popular objects of purchase. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SPEND_VIRTUAL_CURRENCY - Future logSpendVirtualCurrency({ - @required String itemName, - @required String virtualCurrencyName, - @required num value, - }) { - return logEvent( - name: 'spend_virtual_currency', - parameters: filterOutNulls({ - _ITEM_NAME: itemName, - _VIRTUAL_CURRENCY_NAME: virtualCurrencyName, - _VALUE: value, - }), - ); - } - - /// Logs the standard `tutorial_begin` event. - /// - /// This event signifies the start of the on-boarding process in your app. - /// Use this in a funnel with [logTutorialComplete] to understand how many - /// users complete this process and move on to the full app experience. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#TUTORIAL_BEGIN - Future logTutorialBegin() { - return logEvent(name: 'tutorial_begin'); - } - - /// Logs the standard `tutorial_complete` event. - /// - /// Use this event to signify the user's completion of your app's on-boarding - /// process. Add this to a funnel with [logTutorialBegin] to gauge the - /// completion rate of your on-boarding process. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#TUTORIAL_COMPLETE - Future logTutorialComplete() { - return logEvent(name: 'tutorial_complete'); - } - - /// Logs the standard `unlock_achievement` event with a given achievement - /// [id]. - /// - /// Log this event when the user has unlocked an achievement in your game. - /// Since achievements generally represent the breadth of a gaming - /// experience, this event can help you understand how many users are - /// experiencing all that your game has to offer. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#UNLOCK_ACHIEVEMENT - Future logUnlockAchievement({ - @required String id, - }) { - return logEvent( - name: 'unlock_achievement', - parameters: filterOutNulls({ - _ACHIEVEMENT_ID: id, - }), - ); - } - - /// Logs the standard `view_item` event. - /// - /// This event signifies that some content was shown to the user. This - /// content may be a product, a webpage or just a simple image or text. Use - /// the appropriate parameters to contextualize the event. Use this event to - /// discover the most popular items viewed in your app. Note: If you supply - /// the [value] parameter, you must also supply the [currency] parameter so - /// that revenue metrics can be computed accurately. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#VIEW_ITEM - Future logViewItem({ - @required String itemId, - @required String itemName, - @required String itemCategory, - String itemLocationId, - double price, - int quantity, - String currency, - double value, - String flightNumber, - int numberOfPassengers, - int numberOfNights, - int numberOfRooms, - String origin, - String destination, - String startDate, - String endDate, - String searchTerm, - String travelClass, - }) { - _requireValueAndCurrencyTogether(value, currency); - - return logEvent( - name: 'view_item', - parameters: filterOutNulls({ - _ITEM_ID: itemId, - _ITEM_NAME: itemName, - _ITEM_CATEGORY: itemCategory, - _ITEM_LOCATION_ID: itemLocationId, - _PRICE: price, - _QUANTITY: quantity, - _CURRENCY: currency, - _VALUE: value, - _FLIGHT_NUMBER: flightNumber, - _NUMBER_OF_PASSENGERS: numberOfPassengers, - _NUMBER_OF_NIGHTS: numberOfNights, - _NUMBER_OF_ROOMS: numberOfRooms, - _ORIGIN: origin, - _DESTINATION: destination, - _START_DATE: startDate, - _END_DATE: endDate, - _SEARCH_TERM: searchTerm, - _TRAVEL_CLASS: travelClass, - }), - ); - } - - /// Logs the standard `view_item_list` event. - /// - /// Log this event when the user has been presented with a list of items of a - /// certain category. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#VIEW_ITEM_LIST - Future logViewItemList({ - @required String itemCategory, - }) { - return logEvent( - name: 'view_item_list', - parameters: filterOutNulls({ - _ITEM_CATEGORY: itemCategory, - }), - ); - } - - /// Logs the standard `view_search_results` event. - /// - /// Log this event when the user has been presented with the results of a - /// search. - /// - /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#VIEW_SEARCH_RESULTS - Future logViewSearchResults({ - @required String searchTerm, - }) { - return logEvent( - name: 'view_search_results', - parameters: filterOutNulls({ - _SEARCH_TERM: searchTerm, - }), - ); - } -} - -/// Android-specific analytics API. -class FirebaseAnalyticsAndroid { - final MethodChannel _channel = firebaseChannel; - - /// Sets the duration of inactivity that terminates the current session. - /// - /// The default value is 1800000 (30 minutes). - Future setSessionTimeoutDuration(int milliseconds) async { - if (milliseconds == null) { - throw ArgumentError.notNull('milliseconds'); - } - await _channel.invokeMethod( - 'setSessionTimeoutDuration', milliseconds); - } -} - -/// Creates a new map containing all of the key/value pairs from [parameters] -/// except those whose value is `null`. -@visibleForTesting -Map filterOutNulls(Map parameters) { - final Map filtered = {}; - parameters.forEach((String key, dynamic value) { - if (value != null) { - filtered[key] = value; - } - }); - return filtered; -} - -@visibleForTesting -const String valueAndCurrencyMustBeTogetherError = 'If you supply the "value" ' - 'parameter, you must also supply the "currency" parameter.'; - -void _requireValueAndCurrencyTogether(double value, String currency) { - if (value != null && currency == null) { - throw ArgumentError(valueAndCurrencyMustBeTogetherError); - } -} - -/// Reserved event names that cannot be used. -/// -/// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html -const List _reservedEventNames = [ - 'ad_activeview', - 'ad_click', - 'ad_exposure', - 'ad_impression', - 'ad_query', - 'adunit_exposure', - 'app_clear_data', - 'app_uninstall', - 'app_update', - 'error', - 'first_open', - 'first_visit', - 'in_app_purchase', - 'notification_dismiss', - 'notification_foreground', - 'notification_open', - 'notification_receive', - 'os_update', - 'screen_view', - 'session_start', - 'user_engagement', -]; - -// The following constants are defined in: -// -// https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Param.html - -/// Game achievement ID. -const String _ACHIEVEMENT_ID = 'achievement_id'; - -/// `CAMPAIGN_DETAILS` click ID. -const String _ACLID = 'aclid'; - -/// `CAMPAIGN_DETAILS` name; used for keyword analysis to identify a specific -/// product promotion or strategic campaign. -const String _CAMPAIGN = 'campaign'; - -/// Character used in game. -const String _CHARACTER = 'character'; - -/// `CAMPAIGN_DETAILS` content; used for A/B testing and content-targeted ads to -/// differentiate ads or links that point to the same URL. -const String _CONTENT = 'content'; - -/// Type of content selected. -const String _CONTENT_TYPE = 'content_type'; - -/// Coupon code for a purchasable item. -const String _COUPON = 'coupon'; - -/// `CAMPAIGN_DETAILS` custom parameter. -const String _CP1 = 'cp1'; - -/// Purchase currency in 3 letter ISO_4217 format. -const String _CURRENCY = 'currency'; - -/// Flight or Travel destination. -const String _DESTINATION = 'destination'; - -/// The arrival date, check-out date, or rental end date for the item. -const String _END_DATE = 'end_date'; - -/// Indicates that the associated event should either -/// extend the current session or start a new session -/// if no session was active when the event was logged. -// const String _EXTENDED_SESSION = 'extend_session'; - -/// Flight number for travel events. -const String _FLIGHT_NUMBER = 'flight_number'; - -/// Group/clan/guild id. -const String _GROUP_ID = 'group_id'; - -/// Item category. -const String _ITEM_CATEGORY = 'item_category'; - -/// Item ID. -const String _ITEM_ID = 'item_id'; - -/// The Google Place ID that corresponds to the associated item. -const String _ITEM_LOCATION_ID = 'item_location_id'; - -/// Item Brand. -// const String _ITEM_BRAND = 'item_brand'; - -/// Item Variant. -// const String _ITEM_VARIANT = 'item_variant'; - -/// The list in which the item was presented to the user. -// const String _ITEM_LIST = 'item_list'; - -/// The checkout step (1..N). -const String _CHECKOUT_STEP = 'checkout_step'; - -/// Some option on a step in an ecommerce flow. -const String _CHECKOUT_OPTION = 'checkout_option'; - -/// The name of a creative used in a promotional spot. -// const String _CREATIVE_NAME = 'creative_name'; - -/// The name of a creative slot. -// const String _CREATIVE_SLOT = 'creative_slot'; - -/// The store or affiliation from which this transaction occurred. -// const String _AFFILIATION = 'affiliation'; - -/// The index of an item in a list. -// const String _INDEX = 'index'; - -/// Item name (String). -const String _ITEM_NAME = 'item_name'; - -/// Level in game (long). -const String _LEVEL = 'level'; - -/// The name of a level in a game (String). -const String _LEVEL_NAME = 'level_name'; - -/// The result of an operation (long). -const String _SUCCESS = 'success'; - -/// Location. -const String _LOCATION = 'location'; - -/// `CAMPAIGN_DETAILS` medium; used to identify a medium such as email or -/// cost-per-click (cpc). -const String _MEDIUM = 'medium'; - -/// Number of nights staying at hotel (long). -const String _NUMBER_OF_NIGHTS = 'number_of_nights'; - -/// Number of passengers traveling (long). -const String _NUMBER_OF_PASSENGERS = 'number_of_passengers'; - -/// Number of rooms for travel events (long). -const String _NUMBER_OF_ROOMS = 'number_of_rooms'; - -/// Flight or Travel origin. -const String _ORIGIN = 'origin'; - -/// Purchase price (double). -const String _PRICE = 'price'; - -/// Purchase quantity (long). -const String _QUANTITY = 'quantity'; - -/// Score in game (long). -const String _SCORE = 'score'; - -/// The search string/keywords used. -const String _SEARCH_TERM = 'search_term'; - -/// Shipping cost (double). -const String _SHIPPING = 'shipping'; - -/// A particular approach used in an operation; for example, "facebook" or -/// "email" in the context of a sign_up or login event. -const String _METHOD = 'method'; - -/// `CAMPAIGN_DETAILS` source; used to identify a search engine, newsletter, or -/// other source. -const String _SOURCE = 'source'; - -/// The departure date, check-in date, or rental start date for the item. -const String _START_DATE = 'start_date'; - -/// Tax amount (double). -const String _TAX = 'tax'; - -/// `CAMPAIGN_DETAILS` term; used with paid search to supply the keywords for -/// ads. -const String _TERM = 'term'; - -/// A single ID for a ecommerce group transaction. -const String _TRANSACTION_ID = 'transaction_id'; - -/// Travel class. -const String _TRAVEL_CLASS = 'travel_class'; - -/// A context-specific numeric value which is accumulated automatically for -/// each event type. -const String _VALUE = 'value'; - -/// Name of virtual currency type. -const String _VIRTUAL_CURRENCY_NAME = 'virtual_currency_name'; diff --git a/packages/firebase_analytics/lib/observer.dart b/packages/firebase_analytics/lib/observer.dart deleted file mode 100644 index d11db332573d..000000000000 --- a/packages/firebase_analytics/lib/observer.dart +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2017 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:flutter/services.dart'; -import 'package:meta/meta.dart'; -import 'package:flutter/widgets.dart'; - -import 'firebase_analytics.dart'; - -/// Signature for a function that extracts a screen name from [RouteSettings]. -/// -/// Usually, the route name is not a plain string, and it may contains some -/// unique ids that makes it difficult to aggregate over them in Firebase -/// Analytics. -typedef String ScreenNameExtractor(RouteSettings settings); - -String defaultNameExtractor(RouteSettings settings) => settings.name; - -/// A [NavigatorObserver] that sends events to Firebase Analytics when the -/// currently active [PageRoute] changes. -/// -/// When a route is pushed or popped, [nameExtractor] is used to extract a name -/// from [RouteSettings] of the now active route and that name is sent to -/// Firebase. -/// -/// The following operations will result in sending a screen view event: -/// ```dart -/// Navigator.pushNamed(context, '/contact/123'); -/// -/// Navigator.push(context, MaterialPageRoute( -/// settings: RouteSettings(name: '/contact/123'), -/// builder: (_) => ContactDetail(123))); -/// -/// Navigator.pushReplacement(context, MaterialPageRoute( -/// settings: RouteSettings(name: '/contact/123'), -/// builder: (_) => ContactDetail(123))); -/// -/// Navigator.pop(context); -/// ``` -/// -/// To use it, add it to the `navigatorObservers` of your [Navigator], e.g. if -/// you're using a [MaterialApp]: -/// ```dart -/// MaterialApp( -/// home: MyAppHome(), -/// navigatorObservers: [ -/// FirebaseAnalyticsObserver(analytics: service.analytics), -/// ], -/// ); -/// ``` -/// -/// You can also track screen views within your [PageRoute] by implementing -/// [PageRouteAware] and subscribing it to [FirebaseAnalyticsObserver]. See the -/// [PageRouteObserver] docs for an example. -class FirebaseAnalyticsObserver extends RouteObserver> { - /// Creates a [NavigatorObserver] that sends events to [FirebaseAnalytics]. - /// - /// When a route is pushed or popped, [nameExtractor] is used to extract a - /// name from [RouteSettings] of the now active route and that name is sent to - /// Firebase. Defaults to `defaultNameExtractor`. - /// - /// If a [PlatformException] is thrown while the observer attempts to send the - /// active route to [analytics], `onError` will be called with the - /// exception. If `onError` is omitted, the exception will be printed using - /// `debugPrint()`. - FirebaseAnalyticsObserver({ - @required this.analytics, - this.nameExtractor = defaultNameExtractor, - Function(PlatformException error) onError, - }) : _onError = onError; - - final FirebaseAnalytics analytics; - final ScreenNameExtractor nameExtractor; - final void Function(PlatformException error) _onError; - - void _sendScreenView(PageRoute route) { - final String screenName = nameExtractor(route.settings); - if (screenName != null) { - analytics.setCurrentScreen(screenName: screenName).catchError( - (Object error) { - if (_onError == null) { - debugPrint('$FirebaseAnalyticsObserver: $error'); - } else { - _onError(error); - } - }, - test: (Object error) => error is PlatformException, - ); - } - } - - @override - void didPush(Route route, Route previousRoute) { - super.didPush(route, previousRoute); - if (route is PageRoute) { - _sendScreenView(route); - } - } - - @override - void didReplace({Route newRoute, Route oldRoute}) { - super.didReplace(newRoute: newRoute, oldRoute: oldRoute); - if (newRoute is PageRoute) { - _sendScreenView(newRoute); - } - } - - @override - void didPop(Route route, Route previousRoute) { - super.didPop(route, previousRoute); - if (previousRoute is PageRoute && route is PageRoute) { - _sendScreenView(previousRoute); - } - } -} diff --git a/packages/firebase_analytics/pubspec.yaml b/packages/firebase_analytics/pubspec.yaml deleted file mode 100755 index 071ed2321382..000000000000 --- a/packages/firebase_analytics/pubspec.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: firebase_analytics -description: Flutter plugin for Google Analytics for Firebase, an app measurement - solution that provides insight on app usage and user engagement on Android and iOS. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_analytics -version: 5.0.0 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebaseanalytics - iosPrefix: FLT - pluginClass: FirebaseAnalyticsPlugin - -dependencies: - meta: ^1.0.4 - flutter: - sdk: flutter - -dev_dependencies: - mockito: 3.0.0 - flutter_test: - sdk: flutter - firebase_core: ^0.4.0 - flutter_driver: - sdk: flutter - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_analytics/test/firebase_analytics_test.dart b/packages/firebase_analytics/test/firebase_analytics_test.dart deleted file mode 100755 index c8af79710f0d..000000000000 --- a/packages/firebase_analytics/test/firebase_analytics_test.dart +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2017 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:flutter_test/flutter_test.dart'; -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:flutter/services.dart'; - -void main() { - final FirebaseAnalytics analytics = FirebaseAnalytics(); - const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_analytics'); - MethodCall methodCall; - - setUp(() async { - channel.setMockMethodCallHandler((MethodCall m) async { - methodCall = m; - }); - }); - - tearDown(() { - channel.setMockMethodCallHandler(null); - methodCall = null; - }); - - group('filterOutNulls', () { - test('filters out null values', () { - final Map original = { - 'a': 1, - 'b': null, - 'c': 'd' - }; - final Map filtered = filterOutNulls(original); - - expect(filtered, isNot(same(original))); - expect(original, {'a': 1, 'b': null, 'c': 'd'}); - expect(filtered, {'a': 1, 'c': 'd'}); - }); - }); - - group('FirebaseAnalytics', () { - test('setUserId', () async { - await analytics.setUserId('test-user-id'); - expect( - methodCall, - isMethodCall( - 'setUserId', - arguments: 'test-user-id', - ), - ); - }); - - test('setCurrentScreen', () async { - await analytics.setCurrentScreen( - screenName: 'test-screen-name', - screenClassOverride: 'test-class-override', - ); - expect( - methodCall, - isMethodCall( - 'setCurrentScreen', - arguments: { - 'screenName': 'test-screen-name', - 'screenClassOverride': 'test-class-override', - }, - ), - ); - }); - - test('setUserProperty', () async { - await analytics.setUserProperty(name: 'test_name', value: 'test-value'); - expect( - methodCall, - isMethodCall( - 'setUserProperty', - arguments: { - 'name': 'test_name', - 'value': 'test-value', - }, - ), - ); - }); - - test('setUserProperty rejects invalid names', () async { - // invalid character - expect(analytics.setUserProperty(name: 'test-name', value: 'test-value'), - throwsArgumentError); - // non-alpha first character - expect(analytics.setUserProperty(name: '0test', value: 'test-value'), - throwsArgumentError); - // null - expect(analytics.setUserProperty(name: null, value: 'test-value'), - throwsArgumentError); - // blank - expect(analytics.setUserProperty(name: '', value: 'test-value'), - throwsArgumentError); - // reserved prefix - expect( - analytics.setUserProperty(name: 'firebase_test', value: 'test-value'), - throwsArgumentError); - }); - - test('setAnalyticsCollectionEnabled', () async { - await analytics.setAnalyticsCollectionEnabled(false); - expect( - methodCall, - isMethodCall( - 'setAnalyticsCollectionEnabled', - arguments: false, - ), - ); - }); - - test('setSessionTimeoutDuration', () async { - await analytics.android.setSessionTimeoutDuration(234); - expect( - methodCall, - isMethodCall( - 'setSessionTimeoutDuration', - arguments: 234, - ), - ); - }); - - test('resetAnalyticsData', () async { - await analytics.resetAnalyticsData(); - expect( - methodCall, - isMethodCall( - 'resetAnalyticsData', - arguments: null, - ), - ); - }); - }); - - group('FirebaseAnalytics analytics events', () { - test('logEvent log events', () async { - await analytics.logEvent( - name: 'test-event', - parameters: {'a': 'b'}, - ); - expect( - methodCall, - isMethodCall( - 'logEvent', - arguments: { - 'name': 'test-event', - 'parameters': {'a': 'b'}, - }, - ), - ); - }); - - test('logEvent rejects events with reserved names', () async { - expect(analytics.logEvent(name: 'app_clear_data'), throwsArgumentError); - }); - - test('logEvent rejects events with reserved prefix', () async { - expect(analytics.logEvent(name: 'firebase_foo'), throwsArgumentError); - }); - - void smokeTest(String testFunctionName, Future testFunction()) { - test('$testFunctionName works', () async { - await testFunction(); - expect(methodCall.arguments['name'], testFunctionName); - }); - } - - smokeTest('add_payment_info', () => analytics.logAddPaymentInfo()); - - smokeTest( - 'add_to_cart', - () => analytics.logAddToCart( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - quantity: 5, - )); - - smokeTest( - 'add_to_wishlist', - () => analytics.logAddToWishlist( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - quantity: 5, - )); - - smokeTest('app_open', () => analytics.logAppOpen()); - - smokeTest('begin_checkout', () => analytics.logBeginCheckout()); - - smokeTest( - 'campaign_details', - () => analytics.logCampaignDetails( - source: 'test-source', - medium: 'test-medium', - campaign: 'test-campaign', - )); - - smokeTest( - 'earn_virtual_currency', - () => analytics.logEarnVirtualCurrency( - virtualCurrencyName: 'bitcoin', - value: 34, - )); - - smokeTest('ecommerce_purchase', () => analytics.logEcommercePurchase()); - - smokeTest('generate_lead', () => analytics.logGenerateLead()); - - smokeTest( - 'join_group', - () => analytics.logJoinGroup( - groupId: 'test-group-id', - )); - - smokeTest( - 'level_up', - () => analytics.logLevelUp( - level: 56, - )); - - smokeTest( - 'level_start', - () => analytics.logLevelStart( - levelName: 'level-name', - )); - - smokeTest( - 'level_end', - () => analytics.logLevelEnd( - levelName: 'level-name', - success: 1, - )); - - smokeTest('login', () => analytics.logLogin()); - - smokeTest( - 'login', - () => analytics.logLogin( - loginMethod: 'email', - )); - - smokeTest( - 'post_score', - () => analytics.logPostScore( - score: 34, - )); - - smokeTest( - 'present_offer', - () => analytics.logPresentOffer( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - quantity: 5, - )); - - smokeTest('purchase_refund', () => analytics.logPurchaseRefund()); - - smokeTest( - 'search', - () => analytics.logSearch( - searchTerm: 'test search term', - )); - - smokeTest( - 'select_content', - () => analytics.logSelectContent( - contentType: 'test content type', - itemId: 'test item id', - )); - - smokeTest( - 'share', - () => analytics.logShare( - contentType: 'test content type', - itemId: 'test item id', - method: 'test method', - )); - - smokeTest( - 'sign_up', - () => analytics.logSignUp( - signUpMethod: 'test sign-up method', - )); - - smokeTest( - 'spend_virtual_currency', - () => analytics.logSpendVirtualCurrency( - itemName: 'test-item-name', - virtualCurrencyName: 'bitcoin', - value: 345, - )); - - smokeTest('tutorial_begin', () => analytics.logTutorialBegin()); - - smokeTest('tutorial_complete', () => analytics.logTutorialComplete()); - - smokeTest( - 'unlock_achievement', - () => analytics.logUnlockAchievement( - id: 'firebase analytics api coverage', - )); - - smokeTest( - 'view_item', - () => analytics.logViewItem( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - )); - - smokeTest( - 'view_item_list', - () => analytics.logViewItemList( - itemCategory: 'test-category', - )); - - smokeTest( - 'view_search_results', - () => analytics.logViewSearchResults( - searchTerm: 'test search term', - )); - - smokeTest('set_checkout_option', () { - return analytics.logSetCheckoutOption( - checkoutStep: 1, checkoutOption: 'some credit card'); - }); - - void testRequiresValueAndCurrencyTogether( - String methodName, Future testFn()) { - test('$methodName requires value and currency together', () async { - try { - testFn(); - fail('Expected ArgumentError'); - } on ArgumentError catch (error) { - expect(error.message, valueAndCurrencyMustBeTogetherError); - } - }); - } - - testRequiresValueAndCurrencyTogether('logAddToCart', () { - return analytics.logAddToCart( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - quantity: 5, - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logRemoveFromCart', () { - return analytics.logRemoveFromCart( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - quantity: 5, - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logAddToWishlist', () { - return analytics.logAddToWishlist( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - quantity: 5, - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logBeginCheckout', () { - return analytics.logBeginCheckout( - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logEcommercePurchase', () { - return analytics.logEcommercePurchase( - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logGenerateLead', () { - return analytics.logGenerateLead( - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logPresentOffer', () { - return analytics.logPresentOffer( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - quantity: 5, - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logPurchaseRefund', () { - return analytics.logPurchaseRefund( - value: 123.90, - ); - }); - - testRequiresValueAndCurrencyTogether('logViewItem', () { - return analytics.logViewItem( - itemId: 'test-id', - itemName: 'test-name', - itemCategory: 'test-category', - value: 123.90, - ); - }); - }); -} diff --git a/packages/firebase_analytics/test/observer_test.dart b/packages/firebase_analytics/test/observer_test.dart deleted file mode 100644 index bcbd31059272..000000000000 --- a/packages/firebase_analytics/test/observer_test.dart +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2017 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:flutter/services.dart'; -import 'package:mockito/mockito.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:flutter/widgets.dart'; - -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:firebase_analytics/observer.dart'; - -void main() { - group('FirebaseAnalyticsObserver', () { - FirebaseAnalytics analytics; - FirebaseAnalyticsObserver observer; - final List printLog = []; - - void overridePrint(void Function() func) { - final ZoneSpecification spec = - ZoneSpecification(print: (_, __, ___, String msg) { - // Add to log instead of printing to stdout - printLog.add(msg); - }); - return Zone.current.fork(specification: spec).run(func); - } - - setUp(() { - printLog.clear(); - analytics = MockFirebaseAnalytics(); - observer = FirebaseAnalyticsObserver(analytics: analytics); - when(analytics.setCurrentScreen(screenName: anyNamed('screenName'))) - .thenAnswer((Invocation invocation) => Future.value()); - }); - - test('setCurrentScreen on route pop', () { - final PageRoute route = MockPageRoute(); - final PageRoute previousRoute = MockPageRoute(); - when(previousRoute.settings) - .thenReturn(const RouteSettings(name: 'previousRoute')); - - observer.didPop(route, previousRoute); - - verify(analytics.setCurrentScreen(screenName: 'previousRoute')).called(1); - }); - - test('setCurrentScreen on route push', () { - final PageRoute route = MockPageRoute(); - final PageRoute previousRoute = MockPageRoute(); - when(route.settings).thenReturn(const RouteSettings(name: 'route')); - - observer.didPush(route, previousRoute); - - verify(analytics.setCurrentScreen(screenName: 'route')).called(1); - }); - - test('setCurrentScreen on route pushReplacement', () { - final PageRoute route = MockPageRoute(); - final PageRoute previousRoute = MockPageRoute(); - when(route.settings).thenReturn(const RouteSettings(name: 'route')); - - observer.didReplace(newRoute: route, oldRoute: previousRoute); - - verify(analytics.setCurrentScreen(screenName: 'route')).called(1); - }); - - test('uses nameExtractor', () { - observer = FirebaseAnalyticsObserver( - analytics: analytics, - nameExtractor: (RouteSettings settings) => 'foo', - ); - final PageRoute route = MockPageRoute(); - final PageRoute previousRoute = MockPageRoute(); - - observer.didPush(route, previousRoute); - - verify(analytics.setCurrentScreen(screenName: 'foo')).called(1); - }); - - test('handles only ${PlatformException}s', () async { - observer = FirebaseAnalyticsObserver( - analytics: analytics, - nameExtractor: (RouteSettings settings) => 'foo', - ); - - final PageRoute route = MockPageRoute(); - final PageRoute previousRoute = MockPageRoute(); - - // Throws non-PlatformExceptions - when(analytics.setCurrentScreen(screenName: anyNamed('screenName'))) - .thenThrow(ArgumentError()); - - expect(() => observer.didPush(route, previousRoute), throwsArgumentError); - - // Print PlatformExceptions - Future throwPlatformException() async => - throw PlatformException(code: 'a'); - - when(analytics.setCurrentScreen(screenName: anyNamed('screenName'))) - .thenAnswer((Invocation invocation) => throwPlatformException()); - - overridePrint(() => observer.didPush(route, previousRoute)); - - await pumpEventQueue(); - expect( - printLog, - ['$FirebaseAnalyticsObserver: ${PlatformException(code: 'a')}'], - ); - }); - - test('runs onError', () async { - PlatformException passedException; - - final void Function(PlatformException error) handleError = - (PlatformException error) { - passedException = error; - }; - - observer = FirebaseAnalyticsObserver( - analytics: analytics, - nameExtractor: (RouteSettings settings) => 'foo', - onError: handleError, - ); - - final PageRoute route = MockPageRoute(); - final PageRoute previousRoute = MockPageRoute(); - - final PlatformException thrownException = PlatformException(code: 'b'); - Future throwPlatformException() async => throw thrownException; - - when(analytics.setCurrentScreen(screenName: anyNamed('screenName'))) - .thenAnswer((Invocation invocation) => throwPlatformException()); - - observer.didPush(route, previousRoute); - - await pumpEventQueue(); - expect(passedException, thrownException); - }); - }); -} - -class MockFirebaseAnalytics extends Mock implements FirebaseAnalytics {} - -class MockPageRoute extends Mock implements PageRoute {} diff --git a/packages/firebase_auth/.gitignore b/packages/firebase_auth/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_auth/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_auth/CHANGELOG.md b/packages/firebase_auth/CHANGELOG.md deleted file mode 100644 index d2b0aa1a4e34..000000000000 --- a/packages/firebase_auth/CHANGELOG.md +++ /dev/null @@ -1,465 +0,0 @@ -## 0.14.0+2 - -* Reduce compiler warnings on iOS port by replacing `int` with `long` backing in returned timestamps. - -## 0.14.0+1 - -* Add dependency on `androidx.annotation:annotation:1.0.0`. - -## 0.14.0 - -* Added new `IdTokenResult` class. -* **Breaking Change**. `getIdToken()` method now returns `IdTokenResult` instead of a token `String`. - Use the `token` property of `IdTokenResult` to retrieve the token `String`. -* Added integration testing for `getIdToken()`. - -## 0.13.1+1 - -* Update authentication example in README. - -## 0.13.1 - -* Fixed a crash on iOS when sign-in fails. -* Additional integration testing. -* Updated documentation for `FirebaseUser.delete()` to include error codes. -* Updated Firebase project to match other Flutterfire apps. - -## 0.13.0 - -* **Breaking change**: Replace `FirebaseUserMetadata.creationTimestamp` and - `FirebaseUserMetadata.lastSignInTimestamp` with `creationTime` and `lastSignInTime`. - Previously on iOS `creationTimestamp` and `lastSignInTimestamp` returned in - seconds and on Android in milliseconds. Now, both platforms provide values as a - `DateTime`. - -## 0.12.0+1 - -* Fixes iOS sign-in exceptions when `additionalUserInfo` is `nil` or has `nil` fields. -* Additional integration testing. - -## 0.12.0 - -* Added new `AuthResult` and `AdditionalUserInfo` classes. -* **Breaking Change**. Sign-in methods now return `AuthResult` instead of `FirebaseUser`. - Retrieve the `FirebaseUser` using the `user` property of `AuthResult`. - -## 0.11.1+12 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.11.1+11 - -* On iOS, `getIdToken()` now uses the `refresh` parameter instead of always using `true`. - -## 0.11.1+10 - -* On Android, `providerData` now includes `UserInfo` for the phone authentication provider. - -## 0.11.1+9 - -* Update README to clarify importance of filling out all fields for OAuth consent screen. - -## 0.11.1+8 - -* Automatically register for iOS notifications, ensuring that phone authentication - will work even if Firebase method swizzling is disabled. - -## 0.11.1+7 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.11.1+6 - -* Add documentation of support email requirement to README. - -## 0.11.1+5 - -* Fix `updatePhoneNumberCredential` on Android. - -## 0.11.1+4 - -* Fix `updatePhoneNumberCredential` on iOS. - -## 0.11.1+3 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. -* Replace invokeMethod with invokeMapMethod wherever necessary. -* FirebaseUser private constructor takes `Map` instead of `Map`. - -## 0.11.1+2 - -* Suppress deprecation warning for BinaryMessages. See: https://github.com/flutter/flutter/issues/33446 - -## 0.11.1+1 - -* Updated the error code documentation for `linkWithCredential`. - -## 0.11.1 - -* Support for `updatePhoneNumberCredential`. - -## 0.11.0 - -* **Breaking change**: `linkWithCredential` is now a function of `FirebaseUser`instead of - `FirebaseAuth`. -* Added test for newer `linkWithCredential` function. - -## 0.10.0+1 - -* Increase Firebase/Auth CocoaPod dependency to '~> 6.0'. - -## 0.10.0 - -* Update firebase_dynamic_links dependency. -* Update Android dependencies to latest. - -## 0.9.0 - -* **Breaking change**: `PhoneVerificationCompleted` now provides an `AuthCredential` that can - be used with `signInWithCredential` or `linkWithCredential` instead of signing in automatically. -* **Breaking change**: Remove internal counter `nextHandle` from public API. - -## 0.8.4+5 - -* Increase Firebase/Auth CocoaPod dependency to '~> 5.19'. - -## 0.8.4+4 - -* Update FirebaseAuth CocoaPod dependency to ensure availability of `FIRAuthErrorUserInfoNameKey`. - -## 0.8.4+3 - -* Updated deprecated API usage on iOS to use non-deprecated versions. -* Updated FirebaseAuth CocoaPod dependency to ensure a minimum version of 5.0. - -## 0.8.4+2 - -* Fixes an error in the documentation of createUserWithEmailAndPassword. - -## 0.8.4+1 - -* Adds credential for email authentication with link. - -## 0.8.4 - -* Adds support for email link authentication. - -## 0.8.3 - -* Make providerId 'const String' to use in 'case' statement. - -## 0.8.2+1 - -* Fixed bug where `PhoneCodeAutoRetrievalTimeout` callback was never called. - -## 0.8.2 - -* Fixed `linkWithCredential` on Android. - -## 0.8.1+5 - -* Added a driver test. - -## 0.8.1+4 - -* Update README. -* Update the example app with separate pages for registration and sign-in. - -## 0.8.1+3 - -* Reduce compiler warnings in Android plugin -* Raise errors early when accessing methods that require a Firebase User - -## 0.8.1+2 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.8.1+1 - -* Remove categories. - -## 0.8.1 - -* Fixes Firebase auth phone sign-in for Android. - -## 0.8.0+3 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.8.0+2 - -* Update Google sign-in example in the README. - -## 0.8.0+1 - -* Update a broken dependency. - -## 0.8.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.7.0 - -* Introduce third-party auth provider classes that generate `AuthCredential`s -* **Breaking Change** Signing in, linking, and reauthenticating now require an `AuthCredential` -* **Breaking Change** Unlinking now uses providerId -* **Breaking Change** Moved reauthentication to FirebaseUser - -## 0.6.7 - -* `FirebaseAuth` and `FirebaseUser` are now fully documented. -* `PlatformExceptions` now report error codes as stated in docs. -* Credentials can now be unlinked from Accounts with new methods on `FirebaseUser`. - -## 0.6.6 - -* Users can now reauthenticate in response to operations that require a recent sign-in. - -## 0.6.5 - -* Fixing async method `verifyPhoneNumber`, that would never return even in a successful call. - -## 0.6.4 - -* Added support for Github signin and linking Github accounts to existing users. - -## 0.6.3 - -* Add multi app support. - -## 0.6.2+1 - -* Bump Android dependencies to latest. - -## 0.6.2 - -* Add access to user metadata. - -## 0.6.1 - -* Adding support for linkWithTwitterCredential in FirebaseAuth. - -## 0.6.0 - -* Added support for `updatePassword` in `FirebaseUser`. -* **Breaking Change** Moved `updateEmail` and `updateProfile` to `FirebaseUser`. - This brings the `firebase_auth` package inline with other implementations and documentation. - -## 0.5.20 - -* Replaced usages of guava's: ImmutableList and ImmutableMap with platform -Collections.unmodifiableList() and Collections.unmodifiableMap(). - -## 0.5.19 - -* Update test package dependency to pick up Dart 2 support. -* Modified dependency on google_sign_in to point to a published - version instead of a relative path. - -## 0.5.18 - -* Adding support for updateEmail in FirebaseAuth. - -## 0.5.17 - -* Adding support for FirebaseUser.delete. - -## 0.5.16 - -* Adding support for setLanguageCode in FirebaseAuth. - -## 0.5.15 - -* Bump Android and Firebase dependency versions. - -## 0.5.14 - -* Fixed handling of auto phone number verification. - -## 0.5.13 - -* Add support for phone number authentication. - -## 0.5.12 - -* Fixed ArrayIndexOutOfBoundsException in handleStopListeningAuthState - -## 0.5.11 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.5.10 - -* Updated iOS implementation to reflect Firebase API changes. - -## 0.5.9 - -* Added support for signing in with a Twitter account. - -## 0.5.8 - -* Added support to reload firebase user - -## 0.5.7 - -* Added support to sendEmailVerification - -## 0.5.6 - -* Added support for linkWithFacebookCredential - -## 0.5.5 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.5.4 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.5.3 - -* Secure fetchProvidersForEmail (no providers) - -## 0.5.2 - -* Fixed Dart 2 type error in fetchProvidersForEmail. - -## 0.5.1 - -* Added support to fetchProvidersForEmail - -## 0.5.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.4.7 - -* Fixed Dart 2 type errors. - -## 0.4.6 - -* Fixed Dart 2 type errors. - -## 0.4.5 - -* Enabled use in Swift projects. - -## 0.4.4 - -* Added support for sendPasswordResetEmail - -## 0.4.3 - -* Moved to the io.flutter.plugins organization. - -## 0.4.2 - -* Added support for changing user data - -## 0.4.1 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.4.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.3.2 - -* Added FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.3.1 - -* Change GMS dependency to 11.+ - -## 0.3.0 - -* **Breaking Change**: Method FirebaseUser getToken was renamed to getIdToken. - -## 0.2.5 - -* Added support for linkWithCredential with Google credential - -## 0.2.4 - -* Added support for `signInWithCustomToken` -* Added `Stream onAuthStateChanged` event to listen when the user change - -## 0.2.3+1 - -* Aligned author name with rest of repo. - -## 0.2.3 - -* Remove dependency on Google/SignIn - -## 0.2.2 - -* Remove dependency on FirebaseUI - -## 0.2.1 - -* Added support for linkWithEmailAndPassword - -## 0.2.0 - -* **Breaking Change**: Method currentUser is async now. - -## 0.1.2 - -* Added support for signInWithFacebook - -## 0.1.1 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds - -## 0.1.0 - -* Updated to Firebase SDK Version 11.0.1 -* **Breaking Change**: You need to add a maven section with the "https://maven.google.com" endpoint to the repository section of your `android/build.gradle`. For example: -```gradle -allprojects { - repositories { - jcenter() - maven { // NEW - url "https://maven.google.com" // NEW - } // NEW - } -} -``` - -## 0.0.4 - -* Add method getToken() to FirebaseUser - -## 0.0.3+1 - -* Updated README.md - -## 0.0.3 - -* Added support for createUserWithEmailAndPassword, signInWithEmailAndPassword, and signOut Firebase methods - -## 0.0.2+1 - -* Updated README.md - -## 0.0.2 - -* Bump buildToolsVersion to 25.0.3 - -## 0.0.1 - -* Initial Release diff --git a/packages/firebase_auth/LICENSE b/packages/firebase_auth/LICENSE deleted file mode 100755 index 000b4618d2bd..000000000000 --- a/packages/firebase_auth/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 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_auth/README.md b/packages/firebase_auth/README.md deleted file mode 100755 index 5c1e80f8181f..000000000000 --- a/packages/firebase_auth/README.md +++ /dev/null @@ -1,142 +0,0 @@ -# firebase_auth plugin -A Flutter plugin to use the [Firebase Authentication API](https://firebase.google.com/products/auth/). - -[![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dartlang.org/packages/firebase_auth) - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -### Configure the Google sign-in plugin -The Google Sign-in plugin is required to use the firebase_auth plugin for Google authentication. Follow the [Google sign-in plugin installation instructions](https://pub.dartlang.org/packages/google_sign_in#pub-pkg-tab-installing). - -If you're using Google Sign-in with Firebase auth, be sure to include all required fields in the [OAuth consent screen](https://console.developers.google.com/apis/credentials/consent). If you don't, you may encounter an `ApiException`. - -### Import the firebase_auth plugin -To use the firebase_auth plugin, follow the [plugin installation instructions](https://pub.dartlang.org/packages/firebase_auth#pub-pkg-tab-installing). - -### Android integration - -Enable the Google services by configuring the Gradle scripts as such. - -1. Add the classpath to the `[project]/android/build.gradle` file. -```gradle -dependencies { - // Example existing classpath - classpath 'com.android.tools.build:gradle:3.2.1' - // Add the google services classpath - classpath 'com.google.gms:google-services:4.3.0' -} -``` - -2. Add the apply plugin to the `[project]/android/app/build.gradle` file. -```gradle -// ADD THIS AT THE BOTTOM -apply plugin: 'com.google.gms.google-services' -``` - -*Note:* If this section is not completed you will get an error like this: -``` -java.lang.IllegalStateException: -Default FirebaseApp is not initialized in this process [package name]. -Make sure to call FirebaseApp.initializeApp(Context) first. -``` - -*Note:* When you are debugging on android, use a device or AVD with Google Play services. -Otherwise you will not be able to authenticate. - -### Use the plugin - -Add the following imports to your Dart code: -```dart -import 'package:firebase_auth/firebase_auth.dart'; -``` - -Initialize `GoogleSignIn` and `FirebaseAuth`: -```dart -final GoogleSignIn _googleSignIn = GoogleSignIn(); -final FirebaseAuth _auth = FirebaseAuth.instance; -``` - -You can now use the Firebase `_auth` to authenticate in your Dart code, e.g. -```dart -Future _handleSignIn() async { - final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); - final GoogleSignInAuthentication googleAuth = await googleUser.authentication; - - final AuthCredential credential = GoogleAuthProvider.getCredential( - accessToken: googleAuth.accessToken, - idToken: googleAuth.idToken, - ); - - final FirebaseUser user = (await _auth.signInWithCredential(credential)).user; - print("signed in " + user.displayName); - return user; -} -``` - -Then from the sign in button onPress, call the `_handleSignIn` method using a future -callback for both the `FirebaseUser` and possible exception. -```dart -_handleSignIn() - .then((FirebaseUser user) => print(user)) - .catchError((e) => print(e)); -``` - -### Register a user - -```dart -final FirebaseUser user = await _auth.createUserWithEmailAndPassword( - email: 'an email', - password: 'a password', - ); -``` - -### Supported Firebase authentication methods - -* Google -* Email and Password -* Phone -* Anonymously -* GitHub -* Facebook -* Twitter - -### Phone Auth - -You can use Firebase Authentication to sign in a user by sending an SMS message to -the user's phone. The user signs in using a one-time code contained in the SMS message. - -### After authentication - -After a successful authentication, you will receive a `FirebaseUser` object. You can use this object to check if the email is verified, to update email, to send verification email and so on. See the [FirebaseUser](https://pub.dartlang.org/documentation/firebase_auth/latest/firebase_auth/FirebaseUser-class.html) API documentation for more details on the `FirebaseUser` object. - - -#### iOS setup - -1. Enable Phone as a Sign-In method in the [Firebase console](https://console.firebase.google.com/u/0/project/_/authentication/providers) - - - When testing you can add test phone numbers and verification codes to the Firebase console. - -1. [Enable App verification](https://firebase.google.com/docs/auth/ios/phone-auth#enable-app-verification) - -**Note:** App verification may use APNs, if using a simulator (where APNs does not work) or APNs is not setup on the -device you are using you must set the `URL Schemes` to the `REVERSE_CLIENT_ID` from the GoogleServices-Info.plist file. - -#### Android setup - -1. Enable Phone as a Sign-In method in the [Firebase console](https://console.firebase.google.com/u/0/project/_/authentication/providers) - - - When testing you can add test phone numbers and verification codes to the Firebase console. - -## Example - -See the [example application](https://github.com/flutter/plugins/tree/master/packages/firebase_auth/example) source -for a complete sample app using the Firebase authentication. - -## Issues and feedback - -Please file [issues](https://github.com/flutter/flutter/issues/new) -to send feedback or report a bug. Thank you! diff --git a/packages/firebase_auth/android/build.gradle b/packages/firebase_auth/android/build.gradle deleted file mode 100755 index 3e1822be799e..000000000000 --- a/packages/firebase_auth/android/build.gradle +++ /dev/null @@ -1,56 +0,0 @@ -def PLUGIN = "firebase_auth"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - - -group 'io.flutter.plugins.firebaseauth' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - implementation 'androidx.annotation:annotation:1.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - api 'com.google.firebase:firebase-auth:17.0.0' - api 'com.google.code.gson:gson:2.8.5' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_auth/android/gradle.properties b/packages/firebase_auth/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_auth/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_auth/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_auth/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/firebase_auth/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_auth/android/settings.gradle b/packages/firebase_auth/android/settings.gradle deleted file mode 100755 index acfe1855910f..000000000000 --- a/packages/firebase_auth/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_auth' diff --git a/packages/firebase_auth/android/src/main/AndroidManifest.xml b/packages/firebase_auth/android/src/main/AndroidManifest.xml deleted file mode 100755 index 2c6eb8c0f06e..000000000000 --- a/packages/firebase_auth/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java deleted file mode 100755 index c135259f22d1..000000000000 --- a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java +++ /dev/null @@ -1,807 +0,0 @@ -// Copyright 2017 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.firebaseauth; - -import android.net.Uri; -import android.util.SparseArray; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApiNotAvailableException; -import com.google.firebase.FirebaseApp; -import com.google.firebase.FirebaseException; -import com.google.firebase.FirebaseNetworkException; -import com.google.firebase.FirebaseTooManyRequestsException; -import com.google.firebase.auth.ActionCodeSettings; -import com.google.firebase.auth.AdditionalUserInfo; -import com.google.firebase.auth.AuthCredential; -import com.google.firebase.auth.AuthResult; -import com.google.firebase.auth.EmailAuthProvider; -import com.google.firebase.auth.FacebookAuthProvider; -import com.google.firebase.auth.FirebaseAuth; -import com.google.firebase.auth.FirebaseAuth.AuthStateListener; -import com.google.firebase.auth.FirebaseAuthException; -import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException; -import com.google.firebase.auth.FirebaseUser; -import com.google.firebase.auth.FirebaseUserMetadata; -import com.google.firebase.auth.GetTokenResult; -import com.google.firebase.auth.GithubAuthProvider; -import com.google.firebase.auth.GoogleAuthProvider; -import com.google.firebase.auth.PhoneAuthCredential; -import com.google.firebase.auth.PhoneAuthProvider; -import com.google.firebase.auth.PhoneAuthProvider.ForceResendingToken; -import com.google.firebase.auth.SignInMethodQueryResult; -import com.google.firebase.auth.TwitterAuthProvider; -import com.google.firebase.auth.UserInfo; -import com.google.firebase.auth.UserProfileChangeRequest; -import com.google.gson.Gson; -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.plugin.common.PluginRegistry; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** Flutter plugin for Firebase Auth. */ -public class FirebaseAuthPlugin implements MethodCallHandler { - private final PluginRegistry.Registrar registrar; - private final SparseArray authStateListeners = new SparseArray<>(); - private final SparseArray forceResendingTokens = new SparseArray<>(); - private final MethodChannel channel; - - // Handles are ints used as indexes into the sparse array of active observers - private int nextHandle = 0; - - public static void registerWith(PluginRegistry.Registrar registrar) { - MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_auth"); - channel.setMethodCallHandler(new FirebaseAuthPlugin(registrar, channel)); - } - - private FirebaseAuthPlugin(PluginRegistry.Registrar registrar, MethodChannel channel) { - this.registrar = registrar; - this.channel = channel; - FirebaseApp.initializeApp(registrar.context()); - } - - private FirebaseAuth getAuth(MethodCall call) { - Map arguments = call.arguments(); - String appName = (String) arguments.get("app"); - FirebaseApp app = FirebaseApp.getInstance(appName); - return FirebaseAuth.getInstance(app); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "currentUser": - handleCurrentUser(call, result, getAuth(call)); - break; - case "signInAnonymously": - handleSignInAnonymously(call, result, getAuth(call)); - break; - case "createUserWithEmailAndPassword": - handleCreateUserWithEmailAndPassword(call, result, getAuth(call)); - break; - case "fetchSignInMethodsForEmail": - handleFetchSignInMethodsForEmail(call, result, getAuth(call)); - break; - case "sendPasswordResetEmail": - handleSendPasswordResetEmail(call, result, getAuth(call)); - break; - case "sendLinkToEmail": - handleSendLinkToEmail(call, result, getAuth(call)); - break; - case "isSignInWithEmailLink": - handleIsSignInWithEmailLink(call, result, getAuth(call)); - break; - case "signInWithEmailAndLink": - handleSignInWithEmailAndLink(call, result, getAuth(call)); - break; - case "sendEmailVerification": - handleSendEmailVerification(call, result, getAuth(call)); - break; - case "reload": - handleReload(call, result, getAuth(call)); - break; - case "delete": - handleDelete(call, result, getAuth(call)); - break; - case "signInWithCredential": - handleSignInWithCredential(call, result, getAuth(call)); - break; - case "signInWithCustomToken": - handleSignInWithCustomToken(call, result, getAuth(call)); - break; - case "signOut": - handleSignOut(call, result, getAuth(call)); - break; - case "getIdToken": - handleGetToken(call, result, getAuth(call)); - break; - case "reauthenticateWithCredential": - handleReauthenticateWithCredential(call, result, getAuth(call)); - break; - case "linkWithCredential": - handleLinkWithCredential(call, result, getAuth(call)); - break; - case "unlinkFromProvider": - handleUnlinkFromProvider(call, result, getAuth(call)); - break; - case "updateEmail": - handleUpdateEmail(call, result, getAuth(call)); - break; - case "updatePhoneNumberCredential": - handleUpdatePhoneNumber(call, result, getAuth(call)); - break; - case "updatePassword": - handleUpdatePassword(call, result, getAuth(call)); - break; - case "updateProfile": - handleUpdateProfile(call, result, getAuth(call)); - break; - case "startListeningAuthState": - handleStartListeningAuthState(call, result, getAuth(call)); - break; - case "stopListeningAuthState": - handleStopListeningAuthState(call, result, getAuth(call)); - break; - case "verifyPhoneNumber": - handleVerifyPhoneNumber(call, result, getAuth(call)); - break; - case "signInWithPhoneNumber": - handleSignInWithPhoneNumber(call, result, getAuth(call)); - break; - case "setLanguageCode": - handleSetLanguageCode(call, result, getAuth(call)); - break; - default: - result.notImplemented(); - break; - } - } - - private void handleSignInWithPhoneNumber( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String verificationId = arguments.get("verificationId"); - String smsCode = arguments.get("smsCode"); - - PhoneAuthCredential phoneAuthCredential = - PhoneAuthProvider.getCredential(verificationId, smsCode); - firebaseAuth - .signInWithCredential(phoneAuthCredential) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleVerifyPhoneNumber( - MethodCall call, Result result, final FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - final int handle = (int) arguments.get("handle"); - String phoneNumber = (String) arguments.get("phoneNumber"); - int timeout = (int) arguments.get("timeout"); - - PhoneAuthProvider.OnVerificationStateChangedCallbacks verificationCallbacks = - new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { - @Override - public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - String parsedJson = new Gson().toJson(phoneAuthCredential); - arguments.put("phoneAuthCredential", parsedJson); - channel.invokeMethod("phoneVerificationCompleted", arguments); - } - - @Override - public void onVerificationFailed(FirebaseException e) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - arguments.put("exception", getVerifyPhoneNumberExceptionMap(e)); - channel.invokeMethod("phoneVerificationFailed", arguments); - } - - @Override - public void onCodeSent( - String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - arguments.put("verificationId", verificationId); - arguments.put("forceResendingToken", forceResendingToken.hashCode()); - channel.invokeMethod("phoneCodeSent", arguments); - } - - @Override - public void onCodeAutoRetrievalTimeOut(String verificationId) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - arguments.put("verificationId", verificationId); - channel.invokeMethod("phoneCodeAutoRetrievalTimeout", arguments); - } - }; - - if (call.argument("forceResendingToken") != null) { - int forceResendingTokenKey = (int) arguments.get("forceResendingToken"); - PhoneAuthProvider.ForceResendingToken forceResendingToken = - forceResendingTokens.get(forceResendingTokenKey); - PhoneAuthProvider.getInstance() - .verifyPhoneNumber( - phoneNumber, - timeout, - TimeUnit.MILLISECONDS, - registrar.activity(), - verificationCallbacks, - forceResendingToken); - } else { - PhoneAuthProvider.getInstance() - .verifyPhoneNumber( - phoneNumber, - timeout, - TimeUnit.MILLISECONDS, - registrar.activity(), - verificationCallbacks); - } - - result.success(null); - } - - private Map getVerifyPhoneNumberExceptionMap(FirebaseException e) { - String errorCode = "verifyPhoneNumberError"; - if (e instanceof FirebaseAuthInvalidCredentialsException) { - errorCode = "invalidCredential"; - } else if (e instanceof FirebaseAuthException) { - errorCode = "firebaseAuth"; - } else if (e instanceof FirebaseTooManyRequestsException) { - errorCode = "quotaExceeded"; - } else if (e instanceof FirebaseApiNotAvailableException) { - errorCode = "apiNotAvailable"; - } - - Map exceptionMap = new HashMap<>(); - exceptionMap.put("code", errorCode); - exceptionMap.put("message", e.getMessage()); - return exceptionMap; - } - - private void handleLinkWithCredential(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - @SuppressWarnings("unchecked") - AuthCredential credential = getCredential((Map) call.arguments); - - currentUser - .linkWithCredential(credential) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleCurrentUser( - @SuppressWarnings("unused") MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - FirebaseUser user = firebaseAuth.getCurrentUser(); - if (user == null) { - result.success(null); - return; - } - Map userMap = mapFromUser(user); - result.success(userMap); - } - - private void handleSignInAnonymously( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - firebaseAuth.signInAnonymously().addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleCreateUserWithEmailAndPassword( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - String password = arguments.get("password"); - - firebaseAuth - .createUserWithEmailAndPassword(email, password) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleFetchSignInMethodsForEmail( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - - firebaseAuth - .fetchSignInMethodsForEmail(email) - .addOnCompleteListener(new GetSignInMethodsCompleteListener(result)); - } - - private void handleSendPasswordResetEmail( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - - firebaseAuth - .sendPasswordResetEmail(email) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleSendLinkToEmail(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email").toString(); - ActionCodeSettings actionCodeSettings = - ActionCodeSettings.newBuilder() - .setUrl(arguments.get("url").toString()) - .setHandleCodeInApp((Boolean) arguments.get("handleCodeInApp")) - .setIOSBundleId(arguments.get("iOSBundleID").toString()) - .setAndroidPackageName( - arguments.get("androidPackageName").toString(), - (Boolean) arguments.get("androidInstallIfNotAvailable"), - arguments.get("androidMinimumVersion").toString()) - .build(); - - firebaseAuth - .sendSignInLinkToEmail(email, actionCodeSettings) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleIsSignInWithEmailLink( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String link = arguments.get("link"); - Boolean isSignInWithEmailLink = firebaseAuth.isSignInWithEmailLink(link); - result.success(isSignInWithEmailLink); - } - - private void handleSignInWithEmailAndLink( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - String link = arguments.get("link"); - firebaseAuth - .signInWithEmailLink(email, link) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleSendEmailVerification( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - currentUser.sendEmailVerification().addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleReload( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - currentUser.reload().addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleDelete( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - currentUser.delete().addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private AuthCredential getCredential(Map arguments) { - AuthCredential credential; - - @SuppressWarnings("unchecked") - Map data = (Map) arguments.get("data"); - - switch ((String) arguments.get("provider")) { - case EmailAuthProvider.PROVIDER_ID: - { - String email = data.get("email"); - if (data.containsKey("password")) { - String password = data.get("password"); - credential = EmailAuthProvider.getCredential(email, password); - } else { - String link = data.get("link"); - credential = EmailAuthProvider.getCredentialWithLink(email, link); - } - break; - } - case GoogleAuthProvider.PROVIDER_ID: - { - String idToken = data.get("idToken"); - String accessToken = data.get("accessToken"); - credential = GoogleAuthProvider.getCredential(idToken, accessToken); - break; - } - case FacebookAuthProvider.PROVIDER_ID: - { - String accessToken = data.get("accessToken"); - credential = FacebookAuthProvider.getCredential(accessToken); - break; - } - case TwitterAuthProvider.PROVIDER_ID: - { - String authToken = data.get("authToken"); - String authTokenSecret = data.get("authTokenSecret"); - credential = TwitterAuthProvider.getCredential(authToken, authTokenSecret); - break; - } - case GithubAuthProvider.PROVIDER_ID: - { - String token = data.get("token"); - credential = GithubAuthProvider.getCredential(token); - break; - } - case PhoneAuthProvider.PROVIDER_ID: - { - if (data.containsKey("verificationId")) { - String accessToken = data.get("verificationId"); - String smsCode = data.get("smsCode"); - credential = PhoneAuthProvider.getCredential(accessToken, smsCode); - } else { - credential = new Gson().fromJson(data.get("jsonObject"), PhoneAuthCredential.class); - } - break; - } - default: - { - credential = null; - break; - } - } - return credential; - } - - private void handleSignInWithCredential( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - - @SuppressWarnings("unchecked") - AuthCredential credential = getCredential((Map) call.arguments()); - - firebaseAuth - .signInWithCredential(credential) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleReauthenticateWithCredential( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - @SuppressWarnings("unchecked") - AuthCredential credential = getCredential((Map) call.arguments()); - - currentUser - .reauthenticate(credential) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleUnlinkFromProvider(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - final String provider = arguments.get("provider"); - - currentUser.unlink(provider).addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleSignInWithCustomToken( - MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String token = arguments.get("token"); - - firebaseAuth - .signInWithCustomToken(token) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleSignOut( - @SuppressWarnings("unused") MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - firebaseAuth.signOut(); - result.success(null); - } - - private void handleGetToken(MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - final boolean refresh = arguments.get("refresh"); - - currentUser - .getIdToken(refresh) - .addOnCompleteListener( - new OnCompleteListener() { - public void onComplete(@NonNull Task task) { - if (task.isSuccessful() && task.getResult() != null) { - final Map map = new HashMap<>(); - map.put("token", task.getResult().getToken()); - map.put("expirationTimestamp", task.getResult().getExpirationTimestamp()); - map.put("authTimestamp", task.getResult().getAuthTimestamp()); - map.put("issuedAtTimestamp", task.getResult().getIssuedAtTimestamp()); - map.put("claims", task.getResult().getClaims()); - - if (task.getResult().getSignInProvider() != null) { - map.put("signInProvider", task.getResult().getSignInProvider()); - } - - result.success(Collections.unmodifiableMap(map)); - } else { - reportException(result, task.getException()); - } - } - }); - } - - private void handleUpdateEmail(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - final String email = arguments.get("email"); - - currentUser.updateEmail(email).addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleUpdatePhoneNumber(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - @SuppressWarnings("unchecked") - AuthCredential credential = getCredential((Map) call.arguments); - - firebaseAuth - .getCurrentUser() - .updatePhoneNumber((PhoneAuthCredential) credential) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleUpdatePassword(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - final String password = arguments.get("password"); - - currentUser - .updatePassword(password) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleUpdateProfile(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - - UserProfileChangeRequest.Builder builder = new UserProfileChangeRequest.Builder(); - if (arguments.containsKey("displayName")) { - builder.setDisplayName(arguments.get("displayName")); - } - if (arguments.containsKey("photoUrl")) { - builder.setPhotoUri(Uri.parse(arguments.get("photoUrl"))); - } - - currentUser - .updateProfile(builder.build()) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleStartListeningAuthState( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final int handle = nextHandle++; - FirebaseAuth.AuthStateListener listener = - new FirebaseAuth.AuthStateListener() { - @Override - public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { - FirebaseUser user = firebaseAuth.getCurrentUser(); - Map userMap = mapFromUser(user); - Map map = new HashMap<>(); - map.put("id", handle); - if (userMap != null) { - map.put("user", userMap); - } - channel.invokeMethod("onAuthStateChanged", Collections.unmodifiableMap(map)); - } - }; - firebaseAuth.addAuthStateListener(listener); - authStateListeners.append(handle, listener); - result.success(handle); - } - - private void handleStopListeningAuthState( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - Integer id = arguments.get("id"); - - FirebaseAuth.AuthStateListener listener = authStateListeners.get(id); - if (listener != null) { - firebaseAuth.removeAuthStateListener(listener); - authStateListeners.remove(id); - result.success(null); - } else { - reportException( - result, - new FirebaseAuthException( - "ERROR_LISTENER_NOT_FOUND", - String.format(Locale.US, "Listener with identifier '%d' not found.", id))); - } - } - - private void handleSetLanguageCode(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String language = arguments.get("language"); - - firebaseAuth.setLanguageCode(language); - result.success(null); - } - - private class SignInCompleteListener implements OnCompleteListener { - private final Result result; - - SignInCompleteListener(Result result) { - this.result = result; - } - - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful() || task.getResult() == null) { - reportException(result, task.getException()); - } else { - AuthResult authResult = task.getResult(); - FirebaseUser user = authResult.getUser(); - AdditionalUserInfo additionalUserInfo = authResult.getAdditionalUserInfo(); - Map userMap = (mapFromUser(user)); - Map additionalUserInfoMap = mapFromAdditionalUserInfo(additionalUserInfo); - Map map = new HashMap<>(); - map.put("user", userMap); - map.put("additionalUserInfo", additionalUserInfoMap); - result.success(Collections.unmodifiableMap(map)); - } - } - } - - private class TaskVoidCompleteListener implements OnCompleteListener { - private final Result result; - - TaskVoidCompleteListener(Result result) { - this.result = result; - } - - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - reportException(result, task.getException()); - } else { - result.success(null); - } - } - } - - private class GetSignInMethodsCompleteListener - implements OnCompleteListener { - private final Result result; - - GetSignInMethodsCompleteListener(Result result) { - this.result = result; - } - - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful() || task.getResult() == null) { - reportException(result, task.getException()); - } else { - List providers = task.getResult().getSignInMethods(); - result.success(providers); - } - } - } - - private Map userInfoToMap(UserInfo userInfo) { - Map map = new HashMap<>(); - map.put("providerId", userInfo.getProviderId()); - map.put("uid", userInfo.getUid()); - if (userInfo.getDisplayName() != null) { - map.put("displayName", userInfo.getDisplayName()); - } - if (userInfo.getPhotoUrl() != null) { - map.put("photoUrl", userInfo.getPhotoUrl().toString()); - } - if (userInfo.getEmail() != null) { - map.put("email", userInfo.getEmail()); - } - if (userInfo.getPhoneNumber() != null) { - map.put("phoneNumber", userInfo.getPhoneNumber()); - } - return map; - } - - private Map mapFromUser(FirebaseUser user) { - if (user != null) { - List> providerData = new ArrayList<>(); - for (UserInfo userInfo : user.getProviderData()) { - providerData.add(Collections.unmodifiableMap(userInfoToMap(userInfo))); - } - Map userMap = userInfoToMap(user); - final FirebaseUserMetadata metadata = user.getMetadata(); - if (metadata != null) { - userMap.put("creationTimestamp", metadata.getCreationTimestamp()); - userMap.put("lastSignInTimestamp", metadata.getLastSignInTimestamp()); - } - userMap.put("isAnonymous", user.isAnonymous()); - userMap.put("isEmailVerified", user.isEmailVerified()); - userMap.put("providerData", Collections.unmodifiableList(providerData)); - return Collections.unmodifiableMap(userMap); - } else { - return null; - } - } - - private Map mapFromAdditionalUserInfo(AdditionalUserInfo info) { - if (info != null) { - Map additionalUserInfoMap = new HashMap<>(); - additionalUserInfoMap.put("profile", info.getProfile()); - additionalUserInfoMap.put("providerId", info.getProviderId()); - additionalUserInfoMap.put("username", info.getUsername()); - additionalUserInfoMap.put("isNewUser", info.isNewUser()); - return Collections.unmodifiableMap(additionalUserInfoMap); - } else { - return null; - } - } - - private void markUserRequired(Result result) { - result.error("USER_REQUIRED", "Please authenticate with Firebase first", null); - } - - private void reportException(Result result, @Nullable Exception exception) { - if (exception != null) { - if (exception instanceof FirebaseAuthException) { - final FirebaseAuthException authException = (FirebaseAuthException) exception; - result.error(authException.getErrorCode(), exception.getMessage(), null); - } else if (exception instanceof FirebaseApiNotAvailableException) { - result.error("ERROR_API_NOT_AVAILABLE", exception.getMessage(), null); - } else if (exception instanceof FirebaseTooManyRequestsException) { - result.error("ERROR_TOO_MANY_REQUESTS", exception.getMessage(), null); - } else if (exception instanceof FirebaseNetworkException) { - result.error("ERROR_NETWORK_REQUEST_FAILED", exception.getMessage(), null); - } else { - result.error(exception.getClass().getSimpleName(), exception.getMessage(), null); - } - } else { - result.error("ERROR_UNKNOWN", "An unknown error occurred.", null); - } - } -} diff --git a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index cfe7c7386d3f..000000000000 --- a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebaseauth; - -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; - -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_auth/android/user-agent.gradle b/packages/firebase_auth/android/user-agent.gradle deleted file mode 100644 index 38e5e6469fa5..000000000000 --- a/packages/firebase_auth/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-auth" -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_auth/example/README.md b/packages/firebase_auth/example/README.md deleted file mode 100755 index 0b475d086369..000000000000 --- a/packages/firebase_auth/example/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# firebase_auth_example - -[![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dartlang.org/packages/firebase_auth) - -Demonstrates how to use the firebase_auth plugin. - -## Phone Auth - -1. Enable phone authentication in the [Firebase console]((https://console.firebase.google.com/u/0/project/_/authentication/providers)). -1. Add test phone number and verification code to the Firebase console. - - For this sample the number `+1 408-555-6969` and verification code `888888` are used. -1. For iOS set the `URL Schemes` to the `REVERSE_CLIENT_ID` from the `GoogleServices-Info.plist` file. -1. Click the `Test verifyPhoneNumber` button. - - If APNs is not enabled or a simulator is being used, verification - will be done via a Captcha. -1. Once the phone number is verified the app displays the test - verification code. -1. Click the `Test signInWithPhoneNumber` button. -1. Signed in user's details are displayed in the UI. - - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_auth/example/android.iml b/packages/firebase_auth/example/android.iml deleted file mode 100755 index 462b903e05b6..000000000000 --- a/packages/firebase_auth/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_auth/example/android/app/build.gradle b/packages/firebase_auth/example/android/app/build.gradle deleted file mode 100755 index 295870863a51..000000000000 --- a/packages/firebase_auth/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "dev.flutter.plugins.firebaseauthexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_auth/example/android/app/google-services.json b/packages/firebase_auth/example/android/app/google-services.json deleted file mode 100644 index 238110fbb63e..000000000000 --- a/packages/firebase_auth/example/android/app/google-services.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "project_info": { - "project_number": "159623150305", - "firebase_url": "https://flutter-firebase-plugins.firebaseio.com", - "project_id": "flutter-firebase-plugins", - "storage_bucket": "flutter-firebase-plugins.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:2e167f427b396288", - "android_client_info": { - "package_name": "dev.flutter.plugins.firebaseauthexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebaseAuthExample" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:236f9daea101f77e", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebaseAuthExample" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:11e8f037a4a3ec3b", - "android_client_info": { - "package_name": "io.flutter.plugins.firebaseauthexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-6cf91dro1kro30hdlfp3rkod8mldc81c.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseauthexample", - "certificate_hash": "4ef1514a34a8edf0f5b3ff7108d3497fa3449f69" - } - }, - { - "client_id": "159623150305-pjkkv9ff9tgkmjs7kjalsqv2pp6ltj04.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseauthexample", - "certificate_hash": "9ee6a0388f780cf93a852248905d2d3d83d8e50d" - } - }, - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebaseAuthExample" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:c68d3ad04a4046db", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasedatabaseexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-j5cqghi5snpqptesd2mdjum7o35hiltb.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebasedatabaseexample", - "certificate_hash": "9ee6a0388f780cf93a852248905d2d3d83d8e50d" - } - }, - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebaseAuthExample" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:620f0e4ca16cbddd", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasemessagingexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-qubsrfqbnrp4vurajv72eujgk164nin0.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebasemessagingexample", - "certificate_hash": "f8323ac5fe6e7adc1ddc5612e16b5d04d7f1358b" - } - }, - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebaseAuthExample" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:ef48439a0cc0263d", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasestorageexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebaseAuthExample" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:5e9f1f89e134dc86", - "android_client_info": { - "package_name": "io.flutter.plugins.googlesigninexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-3suu3qq4vs3ki7uaigbtrh2aal1p9ram.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.googlesigninexample", - "certificate_hash": "f8323ac5fe6e7adc1ddc5612e16b5d04d7f1358b" - } - }, - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebaseAuthExample" - } - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_auth/example/android/app/gradle.properties b/packages/firebase_auth/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_auth/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_auth/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_auth/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_auth/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_auth/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_auth/example/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index f9ae68ab9d7a..000000000000 --- a/packages/firebase_auth/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/.gitignore b/packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/.gitignore deleted file mode 100755 index 9eb4563d2ae1..000000000000 --- a/packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/.gitignore +++ /dev/null @@ -1 +0,0 @@ -GeneratedPluginRegistrant.java diff --git a/packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/firebaseauthexample/MainActivity.java b/packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/firebaseauthexample/MainActivity.java deleted file mode 100644 index 7bc03239e243..000000000000 --- a/packages/firebase_auth/example/android/app/src/main/java/io/flutter/plugins/firebaseauthexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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.firebaseauthexample; - -import android.os.Bundle; -import io.flutter.app.FlutterFragmentActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterFragmentActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_auth/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_auth/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100755 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_auth/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_auth/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100755 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_auth/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_auth/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100755 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_auth/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_auth/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100755 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_auth/example/android/build.gradle b/packages/firebase_auth/example/android/build.gradle deleted file mode 100755 index 47c36fc2c29c..000000000000 --- a/packages/firebase_auth/example/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_auth/example/android/gradle.properties b/packages/firebase_auth/example/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_auth/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_auth/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_auth/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/firebase_auth/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_auth/example/android/settings.gradle b/packages/firebase_auth/example/android/settings.gradle deleted file mode 100755 index 115da6cb4f4d..000000000000 --- a/packages/firebase_auth/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_auth/example/firebase_auth_example.iml b/packages/firebase_auth/example/firebase_auth_example.iml deleted file mode 100755 index 1ae40a0f7f54..000000000000 --- a/packages/firebase_auth/example/firebase_auth_example.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_auth/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_auth/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 6c2de8086bcd..000000000000 --- a/packages/firebase_auth/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_auth/example/ios/Flutter/Debug.xcconfig b/packages/firebase_auth/example/ios/Flutter/Debug.xcconfig deleted file mode 100755 index 9803018ca79d..000000000000 --- a/packages/firebase_auth/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/packages/firebase_auth/example/ios/Flutter/Release.xcconfig b/packages/firebase_auth/example/ios/Flutter/Release.xcconfig deleted file mode 100755 index a4a8c604e13d..000000000000 --- a/packages/firebase_auth/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/packages/firebase_auth/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_auth/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index c143be24864c..000000000000 --- a/packages/firebase_auth/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,502 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 0690AA46E879ED4CF7B7AEB4 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A6A0D603F1BEC33B95572EC3 /* libPods-Runner.a */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C97AA501EC3F2C300D441D1 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C97AA4F1EC3F2C300D441D1 /* GeneratedPluginRegistrant.m */; }; - 7ABDE8F71EA727FA0074FEFB /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7ABDE8F61EA727FA0074FEFB /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5C97AA4E1EC3F2C300D441D1 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C97AA4F1EC3F2C300D441D1 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 7ABDE8F61EA727FA0074FEFB /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - A6A0D603F1BEC33B95572EC3 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 0690AA46E879ED4CF7B7AEB4 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C97AA4E1EC3F2C300D441D1 /* GeneratedPluginRegistrant.h */, - 5C97AA4F1EC3F2C300D441D1 /* GeneratedPluginRegistrant.m */, - 7ABDE8F61EA727FA0074FEFB /* GoogleService-Info.plist */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - A6A0D603F1BEC33B95572EC3 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */, - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */, - 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 = ( - 7ABDE8F71EA727FA0074FEFB /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; - }; - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", - "${PODS_ROOT}/GTMOAuth2/Source/Touch/GTMOAuth2ViewTouch.xib", - "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GTMOAuth2ViewTouch.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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 */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C97AA501EC3F2C300D441D1 /* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseAuthExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseAuthExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_auth/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_auth/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_auth/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index 1c9580788197..000000000000 --- a/packages/firebase_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_auth/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_auth/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_auth/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_auth/example/ios/Runner.xcworkspace/xcshareddata/Runner.xcscmblueprint b/packages/firebase_auth/example/ios/Runner.xcworkspace/xcshareddata/Runner.xcscmblueprint deleted file mode 100644 index e3e216215014..000000000000 --- a/packages/firebase_auth/example/ios/Runner.xcworkspace/xcshareddata/Runner.xcscmblueprint +++ /dev/null @@ -1,30 +0,0 @@ -{ - "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "98A3C30ABC97D592882929FAF5EFB935A32282D9", - "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { - - }, - "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { - "B9BC852104FA5F3F91D8B12EB80D37232CB3B40D" : 9223372036854775807, - "98A3C30ABC97D592882929FAF5EFB935A32282D9" : 9223372036854775807 - }, - "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "C0DA2E9A-1048-43E4-8878-41C685CFFA88", - "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { - "B9BC852104FA5F3F91D8B12EB80D37232CB3B40D" : "flutter\/", - "98A3C30ABC97D592882929FAF5EFB935A32282D9" : "plugins\/" - }, - "DVTSourceControlWorkspaceBlueprintNameKey" : "Runner", - "DVTSourceControlWorkspaceBlueprintVersion" : 204, - "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "packages\/firebase_auth\/example\/ios\/Runner.xcworkspace", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ - { - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:flutter\/plugins", - "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "98A3C30ABC97D592882929FAF5EFB935A32282D9" - }, - { - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:flutter\/flutter", - "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "B9BC852104FA5F3F91D8B12EB80D37232CB3B40D" - } - ] -} \ No newline at end of file diff --git a/packages/firebase_auth/example/ios/Runner/AppDelegate.h b/packages/firebase_auth/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e990f2e..000000000000 --- a/packages/firebase_auth/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_auth/example/ios/Runner/AppDelegate.m b/packages/firebase_auth/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c88eb60..000000000000 --- a/packages/firebase_auth/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 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. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index d22f10b2ab63..000000000000 --- a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100755 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100755 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100755 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100755 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100755 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_auth/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100755 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_auth/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_auth/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index f3c28516fb38..000000000000 --- a/packages/firebase_auth/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_auth/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_auth/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 2f48146fd821..000000000000 --- a/packages/firebase_auth/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - CLIENT_ID - 159623150305-h67j0o93bcctblfhde74r7fssmcobamr.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.159623150305-h67j0o93bcctblfhde74r7fssmcobamr - ANDROID_CLIENT_ID - 159623150305-j5cqghi5snpqptesd2mdjum7o35hiltb.apps.googleusercontent.com - API_KEY - AIzaSyDyzecVw1zXTpBKwfFHxpl7QyYBhimNhUk - GCM_SENDER_ID - 159623150305 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebaseAuthExample - PROJECT_ID - flutter-firebase-plugins - STORAGE_BUCKET - flutter-firebase-plugins.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:159623150305:ios:8d89e1b69d780386 - DATABASE_URL - https://flutter-firebase-plugins.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_auth/example/ios/Runner/Info.plist b/packages/firebase_auth/example/ios/Runner/Info.plist deleted file mode 100755 index dd78ab74aa6c..000000000000 --- a/packages/firebase_auth/example/ios/Runner/Info.plist +++ /dev/null @@ -1,63 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_auth_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - - com.googleusercontent.apps.466218294969-5mdmh6opkqd87a5m81nm83u4eqd3bvgk - - - - - - diff --git a/packages/firebase_auth/example/ios/Runner/main.m b/packages/firebase_auth/example/ios/Runner/main.m deleted file mode 100644 index bec320c0bee0..000000000000 --- a/packages/firebase_auth/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/firebase_auth/example/lib/main.dart b/packages/firebase_auth/example/lib/main.dart deleted file mode 100755 index f3eeb38cab6a..000000000000 --- a/packages/firebase_auth/example/lib/main.dart +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2017 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:flutter/material.dart'; -import 'package:firebase_auth/firebase_auth.dart'; -import './register_page.dart'; -import './signin_page.dart'; - -void main() { - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Firebase Auth Demo', - home: MyHomePage(title: 'Firebase Auth Demo'), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - FirebaseUser user; - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: RaisedButton( - child: const Text('Test registration'), - onPressed: () => _pushPage(context, RegisterPage()), - ), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - Container( - child: RaisedButton( - child: const Text('Test SignIn/SignOut'), - onPressed: () => _pushPage(context, SignInPage()), - ), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - ], - ), - ); - } - - void _pushPage(BuildContext context, Widget page) { - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => page), - ); - } -} diff --git a/packages/firebase_auth/example/lib/register_page.dart b/packages/firebase_auth/example/lib/register_page.dart deleted file mode 100644 index 44c6be36cab6..000000000000 --- a/packages/firebase_auth/example/lib/register_page.dart +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; -import 'package:firebase_auth/firebase_auth.dart'; - -final FirebaseAuth _auth = FirebaseAuth.instance; - -class RegisterPage extends StatefulWidget { - final String title = 'Registration'; - @override - State createState() => RegisterPageState(); -} - -class RegisterPageState extends State { - final GlobalKey _formKey = GlobalKey(); - final TextEditingController _emailController = TextEditingController(); - final TextEditingController _passwordController = TextEditingController(); - bool _success; - String _userEmail; - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Form( - key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextFormField( - controller: _emailController, - decoration: InputDecoration(labelText: 'Email'), - validator: (String value) { - if (value.isEmpty) { - return 'Please enter some text'; - } - return null; - }, - ), - TextFormField( - controller: _passwordController, - decoration: InputDecoration(labelText: 'Password'), - validator: (String value) { - if (value.isEmpty) { - return 'Please enter some text'; - } - return null; - }, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - if (_formKey.currentState.validate()) { - _register(); - } - }, - child: const Text('Submit'), - ), - ), - Container( - alignment: Alignment.center, - child: Text(_success == null - ? '' - : (_success - ? 'Successfully registered ' + _userEmail - : 'Registration failed')), - ) - ], - ), - ), - ); - } - - @override - void dispose() { - // Clean up the controller when the Widget is disposed - _emailController.dispose(); - _passwordController.dispose(); - super.dispose(); - } - - // Example code for registration. - void _register() async { - final FirebaseUser user = (await _auth.createUserWithEmailAndPassword( - email: _emailController.text, - password: _passwordController.text, - )) - .user; - if (user != null) { - setState(() { - _success = true; - _userEmail = user.email; - }); - } else { - _success = false; - } - } -} diff --git a/packages/firebase_auth/example/lib/signin_page.dart b/packages/firebase_auth/example/lib/signin_page.dart deleted file mode 100644 index 34d47f05f291..000000000000 --- a/packages/firebase_auth/example/lib/signin_page.dart +++ /dev/null @@ -1,772 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:io'; -import 'package:flutter/material.dart'; -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:google_sign_in/google_sign_in.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; - -final FirebaseAuth _auth = FirebaseAuth.instance; -final GoogleSignIn _googleSignIn = GoogleSignIn(); - -class SignInPage extends StatefulWidget { - final String title = 'Registration'; - @override - State createState() => SignInPageState(); -} - -class SignInPageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - actions: [ - Builder(builder: (BuildContext context) { - return FlatButton( - child: const Text('Sign out'), - textColor: Theme.of(context).buttonColor, - onPressed: () async { - final FirebaseUser user = await _auth.currentUser(); - if (user == null) { - Scaffold.of(context).showSnackBar(SnackBar( - content: const Text('No one has signed in.'), - )); - return; - } - _signOut(); - final String uid = user.uid; - Scaffold.of(context).showSnackBar(SnackBar( - content: Text(uid + ' has successfully signed out.'), - )); - }, - ); - }) - ], - ), - body: Builder(builder: (BuildContext context) { - return ListView( - scrollDirection: Axis.vertical, - children: [ - _EmailPasswordForm(), - _EmailLinkSignInSection(), - _AnonymouslySignInSection(), - _GoogleSignInSection(), - _PhoneSignInSection(Scaffold.of(context)), - _OtherProvidersSignInSection(), - ], - ); - }), - ); - } - - // Example code for sign out. - void _signOut() async { - await _auth.signOut(); - } -} - -class _EmailPasswordForm extends StatefulWidget { - @override - State createState() => _EmailPasswordFormState(); -} - -class _EmailPasswordFormState extends State<_EmailPasswordForm> { - final GlobalKey _formKey = GlobalKey(); - final TextEditingController _emailController = TextEditingController(); - final TextEditingController _passwordController = TextEditingController(); - bool _success; - String _userEmail; - @override - Widget build(BuildContext context) { - return Form( - key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: const Text('Test sign in with email and password'), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - TextFormField( - controller: _emailController, - decoration: InputDecoration(labelText: 'Email'), - validator: (String value) { - if (value.isEmpty) { - return 'Please enter some text'; - } - return null; - }, - ), - TextFormField( - controller: _passwordController, - decoration: InputDecoration(labelText: 'Password'), - validator: (String value) { - if (value.isEmpty) { - return 'Please enter some text'; - } - return null; - }, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - if (_formKey.currentState.validate()) { - _signInWithEmailAndPassword(); - } - }, - child: const Text('Submit'), - ), - ), - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Text( - _success == null - ? '' - : (_success - ? 'Successfully signed in ' + _userEmail - : 'Sign in failed'), - style: TextStyle(color: Colors.red), - ), - ) - ], - ), - ); - } - - @override - void dispose() { - _emailController.dispose(); - _passwordController.dispose(); - super.dispose(); - } - - // Example code of how to sign in with email and password. - void _signInWithEmailAndPassword() async { - final FirebaseUser user = (await _auth.signInWithEmailAndPassword( - email: _emailController.text, - password: _passwordController.text, - )) - .user; - if (user != null) { - setState(() { - _success = true; - _userEmail = user.email; - }); - } else { - _success = false; - } - } -} - -class _EmailLinkSignInSection extends StatefulWidget { - @override - State createState() => _EmailLinkSignInSectionState(); -} - -class _EmailLinkSignInSectionState extends State<_EmailLinkSignInSection> - with WidgetsBindingObserver { - final GlobalKey _formKey = GlobalKey(); - final TextEditingController _emailController = TextEditingController(); - - bool _success; - String _userEmail; - String _userID; - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addObserver(this); - } - - @override - void dispose() { - _emailController.dispose(); - WidgetsBinding.instance.removeObserver(this); - super.dispose(); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState state) async { - if (state == AppLifecycleState.resumed) { - final Uri link = await _retrieveDynamicLink(); - - if (link != null) { - final FirebaseUser user = (await _auth.signInWithEmailAndLink( - email: _userEmail, - link: link.toString(), - )) - .user; - - if (user != null) { - _userID = user.uid; - _success = true; - } else { - _success = false; - } - } else { - _success = false; - } - - setState(() {}); - } - } - - Future _retrieveDynamicLink() async { - final PendingDynamicLinkData data = - await FirebaseDynamicLinks.instance.retrieveDynamicLink(); - return data?.link; - } - - @override - Widget build(BuildContext context) { - return Form( - key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: const Text('Test sign in with email and link'), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - TextFormField( - controller: _emailController, - decoration: InputDecoration(labelText: 'Email'), - validator: (String value) { - if (value.isEmpty) { - return 'Please enter your email.'; - } - return null; - }, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - if (_formKey.currentState.validate()) { - _signInWithEmailAndLink(); - } - }, - child: const Text('Submit'), - ), - ), - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Text( - _success == null - ? '' - : (_success - ? 'Successfully signed in, uid: ' + _userID - : 'Sign in failed'), - style: TextStyle(color: Colors.red), - ), - ) - ], - ), - ); - } - - Future _signInWithEmailAndLink() async { - _userEmail = _emailController.text; - - return await _auth.sendSignInWithEmailLink( - email: _userEmail, - url: '', - handleCodeInApp: true, - iOSBundleID: 'io.flutter.plugins.firebaseAuthExample', - androidPackageName: 'io.flutter.plugins.firebaseauthexample', - androidInstallIfNotAvailable: true, - androidMinimumVersion: "1", - ); - } -} - -class _AnonymouslySignInSection extends StatefulWidget { - @override - State createState() => _AnonymouslySignInSectionState(); -} - -class _AnonymouslySignInSectionState extends State<_AnonymouslySignInSection> { - bool _success; - String _userID; - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: const Text('Test sign in anonymously'), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - _signInAnonymously(); - }, - child: const Text('Sign in anonymously'), - ), - ), - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Text( - _success == null - ? '' - : (_success - ? 'Successfully signed in, uid: ' + _userID - : 'Sign in failed'), - style: TextStyle(color: Colors.red), - ), - ) - ], - ); - } - - // Example code of how to sign in anonymously. - void _signInAnonymously() async { - final FirebaseUser user = (await _auth.signInAnonymously()).user; - assert(user != null); - assert(user.isAnonymous); - assert(!user.isEmailVerified); - assert(await user.getIdToken() != null); - if (Platform.isIOS) { - // Anonymous auth doesn't show up as a provider on iOS - assert(user.providerData.isEmpty); - } else if (Platform.isAndroid) { - // Anonymous auth does show up as a provider on Android - assert(user.providerData.length == 1); - assert(user.providerData[0].providerId == 'firebase'); - assert(user.providerData[0].uid != null); - assert(user.providerData[0].displayName == null); - assert(user.providerData[0].photoUrl == null); - assert(user.providerData[0].email == null); - } - - final FirebaseUser currentUser = await _auth.currentUser(); - assert(user.uid == currentUser.uid); - setState(() { - if (user != null) { - _success = true; - _userID = user.uid; - } else { - _success = false; - } - }); - } -} - -class _GoogleSignInSection extends StatefulWidget { - @override - State createState() => _GoogleSignInSectionState(); -} - -class _GoogleSignInSectionState extends State<_GoogleSignInSection> { - bool _success; - String _userID; - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - child: const Text('Test sign in with Google'), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - _signInWithGoogle(); - }, - child: const Text('Sign in with Google'), - ), - ), - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Text( - _success == null - ? '' - : (_success - ? 'Successfully signed in, uid: ' + _userID - : 'Sign in failed'), - style: TextStyle(color: Colors.red), - ), - ) - ], - ); - } - - // Example code of how to sign in with google. - void _signInWithGoogle() async { - final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); - final GoogleSignInAuthentication googleAuth = - await googleUser.authentication; - final AuthCredential credential = GoogleAuthProvider.getCredential( - accessToken: googleAuth.accessToken, - idToken: googleAuth.idToken, - ); - final FirebaseUser user = - (await _auth.signInWithCredential(credential)).user; - assert(user.email != null); - assert(user.displayName != null); - assert(!user.isAnonymous); - assert(await user.getIdToken() != null); - - final FirebaseUser currentUser = await _auth.currentUser(); - assert(user.uid == currentUser.uid); - setState(() { - if (user != null) { - _success = true; - _userID = user.uid; - } else { - _success = false; - } - }); - } -} - -class _PhoneSignInSection extends StatefulWidget { - _PhoneSignInSection(this._scaffold); - - final ScaffoldState _scaffold; - @override - State createState() => _PhoneSignInSectionState(); -} - -class _PhoneSignInSectionState extends State<_PhoneSignInSection> { - final TextEditingController _phoneNumberController = TextEditingController(); - final TextEditingController _smsController = TextEditingController(); - - String _message = ''; - String _verificationId; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: const Text('Test sign in with phone number'), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - TextFormField( - controller: _phoneNumberController, - decoration: - InputDecoration(labelText: 'Phone number (+x xxx-xxx-xxxx)'), - validator: (String value) { - if (value.isEmpty) { - return 'Phone number (+x xxx-xxx-xxxx)'; - } - return null; - }, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - _verifyPhoneNumber(); - }, - child: const Text('Verify phone number'), - ), - ), - TextField( - controller: _smsController, - decoration: InputDecoration(labelText: 'Verification code'), - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - _signInWithPhoneNumber(); - }, - child: const Text('Sign in with phone number'), - ), - ), - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Text( - _message, - style: TextStyle(color: Colors.red), - ), - ) - ], - ); - } - - // Example code of how to verify phone number - void _verifyPhoneNumber() async { - setState(() { - _message = ''; - }); - final PhoneVerificationCompleted verificationCompleted = - (AuthCredential phoneAuthCredential) { - _auth.signInWithCredential(phoneAuthCredential); - setState(() { - _message = 'Received phone auth credential: $phoneAuthCredential'; - }); - }; - - final PhoneVerificationFailed verificationFailed = - (AuthException authException) { - setState(() { - _message = - 'Phone number verification failed. Code: ${authException.code}. Message: ${authException.message}'; - }); - }; - - final PhoneCodeSent codeSent = - (String verificationId, [int forceResendingToken]) async { - widget._scaffold.showSnackBar(SnackBar( - content: - const Text('Please check your phone for the verification code.'), - )); - _verificationId = verificationId; - }; - - final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = - (String verificationId) { - _verificationId = verificationId; - }; - - await _auth.verifyPhoneNumber( - phoneNumber: _phoneNumberController.text, - timeout: const Duration(seconds: 5), - verificationCompleted: verificationCompleted, - verificationFailed: verificationFailed, - codeSent: codeSent, - codeAutoRetrievalTimeout: codeAutoRetrievalTimeout); - } - - // Example code of how to sign in with phone. - void _signInWithPhoneNumber() async { - final AuthCredential credential = PhoneAuthProvider.getCredential( - verificationId: _verificationId, - smsCode: _smsController.text, - ); - final FirebaseUser user = - (await _auth.signInWithCredential(credential)).user; - final FirebaseUser currentUser = await _auth.currentUser(); - assert(user.uid == currentUser.uid); - setState(() { - if (user != null) { - _message = 'Successfully signed in, uid: ' + user.uid; - } else { - _message = 'Sign in failed'; - } - }); - } -} - -class _OtherProvidersSignInSection extends StatefulWidget { - _OtherProvidersSignInSection(); - - @override - State createState() => _OtherProvidersSignInSectionState(); -} - -class _OtherProvidersSignInSectionState - extends State<_OtherProvidersSignInSection> { - final TextEditingController _tokenController = TextEditingController(); - final TextEditingController _tokenSecretController = TextEditingController(); - - String _message = ''; - int _selection = 0; - bool _showAuthSecretTextField = false; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: const Text( - 'Test other providers authentication. (We do not provide an API to obtain the token for below providers. Please use a third party service to obtain token for below providers.)'), - padding: const EdgeInsets.all(16), - alignment: Alignment.center, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Radio( - value: 0, - groupValue: _selection, - onChanged: _handleRadioButtonSelected, - ), - Text( - 'Github', - style: TextStyle(fontSize: 16.0), - ), - Radio( - value: 1, - groupValue: _selection, - onChanged: _handleRadioButtonSelected, - ), - Text( - 'Facebook', - style: TextStyle( - fontSize: 16.0, - ), - ), - Radio( - value: 2, - groupValue: _selection, - onChanged: _handleRadioButtonSelected, - ), - Text( - 'Twitter', - style: TextStyle(fontSize: 16.0), - ), - ], - ), - ), - TextField( - controller: _tokenController, - decoration: InputDecoration(labelText: 'Enter provider\'s token'), - ), - Container( - child: _showAuthSecretTextField - ? TextField( - controller: _tokenSecretController, - decoration: InputDecoration( - labelText: 'Enter provider\'s authTokenSecret'), - ) - : null, - ), - Container( - padding: const EdgeInsets.symmetric(vertical: 16.0), - alignment: Alignment.center, - child: RaisedButton( - onPressed: () async { - _signInWithOtherProvider(); - }, - child: const Text('Sign in'), - ), - ), - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Text( - _message, - style: TextStyle(color: Colors.red), - ), - ) - ], - ); - } - - void _handleRadioButtonSelected(int value) { - setState(() { - _selection = value; - if (_selection == 2) { - _showAuthSecretTextField = true; - } else { - _showAuthSecretTextField = false; - } - }); - } - - void _signInWithOtherProvider() { - switch (_selection) { - case 0: - _signInWithGithub(); - break; - case 1: - _signInWithFacebook(); - break; - case 2: - _signInWithTwitter(); - break; - default: - } - } - - // Example code of how to sign in with Github. - void _signInWithGithub() async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: _tokenController.text, - ); - final FirebaseUser user = - (await _auth.signInWithCredential(credential)).user; - assert(user.email != null); - assert(user.displayName != null); - assert(!user.isAnonymous); - assert(await user.getIdToken() != null); - - final FirebaseUser currentUser = await _auth.currentUser(); - assert(user.uid == currentUser.uid); - setState(() { - if (user != null) { - _message = 'Successfully signed in with Github. ' + user.uid; - } else { - _message = 'Failed to sign in with Github. '; - } - }); - } - - // Example code of how to sign in with Facebook. - void _signInWithFacebook() async { - final AuthCredential credential = FacebookAuthProvider.getCredential( - accessToken: _tokenController.text, - ); - final FirebaseUser user = - (await _auth.signInWithCredential(credential)).user; - assert(user.email != null); - assert(user.displayName != null); - assert(!user.isAnonymous); - assert(await user.getIdToken() != null); - - final FirebaseUser currentUser = await _auth.currentUser(); - assert(user.uid == currentUser.uid); - setState(() { - if (user != null) { - _message = 'Successfully signed in with Facebook. ' + user.uid; - } else { - _message = 'Failed to sign in with Facebook. '; - } - }); - } - - // Example code of how to sign in with Twitter. - void _signInWithTwitter() async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: _tokenController.text, - authTokenSecret: _tokenSecretController.text); - final FirebaseUser user = - (await _auth.signInWithCredential(credential)).user; - assert(user.email != null); - assert(user.displayName != null); - assert(!user.isAnonymous); - assert(await user.getIdToken() != null); - - final FirebaseUser currentUser = await _auth.currentUser(); - assert(user.uid == currentUser.uid); - setState(() { - if (user != null) { - _message = 'Successfully signed in with Twitter. ' + user.uid; - } else { - _message = 'Failed to sign in with Twitter. '; - } - }); - } -} diff --git a/packages/firebase_auth/example/pubspec.yaml b/packages/firebase_auth/example/pubspec.yaml deleted file mode 100755 index 9478c9b1f34f..000000000000 --- a/packages/firebase_auth/example/pubspec.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: firebase_auth_example -description: Demonstrates how to use the firebase_auth plugin. -author: Flutter Team - -dependencies: - flutter: - sdk: flutter - firebase_auth: - path: ../ - google_sign_in: ^4.0.0 - firebase_core: ^0.4.0+8 - firebase_dynamic_links: ^0.3.0 - uuid: ^2.0.2 - -dev_dependencies: - flutter_driver: - sdk: flutter - test: any - -flutter: - uses-material-design: true diff --git a/packages/firebase_auth/example/test/firebase_auth.dart b/packages/firebase_auth/example/test/firebase_auth.dart deleted file mode 100644 index ab969daaf2e4..000000000000 --- a/packages/firebase_auth/example/test/firebase_auth.dart +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2019, 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'; - -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter/services.dart'; -import 'package:uuid/uuid.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$FirebaseAuth', () { - final FirebaseAuth auth = FirebaseAuth.instance; - - setUp(() async { - await auth.signOut(); - }); - - test('signInAnonymously', () async { - final AuthResult result = await auth.signInAnonymously(); - final FirebaseUser user = result.user; - final AdditionalUserInfo additionalUserInfo = result.additionalUserInfo; - expect(additionalUserInfo.username, isNull); - expect(additionalUserInfo.isNewUser, isNotNull); - expect(additionalUserInfo.profile, isNull); - // TODO(jackson): Fix behavior to be consistent across platforms - // https://github.com/firebase/firebase-ios-sdk/issues/3450 - expect( - additionalUserInfo.providerId == null || - additionalUserInfo.providerId == 'password', - isTrue); - expect(user.uid, isNotNull); - expect(user.isAnonymous, isTrue); - expect(user.metadata.creationTime.isAfter(DateTime(2018, 1, 1)), isTrue); - expect(user.metadata.creationTime.isBefore(DateTime.now()), isTrue); - final IdTokenResult tokenResult = await user.getIdToken(); - expect(tokenResult.token, isNotNull); - expect(tokenResult.expirationTime.isAfter(DateTime.now()), isTrue); - expect(tokenResult.authTime, isNotNull); - expect(tokenResult.issuedAtTime, isNotNull); - // TODO(jackson): Fix behavior to be consistent across platforms - // https://github.com/firebase/firebase-ios-sdk/issues/3445 - expect( - tokenResult.signInProvider == null || - tokenResult.signInProvider == 'anonymous', - isTrue); - expect(tokenResult.claims['provider_id'], 'anonymous'); - expect(tokenResult.claims['firebase']['sign_in_provider'], 'anonymous'); - expect(tokenResult.claims['user_id'], user.uid); - await auth.signOut(); - final FirebaseUser user2 = (await auth.signInAnonymously()).user; - expect(user2.uid, isNot(equals(user.uid))); - expect(user2.metadata.creationTime.isBefore(user.metadata.creationTime), - isFalse); - expect( - user2.metadata.lastSignInTime, equals(user2.metadata.creationTime)); - }); - - test('email auth', () async { - final String testEmail = 'testuser${Uuid().v4()}@example.com'; - final String testPassword = 'testpassword'; - AuthResult result = await auth.createUserWithEmailAndPassword( - email: testEmail, - password: testPassword, - ); - final FirebaseUser user = result.user; - expect(user.uid, isNotNull); - expect(user.isAnonymous, isFalse); - auth.signOut(); - final Future failedResult = auth.signInWithEmailAndPassword( - email: testEmail, - password: 'incorrect password', - ); - expect(failedResult, throwsA(isInstanceOf())); - result = await auth.signInWithEmailAndPassword( - email: testEmail, - password: testPassword, - ); - expect(result.user.uid, equals(user.uid)); - await user.delete(); - }); - - test('isSignInWithEmailLink', () async { - final String emailLink1 = 'https://www.example.com/action?mode=signIn&' - 'oobCode=oobCode&apiKey=API_KEY'; - final String emailLink2 = - 'https://www.example.com/action?mode=verifyEmail&' - 'oobCode=oobCode&apiKey=API_KEY'; - final String emailLink3 = 'https://www.example.com/action?mode=signIn'; - expect(await auth.isSignInWithEmailLink(emailLink1), true); - expect(await auth.isSignInWithEmailLink(emailLink2), false); - expect(await auth.isSignInWithEmailLink(emailLink3), false); - }); - }); -} diff --git a/packages/firebase_auth/example/test/firebase_auth_test.dart b/packages/firebase_auth/example/test/firebase_auth_test.dart deleted file mode 100644 index 2bc4ea19a1e7..000000000000 --- a/packages/firebase_auth/example/test/firebase_auth_test.dart +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019, 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:flutter_test/flutter_test.dart'; - -import '../lib/main.dart'; - -void main() { - testWidgets('FirebaseAuth example widget test', (WidgetTester tester) async { - await tester.pumpWidget(MyApp()); - await tester.tap(find.text('Test registration')); - await tester.pumpAndSettle(); - expect(find.text('Registration'), findsOneWidget); - }); -} diff --git a/packages/firebase_auth/example/test_driver/firebase_auth_test.dart b/packages/firebase_auth/example/test_driver/firebase_auth_test.dart deleted file mode 100644 index db46258dfebe..000000000000 --- a/packages/firebase_auth/example/test_driver/firebase_auth_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019, 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:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_auth/ios/Assets/.gitkeep b/packages/firebase_auth/ios/Assets/.gitkeep deleted file mode 100755 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.h b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.h deleted file mode 100644 index 1383a169fa81..000000000000 --- a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 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 - -@interface FLTFirebaseAuthPlugin : NSObject -@end diff --git a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m deleted file mode 100644 index 28a3f3e18b03..000000000000 --- a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m +++ /dev/null @@ -1,483 +0,0 @@ -// Copyright 2017 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 "FirebaseAuthPlugin.h" -#import "UserAgent.h" - -#import "Firebase/Firebase.h" - -static NSString *getFlutterErrorCode(NSError *error) { - NSString *code = [error userInfo][FIRAuthErrorUserInfoNameKey]; - if (code != nil) { - return code; - } - return [NSString stringWithFormat:@"ERROR_%d", (int)error.code]; -} - -NSDictionary *toDictionary(id userInfo) { - return @{ - @"providerId" : userInfo.providerID, - @"displayName" : userInfo.displayName ?: [NSNull null], - @"uid" : userInfo.uid ?: [NSNull null], - @"photoUrl" : userInfo.photoURL.absoluteString ?: [NSNull null], - @"email" : userInfo.email ?: [NSNull null], - @"phoneNumber" : userInfo.phoneNumber ?: [NSNull null], - }; -} - -@interface FLTFirebaseAuthPlugin () -@property(nonatomic, retain) NSMutableDictionary *authStateChangeListeners; -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FLTFirebaseAuthPlugin - -// Handles are ints used as indexes into the NSMutableDictionary of active observers -int nextHandle = 0; - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_auth" - binaryMessenger:[registrar messenger]]; - FLTFirebaseAuthPlugin *instance = [[FLTFirebaseAuthPlugin alloc] init]; - instance.channel = channel; - instance.authStateChangeListeners = [[NSMutableDictionary alloc] init]; - [registrar addApplicationDelegate:instance]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (FIRAuth *_Nullable)getAuth:(NSDictionary *)args { - NSString *appName = [args objectForKey:@"app"]; - return [FIRAuth authWithApp:[FIRApp appNamed:appName]]; -} - -- (bool)application:(UIApplication *)application - didReceiveRemoteNotification:(NSDictionary *)notification - fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { - if ([[FIRAuth auth] canHandleNotification:notification]) { - completionHandler(UIBackgroundFetchResultNoData); - return YES; - } - return NO; -} - -- (void)application:(UIApplication *)application - didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd]; -} - -- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { - return [[FIRAuth auth] canHandleURL:url]; -} - -// TODO(jackson): We should use the renamed versions of the following methods -// when they are available in the Firebase SDK that this plugin is dependent on. -// * fetchSignInMethodsForEmail:completion: -// * reauthenticateAndRetrieveDataWithCredential:completion: -// * linkAndRetrieveDataWithCredential:completion: -// * signInAndRetrieveDataWithCredential:completion: -// See discussion at https://github.com/flutter/plugins/pull/1487 -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"currentUser" isEqualToString:call.method]) { - id __block listener = [[self getAuth:call.arguments] - addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { - [self sendResult:result forUser:user error:nil]; - [auth removeAuthStateDidChangeListener:listener]; - }]; - } else if ([@"signInAnonymously" isEqualToString:call.method]) { - [[self getAuth:call.arguments] - signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forAuthDataResult:authResult error:error]; - }]; - } else if ([@"signInWithCredential" isEqualToString:call.method]) { - [[self getAuth:call.arguments] - signInAndRetrieveDataWithCredential:[self getCredential:call.arguments] - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result - forAuthDataResult:authResult - error:error]; - }]; - } else if ([@"createUserWithEmailAndPassword" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - NSString *password = call.arguments[@"password"]; - [[self getAuth:call.arguments] - createUserWithEmail:email - password:password - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forAuthDataResult:authResult error:error]; - }]; - } else if ([@"fetchSignInMethodsForEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - [[self getAuth:call.arguments] - fetchProvidersForEmail:email - completion:^(NSArray *providers, NSError *error) { - [self sendResult:result forObject:providers error:error]; - }]; - } else if ([@"sendEmailVerification" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser - sendEmailVerificationWithCompletion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"reload" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser reloadWithCompletion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"delete" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser deleteWithCompletion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"sendPasswordResetEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - [[self getAuth:call.arguments] sendPasswordResetWithEmail:email - completion:^(NSError *error) { - [self sendResult:result - forObject:nil - error:error]; - }]; - } else if ([@"sendLinkToEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - FIRActionCodeSettings *actionCodeSettings = [FIRActionCodeSettings new]; - actionCodeSettings.URL = [NSURL URLWithString:call.arguments[@"url"]]; - actionCodeSettings.handleCodeInApp = call.arguments[@"handleCodeInApp"]; - [actionCodeSettings setIOSBundleID:call.arguments[@"iOSBundleID"]]; - [actionCodeSettings setAndroidPackageName:call.arguments[@"androidPackageName"] - installIfNotAvailable:call.arguments[@"androidInstallIfNotAvailable"] - minimumVersion:call.arguments[@"androidMinimumVersion"]]; - [[self getAuth:call.arguments] sendSignInLinkToEmail:email - actionCodeSettings:actionCodeSettings - completion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"isSignInWithEmailLink" isEqualToString:call.method]) { - NSString *link = call.arguments[@"link"]; - BOOL status = [[self getAuth:call.arguments] isSignInWithEmailLink:link]; - [self sendResult:result forObject:[NSNumber numberWithBool:status] error:nil]; - } else if ([@"signInWithEmailAndLink" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - NSString *link = call.arguments[@"link"]; - [[self getAuth:call.arguments] - signInWithEmail:email - link:link - completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { - [self sendResult:result forAuthDataResult:authResult error:error]; - }]; - } else if ([@"signInWithEmailAndPassword" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - NSString *password = call.arguments[@"password"]; - [[self getAuth:call.arguments] - signInWithEmail:email - password:password - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forAuthDataResult:authResult error:error]; - }]; - } else if ([@"signOut" isEqualToString:call.method]) { - NSError *signOutError; - BOOL status = [[self getAuth:call.arguments] signOut:&signOutError]; - if (!status) { - NSLog(@"Error signing out: %@", signOutError); - [self sendResult:result forObject:nil error:signOutError]; - } else { - [self sendResult:result forObject:nil error:nil]; - } - } else if ([@"getIdToken" isEqualToString:call.method]) { - NSDictionary *args = call.arguments; - BOOL refresh = [args objectForKey:@"refresh"]; - [[self getAuth:call.arguments].currentUser - getIDTokenResultForcingRefresh:refresh - completion:^(FIRAuthTokenResult *_Nullable tokenResult, - NSError *_Nullable error) { - NSMutableDictionary *tokenData = nil; - if (tokenResult != nil) { - long expirationTimestamp = - [tokenResult.expirationDate timeIntervalSince1970]; - long authTimestamp = [tokenResult.authDate timeIntervalSince1970]; - long issuedAtTimestamp = - [tokenResult.issuedAtDate timeIntervalSince1970]; - - tokenData = [[NSMutableDictionary alloc] initWithDictionary:@{ - @"token" : tokenResult.token, - @"expirationTimestamp" : - [NSNumber numberWithLong:expirationTimestamp], - @"authTimestamp" : [NSNumber numberWithLong:authTimestamp], - @"issuedAtTimestamp" : - [NSNumber numberWithLong:issuedAtTimestamp], - @"claims" : tokenResult.claims, - }]; - - if (tokenResult.signInProvider != nil) { - tokenData[@"signInProvider"] = tokenResult.signInProvider; - } - } - - [self sendResult:result forObject:tokenData error:error]; - }]; - } else if ([@"reauthenticateWithCredential" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser - reauthenticateAndRetrieveDataWithCredential:[self getCredential:call.arguments] - completion:^(FIRAuthDataResult *r, - NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"linkWithCredential" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser - linkAndRetrieveDataWithCredential:[self getCredential:call.arguments] - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forAuthDataResult:authResult error:error]; - }]; - } else if ([@"unlinkFromProvider" isEqualToString:call.method]) { - NSString *provider = call.arguments[@"provider"]; - [[self getAuth:call.arguments].currentUser - unlinkFromProvider:provider - completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { - [self sendResult:result forUser:user error:error]; - }]; - } else if ([@"updateEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - [[self getAuth:call.arguments].currentUser updateEmail:email - completion:^(NSError *error) { - [self sendResult:result - forObject:nil - error:error]; - }]; - } else if ([@"updatePhoneNumberCredential" isEqualToString:call.method]) { - FIRPhoneAuthCredential *credential = - (FIRPhoneAuthCredential *)[self getCredential:call.arguments]; - [[self getAuth:call.arguments].currentUser - updatePhoneNumberCredential:credential - completion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"updatePassword" isEqualToString:call.method]) { - NSString *password = call.arguments[@"password"]; - [[self getAuth:call.arguments].currentUser updatePassword:password - completion:^(NSError *error) { - [self sendResult:result - forObject:nil - error:error]; - }]; - } else if ([@"updateProfile" isEqualToString:call.method]) { - FIRUserProfileChangeRequest *changeRequest = - [[self getAuth:call.arguments].currentUser profileChangeRequest]; - if (call.arguments[@"displayName"]) { - changeRequest.displayName = call.arguments[@"displayName"]; - } - if (call.arguments[@"photoUrl"]) { - changeRequest.photoURL = [NSURL URLWithString:call.arguments[@"photoUrl"]]; - } - [changeRequest commitChangesWithCompletion:^(NSError *error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"signInWithCustomToken" isEqualToString:call.method]) { - NSString *token = call.arguments[@"token"]; - [[self getAuth:call.arguments] - signInWithCustomToken:token - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forAuthDataResult:authResult error:error]; - }]; - - } else if ([@"startListeningAuthState" isEqualToString:call.method]) { - NSNumber *identifier = [NSNumber numberWithInteger:nextHandle++]; - - FIRAuthStateDidChangeListenerHandle listener = [[self getAuth:call.arguments] - addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { - NSMutableDictionary *response = [[NSMutableDictionary alloc] init]; - response[@"id"] = identifier; - if (user) { - response[@"user"] = [self dictionaryFromUser:user]; - } - [self.channel invokeMethod:@"onAuthStateChanged" arguments:response]; - }]; - [self.authStateChangeListeners setObject:listener forKey:identifier]; - result(identifier); - } else if ([@"stopListeningAuthState" isEqualToString:call.method]) { - NSNumber *identifier = - [NSNumber numberWithInteger:[call.arguments[@"id"] unsignedIntegerValue]]; - - FIRAuthStateDidChangeListenerHandle listener = self.authStateChangeListeners[identifier]; - if (listener) { - [[self getAuth:call.arguments] - removeAuthStateDidChangeListener:self.authStateChangeListeners]; - [self.authStateChangeListeners removeObjectForKey:identifier]; - result(nil); - } else { - result([FlutterError - errorWithCode:@"ERROR_LISTENER_NOT_FOUND" - message:[NSString stringWithFormat:@"Listener with identifier '%d' not found.", - identifier.intValue] - details:nil]); - } - } else if ([@"verifyPhoneNumber" isEqualToString:call.method]) { - NSString *phoneNumber = call.arguments[@"phoneNumber"]; - NSNumber *handle = call.arguments[@"handle"]; - [[FIRPhoneAuthProvider provider] - verifyPhoneNumber:phoneNumber - UIDelegate:nil - completion:^(NSString *verificationID, NSError *error) { - if (error) { - [self.channel invokeMethod:@"phoneVerificationFailed" - arguments:@{ - @"exception" : [self mapVerifyPhoneError:error], - @"handle" : handle - }]; - } else { - [self.channel - invokeMethod:@"phoneCodeSent" - arguments:@{@"verificationId" : verificationID, @"handle" : handle}]; - } - }]; - result(nil); - } else if ([@"signInWithPhoneNumber" isEqualToString:call.method]) { - NSString *verificationId = call.arguments[@"verificationId"]; - NSString *smsCode = call.arguments[@"smsCode"]; - - FIRPhoneAuthCredential *credential = - [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationId - verificationCode:smsCode]; - [[self getAuth:call.arguments] - signInAndRetrieveDataWithCredential:credential - completion:^(FIRAuthDataResult *authResult, - NSError *_Nullable error) { - [self sendResult:result - forAuthDataResult:authResult - error:error]; - }]; - } else if ([@"setLanguageCode" isEqualToString:call.method]) { - NSString *language = call.arguments[@"language"]; - [[self getAuth:call.arguments] setLanguageCode:language]; - [self sendResult:result forObject:nil error:nil]; - } else { - result(FlutterMethodNotImplemented); - } -} - -- (NSMutableDictionary *)dictionaryFromUser:(FIRUser *)user { - NSMutableArray *> *providerData = - [NSMutableArray arrayWithCapacity:user.providerData.count]; - for (id userInfo in user.providerData) { - [providerData addObject:toDictionary(userInfo)]; - } - - long creationDate = [user.metadata.creationDate timeIntervalSince1970] * 1000; - long lastSignInDate = [user.metadata.lastSignInDate timeIntervalSince1970] * 1000; - - NSMutableDictionary *userData = [toDictionary(user) mutableCopy]; - userData[@"creationTimestamp"] = [NSNumber numberWithLong:creationDate]; - userData[@"lastSignInTimestamp"] = [NSNumber numberWithLong:lastSignInDate]; - userData[@"isAnonymous"] = [NSNumber numberWithBool:user.isAnonymous]; - userData[@"isEmailVerified"] = [NSNumber numberWithBool:user.isEmailVerified]; - userData[@"providerData"] = providerData; - return userData; -} -#pragma clang diagnostic pop - -- (void)sendResult:(FlutterResult)result - forAuthDataResult:(FIRAuthDataResult *)authResult - error:(NSError *)error { - FIRUser *user = authResult.user; - FIRAdditionalUserInfo *additionalUserInfo = authResult.additionalUserInfo; - [self sendResult:result - forObject:@{ - @"user" : (user != nil ? [self dictionaryFromUser:user] : [NSNull null]), - @"additionalUserInfo" : additionalUserInfo ? @{ - @"isNewUser" : [NSNumber numberWithBool:additionalUserInfo.isNewUser], - @"username" : additionalUserInfo.username ?: [NSNull null], - @"providerId" : additionalUserInfo.providerID ?: [NSNull null], - @"profile" : additionalUserInfo.profile ?: [NSNull null], - } - : [NSNull null], - } - error:error]; -} - -- (void)sendResult:(FlutterResult)result forUser:(FIRUser *)user error:(NSError *)error { - [self sendResult:result - forObject:(user != nil ? [self dictionaryFromUser:user] : nil) - error:error]; -} - -- (void)sendResult:(FlutterResult)result forObject:(NSObject *)object error:(NSError *)error { - if (error != nil) { - result([FlutterError errorWithCode:getFlutterErrorCode(error) - message:error.localizedDescription - details:nil]); - } else if (object == nil) { - result(nil); - } else { - result(object); - } -} - -- (id)mapVerifyPhoneError:(NSError *)error { - NSString *errorCode = @"verifyPhoneNumberError"; - - if (error.code == FIRAuthErrorCodeCaptchaCheckFailed) { - errorCode = @"captchaCheckFailed"; - } else if (error.code == FIRAuthErrorCodeQuotaExceeded) { - errorCode = @"quotaExceeded"; - } else if (error.code == FIRAuthErrorCodeInvalidPhoneNumber) { - errorCode = @"invalidPhoneNumber"; - } else if (error.code == FIRAuthErrorCodeMissingPhoneNumber) { - errorCode = @"missingPhoneNumber"; - } - return @{@"code" : errorCode, @"message" : error.localizedDescription}; -} - -- (FIRAuthCredential *)getCredential:(NSDictionary *)arguments { - NSString *provider = arguments[@"provider"]; - NSDictionary *data = arguments[@"data"]; - FIRAuthCredential *credential; - if ([FIREmailAuthProviderID isEqualToString:provider]) { - NSString *email = data[@"email"]; - if ([data objectForKey:@"password"]) { - NSString *password = data[@"password"]; - credential = [FIREmailAuthProvider credentialWithEmail:email password:password]; - } else { - NSString *link = data[@"link"]; - credential = [FIREmailAuthProvider credentialWithEmail:email link:link]; - } - } else if ([FIRGoogleAuthProviderID isEqualToString:provider]) { - NSString *idToken = data[@"idToken"]; - NSString *accessToken = data[@"accessToken"]; - credential = [FIRGoogleAuthProvider credentialWithIDToken:idToken accessToken:accessToken]; - } else if ([FIRFacebookAuthProviderID isEqualToString:provider]) { - NSString *accessToken = data[@"accessToken"]; - credential = [FIRFacebookAuthProvider credentialWithAccessToken:accessToken]; - } else if ([FIRTwitterAuthProviderID isEqualToString:provider]) { - NSString *authToken = data[@"authToken"]; - NSString *authTokenSecret = data[@"authTokenSecret"]; - credential = [FIRTwitterAuthProvider credentialWithToken:authToken secret:authTokenSecret]; - } else if ([FIRGitHubAuthProviderID isEqualToString:provider]) { - NSString *token = data[@"token"]; - credential = [FIRGitHubAuthProvider credentialWithToken:token]; - } else if ([FIRPhoneAuthProviderID isEqualToString:provider]) { - NSString *verificationId = data[@"verificationId"]; - NSString *smsCode = data[@"smsCode"]; - credential = [[FIRPhoneAuthProvider providerWithAuth:[self getAuth:arguments]] - credentialWithVerificationID:verificationId - verificationCode:smsCode]; - } else { - NSLog(@"Support for an auth provider with identifier '%@' is not implemented.", provider); - } - return credential; -} -@end diff --git a/packages/firebase_auth/ios/firebase_auth.podspec b/packages/firebase_auth/ios/firebase_auth.podspec deleted file mode 100755 index 760e8bd85bc2..000000000000 --- a/packages/firebase_auth/ios/firebase_auth.podspec +++ /dev/null @@ -1,33 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_auth' - s.version = '0.0.1' - s.summary = 'Firebase Auth plugin for Flutter.' - s.description = <<-DESC -Firebase Auth plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_auth' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Auth', '~> 6.0' - s.dependency 'Firebase/Core' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-auth\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_auth/lib/firebase_auth.dart b/packages/firebase_auth/lib/firebase_auth.dart deleted file mode 100755 index 5eff0e4ae27d..000000000000 --- a/packages/firebase_auth/lib/firebase_auth.dart +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library firebase_auth; - -import 'dart:async'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -part 'src/auth_provider/email_auth_provider.dart'; -part 'src/auth_provider/facebook_auth_provider.dart'; -part 'src/auth_provider/github_auth_provider.dart'; -part 'src/auth_provider/google_auth_provider.dart'; -part 'src/auth_provider/phone_auth_provider.dart'; -part 'src/auth_provider/twitter_auth_provider.dart'; -part 'src/additional_user_info.dart'; -part 'src/auth_credential.dart'; -part 'src/auth_exception.dart'; -part 'src/auth_result.dart'; -part 'src/firebase_auth.dart'; -part 'src/firebase_user.dart'; -part 'src/id_token_result.dart'; -part 'src/user_info.dart'; -part 'src/user_metadata.dart'; -part 'src/user_update_info.dart'; diff --git a/packages/firebase_auth/lib/src/additional_user_info.dart b/packages/firebase_auth/lib/src/additional_user_info.dart deleted file mode 100644 index 2fb0f7707fc4..000000000000 --- a/packages/firebase_auth/lib/src/additional_user_info.dart +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2017 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_auth; - -/// Interface representing a user's additional information -class AdditionalUserInfo { - AdditionalUserInfo._(this._data); - - final Map _data; - - /// Returns whether the user is new or existing - bool get isNewUser => _data['isNewUser']; - - /// Returns the username if the provider is GitHub or Twitter - String get username => _data['username']; - - /// Returns the provider ID for specifying which provider the - /// information in [profile] is for. - String get providerId => _data['providerId']; - - /// Returns a Map containing IDP-specific user data if the provider - /// is one of Facebook, GitHub, Google, Twitter, Microsoft, or Yahoo. - Map get profile => _data['profile']?.cast(); -} diff --git a/packages/firebase_auth/lib/src/auth_credential.dart b/packages/firebase_auth/lib/src/auth_credential.dart deleted file mode 100644 index cf9e943e2e4d..000000000000 --- a/packages/firebase_auth/lib/src/auth_credential.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -/// Represents the credentials returned by calling the `getCredential` method of -/// an auth provider. -class AuthCredential { - AuthCredential._(this._provider, this._data); - final String _provider; - final Map _data; -} diff --git a/packages/firebase_auth/lib/src/auth_exception.dart b/packages/firebase_auth/lib/src/auth_exception.dart deleted file mode 100644 index bbdc746fe40c..000000000000 --- a/packages/firebase_auth/lib/src/auth_exception.dart +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017 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_auth; - -/// Generic exception related to Firebase Authentication. -/// Check the error code and message for more details. -class AuthException implements Exception { - const AuthException(this.code, this.message); - - final String code; - final String message; -} diff --git a/packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart deleted file mode 100644 index 1187923abffc..000000000000 --- a/packages/firebase_auth/lib/src/auth_provider/email_auth_provider.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -class EmailAuthProvider { - static const String providerId = 'password'; - - static AuthCredential getCredential({ - String email, - String password, - }) { - return AuthCredential._(providerId, { - 'email': email, - 'password': password, - }); - } - - static AuthCredential getCredentialWithLink({ - String email, - String link, - }) { - return AuthCredential._(providerId, { - 'email': email, - 'link': link, - }); - } -} diff --git a/packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart deleted file mode 100644 index 5f1a4f0866bd..000000000000 --- a/packages/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -class FacebookAuthProvider { - static const String providerId = 'facebook.com'; - - static AuthCredential getCredential({String accessToken}) { - return AuthCredential._( - providerId, - {'accessToken': accessToken}, - ); - } -} diff --git a/packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart deleted file mode 100644 index 448862f22528..000000000000 --- a/packages/firebase_auth/lib/src/auth_provider/github_auth_provider.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -class GithubAuthProvider { - static const String providerId = 'github.com'; - - static AuthCredential getCredential({@required String token}) { - return AuthCredential._(providerId, {'token': token}); - } -} diff --git a/packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart deleted file mode 100644 index 4dca135291f5..000000000000 --- a/packages/firebase_auth/lib/src/auth_provider/google_auth_provider.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -class GoogleAuthProvider { - static const String providerId = 'google.com'; - - static AuthCredential getCredential({ - @required String idToken, - @required String accessToken, - }) { - return AuthCredential._(providerId, { - 'idToken': idToken, - 'accessToken': accessToken, - }); - } -} diff --git a/packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart deleted file mode 100644 index 95055e1f80ba..000000000000 --- a/packages/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -class PhoneAuthProvider { - static const String providerId = 'phone'; - - static AuthCredential getCredential({ - @required String verificationId, - @required String smsCode, - }) { - return AuthCredential._(providerId, { - 'verificationId': verificationId, - 'smsCode': smsCode, - }); - } - - // PhoneAuthProvider uses JSON serialization on Android when the SMS code was - // detected automatically. - static AuthCredential _getCredentialFromObject({ - @required String jsonObject, - }) { - return AuthCredential._(providerId, { - "jsonObject": jsonObject, - }); - } -} diff --git a/packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart b/packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart deleted file mode 100644 index 9b349ccf6fb4..000000000000 --- a/packages/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -class TwitterAuthProvider { - static const String providerId = 'twitter.com'; - - static AuthCredential getCredential({ - @required String authToken, - @required String authTokenSecret, - }) { - return AuthCredential._(providerId, { - 'authToken': authToken, - 'authTokenSecret': authTokenSecret, - }); - } -} diff --git a/packages/firebase_auth/lib/src/auth_result.dart b/packages/firebase_auth/lib/src/auth_result.dart deleted file mode 100644 index dd003dac0791..000000000000 --- a/packages/firebase_auth/lib/src/auth_result.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2017 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_auth; - -/// Result object obtained from operations that can affect the authentication -/// state. Contains a method that returns the currently signed-in user after -/// the operation has completed. -class AuthResult { - AuthResult._(this._data, FirebaseApp app) - : user = FirebaseUser._(_data['user'].cast(), app); - - final Map _data; - - /// Returns the currently signed-in [FirebaseUser], or `null` if there isn't - /// any (i.e. the user is signed out). - final FirebaseUser user; - - /// Returns IDP-specific information for the user if the provider is one of - /// Facebook, Github, Google, or Twitter. - AdditionalUserInfo get additionalUserInfo => - _data['additionalUserInfo'] == null - ? null - : AdditionalUserInfo._(_data['additionalUserInfo']); - - @override - String toString() { - return '$runtimeType($_data)'; - } -} diff --git a/packages/firebase_auth/lib/src/firebase_auth.dart b/packages/firebase_auth/lib/src/firebase_auth.dart deleted file mode 100644 index 8f0c30a13544..000000000000 --- a/packages/firebase_auth/lib/src/firebase_auth.dart +++ /dev/null @@ -1,451 +0,0 @@ -// Copyright 2017 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_auth; - -typedef void PhoneVerificationCompleted(AuthCredential phoneAuthCredential); -typedef void PhoneVerificationFailed(AuthException error); -typedef void PhoneCodeSent(String verificationId, [int forceResendingToken]); -typedef void PhoneCodeAutoRetrievalTimeout(String verificationId); - -/// The entry point of the Firebase Authentication SDK. -class FirebaseAuth { - FirebaseAuth._(this.app) { - channel.setMethodCallHandler(_callHandler); - } - - /// Provides an instance of this class corresponding to `app`. - factory FirebaseAuth.fromApp(FirebaseApp app) { - assert(app != null); - return FirebaseAuth._(app); - } - - /// Provides an instance of this class corresponding to the default app. - static final FirebaseAuth instance = FirebaseAuth._(FirebaseApp.instance); - - @visibleForTesting - static const MethodChannel channel = MethodChannel( - 'plugins.flutter.io/firebase_auth', - ); - - final Map> _authStateChangedControllers = - >{}; - - static int _nextHandle = 0; - final Map> _phoneAuthCallbacks = - >{}; - - final FirebaseApp app; - - /// Receive [FirebaseUser] each time the user signIn or signOut - Stream get onAuthStateChanged { - Future _handle; - - StreamController controller; - controller = StreamController.broadcast(onListen: () { - _handle = channel.invokeMethod('startListeningAuthState', - {"app": app.name}).then((dynamic v) => v); - _handle.then((int handle) { - _authStateChangedControllers[handle] = controller; - }); - }, onCancel: () { - _handle.then((int handle) async { - await channel.invokeMethod("stopListeningAuthState", - {"id": handle, "app": app.name}); - _authStateChangedControllers.remove(handle); - }); - }); - - return controller.stream; - } - - /// Asynchronously creates and becomes an anonymous user. - /// - /// If there is already an anonymous user signed in, that user will be - /// returned instead. If there is any other existing user signed in, that - /// user will be signed out. - /// - /// **Important**: You must enable Anonymous accounts in the Auth section - /// of the Firebase console before being able to use them. - /// - /// Errors: - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Anonymous accounts are not enabled. - Future signInAnonymously() async { - final Map data = await channel - .invokeMapMethod( - 'signInAnonymously', {"app": app.name}); - final AuthResult authResult = AuthResult._(data, app); - return authResult; - } - - /// Tries to create a new user account with the given email address and password. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// Errors: - /// • `ERROR_WEAK_PASSWORD` - If the password is not strong enough. - /// • `ERROR_INVALID_EMAIL` - If the email address is malformed. - /// • `ERROR_EMAIL_ALREADY_IN_USE` - If the email is already in use by a different account. - Future createUserWithEmailAndPassword({ - @required String email, - @required String password, - }) async { - assert(email != null); - assert(password != null); - final Map data = - await channel.invokeMapMethod( - 'createUserWithEmailAndPassword', - {'email': email, 'password': password, 'app': app.name}, - ); - final AuthResult authResult = AuthResult._(data, app); - return authResult; - } - - /// Returns a list of sign-in methods that can be used to sign in a given - /// user (identified by its main email address). - /// - /// This method is useful when you support multiple authentication mechanisms - /// if you want to implement an email-first authentication flow. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the [email] address is malformed. - /// • `ERROR_USER_NOT_FOUND` - If there is no user corresponding to the given [email] address. - Future> fetchSignInMethodsForEmail({ - @required String email, - }) async { - assert(email != null); - return await channel.invokeListMethod( - 'fetchSignInMethodsForEmail', - {'email': email, 'app': app.name}, - ); - } - - /// Triggers the Firebase Authentication backend to send a password-reset - /// email to the given email address, which must correspond to an existing - /// user of your app. - /// - /// Errors: - /// • `ERROR_INVALID_EMAIL` - If the [email] address is malformed. - /// • `ERROR_USER_NOT_FOUND` - If there is no user corresponding to the given [email] address. - Future sendPasswordResetEmail({ - @required String email, - }) async { - assert(email != null); - return await channel.invokeMethod( - 'sendPasswordResetEmail', - {'email': email, 'app': app.name}, - ); - } - - /// Sends a sign in with email link to provided email address. - Future sendSignInWithEmailLink({ - @required String email, - @required String url, - @required bool handleCodeInApp, - @required String iOSBundleID, - @required String androidPackageName, - @required bool androidInstallIfNotAvailable, - @required String androidMinimumVersion, - }) async { - assert(email != null); - assert(url != null); - assert(handleCodeInApp != null); - assert(iOSBundleID != null); - assert(androidPackageName != null); - assert(androidInstallIfNotAvailable != null); - assert(androidMinimumVersion != null); - await channel.invokeMethod( - 'sendLinkToEmail', - { - 'email': email, - 'url': url, - 'handleCodeInApp': handleCodeInApp, - 'iOSBundleID': iOSBundleID, - 'androidPackageName': androidPackageName, - 'androidInstallIfNotAvailable': androidInstallIfNotAvailable, - 'androidMinimumVersion': androidMinimumVersion, - 'app': app.name, - }, - ); - } - - /// Checks if link is an email sign-in link. - Future isSignInWithEmailLink(String link) async { - return await channel.invokeMethod( - 'isSignInWithEmailLink', - {'link': link, 'app': app.name}, - ); - } - - /// Signs in using an email address and email sign-in link. - /// - /// Errors: - /// • `ERROR_NOT_ALLOWED` - Indicates that email and email sign-in link - /// accounts are not enabled. Enable them in the Auth section of the - /// Firebase console. - /// • `ERROR_DISABLED` - Indicates the user's account is disabled. - /// • `ERROR_INVALID` - Indicates the email address is invalid. - Future signInWithEmailAndLink({String email, String link}) async { - final Map data = - await channel.invokeMapMethod( - 'signInWithEmailAndLink', - { - 'app': app.name, - 'email': email, - 'link': link, - }, - ); - final AuthResult authResult = AuthResult._(data, app); - return authResult; - } - - /// Tries to sign in a user with the given email address and password. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// **Important**: You must enable Email & Password accounts in the Auth - /// section of the Firebase console before being able to use them. - /// - /// Errors: - /// • `ERROR_INVALID_EMAIL` - If the [email] address is malformed. - /// • `ERROR_WRONG_PASSWORD` - If the [password] is wrong. - /// • `ERROR_USER_NOT_FOUND` - If there is no user corresponding to the given [email] address, or if the user has been deleted. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_TOO_MANY_REQUESTS` - If there was too many attempts to sign in as this user. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future signInWithEmailAndPassword({ - @required String email, - @required String password, - }) { - assert(email != null); - assert(password != null); - final AuthCredential credential = EmailAuthProvider.getCredential( - email: email, - password: password, - ); - return signInWithCredential(credential); - } - - /// Asynchronously signs in to Firebase with the given 3rd-party credentials - /// (e.g. a Facebook login Access Token, a Google ID Token/Access Token pair, - /// etc.) and returns additional identity provider data. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// If the user doesn't have an account already, one will be created automatically. - /// - /// **Important**: You must enable the relevant accounts in the Auth section - /// of the Firebase console before being able to use them. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the credential data is malformed or has expired. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL` - If there already exists an account with the email address asserted by Google. - /// Resolve this case by calling [fetchSignInMethodsForEmail] and then asking the user to sign in using one of them. - /// This error will only be thrown if the "One account per email address" setting is enabled in the Firebase console (recommended). - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Google accounts are not enabled. - /// • `ERROR_INVALID_ACTION_CODE` - If the action code in the link is malformed, expired, or has already been used. - /// This can only occur when using [EmailAuthProvider.getCredentialWithLink] to obtain the credential. - Future signInWithCredential(AuthCredential credential) async { - assert(credential != null); - final Map data = - await channel.invokeMapMethod( - 'signInWithCredential', - { - 'app': app.name, - 'provider': credential._provider, - 'data': credential._data, - }, - ); - final AuthResult authResult = AuthResult._(data, app); - return authResult; - } - - /// Starts the phone number verification process for the given phone number. - /// - /// Either sends an SMS with a 6 digit code to the phone number specified, - /// or sign's the user in and [verificationCompleted] is called. - /// - /// No duplicated SMS will be sent out upon re-entry (before timeout). - /// - /// Make sure to test all scenarios below: - /// • You directly get logged in if Google Play Services verified the phone - /// number instantly or helped you auto-retrieve the verification code. - /// • Auto-retrieve verification code timed out. - /// • Error cases when you receive [verificationFailed] callback. - /// - /// [phoneNumber] The phone number for the account the user is signing up - /// for or signing into. Make sure to pass in a phone number with country - /// code prefixed with plus sign ('+'). - /// - /// [timeout] The maximum amount of time you are willing to wait for SMS - /// auto-retrieval to be completed by the library. Maximum allowed value - /// is 2 minutes. Use 0 to disable SMS-auto-retrieval. Setting this to 0 - /// will also cause [codeAutoRetrievalTimeout] to be called immediately. - /// If you specified a positive value less than 30 seconds, library will - /// default to 30 seconds. - /// - /// [forceResendingToken] The [forceResendingToken] obtained from [codeSent] - /// callback to force re-sending another verification SMS before the - /// auto-retrieval timeout. - /// - /// [verificationCompleted] This callback must be implemented. - /// It will trigger when an SMS is auto-retrieved or the phone number has - /// been instantly verified. The callback will receive an [AuthCredential] - /// that can be passed to [signInWithCredential] or [linkWithCredential]. - /// - /// [verificationFailed] This callback must be implemented. - /// Triggered when an error occurred during phone number verification. - /// - /// [codeSent] Optional callback. - /// It will trigger when an SMS has been sent to the users phone, - /// and will include a [verificationId] and [forceResendingToken]. - /// - /// [codeAutoRetrievalTimeout] Optional callback. - /// It will trigger when SMS auto-retrieval times out and provide a - /// [verificationId]. - Future verifyPhoneNumber({ - @required String phoneNumber, - @required Duration timeout, - int forceResendingToken, - @required PhoneVerificationCompleted verificationCompleted, - @required PhoneVerificationFailed verificationFailed, - @required PhoneCodeSent codeSent, - @required PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout, - }) async { - final Map callbacks = { - 'PhoneVerificationCompleted': verificationCompleted, - 'PhoneVerificationFailed': verificationFailed, - 'PhoneCodeSent': codeSent, - 'PhoneCodeAuthRetrievalTimeout': codeAutoRetrievalTimeout, - }; - _nextHandle += 1; - _phoneAuthCallbacks[_nextHandle] = callbacks; - - final Map params = { - 'handle': _nextHandle, - 'phoneNumber': phoneNumber, - 'timeout': timeout.inMilliseconds, - 'forceResendingToken': forceResendingToken, - 'app': app.name, - }; - - await channel.invokeMethod('verifyPhoneNumber', params); - } - - /// Tries to sign in a user with a given Custom Token [token]. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// Use this method after you retrieve a Firebase Auth Custom Token from your server. - /// - /// If the user identified by the [uid] specified in the token doesn't - /// have an account already, one will be created automatically. - /// - /// Read how to use Custom Token authentication and the cases where it is - /// useful in [the guides](https://firebase.google.com/docs/auth/android/custom-auth). - /// - /// Errors: - /// • `ERROR_INVALID_CUSTOM_TOKEN` - The custom token format is incorrect. - /// Please check the documentation. - /// • `ERROR_CUSTOM_TOKEN_MISMATCH` - Invalid configuration. - /// Ensure your app's SHA1 is correct in the Firebase console. - Future signInWithCustomToken({@required String token}) async { - assert(token != null); - final Map data = - await channel.invokeMapMethod( - 'signInWithCustomToken', - {'token': token, 'app': app.name}, - ); - final AuthResult authResult = AuthResult._(data, app); - return authResult; - } - - /// Signs out the current user and clears it from the disk cache. - /// - /// If successful, it signs the user out of the app and updates - /// the [onAuthStateChanged] stream. - Future signOut() async { - return await channel - .invokeMethod("signOut", {'app': app.name}); - } - - /// Returns the currently signed-in [FirebaseUser] or [null] if there is none. - Future currentUser() async { - final Map data = await channel - .invokeMapMethod( - "currentUser", {'app': app.name}); - final FirebaseUser currentUser = - data == null ? null : FirebaseUser._(data, app); - return currentUser; - } - - /// Sets the user-facing language code for auth operations that can be - /// internationalized, such as [sendEmailVerification]. This language - /// code should follow the conventions defined by the IETF in BCP47. - Future setLanguageCode(String language) async { - assert(language != null); - await FirebaseAuth.channel - .invokeMethod('setLanguageCode', { - 'language': language, - 'app': app.name, - }); - } - - Future _callHandler(MethodCall call) async { - switch (call.method) { - case 'onAuthStateChanged': - _onAuthStageChangedHandler(call); - break; - case 'phoneVerificationCompleted': - final int handle = call.arguments['handle']; - final PhoneVerificationCompleted verificationCompleted = - _phoneAuthCallbacks[handle]['PhoneVerificationCompleted']; - verificationCompleted(PhoneAuthProvider._getCredentialFromObject( - jsonObject: call.arguments["phoneAuthCredential"].toString())); - break; - case 'phoneVerificationFailed': - final int handle = call.arguments['handle']; - final PhoneVerificationFailed verificationFailed = - _phoneAuthCallbacks[handle]['PhoneVerificationFailed']; - final Map exception = call.arguments['exception']; - verificationFailed( - AuthException(exception['code'], exception['message'])); - break; - case 'phoneCodeSent': - final int handle = call.arguments['handle']; - final String verificationId = call.arguments['verificationId']; - final int forceResendingToken = call.arguments['forceResendingToken']; - - final PhoneCodeSent codeSent = - _phoneAuthCallbacks[handle]['PhoneCodeSent']; - if (forceResendingToken == null) { - codeSent(verificationId); - } else { - codeSent(verificationId, forceResendingToken); - } - break; - case 'phoneCodeAutoRetrievalTimeout': - final int handle = call.arguments['handle']; - final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = - _phoneAuthCallbacks[handle]['PhoneCodeAuthRetrievalTimeout']; - final String verificationId = call.arguments['verificationId']; - codeAutoRetrievalTimeout(verificationId); - break; - } - } - - void _onAuthStageChangedHandler(MethodCall call) { - final Map data = call.arguments["user"]; - final int id = call.arguments["id"]; - - final FirebaseUser currentUser = - data != null ? FirebaseUser._(data.cast(), app) : null; - _authStateChangedControllers[id].add(currentUser); - } -} diff --git a/packages/firebase_auth/lib/src/firebase_user.dart b/packages/firebase_auth/lib/src/firebase_user.dart deleted file mode 100644 index b9e4c8c244ef..000000000000 --- a/packages/firebase_auth/lib/src/firebase_user.dart +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2017 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_auth; - -/// Represents a user. -class FirebaseUser extends UserInfo { - FirebaseUser._(Map data, FirebaseApp app) - : providerData = data['providerData'] - .map((dynamic item) => UserInfo._(item, app)) - .toList(), - _metadata = FirebaseUserMetadata._(data), - super._(data, app); - - final List providerData; - final FirebaseUserMetadata _metadata; - - // Returns true if the user is anonymous; that is, the user account was - // created with signInAnonymously() and has not been linked to another - // account. - FirebaseUserMetadata get metadata => _metadata; - - bool get isAnonymous => _data['isAnonymous']; - - /// Returns true if the user's email is verified. - bool get isEmailVerified => _data['isEmailVerified']; - - /// Obtains the id token result for the current user, forcing a [refresh] if desired. - /// - /// Useful when authenticating against your own backend. Use our server - /// SDKs or follow the official documentation to securely verify the - /// integrity and validity of this token. - /// - /// Completes with an error if the user is signed out. - Future getIdToken({bool refresh = false}) async { - final Map data = await FirebaseAuth.channel - .invokeMapMethod('getIdToken', { - 'refresh': refresh, - 'app': _app.name, - }); - - return IdTokenResult(data, _app); - } - - /// Associates a user account from a third-party identity provider with this - /// user and returns additional identity provider data. - /// - /// This allows the user to sign in to this account in the future with - /// the given account. - /// - /// Errors: - /// • `ERROR_WEAK_PASSWORD` - If the password is not strong enough. - /// • `ERROR_INVALID_CREDENTIAL` - If the credential is malformed or has expired. - /// • `ERROR_EMAIL_ALREADY_IN_USE` - If the email is already in use by a different account. - /// • `ERROR_CREDENTIAL_ALREADY_IN_USE` - If the account is already in use by a different account, e.g. with phone auth. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - /// • `ERROR_PROVIDER_ALREADY_LINKED` - If the current user already has an account of this type linked. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that this type of account is not enabled. - /// • `ERROR_INVALID_ACTION_CODE` - If the action code in the link is malformed, expired, or has already been used. - /// This can only occur when using [EmailAuthProvider.getCredentialWithLink] to obtain the credential. - Future linkWithCredential(AuthCredential credential) async { - assert(credential != null); - final Map data = - await FirebaseAuth.channel.invokeMapMethod( - 'linkWithCredential', - { - 'app': _app.name, - 'provider': credential._provider, - 'data': credential._data, - }, - ); - final AuthResult result = AuthResult._(data, _app); - return result; - } - - /// Initiates email verification for the user. - Future sendEmailVerification() async { - await FirebaseAuth.channel.invokeMethod( - 'sendEmailVerification', {'app': _app.name}); - } - - /// Manually refreshes the data of the current user (for example, - /// attached providers, display name, and so on). - Future reload() async { - await FirebaseAuth.channel - .invokeMethod('reload', {'app': _app.name}); - } - - /// Deletes the current user (also signs out the user). - /// - /// Errors: - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - /// • `ERROR_INVALID_CREDENTIAL` - If the credential is malformed or has expired. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - Future delete() async { - await FirebaseAuth.channel - .invokeMethod('delete', {'app': _app.name}); - } - - /// Updates the email address of the user. - /// - /// The original email address recipient will receive an email that allows - /// them to revoke the email address change, in order to protect them - /// from account hijacking. - /// - /// **Important**: This is a security sensitive operation that requires - /// the user to have recently signed in. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the email address is malformed. - /// • `ERROR_EMAIL_ALREADY_IN_USE` - If the email is already in use by a different account. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future updateEmail(String email) async { - assert(email != null); - return await FirebaseAuth.channel.invokeMethod( - 'updateEmail', - {'email': email, 'app': _app.name}, - ); - } - - /// Updates the phone number of the user. - /// - /// The new phone number credential corresponding to the phone number - /// to be added to the Firebase account, if a phone number is already linked to the account. - /// this new phone number will replace it. - /// - /// **Important**: This is a security sensitive operation that requires - /// the user to have recently signed in. - /// - Future updatePhoneNumberCredential(AuthCredential credential) async { - assert(credential != null); - await FirebaseAuth.channel.invokeMethod( - 'updatePhoneNumberCredential', - { - 'app': _app.name, - 'provider': credential._provider, - 'data': credential._data, - }, - ); - } - - /// Updates the password of the user. - /// - /// Anonymous users who update both their email and password will no - /// longer be anonymous. They will be able to log in with these credentials. - /// - /// **Important**: This is a security sensitive operation that requires - /// the user to have recently signed in. - /// - /// Errors: - /// • `ERROR_WEAK_PASSWORD` - If the password is not strong enough. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future updatePassword(String password) async { - assert(password != null); - return await FirebaseAuth.channel.invokeMethod( - 'updatePassword', - {'password': password, 'app': _app.name}, - ); - } - - /// Updates the user profile information. - /// - /// Errors: - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - Future updateProfile(UserUpdateInfo userUpdateInfo) async { - assert(userUpdateInfo != null); - final Map data = userUpdateInfo._updateData; - data['app'] = _app.name; - return await FirebaseAuth.channel.invokeMethod( - 'updateProfile', - data, - ); - } - - /// Renews the user’s authentication tokens by validating a fresh set of - /// [credential]s supplied by the user and returns additional identity provider - /// data. - /// - /// This is used to prevent or resolve `ERROR_REQUIRES_RECENT_LOGIN` - /// response to operations that require a recent sign-in. - /// - /// If the user associated with the supplied credential is different from the - /// current user, or if the validation of the supplied credentials fails; an - /// error is returned and the current user remains signed in. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the [authToken] or [authTokenSecret] is malformed or has expired. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future reauthenticateWithCredential( - AuthCredential credential) async { - assert(credential != null); - final Map data = - await FirebaseAuth.channel.invokeMapMethod( - 'reauthenticateWithCredential', - { - 'app': _app.name, - 'provider': credential._provider, - 'data': credential._data, - }, - ); - return AuthResult._(data, _app); - } - - /// Detaches the [provider] account from the current user. - /// - /// This will prevent the user from signing in to this account with those - /// credentials. - /// - /// **Important**: This is a security sensitive operation that requires - /// the user to have recently signed in. - /// - /// Use the `providerId` method of an auth provider for [provider]. - /// - /// Errors: - /// • `ERROR_NO_SUCH_PROVIDER` - If the user does not have a Github Account linked to their account. - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - Future unlinkFromProvider(String provider) async { - assert(provider != null); - return await FirebaseAuth.channel.invokeMethod( - 'unlinkFromProvider', - {'provider': provider, 'app': _app.name}, - ); - } - - @override - String toString() { - return '$runtimeType($_data)'; - } -} diff --git a/packages/firebase_auth/lib/src/id_token_result.dart b/packages/firebase_auth/lib/src/id_token_result.dart deleted file mode 100644 index c53e9ae5bb4d..000000000000 --- a/packages/firebase_auth/lib/src/id_token_result.dart +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2017 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_auth; - -/// Represents ID token result obtained from [FirebaseUser], containing the -/// ID token JWT string and other helper properties for getting different -/// data associated with the token as well as all the decoded payload claims. -/// -/// Note that these claims are not to be trusted as they are parsed client side. -/// Only server side verification can guarantee the integrity of the token -/// claims. -class IdTokenResult { - @visibleForTesting - IdTokenResult(this._data, this._app); - - final FirebaseApp _app; - - final Map _data; - - /// The Firebase Auth ID token JWT string. - String get token => _data['token']; - - /// The time when the ID token expires. - DateTime get expirationTime => - DateTime.fromMillisecondsSinceEpoch(_data['expirationTimestamp'] * 1000); - - /// The time the user authenticated (signed in). - /// - /// Note that this is not the time the token was refreshed. - DateTime get authTime => - DateTime.fromMillisecondsSinceEpoch(_data['authTimestamp'] * 1000); - - /// The time when ID token was issued. - DateTime get issuedAtTime => - DateTime.fromMillisecondsSinceEpoch(_data['issuedAtTimestamp'] * 1000); - - /// The sign-in provider through which the ID token was obtained (anonymous, - /// custom, phone, password, etc). Note, this does not map to provider IDs. - String get signInProvider => _data['signInProvider']; - - /// The entire payload claims of the ID token including the standard reserved - /// claims as well as the custom claims. - Map get claims => _data['claims']; - - @override - String toString() { - return '$runtimeType($_data)'; - } -} diff --git a/packages/firebase_auth/lib/src/user_info.dart b/packages/firebase_auth/lib/src/user_info.dart deleted file mode 100644 index d7e440aaeee0..000000000000 --- a/packages/firebase_auth/lib/src/user_info.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2017 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_auth; - -/// Represents user data returned from an identity provider. -class UserInfo { - UserInfo._(this._data, this._app); - - final FirebaseApp _app; - - final Map _data; - - /// The provider identifier. - String get providerId => _data['providerId']; - - /// The provider’s user ID for the user. - String get uid => _data['uid']; - - /// The name of the user. - String get displayName => _data['displayName']; - - /// The URL of the user’s profile photo. - String get photoUrl => _data['photoUrl']; - - /// The user’s email address. - String get email => _data['email']; - - /// The user's phone number. - String get phoneNumber => _data['phoneNumber']; - - @override - String toString() { - return '$runtimeType($_data)'; - } -} diff --git a/packages/firebase_auth/lib/src/user_metadata.dart b/packages/firebase_auth/lib/src/user_metadata.dart deleted file mode 100644 index 293d294b6ecb..000000000000 --- a/packages/firebase_auth/lib/src/user_metadata.dart +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2017 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_auth; - -/// Interface representing a user's metadata. -class FirebaseUserMetadata { - FirebaseUserMetadata._(this._data); - - final Map _data; - - /// When this account was created as dictated by the server clock. - DateTime get creationTime => - DateTime.fromMillisecondsSinceEpoch(_data['creationTimestamp']); - - /// When the user last signed in as dictated by the server clock. - /// - /// This is only accurate up to a granularity of 2 minutes for consecutive sign-in attempts. - DateTime get lastSignInTime => - DateTime.fromMillisecondsSinceEpoch(_data['lastSignInTimestamp']); -} diff --git a/packages/firebase_auth/lib/src/user_update_info.dart b/packages/firebase_auth/lib/src/user_update_info.dart deleted file mode 100644 index 0b290b912970..000000000000 --- a/packages/firebase_auth/lib/src/user_update_info.dart +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017 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_auth; - -/// Represents user profile data that can be updated by [updateProfile] -/// -/// The purpose of having separate class with a map is to give possibility -/// to check if value was set to null or not provided -class UserUpdateInfo { - /// Container of data that will be send in update request - final Map _updateData = {}; - - set displayName(String displayName) => - _updateData['displayName'] = displayName; - - String get displayName => _updateData['displayName']; - - set photoUrl(String photoUri) => _updateData['photoUrl'] = photoUri; - - String get photoUrl => _updateData['photoUrl']; -} diff --git a/packages/firebase_auth/pubspec.yaml b/packages/firebase_auth/pubspec.yaml deleted file mode 100755 index 163957b97e9b..000000000000 --- a/packages/firebase_auth/pubspec.yaml +++ /dev/null @@ -1,34 +0,0 @@ -name: firebase_auth -description: Flutter plugin for Firebase Auth, enabling Android and iOS - authentication using passwords, phone numbers and identity providers - like Google, Facebook and Twitter. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_auth -version: 0.14.0+2 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebaseauth - iosPrefix: FLT - pluginClass: FirebaseAuthPlugin - -dependencies: - meta: ^1.0.4 - firebase_core: ^0.4.0 - - flutter: - sdk: flutter - -dev_dependencies: - google_sign_in: ^3.0.4 - firebase_dynamic_links: ^0.3.0 - uuid: ^2.0.2 - test: ^1.3.0 - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_auth/test/firebase_auth_test.dart b/packages/firebase_auth/test/firebase_auth_test.dart deleted file mode 100755 index 5573302c62b6..000000000000 --- a/packages/firebase_auth/test/firebase_auth_test.dart +++ /dev/null @@ -1,1326 +0,0 @@ -// Copyright 2017 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_auth/firebase_auth.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -const String kMockProviderId = 'firebase'; -const String kMockUid = '12345'; -const String kMockDisplayName = 'Flutter Test User'; -const String kMockPhotoUrl = 'http://www.example.com/'; -const String kMockEmail = 'test@example.com'; -const String kMockPassword = 'passw0rd'; -const String kMockIdToken = '12345'; -const String kMockAccessToken = '67890'; -const String kMockGithubToken = 'github'; -const String kMockAuthToken = '23456'; -const String kMockAuthTokenSecret = '78901'; -const String kMockCustomToken = '12345'; -const String kMockPhoneNumber = '5555555555'; -const String kMockVerificationId = '12345'; -const String kMockSmsCode = '123456'; -const String kMockLanguage = 'en'; -const String kMockIdTokenResultSignInProvider = 'password'; -const Map kMockIdTokenResultClaims = { - 'claim1': 'value1', -}; -const int kMockIdTokenResultExpirationTimestamp = 123456; -const int kMockIdTokenResultAuthTimestamp = 1234567; -const int kMockIdTokenResultIssuedAtTimestamp = 12345678; -const Map kMockIdTokenResult = { - 'token': kMockIdToken, - 'expirationTimestamp': kMockIdTokenResultExpirationTimestamp, - 'authTimestamp': kMockIdTokenResultAuthTimestamp, - 'issuedAtTimestamp': kMockIdTokenResultIssuedAtTimestamp, - 'signInProvider': kMockIdTokenResultSignInProvider, - 'claims': kMockIdTokenResultClaims, -}; - -final int kMockCreationTimestamp = DateTime(2019, 1, 1).millisecondsSinceEpoch; -final int kMockLastSignInTimestamp = - DateTime.now().subtract(const Duration(days: 1)).millisecondsSinceEpoch; -final Map kMockUser = { - 'isAnonymous': true, - 'isEmailVerified': false, - 'creationTimestamp': kMockCreationTimestamp, - 'lastSignInTimestamp': kMockLastSignInTimestamp, - 'providerData': >[ - { - 'providerId': kMockProviderId, - 'uid': kMockUid, - 'displayName': kMockDisplayName, - 'photoUrl': kMockPhotoUrl, - 'email': kMockEmail, - }, - ], -}; -const Map kMockAdditionalUserInfo = { - 'isNewUser': false, - 'username': 'flutterUser', - 'providerId': 'testProvider', - 'profile': {'foo': 'bar'}, -}; - -void main() { - group('$FirebaseAuth', () { - final String appName = 'testApp'; - final FirebaseApp app = FirebaseApp(name: appName); - final FirebaseAuth auth = FirebaseAuth.fromApp(app); - final List log = []; - - int mockHandleId = 0; - - setUp(() { - log.clear(); - FirebaseAuth.channel.setMockMethodCallHandler((MethodCall call) async { - log.add(call); - switch (call.method) { - case "getIdToken": - return kMockIdTokenResult; - break; - case "isSignInWithEmailLink": - return true; - case "startListeningAuthState": - return mockHandleId++; - break; - case "currentUser": - return kMockUser; - case "sendLinkToEmail": - case "sendPasswordResetEmail": - case "updateEmail": - case "updatePhoneNumberCredential": - case "updatePassword": - case "updateProfile": - return null; - break; - case "fetchSignInMethodsForEmail": - return List(0); - break; - case "verifyPhoneNumber": - return null; - break; - default: - return { - 'user': kMockUser, - 'additionalUserInfo': kMockAdditionalUserInfo, - }; - break; - } - }); - }); - void verifyUser(FirebaseUser user) { - expect(user, isNotNull); - expect(user.isAnonymous, isTrue); - expect(user.isEmailVerified, isFalse); - expect(user.providerData.length, 1); - final UserInfo userInfo = user.providerData[0]; - expect(userInfo.providerId, kMockProviderId); - expect(userInfo.uid, kMockUid); - expect(userInfo.displayName, kMockDisplayName); - expect(userInfo.photoUrl, kMockPhotoUrl); - expect(userInfo.email, kMockEmail); - expect(user.metadata.creationTime.millisecondsSinceEpoch, - kMockCreationTimestamp); - expect(user.metadata.lastSignInTime.millisecondsSinceEpoch, - kMockLastSignInTimestamp); - } - - void verifyAuthResult(AuthResult result) { - verifyUser(result.user); - final AdditionalUserInfo additionalUserInfo = result.additionalUserInfo; - expect( - additionalUserInfo.isNewUser, kMockAdditionalUserInfo['isNewUser']); - expect(additionalUserInfo.username, kMockAdditionalUserInfo['username']); - expect( - additionalUserInfo.providerId, kMockAdditionalUserInfo['providerId']); - expect(additionalUserInfo.profile, kMockAdditionalUserInfo['profile']); - } - - test('getIdToken', () async { - void verifyIdTokenResult(IdTokenResult idTokenResult) { - expect(idTokenResult.token, equals(kMockIdToken)); - expect( - idTokenResult.expirationTime, - equals(DateTime.fromMillisecondsSinceEpoch( - kMockIdTokenResultExpirationTimestamp * 1000))); - expect( - idTokenResult.authTime, - equals(DateTime.fromMillisecondsSinceEpoch( - kMockIdTokenResultAuthTimestamp * 1000))); - expect( - idTokenResult.issuedAtTime, - equals(DateTime.fromMillisecondsSinceEpoch( - kMockIdTokenResultIssuedAtTimestamp * 1000))); - expect(idTokenResult.signInProvider, - equals(kMockIdTokenResultSignInProvider)); - expect(idTokenResult.claims, equals(kMockIdTokenResultClaims)); - } - - final FirebaseUser user = await auth.currentUser(); - verifyIdTokenResult(await user.getIdToken()); - verifyIdTokenResult(await user.getIdToken(refresh: true)); - expect( - log, - [ - isMethodCall('currentUser', - arguments: {'app': auth.app.name}), - isMethodCall( - 'getIdToken', - arguments: { - 'refresh': false, - 'app': auth.app.name - }, - ), - isMethodCall( - 'getIdToken', - arguments: {'refresh': true, 'app': auth.app.name}, - ), - ], - ); - }); - - test('signInAnonymously', () async { - final AuthResult result = await auth.signInAnonymously(); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall('signInAnonymously', - arguments: {'app': auth.app.name}), - ], - ); - }); - - test('sendSignInWithEmailLink', () async { - await auth.sendSignInWithEmailLink( - email: 'test@example.com', - url: 'http://www.example.com/', - handleCodeInApp: true, - iOSBundleID: 'com.example.app', - androidPackageName: 'com.example.app', - androidInstallIfNotAvailable: false, - androidMinimumVersion: "12", - ); - expect( - log, - [ - isMethodCall('sendLinkToEmail', arguments: { - 'email': 'test@example.com', - 'url': 'http://www.example.com/', - 'handleCodeInApp': true, - 'iOSBundleID': 'com.example.app', - 'androidPackageName': 'com.example.app', - 'androidInstallIfNotAvailable': false, - 'androidMinimumVersion': '12', - 'app': auth.app.name, - }), - ], - ); - }); - - test('isSignInWithEmailLink', () async { - final bool result = await auth.isSignInWithEmailLink('foo'); - expect(result, true); - expect( - log, - [ - isMethodCall('isSignInWithEmailLink', - arguments: {'link': 'foo', 'app': auth.app.name}), - ], - ); - }); - - test('signInWithEmailAndLink', () async { - final AuthResult result = await auth.signInWithEmailAndLink( - email: 'test@example.com', - link: '', - ); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall('signInWithEmailAndLink', arguments: { - 'email': 'test@example.com', - 'link': '', - 'app': auth.app.name, - }), - ], - ); - }); - - test('createUserWithEmailAndPassword', () async { - final AuthResult result = await auth.createUserWithEmailAndPassword( - email: kMockEmail, - password: kMockPassword, - ); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'createUserWithEmailAndPassword', - arguments: { - 'email': kMockEmail, - 'password': kMockPassword, - 'app': auth.app.name, - }, - ), - ], - ); - }); - - test('fetchSignInMethodsForEmail', () async { - final List providers = - await auth.fetchSignInMethodsForEmail(email: kMockEmail); - expect(providers, isNotNull); - expect(providers.length, 0); - expect( - log, - [ - isMethodCall( - 'fetchSignInMethodsForEmail', - arguments: { - 'email': kMockEmail, - 'app': auth.app.name - }, - ), - ], - ); - }); - - test('EmailAuthProvider (withLink) linkWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredentialWithLink( - email: 'test@example.com', - link: '', - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': 'test@example.com', - 'link': '', - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider (withLink) signInWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredentialWithLink( - email: 'test@example.com', - link: '', - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': 'test@example.com', - 'link': '', - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider (withLink) reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = EmailAuthProvider.getCredentialWithLink( - email: 'test@example.com', - link: '', - ); - await user.reauthenticateWithCredential(credential); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': 'test@example.com', - 'link': '', - } - }, - ), - ], - ); - }); - - test('TwitterAuthProvider linkWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockIdToken, - authTokenSecret: kMockAccessToken, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockIdToken, - 'authTokenSecret': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('TwitterAuthProvider signInWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockIdToken, - authTokenSecret: kMockAccessToken, - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockIdToken, - 'authTokenSecret': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider linkWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - } - }, - ), - ], - ); - }); - - test('GitHubAuthProvider signInWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider linkWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredential( - email: kMockEmail, - password: kMockPassword, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': kMockEmail, - 'password': kMockPassword, - }, - }, - ), - ], - ); - }); - - test('GoogleAuthProvider signInWithCredential', () async { - final AuthCredential credential = GoogleAuthProvider.getCredential( - idToken: kMockIdToken, - accessToken: kMockAccessToken, - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - 'data': { - 'idToken': kMockIdToken, - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('PhoneAuthProvider signInWithCredential', () async { - final AuthCredential credential = PhoneAuthProvider.getCredential( - verificationId: kMockVerificationId, - smsCode: kMockSmsCode, - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect(log, [ - isMethodCall('signInWithCredential', arguments: { - 'app': auth.app.name, - 'provider': 'phone', - 'data': { - 'verificationId': kMockVerificationId, - 'smsCode': kMockSmsCode, - }, - }) - ]); - }); - - test('verifyPhoneNumber', () async { - await auth.verifyPhoneNumber( - phoneNumber: kMockPhoneNumber, - timeout: const Duration(seconds: 5), - verificationCompleted: null, - verificationFailed: null, - codeSent: null, - codeAutoRetrievalTimeout: null); - expect(log, [ - isMethodCall('verifyPhoneNumber', arguments: { - 'handle': 1, - 'phoneNumber': kMockPhoneNumber, - 'timeout': 5000, - 'forceResendingToken': null, - 'app': auth.app.name, - }) - ]); - }); - - test('EmailAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = EmailAuthProvider.getCredential( - email: kMockEmail, - password: kMockPassword, - ); - final AuthResult result = - await user.reauthenticateWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': kMockEmail, - 'password': kMockPassword, - } - }, - ), - ], - ); - }); - test('GoogleAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = GoogleAuthProvider.getCredential( - idToken: kMockIdToken, - accessToken: kMockAccessToken, - ); - final AuthResult result = - await user.reauthenticateWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - 'data': { - 'idToken': kMockIdToken, - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('FacebookAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = FacebookAuthProvider.getCredential( - accessToken: kMockAccessToken, - ); - final AuthResult result = - await user.reauthenticateWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - 'data': { - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('TwitterAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockAuthToken, - authTokenSecret: kMockAuthTokenSecret, - ); - final AuthResult result = - await user.reauthenticateWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockAuthToken, - 'authTokenSecret': kMockAuthTokenSecret, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final AuthResult result = - await user.reauthenticateWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('GoogleAuthProvider linkWithCredential', () async { - final AuthCredential credential = GoogleAuthProvider.getCredential( - idToken: kMockIdToken, - accessToken: kMockAccessToken, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - 'data': { - 'idToken': kMockIdToken, - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('FacebookAuthProvider linkWithCredential', () async { - final AuthCredential credential = FacebookAuthProvider.getCredential( - accessToken: kMockAccessToken, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - 'data': { - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('FacebookAuthProvider signInWithCredential', () async { - final AuthCredential credential = FacebookAuthProvider.getCredential( - accessToken: kMockAccessToken, - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - 'data': { - 'accessToken': kMockAccessToken, - } - }, - ), - ], - ); - }); - - test('TwitterAuthProvider linkWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockAuthToken, - authTokenSecret: kMockAuthTokenSecret, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockAuthToken, - 'authTokenSecret': kMockAuthTokenSecret, - }, - }, - ), - ], - ); - }); - - test('TwitterAuthProvider signInWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockAuthToken, - authTokenSecret: kMockAuthTokenSecret, - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockAuthToken, - 'authTokenSecret': kMockAuthTokenSecret, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider linkWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider signInWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final AuthResult result = await auth.signInWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider linkWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredential( - email: kMockEmail, - password: kMockPassword, - ); - final FirebaseUser user = await auth.currentUser(); - final AuthResult result = await user.linkWithCredential(credential); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: { - 'app': auth.app.name, - }, - ), - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': kMockEmail, - 'password': kMockPassword, - }, - }, - ), - ], - ); - }); - - test('sendEmailVerification', () async { - final FirebaseUser user = await auth.currentUser(); - await user.sendEmailVerification(); - - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'sendEmailVerification', - arguments: {'app': auth.app.name}, - ), - ], - ); - }); - - test('reload', () async { - final FirebaseUser user = await auth.currentUser(); - await user.reload(); - - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'reload', - arguments: {'app': auth.app.name}, - ), - ], - ); - }); - - test('delete', () async { - final FirebaseUser user = await auth.currentUser(); - await user.delete(); - - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'delete', - arguments: {'app': auth.app.name}, - ), - ], - ); - }); - - test('sendPasswordResetEmail', () async { - await auth.sendPasswordResetEmail( - email: kMockEmail, - ); - expect( - log, - [ - isMethodCall( - 'sendPasswordResetEmail', - arguments: { - 'email': kMockEmail, - 'app': auth.app.name - }, - ), - ], - ); - }); - - test('updateEmail', () async { - final FirebaseUser user = await auth.currentUser(); - await user.updateEmail(kMockEmail); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'updateEmail', - arguments: { - 'email': kMockEmail, - 'app': auth.app.name, - }, - ), - ]); - }); - - test('updatePhoneNumberCredential', () async { - final FirebaseUser user = await auth.currentUser(); - final AuthCredential credentials = PhoneAuthProvider.getCredential( - verificationId: kMockVerificationId, - smsCode: kMockSmsCode, - ); - await user.updatePhoneNumberCredential(credentials); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'updatePhoneNumberCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'phone', - 'data': { - 'verificationId': kMockVerificationId, - 'smsCode': kMockSmsCode, - }, - }, - ), - ]); - }); - - test('updatePassword', () async { - final FirebaseUser user = await auth.currentUser(); - await user.updatePassword(kMockPassword); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'updatePassword', - arguments: { - 'password': kMockPassword, - 'app': auth.app.name, - }, - ), - ]); - }); - - test('updateProfile', () async { - final UserUpdateInfo userUpdateInfo = UserUpdateInfo(); - userUpdateInfo.photoUrl = kMockPhotoUrl; - userUpdateInfo.displayName = kMockDisplayName; - - final FirebaseUser user = await auth.currentUser(); - await user.updateProfile(userUpdateInfo); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'updateProfile', - arguments: { - 'photoUrl': kMockPhotoUrl, - 'displayName': kMockDisplayName, - 'app': auth.app.name, - }, - ), - ]); - }); - - test('EmailAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(EmailAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - }, - ), - ]); - }); - - test('GoogleAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(GoogleAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - }, - ), - ]); - }); - - test('FacebookAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(FacebookAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - }, - ), - ]); - }); - - test('PhoneAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(PhoneAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'phone', - }, - ), - ]); - }); - - test('TwitterAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(TwitterAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - }, - ), - ]); - }); - - test('GithubAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(GithubAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - }, - ), - ]); - }); - - test('signInWithCustomToken', () async { - final AuthResult result = - await auth.signInWithCustomToken(token: kMockCustomToken); - verifyAuthResult(result); - expect( - log, - [ - isMethodCall('signInWithCustomToken', arguments: { - 'token': kMockCustomToken, - 'app': auth.app.name, - }) - ], - ); - }); - - test('onAuthStateChanged', () async { - mockHandleId = 42; - - Future simulateEvent(Map user) async { - // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. - // https://github.com/flutter/flutter/issues/33446 - // ignore: deprecated_member_use - await BinaryMessages.handlePlatformMessage( - FirebaseAuth.channel.name, - FirebaseAuth.channel.codec.encodeMethodCall( - MethodCall( - 'onAuthStateChanged', - {'id': 42, 'user': user, 'app': auth.app.name}, - ), - ), - (_) {}, - ); - } - - final AsyncQueue events = AsyncQueue(); - - // Subscribe and allow subscription to complete. - final StreamSubscription subscription = - auth.onAuthStateChanged.listen(events.add); - await Future.delayed(const Duration(seconds: 0)); - - await simulateEvent(null); - await simulateEvent(kMockUser); - - final FirebaseUser user1 = await events.remove(); - expect(user1, isNull); - - final FirebaseUser user2 = await events.remove(); - verifyUser(user2); - - // Cancel subscription and allow cancellation to complete. - subscription.cancel(); - await Future.delayed(const Duration(seconds: 0)); - - expect( - log, - [ - isMethodCall('startListeningAuthState', arguments: { - 'app': auth.app.name, - }), - isMethodCall( - 'stopListeningAuthState', - arguments: { - 'id': 42, - 'app': auth.app.name, - }, - ), - ], - ); - }); - - test('setLanguageCode', () async { - await auth.setLanguageCode(kMockLanguage); - - expect( - log, - [ - isMethodCall( - 'setLanguageCode', - arguments: { - 'language': kMockLanguage, - 'app': auth.app.name, - }, - ), - ], - ); - }); - }); -} - -/// Queue whose remove operation is asynchronous, awaiting a corresponding add. -class AsyncQueue { - Map> _completers = >{}; - int _nextToRemove = 0; - int _nextToAdd = 0; - - void add(T element) { - _completer(_nextToAdd++).complete(element); - } - - Future remove() { - final Future result = _completer(_nextToRemove++).future; - return result; - } - - Completer _completer(int index) { - if (_completers.containsKey(index)) { - return _completers.remove(index); - } else { - return _completers[index] = Completer(); - } - } -} diff --git a/packages/firebase_core/.gitignore b/packages/firebase_core/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_core/CHANGELOG.md b/packages/firebase_core/CHANGELOG.md deleted file mode 100644 index 04845d383e94..000000000000 --- a/packages/firebase_core/CHANGELOG.md +++ /dev/null @@ -1,153 +0,0 @@ -## 0.4.0+8 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.4.0+7 - -* Fix Android compilation warning. - -## 0.4.0+6 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.4.0+5 - -* Rollback of automatic plugin version retrieval. - -## 0.4.0+4 - -* Automate the retrieval of the plugin's version when reporting usage to Firebase. - -## 0.4.0+3 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. -* Replace invokeMethod with invokeMapMethod wherever necessary. - -## 0.4.0+2 - -* Update user agent name. Set to `flutter-fire-core` for consistency with other - libraries. - -## 0.4.0+1 - -* Send user agent to Firebase. - -## 0.4.0 - -* Update Android dependencies to latest. - -## 0.3.4 - -* Updates Android firebase-core dependency to a version that is compatible with other Flutterfire plugins. - -## 0.3.3 - -* Remove Gradle BoM to avoid Gradle version issues. - -## 0.3.2 - -* Move Android dependency to Gradle BoM to help maintain compatability - with other FlutterFire plugins. - -## 0.3.1+1 - -* Add nil check on static functions to prevent crashes or unwanted behaviors. - -## 0.3.1 - -* Remove an assertion that can interfere with hot-restart. - -## 0.3.0+2 - -* Remove categories. - -## 0.3.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.3.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.2.5+1 - -* Bump Android dependencies to latest. - -## 0.2.5 - -* Bump Android and Firebase dependency versions. - -## 0.2.4 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.2.3 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.2.2 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.2.1 - -* Fix setting project ID on Android. - -## 0.2.0 - -* **Breaking change**. Options API is now async to interoperate with native code that configures Firebase apps. -* Provide a getter for the default app -* Fix setting of GCM sender ID on iOS - -## 0.1.2 - -* Fix projectID on iOS - -## 0.1.1 - -* Fix behavior of constructor for named Firebase apps. - -## 0.1.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.0.7 - -* Fixed Dart 2 type errors. - -## 0.0.6 - -* Enabled use in Swift projects. - -## 0.0.5 - -* Moved to the io.flutter.plugins org. - -## 0.0.4 - -* Fixed warnings from the Dart 2.0 analyzer. -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -# 0.0.3 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). - -## 0.0.2 - -* Fixes for database URL on Android -* Make GCM sender id optional on Android -* Relax GMS dependency to 11.+ - -## 0.0.1 - -* Initial Release diff --git a/packages/firebase_core/LICENSE b/packages/firebase_core/LICENSE deleted file mode 100644 index 000b4618d2bd..000000000000 --- a/packages/firebase_core/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 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_core/README.md b/packages/firebase_core/README.md deleted file mode 100644 index bc72824024d7..000000000000 --- a/packages/firebase_core/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Firebase Core for Flutter - -[![pub package](https://img.shields.io/pub/v/firebase_core.svg)](https://pub.dartlang.org/packages/firebase_core) - -A Flutter plugin to use the Firebase Core API, which enables connecting to multiple Firebase apps. - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage -To use this plugin, add `firebase_core` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Getting Started - -See the `example` directory for a complete sample app using Firebase Core. diff --git a/packages/firebase_core/android/build.gradle b/packages/firebase_core/android/build.gradle deleted file mode 100644 index 34fb94a90904..000000000000 --- a/packages/firebase_core/android/build.gradle +++ /dev/null @@ -1,53 +0,0 @@ -def PLUGIN = "firebase_core"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebase.core' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-core:16.0.9' - implementation 'com.google.firebase:firebase-common:16.1.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_core/android/gradle.properties b/packages/firebase_core/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_core/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_core/android/settings.gradle b/packages/firebase_core/android/settings.gradle deleted file mode 100644 index 6b9f7039d668..000000000000 --- a/packages/firebase_core/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_core' diff --git a/packages/firebase_core/android/src/main/AndroidManifest.xml b/packages/firebase_core/android/src/main/AndroidManifest.xml deleted file mode 100644 index 25d4e417f6bc..000000000000 --- a/packages/firebase_core/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java b/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java deleted file mode 100644 index ef82fbf92573..000000000000 --- a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FirebaseCorePlugin.java +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.core; - -import android.content.Context; -import com.google.firebase.FirebaseApp; -import com.google.firebase.FirebaseOptions; -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.plugin.common.PluginRegistry; -import java.lang.String; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class FirebaseCorePlugin implements MethodCallHandler { - - private final Context context; - - public static void registerWith(PluginRegistry.Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_core"); - channel.setMethodCallHandler(new FirebaseCorePlugin(registrar.context())); - } - - private FirebaseCorePlugin(Context context) { - this.context = context; - } - - private Map asMap(FirebaseApp app) { - Map appMap = new HashMap<>(); - appMap.put("name", app.getName()); - FirebaseOptions options = app.getOptions(); - Map optionsMap = new HashMap<>(); - optionsMap.put("googleAppID", options.getApplicationId()); - optionsMap.put("GCMSenderID", options.getGcmSenderId()); - optionsMap.put("APIKey", options.getApiKey()); - optionsMap.put("databaseURL", options.getDatabaseUrl()); - optionsMap.put("storageBucket", options.getStorageBucket()); - optionsMap.put("projectID", options.getProjectId()); - appMap.put("options", optionsMap); - return appMap; - } - - @Override - public void onMethodCall(MethodCall call, final Result result) { - switch (call.method) { - case "FirebaseApp#configure": - { - Map arguments = call.arguments(); - String name = (String) arguments.get("name"); - @SuppressWarnings("unchecked") - Map optionsMap = (Map) arguments.get("options"); - FirebaseOptions options = - new FirebaseOptions.Builder() - .setApiKey(optionsMap.get("APIKey")) - .setApplicationId(optionsMap.get("googleAppID")) - .setDatabaseUrl(optionsMap.get("databaseURL")) - .setGcmSenderId(optionsMap.get("GCMSenderID")) - .setProjectId(optionsMap.get("projectID")) - .setStorageBucket(optionsMap.get("storageBucket")) - .build(); - FirebaseApp.initializeApp(context, options, name); - result.success(null); - break; - } - case "FirebaseApp#allApps": - { - List> apps = new ArrayList<>(); - for (FirebaseApp app : FirebaseApp.getApps(context)) { - apps.add(asMap(app)); - } - result.success(apps); - break; - } - case "FirebaseApp#appNamed": - { - String name = call.arguments(); - try { - FirebaseApp app = FirebaseApp.getInstance(name); - result.success(asMap(app)); - } catch (IllegalStateException ex) { - // App doesn't exist, so successfully return null. - result.success(null); - } - break; - } - default: - { - result.notImplemented(); - break; - } - } - } -} diff --git a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java b/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 4057e7dc9a62..000000000000 --- a/packages/firebase_core/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.core; - -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; - -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_core/android/user-agent.gradle b/packages/firebase_core/android/user-agent.gradle deleted file mode 100644 index 095f0af535b7..000000000000 --- a/packages/firebase_core/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-core" -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_core/example/.metadata b/packages/firebase_core/example/.metadata deleted file mode 100644 index 28ce4e53c4dd..000000000000 --- a/packages/firebase_core/example/.metadata +++ /dev/null @@ -1,8 +0,0 @@ -# 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: f993cc36dd4fdb8e3c741cbf66fd0cdeea975e37 - channel: unknown diff --git a/packages/firebase_core/example/README.md b/packages/firebase_core/example/README.md deleted file mode 100644 index ea0fa78cf4f5..000000000000 --- a/packages/firebase_core/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_core_example - -Demonstrates how to use the firebase_core plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_core/example/android.iml b/packages/firebase_core/example/android.iml deleted file mode 100644 index 462b903e05b6..000000000000 --- a/packages/firebase_core/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_core/example/android/app/build.gradle b/packages/firebase_core/example/android/app/build.gradle deleted file mode 100644 index bcd12c9f12cf..000000000000 --- a/packages/firebase_core/example/android/app/build.gradle +++ /dev/null @@ -1,60 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebasecoreexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} diff --git a/packages/firebase_core/example/android/app/gradle.properties b/packages/firebase_core/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_core/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_core/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_core/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_core/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_core/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_core/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 48cbadd2a13b..000000000000 --- a/packages/firebase_core/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/firebase_core/example/android/app/src/main/java/io/flutter/plugins/firebasecoreexample/MainActivity.java b/packages/firebase_core/example/android/app/src/main/java/io/flutter/plugins/firebasecoreexample/MainActivity.java deleted file mode 100644 index 7af8a0947345..000000000000 --- a/packages/firebase_core/example/android/app/src/main/java/io/flutter/plugins/firebasecoreexample/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.firebasecoreexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_core/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_core/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/firebase_core/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/firebase_core/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_core/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_core/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_core/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_core/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_core/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_core/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_core/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_core/example/android/app/src/main/res/values/styles.xml b/packages/firebase_core/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/firebase_core/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/firebase_core/example/android/build.gradle b/packages/firebase_core/example/android/build.gradle deleted file mode 100644 index 541636cc492a..000000000000 --- a/packages/firebase_core/example/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_core/example/android/gradle.properties b/packages/firebase_core/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_core/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_core/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_core/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f1fd..000000000000 --- a/packages/firebase_core/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#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-4.10.2-all.zip diff --git a/packages/firebase_core/example/android/settings.gradle b/packages/firebase_core/example/android/settings.gradle deleted file mode 100644 index 840d7be6e176..000000000000 --- a/packages/firebase_core/example/android/settings.gradle +++ /dev/null @@ -1,16 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} - diff --git a/packages/firebase_core/example/firebase_core_example.iml b/packages/firebase_core/example/firebase_core_example.iml deleted file mode 100644 index 4881df8aeff2..000000000000 --- a/packages/firebase_core/example/firebase_core_example.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_core/example/firebase_core_example_android.iml b/packages/firebase_core/example/firebase_core_example_android.iml deleted file mode 100644 index 0ca70ed93eaf..000000000000 --- a/packages/firebase_core/example/firebase_core_example_android.iml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_core/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_core/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6c2de8086bcd..000000000000 --- a/packages/firebase_core/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_core/example/ios/Flutter/Debug.xcconfig b/packages/firebase_core/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_core/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_core/example/ios/Flutter/Release.xcconfig b/packages/firebase_core/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_core/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_core/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_core/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 01bbb60f5add..000000000000 --- a/packages/firebase_core/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,478 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2AE3C69805AB6FB8C037C7BA /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 39D23D0C629B8A857DE66538 /* libPods-Runner.a */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 39D23D0C629B8A857DE66538 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; - 8C05BEBBACF658542A507F21 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - BBD18D8969E712FE54BB6E20 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 2AE3C69805AB6FB8C037C7BA /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 39F1FF2B4D76A033C08A8FD9 /* Pods */ = { - isa = PBXGroup; - children = ( - 8C05BEBBACF658542A507F21 /* Pods-Runner.debug.xcconfig */, - BBD18D8969E712FE54BB6E20 /* Pods-Runner.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 39F1FF2B4D76A033C08A8FD9 /* Pods */, - C5757EE16C6DD6ADC639F4D9 /* 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 = ""; - }; - C5757EE16C6DD6ADC639F4D9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 39D23D0C629B8A857DE66538 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 4A37569BEFBE2FD279304116 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 531483E699D87EBBC063AF7F /* [CP] Embed Pods Frameworks */, - ); - 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; - }; - 4A37569BEFBE2FD279304116 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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; - }; - 531483E699D87EBBC063AF7F /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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\n"; - }; -/* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseCoreExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseCoreExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_core/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_core/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/firebase_core/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/firebase_core/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_core/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1c9580788197..000000000000 --- a/packages/firebase_core/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_core/example/ios/Runner/AppDelegate.h b/packages/firebase_core/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_core/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_core/example/ios/Runner/AppDelegate.m b/packages/firebase_core/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/firebase_core/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d22f10b2ab63..000000000000 --- a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/firebase_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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_core/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_core/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/firebase_core/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_core/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_core/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_core/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_core/example/ios/Runner/Info.plist b/packages/firebase_core/example/ios/Runner/Info.plist deleted file mode 100644 index 02b271480b86..000000000000 --- a/packages/firebase_core/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_core_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_core/example/ios/Runner/main.m b/packages/firebase_core/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_core/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_core/example/lib/main.dart b/packages/firebase_core/example/lib/main.dart deleted file mode 100644 index 80da9e02a056..000000000000 --- a/packages/firebase_core/example/lib/main.dart +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:firebase_core/firebase_core.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatelessWidget { - final String name = 'foo'; - final FirebaseOptions options = const FirebaseOptions( - googleAppID: '1:297855924061:ios:c6de2b69b03a5be8', - gcmSenderID: '297855924061', - apiKey: 'AIzaSyBq6mcufFXfyqr79uELCiqM_O_1-G72PVU', - ); - - Future _configure() async { - final FirebaseApp app = await FirebaseApp.configure( - name: name, - options: options, - ); - assert(app != null); - print('Configured $app'); - } - - Future _allApps() async { - final List apps = await FirebaseApp.allApps(); - print('Currently configured apps: $apps'); - } - - Future _options() async { - final FirebaseApp app = await FirebaseApp.appNamed(name); - final FirebaseOptions options = await app?.options; - print('Current options for app $name: $options'); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Firebase Core example app'), - ), - body: Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - RaisedButton( - onPressed: _configure, child: const Text('initialize')), - RaisedButton(onPressed: _allApps, child: const Text('allApps')), - RaisedButton(onPressed: _options, child: const Text('options')), - ], - ), - ), - ), - ); - } -} diff --git a/packages/firebase_core/example/pubspec.yaml b/packages/firebase_core/example/pubspec.yaml deleted file mode 100644 index a020d145fcc2..000000000000 --- a/packages/firebase_core/example/pubspec.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: firebase_core_example -description: Demonstrates how to use the firebase_core plugin. - -dependencies: - flutter: - sdk: flutter - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.0 - -dev_dependencies: - flutter_test: - sdk: flutter - - firebase_core: - path: ../ - -# For information on the generic Dart part of this file, see the -# following page: https://www.dartlang.org/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - uses-material-design: true diff --git a/packages/firebase_core/firebase_core_android.iml b/packages/firebase_core/firebase_core_android.iml deleted file mode 100644 index 0ebb6c9fe763..000000000000 --- a/packages/firebase_core/firebase_core_android.iml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_core/ios/Assets/.gitkeep b/packages/firebase_core/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_core/ios/Classes/FirebaseCorePlugin.h b/packages/firebase_core/ios/Classes/FirebaseCorePlugin.h deleted file mode 100644 index 42a71d29f641..000000000000 --- a/packages/firebase_core/ios/Classes/FirebaseCorePlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 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 - -@interface FLTFirebaseCorePlugin : NSObject -@end diff --git a/packages/firebase_core/ios/Classes/FirebaseCorePlugin.m b/packages/firebase_core/ios/Classes/FirebaseCorePlugin.m deleted file mode 100644 index ccf06bf111ed..000000000000 --- a/packages/firebase_core/ios/Classes/FirebaseCorePlugin.m +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2017 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 "FirebaseCorePlugin.h" -#import "UserAgent.h" - -#import - -static NSDictionary *getDictionaryFromFIROptions(FIROptions *options) { - if (!options) { - return nil; - } - return @{ - @"googleAppID" : options.googleAppID ?: [NSNull null], - @"bundleID" : options.bundleID ?: [NSNull null], - @"GCMSenderID" : options.GCMSenderID ?: [NSNull null], - @"APIKey" : options.APIKey ?: [NSNull null], - @"clientID" : options.clientID ?: [NSNull null], - @"trackingID" : options.trackingID ?: [NSNull null], - @"projectID" : options.projectID ?: [NSNull null], - @"androidClientID" : options.androidClientID ?: [NSNull null], - @"databaseUrl" : options.databaseURL ?: [NSNull null], - @"storageBucket" : options.storageBucket ?: [NSNull null], - @"deepLinkURLScheme" : options.deepLinkURLScheme ?: [NSNull null], - }; -} - -static NSDictionary *getDictionaryFromFIRApp(FIRApp *app) { - if (!app) { - return nil; - } - return @{@"name" : app.name, @"options" : getDictionaryFromFIROptions(app.options)}; -} - -@implementation FLTFirebaseCorePlugin -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_core" - binaryMessenger:[registrar messenger]]; - FLTFirebaseCorePlugin *instance = [[FLTFirebaseCorePlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"FirebaseApp#configure" isEqualToString:call.method]) { - NSString *name = call.arguments[@"name"]; - NSDictionary *optionsDictionary = call.arguments[@"options"]; - FIROptions *options = - [[FIROptions alloc] initWithGoogleAppID:optionsDictionary[@"googleAppID"] - GCMSenderID:optionsDictionary[@"GCMSenderID"]]; - if (![optionsDictionary[@"bundleID"] isEqual:[NSNull null]]) - options.bundleID = optionsDictionary[@"bundleID"]; - if (![optionsDictionary[@"APIKey"] isEqual:[NSNull null]]) - options.APIKey = optionsDictionary[@"APIKey"]; - if (![optionsDictionary[@"clientID"] isEqual:[NSNull null]]) - options.clientID = optionsDictionary[@"clientID"]; - if (![optionsDictionary[@"trackingID"] isEqual:[NSNull null]]) - options.trackingID = optionsDictionary[@"trackingID"]; - if (![optionsDictionary[@"projectID"] isEqual:[NSNull null]]) - options.projectID = optionsDictionary[@"projectID"]; - if (![optionsDictionary[@"androidClientID"] isEqual:[NSNull null]]) - options.androidClientID = optionsDictionary[@"androidClientID"]; - if (![optionsDictionary[@"databaseURL"] isEqual:[NSNull null]]) - options.databaseURL = optionsDictionary[@"databaseURL"]; - if (![optionsDictionary[@"storageBucket"] isEqual:[NSNull null]]) - options.storageBucket = optionsDictionary[@"storageBucket"]; - if (![optionsDictionary[@"deepLinkURLScheme"] isEqual:[NSNull null]]) - options.deepLinkURLScheme = optionsDictionary[@"deepLinkURLScheme"]; - [FIRApp configureWithName:name options:options]; - result(nil); - } else if ([@"FirebaseApp#allApps" isEqualToString:call.method]) { - NSDictionary *allApps = [FIRApp allApps]; - NSMutableArray *appsList = [NSMutableArray array]; - for (NSString *name in allApps) { - FIRApp *app = allApps[name]; - [appsList addObject:getDictionaryFromFIRApp(app)]; - } - result(appsList.count > 0 ? appsList : nil); - } else if ([@"FirebaseApp#appNamed" isEqualToString:call.method]) { - NSString *name = call.arguments; - FIRApp *app = [FIRApp appNamed:name]; - result(getDictionaryFromFIRApp(app)); - } else { - result(FlutterMethodNotImplemented); - } -} - -@end diff --git a/packages/firebase_core/ios/firebase_core.podspec b/packages/firebase_core/ios/firebase_core.podspec deleted file mode 100644 index 9454fb541be8..000000000000 --- a/packages/firebase_core/ios/firebase_core.podspec +++ /dev/null @@ -1,32 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_core' - 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.dependency 'Firebase/Core' - s.ios.deployment_target = '8.0' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-core\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_core/lib/firebase_core.dart b/packages/firebase_core/lib/firebase_core.dart deleted file mode 100644 index 7a8d76191744..000000000000 --- a/packages/firebase_core/lib/firebase_core.dart +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library firebase_core; - -import 'dart:async'; -import 'dart:io' show Platform; -import 'dart:ui' show hashValues; - -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -part 'src/firebase_app.dart'; -part 'src/firebase_options.dart'; diff --git a/packages/firebase_core/lib/src/firebase_app.dart b/packages/firebase_core/lib/src/firebase_app.dart deleted file mode 100644 index f5b5069f8aec..000000000000 --- a/packages/firebase_core/lib/src/firebase_app.dart +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_core; - -class FirebaseApp { - @visibleForTesting - const FirebaseApp({@required this.name}) : assert(name != null); - - /// The name of this app. - final String name; - - static final String defaultAppName = - Platform.isIOS ? '__FIRAPP_DEFAULT' : '[DEFAULT]'; - - @visibleForTesting - static const MethodChannel channel = MethodChannel( - 'plugins.flutter.io/firebase_core', - ); - - /// A copy of the options for this app. These are non-modifiable. - /// - /// This getter is asynchronous because apps can also be configured by native - /// code. - Future get options async { - final Map app = - await channel.invokeMapMethod( - 'FirebaseApp#appNamed', - name, - ); - assert(app != null); - return FirebaseOptions.from(app['options']); - } - - /// Returns a previously created FirebaseApp instance with the given name, - /// or null if no such app exists. - static Future appNamed(String name) async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final Map app = - await channel.invokeMapMethod( - 'FirebaseApp#appNamed', - name, - ); - return app == null ? null : FirebaseApp(name: app['name']); - } - - /// Returns the default (first initialized) instance of the FirebaseApp. - static final FirebaseApp instance = FirebaseApp(name: defaultAppName); - - /// Configures an app with the given [name] and [options]. - /// - /// Configuring the default app is not currently supported. Plugins that - /// can interact with the default app should configure it automatically at - /// plugin registration time. - /// - /// Changing the options of a configured app is not supported. - static Future configure({ - @required String name, - @required FirebaseOptions options, - }) async { - assert(name != null); - assert(name != defaultAppName); - assert(options != null); - assert(options.googleAppID != null); - final FirebaseApp existingApp = await FirebaseApp.appNamed(name); - if (existingApp != null) { - return existingApp; - } - await channel.invokeMethod( - 'FirebaseApp#configure', - {'name': name, 'options': options.asMap}, - ); - return FirebaseApp(name: name); - } - - /// Returns a list of all extant FirebaseApp instances, or null if there are - /// no FirebaseApp instances. - static Future> allApps() async { - final List result = await channel.invokeListMethod( - 'FirebaseApp#allApps', - ); - return result - ?.map( - (dynamic app) => FirebaseApp(name: app['name']), - ) - ?.toList(); - } - - @override - bool operator ==(dynamic other) { - if (identical(this, other)) return true; - if (other is! FirebaseApp) return false; - return other.name == name; - } - - @override - int get hashCode => name.hashCode; - - @override - String toString() => '$FirebaseApp($name)'; -} diff --git a/packages/firebase_core/lib/src/firebase_options.dart b/packages/firebase_core/lib/src/firebase_options.dart deleted file mode 100644 index 33aea5ced5b6..000000000000 --- a/packages/firebase_core/lib/src/firebase_options.dart +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_core; - -class FirebaseOptions { - const FirebaseOptions({ - this.apiKey, - this.bundleID, - this.clientID, - this.trackingID, - this.gcmSenderID, - this.projectID, - this.androidClientID, - @required this.googleAppID, - this.databaseURL, - this.deepLinkURLScheme, - this.storageBucket, - }) : assert(googleAppID != null); - - @visibleForTesting - FirebaseOptions.from(Map map) - : apiKey = map['APIKey'], - bundleID = map['bundleID'], - clientID = map['clientID'], - trackingID = map['trackingID'], - gcmSenderID = map['GCMSenderID'], - projectID = map['projectID'], - androidClientID = map['androidClientID'], - googleAppID = map['googleAppID'], - databaseURL = map['databaseURL'], - deepLinkURLScheme = map['deepLinkURLScheme'], - storageBucket = map['storageBucket'] { - assert(googleAppID != null); - } - - /// An API key used for authenticating requests from your app, e.g. - /// "AIzaSyDdVgKwhZl0sTTTLZ7iTmt1r3N2cJLnaDk", used to identify your app to - /// Google servers. - /// - /// This property is required on Android. - final String apiKey; - - /// The iOS bundle ID for the application. Defaults to - /// `[[NSBundle mainBundle] bundleID]` when not set manually or in a plist. - /// - /// This property is used on iOS only. - final String bundleID; - - /// The OAuth2 client ID for iOS application used to authenticate Google - /// users, for example "12345.apps.googleusercontent.com", used for signing in - /// with Google. - /// - /// This property is used on iOS only. - final String clientID; - - /// The tracking ID for Google Analytics, e.g. "UA-12345678-1", used to - /// configure Google Analytics. - /// - /// This property is used on iOS only. - final String trackingID; - - /// The Project Number from the Google Developer’s console, for example - /// "012345678901", used to configure Google Cloud Messaging. - /// - /// This property is required on iOS. - final String gcmSenderID; - - /// The Project ID from the Firebase console, for example "abc-xyz-123." - final String projectID; - - /// The Android client ID, for example "12345.apps.googleusercontent.com." - /// - /// This property is used on iOS only. - final String androidClientID; - - /// The Google App ID that is used to uniquely identify an instance of an app. - /// - /// This property cannot be `null`. - final String googleAppID; - - /// The database root URL, e.g. "http://abc-xyz-123.firebaseio.com." - /// - /// This property should be set for apps that use Firebase Database. - final String databaseURL; - - /// The URL scheme used to set up Durable Deep Link service. - /// - /// This property is used on iOS only. - final String deepLinkURLScheme; - - /// The Google Cloud Storage bucket name, e.g. - /// "abc-xyz-123.storage.firebase.com." - final String storageBucket; - - @visibleForTesting - Map get asMap { - return { - 'APIKey': apiKey, - 'bundleID': bundleID, - 'clientID': clientID, - 'trackingID': trackingID, - 'GCMSenderID': gcmSenderID, - 'projectID': projectID, - 'androidClientID': androidClientID, - 'googleAppID': googleAppID, - 'databaseURL': databaseURL, - 'deepLinkURLScheme': deepLinkURLScheme, - 'storageBucket': storageBucket, - }; - } - - @override - bool operator ==(dynamic other) { - if (identical(this, other)) return true; - if (other is! FirebaseOptions) return false; - return other.apiKey == apiKey && - other.bundleID == bundleID && - other.clientID == clientID && - other.trackingID == trackingID && - other.gcmSenderID == gcmSenderID && - other.projectID == projectID && - other.androidClientID == androidClientID && - other.googleAppID == googleAppID && - other.databaseURL == databaseURL && - other.deepLinkURLScheme == deepLinkURLScheme && - other.storageBucket == storageBucket; - } - - @override - int get hashCode { - return hashValues( - apiKey, - bundleID, - clientID, - trackingID, - gcmSenderID, - projectID, - androidClientID, - googleAppID, - databaseURL, - deepLinkURLScheme, - storageBucket, - ); - } - - @override - String toString() => asMap.toString(); -} diff --git a/packages/firebase_core/pubspec.yaml b/packages/firebase_core/pubspec.yaml deleted file mode 100644 index aa8f37e26ba1..000000000000 --- a/packages/firebase_core/pubspec.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: firebase_core -description: Flutter plugin for Firebase Core, enabling connecting to multiple - Firebase apps. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_core -version: 0.4.0+8 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.core - iosPrefix: FLT - pluginClass: FirebaseCorePlugin - -dependencies: - flutter: - sdk: flutter - meta: "^1.0.5" - -dev_dependencies: - flutter_test: - sdk: flutter - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_core/test/firebase_core_test.dart b/packages/firebase_core/test/firebase_core_test.dart deleted file mode 100755 index d09a8c99629d..000000000000 --- a/packages/firebase_core/test/firebase_core_test.dart +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$FirebaseApp', () { - final List log = []; - const FirebaseApp testApp = FirebaseApp( - name: 'testApp', - ); - const FirebaseOptions testOptions = FirebaseOptions( - apiKey: 'testAPIKey', - bundleID: 'testBundleID', - clientID: 'testClientID', - trackingID: 'testTrackingID', - gcmSenderID: 'testGCMSenderID', - projectID: 'testProjectID', - androidClientID: 'testAndroidClientID', - googleAppID: 'testGoogleAppID', - databaseURL: 'testDatabaseURL', - deepLinkURLScheme: 'testDeepLinkURLScheme', - storageBucket: 'testStorageBucket', - ); - - setUp(() async { - FirebaseApp.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'FirebaseApp#appNamed': - if (methodCall.arguments != 'testApp') return null; - return { - 'name': 'testApp', - 'options': { - 'APIKey': 'testAPIKey', - 'bundleID': 'testBundleID', - 'clientID': 'testClientID', - 'trackingID': 'testTrackingID', - 'GCMSenderID': 'testGCMSenderID', - 'projectID': 'testProjectID', - 'androidClientID': 'testAndroidClientID', - 'googleAppID': 'testGoogleAppID', - 'databaseURL': 'testDatabaseURL', - 'deepLinkURLScheme': 'testDeepLinkURLScheme', - 'storageBucket': 'testStorageBucket', - }, - }; - case 'FirebaseApp#allApps': - return >[ - { - 'name': 'testApp', - }, - ]; - default: - return null; - } - }); - log.clear(); - }); - - test('configure', () async { - final FirebaseApp reconfiguredApp = await FirebaseApp.configure( - name: 'testApp', - options: testOptions, - ); - expect(reconfiguredApp, equals(testApp)); - final FirebaseApp newApp = await FirebaseApp.configure( - name: 'newApp', - options: testOptions, - ); - expect(newApp.name, equals('newApp')); - expect( - log, - [ - isMethodCall( - 'FirebaseApp#appNamed', - arguments: 'testApp', - ), - isMethodCall( - 'FirebaseApp#appNamed', - arguments: 'newApp', - ), - isMethodCall( - 'FirebaseApp#configure', - arguments: { - 'name': 'newApp', - 'options': testOptions.asMap, - }, - ), - ], - ); - }); - - test('appNamed', () async { - final FirebaseApp existingApp = await FirebaseApp.appNamed('testApp'); - expect(existingApp.name, equals('testApp')); - expect((await existingApp.options), equals(testOptions)); - final FirebaseApp missingApp = await FirebaseApp.appNamed('missingApp'); - expect(missingApp, isNull); - expect( - log, - [ - isMethodCall( - 'FirebaseApp#appNamed', - arguments: 'testApp', - ), - isMethodCall( - 'FirebaseApp#appNamed', - arguments: 'testApp', - ), - isMethodCall( - 'FirebaseApp#appNamed', - arguments: 'missingApp', - ), - ], - ); - }); - - test('allApps', () async { - final List allApps = await FirebaseApp.allApps(); - expect(allApps, equals([testApp])); - expect( - log, - [ - isMethodCall( - 'FirebaseApp#allApps', - arguments: null, - ), - ], - ); - }); - }); -} diff --git a/packages/firebase_crashlytics/.gitignore b/packages/firebase_crashlytics/.gitignore deleted file mode 100644 index 2ece5a414cb5..000000000000 --- a/packages/firebase_crashlytics/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.DS_Store -.dart_tool/ - -.packages -.pub/ -pubspec.lock - -build/ - -ios/Classes/UserAgent.h - diff --git a/packages/firebase_crashlytics/.metadata b/packages/firebase_crashlytics/.metadata deleted file mode 100644 index fbc1f3952e5d..000000000000 --- a/packages/firebase_crashlytics/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# 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: 5391447fae6209bb21a89e6a5a6583cac1af9b4b - channel: beta - -project_type: plugin diff --git a/packages/firebase_crashlytics/CHANGELOG.md b/packages/firebase_crashlytics/CHANGELOG.md deleted file mode 100644 index 6b85c00fea17..000000000000 --- a/packages/firebase_crashlytics/CHANGELOG.md +++ /dev/null @@ -1,94 +0,0 @@ -## 0.1.0+2 - -* [iOS] Fixes crash when trying to report a crash without any context - -## 0.1.0+1 - -* Added additional exception information from the Flutter framework to the reports. -* Refactored debug printing of exceptions to be human-readable. -* Passing `null` stack traces is now supported. -* Added the "Error reported to Crashlytics." print statement that was previously missing. -* Updated `README.md` to include both the breaking change from `0.1.0` and the newly added - `recordError` function in the setup section. -* Adjusted `README.md` formatting. -* Fixed `recordFlutterError` method name in the `0.1.0` changelog entry. - -## 0.1.0 - -* **Breaking Change** Renamed `onError` to `recordFlutterError`. -* Added `recordError` method for errors caught using `runZoned`'s `onError`. - -## 0.0.4+12 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.0.4+11 - -* Fixed an issue where `Crashlytics#getStackTraceElements` didn't handle functions without classes. - -## 0.0.4+10 - -* Update README. - -## 0.0.4+9 - -* Fixed custom keys implementation. -* Added tests for custom keys implementation. -* Removed a print statement. - -## 0.0.4+8 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.0.4+7 - -* Fixed an issue where `Crashlytics#setUserIdentifier` incorrectly called `setUserEmail` on iOS. - -## 0.0.4+6 - -* On Android, use actual the Dart exception name instead of "Dart error." - -## 0.0.4+5 - -* Fix parsing stacktrace. - -## 0.0.4+4 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. - -## 0.0.4+3 - -* Migrate our handling of `FlutterErrorDetails` to work on both Flutter stable - and master. - -## 0.0.4+2 - -* Keep debug log formatting. - -## 0.0.4+1 - -* Added an integration test. - -## 0.0.4 - -* Initialize Fabric automatically, preventing crashes that could occur when setting user data. - -## 0.0.3 - -* Rely on firebase_core to add the Android dependency on Firebase instead of hardcoding the version ourselves. - -## 0.0.2+1 - -* Update variable name `enableInDevMode` in README. - -## 0.0.2 - -* Updated the iOS podspec to a static framework to support compatibility with Swift plugins. -* Updated the Android gradle dependencies to prevent build errors. - -## 0.0.1 - -* Initial release of Firebase Crashlytics plugin. -This version reports uncaught errors as non-fatal exceptions in the -Firebase console. diff --git a/packages/firebase_crashlytics/LICENSE b/packages/firebase_crashlytics/LICENSE deleted file mode 100644 index 03118dc2b39b..000000000000 --- a/packages/firebase_crashlytics/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2019 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_crashlytics/README.md b/packages/firebase_crashlytics/README.md deleted file mode 100644 index 9f3980a0d16b..000000000000 --- a/packages/firebase_crashlytics/README.md +++ /dev/null @@ -1,128 +0,0 @@ -# firebase_crashlytics plugin - -A Flutter plugin to use the [Firebase Crashlytics Service](https://firebase.google.com/docs/crashlytics/). - -[![pub package](https://img.shields.io/pub/v/firebase_crashlytics.svg)](https://pub.dartlang.org/packages/firebase_crashlytics) - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -### Import the firebase_crashlytics plugin - -To use the `firebase_crashlytics` plugin, follow the [plugin installation instructions](https://pub.dartlang.org/packages/firebase_crashlytics#pub-pkg-tab-installing). - -### Android integration - -Enable the Google services by configuring the Gradle scripts as such: - -1. Add the Fabric repository to the `[project]/android/build.gradle` file. -``` -repositories { - google() - jcenter() - // Additional repository for fabric resources - maven { - url 'https://maven.fabric.io/public' - } -} -``` - -2. Add the following classpaths to the `[project]/android/build.gradle` file. -```gradle -dependencies { - // Example existing classpath - classpath 'com.android.tools.build:gradle:3.2.1' - // Add the google services classpath - classpath 'com.google.gms:google-services:4.3.0' - // Add fabric classpath - classpath 'io.fabric.tools:gradle:1.26.1' -} -``` - -2. Apply the following plugins in the `[project]/android/app/build.gradle` file. -```gradle -// ADD THIS AT THE BOTTOM -apply plugin: 'io.fabric' -apply plugin: 'com.google.gms.google-services' -``` - -*Note:* If this section is not completed, you will get an error like this: -``` -java.lang.IllegalStateException: -Default FirebaseApp is not initialized in this process [package name]. -Make sure to call FirebaseApp.initializeApp(Context) first. -``` - -*Note:* When you are debugging on Android, use a device or AVD with Google Play services. -Otherwise, you will not be able to use Firebase Crashlytics. - -### iOS Integration - -Add the Crashlytics run scripts: - -1. From Xcode select `Runner` from the project navigation. -1. Select the `Build Phases` tab. -1. Click `+ Add a new build phase`, and select `New Run Script Phase`. -1. Add `${PODS_ROOT}/Fabric/run` to the `Type a script...` text box. -1. If you are using Xcode 10, add the location of `Info.plist`, built by your app, to the `Build Phase's Input Files` field. - E.g.: `$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)` - -### Use the plugin - -Add the following imports to your Dart code: -```dart -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -``` - -Setup `Crashlytics`: -```dart -void main() { - // Set `enableInDevMode` to true to see reports while in debug mode - // This is only to be used for confirming that reports are being - // submitted as expected. It is not intended to be used for everyday - // development. - Crashlytics.instance.enableInDevMode = true; - - // Pass all uncaught errors from the framework to Crashlytics. - FlutterError.onError = Crashlytics.instance.recordFlutterError; - - runApp(MyApp()); -} -``` - -Overriding `FlutterError.onError` with `Crashlytics.instance.recordFlutterError` will automatically catch all -errors that are thrown from within the Flutter framework. -If you want to catch errors that occur in `runZoned`, -you can supply `Crashlytics.instance.recordError` to the `onError` parameter: -```dart -runZoned>(() async { - // ... - }, onError: Crashlytics.instance.recordError); -``` - -## Result - -If an error is caught, you should see the following messages in your logs: -``` -flutter: Flutter error caught by Crashlytics plugin: -// OR if you use recordError for runZoned: -flutter: Error caught by Crashlytics plugin : -// Exception, context, information, and stack trace in debug mode -// OR if not in debug mode: -flutter: Error reported to Crashlytics. -``` - -*Note:* It may take awhile (up to 24 hours) before you will be able to see the logs appear in your Firebase console. - -## Example - -See the [example application](https://github.com/flutter/plugins/tree/master/packages/firebase_crashlytics/example) source -for a complete sample app using `firebase_crashlytics`. - -## Issues and feedback - -Please file [issues](https://github.com/flutter/flutter/issues/new) -to send feedback or report a bug. Thank you! diff --git a/packages/firebase_crashlytics/android/.gitignore b/packages/firebase_crashlytics/android/.gitignore deleted file mode 100644 index c6cbe562a427..000000000000 --- a/packages/firebase_crashlytics/android/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures diff --git a/packages/firebase_crashlytics/android/build.gradle b/packages/firebase_crashlytics/android/build.gradle deleted file mode 100644 index 4e8fe907794c..000000000000 --- a/packages/firebase_crashlytics/android/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -group 'io.flutter.plugins.firebase.crashlytics.firebasecrashlytics' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - maven { - url 'https://maven.fabric.io/public' - } - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } -} - -dependencies { - implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9' - implementation 'com.google.firebase:firebase-common:16.1.0' -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_crashlytics/android/gradle.properties b/packages/firebase_crashlytics/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_crashlytics/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_crashlytics/android/settings.gradle b/packages/firebase_crashlytics/android/settings.gradle deleted file mode 100644 index 0db0f63e40fd..000000000000 --- a/packages/firebase_crashlytics/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_crashlytics' diff --git a/packages/firebase_crashlytics/android/src/main/AndroidManifest.xml b/packages/firebase_crashlytics/android/src/main/AndroidManifest.xml deleted file mode 100644 index 535d778d3920..000000000000 --- a/packages/firebase_crashlytics/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java deleted file mode 100644 index 0c3edff9991f..000000000000 --- a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.crashlytics.firebasecrashlytics; - -import android.util.Log; -import com.crashlytics.android.Crashlytics; -import io.fabric.sdk.android.Fabric; -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.plugin.common.PluginRegistry.Registrar; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** FirebaseCrashlyticsPlugin */ -public class FirebaseCrashlyticsPlugin implements MethodCallHandler { - - public static final String TAG = "CrashlyticsPlugin"; - - /** Plugin registration. */ - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_crashlytics"); - channel.setMethodCallHandler(new FirebaseCrashlyticsPlugin()); - - if (!Fabric.isInitialized()) { - Fabric.with(registrar.context(), new Crashlytics()); - } - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("Crashlytics#onError")) { - // Add logs. - List logs = call.argument("logs"); - for (String log : logs) { - Crashlytics.log(log); - } - - // Set keys. - List> keys = call.argument("keys"); - for (Map key : keys) { - switch ((String) key.get("type")) { - case "int": - Crashlytics.setInt((String) key.get("key"), (int) key.get("value")); - break; - case "double": - Crashlytics.setDouble((String) key.get("key"), (double) key.get("value")); - break; - case "string": - Crashlytics.setString((String) key.get("key"), (String) key.get("value")); - break; - case "boolean": - Crashlytics.setBool((String) key.get("key"), (boolean) key.get("value")); - break; - } - } - - // Report crash. - String dartExceptionMessage = (String) call.argument("exception"); - Exception exception = new Exception(dartExceptionMessage); - List> errorElements = call.argument("stackTraceElements"); - List elements = new ArrayList<>(); - for (Map errorElement : errorElements) { - StackTraceElement stackTraceElement = generateStackTraceElement(errorElement); - if (stackTraceElement != null) { - elements.add(stackTraceElement); - } - } - exception.setStackTrace(elements.toArray(new StackTraceElement[elements.size()])); - - Crashlytics.setString("exception", (String) call.argument("exception")); - - // Set a "reason" (to match iOS) to show where the exception was thrown. - final String context = call.argument("context"); - if (context != null) Crashlytics.setString("reason", "thrown " + context); - - // Log information. - final String information = call.argument("information"); - if (information != null && !information.isEmpty()) Crashlytics.log(information); - - Crashlytics.logException(exception); - result.success("Error reported to Crashlytics."); - } else if (call.method.equals("Crashlytics#isDebuggable")) { - result.success(Fabric.isDebuggable()); - } else if (call.method.equals("Crashlytics#getVersion")) { - result.success(Crashlytics.getInstance().getVersion()); - } else if (call.method.equals("Crashlytics#setUserEmail")) { - Crashlytics.setUserEmail((String) call.argument("email")); - result.success(null); - } else if (call.method.equals("Crashlytics#setUserIdentifier")) { - Crashlytics.setUserIdentifier((String) call.argument("identifier")); - result.success(null); - } else if (call.method.equals("Crashlytics#setUserName")) { - Crashlytics.setUserName((String) call.argument("name")); - result.success(null); - } else { - result.notImplemented(); - } - } - - /** - * Extract StackTraceElement from Dart stack trace element. - * - * @param errorElement Map representing the parts of a Dart error. - * @return Stack trace element to be used as part of an Exception stack trace. - */ - private StackTraceElement generateStackTraceElement(Map errorElement) { - try { - String fileName = errorElement.get("file"); - String lineNumber = errorElement.get("line"); - String className = errorElement.get("class"); - String methodName = errorElement.get("method"); - - return new StackTraceElement( - className == null ? "" : className, methodName, fileName, Integer.parseInt(lineNumber)); - } catch (Exception e) { - Log.e(TAG, "Unable to generate stack trace element from Dart side error."); - return null; - } - } -} diff --git a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index fdcf9d6b6737..000000000000 --- a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.crashlytics.firebasecrashlytics; - -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; - -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_crashlytics/android/user-agent.gradle b/packages/firebase_crashlytics/android/user-agent.gradle deleted file mode 100644 index e947d9605bb6..000000000000 --- a/packages/firebase_crashlytics/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-cls" -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_crashlytics/example/.gitignore b/packages/firebase_crashlytics/example/.gitignore deleted file mode 100644 index 47e0b4d62146..000000000000 --- a/packages/firebase_crashlytics/example/.gitignore +++ /dev/null @@ -1,71 +0,0 @@ -# Miscellaneous -*.class -*.lock -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# Visual Studio Code related -.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.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/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/packages/firebase_crashlytics/example/.metadata b/packages/firebase_crashlytics/example/.metadata deleted file mode 100644 index fd2a86fddab1..000000000000 --- a/packages/firebase_crashlytics/example/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# 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: 5391447fae6209bb21a89e6a5a6583cac1af9b4b - channel: beta - -project_type: app diff --git a/packages/firebase_crashlytics/example/README.md b/packages/firebase_crashlytics/example/README.md deleted file mode 100644 index 6b284ab319b7..000000000000 --- a/packages/firebase_crashlytics/example/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# firebase_crashlytics_example - -Demonstrates how to use the firebase_crashlytics plugin. - -## Getting Started - -### Add your own Firebase project - -This example initially uses a default project for CI purposes. You must -replace the default project with your own so that you can review the error -reports submitted to the Firebase console. - -See [docs](https://firebase.google.com/docs/flutter/setup) for how to add -Firebase to a Flutter project. - -For further help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_crashlytics/example/android/app/build.gradle b/packages/firebase_crashlytics/example/android/app/build.gradle deleted file mode 100644 index 3811065ae4d4..000000000000 --- a/packages/firebase_crashlytics/example/android/app/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -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 27 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "io.flutter.plugins.firebase.crashlytics.firebasecrashlyticsexample" - minSdkVersion 16 - targetSdkVersion 27 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { -} - -apply plugin: 'io.fabric' -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_crashlytics/example/android/app/google-services.json b/packages/firebase_crashlytics/example/android/app/google-services.json deleted file mode 100644 index 4f8ed237b31b..000000000000 --- a/packages/firebase_crashlytics/example/android/app/google-services.json +++ /dev/null @@ -1,545 +0,0 @@ -{ - "project_info": { - "project_number": "380450695418", - "firebase_url": "https://fir-for-flutter-xry.firebaseio.com", - "project_id": "firebase-for-flutter-xry", - "storage_bucket": "firebase-for-flutter-xry.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:df22ebedafef81e5", - "android_client_info": { - "package_name": "com.example.myapp" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:c1f0f09aa42eba16", - "android_client_info": { - "package_name": "com.google.firebase.example.fireeats" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-680tdukm5lmsvqdgfjf35oooapesp5qe.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.google.firebase.example.fireeats", - "certificate_hash": "13b46061adbac6fccea79893f1eeff8f94b17318" - } - }, - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "380450695418-j9bquuvdhv7iimnca4n7mhrp9a0kv9un.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:cdde97911ac112a2", - "android_client_info": { - "package_name": "com.google.firehunt" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-56dso58q89k1u1g4jr2csjvu0t0s5sah.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.google.firehunt", - "certificate_hash": "13b46061adbac6fccea79893f1eeff8f94b17318" - } - }, - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "380450695418-j9bquuvdhv7iimnca4n7mhrp9a0kv9un.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:66cfa0cc55000185", - "android_client_info": { - "package_name": "io.flutter.plugins.crashlytics.crashlyticsexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:7521d73664dc56fc", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.cloudfunctions.cloudfunctionsexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:534a419926d9c345", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.crashlytics.firebasecrashlyticsexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:b46d52db5a4d815e", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firebaseremoteconfig" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:6ef94ae486218531", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firebaseremoteconfigexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:236f9daea101f77e", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-s5i0ce3nvtebsqc43fdjq7rub7m5kl52.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample", - "certificate_hash": "1da568611fe7dcfeafc0f35ad42f585c0a32012d" - } - }, - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "380450695418-j9bquuvdhv7iimnca4n7mhrp9a0kv9un.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:faccb3c5e155ce04", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.mlkit.firebasemlkitexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:11e8f037a4a3ec3b", - "android_client_info": { - "package_name": "io.flutter.plugins.firebaseauthexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-1r77qvo64360tkatfaimd7jsge6ookui.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseauthexample", - "certificate_hash": "13b46061adbac6fccea79893f1eeff8f94b17318" - } - }, - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "380450695418-j9bquuvdhv7iimnca4n7mhrp9a0kv9un.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:c68d3ad04a4046db", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasedatabaseexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-nva3tg4js1gmdrm0egas2dlbj3go6nsk.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebasedatabaseexample", - "certificate_hash": "1da568611fe7dcfeafc0f35ad42f585c0a32012d" - } - }, - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "380450695418-j9bquuvdhv7iimnca4n7mhrp9a0kv9un.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:620f0e4ca16cbddd", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasemessagingexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:380450695418:android:ef48439a0cc0263d", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasestorageexample" - } - }, - "oauth_client": [ - { - "client_id": "380450695418-17gd38vnvfrt9ak76bfdeu4jsb0h6is5.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD-qW3X8rktjbW3BPEX8KlpqYNCUdlTtGQ" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_crashlytics/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_crashlytics/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 0c7d86680639..000000000000 --- a/packages/firebase_crashlytics/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_crashlytics/example/android/app/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlyticsexample/MainActivity.java b/packages/firebase_crashlytics/example/android/app/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlyticsexample/MainActivity.java deleted file mode 100644 index e70d93f30b57..000000000000 --- a/packages/firebase_crashlytics/example/android/app/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlyticsexample/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.firebase.crashlytics.firebasecrashlyticsexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_crashlytics/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_crashlytics/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/firebase_crashlytics/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_crashlytics/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_crashlytics/example/android/app/src/main/res/values/styles.xml b/packages/firebase_crashlytics/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/firebase_crashlytics/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/firebase_crashlytics/example/android/build.gradle b/packages/firebase_crashlytics/example/android/build.gradle deleted file mode 100644 index faeab902b866..000000000000 --- a/packages/firebase_crashlytics/example/android/build.gradle +++ /dev/null @@ -1,34 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - maven { - url 'https://maven.fabric.io/public' - } - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' - classpath 'com.google.gms:google-services:4.3.0' - classpath 'io.fabric.tools:gradle:1.26.1' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_crashlytics/example/android/gradle.properties b/packages/firebase_crashlytics/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_crashlytics/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_crashlytics/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_crashlytics/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f1fd..000000000000 --- a/packages/firebase_crashlytics/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#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-4.10.2-all.zip diff --git a/packages/firebase_crashlytics/example/android/settings.gradle b/packages/firebase_crashlytics/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/firebase_crashlytics/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_crashlytics/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_crashlytics/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 9367d483e44e..000000000000 --- a/packages/firebase_crashlytics/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_crashlytics/example/ios/Flutter/Debug.xcconfig b/packages/firebase_crashlytics/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_crashlytics/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_crashlytics/example/ios/Flutter/Release.xcconfig b/packages/firebase_crashlytics/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_crashlytics/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_crashlytics/example/ios/GoogleService-Info.plist b/packages/firebase_crashlytics/example/ios/GoogleService-Info.plist deleted file mode 100644 index c9c6c3ae12aa..000000000000 --- a/packages/firebase_crashlytics/example/ios/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 380450695418-j9bquuvdhv7iimnca4n7mhrp9a0kv9un.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.380450695418-j9bquuvdhv7iimnca4n7mhrp9a0kv9un - API_KEY - AIzaSyDKzrI_W_MaUt46jthsPB7FTG-RdSKeKEw - GCM_SENDER_ID - 380450695418 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample - PROJECT_ID - firebase-for-flutter-xry - STORAGE_BUCKET - firebase-for-flutter-xry.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:380450695418:ios:2693ad5ab6a23cde - DATABASE_URL - https://fir-for-flutter-xry.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 40c572dde0ed..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,605 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 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 */; }; - C402FAF4F184B60574825BEF /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C402FD7E9DA6F279205D8C27 /* GoogleService-Info.plist */; }; - F3CD36E5DA207BF24A9BECE5 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 90669E7218FC80716B8D1896 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; - 3483EF1253077C699E331BE4 /* 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 = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 76260442B9364E9433AC028C /* 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 = ""; }; - 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 = ""; }; - 90669E7218FC80716B8D1896 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - C402FD7E9DA6F279205D8C27 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.info; path = "GoogleService-Info.plist"; sourceTree = ""; }; - D14C8104C6F6DBC16421D2F4 /* 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 = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - F3CD36E5DA207BF24A9BECE5 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 578F13DB49C24452CA02A630 /* Pods */ = { - isa = PBXGroup; - children = ( - 76260442B9364E9433AC028C /* Pods-Runner.debug.xcconfig */, - D14C8104C6F6DBC16421D2F4 /* Pods-Runner.release.xcconfig */, - 3483EF1253077C699E331BE4 /* Pods-Runner.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 9278C72542532A6D4853596F /* Frameworks */ = { - isa = PBXGroup; - children = ( - 90669E7218FC80716B8D1896 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 578F13DB49C24452CA02A630 /* Pods */, - 9278C72542532A6D4853596F /* Frameworks */, - C402FD7E9DA6F279205D8C27 /* GoogleService-Info.plist */, - ); - 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 = ( - FF93E33FF58D2AD673D0393E /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 048FD65633588382F9E468AC /* [CP] Embed Pods Frameworks */, - 324E062721E4156B000CBB4D /* ShellScript */, - ); - 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 = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - C402FAF4F184B60574825BEF /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 048FD65633588382F9E468AC /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - ); - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 324E062721E4156B000CBB4D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/newInputFile", - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${PODS_ROOT}/Fabric/run\"\n"; - }; - 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\" 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\n"; - }; - FF93E33FF58D2AD673D0393E /* [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 */ - 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; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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)"; - DEVELOPMENT_TEAM = S8QB4VV633; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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)"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample; - 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; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.crashlytics.firebaseCrashlyticsExample; - 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_crashlytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index ec99067959e0..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d68..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index 949b67898200..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - BuildSystemType - Original - - diff --git a/packages/firebase_crashlytics/example/ios/Runner/AppDelegate.h b/packages/firebase_crashlytics/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_crashlytics/example/ios/Runner/AppDelegate.m b/packages/firebase_crashlytics/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d9d..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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_crashlytics/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_crashlytics/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_crashlytics/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_crashlytics/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_crashlytics/example/ios/Runner/Info.plist b/packages/firebase_crashlytics/example/ios/Runner/Info.plist deleted file mode 100644 index 0f5908f87367..000000000000 --- a/packages/firebase_crashlytics/example/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_crashlytics_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_crashlytics/example/ios/Runner/main.m b/packages/firebase_crashlytics/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_crashlytics/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_crashlytics/example/lib/main.dart b/packages/firebase_crashlytics/example/lib/main.dart deleted file mode 100644 index f13881facfc6..000000000000 --- a/packages/firebase_crashlytics/example/lib/main.dart +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; - -void main() { - // Set `enableInDevMode` to true to see reports while in debug mode - // This is only to be used for confirming that reports are being - // submitted as expected. It is not intended to be used for everyday - // development. - Crashlytics.instance.enableInDevMode = true; - - // Pass all uncaught errors to Crashlytics. - FlutterError.onError = Crashlytics.instance.recordFlutterError; - - runZoned>(() async { - runApp(MyApp()); - }, onError: Crashlytics.instance.recordError); -} - -class MyApp extends StatefulWidget { - @override - _MyAppState createState() => _MyAppState(); -} - -class _MyAppState extends State { - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Crashlytics example app'), - ), - body: Center( - child: Column( - children: [ - FlatButton( - child: const Text('Key'), - onPressed: () { - Crashlytics.instance.setString('foo', 'bar'); - }), - FlatButton( - child: const Text('Log'), - onPressed: () { - Crashlytics.instance.log('baz'); - }), - FlatButton( - child: const Text('Crash'), - onPressed: () { - // Use Crashlytics to throw an error. Use this for - // confirmation that errors are being correctly reported. - Crashlytics.instance.crash(); - }), - FlatButton( - child: const Text('Throw Error'), - onPressed: () { - // Example of thrown error, it will be caught and sent to - // Crashlytics. - throw StateError('Uncaught error thrown by app.'); - }), - FlatButton( - child: const Text('Async out of bounds'), - onPressed: () { - // Example of an exception that does not get caught - // by `FlutterError.onError` but is caught by the `onError` handler of - // `runZoned`. - Future.delayed(Duration(seconds: 2), () { - final List list = []; - print(list[100]); - }); - }), - ], - ), - ), - ), - ); - } -} diff --git a/packages/firebase_crashlytics/example/pubspec.yaml b/packages/firebase_crashlytics/example/pubspec.yaml deleted file mode 100644 index 8a12ba4d4bd6..000000000000 --- a/packages/firebase_crashlytics/example/pubspec.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: firebase_crashlytics_example -description: Demonstrates how to use the firebase_crashlytics plugin. - -environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - - cupertino_icons: ^0.1.2 - - firebase_crashlytics: - path: ../ - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - -flutter: - uses-material-design: true diff --git a/packages/firebase_crashlytics/example/test_driver/crashlytics.dart b/packages/firebase_crashlytics/example/test_driver/crashlytics.dart deleted file mode 100644 index 2cd26d0a1612..000000000000 --- a/packages/firebase_crashlytics/example/test_driver/crashlytics.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2019, 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'; - -import 'package:flutter/widgets.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; - -void main() { - final Completer allTestsCompleter = Completer(); - enableFlutterDriverExtension(handler: (_) => allTestsCompleter.future); - tearDownAll(() => allTestsCompleter.complete(null)); - - test('recordFlutterError', () async { - // This is currently only testing that we can log errors without crashing. - final Crashlytics crashlytics = Crashlytics.instance; - await crashlytics.setUserName('testing'); - await crashlytics.setUserIdentifier('hello'); - crashlytics.setBool('testBool', true); - crashlytics.setInt('testInt', 42); - crashlytics.setDouble('testDouble', 42.0); - crashlytics.setString('testString', 'bar'); - Crashlytics.instance.log('testing'); - await crashlytics.recordFlutterError(FlutterErrorDetails( - exception: 'testing', - stack: StackTrace.fromString(''), - context: DiagnosticsNode.message('during testing'), - informationCollector: () => [ - DiagnosticsNode.message('testing'), - DiagnosticsNode.message('information'), - ])); - }); -} diff --git a/packages/firebase_crashlytics/example/test_driver/crashlytics_test.dart b/packages/firebase_crashlytics/example/test_driver/crashlytics_test.dart deleted file mode 100644 index b0d3305cd652..000000000000 --- a/packages/firebase_crashlytics/example/test_driver/crashlytics_test.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019, 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'; - -import 'package:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_crashlytics/ios/.gitignore b/packages/firebase_crashlytics/ios/.gitignore deleted file mode 100644 index 710ec6cf1c71..000000000000 --- a/packages/firebase_crashlytics/ios/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -.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 diff --git a/packages/firebase_crashlytics/ios/Assets/.gitkeep b/packages/firebase_crashlytics/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h b/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h deleted file mode 100644 index c0b268534401..000000000000 --- a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface FirebaseCrashlyticsPlugin : NSObject -@end diff --git a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m b/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m deleted file mode 100644 index 01f233cbd347..000000000000 --- a/packages/firebase_crashlytics/ios/Classes/FirebaseCrashlyticsPlugin.m +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseCrashlyticsPlugin.h" -#import "UserAgent.h" - -#import - -@interface FirebaseCrashlyticsPlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FirebaseCrashlyticsPlugin -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_crashlytics" - binaryMessenger:[registrar messenger]]; - FirebaseCrashlyticsPlugin *instance = [[FirebaseCrashlyticsPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; - - [Fabric with:@[ [Crashlytics self] ]]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp defaultApp]) { - [FIRApp configure]; - } - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"Crashlytics#onError" isEqualToString:call.method]) { - // Add logs. - NSArray *logs = call.arguments[@"logs"]; - for (NSString *log in logs) { - CLS_LOG(@"%@", log); - } - - // Set keys. - NSArray *keys = call.arguments[@"keys"]; - for (NSDictionary *key in keys) { - if ([@"int" isEqualToString:key[@"type"]]) { - [[Crashlytics sharedInstance] setIntValue:(int)call.arguments[@"value"] - forKey:call.arguments[@"key"]]; - } else if ([@"double" isEqualToString:key[@"type"]]) { - [[Crashlytics sharedInstance] setFloatValue:[call.arguments[@"value"] floatValue] - forKey:call.arguments[@"key"]]; - } else if ([@"string" isEqualToString:key[@"type"]]) { - [[Crashlytics sharedInstance] setObjectValue:call.arguments[@"value"] - forKey:call.arguments[@"key"]]; - } else if ([@"boolean" isEqualToString:key[@"type"]]) { - [[Crashlytics sharedInstance] setBoolValue:[call.arguments[@"value"] boolValue] - forKey:call.arguments[@"key"]]; - } - } - - // Add additional information from the Flutter framework to the exception reported in - // Crashlytics. Using CLSLog instead of CLS_LOG to try to avoid the automatic inclusion of the - // line number. It also ensures that the log is only written to Crashlytics and not also to the - // offline log as explained here: - // https://support.crashlytics.com/knowledgebase/articles/92519-how-do-i-use-logging - // Although, that would only happen in debug mode, which this method call is never called in. - NSString *information = call.arguments[@"information"]; - if ([information length] != 0) { - CLSLog(information); - } - - // Report crash. - NSArray *errorElements = call.arguments[@"stackTraceElements"]; - NSMutableArray *frames = [NSMutableArray array]; - for (NSDictionary *errorElement in errorElements) { - [frames addObject:[self generateFrame:errorElement]]; - } - - NSString *context = call.arguments[@"context"]; - NSString *reason; - if (context != nil) { - reason = [NSString stringWithFormat:@"thrown %@", context]; - } - - [[Crashlytics sharedInstance] recordCustomExceptionName:call.arguments[@"exception"] - reason:reason - frameArray:frames]; - result(@"Error reported to Crashlytics."); - } else if ([@"Crashlytics#isDebuggable" isEqualToString:call.method]) { - result([NSNumber numberWithBool:[Crashlytics sharedInstance].debugMode]); - } else if ([@"Crashlytics#getVersion" isEqualToString:call.method]) { - result([Crashlytics sharedInstance].version); - } else if ([@"Crashlytics#setUserEmail" isEqualToString:call.method]) { - [[Crashlytics sharedInstance] setUserEmail:call.arguments[@"email"]]; - result(nil); - } else if ([@"Crashlytics#setUserName" isEqualToString:call.method]) { - [[Crashlytics sharedInstance] setUserName:call.arguments[@"name"]]; - result(nil); - } else if ([@"Crashlytics#setUserIdentifier" isEqualToString:call.method]) { - [[Crashlytics sharedInstance] setUserIdentifier:call.arguments[@"identifier"]]; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -- (CLSStackFrame *)generateFrame:(NSDictionary *)errorElement { - CLSStackFrame *frame = [CLSStackFrame stackFrame]; - - frame.library = [errorElement valueForKey:@"class"]; - frame.symbol = [errorElement valueForKey:@"method"]; - frame.fileName = [errorElement valueForKey:@"file"]; - frame.lineNumber = [[errorElement valueForKey:@"line"] intValue]; - - return frame; -} - -@end diff --git a/packages/firebase_crashlytics/ios/firebase_crashlytics.podspec b/packages/firebase_crashlytics/ios/firebase_crashlytics.podspec deleted file mode 100644 index b611165b73d8..000000000000 --- a/packages/firebase_crashlytics/ios/firebase_crashlytics.podspec +++ /dev/null @@ -1,34 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_crashlytics' - 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.ios.deployment_target = '8.0' - s.static_framework = true - s.dependency 'Flutter' - s.dependency 'Fabric' - s.dependency 'Crashlytics' - s.dependency 'Firebase/Core' - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-cls\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_crashlytics/lib/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/firebase_crashlytics.dart deleted file mode 100644 index a57738b63f43..000000000000 --- a/packages/firebase_crashlytics/lib/firebase_crashlytics.dart +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library firebase_crashlytics; - -import 'dart:async'; -import 'dart:collection'; -import 'dart:typed_data'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; -import 'package:stack_trace/stack_trace.dart'; - -part 'src/firebase_crashlytics.dart'; diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart deleted file mode 100644 index 2d853c9b40f6..000000000000 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -part of firebase_crashlytics; - -/// The entry point for accessing Crashlytics. -/// -/// You can get an instance by calling `Crashlytics.instance`. -class Crashlytics { - static final Crashlytics instance = Crashlytics(); - - /// Set to true to have errors sent to Crashlytics while in debug mode. By - /// default this is false. - bool enableInDevMode = false; - - /// Keys to be included with report. - final Map _keys = {}; - - /// Logs to be included with report. - final ListQueue _logs = ListQueue(15); - int _logSize = 0; - - @visibleForTesting - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_crashlytics'); - - /// Submits report of a non-fatal error caught by the Flutter framework. - /// to Firebase Crashlytics. - Future recordFlutterError(FlutterErrorDetails details) async { - print('Flutter error caught by Crashlytics plugin:'); - - _recordError(details.exceptionAsString(), details.stack, - context: details.context, - information: details.informationCollector == null - ? null - : details.informationCollector()); - } - - /// Submits a report of a non-fatal error. - /// - /// For errors generated by the Flutter framework, use [recordFlutterError] instead. - Future recordError(dynamic exception, StackTrace stack, - {dynamic context}) async { - print('Error caught by Crashlytics plugin :'); - - _recordError(exception, stack, context: context); - } - - void crash() { - throw StateError('Error thrown by Crashlytics plugin'); - } - - /// Reports the global value for debug mode. - /// TODO(kroikie): Clarify what this means in context of both Android and iOS. - Future isDebuggable() async { - final bool result = - await channel.invokeMethod('Crashlytics#isDebuggable'); - return result; - } - - /// Returns Crashlytics SDK version. - Future getVersion() async { - final String result = - await channel.invokeMethod('Crashlytics#getVersion'); - return result; - } - - /// Add text logging that will be sent with your next report. `msg` will be - /// printed to the console when in debug mode. Each report has a rolling max - /// of 64k of logs, older logs are removed to allow newer logs to fit within - /// the limit. - void log(String msg) { - _logSize += Uint8List.fromList(msg.codeUnits).length; - _logs.add(msg); - // Remove oldest log till logSize is no more than 64K. - while (_logSize > 65536) { - final String first = _logs.removeFirst(); - _logSize -= Uint8List.fromList(first.codeUnits).length; - } - } - - void _setValue(String key, dynamic value) { - // Check that only 64 keys are set. - if (_keys.containsKey(key) || _keys.length <= 64) { - _keys[key] = value; - } - } - - /// Sets a value to be associated with a given key for your crash data. - void setBool(String key, bool value) { - _setValue(key, value); - } - - /// Sets a value to be associated with a given key for your crash data. - void setDouble(String key, double value) { - _setValue(key, value); - } - - /// Sets a value to be associated with a given key for your crash data. - void setInt(String key, int value) { - _setValue(key, value); - } - - /// Sets a value to be associated with a given key for your crash data. - void setString(String key, String value) { - _setValue(key, value); - } - - /// Optionally set a end-user's name or username for display within the - /// Crashlytics UI. Please be mindful of end-user's privacy. - Future setUserEmail(String email) async { - await channel.invokeMethod( - 'Crashlytics#setUserEmail', {'email': email}); - } - - /// Specify a user identifier which will be visible in the Crashlytics UI. - /// Please be mindful of end-user's privacy. - Future setUserIdentifier(String identifier) async { - await channel.invokeMethod('Crashlytics#setUserIdentifier', - {'identifier': identifier}); - } - - /// Specify a user name which will be visible in the Crashlytics UI. Please - /// be mindful of end-user's privacy. - Future setUserName(String name) async { - await channel.invokeMethod( - 'Crashlytics#setUserName', {'name': name}); - } - - List> _prepareKeys() { - final List> crashlyticsKeys = >[]; - for (String key in _keys.keys) { - final dynamic value = _keys[key]; - - final Map crashlyticsKey = { - 'key': key, - 'value': value - }; - - if (value is int) { - crashlyticsKey['type'] = 'int'; - } else if (value is double) { - crashlyticsKey['type'] = 'double'; - } else if (value is String) { - crashlyticsKey['type'] = 'string'; - } else if (value is bool) { - crashlyticsKey['type'] = 'boolean'; - } - crashlyticsKeys.add(crashlyticsKey); - } - - return crashlyticsKeys; - } - - @visibleForTesting - List> getStackTraceElements(List lines) { - final List> elements = >[]; - for (String line in lines) { - final List lineParts = line.split(RegExp('\\s+')); - try { - final String fileName = lineParts[0]; - final String lineNumber = lineParts[1].contains(":") - ? lineParts[1].substring(0, lineParts[1].indexOf(":")).trim() - : lineParts[1]; - - final Map element = { - 'file': fileName, - 'line': lineNumber, - }; - - // The next section would throw an exception in some cases if there was no stop here. - if (lineParts.length < 3) { - elements.add(element); - continue; - } - - if (lineParts[2].contains(".")) { - final String className = - lineParts[2].substring(0, lineParts[2].indexOf(".")).trim(); - final String methodName = - lineParts[2].substring(lineParts[2].indexOf(".") + 1).trim(); - - element['class'] = className; - element['method'] = methodName; - } else { - element['method'] = lineParts[2]; - } - - elements.add(element); - } catch (e) { - print(e.toString()); - } - } - return elements; - } - - // On top of the default exception components, [information] can be passed as well. - // This allows the developer to get a better understanding of exceptions thrown - // by the Flutter framework. [FlutterErrorDetails] often explain why an exception - // occurred and give useful background information in [FlutterErrorDetails.informationCollector]. - // Crashlytics will log this information in addition to the stack trace. - // If [information] is `null` or empty, it will be ignored. - Future _recordError(dynamic exception, StackTrace stack, - {dynamic context, Iterable information}) async { - bool inDebugMode = false; - if (!enableInDevMode) { - assert(inDebugMode = true); - } - - final String _information = (information == null || information.isEmpty) - ? '' - : (StringBuffer()..writeAll(information, '\n')).toString(); - - if (inDebugMode && !enableInDevMode) { - // If available, give context to the exception. - if (context != null) - print('The following exception was thrown $context:'); - - // Need to print the exception to explain why the exception was thrown. - print(exception); - - // Print information provided by the Flutter framework about the exception. - if (_information.isNotEmpty) print('\n$_information'); - - // Not using Trace.format here to stick to the default stack trace format - // that Flutter developers are used to seeing. - if (stack != null) print('\n$stack'); - } else { - // The stack trace can be null. To avoid the following exception: - // Invalid argument(s): Cannot create a Trace from null. - // To avoid that exception, we can check for null and provide an empty stack trace. - stack ??= StackTrace.fromString(''); - - // Report error. - final List stackTraceLines = - Trace.format(stack).trimRight().split('\n'); - final List> stackTraceElements = - getStackTraceElements(stackTraceLines); - - // The context is a string that "should be in a form that will make sense in - // English when following the word 'thrown'" according to the documentation for - // [FlutterErrorDetails.context]. It is displayed to the user on Crashlytics - // as the "reason", which is forced by iOS, with the "thrown" prefix added. - final String result = await channel - .invokeMethod('Crashlytics#onError', { - 'exception': "${exception.toString()}", - 'context': '$context', - 'information': _information, - 'stackTraceElements': stackTraceElements, - 'logs': _logs.toList(), - 'keys': _prepareKeys(), - }); - - // Print result. - print(result); - } - } -} diff --git a/packages/firebase_crashlytics/pubspec.yaml b/packages/firebase_crashlytics/pubspec.yaml deleted file mode 100644 index 5b1542554213..000000000000 --- a/packages/firebase_crashlytics/pubspec.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: firebase_crashlytics -description: - Flutter plugin for Firebase Crashlytics. It reports uncaught errors to the - Firebase console. -version: 0.1.0+2 -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_crashlytics - -environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" - flutter: ">=1.5.0" - -dependencies: - flutter: - sdk: flutter - stack_trace: ^1.9.3 - -dev_dependencies: - flutter_test: - sdk: flutter - test: ^1.5.1 - flutter_driver: - sdk: flutter - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.crashlytics.firebasecrashlytics - pluginClass: FirebaseCrashlyticsPlugin diff --git a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart deleted file mode 100644 index ed3bce48c5aa..000000000000 --- a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$Crashlytics', () { - final List log = []; - - final Crashlytics crashlytics = Crashlytics.instance; - - setUp(() async { - Crashlytics.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'Crashlytics#onError': - return 'Error reported to Crashlytics.'; - case 'Crashlytics#isDebuggable': - return true; - case 'Crashlytics#setUserEmail': - return true; - case 'Crashlytics#setUserIdentifier': - return true; - case 'Crashlytics#setUserName': - return true; - case 'Crashlytics#getVersion': - return '0.0.0+1'; - default: - return false; - } - }); - log.clear(); - }); - - test('recordFlutterError', () async { - final FlutterErrorDetails details = FlutterErrorDetails( - exception: 'foo exception', - stack: StackTrace.current, - library: 'foo library', - informationCollector: () => [ - DiagnosticsNode.message('test message'), - DiagnosticsNode.message('second message'), - ], - context: ErrorDescription('foo context'), - ); - crashlytics.enableInDevMode = true; - crashlytics.log('foo'); - crashlytics.setBool('testBool', true); - crashlytics.setInt('testInt', 42); - crashlytics.setDouble('testDouble', 42.0); - crashlytics.setString('testString', 'bar'); - await crashlytics.recordFlutterError(details); - expect(log[0].method, 'Crashlytics#onError'); - expect(log[0].arguments['exception'], 'foo exception'); - expect(log[0].arguments['context'], 'foo context'); - expect(log[0].arguments['information'], 'test message\nsecond message'); - expect(log[0].arguments['logs'], isNotEmpty); - expect(log[0].arguments['logs'], contains('foo')); - expect(log[0].arguments['keys'][0]['key'], 'testBool'); - expect(log[0].arguments['keys'][0]['value'], isTrue); - expect(log[0].arguments['keys'][0]['type'], 'boolean'); - expect(log[0].arguments['keys'][1]['key'], 'testInt'); - expect(log[0].arguments['keys'][1]['value'], 42); - expect(log[0].arguments['keys'][1]['type'], 'int'); - expect(log[0].arguments['keys'][2]['key'], 'testDouble'); - expect(log[0].arguments['keys'][2]['value'], 42.0); - expect(log[0].arguments['keys'][2]['type'], 'double'); - expect(log[0].arguments['keys'][3]['key'], 'testString'); - expect(log[0].arguments['keys'][3]['value'], 'bar'); - expect(log[0].arguments['keys'][3]['type'], 'string'); - }); - - test('recordError', () async { - crashlytics.enableInDevMode = true; - crashlytics.log('foo'); - await crashlytics.recordError('foo exception', StackTrace.current, - context: "context"); - expect(log[0].method, 'Crashlytics#onError'); - expect(log[0].arguments['exception'], 'foo exception'); - expect(log[0].arguments['context'], "context"); - expect(log[0].arguments['logs'], isNotEmpty); - expect(log[0].arguments['logs'], contains('foo')); - expect(log[0].arguments['keys'][0]['key'], 'testBool'); - expect(log[0].arguments['keys'][0]['value'], isTrue); - expect(log[0].arguments['keys'][0]['type'], 'boolean'); - expect(log[0].arguments['keys'][1]['key'], 'testInt'); - expect(log[0].arguments['keys'][1]['value'], 42); - expect(log[0].arguments['keys'][1]['type'], 'int'); - expect(log[0].arguments['keys'][2]['key'], 'testDouble'); - expect(log[0].arguments['keys'][2]['value'], 42.0); - expect(log[0].arguments['keys'][2]['type'], 'double'); - expect(log[0].arguments['keys'][3]['key'], 'testString'); - expect(log[0].arguments['keys'][3]['value'], 'bar'); - expect(log[0].arguments['keys'][3]['type'], 'string'); - }); - - test('isDebuggable', () async { - expect(await crashlytics.isDebuggable(), true); - expect( - log, - [ - isMethodCall( - 'Crashlytics#isDebuggable', - arguments: null, - ) - ], - ); - }); - - test('crash', () { - expect(() => crashlytics.crash(), throwsStateError); - }); - - test('getVersion', () async { - await crashlytics.getVersion(); - expect(log, - [isMethodCall('Crashlytics#getVersion', arguments: null)]); - }); - - test('setUserEmail', () async { - await crashlytics.setUserEmail('foo'); - expect(log, [ - isMethodCall('Crashlytics#setUserEmail', - arguments: {'email': 'foo'}) - ]); - }); - - test('setUserIdentifier', () async { - await crashlytics.setUserIdentifier('foo'); - expect(log, [ - isMethodCall('Crashlytics#setUserIdentifier', - arguments: {'identifier': 'foo'}) - ]); - }); - - test('setUserName', () async { - await crashlytics.setUserName('foo'); - expect(log, [ - isMethodCall('Crashlytics#setUserName', - arguments: {'name': 'foo'}) - ]); - }); - - test('getStackTraceElements with character index', () async { - final List lines = [ - 'package:flutter/src/widgets/framework.dart 3825:27 StatefulElement.build' - ]; - final List> elements = - crashlytics.getStackTraceElements(lines); - expect(elements.length, 1); - expect(elements.first, { - 'class': 'StatefulElement', - 'method': 'build', - 'file': 'package:flutter/src/widgets/framework.dart', - 'line': '3825', - }); - }); - - test('getStackTraceElements without character index', () async { - final List lines = [ - 'package:flutter/src/widgets/framework.dart 3825 StatefulElement.build' - ]; - final List> elements = - crashlytics.getStackTraceElements(lines); - expect(elements.length, 1); - expect(elements.first, { - 'class': 'StatefulElement', - 'method': 'build', - 'file': 'package:flutter/src/widgets/framework.dart', - 'line': '3825', - }); - }); - - test('getStackTraceElements without class', () async { - final List lines = [ - 'package:firebase_crashlytics/test/main.dart 12 main' - ]; - final List> elements = - crashlytics.getStackTraceElements(lines); - expect(elements.length, 1); - expect(elements.first, { - 'method': 'main', - 'file': 'package:firebase_crashlytics/test/main.dart', - 'line': '12', - }); - }); - }); -} diff --git a/packages/firebase_database/.gitignore b/packages/firebase_database/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_database/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_database/CHANGELOG.md b/packages/firebase_database/CHANGELOG.md deleted file mode 100644 index eedce557e0f1..000000000000 --- a/packages/firebase_database/CHANGELOG.md +++ /dev/null @@ -1,268 +0,0 @@ -## 3.0.5 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 3.0.4 - -* Updated transactions implementation on Android for compatibility with - newer versions of Flutter engine that require channel calls be made - on the UI thread. - -## 3.0.3 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 3.0.2 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. - -## 3.0.1 - -* Suppress deprecation warning for BinaryMessages. See: https://github.com/flutter/flutter/issues/33446 - -## 3.0.0 - -* Update Android dependencies to latest. - -## 2.0.3 - -* Provide a `toString` implementation for `DatabaseError`. - -## 2.0.2+1 - -* Added an integration test for transactions. - -## 2.0.2 - -* Fix the issue that `getDictionaryFromError` always returns non nil result even when the parameter is nil. - -## 2.0.1+3 - -* Fixing DatabaseReference.set unhandled exception which happened when a successful operation was performed. - -## 2.0.1+2 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 2.0.1+1 - -* Remove categories. - -## 2.0.1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 2.0.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - - This was originally incorrectly pushed in the `1.1.0` update. - -## 1.1.0+1 - -* **Revert the breaking 1.1.0 update**. 1.1.0 was known to be breaking and - should have incremented the major version number instead of the minor. This - revert is in and of itself breaking for anyone that has already migrated - however. Anyone who has already migrated their app to AndroidX should - immediately update to `2.0.0` instead. That's the correctly versioned new push - of `1.1.0`. - -## 1.1.0 - -* **BAD**. This was a breaking change that was incorrectly published on a minor - version upgrade, should never have happened. Reverted by 1.1.0+1. - - "**Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library." - -## 1.0.5 - -* Bumped Android dependencies to latest. - -## 1.0.4 - -* Bumped test and mockito versions to pick up Dart 2 support. - -## 1.0.3 - -* Bump Android and Firebase dependency versions. - -## 1.0.2 - -* Add `onDisconnect` support. - -## 1.0.1 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 1.0.0 - -* Bump to released version - -## 0.4.6 - -* Allow null value for `startAt`, `endAt` and `equalTo` queries on Android. - -## 0.4.5 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.4.4 - -* Updated firebase_core dependency to ^0.2.2 - -## 0.4.3 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.4.2 - -* Updated `firebase_core` dependency. -* Removed `meta` dependency. - -## 0.4.1 - -* Fixes Dart 2 runtime cast error. - -## 0.4.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.3.6 - -* Fixed Dart 2 type errors. - -## 0.3.5 - -* Enabled use in Swift projects. - -## 0.3.4 - -* Allow null values for Query startAt, endAt, and equalTo - -## 0.3.3 - -* Support to specify a database by URL if required - -## 0.3.2 - -* Fix warnings from the Dart 2.0 analyzer. -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.3.1 - -* Fix function name collision when using Firebase Database and Cloud Firestore together on iOS. - -## 0.3.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). - -## 0.2.0 - -* Support for multiple databases, new dependency on firebase_core -* Relax GMS dependency to 11.+ - -## 0.1.4 - -* Add FLT prefix to iOS types -* Avoid error when clearing FirebaseSortedList - -## 0.1.3 - -* Fix memory leak in FirebaseAnimatedList -* Change GMS dependency to 11.4.+ - -## 0.1.2 - -* Change GMS dependency to 11.+ - -## 0.1.1 - -* Add RTDB transaction support. - -## 0.1.0+1 - -* Aligned author name with rest of repo. - -## 0.1.0 - -* **Breaking Change**: Added current list index to the type signature of itemBuilder for FirebaseAnimatedList. - -## 0.0.14 - -* Fix FirebaseSortedList to show data changes. - -## 0.0.13 - -* Fixed lingering value/child listeners. - -## 0.0.12 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds - -## 0.0.11 - -* Fixes startAt/endAt on iOS when used without a key - -## 0.0.10 - -* Added workaround for inconsistent numeric types when using keepSynced on iOS -* Bug fixes to Query handling - -## 0.0.9 - -* Updated to Firebase SDK Version 11.0.1 - -## 0.0.8 - -* Added missing offline persistence and query functionality on Android -* Fixed startAt query behavior on iOS -* Persistence methods no longer throw errors on failure, return false instead -* Updates to docs and tests - -## 0.0.7 - -* Fixed offline persistence on iOS - -## 0.0.6 - -* Various APIs added to FirebaseDatabase and Query -* Added removal and priority to DatabaseReference -* Improved documentation -* Added unit tests - -## 0.0.5 - -* Fixed analyzer warnings - -## 0.0.4 - -* Removed stub code and replaced it with support for more event types, paths, auth -* Improved example - -## 0.0.3 - -* Updated README.md -* Bumped buildToolsVersion to 25.0.3 -* Added example app - -## 0.0.2 - -* Fix compilation error - -## 0.0.1 - -* Initial Release diff --git a/packages/firebase_database/LICENSE b/packages/firebase_database/LICENSE deleted file mode 100755 index 000b4618d2bd..000000000000 --- a/packages/firebase_database/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 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_database/README.md b/packages/firebase_database/README.md deleted file mode 100755 index 107f7869ddd1..000000000000 --- a/packages/firebase_database/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Firebase Realtime Database for Flutter - -[![pub package](https://img.shields.io/pub/v/firebase_database.svg)](https://pub.dartlang.org/packages/firebase_database) - -A Flutter plugin to use the [Firebase Realtime Database API](https://firebase.google.com/products/database/). - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage -To use this plugin, add `firebase_database` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Getting Started - -See the `example` directory for a complete sample app using Firebase Realtime Database. diff --git a/packages/firebase_database/android/build.gradle b/packages/firebase_database/android/build.gradle deleted file mode 100755 index 484c0976d1e3..000000000000 --- a/packages/firebase_database/android/build.gradle +++ /dev/null @@ -1,53 +0,0 @@ -def PLUGIN = "firebase_database"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebase.database' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-database:17.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_database/android/gradle.properties b/packages/firebase_database/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_database/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_database/android/settings.gradle b/packages/firebase_database/android/settings.gradle deleted file mode 100755 index 853b33390159..000000000000 --- a/packages/firebase_database/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_database' diff --git a/packages/firebase_database/android/src/main/AndroidManifest.xml b/packages/firebase_database/android/src/main/AndroidManifest.xml deleted file mode 100755 index c4c6517bd637..000000000000 --- a/packages/firebase_database/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java b/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java deleted file mode 100644 index c3fb751e5070..000000000000 --- a/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java +++ /dev/null @@ -1,531 +0,0 @@ -// Copyright 2017 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.database; - -import android.app.Activity; -import android.util.Log; -import android.util.SparseArray; -import com.google.android.gms.tasks.Task; -import com.google.android.gms.tasks.TaskCompletionSource; -import com.google.android.gms.tasks.Tasks; -import com.google.firebase.FirebaseApp; -import com.google.firebase.database.ChildEventListener; -import com.google.firebase.database.DataSnapshot; -import com.google.firebase.database.DatabaseError; -import com.google.firebase.database.DatabaseException; -import com.google.firebase.database.DatabaseReference; -import com.google.firebase.database.FirebaseDatabase; -import com.google.firebase.database.MutableData; -import com.google.firebase.database.Query; -import com.google.firebase.database.Transaction; -import com.google.firebase.database.ValueEventListener; -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.plugin.common.PluginRegistry; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** FirebaseDatabasePlugin */ -public class FirebaseDatabasePlugin implements MethodCallHandler { - - private static final String TAG = "FirebaseDatabasePlugin"; - - private final MethodChannel channel; - private final Activity activity; - private static final String EVENT_TYPE_CHILD_ADDED = "_EventType.childAdded"; - private static final String EVENT_TYPE_CHILD_REMOVED = "_EventType.childRemoved"; - private static final String EVENT_TYPE_CHILD_CHANGED = "_EventType.childChanged"; - private static final String EVENT_TYPE_CHILD_MOVED = "_EventType.childMoved"; - private static final String EVENT_TYPE_VALUE = "_EventType.value"; - - // Handles are ints used as indexes into the sparse array of active observers - private int nextHandle = 0; - private final SparseArray observers = new SparseArray<>(); - - public static void registerWith(PluginRegistry.Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_database"); - channel.setMethodCallHandler(new FirebaseDatabasePlugin(channel, registrar.activity())); - } - - private FirebaseDatabasePlugin(MethodChannel channel, Activity activity) { - this.channel = channel; - this.activity = activity; - } - - private DatabaseReference getReference(FirebaseDatabase database, Map arguments) { - String path = (String) arguments.get("path"); - DatabaseReference reference = database.getReference(); - if (path != null) reference = reference.child(path); - return reference; - } - - private Query getQuery(FirebaseDatabase database, Map arguments) { - Query query = getReference(database, arguments); - @SuppressWarnings("unchecked") - Map parameters = (Map) arguments.get("parameters"); - if (parameters == null) return query; - Object orderBy = parameters.get("orderBy"); - if ("child".equals(orderBy)) { - query = query.orderByChild((String) parameters.get("orderByChildKey")); - } else if ("key".equals(orderBy)) { - query = query.orderByKey(); - } else if ("value".equals(orderBy)) { - query = query.orderByValue(); - } else if ("priority".equals(orderBy)) { - query = query.orderByPriority(); - } - if (parameters.containsKey("startAt")) { - Object startAt = parameters.get("startAt"); - if (parameters.containsKey("startAtKey")) { - String startAtKey = (String) parameters.get("startAtKey"); - if (startAt instanceof Boolean) { - query = query.startAt((Boolean) startAt, startAtKey); - } else if (startAt instanceof Number) { - query = query.startAt(((Number) startAt).doubleValue(), startAtKey); - } else { - query = query.startAt((String) startAt, startAtKey); - } - } else { - if (startAt instanceof Boolean) { - query = query.startAt((Boolean) startAt); - } else if (startAt instanceof Number) { - query = query.startAt(((Number) startAt).doubleValue()); - } else { - query = query.startAt((String) startAt); - } - } - } - if (parameters.containsKey("endAt")) { - Object endAt = parameters.get("endAt"); - if (parameters.containsKey("endAtKey")) { - String endAtKey = (String) parameters.get("endAtKey"); - if (endAt instanceof Boolean) { - query = query.endAt((Boolean) endAt, endAtKey); - } else if (endAt instanceof Number) { - query = query.endAt(((Number) endAt).doubleValue(), endAtKey); - } else { - query = query.endAt((String) endAt, endAtKey); - } - } else { - if (endAt instanceof Boolean) { - query = query.endAt((Boolean) endAt); - } else if (endAt instanceof Number) { - query = query.endAt(((Number) endAt).doubleValue()); - } else { - query = query.endAt((String) endAt); - } - } - } - if (parameters.containsKey("equalTo")) { - Object equalTo = parameters.get("equalTo"); - if (parameters.containsKey("equalToKey")) { - String equalToKey = (String) parameters.get("equalToKey"); - if (equalTo instanceof Boolean) { - query = query.equalTo((Boolean) equalTo, equalToKey); - } else if (equalTo instanceof Number) { - query = query.equalTo(((Number) equalTo).doubleValue(), equalToKey); - } else { - query = query.equalTo((String) equalTo, equalToKey); - } - } else { - if (equalTo instanceof Boolean) { - query = query.equalTo((Boolean) equalTo); - } else if (equalTo instanceof Number) { - query = query.equalTo(((Number) equalTo).doubleValue()); - } else { - query = query.equalTo((String) equalTo); - } - } - } - if (parameters.containsKey("limitToFirst")) { - query = query.limitToFirst((int) parameters.get("limitToFirst")); - } - if (parameters.containsKey("limitToLast")) { - query = query.limitToLast((int) parameters.get("limitToLast")); - } - return query; - } - - private class DefaultCompletionListener implements DatabaseReference.CompletionListener { - private final Result result; - - DefaultCompletionListener(Result result) { - this.result = result; - } - - @Override - public void onComplete(DatabaseError error, DatabaseReference ref) { - if (error != null) { - result.error(String.valueOf(error.getCode()), error.getMessage(), error.getDetails()); - } else { - result.success(null); - } - } - } - - private class EventObserver implements ChildEventListener, ValueEventListener { - private String requestedEventType; - private int handle; - - EventObserver(String requestedEventType, int handle) { - this.requestedEventType = requestedEventType; - this.handle = handle; - } - - private void sendEvent(String eventType, DataSnapshot snapshot, String previousChildName) { - if (eventType.equals(requestedEventType)) { - Map arguments = new HashMap<>(); - Map snapshotMap = new HashMap<>(); - snapshotMap.put("key", snapshot.getKey()); - snapshotMap.put("value", snapshot.getValue()); - arguments.put("handle", handle); - arguments.put("snapshot", snapshotMap); - arguments.put("previousSiblingKey", previousChildName); - channel.invokeMethod("Event", arguments); - } - } - - @Override - public void onCancelled(DatabaseError error) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - arguments.put("error", asMap(error)); - channel.invokeMethod("Error", arguments); - } - - @Override - public void onChildAdded(DataSnapshot snapshot, String previousChildName) { - sendEvent(EVENT_TYPE_CHILD_ADDED, snapshot, previousChildName); - } - - @Override - public void onChildRemoved(DataSnapshot snapshot) { - sendEvent(EVENT_TYPE_CHILD_REMOVED, snapshot, null); - } - - @Override - public void onChildChanged(DataSnapshot snapshot, String previousChildName) { - sendEvent(EVENT_TYPE_CHILD_CHANGED, snapshot, previousChildName); - } - - @Override - public void onChildMoved(DataSnapshot snapshot, String previousChildName) { - sendEvent(EVENT_TYPE_CHILD_MOVED, snapshot, previousChildName); - } - - @Override - public void onDataChange(DataSnapshot snapshot) { - sendEvent(EVENT_TYPE_VALUE, snapshot, null); - } - } - - @Override - public void onMethodCall(final MethodCall call, final Result result) { - final Map arguments = call.arguments(); - FirebaseDatabase database; - String appName = (String) arguments.get("app"); - String databaseURL = (String) arguments.get("databaseURL"); - if (appName != null && databaseURL != null) { - database = FirebaseDatabase.getInstance(FirebaseApp.getInstance(appName), databaseURL); - } else if (appName != null) { - database = FirebaseDatabase.getInstance(FirebaseApp.getInstance(appName)); - } else if (databaseURL != null) { - database = FirebaseDatabase.getInstance(databaseURL); - } else { - database = FirebaseDatabase.getInstance(); - } - switch (call.method) { - case "FirebaseDatabase#goOnline": - { - database.goOnline(); - result.success(null); - break; - } - - case "FirebaseDatabase#goOffline": - { - database.goOffline(); - result.success(null); - break; - } - - case "FirebaseDatabase#purgeOutstandingWrites": - { - database.purgeOutstandingWrites(); - result.success(null); - break; - } - - case "FirebaseDatabase#setPersistenceEnabled": - { - Boolean isEnabled = (Boolean) arguments.get("enabled"); - try { - database.setPersistenceEnabled(isEnabled); - result.success(true); - } catch (DatabaseException e) { - // Database is already in use, e.g. after hot reload/restart. - result.success(false); - } - break; - } - - case "FirebaseDatabase#setPersistenceCacheSizeBytes": - { - long cacheSize = (Integer) arguments.get("cacheSize"); - try { - database.setPersistenceCacheSizeBytes(cacheSize); - result.success(true); - } catch (DatabaseException e) { - // Database is already in use, e.g. after hot reload/restart. - result.success(false); - } - break; - } - - case "DatabaseReference#set": - { - Object value = arguments.get("value"); - Object priority = arguments.get("priority"); - DatabaseReference reference = getReference(database, arguments); - if (priority != null) { - reference.setValue(value, priority, new DefaultCompletionListener(result)); - } else { - reference.setValue(value, new DefaultCompletionListener(result)); - } - break; - } - - case "DatabaseReference#update": - { - @SuppressWarnings("unchecked") - Map value = (Map) arguments.get("value"); - DatabaseReference reference = getReference(database, arguments); - reference.updateChildren(value, new DefaultCompletionListener(result)); - break; - } - - case "DatabaseReference#setPriority": - { - Object priority = arguments.get("priority"); - DatabaseReference reference = getReference(database, arguments); - reference.setPriority(priority, new DefaultCompletionListener(result)); - break; - } - - case "DatabaseReference#runTransaction": - { - final DatabaseReference reference = getReference(database, arguments); - - // Initiate native transaction. - reference.runTransaction( - new Transaction.Handler() { - @Override - public Transaction.Result doTransaction(MutableData mutableData) { - // Tasks are used to allow native execution of doTransaction to wait while Snapshot is - // processed by logic on the Dart side. - final TaskCompletionSource> updateMutableDataTCS = - new TaskCompletionSource<>(); - final Task> updateMutableDataTCSTask = - updateMutableDataTCS.getTask(); - - final Map doTransactionMap = new HashMap<>(); - doTransactionMap.put("transactionKey", arguments.get("transactionKey")); - - final Map snapshotMap = new HashMap<>(); - snapshotMap.put("key", mutableData.getKey()); - snapshotMap.put("value", mutableData.getValue()); - doTransactionMap.put("snapshot", snapshotMap); - - // Return snapshot to Dart side for update. - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - channel.invokeMethod( - "DoTransaction", - doTransactionMap, - new MethodChannel.Result() { - @Override - @SuppressWarnings("unchecked") - public void success(Object result) { - updateMutableDataTCS.setResult((Map) result); - } - - @Override - public void error( - String errorCode, String errorMessage, Object errorDetails) { - String exceptionMessage = - "Error code: " - + errorCode - + "\nError message: " - + errorMessage - + "\nError details: " - + errorDetails; - updateMutableDataTCS.setException( - new Exception(exceptionMessage)); - } - - @Override - public void notImplemented() { - updateMutableDataTCS.setException( - new Exception("DoTransaction not implemented on Dart side.")); - } - }); - } - }); - - try { - // Wait for updated snapshot from the Dart side. - final Map updatedSnapshotMap = - Tasks.await( - updateMutableDataTCSTask, - (int) arguments.get("transactionTimeout"), - TimeUnit.MILLISECONDS); - // Set value of MutableData to value returned from the Dart side. - mutableData.setValue(updatedSnapshotMap.get("value")); - } catch (ExecutionException | InterruptedException | TimeoutException e) { - Log.e(TAG, "Unable to commit Snapshot update. Transaction failed.", e); - if (e instanceof TimeoutException) { - Log.e(TAG, "Transaction at " + reference.toString() + " timed out."); - } - return Transaction.abort(); - } - return Transaction.success(mutableData); - } - - @Override - public void onComplete( - DatabaseError databaseError, boolean committed, DataSnapshot dataSnapshot) { - final Map completionMap = new HashMap<>(); - completionMap.put("transactionKey", arguments.get("transactionKey")); - if (databaseError != null) { - completionMap.put("error", asMap(databaseError)); - } - completionMap.put("committed", committed); - if (dataSnapshot != null) { - Map snapshotMap = new HashMap<>(); - snapshotMap.put("key", dataSnapshot.getKey()); - snapshotMap.put("value", dataSnapshot.getValue()); - completionMap.put("snapshot", snapshotMap); - } - - // Invoke transaction completion on the Dart side. - activity.runOnUiThread( - new Runnable() { - public void run() { - result.success(completionMap); - } - }); - } - }); - break; - } - - case "OnDisconnect#set": - { - Object value = arguments.get("value"); - Object priority = arguments.get("priority"); - DatabaseReference reference = getReference(database, arguments); - if (priority != null) { - if (priority instanceof String) { - reference - .onDisconnect() - .setValue(value, (String) priority, new DefaultCompletionListener(result)); - } else if (priority instanceof Double) { - reference - .onDisconnect() - .setValue(value, (double) priority, new DefaultCompletionListener(result)); - } else if (priority instanceof Map) { - reference - .onDisconnect() - .setValue(value, (Map) priority, new DefaultCompletionListener(result)); - } - } else { - reference.onDisconnect().setValue(value, new DefaultCompletionListener(result)); - } - break; - } - - case "OnDisconnect#update": - { - @SuppressWarnings("unchecked") - Map value = (Map) arguments.get("value"); - DatabaseReference reference = getReference(database, arguments); - reference.onDisconnect().updateChildren(value, new DefaultCompletionListener(result)); - break; - } - - case "OnDisconnect#cancel": - { - DatabaseReference reference = getReference(database, arguments); - reference.onDisconnect().cancel(new DefaultCompletionListener(result)); - break; - } - - case "Query#keepSynced": - { - boolean value = (Boolean) arguments.get("value"); - getQuery(database, arguments).keepSynced(value); - result.success(null); - break; - } - - case "Query#observe": - { - String eventType = (String) arguments.get("eventType"); - int handle = nextHandle++; - EventObserver observer = new EventObserver(eventType, handle); - observers.put(handle, observer); - if (eventType.equals(EVENT_TYPE_VALUE)) { - getQuery(database, arguments).addValueEventListener(observer); - } else { - getQuery(database, arguments).addChildEventListener(observer); - } - result.success(handle); - break; - } - - case "Query#removeObserver": - { - Query query = getQuery(database, arguments); - int handle = (Integer) arguments.get("handle"); - EventObserver observer = observers.get(handle); - if (observer != null) { - if (observer.requestedEventType.equals(EVENT_TYPE_VALUE)) { - query.removeEventListener((ValueEventListener) observer); - } else { - query.removeEventListener((ChildEventListener) observer); - } - observers.delete(handle); - result.success(null); - break; - } else { - result.error("unknown_handle", "removeObserver called on an unknown handle", null); - break; - } - } - - default: - { - result.notImplemented(); - break; - } - } - } - - private static Map asMap(DatabaseError error) { - Map map = new HashMap<>(); - map.put("code", error.getCode()); - map.put("message", error.getMessage()); - map.put("details", error.getDetails()); - return map; - } -} diff --git a/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java b/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 2016d286ccdc..000000000000 --- a/packages/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.database; - -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; - -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_database/android/user-agent.gradle b/packages/firebase_database/android/user-agent.gradle deleted file mode 100644 index 4c70fc14a2fe..000000000000 --- a/packages/firebase_database/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-rtdb" -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_database/example/README.md b/packages/firebase_database/example/README.md deleted file mode 100755 index 46c4d1b17e06..000000000000 --- a/packages/firebase_database/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_database_example - -Demonstrates how to use the firebase_database plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_database/example/android.iml b/packages/firebase_database/example/android.iml deleted file mode 100755 index 462b903e05b6..000000000000 --- a/packages/firebase_database/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_database/example/android/app/build.gradle b/packages/firebase_database/example/android/app/build.gradle deleted file mode 100755 index fef467aa8a1a..000000000000 --- a/packages/firebase_database/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId 'io.flutter.plugins.firebasedatabaseexample' - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_database/example/android/app/google-services.json b/packages/firebase_database/example/android/app/google-services.json deleted file mode 100644 index 223cb29b8f38..000000000000 --- a/packages/firebase_database/example/android/app/google-services.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "project_info": { - "project_number": "159623150305", - "firebase_url": "https://flutter-firebase-plugins.firebaseio.com", - "project_id": "flutter-firebase-plugins", - "storage_bucket": "flutter-firebase-plugins.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:c68d3ad04a4046db", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasedatabaseexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} diff --git a/packages/firebase_database/example/android/app/gradle.properties b/packages/firebase_database/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_database/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_database/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_database/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_database/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_database/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_database/example/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index 794bfa20d51d..000000000000 --- a/packages/firebase_database/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/packages/firebase_database/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java b/packages/firebase_database/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java deleted file mode 100644 index 0c58e26a5c1b..000000000000 --- a/packages/firebase_database/example/android/app/src/main/java/io/flutter/plugins/firebasedatabaseexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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.firebasedatabaseexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_database/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_database/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100755 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_database/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_database/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100755 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_database/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_database/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100755 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_database/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_database/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100755 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_database/example/android/build.gradle b/packages/firebase_database/example/android/build.gradle deleted file mode 100755 index 359119307d55..000000000000 --- a/packages/firebase_database/example/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_database/example/android/gradle.properties b/packages/firebase_database/example/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_database/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_database/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_database/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/firebase_database/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_database/example/android/settings.gradle b/packages/firebase_database/example/android/settings.gradle deleted file mode 100755 index 115da6cb4f4d..000000000000 --- a/packages/firebase_database/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_database/example/firebase_database_example.iml b/packages/firebase_database/example/firebase_database_example.iml deleted file mode 100755 index 1ae40a0f7f54..000000000000 --- a/packages/firebase_database/example/firebase_database_example.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_database/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_database/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 6c2de8086bcd..000000000000 --- a/packages/firebase_database/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_database/example/ios/Flutter/Debug.xcconfig b/packages/firebase_database/example/ios/Flutter/Debug.xcconfig deleted file mode 100755 index 9803018ca79d..000000000000 --- a/packages/firebase_database/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/packages/firebase_database/example/ios/Flutter/Release.xcconfig b/packages/firebase_database/example/ios/Flutter/Release.xcconfig deleted file mode 100755 index a4a8c604e13d..000000000000 --- a/packages/firebase_database/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/packages/firebase_database/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_database/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 9ad834907b41..000000000000 --- a/packages/firebase_database/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,481 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C6F5A711EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */; }; - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 */; }; - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */, - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */, - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 = ( - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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 */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C6F5A711EC3CCCC008D64B5 /* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseDatabaseExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseDatabaseExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_database/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_database/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_database/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_database/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_database/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index 1c9580788197..000000000000 --- a/packages/firebase_database/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_database/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_database/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_database/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_database/example/ios/Runner/AppDelegate.h b/packages/firebase_database/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e990f2e..000000000000 --- a/packages/firebase_database/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_database/example/ios/Runner/AppDelegate.m b/packages/firebase_database/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c88eb60..000000000000 --- a/packages/firebase_database/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 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. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index d22f10b2ab63..000000000000 --- a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100755 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100755 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100755 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100755 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100755 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_database/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100755 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 zcmV-m2cP(fP)x~L`~4d)Rspd&<9kFh{hn*KP1LP0~$;u(LfAu zp%fx&qLBcRHx$G|3q(bv@+b;o0*D|jwD-Q9uQR(l*ST}s+uPgQ-MeFwZ#GS?b332? z&Tk$&_miXn3IGq)AmQ)3sisq{raD4(k*bHvpCe-TdWq^NRTEVM)i9xbgQ&ccnUVx* zEY%vS%gDcSg=!tuIK8$Th2_((_h^+7;R|G{n06&O2#6%LK`a}n?h_fL18btz<@lFG za}xS}u?#DBMB> zw^b($1Z)`9G?eP95EKi&$eOy@K%h;ryrR3la%;>|o*>CgB(s>dDcNOXg}CK9SPmD? zmr-s{0wRmxUnbDrYfRvnZ@d z6johZ2sMX{YkGSKWd}m|@V7`Degt-43=2M?+jR%8{(H$&MLLmS;-|JxnX2pnz;el1jsvqQz}pGSF<`mqEXRQ5sC4#BbwnB_4` zc5bFE-Gb#JV3tox9fp-vVEN{(tOCpRse`S+@)?%pz+zVJXSooTrNCUg`R6`hxwb{) zC@{O6MKY8tfZ5@!yy=p5Y|#+myRL=^{tc(6YgAnkg3I(Cd!r5l;|;l-MQ8B`;*SCE z{u)uP^C$lOPM z5d~UhKhRRmvv{LIa^|oavk1$QiEApSrP@~Jjbg`<*dW4TO?4qG%a%sTPUFz(QtW5( zM)lA+5)0TvH~aBaOAs|}?u2FO;yc-CZ1gNM1dAxJ?%m?YsGR`}-xk2*dxC}r5j$d* zE!#Vtbo69h>V4V`BL%_&$} z+oJAo@jQ^Tk`;%xw-4G>hhb&)B?##U+(6Fi7nno`C<|#PVA%$Y{}N-?(Gc$1%tr4Pc}}hm~yY#fTOe!@v9s-ik$dX~|ygArPhByaXn8 zpI^FUjNWMsTFKTP3X7m?UK)3m zp6rI^_zxRYrx6_QmhoWoDR`fp4R7gu6;gdO)!KexaoO2D88F9x#TM1(9Bn7g;|?|o z)~$n&Lh#hCP6_LOPD>a)NmhW})LADx2kq=X7}7wYRj-0?dXr&bHaRWCfSqvzFa=sn z-8^gSyn-RmH=BZ{AJZ~!8n5621GbUJV7Qvs%JNv&$%Q17s_X%s-41vAPfIR>;x0Wlqr5?09S>x#%Qkt>?(&XjFRY}*L6BeQ3 z<6XEBh^S7>AbwGm@XP{RkeEKj6@_o%oV?hDuUpUJ+r#JZO?!IUc;r0R?>mi)*ZpQ) z#((dn=A#i_&EQn|hd)N$#A*fjBFuiHcYvo?@y1 z5|fV=a^a~d!c-%ZbMNqkMKiSzM{Yq=7_c&1H!mXk60Uv32dV;vMg&-kQ)Q{+PFtwc zj|-uQ;b^gts??J*9VxxOro}W~Q9j4Em|zSRv)(WSO9$F$s=Ydu%Q+5DOid~lwk&we zY%W(Z@ofdwPHncEZzZgmqS|!gTj3wQq9rxQy+^eNYKr1mj&?tm@wkO*9@UtnRMG>c aR{jt9+;fr}hV%pg00001^@s67{VYS000c7NklQEG_j zup^)eW&WUIApqy$=APz8jE@awGp)!bsTjDbrJO`$x^ZR^dr;>)LW>{ zs70vpsD38v)19rI=GNk1b(0?Js9~rjsQsu*K;@SD40RB-3^gKU-MYC7G!Bw{fZsqp zih4iIi;Hr_xZ033Iu{sQxLS=}yBXgLMn40d++>aQ0#%8D1EbGZp7+ z5=mK?t31BkVYbGOxE9`i748x`YgCMwL$qMsChbSGSE1`p{nSmadR zcQ#R)(?!~dmtD0+D2!K zR9%!Xp1oOJzm(vbLvT^$IKp@+W2=-}qTzTgVtQ!#Y7Gxz}stUIm<1;oBQ^Sh2X{F4ibaOOx;5ZGSNK z0maF^@(UtV$=p6DXLgRURwF95C=|U8?osGhgOED*b z7woJ_PWXBD>V-NjQAm{~T%sjyJ{5tn2f{G%?J!KRSrrGvQ1(^`YLA5B!~eycY(e5_ z*%aa{at13SxC(=7JT7$IQF~R3sy`Nn%EMv!$-8ZEAryB*yB1k&stni)=)8-ODo41g zkJu~roIgAih94tb=YsL%iH5@^b~kU9M-=aqgXIrbtxMpFy5mekFm#edF9z7RQ6V}R zBIhbXs~pMzt0VWy1Fi$^fh+1xxLDoK09&5&MJl(q#THjPm(0=z2H2Yfm^a&E)V+a5 zbi>08u;bJsDRUKR9(INSc7XyuWv(JsD+BB*0hS)FO&l&7MdViuur@-<-EHw>kHRGY zqoT}3fDv2-m{NhBG8X}+rgOEZ;amh*DqN?jEfQdqxdj08`Sr=C-KmT)qU1 z+9Cl)a1mgXxhQiHVB}l`m;-RpmKy?0*|yl?FXvJkFxuu!fKlcmz$kN(a}i*saM3nr z0!;a~_%Xqy24IxA2rz<+08=B-Q|2PT)O4;EaxP^6qixOv7-cRh?*T?zZU`{nIM-at zTKYWr9rJ=tppQ9I#Z#mLgINVB!pO-^FOcvFw6NhV0gztuO?g ztoA*C-52Q-Z-P#xB4HAY3KQVd%dz1S4PA3vHp0aa=zAO?FCt zC_GaTyVBg2F!bBr3U@Zy2iJgIAt>1sf$JWA9kh{;L+P*HfUBX1Zy{4MgNbDfBV_ly z!y#+753arsZUt@366jIC0klaC@ckuk!qu=pAyf7&QmiBUT^L1&tOHzsK)4n|pmrVT zs2($4=?s~VejTFHbFdDOwG;_58LkIj1Fh@{glkO#F1>a==ymJS$z;gdedT1zPx4Kj ztjS`y_C}%af-RtpehdQDt3a<=W5C4$)9W@QAse;WUry$WYmr51ml9lkeunUrE`-3e zmq1SgSOPNEE-Mf+AGJ$g0M;3@w!$Ej;hMh=v=I+Lpz^n%Pg^MgwyqOkNyu2c^of)C z1~ALor3}}+RiF*K4+4{(1%1j3pif1>sv0r^mTZ?5Jd-It!tfPfiG_p$AY*Vfak%FG z4z#;wLtw&E&?}w+eKG^=#jF7HQzr8rV0mY<1YAJ_uGz~$E13p?F^fPSzXSn$8UcI$ z8er9{5w5iv0qf8%70zV71T1IBB1N}R5Kp%NO0=5wJalZt8;xYp;b{1K) zHY>2wW-`Sl{=NpR%iu3(u6l&)rc%%cSA#aV7WCowfbFR4wcc{LQZv~o1u_`}EJA3>ki`?9CKYTA!rhO)if*zRdd}Kn zEPfYbhoVE~!FI_2YbC5qAj1kq;xP6%J8+?2PAs?`V3}nyFVD#sV3+uP`pi}{$l9U^ zSz}_M9f7RgnnRhaoIJgT8us!1aB&4!*vYF07Hp&}L zCRlop0oK4DL@ISz{2_BPlezc;xj2|I z23RlDNpi9LgTG_#(w%cMaS)%N`e>~1&a3<{Xy}>?WbF>OOLuO+j&hc^YohQ$4F&ze z+hwnro1puQjnKm;vFG~o>`kCeUIlkA-2tI?WBKCFLMBY=J{hpSsQ=PDtU$=duS_hq zHpymHt^uuV1q@uc4bFb{MdG*|VoW@15Osrqt2@8ll0qO=j*uOXn{M0UJX#SUztui9FN4)K3{9!y8PC-AHHvpVTU;x|-7P+taAtyglk#rjlH2 z5Gq8ik}BPaGiM{#Woyg;*&N9R2{J0V+WGB69cEtH7F?U~Kbi6ksi*`CFXsi931q7Y zGO82?whBhN%w1iDetv%~wM*Y;E^)@Vl?VDj-f*RX>{;o_=$fU!&KAXbuadYZ46Zbg z&6jMF=49$uL^73y;;N5jaHYv)BTyfh&`qVLYn?`o6BCA_z-0niZz=qPG!vonK3MW_ zo$V96zM!+kJRs{P-5-rQVse0VBH*n6A58)4uc&gfHMa{gIhV2fGf{st>E8sKyP-$8zp~wJX^A*@DI&-;8>gANXZj zU)R+Y)PB?=)a|Kj>8NXEu^S_h^7R`~Q&7*Kn!xyvzVv&^>?^iu;S~R2e-2fJx-oUb cX)(b1KSk$MOV07*qoM6N<$f&6$jw%VRuvdN2+38CZWny1cRtlsl+0_KtW)EU14Ei(F!UtWuj4IK+3{sK@>rh zs1Z;=(DD&U6+tlyL?UnHVN^&g6QhFi2#HS+*qz;(>63G(`|jRtW|nz$Pv7qTovP!^ zP_jES{mr@O-02w%!^a?^1ZP!_KmQiz0L~jZ=W@Qt`8wzOoclQsAS<5YdH;a(4bGLE zk8s}1If(PSIgVi!XE!5kA?~z*sobvNyohr;=Q_@h2@$6Flyej3J)D-6YfheRGl`HEcPk|~huT_2-U?PfL=4BPV)f1o!%rQ!NMt_MYw-5bUSwQ9Z&zC>u zOrl~UJglJNa%f50Ok}?WB{on`Ci`p^Y!xBA?m@rcJXLxtrE0FhRF3d*ir>yzO|BD$ z3V}HpFcCh6bTzY}Nt_(W%QYd3NG)jJ4<`F<1Od) zfQblTdC&h2lCz`>y?>|9o2CdvC8qZeIZt%jN;B7Hdn2l*k4M4MFEtq`q_#5?}c$b$pf_3y{Y!cRDafZBEj-*OD|gz#PBDeu3QoueOesLzB+O zxjf2wvf6Wwz>@AiOo2mO4=TkAV+g~%_n&R;)l#!cBxjuoD$aS-`IIJv7cdX%2{WT7 zOm%5rs(wqyPE^k5SIpUZ!&Lq4<~%{*>_Hu$2|~Xa;iX*tz8~G6O3uFOS?+)tWtdi| zV2b#;zRN!m@H&jd=!$7YY6_}|=!IU@=SjvGDFtL;aCtw06U;-v^0%k0FOyESt z1Wv$={b_H&8FiRV?MrzoHWd>%v6KTRU;-v^Miiz+@q`(BoT!+<37CKhoKb)|8!+RG z6BQFU^@fRW;s8!mOf2QViKQGk0TVER6EG1`#;Nm39Do^PoT!+<37AD!%oJe86(=et zZ~|sLzU>V-qYiU6V8$0GmU7_K8|Fd0B?+9Un1BhKAz#V~Fk^`mJtlCX#{^8^M8!me z8Yg;8-~>!e<-iG;h*0B1kBKm}hItVGY6WnjVpgnTTAC$rqQ^v)4KvOtpY|sIj@WYg zyw##ZZ5AC2IKNC;^hwg9BPk0wLStlmBr;E|$5GoAo$&Ui_;S9WY62n3)i49|T%C#i017z3J=$RF|KyZWnci*@lW4 z=AKhNN6+m`Q!V3Ye68|8y@%=am>YD0nG99M)NWc20%)gwO!96j7muR}Fr&54SxKP2 zP30S~lt=a*qDlbu3+Av57=9v&vr<6g0&`!8E2fq>I|EJGKs}t|{h7+KT@)LfIV-3K zK)r_fr2?}FFyn*MYoLC>oV-J~eavL2ho4a4^r{E-8m2hi>~hA?_vIG4a*KT;2eyl1 zh_hUvUJpNCFwBvRq5BI*srSle>c6%n`#VNsyC|MGa{(P&08p=C9+WUw9Hl<1o9T4M zdD=_C0F7#o8A_bRR?sFNmU0R6tW`ElnF8p53IdHo#S9(JoZCz}fHwJ6F<&?qrpVqE zte|m%89JQD+XwaPU#%#lVs-@-OL);|MdfINd6!XwP2h(eyafTUsoRkA%&@fe?9m@jw-v(yTTiV2(*fthQH9}SqmsRPVnwwbV$1E(_lkmo&S zF-truCU914_$jpqjr(>Ha4HkM4YMT>m~NosUu&UZ>zirfHo%N6PPs9^_o$WqPA0#5 z%tG>qFCL+b*0s?sZ;Sht0nE7Kl>OVXy=gjWxxK;OJ3yGd7-pZf7JYNcZo2*1SF`u6 zHJyRRxGw9mDlOiXqVMsNe#WX`fC`vrtjSQ%KmLcl(lC>ZOQzG^%iql2w-f_K@r?OE zwCICifM#L-HJyc7Gm>Ern?+Sk3&|Khmu4(~3qa$(m6Ub^U0E5RHq49za|XklN#?kP zl;EstdW?(_4D>kwjWy2f!LM)y?F94kyU3`W!6+AyId-89v}sXJpuic^NLL7GJItl~ zsiuB98AI-(#Mnm|=A-R6&2fwJ0JVSY#Q>&3$zFh|@;#%0qeF=j5Ajq@4i0tIIW z&}sk$&fGwoJpe&u-JeGLi^r?dO`m=y(QO{@h zQqAC7$rvz&5+mo3IqE?h=a~6m>%r5Quapvzq;{y~p zJpyXOBgD9VrW7@#p6l7O?o3feml(DtSL>D^R) zZUY%T2b0-vBAFN7VB;M88!~HuOXi4KcI6aRQ&h|XQ0A?m%j2=l1f0cGP}h(oVfJ`N zz#PpmFC*ieab)zJK<4?^k=g%OjPnkANzbAbmGZHoVRk*mTfm75s_cWVa`l*f$B@xu z5E*?&@seIo#*Y~1rBm!7sF9~~u6Wrj5oICUOuz}CS)jdNIznfzCA(stJ(7$c^e5wN z?lt>eYgbA!kvAR7zYSD&*r1$b|(@;9dcZ^67R0 zXAXJKa|5Sdmj!g578Nwt6d$sXuc&MWezA0Whd`94$h{{?1IwXP4)Tx4obDK%xoFZ_Z zjjHJ_P@R_e5blG@yEjnaJb`l;s%Lb2&=8$&Ct-fV`E^4CUs)=jTk!I}2d&n!f@)bm z@ z_4Dc86+3l2*p|~;o-Sb~oXb_RuLmoifDU^&Te$*FevycC0*nE3Xws8gsWp|Rj2>SM zns)qcYj?^2sd8?N!_w~4v+f-HCF|a$TNZDoNl$I1Uq87euoNgKb6&r26TNrfkUa@o zfdiFA@p{K&mH3b8i!lcoz)V{n8Q@g(vR4ns4r6w;K z>1~ecQR0-<^J|Ndg5fvVUM9g;lbu-){#ghGw(fg>L zh)T5Ljb%lWE;V9L!;Cqk>AV1(rULYF07ZBJbGb9qbSoLAd;in9{)95YqX$J43-dY7YU*k~vrM25 zxh5_IqO0LYZW%oxQ5HOzmk4x{atE*vipUk}sh88$b2tn?!ujEHn`tQLe&vo}nMb&{ zio`xzZ&GG6&ZyN3jnaQy#iVqXE9VT(3tWY$n-)uWDQ|tc{`?fq2F`oQ{;d3aWPg4Hp-(iE{ry>MIPWL> iW8 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_database/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_database/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index f3c28516fb38..000000000000 --- a/packages/firebase_database/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_database/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_database/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 3e13a9908257..000000000000 --- a/packages/firebase_database/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 159623150305-1l2uq0jjcvricku3ah3fuav0v0nvrakp.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.159623150305-1l2uq0jjcvricku3ah3fuav0v0nvrakp - API_KEY - AIzaSyDyzecVw1zXTpBKwfFHxpl7QyYBhimNhUk - GCM_SENDER_ID - 159623150305 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebaseDatabaseExample - PROJECT_ID - flutter-firebase-plugins - STORAGE_BUCKET - flutter-firebase-plugins.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:159623150305:ios:a837cdfe238b8a54 - DATABASE_URL - https://flutter-firebase-plugins.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_database/example/ios/Runner/Info.plist b/packages/firebase_database/example/ios/Runner/Info.plist deleted file mode 100755 index adc773132365..000000000000 --- a/packages/firebase_database/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_database_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_database/example/ios/Runner/main.m b/packages/firebase_database/example/ios/Runner/main.m deleted file mode 100644 index bec320c0bee0..000000000000 --- a/packages/firebase_database/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/firebase_database/example/lib/main.dart b/packages/firebase_database/example/lib/main.dart deleted file mode 100755 index c22374aa3e94..000000000000 --- a/packages/firebase_database/example/lib/main.dart +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:io' show Platform; - -import 'package:flutter/material.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_database/firebase_database.dart'; -import 'package:firebase_database/ui/firebase_animated_list.dart'; - -Future main() async { - final FirebaseApp app = await FirebaseApp.configure( - name: 'db2', - options: Platform.isIOS - ? const FirebaseOptions( - googleAppID: '1:297855924061:ios:c6de2b69b03a5be8', - gcmSenderID: '297855924061', - databaseURL: 'https://flutterfire-cd2f7.firebaseio.com', - ) - : const FirebaseOptions( - googleAppID: '1:297855924061:android:669871c998cc21bd', - apiKey: 'AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk', - databaseURL: 'https://flutterfire-cd2f7.firebaseio.com', - ), - ); - runApp(MaterialApp( - title: 'Flutter Database Example', - home: MyHomePage(app: app), - )); -} - -class MyHomePage extends StatefulWidget { - MyHomePage({this.app}); - final FirebaseApp app; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter; - DatabaseReference _counterRef; - DatabaseReference _messagesRef; - StreamSubscription _counterSubscription; - StreamSubscription _messagesSubscription; - bool _anchorToBottom = false; - - String _kTestKey = 'Hello'; - String _kTestValue = 'world!'; - DatabaseError _error; - - @override - void initState() { - super.initState(); - // Demonstrates configuring to the database using a file - _counterRef = FirebaseDatabase.instance.reference().child('counter'); - // Demonstrates configuring the database directly - final FirebaseDatabase database = FirebaseDatabase(app: widget.app); - _messagesRef = database.reference().child('messages'); - database.reference().child('counter').once().then((DataSnapshot snapshot) { - print('Connected to second database and read ${snapshot.value}'); - }); - database.setPersistenceEnabled(true); - database.setPersistenceCacheSizeBytes(10000000); - _counterRef.keepSynced(true); - _counterSubscription = _counterRef.onValue.listen((Event event) { - setState(() { - _error = null; - _counter = event.snapshot.value ?? 0; - }); - }, onError: (Object o) { - final DatabaseError error = o; - setState(() { - _error = error; - }); - }); - _messagesSubscription = - _messagesRef.limitToLast(10).onChildAdded.listen((Event event) { - print('Child added: ${event.snapshot.value}'); - }, onError: (Object o) { - final DatabaseError error = o; - print('Error: ${error.code} ${error.message}'); - }); - } - - @override - void dispose() { - super.dispose(); - _messagesSubscription.cancel(); - _counterSubscription.cancel(); - } - - Future _increment() async { - // Increment counter in transaction. - final TransactionResult transactionResult = - await _counterRef.runTransaction((MutableData mutableData) async { - mutableData.value = (mutableData.value ?? 0) + 1; - return mutableData; - }); - - if (transactionResult.committed) { - _messagesRef.push().set({ - _kTestKey: '$_kTestValue ${transactionResult.dataSnapshot.value}' - }); - } else { - print('Transaction not committed.'); - if (transactionResult.error != null) { - print(transactionResult.error.message); - } - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Flutter Database Example'), - ), - body: Column( - children: [ - Flexible( - child: Center( - child: _error == null - ? Text( - 'Button tapped $_counter time${_counter == 1 ? '' : 's'}.\n\n' - 'This includes all devices, ever.', - ) - : Text( - 'Error retrieving button tap count:\n${_error.message}', - ), - ), - ), - ListTile( - leading: Checkbox( - onChanged: (bool value) { - setState(() { - _anchorToBottom = value; - }); - }, - value: _anchorToBottom, - ), - title: const Text('Anchor to bottom'), - ), - Flexible( - child: FirebaseAnimatedList( - key: ValueKey(_anchorToBottom), - query: _messagesRef, - reverse: _anchorToBottom, - sort: _anchorToBottom - ? (DataSnapshot a, DataSnapshot b) => b.key.compareTo(a.key) - : null, - itemBuilder: (BuildContext context, DataSnapshot snapshot, - Animation animation, int index) { - return SizeTransition( - sizeFactor: animation, - child: Text("$index: ${snapshot.value.toString()}"), - ); - }, - ), - ), - ], - ), - floatingActionButton: FloatingActionButton( - onPressed: _increment, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), - ); - } -} diff --git a/packages/firebase_database/example/pubspec.yaml b/packages/firebase_database/example/pubspec.yaml deleted file mode 100755 index 3c1735eab718..000000000000 --- a/packages/firebase_database/example/pubspec.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: firebase_database_example -description: Demonstrates how to use the firebase_database plugin. - -dependencies: - flutter: - sdk: flutter - firebase_database: - path: ../ - firebase_core: ^0.4.0 - -dev_dependencies: - flutter_driver: - sdk: flutter - test: any - -flutter: - uses-material-design: true diff --git a/packages/firebase_database/example/test_driver/firebase_database.dart b/packages/firebase_database/example/test_driver/firebase_database.dart deleted file mode 100644 index c40cc0823d90..000000000000 --- a/packages/firebase_database/example/test_driver/firebase_database.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'dart:async'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_database/firebase_database.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$FirebaseDatabase', () { - final FirebaseDatabase database = FirebaseDatabase.instance; - - test('runTransaction', () async { - final DatabaseReference ref = database.reference().child('counter'); - final DataSnapshot snapshot = await ref.once(); - final int value = snapshot.value ?? 0; - final TransactionResult transactionResult = - await ref.runTransaction((MutableData mutableData) async { - mutableData.value = (mutableData.value ?? 0) + 1; - return mutableData; - }); - expect(transactionResult.committed, true); - expect(transactionResult.dataSnapshot.value > value, true); - }); - }); -} diff --git a/packages/firebase_database/example/test_driver/firebase_database_test.dart b/packages/firebase_database/example/test_driver/firebase_database_test.dart deleted file mode 100644 index 08cdadbd0809..000000000000 --- a/packages/firebase_database/example/test_driver/firebase_database_test.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:test/test.dart'; - -void main() { - test('FirebaseDatabase driver test', () async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); - }); -} diff --git a/packages/firebase_database/ios/Assets/.gitkeep b/packages/firebase_database/ios/Assets/.gitkeep deleted file mode 100755 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.h b/packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.h deleted file mode 100644 index adc9034e88f2..000000000000 --- a/packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2017 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 - -@interface FLTFirebaseDatabasePlugin : NSObject - -@property(nonatomic) NSMutableDictionary *updatedSnapshots; - -@end diff --git a/packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.m b/packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.m deleted file mode 100644 index 8a0d173d1fb8..000000000000 --- a/packages/firebase_database/ios/Classes/FirebaseDatabasePlugin.m +++ /dev/null @@ -1,341 +0,0 @@ -// Copyright 2017 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 "FirebaseDatabasePlugin.h" -#import "UserAgent.h" - -#import - -static FlutterError *getFlutterError(NSError *error) { - if (error == nil) return nil; - - return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %ld", error.code] - message:error.domain - details:error.localizedDescription]; -} - -static NSDictionary *getDictionaryFromError(NSError *error) { - if (!error) { - return nil; - } - return @{ - @"code" : @(error.code), - @"message" : error.domain ?: [NSNull null], - @"details" : error.localizedDescription ?: [NSNull null], - }; -} - -@interface FLTFirebaseDatabasePlugin () - -@end - -FIRDatabaseReference *getReference(FIRDatabase *database, NSDictionary *arguments) { - NSString *path = arguments[@"path"]; - FIRDatabaseReference *ref = database.reference; - if ([path length] > 0) ref = [ref child:path]; - return ref; -} - -FIRDatabaseQuery *getDatabaseQuery(FIRDatabase *database, NSDictionary *arguments) { - FIRDatabaseQuery *query = getReference(database, arguments); - NSDictionary *parameters = arguments[@"parameters"]; - NSString *orderBy = parameters[@"orderBy"]; - if ([orderBy isEqualToString:@"child"]) { - query = [query queryOrderedByChild:parameters[@"orderByChildKey"]]; - } else if ([orderBy isEqualToString:@"key"]) { - query = [query queryOrderedByKey]; - } else if ([orderBy isEqualToString:@"value"]) { - query = [query queryOrderedByValue]; - } else if ([orderBy isEqualToString:@"priority"]) { - query = [query queryOrderedByPriority]; - } - id startAt = parameters[@"startAt"]; - if (startAt) { - id startAtKey = parameters[@"startAtKey"]; - if (startAtKey) { - query = [query queryStartingAtValue:startAt childKey:startAtKey]; - } else { - query = [query queryStartingAtValue:startAt]; - } - } - id endAt = parameters[@"endAt"]; - if (endAt) { - id endAtKey = parameters[@"endAtKey"]; - if (endAtKey) { - query = [query queryEndingAtValue:endAt childKey:endAtKey]; - } else { - query = [query queryEndingAtValue:endAt]; - } - } - id equalTo = parameters[@"equalTo"]; - if (equalTo) { - id equalToKey = parameters[@"equalToKey"]; - if (equalToKey) { - query = [query queryEqualToValue:equalTo childKey:equalToKey]; - } else { - query = [query queryEqualToValue:equalTo]; - } - } - NSNumber *limitToFirst = parameters[@"limitToFirst"]; - if (limitToFirst) { - query = [query queryLimitedToFirst:limitToFirst.intValue]; - } - NSNumber *limitToLast = parameters[@"limitToLast"]; - if (limitToLast) { - query = [query queryLimitedToLast:limitToLast.intValue]; - } - return query; -} - -FIRDataEventType parseEventType(NSString *eventTypeString) { - if ([@"_EventType.childAdded" isEqual:eventTypeString]) { - return FIRDataEventTypeChildAdded; - } else if ([@"_EventType.childRemoved" isEqual:eventTypeString]) { - return FIRDataEventTypeChildRemoved; - } else if ([@"_EventType.childChanged" isEqual:eventTypeString]) { - return FIRDataEventTypeChildChanged; - } else if ([@"_EventType.childMoved" isEqual:eventTypeString]) { - return FIRDataEventTypeChildMoved; - } else if ([@"_EventType.value" isEqual:eventTypeString]) { - return FIRDataEventTypeValue; - } - assert(false); - return 0; -} - -id roundDoubles(id value) { - // Workaround for https://github.com/firebase/firebase-ios-sdk/issues/91 - // The Firebase iOS SDK sometimes returns doubles when ints were stored. - // We detect doubles that can be converted to ints without loss of precision - // and convert them. - if ([value isKindOfClass:[NSNumber class]]) { - CFNumberType type = CFNumberGetType((CFNumberRef)value); - if (type == kCFNumberDoubleType || type == kCFNumberFloatType) { - if ((double)(long long)[value doubleValue] == [value doubleValue]) { - return [NSNumber numberWithLongLong:(long long)[value doubleValue]]; - } - } - } else if ([value isKindOfClass:[NSArray class]]) { - NSMutableArray *result = [NSMutableArray arrayWithCapacity:[value count]]; - [value enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [result addObject:roundDoubles(obj)]; - }]; - return result; - } else if ([value isKindOfClass:[NSDictionary class]]) { - NSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity:[value count]]; - [value enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - result[key] = roundDoubles(obj); - }]; - return result; - } - return value; -} - -@interface FLTFirebaseDatabasePlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FLTFirebaseDatabasePlugin - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_database" - binaryMessenger:[registrar messenger]]; - FLTFirebaseDatabasePlugin *instance = [[FLTFirebaseDatabasePlugin alloc] init]; - instance.channel = channel; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - self.updatedSnapshots = [NSMutableDictionary new]; - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - FIRDatabase *database; - NSString *appName = call.arguments[@"app"]; - NSString *databaseURL = call.arguments[@"databaseURL"]; - if (![appName isEqual:[NSNull null]] && ![databaseURL isEqual:[NSNull null]]) { - database = [FIRDatabase databaseForApp:[FIRApp appNamed:appName] URL:databaseURL]; - } else if (![appName isEqual:[NSNull null]]) { - database = [FIRDatabase databaseForApp:[FIRApp appNamed:appName]]; - } else if (![databaseURL isEqual:[NSNull null]]) { - database = [FIRDatabase databaseWithURL:databaseURL]; - } else { - database = [FIRDatabase database]; - } - void (^defaultCompletionBlock)(NSError *, FIRDatabaseReference *) = - ^(NSError *error, FIRDatabaseReference *ref) { - result(getFlutterError(error)); - }; - if ([@"FirebaseDatabase#goOnline" isEqualToString:call.method]) { - [database goOnline]; - result(nil); - } else if ([@"FirebaseDatabase#goOffline" isEqualToString:call.method]) { - [database goOffline]; - result(nil); - } else if ([@"FirebaseDatabase#purgeOutstandingWrites" isEqualToString:call.method]) { - [database purgeOutstandingWrites]; - result(nil); - } else if ([@"FirebaseDatabase#setPersistenceEnabled" isEqualToString:call.method]) { - NSNumber *value = call.arguments[@"enabled"]; - @try { - database.persistenceEnabled = value.boolValue; - result([NSNumber numberWithBool:YES]); - } @catch (NSException *exception) { - if ([@"FIRDatabaseAlreadyInUse" isEqualToString:exception.name]) { - // Database is already in use, e.g. after hot reload/restart. - result([NSNumber numberWithBool:NO]); - } else { - @throw; - } - } - } else if ([@"FirebaseDatabase#setPersistenceCacheSizeBytes" isEqualToString:call.method]) { - NSNumber *value = call.arguments[@"cacheSize"]; - @try { - database.persistenceCacheSizeBytes = value.unsignedIntegerValue; - result([NSNumber numberWithBool:YES]); - } @catch (NSException *exception) { - if ([@"FIRDatabaseAlreadyInUse" isEqualToString:exception.name]) { - // Database is already in use, e.g. after hot reload/restart. - result([NSNumber numberWithBool:NO]); - } else { - @throw; - } - } - } else if ([@"DatabaseReference#set" isEqualToString:call.method]) { - [getReference(database, call.arguments) setValue:call.arguments[@"value"] - andPriority:call.arguments[@"priority"] - withCompletionBlock:defaultCompletionBlock]; - } else if ([@"DatabaseReference#update" isEqualToString:call.method]) { - [getReference(database, call.arguments) updateChildValues:call.arguments[@"value"] - withCompletionBlock:defaultCompletionBlock]; - } else if ([@"DatabaseReference#setPriority" isEqualToString:call.method]) { - [getReference(database, call.arguments) setPriority:call.arguments[@"priority"] - withCompletionBlock:defaultCompletionBlock]; - } else if ([@"DatabaseReference#runTransaction" isEqualToString:call.method]) { - [getReference(database, call.arguments) - runTransactionBlock:^FIRTransactionResult *_Nonnull(FIRMutableData *_Nonnull currentData) { - // Create semaphore to allow native side to wait while snapshot - // updates occur on the Dart side. - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - - NSObject *snapshot = - @{@"key" : currentData.key ?: [NSNull null], @"value" : currentData.value}; - - __block bool shouldAbort = false; - - [self.channel invokeMethod:@"DoTransaction" - arguments:@{ - @"transactionKey" : call.arguments[@"transactionKey"], - @"snapshot" : snapshot - } - result:^(id _Nullable result) { - if ([result isKindOfClass:[FlutterError class]]) { - FlutterError *flutterError = ((FlutterError *)result); - NSLog(@"Error code: %@", flutterError.code); - NSLog(@"Error message: %@", flutterError.message); - NSLog(@"Error details: %@", flutterError.details); - shouldAbort = true; - } else if ([result isEqual:FlutterMethodNotImplemented]) { - NSLog(@"DoTransaction not implemented on the Dart side."); - shouldAbort = true; - } else { - [self.updatedSnapshots - setObject:result - forKey:call.arguments[@"transactionKey"]]; - } - dispatch_semaphore_signal(semaphore); - }]; - - // Wait while Dart side updates the snapshot. Incoming transactionTimeout is in - // milliseconds so converting to nanoseconds for use with dispatch_semaphore_wait. - long result = dispatch_semaphore_wait( - semaphore, - dispatch_time(DISPATCH_TIME_NOW, - [call.arguments[@"transactionTimeout"] integerValue] * 1000000)); - - if (result == 0 && !shouldAbort) { - // Set FIRMutableData value to value returned from the Dart side. - currentData.value = - [self.updatedSnapshots objectForKey:call.arguments[@"transactionKey"]][@"value"]; - } else { - if (result != 0) { - NSLog(@"Transaction at %@ timed out.", [getReference(database, call.arguments) URL]); - } - return [FIRTransactionResult abort]; - } - - return [FIRTransactionResult successWithValue:currentData]; - } - andCompletionBlock:^(NSError *_Nullable error, BOOL committed, - FIRDataSnapshot *_Nullable snapshot) { - // Invoke transaction completion on the Dart side. - result(@{ - @"transactionKey" : call.arguments[@"transactionKey"], - @"error" : getDictionaryFromError(error) ?: [NSNull null], - @"committed" : [NSNumber numberWithBool:committed], - @"snapshot" : @{@"key" : snapshot.key ?: [NSNull null], @"value" : snapshot.value} - }); - }]; - } else if ([@"OnDisconnect#set" isEqualToString:call.method]) { - [getReference(database, call.arguments) onDisconnectSetValue:call.arguments[@"value"] - andPriority:call.arguments[@"priority"] - withCompletionBlock:defaultCompletionBlock]; - } else if ([@"OnDisconnect#update" isEqualToString:call.method]) { - [getReference(database, call.arguments) onDisconnectUpdateChildValues:call.arguments[@"value"] - withCompletionBlock:defaultCompletionBlock]; - } else if ([@"OnDisconnect#cancel" isEqualToString:call.method]) { - [getReference(database, call.arguments) - cancelDisconnectOperationsWithCompletionBlock:defaultCompletionBlock]; - } else if ([@"Query#observe" isEqualToString:call.method]) { - FIRDataEventType eventType = parseEventType(call.arguments[@"eventType"]); - __block FIRDatabaseHandle handle = [getDatabaseQuery(database, call.arguments) - observeEventType:eventType - andPreviousSiblingKeyWithBlock:^(FIRDataSnapshot *snapshot, NSString *previousSiblingKey) { - [self.channel invokeMethod:@"Event" - arguments:@{ - @"handle" : [NSNumber numberWithUnsignedInteger:handle], - @"snapshot" : @{ - @"key" : snapshot.key ?: [NSNull null], - @"value" : roundDoubles(snapshot.value) ?: [NSNull null], - }, - @"previousSiblingKey" : previousSiblingKey ?: [NSNull null], - }]; - } - withCancelBlock:^(NSError *error) { - [self.channel invokeMethod:@"Error" - arguments:@{ - @"handle" : [NSNumber numberWithUnsignedInteger:handle], - @"error" : getDictionaryFromError(error), - }]; - }]; - result([NSNumber numberWithUnsignedInteger:handle]); - } else if ([@"Query#removeObserver" isEqualToString:call.method]) { - FIRDatabaseHandle handle = [call.arguments[@"handle"] unsignedIntegerValue]; - [getDatabaseQuery(database, call.arguments) removeObserverWithHandle:handle]; - result(nil); - } else if ([@"Query#keepSynced" isEqualToString:call.method]) { - NSNumber *value = call.arguments[@"value"]; - [getDatabaseQuery(database, call.arguments) keepSynced:value.boolValue]; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -@end diff --git a/packages/firebase_database/ios/firebase_database.podspec b/packages/firebase_database/ios/firebase_database.podspec deleted file mode 100755 index eab0bfacedab..000000000000 --- a/packages/firebase_database/ios/firebase_database.podspec +++ /dev/null @@ -1,32 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_database' - s.version = '0.0.1' - s.summary = 'Firebase Database plugin for Flutter.' - s.description = <<-DESC -Firebase Database plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_database' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Database' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-rtdb\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_database/lib/firebase_database.dart b/packages/firebase_database/lib/firebase_database.dart deleted file mode 100755 index 9ae46229e71d..000000000000 --- a/packages/firebase_database/lib/firebase_database.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library firebase_database; - -import 'dart:async'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; - -import 'src/utils/push_id_generator.dart'; - -part 'src/database_reference.dart'; -part 'src/event.dart'; -part 'src/firebase_database.dart'; -part 'src/query.dart'; -part 'src/on_disconnect.dart'; diff --git a/packages/firebase_database/lib/src/database_reference.dart b/packages/firebase_database/lib/src/database_reference.dart deleted file mode 100644 index ddf22325e32a..000000000000 --- a/packages/firebase_database/lib/src/database_reference.dart +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_database; - -/// DatabaseReference represents a particular location in your Firebase -/// Database and can be used for reading or writing data to that location. -/// -/// This class is the starting point for all Firebase Database operations. -/// After you’ve obtained your first DatabaseReference via -/// `FirebaseDatabase.reference()`, you can use it to read data -/// (ie. `onChildAdded`), write data (ie. `setValue`), and to create new -/// `DatabaseReference`s (ie. `child`). -class DatabaseReference extends Query { - DatabaseReference._(FirebaseDatabase database, List pathComponents) - : super._(database: database, pathComponents: pathComponents); - - /// Gets a DatabaseReference for the location at the specified relative - /// path. The relative path can either be a simple child key (e.g. ‘fred’) or - /// a deeper slash-separated path (e.g. ‘fred/name/first’). - DatabaseReference child(String path) { - return DatabaseReference._(_database, - (List.from(_pathComponents)..addAll(path.split('/')))); - } - - /// Gets a DatabaseReference for the parent location. If this instance - /// refers to the root of your Firebase Database, it has no parent, and - /// therefore parent() will return null. - DatabaseReference parent() { - if (_pathComponents.isEmpty) { - return null; - } - return DatabaseReference._( - _database, (List.from(_pathComponents)..removeLast())); - } - - /// Gets a FIRDatabaseReference for the root location. - DatabaseReference root() { - return DatabaseReference._(_database, []); - } - - /// Gets the last token in a Firebase Database location (e.g. ‘fred’ in - /// https://SampleChat.firebaseIO-demo.com/users/fred) - String get key => _pathComponents.last; - - /// Generates a new child location using a unique key and returns a - /// DatabaseReference to it. This is useful when the children of a Firebase - /// Database location represent a list of items. - /// - /// The unique key generated by childByAutoId: is prefixed with a - /// client-generated timestamp so that the resulting list will be - /// chronologically-sorted. - DatabaseReference push() { - final String key = PushIdGenerator.generatePushChildName(); - final List childPath = List.from(_pathComponents)..add(key); - return DatabaseReference._(_database, childPath); - } - - /// Write `value` to the location with the specified `priority` if applicable. - /// - /// This will overwrite any data at this location and all child locations. - /// - /// Data types that are allowed are String, boolean, int, double, Map, List. - /// - /// The effect of the write will be visible immediately and the corresponding - /// events will be triggered. Synchronization of the data to the Firebase - /// Database servers will also be started. - /// - /// Passing null for the new value means all data at this location or any - /// child location will be deleted. - Future set(dynamic value, {dynamic priority}) { - return _database._channel.invokeMethod( - 'DatabaseReference#set', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'value': value, - 'priority': priority, - }, - ); - } - - /// Update the node with the `value` - Future update(Map value) { - return _database._channel.invokeMethod( - 'DatabaseReference#update', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'value': value, - }, - ); - } - - /// Sets a priority for the data at this Firebase Database location. - /// - /// Priorities can be used to provide a custom ordering for the children at a - /// location (if no priorities are specified, the children are ordered by - /// key). - /// - /// You cannot set a priority on an empty location. For this reason - /// set() should be used when setting initial data with a specific priority - /// and setPriority() should be used when updating the priority of existing - /// data. - /// - /// Children are sorted based on this priority using the following rules: - /// - /// Children with no priority come first. Children with a number as their - /// priority come next. They are sorted numerically by priority (small to - /// large). Children with a string as their priority come last. They are - /// sorted lexicographically by priority. Whenever two children have the same - /// priority (including no priority), they are sorted by key. Numeric keys - /// come first (sorted numerically), followed by the remaining keys (sorted - /// lexicographically). - /// - /// Note that priorities are parsed and ordered as IEEE 754 double-precision - /// floating-point numbers. Keys are always stored as strings and are treated - /// as numbers only when they can be parsed as a 32-bit integer. - Future setPriority(dynamic priority) async { - return _database._channel.invokeMethod( - 'DatabaseReference#setPriority', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'priority': priority, - }, - ); - } - - /// Remove the data at this Firebase Database location. Any data at child - /// locations will also be deleted. - /// - /// The effect of the delete will be visible immediately and the corresponding - /// events will be triggered. Synchronization of the delete to the Firebase - /// Database servers will also be started. - /// - /// remove() is equivalent to calling set(null) - Future remove() => set(null); - - /// Performs an optimistic-concurrency transactional update to the data at - /// this Firebase Database location. - Future runTransaction( - TransactionHandler transactionHandler, - {Duration timeout = const Duration(seconds: 5)}) async { - assert(timeout.inMilliseconds > 0, - 'Transaction timeout must be more than 0 milliseconds.'); - - final Completer completer = - Completer(); - - final int transactionKey = FirebaseDatabase._transactions.isEmpty - ? 0 - : FirebaseDatabase._transactions.keys.last + 1; - - FirebaseDatabase._transactions[transactionKey] = transactionHandler; - - TransactionResult toTransactionResult(Map map) { - final DatabaseError databaseError = - map['error'] != null ? DatabaseError._(map['error']) : null; - final bool committed = map['committed']; - final DataSnapshot dataSnapshot = - map['snapshot'] != null ? DataSnapshot._(map['snapshot']) : null; - - FirebaseDatabase._transactions.remove(transactionKey); - - return TransactionResult._(databaseError, committed, dataSnapshot); - } - - _database._channel.invokeMethod( - 'DatabaseReference#runTransaction', { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'transactionKey': transactionKey, - 'transactionTimeout': timeout.inMilliseconds - }).then((dynamic response) { - completer.complete(toTransactionResult(response)); - }); - - return completer.future; - } - - OnDisconnect onDisconnect() { - return OnDisconnect._(_database, this); - } -} - -class ServerValue { - static const Map timestamp = { - '.sv': 'timestamp' - }; -} - -typedef Future TransactionHandler(MutableData mutableData); - -class TransactionResult { - const TransactionResult._(this.error, this.committed, this.dataSnapshot); - final DatabaseError error; - final bool committed; - final DataSnapshot dataSnapshot; -} diff --git a/packages/firebase_database/lib/src/event.dart b/packages/firebase_database/lib/src/event.dart deleted file mode 100644 index c8bf7c540f91..000000000000 --- a/packages/firebase_database/lib/src/event.dart +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_database; - -enum _EventType { - childAdded, - childRemoved, - childChanged, - childMoved, - value, -} - -/// `Event` encapsulates a DataSnapshot and possibly also the key of its -/// previous sibling, which can be used to order the snapshots. -class Event { - Event._(this._data) : snapshot = DataSnapshot._(_data['snapshot']); - - final DataSnapshot snapshot; - Map _data; - - String get previousSiblingKey => _data['previousSiblingKey']; -} - -/// A DataSnapshot contains data from a Firebase Database location. -/// Any time you read Firebase data, you receive the data as a DataSnapshot. -class DataSnapshot { - DataSnapshot._(this._data); - - final Map _data; - - /// The key of the location that generated this DataSnapshot. - String get key => _data['key']; - - /// Returns the contents of this data snapshot as native types. - dynamic get value => _data['value']; -} - -class MutableData { - @visibleForTesting - MutableData.private(this._data); - - final Map _data; - - /// The key of the location that generated this MutableData. - String get key => _data['key']; - - /// Returns the mutable contents of this MutableData as native types. - dynamic get value => _data['value']; - set value(dynamic newValue) => _data['value'] = newValue; -} - -/// A DatabaseError contains code, message and details of a Firebase Database -/// Error that results from a transaction operation at a Firebase Database -/// location. -class DatabaseError { - DatabaseError._(this._data); - - Map _data; - - /// One of the defined status codes, depending on the error. - int get code => _data['code']; - - /// A human-readable description of the error. - String get message => _data['message']; - - /// Human-readable details on the error and additional information. - String get details => _data['details']; - - @override - String toString() => "$runtimeType($code, $message, $details)"; -} diff --git a/packages/firebase_database/lib/src/firebase_database.dart b/packages/firebase_database/lib/src/firebase_database.dart deleted file mode 100644 index f7681c19b618..000000000000 --- a/packages/firebase_database/lib/src/firebase_database.dart +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_database; - -/// The entry point for accessing a Firebase Database. You can get an instance -/// by calling `FirebaseDatabase.instance`. To access a location in the database -/// and read or write data, use `reference()`. -class FirebaseDatabase { - /// Gets an instance of [FirebaseDatabase]. - /// - /// If [app] is specified, its options should include a [databaseURL]. - FirebaseDatabase({this.app, this.databaseURL}) { - if (_initialized) return; - _channel.setMethodCallHandler((MethodCall call) async { - switch (call.method) { - case 'Event': - final Event event = Event._(call.arguments); - _observers[call.arguments['handle']].add(event); - return null; - case 'Error': - final DatabaseError error = DatabaseError._(call.arguments['error']); - _observers[call.arguments['handle']].addError(error); - return null; - case 'DoTransaction': - final MutableData mutableData = - MutableData.private(call.arguments['snapshot']); - final MutableData updated = - await _transactions[call.arguments['transactionKey']]( - mutableData); - return {'value': updated.value}; - default: - throw MissingPluginException( - '${call.method} method not implemented on the Dart side.', - ); - } - }); - _initialized = true; - } - - static final Map> _observers = - >{}; - - static final Map _transactions = - {}; - - static bool _initialized = false; - - static FirebaseDatabase _instance = FirebaseDatabase(); - - final MethodChannel _channel = const MethodChannel( - 'plugins.flutter.io/firebase_database', - ); - - /// The [FirebaseApp] instance to which this [FirebaseDatabase] belongs. - /// - /// If null, the default [FirebaseApp] is used. - final FirebaseApp app; - - /// The URL to which this [FirebaseDatabase] belongs - /// - /// If null, the URL of the specified [FirebaseApp] is used - final String databaseURL; - - /// Gets the instance of FirebaseDatabase for the default Firebase app. - static FirebaseDatabase get instance => _instance; - - /// Gets a DatabaseReference for the root of your Firebase Database. - DatabaseReference reference() => DatabaseReference._(this, []); - - /// Attempts to sets the database persistence to [enabled]. - /// - /// This property must be set before calling methods on database references - /// and only needs to be called once per application. The returned [Future] - /// will complete with `true` if the operation was successful or `false` if - /// the persistence could not be set (because database references have - /// already been created). - /// - /// The Firebase Database client will cache synchronized data and keep track - /// of all writes you’ve initiated while your application is running. It - /// seamlessly handles intermittent network connections and re-sends write - /// operations when the network connection is restored. - /// - /// However by default your write operations and cached data are only stored - /// in-memory and will be lost when your app restarts. By setting [enabled] - /// to `true`, the data will be persisted to on-device (disk) storage and will - /// thus be available again when the app is restarted (even when there is no - /// network connectivity at that time). - Future setPersistenceEnabled(bool enabled) async { - final bool result = await _channel.invokeMethod( - 'FirebaseDatabase#setPersistenceEnabled', - { - 'app': app?.name, - 'databaseURL': databaseURL, - 'enabled': enabled, - }, - ); - return result; - } - - /// Attempts to set the size of the persistence cache. - /// - /// By default the Firebase Database client will use up to 10MB of disk space - /// to cache data. If the cache grows beyond this size, the client will start - /// removing data that hasn’t been recently used. If you find that your - /// application caches too little or too much data, call this method to change - /// the cache size. - /// - /// This property must be set before calling methods on database references - /// and only needs to be called once per application. The returned [Future] - /// will complete with `true` if the operation was successful or `false` if - /// the value could not be set (because database references have already been - /// created). - /// - /// Note that the specified cache size is only an approximation and the size - /// on disk may temporarily exceed it at times. Cache sizes smaller than 1 MB - /// or greater than 100 MB are not supported. - Future setPersistenceCacheSizeBytes(int cacheSize) async { - final bool result = await _channel.invokeMethod( - 'FirebaseDatabase#setPersistenceCacheSizeBytes', - { - 'app': app?.name, - 'databaseURL': databaseURL, - 'cacheSize': cacheSize, - }, - ); - return result; - } - - /// Resumes our connection to the Firebase Database backend after a previous - /// [goOffline] call. - Future goOnline() { - return _channel.invokeMethod( - 'FirebaseDatabase#goOnline', - { - 'app': app?.name, - 'databaseURL': databaseURL, - }, - ); - } - - /// Shuts down our connection to the Firebase Database backend until - /// [goOnline] is called. - Future goOffline() { - return _channel.invokeMethod( - 'FirebaseDatabase#goOffline', - { - 'app': app?.name, - 'databaseURL': databaseURL, - }, - ); - } - - /// The Firebase Database client automatically queues writes and sends them to - /// the server at the earliest opportunity, depending on network connectivity. - /// In some cases (e.g. offline usage) there may be a large number of writes - /// waiting to be sent. Calling this method will purge all outstanding writes - /// so they are abandoned. - /// - /// All writes will be purged, including transactions and onDisconnect writes. - /// The writes will be rolled back locally, perhaps triggering events for - /// affected event listeners, and the client will not (re-)send them to the - /// Firebase Database backend. - Future purgeOutstandingWrites() { - return _channel.invokeMethod( - 'FirebaseDatabase#purgeOutstandingWrites', - { - 'app': app?.name, - 'databaseURL': databaseURL, - }, - ); - } -} diff --git a/packages/firebase_database/lib/src/on_disconnect.dart b/packages/firebase_database/lib/src/on_disconnect.dart deleted file mode 100644 index 2d44315e069e..000000000000 --- a/packages/firebase_database/lib/src/on_disconnect.dart +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_database; - -class OnDisconnect { - OnDisconnect._(this._database, DatabaseReference reference) - : path = reference.path; - - final FirebaseDatabase _database; - final String path; - - Future set(dynamic value, {dynamic priority}) { - return _database._channel.invokeMethod( - 'OnDisconnect#set', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'value': value, - 'priority': priority - }, - ); - } - - Future remove() => set(null); - - Future cancel() { - return _database._channel.invokeMethod( - 'OnDisconnect#cancel', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path - }, - ); - } - - Future update(Map value) { - return _database._channel.invokeMethod( - 'OnDisconnect#update', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'value': value - }, - ); - } -} diff --git a/packages/firebase_database/lib/src/query.dart b/packages/firebase_database/lib/src/query.dart deleted file mode 100644 index f91c5d4cf7d4..000000000000 --- a/packages/firebase_database/lib/src/query.dart +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_database; - -/// Represents a query over the data at a particular location. -class Query { - Query._( - {@required FirebaseDatabase database, - @required List pathComponents, - Map parameters}) - : _database = database, - _pathComponents = pathComponents, - _parameters = parameters ?? - Map.unmodifiable({}), - assert(database != null); - - final FirebaseDatabase _database; - final List _pathComponents; - final Map _parameters; - - /// Slash-delimited path representing the database location of this query. - String get path => _pathComponents.join('/'); - - Query _copyWithParameters(Map parameters) { - return Query._( - database: _database, - pathComponents: _pathComponents, - parameters: Map.unmodifiable( - Map.from(_parameters)..addAll(parameters), - ), - ); - } - - Map buildArguments() { - return Map.from(_parameters) - ..addAll({ - 'path': path, - }); - } - - Stream _observe(_EventType eventType) { - Future _handle; - // It's fine to let the StreamController be garbage collected once all the - // subscribers have cancelled; this analyzer warning is safe to ignore. - StreamController controller; // ignore: close_sinks - controller = StreamController.broadcast( - onListen: () { - _handle = _database._channel.invokeMethod( - 'Query#observe', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'parameters': _parameters, - 'eventType': eventType.toString(), - }, - ).then((dynamic result) => result); - _handle.then((int handle) { - FirebaseDatabase._observers[handle] = controller; - }); - }, - onCancel: () { - _handle.then((int handle) async { - await _database._channel.invokeMethod( - 'Query#removeObserver', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'parameters': _parameters, - 'handle': handle, - }, - ); - FirebaseDatabase._observers.remove(handle); - }); - }, - ); - return controller.stream; - } - - /// Listens for a single value event and then stops listening. - Future once() async => (await onValue.first).snapshot; - - /// Fires when children are added. - Stream get onChildAdded => _observe(_EventType.childAdded); - - /// Fires when children are removed. `previousChildKey` is null. - Stream get onChildRemoved => _observe(_EventType.childRemoved); - - /// Fires when children are changed. - Stream get onChildChanged => _observe(_EventType.childChanged); - - /// Fires when children are moved. - Stream get onChildMoved => _observe(_EventType.childMoved); - - /// Fires when the data at this location is updated. `previousChildKey` is null. - Stream get onValue => _observe(_EventType.value); - - /// Create a query constrained to only return child nodes with a value greater - /// than or equal to the given value, using the given orderBy directive or - /// priority as default, and optionally only child nodes with a key greater - /// than or equal to the given key. - Query startAt(dynamic value, {String key}) { - assert(!_parameters.containsKey('startAt')); - assert(value is String || - value is bool || - value is double || - value is int || - value == null); - final Map parameters = {'startAt': value}; - if (key != null) parameters['startAtKey'] = key; - return _copyWithParameters(parameters); - } - - /// Create a query constrained to only return child nodes with a value less - /// than or equal to the given value, using the given orderBy directive or - /// priority as default, and optionally only child nodes with a key less - /// than or equal to the given key. - Query endAt(dynamic value, {String key}) { - assert(!_parameters.containsKey('endAt')); - assert(value is String || - value is bool || - value is double || - value is int || - value == null); - final Map parameters = {'endAt': value}; - if (key != null) parameters['endAtKey'] = key; - return _copyWithParameters(parameters); - } - - /// Create a query constrained to only return child nodes with the given - /// `value` (and `key`, if provided). - /// - /// If a key is provided, there is at most one such child as names are unique. - Query equalTo(dynamic value, {String key}) { - assert(!_parameters.containsKey('equalTo')); - assert(value is String || - value is bool || - value is double || - value is int || - value == null); - final Map parameters = {'equalTo': value}; - if (key != null) parameters['equalToKey'] = key; - return _copyWithParameters(parameters); - } - - /// Create a query with limit and anchor it to the start of the window. - Query limitToFirst(int limit) { - assert(!_parameters.containsKey('limitToFirst')); - return _copyWithParameters({'limitToFirst': limit}); - } - - /// Create a query with limit and anchor it to the end of the window. - Query limitToLast(int limit) { - assert(!_parameters.containsKey('limitToLast')); - return _copyWithParameters({'limitToLast': limit}); - } - - /// Generate a view of the data sorted by values of a particular child key. - /// - /// Intended to be used in combination with [startAt], [endAt], or - /// [equalTo]. - Query orderByChild(String key) { - assert(key != null); - assert(!_parameters.containsKey('orderBy')); - return _copyWithParameters( - {'orderBy': 'child', 'orderByChildKey': key}, - ); - } - - /// Generate a view of the data sorted by key. - /// - /// Intended to be used in combination with [startAt], [endAt], or - /// [equalTo]. - Query orderByKey() { - assert(!_parameters.containsKey('orderBy')); - return _copyWithParameters({'orderBy': 'key'}); - } - - /// Generate a view of the data sorted by value. - /// - /// Intended to be used in combination with [startAt], [endAt], or - /// [equalTo]. - Query orderByValue() { - assert(!_parameters.containsKey('orderBy')); - return _copyWithParameters({'orderBy': 'value'}); - } - - /// Generate a view of the data sorted by priority. - /// - /// Intended to be used in combination with [startAt], [endAt], or - /// [equalTo]. - Query orderByPriority() { - assert(!_parameters.containsKey('orderBy')); - return _copyWithParameters({'orderBy': 'priority'}); - } - - /// Obtains a DatabaseReference corresponding to this query's location. - DatabaseReference reference() => - DatabaseReference._(_database, _pathComponents); - - /// By calling keepSynced(true) on a location, the data for that location will - /// automatically be downloaded and kept in sync, even when no listeners are - /// attached for that location. Additionally, while a location is kept synced, - /// it will not be evicted from the persistent disk cache. - Future keepSynced(bool value) { - return _database._channel.invokeMethod( - 'Query#keepSynced', - { - 'app': _database.app?.name, - 'databaseURL': _database.databaseURL, - 'path': path, - 'parameters': _parameters, - 'value': value - }, - ); - } -} diff --git a/packages/firebase_database/lib/src/utils/push_id_generator.dart b/packages/firebase_database/lib/src/utils/push_id_generator.dart deleted file mode 100644 index 187c9b7845d9..000000000000 --- a/packages/firebase_database/lib/src/utils/push_id_generator.dart +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:math'; - -/// Utility class for generating Firebase child node keys. -/// -/// Since the Flutter plugin API is asynchronous, there's no way for us -/// to use the native SDK to generate the node key synchronously and we -/// have to do it ourselves if we want to be able to reference the -/// newly-created node synchronously. -/// -/// This code is based on a Firebase blog post and ported to Dart. -/// https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html -class PushIdGenerator { - static const String PUSH_CHARS = - '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'; - - static final Random _random = Random(); - - static int _lastPushTime; - - static final List _lastRandChars = List(12); - - static String generatePushChildName() { - int now = DateTime.now().millisecondsSinceEpoch; - final bool duplicateTime = (now == _lastPushTime); - _lastPushTime = now; - - final List timeStampChars = List(8); - for (int i = 7; i >= 0; i--) { - timeStampChars[i] = PUSH_CHARS[now % 64]; - now = (now / 64).floor(); - } - assert(now == 0); - - final StringBuffer result = StringBuffer(timeStampChars.join()); - - if (!duplicateTime) { - for (int i = 0; i < 12; i++) { - _lastRandChars[i] = _random.nextInt(64); - } - } else { - _incrementArray(); - } - for (int i = 0; i < 12; i++) { - result.write(PUSH_CHARS[_lastRandChars[i]]); - } - assert(result.length == 20); - return result.toString(); - } - - static void _incrementArray() { - for (int i = 11; i >= 0; i--) { - if (_lastRandChars[i] != 63) { - _lastRandChars[i] = _lastRandChars[i] + 1; - return; - } - _lastRandChars[i] = 0; - } - } -} diff --git a/packages/firebase_database/lib/ui/firebase_animated_list.dart b/packages/firebase_database/lib/ui/firebase_animated_list.dart deleted file mode 100755 index 3fa8a375313c..000000000000 --- a/packages/firebase_database/lib/ui/firebase_animated_list.dart +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import '../firebase_database.dart'; -import 'firebase_list.dart'; -import 'firebase_sorted_list.dart'; - -typedef Widget FirebaseAnimatedListItemBuilder( - BuildContext context, - DataSnapshot snapshot, - Animation animation, - int index, -); - -/// An AnimatedList widget that is bound to a query -class FirebaseAnimatedList extends StatefulWidget { - /// Creates a scrolling container that animates items when they are inserted or removed. - FirebaseAnimatedList({ - Key key, - @required this.query, - @required this.itemBuilder, - this.sort, - this.defaultChild, - this.scrollDirection = Axis.vertical, - this.reverse = false, - this.controller, - this.primary, - this.physics, - this.shrinkWrap = false, - this.padding, - this.duration = const Duration(milliseconds: 300), - }) : super(key: key) { - assert(itemBuilder != null); - } - - /// A Firebase query to use to populate the animated list - final Query query; - - /// Optional function used to compare snapshots when sorting the list - /// - /// The default is to sort the snapshots by key. - final Comparator sort; - - /// A widget to display while the query is loading. Defaults to an empty - /// Container(). - final Widget defaultChild; - - /// Called, as needed, to build list item widgets. - /// - /// List items are only built when they're scrolled into view. - /// - /// The [DataSnapshot] parameter indicates the snapshot that should be used - /// to build the item. - /// - /// Implementations of this callback should assume that [AnimatedList.removeItem] - /// removes an item immediately. - final FirebaseAnimatedListItemBuilder itemBuilder; - - /// The axis along which the scroll view scrolls. - /// - /// Defaults to [Axis.vertical]. - final Axis scrollDirection; - - /// Whether the scroll view scrolls in the reading direction. - /// - /// For example, if the reading direction is left-to-right and - /// [scrollDirection] is [Axis.horizontal], then the scroll view scrolls from - /// left to right when [reverse] is false and from right to left when - /// [reverse] is true. - /// - /// Similarly, if [scrollDirection] is [Axis.vertical], then the scroll view - /// scrolls from top to bottom when [reverse] is false and from bottom to top - /// when [reverse] is true. - /// - /// Defaults to false. - final bool reverse; - - /// An object that can be used to control the position to which this scroll - /// view is scrolled. - /// - /// Must be null if [primary] is true. - final ScrollController controller; - - /// Whether this is the primary scroll view associated with the parent - /// [PrimaryScrollController]. - /// - /// On iOS, this identifies the scroll view that will scroll to top in - /// response to a tap in the status bar. - /// - /// Defaults to true when [scrollDirection] is [Axis.vertical] and - /// [controller] is null. - final bool primary; - - /// How the scroll view should respond to user input. - /// - /// For example, determines how the scroll view continues to animate after the - /// user stops dragging the scroll view. - /// - /// Defaults to matching platform conventions. - final ScrollPhysics physics; - - /// Whether the extent of the scroll view in the [scrollDirection] should be - /// determined by the contents being viewed. - /// - /// If the scroll view does not shrink wrap, then the scroll view will expand - /// to the maximum allowed size in the [scrollDirection]. If the scroll view - /// has unbounded constraints in the [scrollDirection], then [shrinkWrap] must - /// be true. - /// - /// Shrink wrapping the content of the scroll view is significantly more - /// expensive than expanding to the maximum allowed size because the content - /// can expand and contract during scrolling, which means the size of the - /// scroll view needs to be recomputed whenever the scroll position changes. - /// - /// Defaults to false. - final bool shrinkWrap; - - /// The amount of space by which to inset the children. - final EdgeInsets padding; - - /// The duration of the insert and remove animation. - /// - /// Defaults to const Duration(milliseconds: 300). - final Duration duration; - - @override - FirebaseAnimatedListState createState() => FirebaseAnimatedListState(); -} - -class FirebaseAnimatedListState extends State { - final GlobalKey _animatedListKey = - GlobalKey(); - List _model; - bool _loaded = false; - - @override - void didChangeDependencies() { - if (widget.sort != null) { - _model = FirebaseSortedList( - query: widget.query, - comparator: widget.sort, - onChildAdded: _onChildAdded, - onChildRemoved: _onChildRemoved, - onChildChanged: _onChildChanged, - onValue: _onValue, - ); - } else { - _model = FirebaseList( - query: widget.query, - onChildAdded: _onChildAdded, - onChildRemoved: _onChildRemoved, - onChildChanged: _onChildChanged, - onChildMoved: _onChildMoved, - onValue: _onValue, - ); - } - super.didChangeDependencies(); - } - - @override - void dispose() { - // Cancel the Firebase stream subscriptions - _model.clear(); - - super.dispose(); - } - - void _onChildAdded(int index, DataSnapshot snapshot) { - if (!_loaded) { - return; // AnimatedList is not created yet - } - _animatedListKey.currentState.insertItem(index, duration: widget.duration); - } - - void _onChildRemoved(int index, DataSnapshot snapshot) { - // The child should have already been removed from the model by now - assert(index >= _model.length || _model[index].key != snapshot.key); - _animatedListKey.currentState.removeItem( - index, - (BuildContext context, Animation animation) { - return widget.itemBuilder(context, snapshot, animation, index); - }, - duration: widget.duration, - ); - } - - // No animation, just update contents - void _onChildChanged(int index, DataSnapshot snapshot) { - setState(() {}); - } - - // No animation, just update contents - void _onChildMoved(int fromIndex, int toIndex, DataSnapshot snapshot) { - setState(() {}); - } - - void _onValue(DataSnapshot _) { - setState(() { - _loaded = true; - }); - } - - Widget _buildItem( - BuildContext context, int index, Animation animation) { - return widget.itemBuilder(context, _model[index], animation, index); - } - - @override - Widget build(BuildContext context) { - if (!_loaded) { - return widget.defaultChild ?? Container(); - } - return AnimatedList( - key: _animatedListKey, - itemBuilder: _buildItem, - initialItemCount: _model.length, - scrollDirection: widget.scrollDirection, - reverse: widget.reverse, - controller: widget.controller, - primary: widget.primary, - physics: widget.physics, - shrinkWrap: widget.shrinkWrap, - padding: widget.padding, - ); - } -} diff --git a/packages/firebase_database/lib/ui/firebase_list.dart b/packages/firebase_database/lib/ui/firebase_list.dart deleted file mode 100644 index 2ac087a42988..000000000000 --- a/packages/firebase_database/lib/ui/firebase_list.dart +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:collection'; - -import 'package:flutter/foundation.dart'; - -import '../firebase_database.dart' - show DatabaseError, DataSnapshot, Event, Query; -import 'utils/stream_subscriber_mixin.dart'; - -typedef void ChildCallback(int index, DataSnapshot snapshot); -typedef void ChildMovedCallback( - int fromIndex, int toIndex, DataSnapshot snapshot); -typedef void ValueCallback(DataSnapshot snapshot); -typedef void ErrorCallback(DatabaseError error); - -/// Sorts the results of `query` on the client side using `DataSnapshot.key`. -class FirebaseList extends ListBase - with StreamSubscriberMixin { - FirebaseList({ - @required this.query, - this.onChildAdded, - this.onChildRemoved, - this.onChildChanged, - this.onChildMoved, - this.onValue, - this.onError, - }) { - assert(query != null); - listen(query.onChildAdded, _onChildAdded, onError: _onError); - listen(query.onChildRemoved, _onChildRemoved, onError: _onError); - listen(query.onChildChanged, _onChildChanged, onError: _onError); - listen(query.onChildMoved, _onChildMoved, onError: _onError); - listen(query.onValue, _onValue, onError: _onError); - } - - /// Database query used to populate the list - final Query query; - - /// Called when the child has been added - final ChildCallback onChildAdded; - - /// Called when the child has been removed - final ChildCallback onChildRemoved; - - /// Called when the child has changed - final ChildCallback onChildChanged; - - /// Called when the child has moved - final ChildMovedCallback onChildMoved; - - /// Called when the data of the list has finished loading - final ValueCallback onValue; - - /// Called when an error is reported (e.g. permission denied) - final ErrorCallback onError; - - // ListBase implementation - final List _snapshots = []; - - @override - int get length => _snapshots.length; - - @override - set length(int value) { - throw UnsupportedError("List cannot be modified."); - } - - @override - DataSnapshot operator [](int index) => _snapshots[index]; - - @override - void operator []=(int index, DataSnapshot value) { - throw UnsupportedError("List cannot be modified."); - } - - @override - void clear() { - cancelSubscriptions(); - - // Do not call super.clear(), it will set the length, it's unsupported. - } - - int _indexForKey(String key) { - assert(key != null); - for (int index = 0; index < _snapshots.length; index++) { - if (key == _snapshots[index].key) { - return index; - } - } - return null; - } - - void _onChildAdded(Event event) { - int index = 0; - if (event.previousSiblingKey != null) { - index = _indexForKey(event.previousSiblingKey) + 1; - } - _snapshots.insert(index, event.snapshot); - onChildAdded(index, event.snapshot); - } - - void _onChildRemoved(Event event) { - final int index = _indexForKey(event.snapshot.key); - _snapshots.removeAt(index); - onChildRemoved(index, event.snapshot); - } - - void _onChildChanged(Event event) { - final int index = _indexForKey(event.snapshot.key); - _snapshots[index] = event.snapshot; - onChildChanged(index, event.snapshot); - } - - void _onChildMoved(Event event) { - final int fromIndex = _indexForKey(event.snapshot.key); - _snapshots.removeAt(fromIndex); - - int toIndex = 0; - if (event.previousSiblingKey != null) { - final int prevIndex = _indexForKey(event.previousSiblingKey); - if (prevIndex != null) { - toIndex = prevIndex + 1; - } - } - _snapshots.insert(toIndex, event.snapshot); - onChildMoved(fromIndex, toIndex, event.snapshot); - } - - void _onValue(Event event) { - onValue(event.snapshot); - } - - void _onError(Object o) { - final DatabaseError error = o; - onError?.call(error); - } -} diff --git a/packages/firebase_database/lib/ui/firebase_sorted_list.dart b/packages/firebase_database/lib/ui/firebase_sorted_list.dart deleted file mode 100644 index d9bb592555a9..000000000000 --- a/packages/firebase_database/lib/ui/firebase_sorted_list.dart +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:collection'; - -import 'package:flutter/foundation.dart'; - -import '../firebase_database.dart' - show DatabaseError, DataSnapshot, Event, Query; -import 'firebase_list.dart' show ChildCallback, ErrorCallback, ValueCallback; -import 'utils/stream_subscriber_mixin.dart'; - -/// Sorts the results of `query` on the client side using to the `comparator`. -/// -// TODO(jackson) We don't support children moving around. -// TODO(jackson) Right now this naively sorting the list after an insert. -// We can be smarter about how we handle insertion and keep the list always -// sorted. See example here: -// https://github.com/firebase/FirebaseUI-iOS/blob/master/FirebaseDatabaseUI/FUISortedArray.m -class FirebaseSortedList extends ListBase - with StreamSubscriberMixin { - FirebaseSortedList({ - @required this.query, - @required this.comparator, - this.onChildAdded, - this.onChildRemoved, - this.onChildChanged, - this.onValue, - this.onError, - }) { - assert(query != null); - assert(comparator != null); - listen(query.onChildAdded, _onChildAdded, onError: _onError); - listen(query.onChildRemoved, _onChildRemoved, onError: _onError); - listen(query.onChildChanged, _onChildChanged, onError: _onError); - listen(query.onValue, _onValue, onError: _onError); - } - - /// Database query used to populate the list - final Query query; - - /// The comparator used to sort the list on the client side - final Comparator comparator; - - /// Called when the child has been added - final ChildCallback onChildAdded; - - /// Called when the child has been removed - final ChildCallback onChildRemoved; - - /// Called when the child has changed - final ChildCallback onChildChanged; - - /// Called when the data of the list has finished loading - final ValueCallback onValue; - - /// Called when an error is reported (e.g. permission denied) - final ErrorCallback onError; - - // ListBase implementation - final List _snapshots = []; - - @override - int get length => _snapshots.length; - - @override - set length(int value) { - throw UnsupportedError("List cannot be modified."); - } - - @override - DataSnapshot operator [](int index) => _snapshots[index]; - - @override - void operator []=(int index, DataSnapshot value) { - throw UnsupportedError("List cannot be modified."); - } - - @override - void clear() { - cancelSubscriptions(); - - // Do not call super.clear(), it will set the length, it's unsupported. - } - - void _onChildAdded(Event event) { - _snapshots.add(event.snapshot); - _snapshots.sort(comparator); - onChildAdded(_snapshots.indexOf(event.snapshot), event.snapshot); - } - - void _onChildRemoved(Event event) { - final DataSnapshot snapshot = - _snapshots.firstWhere((DataSnapshot snapshot) { - return snapshot.key == event.snapshot.key; - }); - final int index = _snapshots.indexOf(snapshot); - _snapshots.removeAt(index); - onChildRemoved(index, snapshot); - } - - void _onChildChanged(Event event) { - final DataSnapshot snapshot = - _snapshots.firstWhere((DataSnapshot snapshot) { - return snapshot.key == event.snapshot.key; - }); - final int index = _snapshots.indexOf(snapshot); - _snapshots[index] = event.snapshot; - onChildChanged(index, event.snapshot); - } - - void _onValue(Event event) { - onValue(event.snapshot); - } - - void _onError(Object o) { - final DatabaseError error = o; - onError?.call(error); - } -} diff --git a/packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart b/packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart deleted file mode 100644 index cfc488da04a1..000000000000 --- a/packages/firebase_database/lib/ui/utils/stream_subscriber_mixin.dart +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -/// Mixin for classes that own `StreamSubscription`s and expose an API for -/// disposing of themselves by cancelling the subscriptions -abstract class StreamSubscriberMixin { - List> _subscriptions = >[]; - - /// Listens to a stream and saves it to the list of subscriptions. - void listen(Stream stream, void onData(T data), {Function onError}) { - if (stream != null) { - _subscriptions.add(stream.listen(onData, onError: onError)); - } - } - - /// Cancels all streams that were previously added with listen(). - void cancelSubscriptions() { - _subscriptions - .forEach((StreamSubscription subscription) => subscription.cancel()); - } -} diff --git a/packages/firebase_database/pubspec.yaml b/packages/firebase_database/pubspec.yaml deleted file mode 100755 index 19c3a4e88e76..000000000000 --- a/packages/firebase_database/pubspec.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: firebase_database -description: Flutter plugin for Firebase Database, a cloud-hosted NoSQL database - with realtime data syncing across Android and iOS clients, and offline access. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_database -version: 3.0.5 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.database - iosPrefix: FLT - pluginClass: FirebaseDatabasePlugin - -dependencies: - flutter: - sdk: flutter - firebase_core: ^0.4.0 - -dev_dependencies: - test: ^1.3.0 - mockito: ^3.0.0 - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_database/test/firebase_database_test.dart b/packages/firebase_database/test/firebase_database_test.dart deleted file mode 100755 index 66974ddc8adf..000000000000 --- a/packages/firebase_database/test/firebase_database_test.dart +++ /dev/null @@ -1,594 +0,0 @@ -// Copyright 2017 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_database/firebase_database.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$FirebaseDatabase', () { - const MethodChannel channel = MethodChannel( - 'plugins.flutter.io/firebase_database', - ); - - int mockHandleId = 0; - final List log = []; - final FirebaseApp app = const FirebaseApp( - name: 'testApp', - ); - final String databaseURL = 'https://fake-database-url2.firebaseio.com'; - final FirebaseDatabase database = - FirebaseDatabase(app: app, databaseURL: databaseURL); - - setUp(() async { - channel.setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'Query#observe': - return mockHandleId++; - case 'FirebaseDatabase#setPersistenceEnabled': - return true; - case 'FirebaseDatabase#setPersistenceCacheSizeBytes': - return true; - case 'DatabaseReference#runTransaction': - Map updatedValue; - Future simulateEvent( - int transactionKey, final MutableData mutableData) async { - // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. - // https://github.com/flutter/flutter/issues/33446 - // ignore: deprecated_member_use - await BinaryMessages.handlePlatformMessage( - channel.name, - channel.codec.encodeMethodCall( - MethodCall( - 'DoTransaction', - { - 'transactionKey': transactionKey, - 'snapshot': { - 'key': mutableData.key, - 'value': mutableData.value, - }, - }, - ), - ), - (_) { - updatedValue = channel.codec - .decodeEnvelope(_)['value'] - .cast(); - }, - ); - } - - await simulateEvent( - 0, - MutableData.private({ - 'key': 'fakeKey', - 'value': {'fakeKey': 'fakeValue'}, - })); - - return { - 'error': null, - 'committed': true, - 'snapshot': { - 'key': 'fakeKey', - 'value': updatedValue, - } - }; - default: - return null; - } - }); - log.clear(); - }); - - test('setPersistenceEnabled', () async { - expect(await database.setPersistenceEnabled(false), true); - expect(await database.setPersistenceEnabled(true), true); - expect( - log, - [ - isMethodCall( - 'FirebaseDatabase#setPersistenceEnabled', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'enabled': false, - }, - ), - isMethodCall( - 'FirebaseDatabase#setPersistenceEnabled', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'enabled': true, - }, - ), - ], - ); - }); - - test('setPersistentCacheSizeBytes', () async { - expect(await database.setPersistenceCacheSizeBytes(42), true); - expect( - log, - [ - isMethodCall( - 'FirebaseDatabase#setPersistenceCacheSizeBytes', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'cacheSize': 42, - }, - ), - ], - ); - }); - - test('goOnline', () async { - await database.goOnline(); - expect( - log, - [ - isMethodCall( - 'FirebaseDatabase#goOnline', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - }, - ), - ], - ); - }); - - test('goOffline', () async { - await database.goOffline(); - expect( - log, - [ - isMethodCall( - 'FirebaseDatabase#goOffline', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - }, - ), - ], - ); - }); - - test('purgeOutstandingWrites', () async { - await database.purgeOutstandingWrites(); - expect( - log, - [ - isMethodCall( - 'FirebaseDatabase#purgeOutstandingWrites', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - }, - ), - ], - ); - }); - - group('$DatabaseReference', () { - test('set', () async { - final dynamic value = {'hello': 'world'}; - final int priority = 42; - await database.reference().child('foo').set(value); - await database.reference().child('bar').set(value, priority: priority); - expect( - log, - [ - isMethodCall( - 'DatabaseReference#set', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - 'value': value, - 'priority': null, - }, - ), - isMethodCall( - 'DatabaseReference#set', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'bar', - 'value': value, - 'priority': priority, - }, - ), - ], - ); - }); - test('update', () async { - final dynamic value = {'hello': 'world'}; - await database.reference().child("foo").update(value); - expect( - log, - [ - isMethodCall( - 'DatabaseReference#update', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - 'value': value, - }, - ), - ], - ); - }); - - test('setPriority', () async { - final int priority = 42; - await database.reference().child('foo').setPriority(priority); - expect( - log, - [ - isMethodCall( - 'DatabaseReference#setPriority', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - 'priority': priority, - }, - ), - ], - ); - }); - - test('runTransaction', () async { - final TransactionResult transactionResult = await database - .reference() - .child('foo') - .runTransaction((MutableData mutableData) { - return Future(() { - mutableData.value['fakeKey'] = - 'updated ' + mutableData.value['fakeKey']; - return mutableData; - }); - }); - expect( - log, - [ - isMethodCall( - 'DatabaseReference#runTransaction', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - 'transactionKey': 0, - 'transactionTimeout': 5000, - }, - ), - ], - ); - expect(transactionResult.committed, equals(true)); - expect(transactionResult.dataSnapshot.value, - equals({'fakeKey': 'updated fakeValue'})); - expect( - database.reference().child('foo').runTransaction( - (MutableData mutableData) async => null, - timeout: const Duration(milliseconds: 0), - ), - throwsA(isInstanceOf()), - ); - }); - }); - - group('$OnDisconnect', () { - test('set', () async { - final dynamic value = {'hello': 'world'}; - final int priority = 42; - final DatabaseReference ref = database.reference(); - await ref.child('foo').onDisconnect().set(value); - await ref.child('bar').onDisconnect().set(value, priority: priority); - await ref.child('psi').onDisconnect().set(value, priority: 'priority'); - await ref.child('por').onDisconnect().set(value, priority: value); - expect( - log, - [ - isMethodCall( - 'OnDisconnect#set', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - 'value': value, - 'priority': null, - }, - ), - isMethodCall( - 'OnDisconnect#set', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'bar', - 'value': value, - 'priority': priority, - }, - ), - isMethodCall( - 'OnDisconnect#set', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'psi', - 'value': value, - 'priority': 'priority', - }, - ), - isMethodCall( - 'OnDisconnect#set', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'por', - 'value': value, - 'priority': value, - }, - ), - ], - ); - }); - test('update', () async { - final dynamic value = {'hello': 'world'}; - await database.reference().child("foo").onDisconnect().update(value); - expect( - log, - [ - isMethodCall( - 'OnDisconnect#update', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - 'value': value, - }, - ), - ], - ); - }); - test('cancel', () async { - await database.reference().child("foo").onDisconnect().cancel(); - expect( - log, - [ - isMethodCall( - 'OnDisconnect#cancel', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - }, - ), - ], - ); - }); - test('remove', () async { - await database.reference().child("foo").onDisconnect().remove(); - expect( - log, - [ - isMethodCall( - 'OnDisconnect#set', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': 'foo', - 'value': null, - 'priority': null, - }, - ), - ], - ); - }); - }); - - group('$Query', () { - // TODO(jackson): Write more tests for queries - test('keepSynced, simple query', () async { - final String path = 'foo'; - final Query query = database.reference().child(path); - await query.keepSynced(true); - expect( - log, - [ - isMethodCall( - 'Query#keepSynced', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': path, - 'parameters': {}, - 'value': true, - }, - ), - ], - ); - }); - test('keepSynced, complex query', () async { - final int startAt = 42; - final String path = 'foo'; - final String childKey = 'bar'; - final bool endAt = true; - final String endAtKey = 'baz'; - final Query query = database - .reference() - .child(path) - .orderByChild(childKey) - .startAt(startAt) - .endAt(endAt, key: endAtKey); - await query.keepSynced(false); - final Map expectedParameters = { - 'orderBy': 'child', - 'orderByChildKey': childKey, - 'startAt': startAt, - 'endAt': endAt, - 'endAtKey': endAtKey, - }; - expect( - log, - [ - isMethodCall( - 'Query#keepSynced', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': path, - 'parameters': expectedParameters, - 'value': false - }, - ), - ], - ); - }); - test('observing error events', () async { - mockHandleId = 99; - const int errorCode = 12; - const String errorDetails = 'Some details'; - final Query query = database.reference().child('some path'); - Future simulateError(String errorMessage) async { - // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. - // https://github.com/flutter/flutter/issues/33446 - // ignore: deprecated_member_use - await BinaryMessages.handlePlatformMessage( - channel.name, - channel.codec.encodeMethodCall( - MethodCall('Error', { - 'handle': 99, - 'error': { - 'code': errorCode, - 'message': errorMessage, - 'details': errorDetails, - }, - }), - ), - (_) {}, - ); - } - - final AsyncQueue errors = AsyncQueue(); - - // Subscribe and allow subscription to complete. - final StreamSubscription subscription = - query.onValue.listen((_) {}, onError: errors.add); - await Future.delayed(const Duration(seconds: 0)); - - await simulateError('Bad foo'); - await simulateError('Bad bar'); - final DatabaseError error1 = await errors.remove(); - final DatabaseError error2 = await errors.remove(); - subscription.cancel(); - expect(error1.toString(), 'DatabaseError(12, Bad foo, Some details)'); - expect(error1.code, errorCode); - expect(error1.message, 'Bad foo'); - expect(error1.details, errorDetails); - expect(error2.code, errorCode); - expect(error2.message, 'Bad bar'); - expect(error2.details, errorDetails); - }); - test('observing value events', () async { - mockHandleId = 87; - final String path = 'foo'; - final Query query = database.reference().child(path); - Future simulateEvent(String value) async { - // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. - // https://github.com/flutter/flutter/issues/33446 - // ignore: deprecated_member_use - await BinaryMessages.handlePlatformMessage( - channel.name, - channel.codec.encodeMethodCall( - MethodCall('Event', { - 'handle': 87, - 'snapshot': { - 'key': path, - 'value': value, - }, - }), - ), - (_) {}, - ); - } - - final AsyncQueue events = AsyncQueue(); - - // Subscribe and allow subscription to complete. - final StreamSubscription subscription = - query.onValue.listen(events.add); - await Future.delayed(const Duration(seconds: 0)); - - await simulateEvent('1'); - await simulateEvent('2'); - final Event event1 = await events.remove(); - final Event event2 = await events.remove(); - expect(event1.snapshot.key, path); - expect(event1.snapshot.value, '1'); - expect(event2.snapshot.key, path); - expect(event2.snapshot.value, '2'); - - // Cancel subscription and allow cancellation to complete. - subscription.cancel(); - await Future.delayed(const Duration(seconds: 0)); - - expect( - log, - [ - isMethodCall( - 'Query#observe', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': path, - 'parameters': {}, - 'eventType': '_EventType.value', - }, - ), - isMethodCall( - 'Query#removeObserver', - arguments: { - 'app': app.name, - 'databaseURL': databaseURL, - 'path': path, - 'parameters': {}, - 'handle': 87, - }, - ), - ], - ); - }); - }); - }); -} - -/// Queue whose remove operation is asynchronous, awaiting a corresponding add. -class AsyncQueue { - Map> _completers = >{}; - int _nextToRemove = 0; - int _nextToAdd = 0; - - void add(T element) { - _completer(_nextToAdd++).complete(element); - } - - Future remove() { - return _completer(_nextToRemove++).future; - } - - Completer _completer(int index) { - if (_completers.containsKey(index)) { - return _completers.remove(index); - } else { - return _completers[index] = Completer(); - } - } -} diff --git a/packages/firebase_database/test/firebase_list_test.dart b/packages/firebase_database/test/firebase_list_test.dart deleted file mode 100644 index 559fe8138e31..000000000000 --- a/packages/firebase_database/test/firebase_list_test.dart +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2018 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_database/firebase_database.dart'; -import 'package:firebase_database/ui/firebase_list.dart'; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -void main() { - group('FirebaseList', () { - StreamController onChildAddedStreamController; - StreamController onChildRemovedStreamController; - StreamController onChildChangedStreamController; - StreamController onChildMovedStreamController; - MockQuery query; - FirebaseList list; - Completer callbackCompleter; - - setUp(() { - onChildAddedStreamController = StreamController(); - onChildRemovedStreamController = StreamController(); - onChildChangedStreamController = StreamController(); - onChildMovedStreamController = StreamController(); - query = MockQuery( - onChildAddedStreamController.stream, - onChildRemovedStreamController.stream, - onChildChangedStreamController.stream, - onChildMovedStreamController.stream, - ); - callbackCompleter = Completer(); - - void completeWithChange(int index, DataSnapshot snapshot) { - callbackCompleter.complete(ListChange.at(index, snapshot)); - } - - void completeWithMove(int from, int to, DataSnapshot snapshot) { - callbackCompleter.complete(ListChange.move(from, to, snapshot)); - } - - list = FirebaseList( - query: query, - onChildAdded: completeWithChange, - onChildRemoved: completeWithChange, - onChildChanged: completeWithChange, - onChildMoved: completeWithMove, - ); - }); - - Future resetCompleterOnCallback() async { - final ListChange result = await callbackCompleter.future; - callbackCompleter = Completer(); - return result; - } - - Future processChildAddedEvent(Event event) { - onChildAddedStreamController.add(event); - return resetCompleterOnCallback(); - } - - Future processChildRemovedEvent(Event event) { - onChildRemovedStreamController.add(event); - return resetCompleterOnCallback(); - } - - Future processChildChangedEvent(Event event) { - onChildChangedStreamController.add(event); - return resetCompleterOnCallback(); - } - - Future processChildMovedEvent(Event event) { - onChildMovedStreamController.add(event); - return resetCompleterOnCallback(); - } - - test('can add to empty list', () async { - final DataSnapshot snapshot = MockDataSnapshot('key10', 10); - expect( - await processChildAddedEvent(MockEvent(null, snapshot)), - ListChange.at(0, snapshot), - ); - expect(list, [snapshot]); - }); - - test('can add before first element', () async { - final DataSnapshot snapshot1 = MockDataSnapshot('key10', 10); - final DataSnapshot snapshot2 = MockDataSnapshot('key20', 20); - await processChildAddedEvent(MockEvent(null, snapshot2)); - expect( - await processChildAddedEvent(MockEvent(null, snapshot1)), - ListChange.at(0, snapshot1), - ); - expect(list, [snapshot1, snapshot2]); - }); - - test('can add after last element', () async { - final DataSnapshot snapshot1 = MockDataSnapshot('key10', 10); - final DataSnapshot snapshot2 = MockDataSnapshot('key20', 20); - await processChildAddedEvent(MockEvent(null, snapshot1)); - expect( - await processChildAddedEvent(MockEvent('key10', snapshot2)), - ListChange.at(1, snapshot2), - ); - expect(list, [snapshot1, snapshot2]); - }); - - test('can remove from singleton list', () async { - final DataSnapshot snapshot = MockDataSnapshot('key10', 10); - await processChildAddedEvent(MockEvent(null, snapshot)); - expect( - await processChildRemovedEvent(MockEvent(null, snapshot)), - ListChange.at(0, snapshot), - ); - expect(list, isEmpty); - }); - - test('can remove former of two elements', () async { - final DataSnapshot snapshot1 = MockDataSnapshot('key10', 10); - final DataSnapshot snapshot2 = MockDataSnapshot('key20', 20); - await processChildAddedEvent(MockEvent(null, snapshot2)); - await processChildAddedEvent(MockEvent(null, snapshot1)); - expect( - await processChildRemovedEvent(MockEvent(null, snapshot1)), - ListChange.at(0, snapshot1), - ); - expect(list, [snapshot2]); - }); - - test('can remove latter of two elements', () async { - final DataSnapshot snapshot1 = MockDataSnapshot('key10', 10); - final DataSnapshot snapshot2 = MockDataSnapshot('key20', 20); - await processChildAddedEvent(MockEvent(null, snapshot2)); - await processChildAddedEvent(MockEvent(null, snapshot1)); - expect( - await processChildRemovedEvent(MockEvent('key10', snapshot2)), - ListChange.at(1, snapshot2), - ); - expect(list, [snapshot1]); - }); - - test('can change child', () async { - final DataSnapshot snapshot1 = MockDataSnapshot('key10', 10); - final DataSnapshot snapshot2a = MockDataSnapshot('key20', 20); - final DataSnapshot snapshot2b = MockDataSnapshot('key20', 25); - final DataSnapshot snapshot3 = MockDataSnapshot('key30', 30); - await processChildAddedEvent(MockEvent(null, snapshot3)); - await processChildAddedEvent(MockEvent(null, snapshot2a)); - await processChildAddedEvent(MockEvent(null, snapshot1)); - expect( - await processChildChangedEvent(MockEvent('key10', snapshot2b)), - ListChange.at(1, snapshot2b), - ); - expect(list, [snapshot1, snapshot2b, snapshot3]); - }); - test('can move child', () async { - final DataSnapshot snapshot1 = MockDataSnapshot('key10', 10); - final DataSnapshot snapshot2 = MockDataSnapshot('key20', 20); - final DataSnapshot snapshot3 = MockDataSnapshot('key30', 30); - await processChildAddedEvent(MockEvent(null, snapshot3)); - await processChildAddedEvent(MockEvent(null, snapshot2)); - await processChildAddedEvent(MockEvent(null, snapshot1)); - expect( - await processChildMovedEvent(MockEvent('key30', snapshot1)), - ListChange.move(0, 2, snapshot1), - ); - expect(list, [snapshot2, snapshot3, snapshot1]); - }); - }); -} - -class MockQuery extends Mock implements Query { - MockQuery( - this.onChildAdded, - this.onChildRemoved, - this.onChildChanged, - this.onChildMoved, - ); - - @override - final Stream onChildAdded; - - @override - final Stream onChildRemoved; - - @override - final Stream onChildChanged; - - @override - final Stream onChildMoved; -} - -class ListChange { - ListChange.at(int index, DataSnapshot snapshot) - : this._(index, null, snapshot); - - ListChange.move(int from, int to, DataSnapshot snapshot) - : this._(from, to, snapshot); - - ListChange._(this.index, this.index2, this.snapshot); - - final int index; - final int index2; - final DataSnapshot snapshot; - - @override - String toString() => '$runtimeType[$index, $index2, $snapshot]'; - - @override - bool operator ==(Object o) { - return o is ListChange && - index == o.index && - index2 == o.index2 && - snapshot == o.snapshot; - } - - @override - int get hashCode => index; -} - -class MockEvent implements Event { - MockEvent(this.previousSiblingKey, this.snapshot); - - @override - final String previousSiblingKey; - - @override - final DataSnapshot snapshot; - - @override - String toString() => '$runtimeType[$previousSiblingKey, $snapshot]'; - - @override - bool operator ==(Object o) { - return o is MockEvent && - previousSiblingKey == o.previousSiblingKey && - snapshot == o.snapshot; - } - - @override - int get hashCode => previousSiblingKey.hashCode; -} - -class MockDataSnapshot implements DataSnapshot { - MockDataSnapshot(this.key, this.value); - - @override - final String key; - - @override - final dynamic value; - - @override - String toString() => '$runtimeType[$key, $value]'; - - @override - bool operator ==(Object o) { - return o is MockDataSnapshot && key == o.key && value == o.value; - } - - @override - int get hashCode => key.hashCode; -} diff --git a/packages/firebase_dynamic_links/.gitignore b/packages/firebase_dynamic_links/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_dynamic_links/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_dynamic_links/CHANGELOG.md b/packages/firebase_dynamic_links/CHANGELOG.md deleted file mode 100644 index 04e18d9e9815..000000000000 --- a/packages/firebase_dynamic_links/CHANGELOG.md +++ /dev/null @@ -1,112 +0,0 @@ -## 0.5.0 - -* **Breaking change**. Changed architecture and method names to be able to differentiate between -the dynamic link which opened the app and links clicked during app execution (active and background). -`retrieveDynamicLink` has been replaced with two different functions: -- `getInitialLink` a future to retrieve the link that opened the app -- `onLink` a callback to listen to links opened while the app is active or in background - -## 0.4.0+6 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.4.0+5 - -* Fix the bug below properly by allowing the activity to be null (but still registering the plugin). If activity is null, we don't get a latestIntent, instead we expect the intent listener to grab it. - -## 0.4.0+4 - -* Fixed bug on Android when a headless plugin tries to register this plugin causing a crash due no activity from the registrar. - -## 0.4.0+3 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.4.0+2 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. -* Replace invokeMethod with invokeMapMethod wherever necessary. - -## 0.4.0+1 - -* Fixed bug where link persists after starting an app with a Dynamic Link. -* Fixed bug where retrieving a link would fail when app was already running. - -## 0.4.0 - -* Update dependency on firebase_core to 0.4.0. - -## 0.3.0. - -* Update Android dependencies to 16.1.7. -* **Breaking change**. Dynamic link parameter `domain` replaced with `uriPrefix`. - -## 0.2.1 - -* Throw `PlatformException` if there is an error retrieving dynamic link. - -## 0.2.0+4 - -* Fix crash when receiving `ShortDynamicLink` warnings. - -## 0.2.0+3 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.2.0+2 - -* Remove categories. - -## 0.2.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.2.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.1.1 - -* Update example to create a clickable and copyable link. - -## 0.1.0+2 - -* Change android `invites` dependency to `dynamic links` dependency. - -## 0.1.0+1 - -* Bump Android dependencies to latest. - -## 0.1.0 - -* **Breaking Change** Calls to retrieve dynamic links on iOS always returns null after first call. - -## 0.0.6 - -* Bump Android and Firebase dependency versions. - -## 0.0.5 - -* Added capability to receive dynamic links. - -## 0.0.4 - -* Fixed dynamic link dartdoc generation. - -## 0.0.3 - -* Fixed incorrect homepage link in pubspec. - -## 0.0.2 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.0.1 - -* Initial release with api to create long or short dynamic links. diff --git a/packages/firebase_dynamic_links/LICENSE b/packages/firebase_dynamic_links/LICENSE deleted file mode 100644 index b9f0ba5d5188..000000000000 --- a/packages/firebase_dynamic_links/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018 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_dynamic_links/README.md b/packages/firebase_dynamic_links/README.md deleted file mode 100644 index e5b755d6f421..000000000000 --- a/packages/firebase_dynamic_links/README.md +++ /dev/null @@ -1,156 +0,0 @@ -# Google Dynamic Links for Firebase - -[![pub package](https://img.shields.io/pub/v/firebase_dynamic_links.svg)](https://pub.dartlang.org/packages/firebase_dynamic_links) - -A Flutter plugin to use the [Google Dynamic Links for Firebase API](https://firebase.google.com/docs/dynamic-links/). - -With Dynamic Links, your users get the best available experience for the platform they open your link on. If a user opens a Dynamic Link on iOS or Android, they can be taken directly to the linked content in your native app. If a user opens the same Dynamic Link in a desktop browser, they can be taken to the equivalent content on your website. - -In addition, Dynamic Links work across app installs: if a user opens a Dynamic Link on iOS or Android and doesn't have your app installed, the user can be prompted to install it; then, after installation, your app starts and can access the link. - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -To use this plugin, add `firebase_dynamic_links` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). You must also configure firebase dynamic links for each platform project: Android and iOS (see the example folder or https://codelabs.developers.google.com/codelabs/flutter-firebase/#4 for step by step details). - -## Create Dynamic Links - -You create a Dynamic Link either by using the Firebase console, using a REST API, iOS or Android Builder API, Flutter API, or by forming a URL by adding Dynamic Link parameters to a URI prefix specific to your app. These parameters specify the links you want to open, depending on the user's platform and whether your app is installed. - -Below are instructions to create Dynamic Links using Flutter with the Firebase Dynamic Links API. This API accepts either a long Dynamic Link or an object containing Dynamic Link parameters, and returns a URL like the following example: - -``` -https://example.page.link/WXYZ -``` - -You can create a Dynamic Link programmatically by setting the following parameters and using the `DynamicLinkParameters.buildUrl()` method. - -```dart -final DynamicLinkParameters parameters = DynamicLinkParameters( - uriPrefix: 'https://abc123.app.goo.gl', - link: Uri.parse('https://example.com/'), - androidParameters: AndroidParameters( - packageName: 'com.example.android', - minimumVersion: 125, - ), - iosParameters: IosParameters( - bundleId: 'com.example.ios', - minimumVersion: '1.0.1', - appStoreId: '123456789', - ), - googleAnalyticsParameters: GoogleAnalyticsParameters( - campaign: 'example-promo', - medium: 'social', - source: 'orkut', - ), - itunesConnectAnalyticsParameters: ItunesConnectAnalyticsParameters( - providerToken: '123456', - campaignToken: 'example-promo', - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: 'Example of a Dynamic Link', - description: 'This link works whether app is installed or not!', - ), -); - -final Uri dynamicUrl = await parameters.buildUrl(); -``` - -To create a short Dynamic Link, build `DynamicLinkParameters` the same way, but use the `DynamicLinkParameters.buildShortLink()` method. - -```dart -final ShortDynamicLink shortDynamicLink = await parameters.buildShortLink(); -final Uri shortUrl = shortDynamicLink.shortUrl; -``` - -To shorten a long Dynamic Link, use the DynamicLinkParameters.shortenUrl method. - -```dart -final ShortDynamicLink shortenedLink = await DynamicLinkParameters.shortenUrl( - Uri.parse('https://example.page.link/?link=https://example.com/&apn=com.example.android&ibn=com.example.ios'), - DynamicLinkParametersOptions(ShortDynamicLinkPathLength.unguessable), -); - -final Uri shortUrl = shortenedLink.shortUrl; -``` - -## Handle Received Dynamic Links - -You can receive a Dynamic Link containing a deep link that takes the user to specific content within your app: - -1. In the [Firebase Console](https://console.firebase.google.com), open the Dynamic Links section. - - Accept the terms of service if you are prompted to do so. - - Take note of your project's Dynamic Links URL prefix, which is displayed at the top of the Dynamic Links page. You need your project's Dynamic Links URL prefix to programmatically create Dynamic Links. A Dynamic Links URL prefix looks like `https://YOUR_SUBDOMAIN.page.link`. - -Receiving dynamic links on *iOS* requires a couple more steps than *Android*. If you only want to receive dynamic links on *Android*, skip to step 4. You can also follow a video on the next two steps [here.](https://youtu.be/sFPo296OQqk?t=2m40s) - -2. In the **Info** tab of your *iOS* app's Xcode project: - - Create a new **URL Type** to be used for Dynamic Links. - - Set the **Identifier** field to a unique value and the **URL Schemes** field to be your bundle identifier, which is the default URL scheme used by Dynamic Links. - -3. In the **Capabilities** tab of your app's Xcode project, enable **Associated Domains** and add the following to the **Associated Domains** list: - -``` -applinks:YOUR_SUBDOMAIN.page.link -``` - -4. To receive a dynamic link, call the `getInitialLink()` method from `FirebaseDynamicLinks` which gets the link that opened the app (or null if it was not opened via a dynamic link) -and configure listeners for link callbacks when the application is active or in background calling `onLink`. - -```dart -void main() { - runApp(MaterialApp( - title: 'Dynamic Links Example', - routes: { - '/': (BuildContext context) => MyHomeWidget(), // Default home route - '/helloworld': (BuildContext context) => MyHelloWorldWidget(), - }, - )); -} - -class MyHomeWidgetState extends State { - . - . - . - @override - void initState() { - super.initState(); - this.initDynamicLinks(); - } - - void initDynamicLinks() async { - final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink(); - final Uri deepLink = data?.link; - - if (deepLink != null) { - Navigator.pushNamed(context, deepLink.path); - } - - FirebaseDynamicLinks.instance.onLink( - onSuccess: (PendingDynamicLinkData dynamicLink) async { - final Uri deepLink = dynamicLink?.link; - - if (deepLink != null) { - Navigator.pushNamed(context, deepLink.path); - } - }, - onError: (OnLinkErrorException e) async { - print('onLinkError'); - print(e.message); - } - ); - } - . - . - . -} -``` - -If your app did not open from a dynamic link, `getInitialLink()` will return `null`. - -## Getting Started - -See the `example` directory for a complete sample app using Google Dynamic Links for Firebase. diff --git a/packages/firebase_dynamic_links/android/build.gradle b/packages/firebase_dynamic_links/android/build.gradle deleted file mode 100644 index 01deb838f297..000000000000 --- a/packages/firebase_dynamic_links/android/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -def PLUGIN = "firebase_dynamic_links"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebasedynamiclinks' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-dynamic-links:16.1.8' - implementation 'com.google.firebase:firebase-common:16.1.0' - implementation 'androidx.annotation:annotation:1.0.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_dynamic_links/android/gradle.properties b/packages/firebase_dynamic_links/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_dynamic_links/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_dynamic_links/android/settings.gradle b/packages/firebase_dynamic_links/android/settings.gradle deleted file mode 100644 index 2a833554f85c..000000000000 --- a/packages/firebase_dynamic_links/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_dynamic_links' diff --git a/packages/firebase_dynamic_links/android/src/main/AndroidManifest.xml b/packages/firebase_dynamic_links/android/src/main/AndroidManifest.xml deleted file mode 100644 index 663e4f0f3de9..000000000000 --- a/packages/firebase_dynamic_links/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java deleted file mode 100644 index cd5c5ea2456f..000000000000 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FirebaseDynamicLinksPlugin.java +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasedynamiclinks; - -import android.content.Intent; -import android.net.Uri; -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.dynamiclinks.DynamicLink; -import com.google.firebase.dynamiclinks.FirebaseDynamicLinks; -import com.google.firebase.dynamiclinks.PendingDynamicLinkData; -import com.google.firebase.dynamiclinks.ShortDynamicLink; -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.plugin.common.PluginRegistry.NewIntentListener; -import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** FirebaseDynamicLinksPlugin */ -public class FirebaseDynamicLinksPlugin implements MethodCallHandler, NewIntentListener { - private final Registrar registrar; - private final MethodChannel channel; - - private FirebaseDynamicLinksPlugin(Registrar registrar, MethodChannel channel) { - this.registrar = registrar; - this.channel = channel; - } - - @Override - public boolean onNewIntent(Intent intent) { - FirebaseDynamicLinks.getInstance() - .getDynamicLink(intent) - .addOnSuccessListener( - registrar.activity(), - new OnSuccessListener() { - @Override - public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { - if (pendingDynamicLinkData != null) { - Map dynamicLink = - getMapFromPendingDynamicLinkData(pendingDynamicLinkData); - channel.invokeMethod("onLinkSuccess", dynamicLink); - } - } - }) - .addOnFailureListener( - registrar.activity(), - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - Map exception = new HashMap<>(); - exception.put("code", e.getClass().getSimpleName()); - exception.put("message", e.getMessage()); - exception.put("details", null); - channel.invokeMethod("onLinkError", exception); - } - }); - - return false; - } - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_dynamic_links"); - final FirebaseDynamicLinksPlugin plugin = new FirebaseDynamicLinksPlugin(registrar, channel); - registrar.addNewIntentListener(plugin); - channel.setMethodCallHandler(plugin); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "DynamicLinkParameters#buildUrl": - DynamicLink.Builder urlBuilder = setupParameters(call); - result.success(urlBuilder.buildDynamicLink().getUri().toString()); - break; - case "DynamicLinkParameters#buildShortLink": - DynamicLink.Builder shortLinkBuilder = setupParameters(call); - buildShortDynamicLink(shortLinkBuilder, call, createShortLinkListener(result)); - break; - case "DynamicLinkParameters#shortenUrl": - DynamicLink.Builder builder = FirebaseDynamicLinks.getInstance().createDynamicLink(); - - Uri url = Uri.parse((String) call.argument("url")); - builder.setLongLink(url); - buildShortDynamicLink(builder, call, createShortLinkListener(result)); - break; - case "FirebaseDynamicLinks#getInitialLink": - handleGetInitialDynamicLink(result); - break; - default: - result.notImplemented(); - break; - } - } - - private Map getMapFromPendingDynamicLinkData( - PendingDynamicLinkData pendingDynamicLinkData) { - Map dynamicLink = new HashMap<>(); - dynamicLink.put("link", pendingDynamicLinkData.getLink().toString()); - - Map androidData = new HashMap<>(); - androidData.put("clickTimestamp", pendingDynamicLinkData.getClickTimestamp()); - androidData.put("minimumVersion", pendingDynamicLinkData.getMinimumAppVersion()); - - dynamicLink.put("android", androidData); - return dynamicLink; - } - - private void handleGetInitialDynamicLink(final Result result) { - FirebaseDynamicLinks.getInstance() - .getDynamicLink(registrar.activity().getIntent()) - .addOnSuccessListener( - registrar.activity(), - new OnSuccessListener() { - @Override - public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { - if (pendingDynamicLinkData != null) { - Map dynamicLink = - getMapFromPendingDynamicLinkData(pendingDynamicLinkData); - result.success(dynamicLink); - return; - } - result.success(null); - } - }) - .addOnFailureListener( - registrar.activity(), - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error(e.getClass().getSimpleName(), e.getMessage(), null); - } - }); - } - - private OnCompleteListener createShortLinkListener(final Result result) { - return new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - Map url = new HashMap<>(); - url.put("url", task.getResult().getShortLink().toString()); - - List warnings = new ArrayList<>(); - if (task.getResult().getWarnings() != null) { - for (ShortDynamicLink.Warning warning : task.getResult().getWarnings()) { - warnings.add(warning.getMessage()); - } - } - - url.put("warnings", warnings); - - result.success(url); - } else { - Exception exception = task.getException(); - String errMsg = "Unable to create short link"; - if (exception != null && exception.getLocalizedMessage() != null) { - errMsg = exception.getLocalizedMessage(); - } - result.error("short_link_error", errMsg, null); - } - } - }; - } - - private void buildShortDynamicLink( - DynamicLink.Builder builder, MethodCall call, OnCompleteListener listener) { - Integer suffix = null; - - Map dynamicLinkParametersOptions = - call.argument("dynamicLinkParametersOptions"); - if (dynamicLinkParametersOptions != null) { - Integer shortDynamicLinkPathLength = - (Integer) dynamicLinkParametersOptions.get("shortDynamicLinkPathLength"); - if (shortDynamicLinkPathLength != null) { - switch (shortDynamicLinkPathLength) { - case 0: - suffix = ShortDynamicLink.Suffix.UNGUESSABLE; - break; - case 1: - suffix = ShortDynamicLink.Suffix.SHORT; - break; - default: - break; - } - } - } - - if (suffix != null) { - builder.buildShortDynamicLink(suffix).addOnCompleteListener(listener); - } else { - builder.buildShortDynamicLink().addOnCompleteListener(listener); - } - } - - private DynamicLink.Builder setupParameters(MethodCall call) { - DynamicLink.Builder dynamicLinkBuilder = FirebaseDynamicLinks.getInstance().createDynamicLink(); - - String uriPrefix = call.argument("uriPrefix"); - String link = call.argument("link"); - - dynamicLinkBuilder.setDomainUriPrefix(uriPrefix); - dynamicLinkBuilder.setLink(Uri.parse(link)); - - Map androidParameters = call.argument("androidParameters"); - if (androidParameters != null) { - String packageName = valueFor("packageName", androidParameters); - String fallbackUrl = valueFor("fallbackUrl", androidParameters); - Integer minimumVersion = valueFor("minimumVersion", androidParameters); - - DynamicLink.AndroidParameters.Builder builder = - new DynamicLink.AndroidParameters.Builder(packageName); - - if (fallbackUrl != null) builder.setFallbackUrl(Uri.parse(fallbackUrl)); - if (minimumVersion != null) builder.setMinimumVersion(minimumVersion); - - dynamicLinkBuilder.setAndroidParameters(builder.build()); - } - - Map googleAnalyticsParameters = call.argument("googleAnalyticsParameters"); - if (googleAnalyticsParameters != null) { - String campaign = valueFor("campaign", googleAnalyticsParameters); - String content = valueFor("content", googleAnalyticsParameters); - String medium = valueFor("medium", googleAnalyticsParameters); - String source = valueFor("source", googleAnalyticsParameters); - String term = valueFor("term", googleAnalyticsParameters); - - DynamicLink.GoogleAnalyticsParameters.Builder builder = - new DynamicLink.GoogleAnalyticsParameters.Builder(); - - if (campaign != null) builder.setCampaign(campaign); - if (content != null) builder.setContent(content); - if (medium != null) builder.setMedium(medium); - if (source != null) builder.setSource(source); - if (term != null) builder.setTerm(term); - - dynamicLinkBuilder.setGoogleAnalyticsParameters(builder.build()); - } - - Map iosParameters = call.argument("iosParameters"); - if (iosParameters != null) { - String bundleId = valueFor("bundleId", iosParameters); - String appStoreId = valueFor("appStoreId", iosParameters); - String customScheme = valueFor("customScheme", iosParameters); - String fallbackUrl = valueFor("fallbackUrl", iosParameters); - String ipadBundleId = valueFor("ipadBundleId", iosParameters); - String ipadFallbackUrl = valueFor("ipadFallbackUrl", iosParameters); - String minimumVersion = valueFor("minimumVersion", iosParameters); - - DynamicLink.IosParameters.Builder builder = new DynamicLink.IosParameters.Builder(bundleId); - - if (appStoreId != null) builder.setAppStoreId(appStoreId); - if (customScheme != null) builder.setCustomScheme(customScheme); - if (fallbackUrl != null) builder.setFallbackUrl(Uri.parse(fallbackUrl)); - if (ipadBundleId != null) builder.setIpadBundleId(ipadBundleId); - if (ipadFallbackUrl != null) builder.setIpadFallbackUrl(Uri.parse(ipadFallbackUrl)); - if (minimumVersion != null) builder.setMinimumVersion(minimumVersion); - - dynamicLinkBuilder.setIosParameters(builder.build()); - } - - Map itunesConnectAnalyticsParameters = - call.argument("itunesConnectAnalyticsParameters"); - if (itunesConnectAnalyticsParameters != null) { - String affiliateToken = valueFor("affiliateToken", itunesConnectAnalyticsParameters); - String campaignToken = valueFor("campaignToken", itunesConnectAnalyticsParameters); - String providerToken = valueFor("providerToken", itunesConnectAnalyticsParameters); - - DynamicLink.ItunesConnectAnalyticsParameters.Builder builder = - new DynamicLink.ItunesConnectAnalyticsParameters.Builder(); - - if (affiliateToken != null) builder.setAffiliateToken(affiliateToken); - if (campaignToken != null) builder.setCampaignToken(campaignToken); - if (providerToken != null) builder.setProviderToken(providerToken); - - dynamicLinkBuilder.setItunesConnectAnalyticsParameters(builder.build()); - } - - Map navigationInfoParameters = call.argument("navigationInfoParameters"); - if (navigationInfoParameters != null) { - Boolean forcedRedirectEnabled = valueFor("forcedRedirectEnabled", navigationInfoParameters); - - DynamicLink.NavigationInfoParameters.Builder builder = - new DynamicLink.NavigationInfoParameters.Builder(); - - if (forcedRedirectEnabled != null) builder.setForcedRedirectEnabled(forcedRedirectEnabled); - - dynamicLinkBuilder.setNavigationInfoParameters(builder.build()); - } - - Map socialMetaTagParameters = call.argument("socialMetaTagParameters"); - if (socialMetaTagParameters != null) { - String description = valueFor("description", socialMetaTagParameters); - String imageUrl = valueFor("imageUrl", socialMetaTagParameters); - String title = valueFor("title", socialMetaTagParameters); - - DynamicLink.SocialMetaTagParameters.Builder builder = - new DynamicLink.SocialMetaTagParameters.Builder(); - - if (description != null) builder.setDescription(description); - if (imageUrl != null) builder.setImageUrl(Uri.parse(imageUrl)); - if (title != null) builder.setTitle(title); - - dynamicLinkBuilder.setSocialMetaTagParameters(builder.build()); - } - - return dynamicLinkBuilder; - } - - private static T valueFor(String key, Map map) { - @SuppressWarnings("unchecked") - T result = (T) map.get(key); - return result; - } -} diff --git a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java b/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index e3a643252ec9..000000000000 --- a/packages/firebase_dynamic_links/android/src/main/java/io/flutter/plugins/firebasedynamiclinks/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasedynamiclinks; - -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; - -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_dynamic_links/android/user-agent.gradle b/packages/firebase_dynamic_links/android/user-agent.gradle deleted file mode 100644 index 06d7f9075b82..000000000000 --- a/packages/firebase_dynamic_links/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-dl" -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_dynamic_links/example/.metadata b/packages/firebase_dynamic_links/example/.metadata deleted file mode 100644 index 866a061a7a7f..000000000000 --- a/packages/firebase_dynamic_links/example/.metadata +++ /dev/null @@ -1,8 +0,0 @@ -# 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: f408bb06f9361793ca85493c38d809ee1e2f7e30 - channel: master diff --git a/packages/firebase_dynamic_links/example/README.md b/packages/firebase_dynamic_links/example/README.md deleted file mode 100644 index e098704eddc5..000000000000 --- a/packages/firebase_dynamic_links/example/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# firebase_dynamic_links_example - -Demonstrates how to use the firebase_dynamic_links plugin. - -## *Important* - -The example app for this plugin only receives links on Android. Xcode has signing requirements that must be configured with an iOS app developer team id. Check the `firebase_dynamic_links/README.md` for more details. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](https://flutter.io/). diff --git a/packages/firebase_dynamic_links/example/android/app/build.gradle b/packages/firebase_dynamic_links/example/android/app/build.gradle deleted file mode 100644 index 75ab78059c1c..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/build.gradle +++ /dev/null @@ -1,57 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebasedynamiclinksexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_dynamic_links/example/android/app/google-services.json b/packages/firebase_dynamic_links/example/android/app/google-services.json deleted file mode 100644 index 7123ea9b2ebd..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/google-services.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "project_info": { - "project_number": "479882132969", - "firebase_url": "https://my-flutter-proj.firebaseio.com", - "project_id": "my-flutter-proj", - "storage_bucket": "my-flutter-proj.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:479882132969:android:632cdf3fc0a17139", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasedynamiclinksexample" - } - }, - "oauth_client": [ - { - "client_id": "479882132969-32qusitiag53931ck80h121ajhlc5a7e.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebasedynamiclinksexample", - "certificate_hash": "e733b7a303250b63e06de6f7c9767c517d69cfa0" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCrZz9T0Pg0rDnpxfNuPBrOxGhXskfebXs" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "479882132969-pkn7lcq09ln9vfk4k52r634vh805dk3g.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "cvbxvzv" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:479882132969:android:215a22700e1b466b", - "android_client_info": { - "package_name": "io.flutter.plugins.firebaseperformanceexample" - } - }, - "oauth_client": [ - { - "client_id": "479882132969-8h4kiv8m7ho4tvn6uuujsfcrf69unuf7.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseperformanceexample", - "certificate_hash": "e733b7a303250b63e06de6f7c9767c517d69cfa0" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCrZz9T0Pg0rDnpxfNuPBrOxGhXskfebXs" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "479882132969-pkn7lcq09ln9vfk4k52r634vh805dk3g.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "cvbxvzv" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_dynamic_links/example/android/app/gradle.properties b/packages/firebase_dynamic_links/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_dynamic_links/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_dynamic_links/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_dynamic_links/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index ed3cca73d5d3..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/java/io/flutter/plugins/firebasedynamiclinksexample/MainActivity.java b/packages/firebase_dynamic_links/example/android/app/src/main/java/io/flutter/plugins/firebasedynamiclinksexample/MainActivity.java deleted file mode 100644 index 885f28ec4efc..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/src/main/java/io/flutter/plugins/firebasedynamiclinksexample/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.firebasedynamiclinksexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_dynamic_links/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_dynamic_links/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_dynamic_links/example/android/app/src/main/res/values/styles.xml b/packages/firebase_dynamic_links/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/firebase_dynamic_links/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/firebase_dynamic_links/example/android/build.gradle b/packages/firebase_dynamic_links/example/android/build.gradle deleted file mode 100644 index 3759d2af578f..000000000000 --- a/packages/firebase_dynamic_links/example/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_dynamic_links/example/android/gradle.properties b/packages/firebase_dynamic_links/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_dynamic_links/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_dynamic_links/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_dynamic_links/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/firebase_dynamic_links/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_dynamic_links/example/android/settings.gradle b/packages/firebase_dynamic_links/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/firebase_dynamic_links/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_dynamic_links/example/firebase_dynamic_links_example.iml b/packages/firebase_dynamic_links/example/firebase_dynamic_links_example.iml deleted file mode 100644 index e5c837191e06..000000000000 --- a/packages/firebase_dynamic_links/example/firebase_dynamic_links_example.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_dynamic_links/example/firebase_dynamic_links_example_android.iml b/packages/firebase_dynamic_links/example/firebase_dynamic_links_example_android.iml deleted file mode 100644 index b050030a1b87..000000000000 --- a/packages/firebase_dynamic_links/example/firebase_dynamic_links_example_android.iml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_dynamic_links/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_dynamic_links/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6c2de8086bcd..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_dynamic_links/example/ios/Flutter/Debug.xcconfig b/packages/firebase_dynamic_links/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_dynamic_links/example/ios/Flutter/Release.xcconfig b/packages/firebase_dynamic_links/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index ce7d3163f7ac..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,519 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 8FE60D1920C0959F00E3A541 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8FE60D1820C0959F00E3A541 /* GoogleService-Info.plist */; }; - 8FF283695FD42FAFAA6F2588 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BEA489D8A0A4C9E6F14F37D /* libPods-Runner.a */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 3BEA489D8A0A4C9E6F14F37D /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 8FE60D1820C0959F00E3A541 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 8FE60D1A20C0962300E3A541 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 8FF283695FD42FAFAA6F2588 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - C265487490C4649DB6EB38D8 /* Pods */, - FB89BCA43D68B61E6BC59A86 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 8FE60D1A20C0962300E3A541 /* Runner.entitlements */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 8FE60D1820C0959F00E3A541 /* GoogleService-Info.plist */, - 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 = ""; - }; - C265487490C4649DB6EB38D8 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - FB89BCA43D68B61E6BC59A86 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3BEA489D8A0A4C9E6F14F37D /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - DFB8FA600F7B599A94289A9E /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 852BEAA0EB8653502C27C0BD /* [CP] Embed Pods Frameworks */, - ); - 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 = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.SafariKeychain = { - enabled = 0; - }; - }; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 8FE60D1920C0959F00E3A541 /* GoogleService-Info.plist in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets 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\" thin"; - }; - 852BEAA0EB8653502C27C0BD /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - DFB8FA600F7B599A94289A9E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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 */ - 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.FirebaseCppDynamicLinksTestApp.dev; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.FirebaseCppDynamicLinksTestApp.dev; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - 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 */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1263ac84b105..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d68..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.h b/packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.m b/packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d9d..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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_dynamic_links/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_dynamic_links/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_dynamic_links/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_dynamic_links/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index ac0d4c98b0d0..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 479882132969-pn2ancg65o0e7r5ikte1qiciuvdghqf9.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.479882132969-pn2ancg65o0e7r5ikte1qiciuvdghqf9 - ANDROID_CLIENT_ID - 479882132969-32qusitiag53931ck80h121ajhlc5a7e.apps.googleusercontent.com - API_KEY - AIzaSyBECOwLTAN6PU4Aet1b2QLGIb3kRK8Xjew - GCM_SENDER_ID - 479882132969 - PLIST_VERSION - 1 - BUNDLE_ID - com.google.FirebaseCppDynamicLinksTestApp.dev - PROJECT_ID - my-flutter-proj - STORAGE_BUCKET - my-flutter-proj.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:479882132969:ios:36e157824ba4dd3d - DATABASE_URL - https://my-flutter-proj.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Info.plist b/packages/firebase_dynamic_links/example/ios/Runner/Info.plist deleted file mode 100644 index f24bc9d4f80d..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/Info.plist +++ /dev/null @@ -1,62 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_dynamic_links_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - Bundle ID - CFBundleURLSchemes - - com.google.FirebaseCppDynamicLinksTestApp.dev - - - - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner/Runner.entitlements b/packages/firebase_dynamic_links/example/ios/Runner/Runner.entitlements deleted file mode 100644 index 0c67376ebacb..000000000000 --- a/packages/firebase_dynamic_links/example/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/firebase_dynamic_links/example/ios/Runner/main.m b/packages/firebase_dynamic_links/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_dynamic_links/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_dynamic_links/example/lib/main.dart b/packages/firebase_dynamic_links/example/lib/main.dart deleted file mode 100644 index 9e915761a9c6..000000000000 --- a/packages/firebase_dynamic_links/example/lib/main.dart +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/services.dart'; -import 'package:url_launcher/url_launcher.dart'; - -void main() { - runApp(MaterialApp( - title: 'Dynamic Links Example', - routes: { - '/': (BuildContext context) => _MainScreen(), - '/helloworld': (BuildContext context) => _DynamicLinkScreen(), - }, - )); -} - -class _MainScreen extends StatefulWidget { - @override - State createState() => _MainScreenState(); -} - -class _MainScreenState extends State<_MainScreen> { - String _linkMessage; - bool _isCreatingLink = false; - String _testString = - "To test: long press link and then copy and click from a non-browser " - "app. Make sure this isn't being tested on iOS simulator and iOS xcode " - "is properly setup. Look at firebase_dynamic_links/README.md for more " - "details."; - - @override - void initState() { - super.initState(); - initDynamicLinks(); - } - - void initDynamicLinks() async { - final PendingDynamicLinkData data = - await FirebaseDynamicLinks.instance.getInitialLink(); - final Uri deepLink = data?.link; - - if (deepLink != null) { - Navigator.pushNamed(context, deepLink.path); - } - - FirebaseDynamicLinks.instance.onLink( - onSuccess: (PendingDynamicLinkData dynamicLink) async { - final Uri deepLink = dynamicLink?.link; - - if (deepLink != null) { - Navigator.pushNamed(context, deepLink.path); - } - }, onError: (OnLinkErrorException e) async { - print('onLinkError'); - print(e.message); - }); - } - - Future _createDynamicLink(bool short) async { - setState(() { - _isCreatingLink = true; - }); - - final DynamicLinkParameters parameters = DynamicLinkParameters( - uriPrefix: 'https://cx4k7.app.goo.gl', - link: Uri.parse('https://dynamic.link.example/helloworld'), - androidParameters: AndroidParameters( - packageName: 'io.flutter.plugins.firebasedynamiclinksexample', - minimumVersion: 0, - ), - dynamicLinkParametersOptions: DynamicLinkParametersOptions( - shortDynamicLinkPathLength: ShortDynamicLinkPathLength.short, - ), - iosParameters: IosParameters( - bundleId: 'com.google.FirebaseCppDynamicLinksTestApp.dev', - minimumVersion: '0', - ), - ); - - Uri url; - if (short) { - final ShortDynamicLink shortLink = await parameters.buildShortLink(); - url = shortLink.shortUrl; - } else { - url = await parameters.buildUrl(); - } - - setState(() { - _linkMessage = url.toString(); - _isCreatingLink = false; - }); - } - - @override - Widget build(BuildContext context) { - return Material( - child: Scaffold( - appBar: AppBar( - title: const Text('Dynamic Links Example'), - ), - body: Builder(builder: (BuildContext context) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ButtonBar( - alignment: MainAxisAlignment.center, - children: [ - RaisedButton( - onPressed: !_isCreatingLink - ? () => _createDynamicLink(false) - : null, - child: const Text('Get Long Link'), - ), - RaisedButton( - onPressed: !_isCreatingLink - ? () => _createDynamicLink(true) - : null, - child: const Text('Get Short Link'), - ), - ], - ), - InkWell( - child: Text( - _linkMessage ?? '', - style: const TextStyle(color: Colors.blue), - ), - onTap: () async { - if (_linkMessage != null) { - await launch(_linkMessage); - } - }, - onLongPress: () { - Clipboard.setData(ClipboardData(text: _linkMessage)); - Scaffold.of(context).showSnackBar( - const SnackBar(content: Text('Copied Link!')), - ); - }, - ), - Text(_linkMessage == null ? '' : _testString) - ], - ), - ); - }), - ), - ); - } -} - -class _DynamicLinkScreen extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Material( - child: Scaffold( - appBar: AppBar( - title: const Text('Hello World DeepLink'), - ), - body: const Center( - child: Text('Hello, World!'), - ), - ), - ); - } -} diff --git a/packages/firebase_dynamic_links/example/pubspec.yaml b/packages/firebase_dynamic_links/example/pubspec.yaml deleted file mode 100644 index f396651940d9..000000000000 --- a/packages/firebase_dynamic_links/example/pubspec.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: firebase_dynamic_links_example -description: Demonstrates how to use the firebase_dynamic_links plugin. - -dependencies: - flutter: - sdk: flutter - - firebase_dynamic_links: - path: ../ - firebase_core: ^0.4.0 - - url_launcher: ^4.2.0 - -flutter: - uses-material-design: true diff --git a/packages/firebase_dynamic_links/firebase_dynamic_links_android.iml b/packages/firebase_dynamic_links/firebase_dynamic_links_android.iml deleted file mode 100644 index ac5d744d7acc..000000000000 --- a/packages/firebase_dynamic_links/firebase_dynamic_links_android.iml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_dynamic_links/ios/Assets/.gitkeep b/packages/firebase_dynamic_links/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h deleted file mode 100644 index f905bbbd03e0..000000000000 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface FLTFirebaseDynamicLinksPlugin : NSObject -@end diff --git a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m b/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m deleted file mode 100644 index 9893a4ad6c02..000000000000 --- a/packages/firebase_dynamic_links/ios/Classes/FirebaseDynamicLinksPlugin.m +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseDynamicLinksPlugin.h" -#import "UserAgent.h" - -#import "Firebase/Firebase.h" - -static FlutterError *getFlutterError(NSError *error) { - return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %d", (int)error.code] - message:error.domain - details:error.localizedDescription]; -} - -static NSMutableDictionary *getDictionaryFromDynamicLink(FIRDynamicLink *dynamicLink) { - if (dynamicLink != nil) { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - dictionary[@"link"] = dynamicLink.url.absoluteString; - - NSMutableDictionary *iosData = [[NSMutableDictionary alloc] init]; - if (dynamicLink.minimumAppVersion) { - iosData[@"minimumVersion"] = dynamicLink.minimumAppVersion; - } - dictionary[@"ios"] = iosData; - return dictionary; - } else { - return nil; - } -} - -static NSMutableDictionary *getDictionaryFromFlutterError(FlutterError *error) { - if (error == nil) { - return nil; - } - - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - dictionary[@"code"] = error.code; - dictionary[@"message"] = error.message; - dictionary[@"details"] = error.details; - return dictionary; -} - -@interface FLTFirebaseDynamicLinksPlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@property(nonatomic, retain) FIRDynamicLink *initialLink; -@property(nonatomic, retain) FlutterError *flutterError; -@property(nonatomic) BOOL initiated; -@end - -@implementation FLTFirebaseDynamicLinksPlugin -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_dynamic_links" - binaryMessenger:[registrar messenger]]; - FLTFirebaseDynamicLinksPlugin *instance = - [[FLTFirebaseDynamicLinksPlugin alloc] initWithChannel:channel]; - [registrar addMethodCallDelegate:instance channel:channel]; - [registrar addApplicationDelegate:instance]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)initWithChannel:(FlutterMethodChannel *)channel { - self = [super init]; - if (self) { - _initiated = NO; - _channel = channel; - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"DynamicLinkParameters#buildUrl" isEqualToString:call.method]) { - FIRDynamicLinkComponents *components = [self setupParameters:call.arguments]; - result([components.url absoluteString]); - } else if ([@"DynamicLinkParameters#buildShortLink" isEqualToString:call.method]) { - FIRDynamicLinkComponents *components = [self setupParameters:call.arguments]; - [components shortenWithCompletion:[self createShortLinkCompletion:result]]; - } else if ([@"DynamicLinkParameters#shortenUrl" isEqualToString:call.method]) { - FIRDynamicLinkComponentsOptions *options = [self setupOptions:call.arguments]; - NSURL *url = [NSURL URLWithString:call.arguments[@"url"]]; - [FIRDynamicLinkComponents shortenURL:url - options:options - completion:[self createShortLinkCompletion:result]]; - } else if ([@"FirebaseDynamicLinks#getInitialLink" isEqualToString:call.method]) { - _initiated = YES; - NSMutableDictionary *dict = [self getInitialLink]; - if (dict == nil && self.flutterError) { - result(self.flutterError); - } else { - result(dict); - } - } else { - result(FlutterMethodNotImplemented); - } -} - -- (NSMutableDictionary *)getInitialLink { - return getDictionaryFromDynamicLink(_initialLink); -} - -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - options:(NSDictionary *)options { - return [self checkForDynamicLink:url]; -} - -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation { - return [self checkForDynamicLink:url]; -} - -- (BOOL)checkForDynamicLink:(NSURL *)url { - FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url]; - if (dynamicLink) { - if (dynamicLink.url) _initialLink = dynamicLink; - return YES; - } - return NO; -} - -- (BOOL)onLink:(NSUserActivity *)userActivity { - BOOL handled = [[FIRDynamicLinks dynamicLinks] - handleUniversalLink:userActivity.webpageURL - completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) { - if (error) { - FlutterError *flutterError = getFlutterError(error); - [self.channel invokeMethod:@"onLinkError" - arguments:getDictionaryFromFlutterError(flutterError)]; - } else { - NSMutableDictionary *dictionary = getDictionaryFromDynamicLink(dynamicLink); - [self.channel invokeMethod:@"onLinkSuccess" arguments:dictionary]; - } - }]; - return handled; -} - -- (BOOL)onInitialLink:(NSUserActivity *)userActivity { - BOOL handled = [[FIRDynamicLinks dynamicLinks] - handleUniversalLink:userActivity.webpageURL - completion:^(FIRDynamicLink *_Nullable dynamicLink, NSError *_Nullable error) { - if (error) { - self.flutterError = getFlutterError(error); - } - self.initialLink = dynamicLink; - }]; - return handled; -} - -- (BOOL)application:(UIApplication *)application - continueUserActivity:(NSUserActivity *)userActivity - restorationHandler:(void (^)(NSArray *))restorationHandler { - if (_initiated) { - return [self onLink:userActivity]; - } - return [self onInitialLink:userActivity]; -} - -- (FIRDynamicLinkShortenerCompletion)createShortLinkCompletion:(FlutterResult)result { - return ^(NSURL *_Nullable shortURL, NSArray *_Nullable warnings, NSError *_Nullable error) { - if (error) { - result(getFlutterError(error)); - } else { - if (warnings == nil) { - warnings = [NSMutableArray array]; - } - result(@{@"url" : [shortURL absoluteString], @"warnings" : warnings}); - } - }; -} - -- (FIRDynamicLinkComponentsOptions *)setupOptions:(NSDictionary *)arguments { - FIRDynamicLinkComponentsOptions *options; - if (![arguments[@"dynamicLinkParametersOptions"] isEqual:[NSNull null]]) { - NSDictionary *params = arguments[@"dynamicLinkParametersOptions"]; - - options = [FIRDynamicLinkComponentsOptions options]; - - NSNumber *shortDynamicLinkPathLength = params[@"shortDynamicLinkPathLength"]; - if (![shortDynamicLinkPathLength isEqual:[NSNull null]]) { - switch (shortDynamicLinkPathLength.intValue) { - case 0: - options.pathLength = FIRShortDynamicLinkPathLengthUnguessable; - break; - case 1: - options.pathLength = FIRShortDynamicLinkPathLengthShort; - break; - default: - break; - } - } - } - - return options; -} - -- (FIRDynamicLinkComponents *)setupParameters:(NSDictionary *)arguments { - NSURL *link = [NSURL URLWithString:arguments[@"link"]]; - NSString *uriPrefix = arguments[@"uriPrefix"]; - - FIRDynamicLinkComponents *components = [FIRDynamicLinkComponents componentsWithLink:link - domainURIPrefix:uriPrefix]; - - if (![arguments[@"androidParameters"] isEqual:[NSNull null]]) { - NSDictionary *params = arguments[@"androidParameters"]; - - FIRDynamicLinkAndroidParameters *androidParams = - [FIRDynamicLinkAndroidParameters parametersWithPackageName:params[@"packageName"]]; - - NSString *fallbackUrl = params[@"fallbackUrl"]; - NSNumber *minimumVersion = params[@"minimumVersion"]; - - if (![fallbackUrl isEqual:[NSNull null]]) - androidParams.fallbackURL = [NSURL URLWithString:fallbackUrl]; - if (![minimumVersion isEqual:[NSNull null]]) - androidParams.minimumVersion = ((NSNumber *)minimumVersion).integerValue; - - components.androidParameters = androidParams; - } - - if (![arguments[@"dynamicLinkComponentsOptions"] isEqual:[NSNull null]]) { - components.options = [self setupOptions:arguments]; - } - - if (![arguments[@"googleAnalyticsParameters"] isEqual:[NSNull null]]) { - NSDictionary *params = arguments[@"googleAnalyticsParameters"]; - - FIRDynamicLinkGoogleAnalyticsParameters *googleAnalyticsParameters = - [FIRDynamicLinkGoogleAnalyticsParameters parameters]; - - NSString *campaign = params[@"campaign"]; - NSString *content = params[@"content"]; - NSString *medium = params[@"medium"]; - NSString *source = params[@"source"]; - NSString *term = params[@"term"]; - - if (![campaign isEqual:[NSNull null]]) googleAnalyticsParameters.campaign = campaign; - if (![content isEqual:[NSNull null]]) googleAnalyticsParameters.content = content; - if (![medium isEqual:[NSNull null]]) googleAnalyticsParameters.medium = medium; - if (![source isEqual:[NSNull null]]) googleAnalyticsParameters.source = source; - if (![term isEqual:[NSNull null]]) googleAnalyticsParameters.term = term; - - components.analyticsParameters = googleAnalyticsParameters; - } - - if (![arguments[@"iosParameters"] isEqual:[NSNull null]]) { - NSDictionary *params = arguments[@"iosParameters"]; - - FIRDynamicLinkIOSParameters *iosParameters = - [FIRDynamicLinkIOSParameters parametersWithBundleID:params[@"bundleId"]]; - - NSString *appStoreID = params[@"appStoreId"]; - NSString *customScheme = params[@"customScheme"]; - NSString *fallbackURL = params[@"fallbackUrl"]; - NSString *iPadBundleID = params[@"ipadBundleId"]; - NSString *iPadFallbackURL = params[@"ipadFallbackUrl"]; - NSString *minimumAppVersion = params[@"minimumVersion"]; - - if (![appStoreID isEqual:[NSNull null]]) iosParameters.appStoreID = appStoreID; - if (![customScheme isEqual:[NSNull null]]) iosParameters.customScheme = customScheme; - if (![fallbackURL isEqual:[NSNull null]]) - iosParameters.fallbackURL = [NSURL URLWithString:fallbackURL]; - if (![iPadBundleID isEqual:[NSNull null]]) iosParameters.iPadBundleID = iPadBundleID; - if (![iPadFallbackURL isEqual:[NSNull null]]) - iosParameters.iPadFallbackURL = [NSURL URLWithString:iPadFallbackURL]; - if (![minimumAppVersion isEqual:[NSNull null]]) - iosParameters.minimumAppVersion = minimumAppVersion; - - components.iOSParameters = iosParameters; - } - - if (![arguments[@"itunesConnectAnalyticsParameters"] isEqual:[NSNull null]]) { - NSDictionary *params = arguments[@"itunesConnectAnalyticsParameters"]; - - FIRDynamicLinkItunesConnectAnalyticsParameters *itunesConnectAnalyticsParameters = - [FIRDynamicLinkItunesConnectAnalyticsParameters parameters]; - - NSString *affiliateToken = params[@"affiliateToken"]; - NSString *campaignToken = params[@"campaignToken"]; - NSString *providerToken = params[@"providerToken"]; - - if (![affiliateToken isEqual:[NSNull null]]) - itunesConnectAnalyticsParameters.affiliateToken = affiliateToken; - if (![campaignToken isEqual:[NSNull null]]) - itunesConnectAnalyticsParameters.campaignToken = campaignToken; - if (![providerToken isEqual:[NSNull null]]) - itunesConnectAnalyticsParameters.providerToken = providerToken; - - components.iTunesConnectParameters = itunesConnectAnalyticsParameters; - } - - if (![arguments[@"navigationInfoParameters"] isEqual:[NSNull null]]) { - NSDictionary *params = arguments[@"navigationInfoParameters"]; - - FIRDynamicLinkNavigationInfoParameters *navigationInfoParameters = - [FIRDynamicLinkNavigationInfoParameters parameters]; - - NSNumber *forcedRedirectEnabled = params[@"forcedRedirectEnabled"]; - if (![forcedRedirectEnabled isEqual:[NSNull null]]) - navigationInfoParameters.forcedRedirectEnabled = [forcedRedirectEnabled boolValue]; - - components.navigationInfoParameters = navigationInfoParameters; - } - - if (![arguments[@"socialMetaTagParameters"] isEqual:[NSNull null]]) { - NSDictionary *params = arguments[@"socialMetaTagParameters"]; - - FIRDynamicLinkSocialMetaTagParameters *socialMetaTagParameters = - [FIRDynamicLinkSocialMetaTagParameters parameters]; - - NSString *descriptionText = params[@"description"]; - NSString *imageURL = params[@"imageUrl"]; - NSString *title = params[@"title"]; - - if (![descriptionText isEqual:[NSNull null]]) - socialMetaTagParameters.descriptionText = descriptionText; - if (![imageURL isEqual:[NSNull null]]) - socialMetaTagParameters.imageURL = [NSURL URLWithString:imageURL]; - if (![title isEqual:[NSNull null]]) socialMetaTagParameters.title = title; - - components.socialMetaTagParameters = socialMetaTagParameters; - } - - return components; -} - -@end diff --git a/packages/firebase_dynamic_links/ios/firebase_dynamic_links.podspec b/packages/firebase_dynamic_links/ios/firebase_dynamic_links.podspec deleted file mode 100644 index 8d1d18ef1368..000000000000 --- a/packages/firebase_dynamic_links/ios/firebase_dynamic_links.podspec +++ /dev/null @@ -1,33 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_dynamic_links' - s.version = '0.1.0' - s.summary = 'Firebase Dynamic Links plugin for Flutter.' - s.description = <<-DESC -Flutter plugin for Google Dynamic Links for Firebase, an app solution for creating and handling - links across multiple platforms. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_dynamic_links' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'Firebase/DynamicLinks' - s.ios.deployment_target = '8.0' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-dl\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_dynamic_links/lib/firebase_dynamic_links.dart b/packages/firebase_dynamic_links/lib/firebase_dynamic_links.dart deleted file mode 100644 index 5553336f9708..000000000000 --- a/packages/firebase_dynamic_links/lib/firebase_dynamic_links.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018 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_dynamic_links; - -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; - -part 'src/dynamic_link_parameters.dart'; -part 'src/firebase_dynamic_links.dart'; diff --git a/packages/firebase_dynamic_links/lib/src/dynamic_link_parameters.dart b/packages/firebase_dynamic_links/lib/src/dynamic_link_parameters.dart deleted file mode 100644 index 110d9727eb7c..000000000000 --- a/packages/firebase_dynamic_links/lib/src/dynamic_link_parameters.dart +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright 2018 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_dynamic_links; - -/// The class used for Dynamic Link URL generation. -/// -/// Supports creation of short and long Dynamic Link URLs. Short URLs will have -/// a domain and a randomized path. Long URLs will have a domain and a query -/// that contains all of the Dynamic Link parameters. -class DynamicLinkParameters { - DynamicLinkParameters({ - this.androidParameters, - @required this.uriPrefix, - this.dynamicLinkParametersOptions, - this.googleAnalyticsParameters, - this.iosParameters, - this.itunesConnectAnalyticsParameters, - @required this.link, - this.navigationInfoParameters, - this.socialMetaTagParameters, - }) : assert(uriPrefix != null), - assert(link != null); - - /// Android parameters for a generated Dynamic Link URL. - final AndroidParameters androidParameters; - - /// Domain URI Prefix of your App. - // This value must be your assigned domain from the Firebase console. - // (e.g. https://xyz.page.link) - // - // The domain URI prefix must start with a valid HTTPS scheme (https://). - final String uriPrefix; - - /// Defines behavior for generating Dynamic Link URLs. - final DynamicLinkParametersOptions dynamicLinkParametersOptions; - - /// Analytics parameters for a generated Dynamic Link URL. - final GoogleAnalyticsParameters googleAnalyticsParameters; - - /// iOS parameters for a generated Dynamic Link URL. - final IosParameters iosParameters; - - /// iTunes Connect parameters for a generated Dynamic Link URL. - final ItunesConnectAnalyticsParameters itunesConnectAnalyticsParameters; - - /// The link the target app will open. - /// - /// You can specify any URL the app can handle, such as a link to the app’s - /// content, or a URL that initiates some app-specific logic such as crediting - /// the user with a coupon, or displaying a specific welcome screen. - /// This link must be a well-formatted URL, be properly URL-encoded, and use - /// the HTTP or HTTPS scheme. - final Uri link; - - /// Navigation Info parameters for a generated Dynamic Link URL. - final NavigationInfoParameters navigationInfoParameters; - - /// Social Meta Tag parameters for a generated Dynamic Link URL. - final SocialMetaTagParameters socialMetaTagParameters; - - /// Shortens a Dynamic Link URL. - /// - /// This method may be used for shortening a custom URL that was not generated - /// using [DynamicLinkParameters]. - static Future shortenUrl(Uri url, - [DynamicLinkParametersOptions options]) async { - final Map reply = await FirebaseDynamicLinks.channel - .invokeMapMethod( - 'DynamicLinkParameters#shortenUrl', { - 'url': url.toString(), - 'dynamicLinkParametersOptions': options?._data, - }); - return _parseShortLink(reply); - } - - Map get _data => { - 'androidParameters': androidParameters?._data, - 'uriPrefix': uriPrefix, - 'dynamicLinkParametersOptions': dynamicLinkParametersOptions?._data, - 'googleAnalyticsParameters': googleAnalyticsParameters?._data, - 'iosParameters': iosParameters?._data, - 'itunesConnectAnalyticsParameters': - itunesConnectAnalyticsParameters?._data, - 'link': link.toString(), - 'navigationInfoParameters': navigationInfoParameters?._data, - 'socialMetaTagParameters': socialMetaTagParameters?._data, - }; - - /// Generate a long Dynamic Link URL. - Future buildUrl() async { - final String url = await FirebaseDynamicLinks.channel - .invokeMethod('DynamicLinkParameters#buildUrl', _data); - return Uri.parse(url); - } - - /// Generate a short Dynamic Link. - Future buildShortLink() async { - final Map reply = await FirebaseDynamicLinks.channel - .invokeMapMethod( - 'DynamicLinkParameters#buildShortLink', _data); - return _parseShortLink(reply); - } - - static ShortDynamicLink _parseShortLink(Map reply) { - final List warnings = reply['warnings']; - return ShortDynamicLink._(Uri.parse(reply['url']), warnings?.cast()); - } -} - -/// Response from creating a short dynamic link with [DynamicLinkParameters]. -class ShortDynamicLink { - ShortDynamicLink._(this.shortUrl, this.warnings); - - /// Short url value. - final Uri shortUrl; - - /// Information about potential warnings on link creation. - final List warnings; -} - -/// The Dynamic Link Android parameters. -class AndroidParameters { - AndroidParameters( - {this.fallbackUrl, this.minimumVersion, @required this.packageName}) - : assert(packageName != null); - - /// The link to open when the app isn’t installed. - /// - /// Specify this to do something other than install the app from the Play - /// Store when the app isn’t installed, such as open the mobile web version of - /// the content, or display a promotional page for the app. - final Uri fallbackUrl; - - /// The version of the minimum version of your app that can open the link. - /// - /// If the installed app is an older version, the user is taken to the Play - /// Store to upgrade the app. - final int minimumVersion; - - /// The Android app’s package name. - final String packageName; - - Map get _data => { - 'fallbackUrl': fallbackUrl?.toString(), - 'minimumVersion': minimumVersion, - 'packageName': packageName, - }; -} - -/// For specifying length for short Dynamic Links. -enum ShortDynamicLinkPathLength { unguessable, short } - -/// Options class for defining how Dynamic Link URLs are generated. -class DynamicLinkParametersOptions { - DynamicLinkParametersOptions({this.shortDynamicLinkPathLength}); - - /// Specifies the length of the path component of a short Dynamic Link. - final ShortDynamicLinkPathLength shortDynamicLinkPathLength; - - Map get _data => { - 'shortDynamicLinkPathLength': shortDynamicLinkPathLength?.index, - }; -} - -/// The Dynamic Link analytics parameters. -class GoogleAnalyticsParameters { - GoogleAnalyticsParameters({ - @required this.campaign, - this.content, - @required this.medium, - @required this.source, - this.term, - }) : assert(campaign != null), - assert(medium != null), - assert(source != null); - - GoogleAnalyticsParameters.empty() - : campaign = null, - content = null, - medium = null, - source = null, - term = null; - - /// The utm_campaign analytics parameter. - final String campaign; - - /// The utm_content analytics parameter. - final String content; - - /// The utm_medium analytics parameter. - final String medium; - - /// The utm_source analytics parameter. - final String source; - - /// The utm_term analytics parameter. - final String term; - - Map get _data => { - 'campaign': campaign, - 'content': content, - 'medium': medium, - 'source': source, - 'term': term, - }; -} - -/// The Dynamic Link iOS parameters. -class IosParameters { - IosParameters({ - this.appStoreId, - @required this.bundleId, - this.customScheme, - this.fallbackUrl, - this.ipadBundleId, - this.ipadFallbackUrl, - this.minimumVersion, - }) : assert(bundleId != null); - - /// The appStore ID of the iOS app in AppStore. - final String appStoreId; - - /// The bundle ID of the iOS app to use to open the link. - final String bundleId; - - /// The target app’s custom URL scheme. - /// - /// Defined to be something other than the app’s bundle ID. - final String customScheme; - - /// The link to open when the app isn’t installed. - /// - /// Specify this to do something other than install the app from the App Store - /// when the app isn’t installed, such as open the mobile web version of the - /// content, or display a promotional page for the app. - final Uri fallbackUrl; - - /// The bundle ID of the iOS app to use on iPads to open the link. - /// - /// This is only required if there are separate iPhone and iPad applications. - final String ipadBundleId; - - /// The link to open on iPads when the app isn’t installed. - /// - /// Specify this to do something other than install the app from the App Store - /// when the app isn’t installed, such as open the web version of the content, - /// or display a promotional page for the app. - final Uri ipadFallbackUrl; - - /// The the minimum version of your app that can open the link. - /// - /// It is app’s developer responsibility to open AppStore when received link - /// declares higher [minimumVersion] than currently installed. - final String minimumVersion; - - Map get _data => { - 'appStoreId': appStoreId, - 'bundleId': bundleId, - 'customScheme': customScheme, - 'fallbackUrl': fallbackUrl?.toString(), - 'ipadBundleId': ipadBundleId, - 'ipadFallbackUrl': ipadFallbackUrl?.toString(), - 'minimumVersion': minimumVersion, - }; -} - -/// The Dynamic Link iTunes Connect parameters. -class ItunesConnectAnalyticsParameters { - ItunesConnectAnalyticsParameters( - {this.affiliateToken, this.campaignToken, this.providerToken}); - - /// The iTunes Connect affiliate token. - final String affiliateToken; - - /// The iTunes Connect campaign token. - final String campaignToken; - - /// The iTunes Connect provider token. - final String providerToken; - - Map get _data => { - 'affiliateToken': affiliateToken, - 'campaignToken': campaignToken, - 'providerToken': providerToken, - }; -} - -/// Options class for defining navigation behavior of the Dynamic Link. -class NavigationInfoParameters { - NavigationInfoParameters({this.forcedRedirectEnabled}); - - /// Whether forced non-interactive redirect it to be used. - /// - /// Forced non-interactive redirect occurs when link is tapped on mobile - /// device. - /// - /// Default behavior is to disable force redirect and show interstitial page - /// where user tap will initiate navigation to the App (or AppStore if not - /// installed). Disabled force redirect normally improves reliability of the - /// click. - final bool forcedRedirectEnabled; - - Map get _data => { - 'forcedRedirectEnabled': forcedRedirectEnabled, - }; -} - -/// The Dynamic Link Social Meta Tag parameters. -class SocialMetaTagParameters { - SocialMetaTagParameters({this.description, this.imageUrl, this.title}); - - /// The description to use when the Dynamic Link is shared in a social post. - final String description; - - /// The URL to an image related to this link. - final Uri imageUrl; - - /// The title to use when the Dynamic Link is shared in a social post. - final String title; - - Map get _data => { - 'description': description, - 'imageUrl': imageUrl?.toString(), - 'title': title, - }; -} diff --git a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart b/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart deleted file mode 100644 index c247fe82bb28..000000000000 --- a/packages/firebase_dynamic_links/lib/src/firebase_dynamic_links.dart +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2018 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_dynamic_links; - -typedef OnLinkSuccessCallback = Future Function( - PendingDynamicLinkData linkData); -typedef OnLinkErrorCallback = Future Function( - OnLinkErrorException error); - -/// Firebase Dynamic Links API. -/// -/// You can get an instance by calling [FirebaseDynamicLinks.instance]. -class FirebaseDynamicLinks { - FirebaseDynamicLinks._(); - - @visibleForTesting - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_dynamic_links'); - - /// Singleton of [FirebaseDynamicLinks]. - static final FirebaseDynamicLinks instance = FirebaseDynamicLinks._(); - - OnLinkSuccessCallback _onLinkSuccess; - OnLinkErrorCallback _onLinkError; - - /// Attempts to retrieve the dynamic link which launched the app. - /// - /// This method always returns a Future. That Future completes to null if - /// there is no pending dynamic link or any call to this method after the - /// the first attempt. - Future getInitialLink() async { - final Map linkData = - await channel.invokeMapMethod( - 'FirebaseDynamicLinks#getInitialLink'); - return getPendingDynamicLinkDataFromMap(linkData); - } - - PendingDynamicLinkData getPendingDynamicLinkDataFromMap( - Map linkData) { - if (linkData == null) return null; - - PendingDynamicLinkDataAndroid androidData; - if (linkData['android'] != null) { - final Map data = linkData['android']; - androidData = PendingDynamicLinkDataAndroid._( - data['clickTimestamp'], - data['minimumVersion'], - ); - } - - PendingDynamicLinkDataIOS iosData; - if (linkData['ios'] != null) { - final Map data = linkData['ios']; - iosData = PendingDynamicLinkDataIOS._(data['minimumVersion']); - } - - return PendingDynamicLinkData._( - Uri.parse(linkData['link']), - androidData, - iosData, - ); - } - - /// Configures onLink listeners: it has two methods for success and failure. - void onLink({ - OnLinkSuccessCallback onSuccess, - OnLinkErrorCallback onError, - }) { - _onLinkSuccess = onSuccess; - _onLinkError = onError; - channel.setMethodCallHandler(_handleMethod); - } - - Future _handleMethod(MethodCall call) async { - switch (call.method) { - case "onLinkSuccess": - final Map data = - call.arguments.cast(); - final PendingDynamicLinkData linkData = - getPendingDynamicLinkDataFromMap(data); - return _onLinkSuccess(linkData); - case "onLinkError": - final Map data = - call.arguments.cast(); - final OnLinkErrorException e = OnLinkErrorException._( - data['code'], data['message'], data['details']); - return _onLinkError(e); - } - } -} - -/// Provides data from received dynamic link. -class PendingDynamicLinkData { - PendingDynamicLinkData._(this.link, this.android, this.ios); - - /// Provides Android specific data from received dynamic link. - /// - /// Can be null if [link] equals null or dynamic link was not received on an - /// Android device. - final PendingDynamicLinkDataAndroid android; - - /// Provides iOS specific data from received dynamic link. - /// - /// Can be null if [link] equals null or dynamic link was not received on an - /// iOS device. - final PendingDynamicLinkDataIOS ios; - - /// Deep link parameter of the dynamic link. - final Uri link; -} - -/// Provides android specific data from received dynamic link. -class PendingDynamicLinkDataAndroid { - PendingDynamicLinkDataAndroid._( - this.clickTimestamp, - this.minimumVersion, - ); - - /// The time the user clicked on the dynamic link. - /// - /// Equals the number of milliseconds that have elapsed since January 1, 1970. - final int clickTimestamp; - - /// The minimum version of your app that can open the link. - /// - /// The minimum Android app version requested to process the dynamic link that - /// can be compared directly with versionCode. - /// - /// If the installed app is an older version, the user is taken to the Play - /// Store to upgrade the app. - final int minimumVersion; -} - -/// Provides iOS specific data from received dynamic link. -class PendingDynamicLinkDataIOS { - PendingDynamicLinkDataIOS._(this.minimumVersion); - - /// The minimum version of your app that can open the link. - /// - /// It is app developer's responsibility to open AppStore when received link - /// declares higher [minimumVersion] than currently installed. - final String minimumVersion; -} - -class OnLinkErrorException { - OnLinkErrorException._(this.code, this.message, this.details); - - final String code; - - final String message; - - final dynamic details; -} diff --git a/packages/firebase_dynamic_links/pubspec.yaml b/packages/firebase_dynamic_links/pubspec.yaml deleted file mode 100644 index 73848496a15b..000000000000 --- a/packages/firebase_dynamic_links/pubspec.yaml +++ /dev/null @@ -1,27 +0,0 @@ -name: firebase_dynamic_links -description: Flutter plugin for Google Dynamic Links for Firebase, an app solution for creating - and handling links across multiple platforms. -version: 0.5.0 - -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_dynamic_links - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - url_launcher: ^4.2.0 - firebase_core: ^0.4.0 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebasedynamiclinks - iosPrefix: FLT - pluginClass: FirebaseDynamicLinksPlugin - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart b/packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart deleted file mode 100644 index e89dfef03df3..000000000000 --- a/packages/firebase_dynamic_links/test/firebase_dynamic_links_test.dart +++ /dev/null @@ -1,480 +0,0 @@ -// Copyright 2018 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:flutter/services.dart'; - -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$FirebaseDynamicLinks', () { - final List log = []; - - setUp(() { - FirebaseDynamicLinks.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - final Map returnUrl = { - 'url': 'google.com', - 'warnings': ['This is only a test link'], - }; - switch (methodCall.method) { - case 'DynamicLinkParameters#buildUrl': - return 'google.com'; - case 'DynamicLinkParameters#buildShortLink': - return returnUrl; - case 'DynamicLinkParameters#shortenUrl': - return returnUrl; - case 'FirebaseDynamicLinks#getInitialLink': - return { - 'link': 'https://google.com', - 'android': { - 'clickTimestamp': 1234567, - 'minimumVersion': 12, - }, - 'ios': { - 'minimumVersion': 'Version 12', - }, - }; - default: - return null; - } - }); - log.clear(); - }); - - test('getInitialLink', () async { - final PendingDynamicLinkData data = - await FirebaseDynamicLinks.instance.getInitialLink(); - - expect(data.link, Uri.parse('https://google.com')); - - expect(data.android.clickTimestamp, 1234567); - expect(data.android.minimumVersion, 12); - - expect(data.ios.minimumVersion, 'Version 12'); - - expect(log, [ - isMethodCall( - 'FirebaseDynamicLinks#getInitialLink', - arguments: null, - ) - ]); - }); - - group('$DynamicLinkParameters', () { - test('shortenUrl', () async { - final Uri url = Uri.parse('google.com'); - final DynamicLinkParametersOptions options = - DynamicLinkParametersOptions( - shortDynamicLinkPathLength: - ShortDynamicLinkPathLength.unguessable); - - await DynamicLinkParameters.shortenUrl(url, options); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#shortenUrl', - arguments: { - 'url': url.toString(), - 'dynamicLinkParametersOptions': { - 'shortDynamicLinkPathLength': - ShortDynamicLinkPathLength.unguessable.index, - }, - }, - ), - ]); - }); - - test('$AndroidParameters', () async { - final DynamicLinkParameters components = DynamicLinkParameters( - uriPrefix: 'https://test-domain/', - link: Uri.parse('test-link.com'), - androidParameters: AndroidParameters( - fallbackUrl: Uri.parse('test-url'), - minimumVersion: 1, - packageName: 'test-package', - ), - ); - - await components.buildUrl(); - await components.buildShortLink(); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#buildUrl', - arguments: { - 'androidParameters': { - 'fallbackUrl': 'test-url', - 'minimumVersion': 1, - 'packageName': 'test-package', - }, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - isMethodCall( - 'DynamicLinkParameters#buildShortLink', - arguments: { - 'androidParameters': { - 'fallbackUrl': 'test-url', - 'minimumVersion': 1, - 'packageName': 'test-package', - }, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - ]); - }); - - test('$DynamicLinkParametersOptions', () async { - final DynamicLinkParameters components = DynamicLinkParameters( - uriPrefix: 'https://test-domain/', - link: Uri.parse('test-link.com'), - dynamicLinkParametersOptions: DynamicLinkParametersOptions( - shortDynamicLinkPathLength: ShortDynamicLinkPathLength.short), - ); - - await components.buildUrl(); - await components.buildShortLink(); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#buildUrl', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': { - 'shortDynamicLinkPathLength': - ShortDynamicLinkPathLength.short.index, - }, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - isMethodCall( - 'DynamicLinkParameters#buildShortLink', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': { - 'shortDynamicLinkPathLength': - ShortDynamicLinkPathLength.short.index, - }, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - ]); - }); - - test('$ShortDynamicLinkPathLength', () { - expect(ShortDynamicLinkPathLength.unguessable.index, 0); - expect(ShortDynamicLinkPathLength.short.index, 1); - }); - - test('$GoogleAnalyticsParameters', () async { - final DynamicLinkParameters components = DynamicLinkParameters( - uriPrefix: 'https://test-domain/', - link: Uri.parse('test-link.com'), - googleAnalyticsParameters: GoogleAnalyticsParameters( - campaign: 'where', - content: 'is', - medium: 'my', - source: 'cat', - term: 'friend', - ), - ); - - await components.buildUrl(); - await components.buildShortLink(); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#buildUrl', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': { - 'campaign': 'where', - 'content': 'is', - 'medium': 'my', - 'source': 'cat', - 'term': 'friend', - }, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - isMethodCall( - 'DynamicLinkParameters#buildShortLink', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': { - 'campaign': 'where', - 'content': 'is', - 'medium': 'my', - 'source': 'cat', - 'term': 'friend', - }, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - ]); - }); - - test('$IosParameters', () async { - final DynamicLinkParameters components = DynamicLinkParameters( - uriPrefix: 'https://test-domain/', - link: Uri.parse('test-link.com'), - iosParameters: IosParameters( - appStoreId: 'is', - bundleId: 'this', - customScheme: 'the', - fallbackUrl: Uri.parse('place'), - ipadBundleId: 'to', - ipadFallbackUrl: Uri.parse('find'), - minimumVersion: 'potatoes', - ), - ); - - await components.buildUrl(); - await components.buildShortLink(); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#buildUrl', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': { - 'appStoreId': 'is', - 'bundleId': 'this', - 'customScheme': 'the', - 'fallbackUrl': 'place', - 'ipadBundleId': 'to', - 'ipadFallbackUrl': 'find', - 'minimumVersion': 'potatoes', - }, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - isMethodCall( - 'DynamicLinkParameters#buildShortLink', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': { - 'appStoreId': 'is', - 'bundleId': 'this', - 'customScheme': 'the', - 'fallbackUrl': 'place', - 'ipadBundleId': 'to', - 'ipadFallbackUrl': 'find', - 'minimumVersion': 'potatoes', - }, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - ]); - }); - - test('$ItunesConnectAnalyticsParameters', () async { - final DynamicLinkParameters components = DynamicLinkParameters( - uriPrefix: 'https://test-domain/', - link: Uri.parse('test-link.com'), - itunesConnectAnalyticsParameters: ItunesConnectAnalyticsParameters( - affiliateToken: 'hello', - campaignToken: 'mister', - providerToken: 'rose', - ), - ); - - await components.buildUrl(); - await components.buildShortLink(); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#buildUrl', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': { - 'affiliateToken': 'hello', - 'campaignToken': 'mister', - 'providerToken': 'rose', - }, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - isMethodCall( - 'DynamicLinkParameters#buildShortLink', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': { - 'affiliateToken': 'hello', - 'campaignToken': 'mister', - 'providerToken': 'rose', - }, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': null, - }, - ), - ]); - }); - - test('$NavigationInfoParameters', () async { - final DynamicLinkParameters components = DynamicLinkParameters( - uriPrefix: 'https://test-domain/', - link: Uri.parse('test-link.com'), - navigationInfoParameters: - NavigationInfoParameters(forcedRedirectEnabled: true), - ); - - await components.buildUrl(); - await components.buildShortLink(); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#buildUrl', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': { - 'forcedRedirectEnabled': true, - }, - 'socialMetaTagParameters': null, - }, - ), - isMethodCall( - 'DynamicLinkParameters#buildShortLink', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': { - 'forcedRedirectEnabled': true, - }, - 'socialMetaTagParameters': null, - }, - ), - ]); - }); - - test('$SocialMetaTagParameters', () async { - final DynamicLinkParameters components = DynamicLinkParameters( - uriPrefix: 'https://test-domain/', - link: Uri.parse('test-link.com'), - socialMetaTagParameters: SocialMetaTagParameters( - description: 'describe', - imageUrl: Uri.parse('thisimage'), - title: 'bro', - ), - ); - - await components.buildUrl(); - await components.buildShortLink(); - - expect(log, [ - isMethodCall( - 'DynamicLinkParameters#buildUrl', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': { - 'description': 'describe', - 'imageUrl': 'thisimage', - 'title': 'bro', - }, - }, - ), - isMethodCall( - 'DynamicLinkParameters#buildShortLink', - arguments: { - 'androidParameters': null, - 'uriPrefix': 'https://test-domain/', - 'dynamicLinkParametersOptions': null, - 'googleAnalyticsParameters': null, - 'iosParameters': null, - 'itunesConnectAnalyticsParameters': null, - 'link': 'test-link.com', - 'navigationInfoParameters': null, - 'socialMetaTagParameters': { - 'description': 'describe', - 'imageUrl': 'thisimage', - 'title': 'bro', - }, - }, - ), - ]); - }); - }); - }); -} diff --git a/packages/firebase_in_app_messaging/.gitignore b/packages/firebase_in_app_messaging/.gitignore deleted file mode 100644 index e9dc58d3d6e2..000000000000 --- a/packages/firebase_in_app_messaging/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.DS_Store -.dart_tool/ - -.packages -.pub/ - -build/ diff --git a/packages/firebase_in_app_messaging/.metadata b/packages/firebase_in_app_messaging/.metadata deleted file mode 100644 index 330eadcb22d6..000000000000 --- a/packages/firebase_in_app_messaging/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# 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: 2e540931f73593e35627592ca4f9a4ca3035ed31 - channel: stable - -project_type: plugin diff --git a/packages/firebase_in_app_messaging/CHANGELOG.md b/packages/firebase_in_app_messaging/CHANGELOG.md deleted file mode 100644 index 12a046c09fbf..000000000000 --- a/packages/firebase_in_app_messaging/CHANGELOG.md +++ /dev/null @@ -1,15 +0,0 @@ -## 0.0.1+3 - -* Update AGP, gradle and inappmessaging-display versions on Android. - -## 0.0.1+2 - -* Remove dependency `androidx.annotation:annotation:1.0.0`. - -## 0.0.1+1 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.0.1 - -* Initial release. diff --git a/packages/firebase_in_app_messaging/LICENSE b/packages/firebase_in_app_messaging/LICENSE deleted file mode 100644 index 7319cc0d9e04..000000000000 --- a/packages/firebase_in_app_messaging/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2018, the Chromium project 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. diff --git a/packages/firebase_in_app_messaging/README.md b/packages/firebase_in_app_messaging/README.md deleted file mode 100644 index 9e008fac9220..000000000000 --- a/packages/firebase_in_app_messaging/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# firebase_in_app_messaging plugin - -A Flutter plugin to use the [Firebase In-App Messaging API](https://firebase.google.com/products/in-app-messaging). - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -### Import the firebase_in_app_messaging plugin -To use the firebase_in_app_messaging plugin, follow the [plugin installation instructions](https://pub.dartlang.org/packages/firebase_in_app_messaging#pub-pkg-tab-installing). - -### Android integration - -There are a few extra steps required for the Android integration. Enable the Google services by configuring the Gradle scripts as such. - -1. Add the classpath to the `[project]/android/build.gradle` file. -```gradle -dependencies { - // Example existing classpath - classpath 'com.android.tools.build:gradle:3.3.0' - // Add the google services classpath - classpath 'com.google.gms:google-services:4.3.0' -} -``` - -2. Add the apply plugin to the `[project]/android/app/build.gradle` file. -```gradle -// ADD THIS AT THE BOTTOM -apply plugin: 'com.google.gms.google-services' -``` - -*Note:* If this section is not completed you will get an error like this: -``` -java.lang.IllegalStateException: -Default FirebaseApp is not initialized in this process [package name]. -Make sure to call FirebaseApp.initializeApp(Context) first. -``` - -*Note:* When you are debugging on Android, use a device or AVD with Google Play services. -Otherwise you will not be able to use Firebase In-App Messaging. - -### Use the plugin - -To show In-App Messages in your app, no extra setup is required - just import the plugin and you -are good to go. However, to modify message behavior (as documented [here](https://firebase.google.com/docs/in-app-messaging/modify-message-behavior)), the plugin provides the following methods - - -First off, add the following imports to your Dart code: -```dart -import 'package:firebase_in_app_messaging/firebase_in_app_messaging.dart'; -``` - -#### Programmatic Triggers ([docs](https://firebase.google.com/docs/in-app-messaging/modify-message-behavior?platform=android#trigger_in-app_messages_programmatically)) - -To trigger in-app messages programmatically - -```dart -FirebaseInAppMessaging.triggerEvent('eventName'); -``` - -#### Temporarily disable in-app messages ([docs](https://firebase.google.com/docs/in-app-messaging/modify-message-behavior?platform=android#temporarily_disable_in-app_messages)) - -If you'd like to suppress message displays for any reason, for example to avoid interrupting a sequence of payment processing screens, you can do that the following - -```dart -FirebaseInAppMessaging.setMessagesSuppressed(true); - - -// To re-enable -FirebaseInAppMessaging.setMessagesSuppressed(false); -``` - -#### Enable opt-out message delivery ([docs](https://firebase.google.com/docs/in-app-messaging/modify-message-behavior?platform=android#enable_opt-out_message_delivery)) - -First, follow the step outlined [here](https://firebase.google.com/docs/in-app-messaging/modify-message-behavior#enable_opt-out_message_delivery) for both iOS and Android. Then add the following code in your app: - -```dart -FirebaseInAppMessaging.setAutomaticDataCollectionEnabled(false); -``` - -## Example - -See the [example application](https://github.com/flutter/plugins/tree/master/packages/firebase_in_app_messaging/example) source -for a complete sample app using the Firebase In-App Messaging. - -## Issues and feedback - -Please file [issues](https://github.com/flutter/flutter/issues/new) -to send feedback or report a bug. Thank you! diff --git a/packages/firebase_in_app_messaging/android/.gitignore b/packages/firebase_in_app_messaging/android/.gitignore deleted file mode 100644 index c6cbe562a427..000000000000 --- a/packages/firebase_in_app_messaging/android/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures diff --git a/packages/firebase_in_app_messaging/android/build.gradle b/packages/firebase_in_app_messaging/android/build.gradle deleted file mode 100644 index 280a86f48056..000000000000 --- a/packages/firebase_in_app_messaging/android/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -group 'com.example.firebase_in_app_messaging' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-inappmessaging-display:18.0.2' - } -} diff --git a/packages/firebase_in_app_messaging/android/gradle.properties b/packages/firebase_in_app_messaging/android/gradle.properties deleted file mode 100644 index 2bd6f4fda009..000000000000 --- a/packages/firebase_in_app_messaging/android/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M - diff --git a/packages/firebase_in_app_messaging/android/settings.gradle b/packages/firebase_in_app_messaging/android/settings.gradle deleted file mode 100644 index 727175685e2b..000000000000 --- a/packages/firebase_in_app_messaging/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_in_app_messaging' diff --git a/packages/firebase_in_app_messaging/android/src/main/AndroidManifest.xml b/packages/firebase_in_app_messaging/android/src/main/AndroidManifest.xml deleted file mode 100644 index b6953a13e119..000000000000 --- a/packages/firebase_in_app_messaging/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java b/packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java deleted file mode 100644 index 8a4c6bcfc71e..000000000000 --- a/packages/firebase_in_app_messaging/android/src/main/java/com/example/firebase_in_app_messaging/FirebaseInAppMessagingPlugin.java +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package com.example.firebase_in_app_messaging; - -import com.google.firebase.inappmessaging.FirebaseInAppMessaging; -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.plugin.common.PluginRegistry.Registrar; - -/** FirebaseInAppMessagingPlugin */ -public class FirebaseInAppMessagingPlugin implements MethodCallHandler { - private final FirebaseInAppMessaging instance; - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_in_app_messaging"); - channel.setMethodCallHandler(new FirebaseInAppMessagingPlugin()); - } - - private FirebaseInAppMessagingPlugin() { - instance = FirebaseInAppMessaging.getInstance(); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "triggerEvent": - { - String eventName = call.argument("eventName"); - instance.triggerEvent(eventName); - result.success(null); - break; - } - case "setMessagesSuppressed": - { - Boolean suppress = (Boolean) call.arguments; - instance.setMessagesSuppressed(suppress); - result.success(null); - break; - } - case "setAutomaticDataCollectionEnabled": - { - Boolean enabled = (Boolean) call.arguments; - instance.setAutomaticDataCollectionEnabled(enabled); - result.success(null); - break; - } - default: - { - result.notImplemented(); - break; - } - } - } -} diff --git a/packages/firebase_in_app_messaging/example/.gitignore b/packages/firebase_in_app_messaging/example/.gitignore deleted file mode 100644 index ac4a90645ca3..000000000000 --- a/packages/firebase_in_app_messaging/example/.gitignore +++ /dev/null @@ -1,72 +0,0 @@ -# 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 -.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/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/packages/firebase_in_app_messaging/example/.metadata b/packages/firebase_in_app_messaging/example/.metadata deleted file mode 100644 index 0fc331292ca8..000000000000 --- a/packages/firebase_in_app_messaging/example/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# 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: 2e540931f73593e35627592ca4f9a4ca3035ed31 - channel: stable - -project_type: app diff --git a/packages/firebase_in_app_messaging/example/README.md b/packages/firebase_in_app_messaging/example/README.md deleted file mode 100644 index 5146fbdf4919..000000000000 --- a/packages/firebase_in_app_messaging/example/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# firebase_in_app_messaging_example - -Demonstrates how to use the firebase_in_app_messaging plugin. - diff --git a/packages/firebase_in_app_messaging/example/android/app/build.gradle b/packages/firebase_in_app_messaging/example/android/app/build.gradle deleted file mode 100644 index ce9e3c1143fb..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "com.example.firebase_in_app_messaging_example" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - multiDexEnabled true - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.2.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_in_app_messaging/example/android/app/google-services.json b/packages/firebase_in_app_messaging/example/android/app/google-services.json deleted file mode 100644 index 3e7c1eea26e7..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/google-services.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "project_info": { - "project_number": "417703151161", - "firebase_url": "https://fiamflutter.firebaseio.com", - "project_id": "fiamflutter", - "storage_bucket": "fiamflutter.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:417703151161:android:362d1e29a3978127", - "android_client_info": { - "package_name": "com.example.firebase_in_app_messaging_example" - } - }, - "oauth_client": [ - { - "client_id": "417703151161-qkgc7njdplpe7s05eg8k3qlq8ruqj03a.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBWb90xr1JZGil-JEBULhYeb5w3qM2pYDI" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "417703151161-qkgc7njdplpe7s05eg8k3qlq8ruqj03a.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "417703151161-a2kb2fdjfkd3khbhd2lkf0uvobashf55.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.example.firebaseInappmessagingExample" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:417703151161:android:e6d1fd37b00bc472", - "android_client_info": { - "package_name": "com.example.firebase_inappmessaging_example" - } - }, - "oauth_client": [ - { - "client_id": "417703151161-qkgc7njdplpe7s05eg8k3qlq8ruqj03a.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBWb90xr1JZGil-JEBULhYeb5w3qM2pYDI" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "417703151161-qkgc7njdplpe7s05eg8k3qlq8ruqj03a.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "417703151161-a2kb2fdjfkd3khbhd2lkf0uvobashf55.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.example.firebaseInappmessagingExample" - } - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_in_app_messaging/example/android/app/gradle.properties b/packages/firebase_in_app_messaging/example/android/app/gradle.properties deleted file mode 100644 index dbb7bf70d15c..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true diff --git a/packages/firebase_in_app_messaging/example/android/app/src/debug/AndroidManifest.xml b/packages/firebase_in_app_messaging/example/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 94dd5928d625..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_in_app_messaging/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index d2fa82033723..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/java/com/example/firebase_in_app_messaging_example/MainActivity.java b/packages/firebase_in_app_messaging/example/android/app/src/main/java/com/example/firebase_in_app_messaging_example/MainActivity.java deleted file mode 100644 index 98218250276a..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/src/main/java/com/example/firebase_in_app_messaging_example/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.firebase_in_app_messaging_example; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_in_app_messaging/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_in_app_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_in_app_messaging/example/android/app/src/main/res/values/styles.xml b/packages/firebase_in_app_messaging/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/firebase_in_app_messaging/example/android/app/src/profile/AndroidManifest.xml b/packages/firebase_in_app_messaging/example/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 94dd5928d625..000000000000 --- a/packages/firebase_in_app_messaging/example/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/firebase_in_app_messaging/example/android/build.gradle b/packages/firebase_in_app_messaging/example/android/build.gradle deleted file mode 100644 index f373ec6839c9..000000000000 --- a/packages/firebase_in_app_messaging/example/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' - classpath 'com.google.gms:google-services:4.3.0' - - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_in_app_messaging/example/android/gradle.properties b/packages/firebase_in_app_messaging/example/android/gradle.properties deleted file mode 100644 index 2bd6f4fda009..000000000000 --- a/packages/firebase_in_app_messaging/example/android/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M - diff --git a/packages/firebase_in_app_messaging/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_in_app_messaging/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 659814bcc887..000000000000 --- a/packages/firebase_in_app_messaging/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Mon Aug 05 20:16:36 BRT 2019 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/packages/firebase_in_app_messaging/example/android/settings.gradle b/packages/firebase_in_app_messaging/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/firebase_in_app_messaging/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_in_app_messaging/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_in_app_messaging/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6b4c0f78a785..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_in_app_messaging/example/ios/Flutter/Debug.xcconfig b/packages/firebase_in_app_messaging/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_in_app_messaging/example/ios/Flutter/Release.xcconfig b/packages/firebase_in_app_messaging/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_in_app_messaging/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_in_app_messaging/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 3b7693aef91e..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,600 +0,0 @@ -// !$*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 */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9031715A22DD332B00CA8C68 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9031715922DD332B00CA8C68 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 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 */; }; - E638726B1F84F369FCA09810 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 914982FDACC51A62D1FAC1F1 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 2D51D38D6F347D924BF73402 /* 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 = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 4DBCB98EE08F0263FFB39A45 /* 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; 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 = ""; }; - 9031715922DD332B00CA8C68 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 914982FDACC51A62D1FAC1F1 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9697814F64329B9DFDDD2D22 /* 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 = ""; }; - 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - E638726B1F84F369FCA09810 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3273157BD1F69AB58A8F6978 /* Pods */ = { - isa = PBXGroup; - children = ( - 2D51D38D6F347D924BF73402 /* Pods-Runner.debug.xcconfig */, - 4DBCB98EE08F0263FFB39A45 /* Pods-Runner.release.xcconfig */, - 9697814F64329B9DFDDD2D22 /* Pods-Runner.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - 9308F32363B77379BD52E16A /* Frameworks */ = { - isa = PBXGroup; - children = ( - 914982FDACC51A62D1FAC1F1 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 3273157BD1F69AB58A8F6978 /* Pods */, - 9308F32363B77379BD52E16A /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 9031715922DD332B00CA8C68 /* GoogleService-Info.plist */, - 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 = ( - 9FEE87118A15F39DB7049483 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 9CB2B92FB733B57CFCD2086E /* [CP] Embed Pods Frameworks */, - 4E58458F4BA4D6603A0A2A9C /* [CP] Copy Pods Resources */, - ); - 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 = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = TA9VLBVN24; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - 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 */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - 9031715A22DD332B00CA8C68 /* GoogleService-Info.plist 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\" thin"; - }; - 4E58458F4BA4D6603A0A2A9C /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - 9CB2B92FB733B57CFCD2086E /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9FEE87118A15F39DB7049483 /* [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 */ - 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; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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)"; - DEVELOPMENT_TEAM = TA9VLBVN24; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.firebaseInAppMessagingExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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)"; - DEVELOPMENT_TEAM = TA9VLBVN24; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.firebaseInAppMessagingExample; - 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)"; - DEVELOPMENT_TEAM = TA9VLBVN24; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.firebaseInAppMessagingExample; - 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_in_app_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_in_app_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 37add4ed8194..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.h b/packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.m b/packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d9d..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 zcmeHN3sh5A)((b(k1DoWZSj%R+R=^`Y(b;ElB$1^R>iT7q6h&WAVr806i~>Gqn6rM z>3}bMG&oq%DIriqR35=rtEdos5L6z)YC*Xq0U-$_+Il@RaU zXYX%+``hR28`(B*uJ6G9&iz>|)PS%!)9N`7=LcmcxH}k69HPyT-%S zH7+jBCC<%76cg_H-n41cTqnKn`u_V9p~XaTLUe3s{KRPSTeK6apP4Jg%VQ$e#72ms zxyWzmGSRwN?=fRgpx!?W&ZsrLfuhAsRxm%;_|P@3@3~BJwY4ZVBJ3f&$5x>`^fD?d zI+z!v#$!gz%FtL*%mR^Uwa*8LJFZ_;X!y$cD??W#c)31l@ervOa_Qk86R{HJiZb$f z&&&0xYmB{@D@yl~^l5IXtB_ou{xFiYP(Jr<9Ce{jCN z<3Rf2TD%}_N?y>bgWq|{`RKd}n>P4e8Z-D+(fn^4)+|pv$DcR&i+RHNhv$71F*McT zl`phYBlb;wO`b7)*10XF6UXhY9`@UR*6-#(Zp`vyU(__*te6xYtV&N0(zjMtev{tZ zapmGin===teMXjsS0>CYxUy<2izOKOPai0}!B9+6q$s3CF8W{xUwz?A0ADO5&BsiB z{SFt|KehNd-S#eiDq!y&+mW9N_!wH-i~q|oNm=mEzkx}B?Ehe%q$tK8f=QY#*6rH9 zNHHaG(9WBqzP!!TMEktSVuh$i$4A^b25LK}&1*4W?ul*5pZYjL1OZ@X9?3W7Y|T6} z1SXx0Wn-|!A;fZGGlYn9a1Jz5^8)~v#mXhmm>um{QiGG459N}L<&qyD+sy_ixD@AP zW0XV6w#3(JW>TEV}MD=O0O>k5H>p#&|O zD2mGf0Cz7+>l7`NuzGobt;(o@vb9YiOpHN8QJ9Uva|i7R?7nnq;L_iq+ZqPv*oGu! zN@GuJ9fm;yrEFga63m?1qy|5&fd32<%$yP$llh}Udrp>~fb>M>R55I@BsGYhCj8m1 zC=ziFh4@hoytpfrJlr}FsV|C(aV4PZ^8^`G29(+!Bk8APa#PemJqkF zE{IzwPaE)I&r`OxGk*vPErm6sGKaQJ&6FODW$;gAl_4b_j!oH4yE@ zP~Cl4?kp>Ccc~Nm+0kjIb`U0N7}zrQEN5!Ju|}t}LeXi!baZOyhlWha5lq{Ld2rdo zGz7hAJQt<6^cxXTe0xZjmADL85cC&H+~Lt2siIIh{$~+U#&#^{Ub22IA|ea6 z5j12XLc`~dh$$1>3o0Cgvo*ybi$c*z>n=5L&X|>Wy1~eagk;lcEnf^2^2xB=e58Z` z@Rw{1ssK)NRV+2O6c<8qFl%efHE;uy!mq(Xi1P*H2}LMi z3EqWN2U?eW{J$lSFxDJg-=&RH!=6P9!y|S~gmjg)gPKGMxq6r9cNIhW` zS})-obO}Ao_`;=>@fAwU&=|5$J;?~!s4LN2&XiMXEl>zk9M}tVEg#kkIkbKp%Ig2QJ2aCILCM1E=aN*iuz>;q#T_I7aVM=E4$m_#OWLnXQnFUnu?~(X>$@NP zBJ@Zw>@bmErSuW7SR2=6535wh-R`WZ+5dLqwTvw}Ks8~4F#hh0$Qn^l-z=;>D~St( z-1yEjCCgd*z5qXa*bJ7H2Tk54KiX&=Vd}z?%dcc z`N8oeYUKe17&|B5A-++RHh8WQ%;gN{vf%05@jZF%wn1Z_yk#M~Cn(i@MB_mpcbLj5 zR#QAtC`k=tZ*h|){Mjz`7bNL zGWOW=bjQhX@`Vw^xn#cVwn28c2D9vOb0TLLy~-?-%gOyHSeJ9a>P}5OF5$n}k-pvUa*pvLw)KvG~>QjNWS3LY1f*OkFwPZ5qC@+3^Bt=HZbf`alKY#{pn zdY}NEIgo1sd)^TPxVzO{uvU$|Z-jkK0p1x##LexgQ$zx1^bNPOG*u2RmZkIM!zFVz zz|IsP3I?qrlmjGS2w_(azCvGTnf~flqogV@Q%mH{76uLU(>UB zQZ?*ys3BO&TV{Pj_qEa-hkH7mOMe_Bnu3%CXCgu90XNKf$N)PUc3Ei-&~@tT zI^49Lm^+=TrI=h4h=W@jW{GjWd{_kVuSzAL6Pi@HKYYnnNbtcYdIRww+jY$(30=#p8*if(mzbvau z00#}4Qf+gH&ce_&8y3Z@CZV>b%&Zr7xuPSSqOmoaP@arwPrMx^jQBQQi>YvBUdpBn zI``MZ3I3HLqp)@vk^E|~)zw$0$VI_RPsL9u(kqulmS`tnb%4U)hm{)h@bG*jw@Y*#MX;Th1wu3TrO}Srn_+YWYesEgkO1 zv?P8uWB)is;#&=xBBLf+y5e4?%y>_8$1KwkAJ8UcW|0CIz89{LydfJKr^RF=JFPi}MAv|ecbuZ!YcTSxsD$(Pr#W*oytl?@+2 zXBFb32Kf_G3~EgOS7C`8w!tx}DcCT%+#qa76VSbnHo;4(oJ7)}mm?b5V65ir`7Z}s zR2)m15b#E}z_2@rf34wo!M^CnVoi# ze+S(IK({C6u=Sm{1>F~?)8t&fZpOOPcby;I3jO;7^xmLKM(<%i-nyj9mgw9F1Lq4|DZUHZ4)V9&6fQM(ZxbG{h+}(koiTu`SQw6#6q2Yg z-d+1+MRp$zYT2neIR2cKij2!R;C~ooQ3<;^8)_Gch&ZyEtiQwmF0Mb_)6)4lVEBF< zklXS7hvtu30uJR`3OzcqUNOdYsfrKSGkIQAk|4=&#ggxdU4^Y(;)$8}fQ>lTgQdJ{ zzie8+1$3@E;|a`kzuFh9Se}%RHTmBg)h$eH;gttjL_)pO^10?!bNev6{mLMaQpY<< z7M^ZXrg>tw;vU@9H=khbff?@nu)Yw4G% zGxobPTUR2p_ed7Lvx?dkrN^>Cv$Axuwk;Wj{5Z@#$sK@f4{7SHg%2bpcS{(~s;L(mz@9r$cK@m~ef&vf%1@ z@8&@LLO2lQso|bJD6}+_L1*D^}>oqg~$NipL>QlP3 zM#ATSy@ycMkKs5-0X8nFAtMhO_=$DlWR+@EaZ}`YduRD4A2@!at3NYRHmlENea9IF zN*s>mi?zy*Vv+F+&4-o`Wj}P3mLGM*&M(z|;?d82>hQkkY?e-hJ47mWOLCPL*MO04 z3lE(n2RM=IIo;Z?I=sKJ_h=iJHbQ2<}WW0b@I6Qf-{T=Qn#@N0yG5xH&ofEy^mZMPzd22nR`t!Q)VkNgf*VOxE z$XhOunG3ZN#`Ks$Hp~}`OX5vmHP={GYUJ+-g0%PS$*Qi5+-40M47zJ24vK1#? zb$s^%r?+>#lw$mpZaMa1aO%wlPm3~cno_(S%U&-R;6eK(@`CjswAW2)HfZ>ptItaZ|XqQ z&sHVVL>WCe|E4iPb2~gS5ITs6xfg(kmt&3$YcI=zTuqj37t|+9ojCr(G^ul#p{>k) zM94pI>~5VZ$!*Qurq<@RIXgP3sx-2kL$1Q~da%rnNIh?)&+c~*&e~CYPDhPYjb+Xu zKg5w^XB3(_9{Waa4E(-J-Kq_u6t_k?a8kEHqai-N-4#`SRerO!h}!cS%SMC<)tGix zOzVP^_t!HN&HIPL-ZpcgWitHM&yFRC7!k4zSI+-<_uQ}|tX)n{Ib;X>Xx>i_d*KkH zCzogKQFpP1408_2!ofU|iBq2R8hW6G zuqJs9Tyw{u%-uWczPLkM!MfKfflt+NK9Vk8E!C>AsJwNDRoe2~cL+UvqNP|5J8t)( z0$iMa!jhudJ+fqFn+um&@Oj6qXJd_3-l`S^I1#0fnt!z3?D*hAHr*u(*wR@`4O z#avrtg%s`Fh{?$FtBFM^$@@hW!8ZfF4;=n0<8In&X}-Rp=cd0TqT_ne46$j^r}FzE z26vX^!PzScuQfFfl1HEZ{zL?G88mcc76zHGizWiykBf4m83Z${So-+dZ~YGhm*RO7 zB1gdIdqnFi?qw+lPRFW5?}CQ3Me3G^muvll&4iN+*5#_mmIu;loULMwb4lu9U*dFM z-Sr**(0Ei~u=$3<6>C-G6z4_LNCx||6YtjS)<;hf)YJTPKXW+w%hhCTUAInIse9>r zl2YU6nRb$u-FJlWN*{{%sm_gi_UP5{=?5}5^D2vPzM=oPfNw~azZQ#P zl5z8RtSSiTIpEohC15i-Q1Bk{3&ElsD0uGAOxvbk29VUDmmA0w;^v`W#0`};O3DVE z&+-ca*`YcN%z*#VXWK9Qa-OEME#fykF%|7o=1Y+eF;Rtv0W4~kKRDx9YBHOWhC%^I z$Jec0cC7o37}Xt}cu)NH5R}NT+=2Nap*`^%O)vz?+{PV<2~qX%TzdJOGeKj5_QjqR&a3*K@= P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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_in_app_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_in_app_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_in_app_messaging/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index 3950f04ab0f9..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_in_app_messaging/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 0ad19e34cfee..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - 417703151161-0kmftqj80per9egdcai8c89sefjdptfg.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.417703151161-0kmftqj80per9egdcai8c89sefjdptfg - API_KEY - AIzaSyAirg5nBv4fsGWF82ITldAd04thCp04WQ0 - GCM_SENDER_ID - 417703151161 - PLIST_VERSION - 1 - BUNDLE_ID - com.example.firebaseInAppMessagingExample - PROJECT_ID - fiamflutter - STORAGE_BUCKET - fiamflutter.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:417703151161:ios:2ad9dffe6e82f02c - DATABASE_URL - https://fiamflutter.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_in_app_messaging/example/ios/Runner/Info.plist b/packages/firebase_in_app_messaging/example/ios/Runner/Info.plist deleted file mode 100644 index 9afd5ae7969f..000000000000 --- a/packages/firebase_in_app_messaging/example/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_in_app_messaging_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_in_app_messaging/example/ios/Runner/main.m b/packages/firebase_in_app_messaging/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_in_app_messaging/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_in_app_messaging/example/lib/main.dart b/packages/firebase_in_app_messaging/example/lib/main.dart deleted file mode 100644 index 8f187657f95e..000000000000 --- a/packages/firebase_in_app_messaging/example/lib/main.dart +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:firebase_in_app_messaging/firebase_in_app_messaging.dart'; -import 'package:flutter/material.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatelessWidget { - static FirebaseAnalytics analytics = FirebaseAnalytics(); - static FirebaseInAppMessaging fiam = FirebaseInAppMessaging(); - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('In-App Messaging example'), - ), - body: Builder(builder: (BuildContext context) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - AnalyticsEventExample(), - ProgrammaticTriggersExample(fiam), - ], - ), - ); - }), - )); - } -} - -class ProgrammaticTriggersExample extends StatelessWidget { - const ProgrammaticTriggersExample(this.fiam); - - final FirebaseInAppMessaging fiam; - - @override - Widget build(BuildContext context) { - return Card( - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Column( - children: [ - Text( - "Programmatic Trigger", - style: TextStyle( - fontStyle: FontStyle.italic, - fontSize: 18, - ), - ), - const SizedBox(height: 8), - const Text("Manually trigger events programmatically "), - const SizedBox(height: 8), - RaisedButton( - onPressed: () { - fiam.triggerEvent('chicken_event'); - Scaffold.of(context).showSnackBar(SnackBar( - content: const Text("Triggering event: chicken_event"))); - }, - color: Colors.blue, - child: Text( - "Programmatic Triggers".toUpperCase(), - style: TextStyle(color: Colors.white), - ), - ) - ], - ), - ), - ); - } -} - -class AnalyticsEventExample extends StatelessWidget { - Future _sendAnalyticsEvent() async { - await MyApp.analytics - .logEvent(name: 'awesome_event', parameters: { - 'int': 42, // not required? - }); - } - - @override - Widget build(BuildContext context) { - return Card( - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Column( - children: [ - Text( - "Log an analytics event", - style: TextStyle( - fontStyle: FontStyle.italic, - fontSize: 18, - ), - ), - const SizedBox(height: 8), - const Text("Trigger an analytics event"), - const SizedBox(height: 8), - RaisedButton( - onPressed: () { - _sendAnalyticsEvent(); - Scaffold.of(context).showSnackBar(SnackBar( - content: - const Text("Firing analytics event: awesome_event"))); - }, - color: Colors.blue, - child: Text( - "Log event".toUpperCase(), - style: TextStyle(color: Colors.white), - ), - ), - ], - ), - ), - ); - } -} diff --git a/packages/firebase_in_app_messaging/example/pubspec.yaml b/packages/firebase_in_app_messaging/example/pubspec.yaml deleted file mode 100644 index a2acd35b132f..000000000000 --- a/packages/firebase_in_app_messaging/example/pubspec.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: firebase_in_app_messaging_example -description: Demonstrates how to use the firebase_in_app_messaging plugin. -publish_to: 'none' - -environment: - sdk: ">=2.1.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - cupertino_icons: ^0.1.2 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - - firebase_in_app_messaging: - path: ../ - firebase_core: ^0.4.0+8 - firebase_analytics: ^4.0.2 - -flutter: - uses-material-design: true diff --git a/packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging.dart b/packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging.dart deleted file mode 100644 index 62953cee0316..000000000000 --- a/packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:firebase_in_app_messaging/firebase_in_app_messaging.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('firebase_in_app_messaging', () { - FirebaseInAppMessaging fiam; - - setUp(() { - fiam = FirebaseInAppMessaging(); - }); - - test('triggerEvent', () { - expect(fiam.triggerEvent('someEvent'), completes); - }); - - test('logging', () { - expect(fiam.setMessagesSuppressed(true), completes); - expect(fiam.setAutomaticDataCollectionEnabled(true), completes); - }); - }); -} diff --git a/packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging_test.dart b/packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging_test.dart deleted file mode 100644 index cc11eae240e3..000000000000 --- a/packages/firebase_in_app_messaging/example/test_driver/firebase_in_app_messaging_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; - -void main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_in_app_messaging/ios/.gitignore b/packages/firebase_in_app_messaging/ios/.gitignore deleted file mode 100644 index 710ec6cf1c71..000000000000 --- a/packages/firebase_in_app_messaging/ios/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -.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 diff --git a/packages/firebase_in_app_messaging/ios/Assets/.gitkeep b/packages/firebase_in_app_messaging/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h b/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h deleted file mode 100644 index 8a11472c4197..000000000000 --- a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface FirebaseInAppMessagingPlugin : NSObject -@end diff --git a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m b/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m deleted file mode 100644 index 8ae625e4915b..000000000000 --- a/packages/firebase_in_app_messaging/ios/Classes/FirebaseInAppMessagingPlugin.m +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseInAppMessagingPlugin.h" - -#import - -@implementation FirebaseInAppMessagingPlugin -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_in_app_messaging" - binaryMessenger:[registrar messenger]]; - FirebaseInAppMessagingPlugin *instance = [[FirebaseInAppMessagingPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"triggerEvent" isEqualToString:call.method]) { - NSString *eventName = call.arguments[@"eventName"]; - FIRInAppMessaging *fiam = [FIRInAppMessaging inAppMessaging]; - [fiam triggerEvent:eventName]; - result(nil); - } else if ([@"setMessagesSuppressed" isEqualToString:call.method]) { - NSNumber *suppress = [NSNumber numberWithBool:call.arguments]; - FIRInAppMessaging *fiam = [FIRInAppMessaging inAppMessaging]; - fiam.messageDisplaySuppressed = [suppress boolValue]; - result(nil); - } else if ([@"setAutomaticDataCollectionEnabled" isEqualToString:call.method]) { - NSNumber *enabled = [NSNumber numberWithBool:call.arguments]; - FIRInAppMessaging *fiam = [FIRInAppMessaging inAppMessaging]; - fiam.automaticDataCollectionEnabled = [enabled boolValue]; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -@end diff --git a/packages/firebase_in_app_messaging/ios/firebase_in_app_messaging.podspec b/packages/firebase_in_app_messaging/ios/firebase_in_app_messaging.podspec deleted file mode 100644 index f635f4a85656..000000000000 --- a/packages/firebase_in_app_messaging/ios/firebase_in_app_messaging.podspec +++ /dev/null @@ -1,24 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -Pod::Spec.new do |s| - s.name = 'firebase_in_app_messaging' - s.version = '0.0.1' - s.summary = 'InAppMessaging Plugin for Firebase' - s.description = <<-DESC -A new flutter plugin project. - DESC - s.homepage = 'http://example.com' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'Firebase' - s.dependency 'Firebase/InAppMessagingDisplay' - s.static_framework = true - - s.ios.deployment_target = '8.0' -end - diff --git a/packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart b/packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart deleted file mode 100644 index e6549888c3ed..000000000000 --- a/packages/firebase_in_app_messaging/lib/firebase_in_app_messaging.dart +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -class FirebaseInAppMessaging { - @visibleForTesting - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_in_app_messaging'); - - static FirebaseInAppMessaging _instance = FirebaseInAppMessaging(); - - /// Gets the instance of In-App Messaging for the default Firebase app. - static FirebaseInAppMessaging get instance => _instance; - - /// Triggers an analytics event. - Future triggerEvent(String eventName) async { - await channel.invokeMethod( - 'triggerEvent', {'eventName': eventName}); - } - - /// Enables or disables suppression of message displays. - Future setMessagesSuppressed(bool suppress) async { - if (suppress == null) { - throw ArgumentError.notNull('suppress'); - } - await channel.invokeMethod('setMessagesSuppressed', suppress); - } - - /// Disable data collection for the app. - Future setAutomaticDataCollectionEnabled(bool enabled) async { - if (enabled == null) { - throw ArgumentError.notNull('enabled'); - } - await channel.invokeMethod( - 'setAutomaticDataCollectionEnabled', enabled); - } -} diff --git a/packages/firebase_in_app_messaging/pubspec.yaml b/packages/firebase_in_app_messaging/pubspec.yaml deleted file mode 100644 index e74b6405ad8d..000000000000 --- a/packages/firebase_in_app_messaging/pubspec.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: firebase_in_app_messaging -description: Flutter plugin for Firebase In-App Messaging. -version: 0.0.1+3 -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_in_app_messaging - -environment: - sdk: ">=2.1.0 <3.0.0" - -dependencies: - meta: ^1.1.6 - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - -flutter: - plugin: - androidPackage: com.example.firebase_in_app_messaging - pluginClass: FirebaseInAppMessagingPlugin diff --git a/packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart b/packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart deleted file mode 100644 index d2448c2a9d05..000000000000 --- a/packages/firebase_in_app_messaging/test/firebase_in_app_messaging_test.dart +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:firebase_in_app_messaging/firebase_in_app_messaging.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$FirebaseInAppMessaging', () { - final List log = []; - - setUp(() { - log.clear(); - FirebaseInAppMessaging.channel - .setMockMethodCallHandler((MethodCall methodcall) async { - log.add(methodcall); - return true; - }); - }); - - test('triggerEvent', () async { - final FirebaseInAppMessaging fiam = FirebaseInAppMessaging(); - await fiam.triggerEvent('someEvent'); - expect(log, [ - isMethodCall('triggerEvent', - arguments: {"eventName": "someEvent"}), - ]); - }); - - test('setMessagesSuppressed', () async { - final FirebaseInAppMessaging fiam = FirebaseInAppMessaging(); - await fiam.setMessagesSuppressed(true); - expect(log, - [isMethodCall('setMessagesSuppressed', arguments: true)]); - - log.clear(); - fiam.setMessagesSuppressed(false); - expect(log, [ - isMethodCall('setMessagesSuppressed', arguments: false), - ]); - }); - - test('setDataCollectionEnabled', () async { - final FirebaseInAppMessaging fiam = FirebaseInAppMessaging(); - await fiam.setAutomaticDataCollectionEnabled(true); - expect(log, [ - isMethodCall('setAutomaticDataCollectionEnabled', arguments: true) - ]); - - log.clear(); - fiam.setAutomaticDataCollectionEnabled(false); - expect(log, [ - isMethodCall('setAutomaticDataCollectionEnabled', arguments: false), - ]); - }); - }); -} diff --git a/packages/firebase_messaging/.gitignore b/packages/firebase_messaging/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_messaging/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_messaging/CHANGELOG.md b/packages/firebase_messaging/CHANGELOG.md deleted file mode 100644 index 76fe5f3c10c0..000000000000 --- a/packages/firebase_messaging/CHANGELOG.md +++ /dev/null @@ -1,262 +0,0 @@ -## 5.1.3 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 5.1.2 - -* Updates to README and example with explanations of differences in data format. - -## 5.1.1 - -* Update README with more detailed integration instructions. - -## 5.1.0 - -* Changed the return type of `subscribeToTopic` and `unsubscribeFromTopic` to - `Future`. - -## 5.0.6 - -* Additional integration tests. - -## 5.0.5 - -* On Android, fix crash when calling `deleteInstanceID` with latest Flutter engine. - -## 5.0.4 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 5.0.3 - -* Update Dart code to conform to current Dart formatter. - -## 5.0.2 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. -* Replace invokeMethod with invokeMapMethod wherever necessary. - -## 5.0.1+1 - -* Enable support for `onMessage` on iOS using `shouldEstablishDirectChannel`. - -## 5.0.1 - -* Fix error in the logs on startup if unable to retrieve token on startup on Android. - -## 5.0.0 - -* Update Android dependencies to latest. - -## 4.0.0+4 - -* Remove obsolete `use_frameworks!` instruction. - -## 4.0.0+3 - -* Update iOS configuration documentation. - -## 4.0.0+2 - -* Fix example app's floating action button that stopped working due to a breaking change. - -## 4.0.0+1 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 4.0.0 - -* **Breaking Change** Update message structure for onMessage to match onLaunch and onResume - -## 3.0.1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 3.0.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - - This was originally incorrectly pushed in the `2.2.0` update. - -## 2.2.0+1 - -* **Revert the breaking 2.2.0 update**. 2.2.0 was known to be breaking and - should have incremented the major version number instead of the minor. This - revert is in and of itself breaking for anyone that has already migrated - however. Anyone who has already migrated their app to AndroidX should - immediately update to `3.0.0` instead. That's the correctly versioned new push - of `2.2.0`. - -## 2.2.0 - -* **BAD**. This was a breaking change that was incorrectly published on a minor - version upgrade, should never have happened. Reverted by `2.2.0+1`. - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 2.1.0 - -* Adding support for deleteInstanceID(), autoInitEnabled() and setAutoInitEnabled(). - -## 2.0.3 - -* Removing local cache of getToken() in the dart part of the plugin. Now getToken() calls directly its counterparts in the iOS and Android implementations. This enables obtaining its value without calling configure() or having to wait for a new token refresh. - -## 2.0.2 - -* Use boolean values when checking for notification types on iOS. - -## 2.0.1 - -* Bump Android dependencies to latest. - -## 2.0.0 - -* Updated Android to send Remote Message's title and body to Dart. - -## 1.0.5 - -* Bumped test and mockito versions to pick up Dart 2 support. - -## 1.0.4 - -* Bump Android and Firebase dependency versions. - -## 1.0.3 - -* Updated iOS token hook from 'didRefreshRegistrationToken' to 'didReceiveRegistrationToken' - -## 1.0.2 - -* Updated Gradle tooling to match Android Studio 3.2.2. - -## 1.0.1 - -* Fix for Android where the onLaunch event is not triggered when the Activity is killed by the OS (or if the Don't keep activities toggle is enabled) - -## 1.0.0 - -* Bump to released version - -## 0.2.5 - -* Fixed Dart 2 type error. - -## 0.2.4 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.2.3 - -* Updated package channel name - -## 0.2.2 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.2.1 - -* Fixed Dart 2 type errors. - -## 0.2.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.1.4 - -* Fixed Dart 2 type error in example project. - -## 0.1.3 - -* Enabled use in Swift projects. - -## 0.2.2 - -* Fix for APNS not being correctly registered on iOS when reinstalling application. - -## 0.1.1 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.1.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.0.8 - -* Added FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.0.7 - -In FirebaseMessagingPlugin.m: -* moved logic from 'tokenRefreshNotification' to 'didRefreshRegistrationToken' -* removed 'tokenRefreshNotification' as well as observer registration -* removed 'connectToFcm' method and related calls -* removed unnecessary FIRMessaging disconnect - -## 0.0.6 - -* Change GMS dependency to 11.+ - -## 0.0.5+2 - -* Fixed README example for "click_action" - -## 0.0.5+1 - -* Aligned author name with rest of repo. - -## 0.0.5 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds - -## 0.0.4 - -* Updated to Firebase SDK Version 11.0.1 - -## 0.0.3 - -* Updated README.md -* Bumped buildToolsVersion to 25.0.3 - -## 0.0.2+2 - -* Updated README.md - -## 0.0.2+1 - -* Added workaround for https://github.com/flutter/flutter/issues/9694 to README -* Moved code to https://github.com/flutter/plugins - -## 0.0.2 - -* Updated to latest plugin API - -## 0.0.2.2 - -* Downgraded gradle dependency for example app to make `flutter run` happy - -## 0.0.1+1 - -* Updated README with installation instructions -* Added CHANGELOG - -## 0.0.1 - -* Initial Release diff --git a/packages/firebase_messaging/LICENSE b/packages/firebase_messaging/LICENSE deleted file mode 100644 index 000b4618d2bd..000000000000 --- a/packages/firebase_messaging/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 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_messaging/README.md b/packages/firebase_messaging/README.md deleted file mode 100644 index fced940d7b7f..000000000000 --- a/packages/firebase_messaging/README.md +++ /dev/null @@ -1,123 +0,0 @@ -# Firebase Cloud Messaging for Flutter - -[![pub package](https://img.shields.io/pub/v/firebase_messaging.svg)](https://pub.dartlang.org/packages/firebase_messaging) - -A Flutter plugin to use the [Firebase Cloud Messaging (FCM) API](https://firebase.google.com/docs/cloud-messaging/). - -With this plugin, your Flutter app can receive and process push notifications as well as data messages on Android and iOS. Read Firebase's [About FCM Messages](https://firebase.google.com/docs/cloud-messaging/concept-options) to learn more about the differences between notification messages and data messages. - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage -To use this plugin, add `firebase_messaging` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Getting Started - -Check out the `example` directory for a sample app using Firebase Cloud Messaging. - -### Android Integration - -To integrate your plugin into the Android part of your app, follow these steps: - -1. Using the [Firebase Console](https://console.firebase.google.com/) add an Android app to your project: Follow the assistant, download the generated `google-services.json` file and place it inside `android/app`. - -2. Add the classpath to the `[project]/android/build.gradle` file. -``` -dependencies { - // Example existing classpath - classpath 'com.android.tools.build:gradle:3.2.1' - // Add the google services classpath - classpath 'com.google.gms:google-services:4.3.0' -} -``` -3. Add the apply plugin to the `[project]/android/app/build.gradle` file. -``` -// ADD THIS AT THE BOTTOM -apply plugin: 'com.google.gms.google-services' -``` - -Note: If this section is not completed you will get an error like this: -``` -java.lang.IllegalStateException: -Default FirebaseApp is not initialized in this process [package name]. -Make sure to call FirebaseApp.initializeApp(Context) first. -``` - -Note: When you are debugging on Android, use a device or AVD with Google Play services. Otherwise you will not be able to authenticate. - -4. (optional, but recommended) If want to be notified in your app (via `onResume` and `onLaunch`, see below) when the user clicks on a notification in the system tray include the following `intent-filter` within the `` tag of your `android/app/src/main/AndroidManifest.xml`: - ```xml - - - - - ``` - - -### iOS Integration - -To integrate your plugin into the iOS part of your app, follow these steps: - -1. Generate the certificates required by Apple for receiving push notifications following [this guide](https://firebase.google.com/docs/cloud-messaging/ios/certs) in the Firebase docs. You can skip the section titled "Create the Provisioning Profile". - -1. Using the [Firebase Console](https://console.firebase.google.com/) add an iOS app to your project: Follow the assistant, download the generated `GoogleService-Info.plist` file, open `ios/Runner.xcworkspace` with Xcode, and within Xcode place the file inside `ios/Runner`. **Don't** follow the steps named "Add Firebase SDK" and "Add initialization code" in the Firebase assistant. - -1. In Xcode, select `Runner` in the Project Navigator. In the Capabilities Tab turn on `Push Notifications` and `Background Modes`, and enable `Background fetch` and `Remote notifications` under `Background Modes`. - -1. Follow the steps in the "[Upload your APNs certificate](https://firebase.google.com/docs/cloud-messaging/ios/client#upload_your_apns_certificate)" section of the Firebase docs. - -### Dart/Flutter Integration - -From your Dart code, you need to import the plugin and instantiate it: - -```dart -import 'package:firebase_messaging/firebase_messaging.dart'; - -final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); -``` - -Next, you should probably request permissions for receiving Push Notifications. For this, call `_firebaseMessaging.requestNotificationPermissions()`. This will bring up a permissions dialog for the user to confirm on iOS. It's a no-op on Android. Last, but not least, register `onMessage`, `onResume`, and `onLaunch` callbacks via `_firebaseMessaging.configure()` to listen for incoming messages (see table below for more information). - -## Receiving Messages - -Messages are sent to your Flutter app via the `onMessage`, `onLaunch`, and `onResume` callbacks that you configured with the plugin during setup. Here is how different message types are delivered on the supported platforms: - -| | App in Foreground | App in Background | App Terminated | -| --------------------------: | ----------------- | ----------------- | -------------- | -| **Notification on Android** | `onMessage` | Notification is delivered to system tray. When the user clicks on it to open app `onResume` fires if `click_action: FLUTTER_NOTIFICATION_CLICK` is set (see below). | Notification is delivered to system tray. When the user clicks on it to open app `onLaunch` fires if `click_action: FLUTTER_NOTIFICATION_CLICK` is set (see below). | -| **Notification on iOS** | `onMessage` | Notification is delivered to system tray. When the user clicks on it to open app `onResume` fires. | Notification is delivered to system tray. When the user clicks on it to open app `onLaunch` fires. | -| **Data Message on Android** | `onMessage` | `onMessage` while app stays in the background. | *not supported by plugin, message is lost* | -| **Data Message on iOS** | `onMessage` | Message is stored by FCM and delivered to app via `onMessage` when the app is brought back to foreground. | Message is stored by FCM and delivered to app via `onMessage` when the app is brought back to foreground. | - -Additional reading: Firebase's [About FCM Messages](https://firebase.google.com/docs/cloud-messaging/concept-options). - -## Notification messages with additional data -It is possible to include additional data in notification messages by adding them to the `"data"`-field of the message. - -On Android, the message contains an additional field `data` containing the data. On iOS, the data is directly appended to the message and the additional `data`-field is omitted. - -To receive the data on both platforms: - -````dart -Future _handleNotification (Map message, bool dialog) async { - var data = message['data'] ?? message; - String expectedAttribute = data['expectedAttribute']; - /// [...] -} -```` - -## Sending Messages -Refer to the [Firebase documentation](https://firebase.google.com/docs/cloud-messaging/) about FCM for all the details about sending messages to your app. When sending a notification message to an Android device, you need to make sure to set the `click_action` property of the message to `FLUTTER_NOTIFICATION_CLICK`. Otherwise the plugin will be unable to deliver the notification to your app when the users clicks on it in the system tray. - -For testing purposes, the simplest way to send a notification is via the [Firebase Console](https://firebase.google.com/docs/cloud-messaging/send-with-console). Make sure to include `click_action: FLUTTER_NOTIFICATION_CLICK` as a "Custom data" key-value-pair (under "Advanced options") when targeting an Android device. The Firebase Console does not support sending data messages. - -Alternatively, a notification or data message can be sent from a terminal: - -```shell -DATA='{"notification": {"body": "this is a body","title": "this is a title"}, "priority": "high", "data": {"click_action": "FLUTTER_NOTIFICATION_CLICK", "id": "1", "status": "done"}, "to": ""}' -curl https://fcm.googleapis.com/fcm/send -H "Content-Type:application/json" -X POST -d "$DATA" -H "Authorization: key=" -``` - -Remove the `notification` property in `DATA` to send a data message. diff --git a/packages/firebase_messaging/android/android.iml b/packages/firebase_messaging/android/android.iml deleted file mode 100644 index c963ea792e12..000000000000 --- a/packages/firebase_messaging/android/android.iml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_messaging/android/build.gradle b/packages/firebase_messaging/android/build.gradle deleted file mode 100644 index b3099b7d582b..000000000000 --- a/packages/firebase_messaging/android/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -def PLUGIN = "firebase_messaging"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebasemessaging' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-messaging:18.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - implementation 'androidx.annotation:annotation:1.0.0' - implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_messaging/android/firebase_messaging.iml b/packages/firebase_messaging/android/firebase_messaging.iml deleted file mode 100644 index 1a79db0c9754..000000000000 --- a/packages/firebase_messaging/android/firebase_messaging.iml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_messaging/android/gradle.properties b/packages/firebase_messaging/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_messaging/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_messaging/android/settings.gradle b/packages/firebase_messaging/android/settings.gradle deleted file mode 100644 index f82964eb43a1..000000000000 --- a/packages/firebase_messaging/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_messaging' diff --git a/packages/firebase_messaging/android/src/main/AndroidManifest.xml b/packages/firebase_messaging/android/src/main/AndroidManifest.xml deleted file mode 100644 index 34e4e6df5d39..000000000000 --- a/packages/firebase_messaging/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java deleted file mode 100644 index 4ab56e01d299..000000000000 --- a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright 2017 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.firebasemessaging; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Bundle; -import android.util.Log; -import androidx.annotation.NonNull; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApp; -import com.google.firebase.iid.FirebaseInstanceId; -import com.google.firebase.iid.InstanceIdResult; -import com.google.firebase.messaging.FirebaseMessaging; -import com.google.firebase.messaging.RemoteMessage; -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.plugin.common.PluginRegistry.NewIntentListener; -import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -/** FirebaseMessagingPlugin */ -public class FirebaseMessagingPlugin extends BroadcastReceiver - implements MethodCallHandler, NewIntentListener { - private final Registrar registrar; - private final MethodChannel channel; - - private static final String CLICK_ACTION_VALUE = "FLUTTER_NOTIFICATION_CLICK"; - private static final String TAG = "FirebaseMessagingPlugin"; - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_messaging"); - final FirebaseMessagingPlugin plugin = new FirebaseMessagingPlugin(registrar, channel); - registrar.addNewIntentListener(plugin); - channel.setMethodCallHandler(plugin); - } - - private FirebaseMessagingPlugin(Registrar registrar, MethodChannel channel) { - this.registrar = registrar; - this.channel = channel; - FirebaseApp.initializeApp(registrar.context()); - - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(FlutterFirebaseMessagingService.ACTION_TOKEN); - intentFilter.addAction(FlutterFirebaseMessagingService.ACTION_REMOTE_MESSAGE); - LocalBroadcastManager manager = LocalBroadcastManager.getInstance(registrar.context()); - manager.registerReceiver(this, intentFilter); - } - - // BroadcastReceiver implementation. - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - - if (action == null) { - return; - } - - if (action.equals(FlutterFirebaseMessagingService.ACTION_TOKEN)) { - String token = intent.getStringExtra(FlutterFirebaseMessagingService.EXTRA_TOKEN); - channel.invokeMethod("onToken", token); - } else if (action.equals(FlutterFirebaseMessagingService.ACTION_REMOTE_MESSAGE)) { - RemoteMessage message = - intent.getParcelableExtra(FlutterFirebaseMessagingService.EXTRA_REMOTE_MESSAGE); - Map content = parseRemoteMessage(message); - channel.invokeMethod("onMessage", content); - } - } - - @NonNull - private Map parseRemoteMessage(RemoteMessage message) { - Map content = new HashMap<>(); - content.put("data", message.getData()); - - RemoteMessage.Notification notification = message.getNotification(); - - Map notificationMap = new HashMap<>(); - - String title = notification != null ? notification.getTitle() : null; - notificationMap.put("title", title); - - String body = notification != null ? notification.getBody() : null; - notificationMap.put("body", body); - - content.put("notification", notificationMap); - return content; - } - - @Override - public void onMethodCall(final MethodCall call, final Result result) { - if ("configure".equals(call.method)) { - FirebaseInstanceId.getInstance() - .getInstanceId() - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - Log.w(TAG, "getToken, error fetching instanceID: ", task.getException()); - return; - } - channel.invokeMethod("onToken", task.getResult().getToken()); - } - }); - if (registrar.activity() != null) { - sendMessageFromIntent("onLaunch", registrar.activity().getIntent()); - } - result.success(null); - } else if ("subscribeToTopic".equals(call.method)) { - String topic = call.arguments(); - FirebaseMessaging.getInstance() - .subscribeToTopic(topic) - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - Exception e = task.getException(); - Log.w(TAG, "subscribeToTopic error", e); - result.error("subscribeToTopic", e.getMessage(), null); - return; - } - result.success(null); - } - }); - } else if ("unsubscribeFromTopic".equals(call.method)) { - String topic = call.arguments(); - FirebaseMessaging.getInstance() - .unsubscribeFromTopic(topic) - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - Exception e = task.getException(); - Log.w(TAG, "unsubscribeFromTopic error", e); - result.error("unsubscribeFromTopic", e.getMessage(), null); - return; - } - result.success(null); - } - }); - } else if ("getToken".equals(call.method)) { - FirebaseInstanceId.getInstance() - .getInstanceId() - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - Log.w(TAG, "getToken, error fetching instanceID: ", task.getException()); - result.success(null); - return; - } - - result.success(task.getResult().getToken()); - } - }); - } else if ("deleteInstanceID".equals(call.method)) { - new Thread( - new Runnable() { - @Override - public void run() { - try { - FirebaseInstanceId.getInstance().deleteInstanceId(); - if (registrar.activity() != null) { - registrar - .activity() - .runOnUiThread( - new Runnable() { - @Override - public void run() { - result.success(true); - } - }); - } - } catch (IOException ex) { - Log.e(TAG, "deleteInstanceID, error:", ex); - if (registrar.activity() != null) { - registrar - .activity() - .runOnUiThread( - new Runnable() { - @Override - public void run() { - result.success(false); - } - }); - } - } - } - }) - .start(); - } else if ("autoInitEnabled".equals(call.method)) { - result.success(FirebaseMessaging.getInstance().isAutoInitEnabled()); - } else if ("setAutoInitEnabled".equals(call.method)) { - Boolean isEnabled = (Boolean) call.arguments(); - FirebaseMessaging.getInstance().setAutoInitEnabled(isEnabled); - result.success(null); - } else { - result.notImplemented(); - } - } - - @Override - public boolean onNewIntent(Intent intent) { - boolean res = sendMessageFromIntent("onResume", intent); - if (res && registrar.activity() != null) { - registrar.activity().setIntent(intent); - } - return res; - } - - /** @return true if intent contained a message to send. */ - private boolean sendMessageFromIntent(String method, Intent intent) { - if (CLICK_ACTION_VALUE.equals(intent.getAction()) - || CLICK_ACTION_VALUE.equals(intent.getStringExtra("click_action"))) { - Map message = new HashMap<>(); - Bundle extras = intent.getExtras(); - - if (extras == null) { - return false; - } - - Map notificationMap = new HashMap<>(); - Map dataMap = new HashMap<>(); - - for (String key : extras.keySet()) { - Object extra = extras.get(key); - if (extra != null) { - dataMap.put(key, extra); - } - } - - message.put("notification", notificationMap); - message.put("data", dataMap); - - channel.invokeMethod(method, message); - return true; - } - return false; - } -} diff --git a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index c7b14c89738a..000000000000 --- a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemessaging; - -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; - -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_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseMessagingService.java b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseMessagingService.java deleted file mode 100644 index 345c0161e192..000000000000 --- a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseMessagingService.java +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 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.firebasemessaging; - -import android.content.Intent; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import com.google.firebase.messaging.FirebaseMessagingService; -import com.google.firebase.messaging.RemoteMessage; - -public class FlutterFirebaseMessagingService extends FirebaseMessagingService { - - public static final String ACTION_REMOTE_MESSAGE = - "io.flutter.plugins.firebasemessaging.NOTIFICATION"; - public static final String EXTRA_REMOTE_MESSAGE = "notification"; - - public static final String ACTION_TOKEN = "io.flutter.plugins.firebasemessaging.TOKEN"; - public static final String EXTRA_TOKEN = "token"; - - /** - * Called when message is received. - * - * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. - */ - @Override - public void onMessageReceived(RemoteMessage remoteMessage) { - Intent intent = new Intent(ACTION_REMOTE_MESSAGE); - intent.putExtra(EXTRA_REMOTE_MESSAGE, remoteMessage); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } - - /** - * Called when a new token for the default Firebase project is generated. - * - * @param token The token used for sending messages to this application instance. This token is - * the same as the one retrieved by getInstanceId(). - */ - @Override - public void onNewToken(String token) { - Intent intent = new Intent(ACTION_TOKEN); - intent.putExtra(EXTRA_TOKEN, token); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } -} diff --git a/packages/firebase_messaging/android/user-agent.gradle b/packages/firebase_messaging/android/user-agent.gradle deleted file mode 100644 index 73830fa09152..000000000000 --- a/packages/firebase_messaging/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-fcm" -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_messaging/example/README.md b/packages/firebase_messaging/example/README.md deleted file mode 100644 index 4845e56be4ae..000000000000 --- a/packages/firebase_messaging/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_messaging_example - -Demonstrates how to use the firebase_messaging plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_messaging/example/android.iml b/packages/firebase_messaging/example/android.iml deleted file mode 100644 index 462b903e05b6..000000000000 --- a/packages/firebase_messaging/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_messaging/example/android/app/build.gradle b/packages/firebase_messaging/example/android/app/build.gradle deleted file mode 100644 index 6946c388d840..000000000000 --- a/packages/firebase_messaging/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId 'io.flutter.plugins.firebasemessagingexample' - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_messaging/example/android/app/google-services.json b/packages/firebase_messaging/example/android/app/google-services.json deleted file mode 100644 index 625037ce8a98..000000000000 --- a/packages/firebase_messaging/example/android/app/google-services.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "project_info": { - "project_number": "3401408244", - "firebase_url": "https://test-project-cloud-messaging.firebaseio.com", - "project_id": "test-project-cloud-messaging", - "storage_bucket": "test-project-cloud-messaging.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:3401408244:android:5920de3503a2d18c", - "android_client_info": { - "package_name": "com.google.firebase.quickstart.fcm" - } - }, - "oauth_client": [ - { - "client_id": "3401408244-s01tdnd5guf3vrrn4n780j22sm20gob8.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.google.firebase.quickstart.fcm", - "certificate_hash": "a647cb35cdac21e3a26f2b5697c5b789cde3b5a0" - } - }, - { - "client_id": "3401408244-m5m1eph6d37rrp71hj33hcttffmmeat0.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBMV3_n5xWH-rzyxsUWbvPPo7-_ZgESSOo" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "3401408244-kpa4vjuab7s8gjut5gjdf3hku8gbdp1c.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebase-messaging" - } - }, - { - "client_id": "3401408244-m5m1eph6d37rrp71hj33hcttffmmeat0.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:3401408244:android:fc026014a0a3ac30", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasemessagingexample" - } - }, - "oauth_client": [ - { - "client_id": "3401408244-m5m1eph6d37rrp71hj33hcttffmmeat0.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBMV3_n5xWH-rzyxsUWbvPPo7-_ZgESSOo" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} diff --git a/packages/firebase_messaging/example/android/app/gradle.properties b/packages/firebase_messaging/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_messaging/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_messaging/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_messaging/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_messaging/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_messaging/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_messaging/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index adaa7b419adb..000000000000 --- a/packages/firebase_messaging/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/.gitignore b/packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/.gitignore deleted file mode 100644 index 9eb4563d2ae1..000000000000 --- a/packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/.gitignore +++ /dev/null @@ -1 +0,0 @@ -GeneratedPluginRegistrant.java diff --git a/packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/firebasemessagingexample/MainActivity.java b/packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/firebasemessagingexample/MainActivity.java deleted file mode 100644 index dd2923cc9598..000000000000 --- a/packages/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/firebasemessagingexample/MainActivity.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2017 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.firebasemessagingexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_messaging/example/android/build.gradle b/packages/firebase_messaging/example/android/build.gradle deleted file mode 100644 index 359119307d55..000000000000 --- a/packages/firebase_messaging/example/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_messaging/example/android/gradle.properties b/packages/firebase_messaging/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_messaging/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_messaging/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_messaging/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/firebase_messaging/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_messaging/example/android/settings.gradle b/packages/firebase_messaging/example/android/settings.gradle deleted file mode 100644 index 115da6cb4f4d..000000000000 --- a/packages/firebase_messaging/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_messaging/example/example.iml b/packages/firebase_messaging/example/example.iml deleted file mode 100644 index bbf850c6236c..000000000000 --- a/packages/firebase_messaging/example/example.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_messaging/example/firebase_messaging_example.iml b/packages/firebase_messaging/example/firebase_messaging_example.iml deleted file mode 100644 index 9d5dae19540c..000000000000 --- a/packages/firebase_messaging/example/firebase_messaging_example.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_messaging/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_messaging/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6c2de8086bcd..000000000000 --- a/packages/firebase_messaging/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_messaging/example/ios/Flutter/Debug.xcconfig b/packages/firebase_messaging/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index 9803018ca79d..000000000000 --- a/packages/firebase_messaging/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/packages/firebase_messaging/example/ios/Flutter/Release.xcconfig b/packages/firebase_messaging/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index a4a8c604e13d..000000000000 --- a/packages/firebase_messaging/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/packages/firebase_messaging/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_messaging/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 18d6d1e4402a..000000000000 --- a/packages/firebase_messaging/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,500 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 2EF3EFF8E25860E112E91756 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 799CAB03D87EEEE1FF65E7BE /* libPods-Runner.a */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C5A74FB1EAA74D700FE37CF /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5C5A74FA1EAA74D700FE37CF /* GoogleService-Info.plist */; }; - 5C8223C01EC265DD00E12B15 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C8223BF1EC265DD00E12B15 /* GeneratedPluginRegistrant.m */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5C5A74FA1EAA74D700FE37CF /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 5C8223BE1EC265DD00E12B15 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C8223BF1EC265DD00E12B15 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 5CDE2B941EA81E0D006C00D0 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - 799CAB03D87EEEE1FF65E7BE /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 2EF3EFF8E25860E112E91756 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C8223BE1EC265DD00E12B15 /* GeneratedPluginRegistrant.h */, - 5C8223BF1EC265DD00E12B15 /* GeneratedPluginRegistrant.m */, - 5CDE2B941EA81E0D006C00D0 /* Runner.entitlements */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 5C5A74FA1EAA74D700FE37CF /* GoogleService-Info.plist */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 799CAB03D87EEEE1FF65E7BE /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */, - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */, - 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - SystemCapabilities = { - com.apple.Push = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 = ( - 5C5A74FB1EAA74D700FE37CF /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; - }; - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../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"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C8223C01EC265DD00E12B15 /* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = "io.flutter.plugins.firebase-messaging"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = "io.flutter.plugins.firebase-messaging"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_messaging/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_messaging/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_messaging/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1c9580788197..000000000000 --- a/packages/firebase_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_messaging/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_messaging/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_messaging/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_messaging/example/ios/Runner/.gitignore b/packages/firebase_messaging/example/ios/Runner/.gitignore deleted file mode 100644 index 0cab08d0bdd7..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m diff --git a/packages/firebase_messaging/example/ios/Runner/AppDelegate.h b/packages/firebase_messaging/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e990f2e..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_messaging/example/ios/Runner/AppDelegate.m b/packages/firebase_messaging/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c88eb60..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 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. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d22f10b2ab63..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_messaging/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_messaging/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_messaging/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_messaging/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index aae17f35f51a..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 3401408244-kpa4vjuab7s8gjut5gjdf3hku8gbdp1c.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.3401408244-kpa4vjuab7s8gjut5gjdf3hku8gbdp1c - API_KEY - AIzaSyCwJxWJTafbmE8PNdWEbU5Ciw5z1R5Fl3k - GCM_SENDER_ID - 3401408244 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebase-messaging - PROJECT_ID - test-project-cloud-messaging - STORAGE_BUCKET - test-project-cloud-messaging.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:3401408244:ios:d297dea19b53a7da - DATABASE_URL - https://test-project-cloud-messaging.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_messaging/example/ios/Runner/Info.plist b/packages/firebase_messaging/example/ios/Runner/Info.plist deleted file mode 100644 index ededae49efe7..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - Firebase Cloud Messaging Example - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_messaging_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_messaging/example/ios/Runner/Runner.entitlements b/packages/firebase_messaging/example/ios/Runner/Runner.entitlements deleted file mode 100644 index 903def2af530..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - aps-environment - development - - diff --git a/packages/firebase_messaging/example/ios/Runner/main.m b/packages/firebase_messaging/example/ios/Runner/main.m deleted file mode 100644 index bec320c0bee0..000000000000 --- a/packages/firebase_messaging/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/firebase_messaging/example/lib/main.dart b/packages/firebase_messaging/example/lib/main.dart deleted file mode 100644 index 685a3f86f2fa..000000000000 --- a/packages/firebase_messaging/example/lib/main.dart +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/material.dart'; - -final Map _items = {}; -Item _itemForMessage(Map message) { - final dynamic data = message['data'] ?? message; - final String itemId = data['id']; - final Item item = _items.putIfAbsent(itemId, () => Item(itemId: itemId)) - ..status = data['status']; - return item; -} - -class Item { - Item({this.itemId}); - final String itemId; - - StreamController _controller = StreamController.broadcast(); - Stream get onChanged => _controller.stream; - - String _status; - String get status => _status; - set status(String value) { - _status = value; - _controller.add(this); - } - - static final Map> routes = >{}; - Route get route { - final String routeName = '/detail/$itemId'; - return routes.putIfAbsent( - routeName, - () => MaterialPageRoute( - settings: RouteSettings(name: routeName), - builder: (BuildContext context) => DetailPage(itemId), - ), - ); - } -} - -class DetailPage extends StatefulWidget { - DetailPage(this.itemId); - final String itemId; - @override - _DetailPageState createState() => _DetailPageState(); -} - -class _DetailPageState extends State { - Item _item; - StreamSubscription _subscription; - - @override - void initState() { - super.initState(); - _item = _items[widget.itemId]; - _subscription = _item.onChanged.listen((Item item) { - if (!mounted) { - _subscription.cancel(); - } else { - setState(() { - _item = item; - }); - } - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text("Item ${_item.itemId}"), - ), - body: Material( - child: Center(child: Text("Item status: ${_item.status}")), - ), - ); - } -} - -class PushMessagingExample extends StatefulWidget { - @override - _PushMessagingExampleState createState() => _PushMessagingExampleState(); -} - -class _PushMessagingExampleState extends State { - String _homeScreenText = "Waiting for token..."; - bool _topicButtonsDisabled = false; - - final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); - final TextEditingController _topicController = - TextEditingController(text: 'topic'); - - Widget _buildDialog(BuildContext context, Item item) { - return AlertDialog( - content: Text("Item ${item.itemId} has been updated"), - actions: [ - FlatButton( - child: const Text('CLOSE'), - onPressed: () { - Navigator.pop(context, false); - }, - ), - FlatButton( - child: const Text('SHOW'), - onPressed: () { - Navigator.pop(context, true); - }, - ), - ], - ); - } - - void _showItemDialog(Map message) { - showDialog( - context: context, - builder: (_) => _buildDialog(context, _itemForMessage(message)), - ).then((bool shouldNavigate) { - if (shouldNavigate == true) { - _navigateToItemDetail(message); - } - }); - } - - void _navigateToItemDetail(Map message) { - final Item item = _itemForMessage(message); - // Clear away dialogs - Navigator.popUntil(context, (Route route) => route is PageRoute); - if (!item.route.isCurrent) { - Navigator.push(context, item.route); - } - } - - @override - void initState() { - super.initState(); - _firebaseMessaging.configure( - onMessage: (Map message) async { - print("onMessage: $message"); - _showItemDialog(message); - }, - onLaunch: (Map message) async { - print("onLaunch: $message"); - _navigateToItemDetail(message); - }, - onResume: (Map message) async { - print("onResume: $message"); - _navigateToItemDetail(message); - }, - ); - _firebaseMessaging.requestNotificationPermissions( - const IosNotificationSettings(sound: true, badge: true, alert: true)); - _firebaseMessaging.onIosSettingsRegistered - .listen((IosNotificationSettings settings) { - print("Settings registered: $settings"); - }); - _firebaseMessaging.getToken().then((String token) { - assert(token != null); - setState(() { - _homeScreenText = "Push Messaging token: $token"; - }); - print(_homeScreenText); - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Push Messaging Demo'), - ), - // For testing -- simulate a message being received - floatingActionButton: FloatingActionButton( - onPressed: () => _showItemDialog({ - "data": { - "id": "2", - "status": "out of stock", - }, - }), - tooltip: 'Simulate Message', - child: const Icon(Icons.message), - ), - body: Material( - child: Column( - children: [ - Center( - child: Text(_homeScreenText), - ), - Row(children: [ - Expanded( - child: TextField( - controller: _topicController, - onChanged: (String v) { - setState(() { - _topicButtonsDisabled = v.isEmpty; - }); - }), - ), - FlatButton( - child: const Text("subscribe"), - onPressed: _topicButtonsDisabled - ? null - : () { - _firebaseMessaging - .subscribeToTopic(_topicController.text); - _clearTopicText(); - }, - ), - FlatButton( - child: const Text("unsubscribe"), - onPressed: _topicButtonsDisabled - ? null - : () { - _firebaseMessaging - .unsubscribeFromTopic(_topicController.text); - _clearTopicText(); - }, - ), - ]) - ], - ), - )); - } - - void _clearTopicText() { - setState(() { - _topicController.text = ""; - _topicButtonsDisabled = true; - }); - } -} - -void main() { - runApp( - MaterialApp( - home: PushMessagingExample(), - ), - ); -} diff --git a/packages/firebase_messaging/example/pubspec.yaml b/packages/firebase_messaging/example/pubspec.yaml deleted file mode 100644 index f5b1516d82d6..000000000000 --- a/packages/firebase_messaging/example/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: firebase_messaging_example -description: Demonstrates how to use the firebase_messaging plugin. - -dependencies: - firebase_analytics: any - flutter: - sdk: flutter - firebase_messaging: - path: ../ - firebase_core: ^0.4.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - -flutter: - uses-material-design: true diff --git a/packages/firebase_messaging/example/test_driver/firebase_messaging.dart b/packages/firebase_messaging/example/test_driver/firebase_messaging.dart deleted file mode 100644 index 7ba46b79e733..000000000000 --- a/packages/firebase_messaging/example/test_driver/firebase_messaging.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'dart:async'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$FirebaseMessaging', () { - final FirebaseMessaging firebaseMessaging = FirebaseMessaging(); - - test('autoInitEnabled', () async { - await firebaseMessaging.setAutoInitEnabled(false); - expect(await firebaseMessaging.autoInitEnabled(), false); - await firebaseMessaging.setAutoInitEnabled(true); - expect(await firebaseMessaging.autoInitEnabled(), true); - }); - - // TODO(jackson): token retrieval isn't working on test devices yet - test('subscribeToTopic', () async { - await firebaseMessaging.subscribeToTopic('foo'); - }, skip: true); - - // TODO(jackson): token retrieval isn't working on test devices yet - test('unsubscribeFromTopic', () async { - await firebaseMessaging.unsubscribeFromTopic('foo'); - }, skip: true); - - test('deleteInstanceID', () async { - final bool result = await firebaseMessaging.deleteInstanceID(); - expect(result, isTrue); - }); - }); -} diff --git a/packages/firebase_messaging/example/test_driver/firebase_messaging_test.dart b/packages/firebase_messaging/example/test_driver/firebase_messaging_test.dart deleted file mode 100644 index 38fe6c447e05..000000000000 --- a/packages/firebase_messaging/example/test_driver/firebase_messaging_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_messaging/ios/Assets/.gitkeep b/packages/firebase_messaging/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.h b/packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.h deleted file mode 100644 index 492be15a4ea6..000000000000 --- a/packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 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 - -@interface FLTFirebaseMessagingPlugin : NSObject -@end diff --git a/packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.m b/packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.m deleted file mode 100644 index 225b86f99599..000000000000 --- a/packages/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.m +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2017 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 "FirebaseMessagingPlugin.h" -#import "UserAgent.h" - -#import "Firebase/Firebase.h" - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -@interface FLTFirebaseMessagingPlugin () -@end -#endif - -static FlutterError *getFlutterError(NSError *error) { - if (error == nil) return nil; - return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %ld", error.code] - message:error.domain - details:error.localizedDescription]; -} - -@implementation FLTFirebaseMessagingPlugin { - FlutterMethodChannel *_channel; - NSDictionary *_launchNotification; - BOOL _resumingFromBackground; -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_messaging" - binaryMessenger:[registrar messenger]]; - FLTFirebaseMessagingPlugin *instance = - [[FLTFirebaseMessagingPlugin alloc] initWithChannel:channel]; - [registrar addApplicationDelegate:instance]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)initWithChannel:(FlutterMethodChannel *)channel { - self = [super init]; - - if (self) { - _channel = channel; - _resumingFromBackground = NO; - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - [FIRMessaging messaging].delegate = self; - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *method = call.method; - if ([@"requestNotificationPermissions" isEqualToString:method]) { - UIUserNotificationType notificationTypes = 0; - NSDictionary *arguments = call.arguments; - if ([arguments[@"sound"] boolValue]) { - notificationTypes |= UIUserNotificationTypeSound; - } - if ([arguments[@"alert"] boolValue]) { - notificationTypes |= UIUserNotificationTypeAlert; - } - if ([arguments[@"badge"] boolValue]) { - notificationTypes |= UIUserNotificationTypeBadge; - } - UIUserNotificationSettings *settings = - [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil]; - [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; - - result(nil); - } else if ([@"configure" isEqualToString:method]) { - [FIRMessaging messaging].shouldEstablishDirectChannel = true; - [[UIApplication sharedApplication] registerForRemoteNotifications]; - if (_launchNotification != nil) { - [_channel invokeMethod:@"onLaunch" arguments:_launchNotification]; - } - result(nil); - } else if ([@"subscribeToTopic" isEqualToString:method]) { - NSString *topic = call.arguments; - [[FIRMessaging messaging] subscribeToTopic:topic - completion:^(NSError *error) { - result(getFlutterError(error)); - }]; - } else if ([@"unsubscribeFromTopic" isEqualToString:method]) { - NSString *topic = call.arguments; - [[FIRMessaging messaging] unsubscribeFromTopic:topic - completion:^(NSError *error) { - result(getFlutterError(error)); - }]; - } else if ([@"getToken" isEqualToString:method]) { - [[FIRInstanceID instanceID] - instanceIDWithHandler:^(FIRInstanceIDResult *_Nullable instanceIDResult, - NSError *_Nullable error) { - if (error != nil) { - NSLog(@"getToken, error fetching instanceID: %@", error); - result(nil); - } else { - result(instanceIDResult.token); - } - }]; - } else if ([@"deleteInstanceID" isEqualToString:method]) { - [[FIRInstanceID instanceID] deleteIDWithHandler:^void(NSError *_Nullable error) { - if (error.code != 0) { - NSLog(@"deleteInstanceID, error: %@", error); - result([NSNumber numberWithBool:NO]); - } else { - [[UIApplication sharedApplication] unregisterForRemoteNotifications]; - result([NSNumber numberWithBool:YES]); - } - }]; - } else if ([@"autoInitEnabled" isEqualToString:method]) { - BOOL value = [[FIRMessaging messaging] isAutoInitEnabled]; - result([NSNumber numberWithBool:value]); - } else if ([@"setAutoInitEnabled" isEqualToString:method]) { - NSNumber *value = call.arguments; - [FIRMessaging messaging].autoInitEnabled = value.boolValue; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -// Receive data message on iOS 10 devices while app is in the foreground. -- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage { - [self didReceiveRemoteNotification:remoteMessage.appData]; -} -#endif - -- (void)didReceiveRemoteNotification:(NSDictionary *)userInfo { - if (_resumingFromBackground) { - [_channel invokeMethod:@"onResume" arguments:userInfo]; - } else { - [_channel invokeMethod:@"onMessage" arguments:userInfo]; - } -} - -#pragma mark - AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - if (launchOptions != nil) { - _launchNotification = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; - } - return YES; -} - -- (void)applicationDidEnterBackground:(UIApplication *)application { - _resumingFromBackground = YES; -} - -- (void)applicationDidBecomeActive:(UIApplication *)application { - _resumingFromBackground = NO; - // Clears push notifications from the notification center, with the - // side effect of resetting the badge count. We need to clear notifications - // because otherwise the user could tap notifications in the notification - // center while the app is in the foreground, and we wouldn't be able to - // distinguish that case from the case where a message came in and the - // user dismissed the notification center without tapping anything. - // TODO(goderbauer): Revisit this behavior once we provide an API for managing - // the badge number, or if we add support for running Dart in the background. - // Setting badgeNumber to 0 is a no-op (= notifications will not be cleared) - // if it is already 0, - // therefore the next line is setting it to 1 first before clearing it again - // to remove all - // notifications. - application.applicationIconBadgeNumber = 1; - application.applicationIconBadgeNumber = 0; -} - -- (bool)application:(UIApplication *)application - didReceiveRemoteNotification:(NSDictionary *)userInfo - fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { - [self didReceiveRemoteNotification:userInfo]; - completionHandler(UIBackgroundFetchResultNoData); - return YES; -} - -- (void)application:(UIApplication *)application - didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { -#ifdef DEBUG - [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeSandbox]; -#else - [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeProd]; -#endif - - [_channel invokeMethod:@"onToken" arguments:[FIRMessaging messaging].FCMToken]; -} - -- (void)application:(UIApplication *)application - didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { - NSDictionary *settingsDictionary = @{ - @"sound" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeSound], - @"badge" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeBadge], - @"alert" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeAlert], - }; - [_channel invokeMethod:@"onIosSettingsRegistered" arguments:settingsDictionary]; -} - -- (void)messaging:(nonnull FIRMessaging *)messaging - didReceiveRegistrationToken:(nonnull NSString *)fcmToken { - [_channel invokeMethod:@"onToken" arguments:fcmToken]; -} - -- (void)messaging:(FIRMessaging *)messaging - didReceiveMessage:(FIRMessagingRemoteMessage *)remoteMessage { - [_channel invokeMethod:@"onMessage" arguments:remoteMessage.appData]; -} - -@end diff --git a/packages/firebase_messaging/ios/firebase_messaging.podspec b/packages/firebase_messaging/ios/firebase_messaging.podspec deleted file mode 100644 index 540efc00a189..000000000000 --- a/packages/firebase_messaging/ios/firebase_messaging.podspec +++ /dev/null @@ -1,33 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_messaging' - s.version = '0.0.1' - s.summary = 'Firebase Cloud Messaging plugin for Flutter.' - s.description = <<-DESC -Firebase Cloud Messaging plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_messaging' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/Messaging' - s.static_framework = true - s.ios.deployment_target = '8.0' - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-fcm\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_messaging/lib/firebase_messaging.dart b/packages/firebase_messaging/lib/firebase_messaging.dart deleted file mode 100644 index f40420c6dbe5..000000000000 --- a/packages/firebase_messaging/lib/firebase_messaging.dart +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2017 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:flutter/services.dart'; -import 'package:meta/meta.dart'; -import 'package:platform/platform.dart'; - -typedef Future MessageHandler(Map message); - -/// Implementation of the Firebase Cloud Messaging API for Flutter. -/// -/// Your app should call [requestNotificationPermissions] first and then -/// register handlers for incoming messages with [configure]. -class FirebaseMessaging { - factory FirebaseMessaging() => _instance; - - @visibleForTesting - FirebaseMessaging.private(MethodChannel channel, Platform platform) - : _channel = channel, - _platform = platform; - - static final FirebaseMessaging _instance = FirebaseMessaging.private( - const MethodChannel('plugins.flutter.io/firebase_messaging'), - const LocalPlatform()); - - final MethodChannel _channel; - final Platform _platform; - - MessageHandler _onMessage; - MessageHandler _onLaunch; - MessageHandler _onResume; - - /// On iOS, prompts the user for notification permissions the first time - /// it is called. - /// - /// Does nothing on Android. - void requestNotificationPermissions( - [IosNotificationSettings iosSettings = const IosNotificationSettings()]) { - if (!_platform.isIOS) { - return; - } - _channel.invokeMethod( - 'requestNotificationPermissions', iosSettings.toMap()); - } - - final StreamController _iosSettingsStreamController = - StreamController.broadcast(); - - /// Stream that fires when the user changes their notification settings. - /// - /// Only fires on iOS. - Stream get onIosSettingsRegistered { - return _iosSettingsStreamController.stream; - } - - /// Sets up [MessageHandler] for incoming messages. - void configure({ - MessageHandler onMessage, - MessageHandler onLaunch, - MessageHandler onResume, - }) { - _onMessage = onMessage; - _onLaunch = onLaunch; - _onResume = onResume; - _channel.setMethodCallHandler(_handleMethod); - _channel.invokeMethod('configure'); - } - - final StreamController _tokenStreamController = - StreamController.broadcast(); - - /// Fires when a new FCM token is generated. - Stream get onTokenRefresh { - return _tokenStreamController.stream; - } - - /// Returns the FCM token. - Future getToken() async { - return await _channel.invokeMethod('getToken'); - } - - /// Subscribe to topic in background. - /// - /// [topic] must match the following regular expression: - /// "[a-zA-Z0-9-_.~%]{1,900}". - Future subscribeToTopic(String topic) { - return _channel.invokeMethod('subscribeToTopic', topic); - } - - /// Unsubscribe from topic in background. - Future unsubscribeFromTopic(String topic) { - return _channel.invokeMethod('unsubscribeFromTopic', topic); - } - - /// Resets Instance ID and revokes all tokens. In iOS, it also unregisters from remote notifications. - /// - /// A new Instance ID is generated asynchronously if Firebase Cloud Messaging auto-init is enabled. - /// - /// returns true if the operations executed successfully and false if an error ocurred - Future deleteInstanceID() async { - return await _channel.invokeMethod('deleteInstanceID'); - } - - /// Determine whether FCM auto-initialization is enabled or disabled. - Future autoInitEnabled() async { - return await _channel.invokeMethod('autoInitEnabled'); - } - - /// Enable or disable auto-initialization of Firebase Cloud Messaging. - Future setAutoInitEnabled(bool enabled) async { - await _channel.invokeMethod('setAutoInitEnabled', enabled); - } - - Future _handleMethod(MethodCall call) async { - switch (call.method) { - case "onToken": - final String token = call.arguments; - _tokenStreamController.add(token); - return null; - case "onIosSettingsRegistered": - _iosSettingsStreamController.add(IosNotificationSettings._fromMap( - call.arguments.cast())); - return null; - case "onMessage": - return _onMessage(call.arguments.cast()); - case "onLaunch": - return _onLaunch(call.arguments.cast()); - case "onResume": - return _onResume(call.arguments.cast()); - default: - throw UnsupportedError("Unrecognized JSON message"); - } - } -} - -class IosNotificationSettings { - const IosNotificationSettings({ - this.sound = true, - this.alert = true, - this.badge = true, - }); - - IosNotificationSettings._fromMap(Map settings) - : sound = settings['sound'], - alert = settings['alert'], - badge = settings['badge']; - - final bool sound; - final bool alert; - final bool badge; - - @visibleForTesting - Map toMap() { - return {'sound': sound, 'alert': alert, 'badge': badge}; - } - - @override - String toString() => 'PushNotificationSettings ${toMap()}'; -} diff --git a/packages/firebase_messaging/pubspec.yaml b/packages/firebase_messaging/pubspec.yaml deleted file mode 100644 index cdfa9b11d659..000000000000 --- a/packages/firebase_messaging/pubspec.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: firebase_messaging -description: Flutter plugin for Firebase Cloud Messaging, a cross-platform - messaging solution that lets you reliably deliver messages on Android and iOS. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_messaging -version: 5.1.3 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebasemessaging - iosPrefix: FLT - pluginClass: FirebaseMessagingPlugin - -dependencies: - meta: ^1.0.4 - platform: ^2.0.0 - flutter: - sdk: flutter - -dev_dependencies: - test: ^1.3.0 - mockito: ^3.0.0 - flutter_test: - sdk: flutter - firebase_core: ^0.4.0 - flutter_driver: - sdk: flutter - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_messaging/test/firebase_messaging_test.dart b/packages/firebase_messaging/test/firebase_messaging_test.dart deleted file mode 100644 index a4e6d7c04756..000000000000 --- a/packages/firebase_messaging/test/firebase_messaging_test.dart +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2017 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:flutter/services.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:mockito/mockito.dart'; -import 'package:platform/platform.dart'; -import 'package:test/test.dart'; - -void main() { - MockMethodChannel mockChannel; - FirebaseMessaging firebaseMessaging; - - setUp(() { - mockChannel = MockMethodChannel(); - firebaseMessaging = FirebaseMessaging.private( - mockChannel, FakePlatform(operatingSystem: 'ios')); - }); - - test('requestNotificationPermissions on ios with default permissions', () { - firebaseMessaging.requestNotificationPermissions(); - verify(mockChannel.invokeMethod('requestNotificationPermissions', - {'sound': true, 'badge': true, 'alert': true})); - }); - - test('requestNotificationPermissions on ios with custom permissions', () { - firebaseMessaging.requestNotificationPermissions( - const IosNotificationSettings(sound: false)); - verify(mockChannel.invokeMethod('requestNotificationPermissions', - {'sound': false, 'badge': true, 'alert': true})); - }); - - test('requestNotificationPermissions on android', () { - firebaseMessaging = FirebaseMessaging.private( - mockChannel, FakePlatform(operatingSystem: 'android')); - - firebaseMessaging.requestNotificationPermissions(); - verifyZeroInteractions(mockChannel); - }); - - test('requestNotificationPermissions on android', () { - firebaseMessaging = FirebaseMessaging.private( - mockChannel, FakePlatform(operatingSystem: 'android')); - - firebaseMessaging.requestNotificationPermissions(); - verifyZeroInteractions(mockChannel); - }); - - test('configure', () { - firebaseMessaging.configure(); - verify(mockChannel.setMethodCallHandler(any)); - verify(mockChannel.invokeMethod('configure')); - }); - - test('incoming token', () async { - firebaseMessaging.configure(); - final dynamic handler = - verify(mockChannel.setMethodCallHandler(captureAny)).captured.single; - final String token1 = 'I am a super secret token'; - final String token2 = 'I am the new token in town'; - Future tokenFromStream = firebaseMessaging.onTokenRefresh.first; - await handler(MethodCall('onToken', token1)); - - expect(await tokenFromStream, token1); - - tokenFromStream = firebaseMessaging.onTokenRefresh.first; - await handler(MethodCall('onToken', token2)); - - expect(await tokenFromStream, token2); - }); - - test('incoming iOS settings', () async { - firebaseMessaging.configure(); - final dynamic handler = - verify(mockChannel.setMethodCallHandler(captureAny)).captured.single; - IosNotificationSettings iosSettings = const IosNotificationSettings(); - - Future iosSettingsFromStream = - firebaseMessaging.onIosSettingsRegistered.first; - await handler(MethodCall('onIosSettingsRegistered', iosSettings.toMap())); - expect((await iosSettingsFromStream).toMap(), iosSettings.toMap()); - - iosSettings = const IosNotificationSettings(sound: false); - iosSettingsFromStream = firebaseMessaging.onIosSettingsRegistered.first; - await handler(MethodCall('onIosSettingsRegistered', iosSettings.toMap())); - expect((await iosSettingsFromStream).toMap(), iosSettings.toMap()); - }); - - test('incoming messages', () async { - final Completer onMessage = Completer(); - final Completer onLaunch = Completer(); - final Completer onResume = Completer(); - - firebaseMessaging.configure(onMessage: (dynamic m) async { - onMessage.complete(m); - }, onLaunch: (dynamic m) async { - onLaunch.complete(m); - }, onResume: (dynamic m) async { - onResume.complete(m); - }); - final dynamic handler = - verify(mockChannel.setMethodCallHandler(captureAny)).captured.single; - - final Map onMessageMessage = {}; - final Map onLaunchMessage = {}; - final Map onResumeMessage = {}; - - await handler(MethodCall('onMessage', onMessageMessage)); - expect(await onMessage.future, onMessageMessage); - expect(onLaunch.isCompleted, isFalse); - expect(onResume.isCompleted, isFalse); - - await handler(MethodCall('onLaunch', onLaunchMessage)); - expect(await onLaunch.future, onLaunchMessage); - expect(onResume.isCompleted, isFalse); - - await handler(MethodCall('onResume', onResumeMessage)); - expect(await onResume.future, onResumeMessage); - }); - - const String myTopic = 'Flutter'; - - test('subscribe to topic', () async { - await firebaseMessaging.subscribeToTopic(myTopic); - verify(mockChannel.invokeMethod('subscribeToTopic', myTopic)); - }); - - test('unsubscribe from topic', () async { - await firebaseMessaging.unsubscribeFromTopic(myTopic); - verify(mockChannel.invokeMethod('unsubscribeFromTopic', myTopic)); - }); - - test('getToken', () { - firebaseMessaging.getToken(); - verify(mockChannel.invokeMethod('getToken')); - }); - - test('deleteInstanceID', () { - firebaseMessaging.deleteInstanceID(); - verify(mockChannel.invokeMethod('deleteInstanceID')); - }); - - test('autoInitEnabled', () { - firebaseMessaging.autoInitEnabled(); - verify(mockChannel.invokeMethod('autoInitEnabled')); - }); - - test('setAutoInitEnabled', () { - // assert that we havent called the method yet - verifyNever(firebaseMessaging.setAutoInitEnabled(true)); - - firebaseMessaging.setAutoInitEnabled(true); - - verify(mockChannel.invokeMethod('setAutoInitEnabled', true)); - - // assert that enabled = false was not yet called - verifyNever(firebaseMessaging.setAutoInitEnabled(false)); - - firebaseMessaging.setAutoInitEnabled(false); - - verify(mockChannel.invokeMethod('setAutoInitEnabled', false)); - }); -} - -class MockMethodChannel extends Mock implements MethodChannel {} diff --git a/packages/firebase_ml_vision/.gitignore b/packages/firebase_ml_vision/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_ml_vision/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_ml_vision/CHANGELOG.md b/packages/firebase_ml_vision/CHANGELOG.md deleted file mode 100644 index b2fe1d37d699..000000000000 --- a/packages/firebase_ml_vision/CHANGELOG.md +++ /dev/null @@ -1,163 +0,0 @@ -## 0.9.2 - -* Add detection of `FaceContour`s when using the `FaceDetector`. See `README.md` for more information. - -## 0.9.1+1 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.9.1 - -* Add support for cloud text recognizer. - -## 0.9.0+3 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.9.0+2 - -* Fix bug causing memory leak with iOS images. - -## 0.9.0+1 - -* Update example app Podfile to match latest Flutter template and support new Xcode build system. - -## 0.9.0 - -* **Breaking Change** Add capability to release resources held by detectors with `close()` method. -You should now call `detector.close()` when a detector will no longer be used. - -## 0.8.0+3 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. -* Replace invokeMethod with invokeMapMethod wherever necessary. - -## 0.8.0+2 - -* Fix crash when passing contact info from barcode. - -## 0.8.0+1 - -* Update the sample to use the new ImageStreamListener API introduced in https://github.com/flutter/flutter/pull/32936. - -## 0.8.0 - -* Update Android dependencies to latest. - -## 0.7.0+2 - -* Fix analyzer warnings about `const Rect` in tests. - -## 0.7.0+1 - -* Update README to match latest version. - -## 0.7.0 - -* **Breaking Change** Unified and enhanced on-device and cloud image-labeling API. - `iOS` now requires minimum deployment target of 9.0. Add `platform :ios, '9.0'` in your `Podfile`. - Updated to latest version of `Firebase/MLVision` on `iOS`. Please run `pod update` in directory containing your `iOS` project `Podfile`. - `Label` renamed to `ImageLabel`. - `LabelDetector` renamed to `ImageLabeler`. - Removed `CloudLabelDetector` and replaced it with a cloud `ImageLabeler`. - -## 0.6.0+2 - -* Update README.md -* Fix crash when receiving barcode urls on iOS. - -## 0.6.0+1 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.6.0 - -* **Breaking Change** Removed on-device model dependencies from plugin. - `Android` now requires adding the on-device label detector dependency manually. - `iOS` now requires adding the on-device barcode/face/label/text detector dependencies manually. - See the `README.md` for more details. https://pub.dartlang.org/packages/firebase_ml_vision#-readme-tab- - -## 0.5.1+2 - -* Fixes bug where image file needs to be rotated. - -## 0.5.1+1 - -* Remove categories. - -## 0.5.1 - -* iOS now handles non-planar buffers from `FirebaseVisionImage.fromBytes()`. - -## 0.5.0+1 - -* Fixes `FIRAnalyticsVersionMismatch` compilation error on iOS. Please run `pod update` in directory - containing `Podfile`. - -## 0.5.0 - -* **Breaking Change** Change `Rectangle` to `Rect` in Text/Face/Barcode results. -* **Breaking Change** Change `Point`/`Point` to `Offset` in Text/Face/Barcode results. - -* Fixed bug where there were no corner points for `VisionText` or `Barcode` on iOS. - -## 0.4.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.4.0 - -* **Breaking Change** Removal of base detector class `FirebaseVisionDetector`. -* **Breaking Change** Removal of `TextRecognizer.detectInImage()`. Please use - `TextRecognizer.processImage()`. -* **Breaking Change** Changed `FaceDetector.detectInImage()` to `FaceDetector.processImage()`. - -## 0.3.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.2.1 - -* Add capability to create image from bytes. - -## 0.2.0+2 - -* Fix bug with empty text object. -* Fix bug with crash from passing nil to map. - -## 0.2.0+1 - -Bump Android dependencies to latest. - -## 0.2.0 - -* **Breaking Change** Update TextDetector to TextRecognizer for android mlkit '17.0.0' and -firebase-ios-sdk '5.6.0'. -* Added CloudLabelDetector. - -## 0.1.2 - -* Fix example imports so that publishing will be warning-free. - -## 0.1.1 - -* Set pod version of Firebase/MLVision to avoid breaking changes. - -## 0.1.0 - -* **Breaking Change** Add Barcode, Face, and Label on-device detectors. -* Remove close method. - -## 0.0.2 - -* Bump Android and Firebase dependency versions. - -## 0.0.1 - -* Initial release with text detector. diff --git a/packages/firebase_ml_vision/LICENSE b/packages/firebase_ml_vision/LICENSE deleted file mode 100644 index 8940a4be1b58..000000000000 --- a/packages/firebase_ml_vision/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018 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. diff --git a/packages/firebase_ml_vision/README.md b/packages/firebase_ml_vision/README.md deleted file mode 100644 index be7e6578f3ab..000000000000 --- a/packages/firebase_ml_vision/README.md +++ /dev/null @@ -1,206 +0,0 @@ -# ML Kit Vision for Firebase - -[![pub package](https://img.shields.io/pub/v/firebase_ml_vision.svg)](https://pub.dartlang.org/packages/firebase_ml_vision) - -A Flutter plugin to use the [ML Kit Vision for Firebase API](https://firebase.google.com/docs/ml-kit/). - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -To use this plugin, add `firebase_ml_vision` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). You must also configure Firebase for each platform project: Android and iOS (see the example folder or https://codelabs.developers.google.com/codelabs/flutter-firebase/#4 for step by step details). - -### Android -If you're using the on-device `ImageLabeler`, include the latest matching [ML Kit: Image Labeling](https://firebase.google.com/support/release-notes/android) dependency in your app-level build.gradle file. - -```xml -android { - dependencies { - // ... - - api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2' - } -} -``` - -If you're using the on-device `Face Contour Detection`, include the latest matching [ML Kit: Face Detection Model](https://firebase.google.com/support/release-notes/android) dependency in your app-level build.gradle file. - -``` -android { - dependencies { - // ... - - api 'com.google.firebase:firebase-ml-vision-face-model:17.0.2' - } -} -``` - -If you receive compilation errors, try an earlier version of [ML Kit: Image Labeling](https://firebase.google.com/support/release-notes/android). - -Optional but recommended: If you use the on-device API, configure your app to automatically download the ML model to the device after your app is installed from the Play Store. To do so, add the following declaration to your app's AndroidManifest.xml file: - -```xml - - ... - - - -``` - -### iOS -Versions `0.7.0+` use the latest ML Kit for Firebase version which requires a minimum deployment -target of 9.0. You can add the line `platform :ios, '9.0'` in your iOS project `Podfile`. - -If you're using one of the on-device APIs, include the corresponding ML Kit library model in your -`Podfile`. Then run `pod update` in a terminal within the same directory as your `Podfile`. - -``` -pod 'Firebase/MLVisionBarcodeModel' -pod 'Firebase/MLVisionFaceModel' -pod 'Firebase/MLVisionLabelModel' -pod 'Firebase/MLVisionTextModel' -``` - -## Using an ML Vision Detector - -### 1. Create a `FirebaseVisionImage`. - -Create a `FirebaseVisionImage` object from your image. To create a `FirebaseVisionImage` from an image `File` object: - -```dart -final File imageFile = getImageFile(); -final FirebaseVisionImage visionImage = FirebaseVisionImage.fromFile(imageFile); -``` - -### 2. Create an instance of a detector. - -Get an instance of a `FirebaseVisionDetector`. - -```dart -final BarcodeDetector barcodeDetector = FirebaseVision.instance.barcodeDetector(); -final ImageLabeler cloudLabeler = FirebaseVision.instance.cloudImageLabeler(); -final FaceDetector faceDetector = FirebaseVision.instance.faceDetector(); -final ImageLabeler labeler = FirebaseVision.instance.imageLabeler(); -final TextRecognizer textRecognizer = FirebaseVision.instance.textRecognizer(); -``` - -You can also configure all detectors, except `TextRecognizer`, with desired options. - -```dart -final ImageLabeler labeler = FirebaseVision.instance.imageLabler( - ImageLabelerOptions(confidenceThreshold: 0.75), -); -``` - -### 3. Call `detectInImage()` or `processImage()` with `visionImage`. - -```dart -final List barcodes = await barcodeDetector.detectInImage(visionImage); -final List cloudLabels = await cloudLabeler.processImage(visionImage); -final List faces = await faceDetector.processImage(visionImage); -final List labels = await labeler.processImage(visionImage); -final VisionText visionText = await textRecognizer.processImage(visionImage); -``` - -### 4. Extract data. - -a. Extract barcodes. - -```dart -for (Barcode barcode in barcodes) { - final Rectangle boundingBox = barcode.boundingBox; - final List> cornerPoints = barcode.cornerPoints; - - final String rawValue = barcode.rawValue; - - final BarcodeValueType valueType = barcode.valueType; - - // See API reference for complete list of supported types - switch (valueType) { - case BarcodeValueType.wifi: - final String ssid = barcode.wifi.ssid; - final String password = barcode.wifi.password; - final BarcodeWiFiEncryptionType type = barcode.wifi.encryptionType; - break; - case BarcodeValueType.url: - final String title = barcode.url.title; - final String url = barcode.url.url; - break; - } -} -``` - -b. Extract faces. - -```dart -for (Face face in faces) { - final Rectangle boundingBox = face.boundingBox; - - final double rotY = face.headEulerAngleY; // Head is rotated to the right rotY degrees - final double rotZ = face.headEulerAngleZ; // Head is tilted sideways rotZ degrees - - // If landmark detection was enabled with FaceDetectorOptions (mouth, ears, - // eyes, cheeks, and nose available): - final FaceLandmark leftEar = face.getLandmark(FaceLandmarkType.leftEar); - if (leftEar != null) { - final Point leftEarPos = leftEar.position; - } - - // If classification was enabled with FaceDetectorOptions: - if (face.smilingProbability != null) { - final double smileProb = face.smilingProbability; - } - - // If face tracking was enabled with FaceDetectorOptions: - if (face.trackingId != null) { - final int id = face.trackingId; - } -} -``` - -c. Extract labels. - -```dart -for (ImageLabel label in labels) { - final String text = label.text; - final String entityId = label.entityId; - final double confidence = label.confidence; -} -``` - -d. Extract text. - -```dart -String text = visionText.text; -for (TextBlock block in visionText.blocks) { - final Rect boundingBox = block.boundingBox; - final List cornerPoints = block.cornerPoints; - final String text = block.text; - final List languages = block.recognizedLanguages; - - for (TextLine line in block.lines) { - // Same getters as TextBlock - for (TextElement element in line.elements) { - // Same getters as TextBlock - } - } -} -``` - -### 5. Release resources with `close()`. - -```dart -barcodeDetector.close(); -cloudLabeler.close(); -faceDetector.close(); -labeler.close(); -textRecognizer.close(); -``` - -## Getting Started - -See the `example` directory for a complete sample app using ML Kit Vision for Firebase. diff --git a/packages/firebase_ml_vision/android/build.gradle b/packages/firebase_ml_vision/android/build.gradle deleted file mode 100644 index a484f14df0c7..000000000000 --- a/packages/firebase_ml_vision/android/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -def PLUGIN = "firebase_ml_vision"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebasemlvision' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-ml-vision:20.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - implementation 'androidx.annotation:annotation:1.0.0' - implementation 'androidx.exifinterface:exifinterface:1.0.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_ml_vision/android/gradle.properties b/packages/firebase_ml_vision/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_ml_vision/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_ml_vision/android/settings.gradle b/packages/firebase_ml_vision/android/settings.gradle deleted file mode 100644 index 66876748f77c..000000000000 --- a/packages/firebase_ml_vision/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_ml_vision' diff --git a/packages/firebase_ml_vision/android/src/main/AndroidManifest.xml b/packages/firebase_ml_vision/android/src/main/AndroidManifest.xml deleted file mode 100644 index fa9ed7054b9e..000000000000 --- a/packages/firebase_ml_vision/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java deleted file mode 100644 index 899b09cb4653..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/BarcodeDetector.java +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemlvision; - -import android.graphics.Point; -import android.graphics.Rect; -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.ml.vision.FirebaseVision; -import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcode; -import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector; -import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetectorOptions; -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import io.flutter.plugin.common.MethodChannel; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class BarcodeDetector implements Detector { - private final FirebaseVisionBarcodeDetector detector; - - BarcodeDetector(FirebaseVision vision, Map options) { - detector = vision.getVisionBarcodeDetector(parseOptions(options)); - } - - @Override - public void handleDetection(final FirebaseVisionImage image, final MethodChannel.Result result) { - detector - .detectInImage(image) - .addOnSuccessListener( - new OnSuccessListener>() { - @Override - public void onSuccess(List firebaseVisionBarcodes) { - List> barcodes = new ArrayList<>(); - - for (FirebaseVisionBarcode barcode : firebaseVisionBarcodes) { - Map barcodeMap = new HashMap<>(); - - Rect bounds = barcode.getBoundingBox(); - if (bounds != null) { - barcodeMap.put("left", (double) bounds.left); - barcodeMap.put("top", (double) bounds.top); - barcodeMap.put("width", (double) bounds.width()); - barcodeMap.put("height", (double) bounds.height()); - } - - List points = new ArrayList<>(); - if (barcode.getCornerPoints() != null) { - for (Point point : barcode.getCornerPoints()) { - points.add(new double[] {(double) point.x, (double) point.y}); - } - } - barcodeMap.put("points", points); - - barcodeMap.put("rawValue", barcode.getRawValue()); - barcodeMap.put("displayValue", barcode.getDisplayValue()); - barcodeMap.put("format", barcode.getFormat()); - barcodeMap.put("valueType", barcode.getValueType()); - - Map typeValue = new HashMap<>(); - switch (barcode.getValueType()) { - case FirebaseVisionBarcode.TYPE_EMAIL: - FirebaseVisionBarcode.Email email = barcode.getEmail(); - - typeValue.put("type", email.getType()); - typeValue.put("address", email.getAddress()); - typeValue.put("body", email.getBody()); - typeValue.put("subject", email.getSubject()); - - barcodeMap.put("email", typeValue); - break; - case FirebaseVisionBarcode.TYPE_PHONE: - FirebaseVisionBarcode.Phone phone = barcode.getPhone(); - - typeValue.put("number", phone.getNumber()); - typeValue.put("type", phone.getType()); - - barcodeMap.put("phone", typeValue); - break; - case FirebaseVisionBarcode.TYPE_SMS: - FirebaseVisionBarcode.Sms sms = barcode.getSms(); - - typeValue.put("message", sms.getMessage()); - typeValue.put("phoneNumber", sms.getPhoneNumber()); - - barcodeMap.put("sms", typeValue); - break; - case FirebaseVisionBarcode.TYPE_URL: - FirebaseVisionBarcode.UrlBookmark urlBookmark = barcode.getUrl(); - - typeValue.put("title", urlBookmark.getTitle()); - typeValue.put("url", urlBookmark.getUrl()); - - barcodeMap.put("url", typeValue); - break; - case FirebaseVisionBarcode.TYPE_WIFI: - FirebaseVisionBarcode.WiFi wifi = barcode.getWifi(); - - typeValue.put("ssid", wifi.getSsid()); - typeValue.put("password", wifi.getPassword()); - typeValue.put("encryptionType", wifi.getEncryptionType()); - - barcodeMap.put("wifi", typeValue); - break; - case FirebaseVisionBarcode.TYPE_GEO: - FirebaseVisionBarcode.GeoPoint geoPoint = barcode.getGeoPoint(); - - typeValue.put("latitude", geoPoint.getLat()); - typeValue.put("longitude", geoPoint.getLng()); - - barcodeMap.put("geoPoint", typeValue); - break; - case FirebaseVisionBarcode.TYPE_CONTACT_INFO: - FirebaseVisionBarcode.ContactInfo contactInfo = barcode.getContactInfo(); - - List> addresses = new ArrayList<>(); - for (FirebaseVisionBarcode.Address address : contactInfo.getAddresses()) { - Map addressMap = new HashMap<>(); - if (address.getAddressLines() != null) { - addressMap.put("addressLines", Arrays.asList(address.getAddressLines())); - } - addressMap.put("type", address.getType()); - - addresses.add(addressMap); - } - typeValue.put("addresses", addresses); - - List> emails = new ArrayList<>(); - for (FirebaseVisionBarcode.Email contactEmail : contactInfo.getEmails()) { - Map emailMap = new HashMap<>(); - emailMap.put("address", contactEmail.getAddress()); - emailMap.put("type", contactEmail.getType()); - emailMap.put("body", contactEmail.getBody()); - emailMap.put("subject", contactEmail.getSubject()); - - emails.add(emailMap); - } - typeValue.put("emails", emails); - - Map nameMap = new HashMap<>(); - FirebaseVisionBarcode.PersonName name = contactInfo.getName(); - if (name != null) { - nameMap.put("formattedName", name.getFormattedName()); - nameMap.put("first", name.getFirst()); - nameMap.put("last", name.getLast()); - nameMap.put("middle", name.getMiddle()); - nameMap.put("prefix", name.getPrefix()); - nameMap.put("pronunciation", name.getPronunciation()); - nameMap.put("suffix", name.getSuffix()); - } - typeValue.put("name", nameMap); - - List> phones = new ArrayList<>(); - for (FirebaseVisionBarcode.Phone contactPhone : contactInfo.getPhones()) { - Map phoneMap = new HashMap<>(); - phoneMap.put("number", contactPhone.getNumber()); - phoneMap.put("type", contactPhone.getType()); - - phones.add(phoneMap); - } - typeValue.put("phones", phones); - - if (contactInfo.getUrls() != null) { - typeValue.put("urls", Arrays.asList(contactInfo.getUrls())); - } - typeValue.put("jobTitle", contactInfo.getTitle()); - typeValue.put("organization", contactInfo.getOrganization()); - - barcodeMap.put("contactInfo", typeValue); - break; - case FirebaseVisionBarcode.TYPE_CALENDAR_EVENT: - FirebaseVisionBarcode.CalendarEvent calendarEvent = - barcode.getCalendarEvent(); - - typeValue.put("eventDescription", calendarEvent.getDescription()); - typeValue.put("location", calendarEvent.getLocation()); - typeValue.put("organizer", calendarEvent.getOrganizer()); - typeValue.put("status", calendarEvent.getStatus()); - typeValue.put("summary", calendarEvent.getSummary()); - if (calendarEvent.getStart() != null) { - typeValue.put("start", calendarEvent.getStart().getRawValue()); - } - if (calendarEvent.getEnd() != null) { - typeValue.put("end", calendarEvent.getEnd().getRawValue()); - } - - barcodeMap.put("calendarEvent", typeValue); - break; - case FirebaseVisionBarcode.TYPE_DRIVER_LICENSE: - FirebaseVisionBarcode.DriverLicense driverLicense = - barcode.getDriverLicense(); - - typeValue.put("firstName", driverLicense.getFirstName()); - typeValue.put("middleName", driverLicense.getMiddleName()); - typeValue.put("lastName", driverLicense.getLastName()); - typeValue.put("gender", driverLicense.getGender()); - typeValue.put("addressCity", driverLicense.getAddressCity()); - typeValue.put("addressStreet", driverLicense.getAddressStreet()); - typeValue.put("addressState", driverLicense.getAddressState()); - typeValue.put("addressZip", driverLicense.getAddressZip()); - typeValue.put("birthDate", driverLicense.getBirthDate()); - typeValue.put("documentType", driverLicense.getDocumentType()); - typeValue.put("licenseNumber", driverLicense.getLicenseNumber()); - typeValue.put("expiryDate", driverLicense.getExpiryDate()); - typeValue.put("issuingDate", driverLicense.getIssueDate()); - typeValue.put("issuingCountry", driverLicense.getIssuingCountry()); - - barcodeMap.put("driverLicense", typeValue); - break; - } - - barcodes.add(barcodeMap); - } - result.success(barcodes); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception exception) { - result.error("barcodeDetectorError", exception.getLocalizedMessage(), null); - } - }); - } - - private FirebaseVisionBarcodeDetectorOptions parseOptions(Map optionsData) { - Integer barcodeFormats = (Integer) optionsData.get("barcodeFormats"); - return new FirebaseVisionBarcodeDetectorOptions.Builder() - .setBarcodeFormats(barcodeFormats) - .build(); - } - - @Override - public void close() throws IOException { - detector.close(); - } -} diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java deleted file mode 100644 index b65efa41f444..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/Detector.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemlvision; - -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import io.flutter.plugin.common.MethodChannel; -import java.io.IOException; - -public interface Detector { - void handleDetection(final FirebaseVisionImage image, final MethodChannel.Result result); - - void close() throws IOException; -} diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java deleted file mode 100644 index 9af31c6973d6..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemlvision; - -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.ml.vision.FirebaseVision; -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import com.google.firebase.ml.vision.common.FirebaseVisionPoint; -import com.google.firebase.ml.vision.face.FirebaseVisionFace; -import com.google.firebase.ml.vision.face.FirebaseVisionFaceContour; -import com.google.firebase.ml.vision.face.FirebaseVisionFaceDetector; -import com.google.firebase.ml.vision.face.FirebaseVisionFaceDetectorOptions; -import com.google.firebase.ml.vision.face.FirebaseVisionFaceLandmark; -import io.flutter.plugin.common.MethodChannel; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class FaceDetector implements Detector { - private final FirebaseVisionFaceDetector detector; - - FaceDetector(FirebaseVision vision, Map options) { - detector = vision.getVisionFaceDetector(parseOptions(options)); - } - - @Override - public void handleDetection(final FirebaseVisionImage image, final MethodChannel.Result result) { - detector - .detectInImage(image) - .addOnSuccessListener( - new OnSuccessListener>() { - @Override - public void onSuccess(List firebaseVisionFaces) { - List> faces = new ArrayList<>(firebaseVisionFaces.size()); - for (FirebaseVisionFace face : firebaseVisionFaces) { - Map faceData = new HashMap<>(); - - faceData.put("left", (double) face.getBoundingBox().left); - faceData.put("top", (double) face.getBoundingBox().top); - faceData.put("width", (double) face.getBoundingBox().width()); - faceData.put("height", (double) face.getBoundingBox().height()); - - faceData.put("headEulerAngleY", face.getHeadEulerAngleY()); - faceData.put("headEulerAngleZ", face.getHeadEulerAngleZ()); - - if (face.getSmilingProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("smilingProbability", face.getSmilingProbability()); - } - - if (face.getLeftEyeOpenProbability() - != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("leftEyeOpenProbability", face.getLeftEyeOpenProbability()); - } - - if (face.getRightEyeOpenProbability() - != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("rightEyeOpenProbability", face.getRightEyeOpenProbability()); - } - - if (face.getTrackingId() != FirebaseVisionFace.INVALID_ID) { - faceData.put("trackingId", face.getTrackingId()); - } - - faceData.put("landmarks", getLandmarkData(face)); - - faceData.put("contours", getContourData(face)); - - faces.add(faceData); - } - - result.success(faces); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception exception) { - result.error("faceDetectorError", exception.getLocalizedMessage(), null); - } - }); - } - - private Map getLandmarkData(FirebaseVisionFace face) { - Map landmarks = new HashMap<>(); - - landmarks.put("bottomMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.MOUTH_BOTTOM)); - landmarks.put("leftCheek", landmarkPosition(face, FirebaseVisionFaceLandmark.LEFT_CHEEK)); - landmarks.put("leftEar", landmarkPosition(face, FirebaseVisionFaceLandmark.LEFT_EAR)); - landmarks.put("leftEye", landmarkPosition(face, FirebaseVisionFaceLandmark.LEFT_EYE)); - landmarks.put("leftMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.MOUTH_LEFT)); - landmarks.put("noseBase", landmarkPosition(face, FirebaseVisionFaceLandmark.NOSE_BASE)); - landmarks.put("rightCheek", landmarkPosition(face, FirebaseVisionFaceLandmark.RIGHT_CHEEK)); - landmarks.put("rightEar", landmarkPosition(face, FirebaseVisionFaceLandmark.RIGHT_EAR)); - landmarks.put("rightEye", landmarkPosition(face, FirebaseVisionFaceLandmark.RIGHT_EYE)); - landmarks.put("rightMouth", landmarkPosition(face, FirebaseVisionFaceLandmark.MOUTH_RIGHT)); - - return landmarks; - } - - private Map> getContourData(FirebaseVisionFace face) { - Map> contours = new HashMap<>(); - - contours.put("allPoints", contourPosition(face, FirebaseVisionFaceContour.ALL_POINTS)); - contours.put("face", contourPosition(face, FirebaseVisionFaceContour.FACE)); - contours.put("leftEye", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYE)); - contours.put( - "leftEyebrowBottom", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_BOTTOM)); - contours.put( - "leftEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_TOP)); - contours.put( - "lowerLipBottom", contourPosition(face, FirebaseVisionFaceContour.LOWER_LIP_BOTTOM)); - contours.put("lowerLipTop", contourPosition(face, FirebaseVisionFaceContour.LOWER_LIP_TOP)); - contours.put("noseBottom", contourPosition(face, FirebaseVisionFaceContour.NOSE_BOTTOM)); - contours.put("noseBridge", contourPosition(face, FirebaseVisionFaceContour.NOSE_BRIDGE)); - contours.put("rightEye", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYE)); - contours.put( - "rightEyebrowBottom", - contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_BOTTOM)); - contours.put( - "rightEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_TOP)); - contours.put( - "upperLipBottom", contourPosition(face, FirebaseVisionFaceContour.UPPER_LIP_BOTTOM)); - contours.put("upperLipTop", contourPosition(face, FirebaseVisionFaceContour.UPPER_LIP_TOP)); - - return contours; - } - - private double[] landmarkPosition(FirebaseVisionFace face, int landmarkInt) { - FirebaseVisionFaceLandmark landmark = face.getLandmark(landmarkInt); - if (landmark != null) { - return new double[] {landmark.getPosition().getX(), landmark.getPosition().getY()}; - } - - return null; - } - - private List contourPosition(FirebaseVisionFace face, int contourInt) { - FirebaseVisionFaceContour contour = face.getContour(contourInt); - if (contour != null) { - List contourPoints = contour.getPoints(); - List result = new ArrayList(); - - for (int i = 0; i < contourPoints.size(); i++) { - result.add(new double[] {contourPoints.get(i).getX(), contourPoints.get(i).getY()}); - } - - return result; - } - - return null; - } - - private FirebaseVisionFaceDetectorOptions parseOptions(Map options) { - int classification = - (boolean) options.get("enableClassification") - ? FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS - : FirebaseVisionFaceDetectorOptions.NO_CLASSIFICATIONS; - - int landmark = - (boolean) options.get("enableLandmarks") - ? FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS - : FirebaseVisionFaceDetectorOptions.NO_LANDMARKS; - - int contours = - (boolean) options.get("enableContours") - ? FirebaseVisionFaceDetectorOptions.ALL_CONTOURS - : FirebaseVisionFaceDetectorOptions.NO_CONTOURS; - - int mode; - switch ((String) options.get("mode")) { - case "accurate": - mode = FirebaseVisionFaceDetectorOptions.ACCURATE; - break; - case "fast": - mode = FirebaseVisionFaceDetectorOptions.FAST; - break; - default: - throw new IllegalArgumentException("Not a mode:" + options.get("mode")); - } - - FirebaseVisionFaceDetectorOptions.Builder builder = - new FirebaseVisionFaceDetectorOptions.Builder() - .setClassificationMode(classification) - .setLandmarkMode(landmark) - .setContourMode(contours) - .setMinFaceSize((float) ((double) options.get("minFaceSize"))) - .setPerformanceMode(mode); - - if ((boolean) options.get("enableTracking")) { - builder.enableTracking(); - } - - return builder.build(); - } - - @Override - public void close() throws IOException { - detector.close(); - } -} diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java deleted file mode 100644 index a36cf4f7acb9..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FirebaseMlVisionPlugin.java +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemlvision; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Matrix; -import android.net.Uri; -import android.util.SparseArray; -import androidx.exifinterface.media.ExifInterface; -import com.google.firebase.ml.vision.FirebaseVision; -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata; -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.plugin.common.PluginRegistry.Registrar; -import java.io.File; -import java.io.IOException; -import java.util.Map; - -/** FirebaseMlVisionPlugin */ -public class FirebaseMlVisionPlugin implements MethodCallHandler { - private final SparseArray detectors = new SparseArray<>(); - - private Registrar registrar; - - private FirebaseMlVisionPlugin(Registrar registrar) { - this.registrar = registrar; - } - - /** Plugin registration. */ - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_ml_vision"); - channel.setMethodCallHandler(new FirebaseMlVisionPlugin(registrar)); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "BarcodeDetector#detectInImage": - case "FaceDetector#processImage": - case "ImageLabeler#processImage": - case "TextRecognizer#processImage": - handleDetection(call, result); - break; - case "BarcodeDetector#close": - case "FaceDetector#close": - case "ImageLabeler#close": - case "TextRecognizer#close": - closeDetector(call, result); - break; - default: - result.notImplemented(); - } - } - - private void handleDetection(MethodCall call, Result result) { - Map options = call.argument("options"); - - FirebaseVisionImage image; - Map imageData = call.arguments(); - try { - image = dataToVisionImage(imageData); - } catch (IOException exception) { - result.error("MLVisionDetectorIOError", exception.getLocalizedMessage(), null); - return; - } - - Detector detector = getDetector(call); - if (detector == null) { - switch (call.method.split("#")[0]) { - case "BarcodeDetector": - detector = new BarcodeDetector(FirebaseVision.getInstance(), options); - break; - case "FaceDetector": - detector = new FaceDetector(FirebaseVision.getInstance(), options); - break; - case "ImageLabeler": - detector = new ImageLabeler(FirebaseVision.getInstance(), options); - break; - case "TextRecognizer": - detector = new TextRecognizer(FirebaseVision.getInstance(), options); - break; - } - - final Integer handle = call.argument("handle"); - addDetector(handle, detector); - } - - detector.handleDetection(image, result); - } - - private void closeDetector(final MethodCall call, final Result result) { - final Detector detector = getDetector(call); - - if (detector == null) { - final Integer handle = call.argument("handle"); - final String message = String.format("Object for handle does not exists: %s", handle); - throw new IllegalArgumentException(message); - } - - try { - detector.close(); - result.success(null); - } catch (IOException e) { - final String code = String.format("%sIOError", detector.getClass().getSimpleName()); - result.error(code, e.getLocalizedMessage(), null); - } finally { - final Integer handle = call.argument("handle"); - detectors.remove(handle); - } - } - - private FirebaseVisionImage dataToVisionImage(Map imageData) throws IOException { - String imageType = (String) imageData.get("type"); - assert imageType != null; - - switch (imageType) { - case "file": - final String imageFilePath = (String) imageData.get("path"); - final int rotation = getImageExifOrientation(imageFilePath); - - if (rotation == 0) { - File file = new File(imageFilePath); - return FirebaseVisionImage.fromFilePath(registrar.context(), Uri.fromFile(file)); - } - - Matrix matrix = new Matrix(); - matrix.postRotate(rotation); - - final Bitmap bitmap = BitmapFactory.decodeFile(imageFilePath); - final Bitmap rotatedBitmap = - Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); - - return FirebaseVisionImage.fromBitmap(rotatedBitmap); - case "bytes": - @SuppressWarnings("unchecked") - Map metadataData = (Map) imageData.get("metadata"); - - FirebaseVisionImageMetadata metadata = - new FirebaseVisionImageMetadata.Builder() - .setWidth((int) (double) metadataData.get("width")) - .setHeight((int) (double) metadataData.get("height")) - .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21) - .setRotation(getRotation((int) metadataData.get("rotation"))) - .build(); - - byte[] bytes = (byte[]) imageData.get("bytes"); - assert bytes != null; - - return FirebaseVisionImage.fromByteArray(bytes, metadata); - default: - throw new IllegalArgumentException(String.format("No image type for: %s", imageType)); - } - } - - private int getImageExifOrientation(String imageFilePath) throws IOException { - ExifInterface exif = new ExifInterface(imageFilePath); - int orientation = - exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - - switch (orientation) { - case ExifInterface.ORIENTATION_ROTATE_90: - return 90; - case ExifInterface.ORIENTATION_ROTATE_180: - return 180; - case ExifInterface.ORIENTATION_ROTATE_270: - return 270; - default: - return 0; - } - } - - private int getRotation(int rotation) { - switch (rotation) { - case 0: - return FirebaseVisionImageMetadata.ROTATION_0; - case 90: - return FirebaseVisionImageMetadata.ROTATION_90; - case 180: - return FirebaseVisionImageMetadata.ROTATION_180; - case 270: - return FirebaseVisionImageMetadata.ROTATION_270; - default: - throw new IllegalArgumentException(String.format("No rotation for: %d", rotation)); - } - } - - private void addDetector(final int handle, final Detector detector) { - if (detectors.get(handle) != null) { - final String message = String.format("Object for handle already exists: %s", handle); - throw new IllegalArgumentException(message); - } - - detectors.put(handle, detector); - } - - private Detector getDetector(final MethodCall call) { - final Integer handle = call.argument("handle"); - return detectors.get(handle); - } -} diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 14d4accca3dd..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemlvision; - -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; - -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_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java deleted file mode 100644 index 99899402c037..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/ImageLabeler.java +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemlvision; - -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.ml.vision.FirebaseVision; -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import com.google.firebase.ml.vision.label.FirebaseVisionCloudImageLabelerOptions; -import com.google.firebase.ml.vision.label.FirebaseVisionImageLabel; -import com.google.firebase.ml.vision.label.FirebaseVisionImageLabeler; -import com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions; -import io.flutter.plugin.common.MethodChannel; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class ImageLabeler implements Detector { - private final FirebaseVisionImageLabeler labeler; - - ImageLabeler(FirebaseVision vision, Map options) { - final String modelType = (String) options.get("modelType"); - if (modelType.equals("onDevice")) { - labeler = vision.getOnDeviceImageLabeler(parseOptions(options)); - } else if (modelType.equals("cloud")) { - labeler = vision.getCloudImageLabeler(parseCloudOptions(options)); - } else { - final String message = String.format("No model for type: %s", modelType); - throw new IllegalArgumentException(message); - } - } - - @Override - public void handleDetection(final FirebaseVisionImage image, final MethodChannel.Result result) { - labeler - .processImage(image) - .addOnSuccessListener( - new OnSuccessListener>() { - @Override - public void onSuccess(List firebaseVisionLabels) { - List> labels = new ArrayList<>(firebaseVisionLabels.size()); - for (FirebaseVisionImageLabel label : firebaseVisionLabels) { - Map labelData = new HashMap<>(); - labelData.put("confidence", (double) label.getConfidence()); - labelData.put("entityId", label.getEntityId()); - labelData.put("text", label.getText()); - - labels.add(labelData); - } - - result.success(labels); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("imageLabelerError", e.getLocalizedMessage(), null); - } - }); - } - - private FirebaseVisionOnDeviceImageLabelerOptions parseOptions(Map optionsData) { - float conf = (float) (double) optionsData.get("confidenceThreshold"); - return new FirebaseVisionOnDeviceImageLabelerOptions.Builder() - .setConfidenceThreshold(conf) - .build(); - } - - private FirebaseVisionCloudImageLabelerOptions parseCloudOptions( - Map optionsData) { - float conf = (float) (double) optionsData.get("confidenceThreshold"); - return new FirebaseVisionCloudImageLabelerOptions.Builder() - .setConfidenceThreshold(conf) - .build(); - } - - @Override - public void close() throws IOException { - labeler.close(); - } -} diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java deleted file mode 100644 index 29ee31975626..000000000000 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemlvision; - -import android.graphics.Point; -import android.graphics.Rect; -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.ml.vision.FirebaseVision; -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import com.google.firebase.ml.vision.text.FirebaseVisionText; -import com.google.firebase.ml.vision.text.FirebaseVisionTextRecognizer; -import com.google.firebase.ml.vision.text.RecognizedLanguage; -import io.flutter.plugin.common.MethodChannel; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class TextRecognizer implements Detector { - private final FirebaseVisionTextRecognizer recognizer; - - TextRecognizer(FirebaseVision vision, Map options) { - final String modelType = (String) options.get("modelType"); - if (modelType.equals("onDevice")) { - recognizer = vision.getOnDeviceTextRecognizer(); - } else if (modelType.equals("cloud")) { - recognizer = vision.getCloudTextRecognizer(); - } else { - final String message = String.format("No model for type: %s", modelType); - throw new IllegalArgumentException(message); - } - } - - @Override - public void handleDetection(final FirebaseVisionImage image, final MethodChannel.Result result) { - recognizer - .processImage(image) - .addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(FirebaseVisionText firebaseVisionText) { - Map visionTextData = new HashMap<>(); - visionTextData.put("text", firebaseVisionText.getText()); - - List> allBlockData = new ArrayList<>(); - for (FirebaseVisionText.TextBlock block : firebaseVisionText.getTextBlocks()) { - Map blockData = new HashMap<>(); - addData( - blockData, - block.getBoundingBox(), - block.getConfidence(), - block.getCornerPoints(), - block.getRecognizedLanguages(), - block.getText()); - - List> allLineData = new ArrayList<>(); - for (FirebaseVisionText.Line line : block.getLines()) { - Map lineData = new HashMap<>(); - addData( - lineData, - line.getBoundingBox(), - line.getConfidence(), - line.getCornerPoints(), - line.getRecognizedLanguages(), - line.getText()); - - List> allElementData = new ArrayList<>(); - for (FirebaseVisionText.Element element : line.getElements()) { - Map elementData = new HashMap<>(); - addData( - elementData, - element.getBoundingBox(), - element.getConfidence(), - element.getCornerPoints(), - element.getRecognizedLanguages(), - element.getText()); - - allElementData.add(elementData); - } - lineData.put("elements", allElementData); - allLineData.add(lineData); - } - blockData.put("lines", allLineData); - allBlockData.add(blockData); - } - - visionTextData.put("blocks", allBlockData); - result.success(visionTextData); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception exception) { - result.error("textRecognizerError", exception.getLocalizedMessage(), null); - } - }); - } - - private void addData( - Map addTo, - Rect boundingBox, - Float confidence, - Point[] cornerPoints, - List languages, - String text) { - - if (boundingBox != null) { - addTo.put("left", (double) boundingBox.left); - addTo.put("top", (double) boundingBox.top); - addTo.put("width", (double) boundingBox.width()); - addTo.put("height", (double) boundingBox.height()); - } - - addTo.put("confidence", confidence == null ? null : (double) confidence); - - List points = new ArrayList<>(); - if (cornerPoints != null) { - for (Point point : cornerPoints) { - points.add(new double[] {(double) point.x, (double) point.y}); - } - } - addTo.put("points", points); - - List> allLanguageData = new ArrayList<>(); - for (RecognizedLanguage language : languages) { - Map languageData = new HashMap<>(); - languageData.put("languageCode", language.getLanguageCode()); - allLanguageData.add(languageData); - } - addTo.put("recognizedLanguages", allLanguageData); - - addTo.put("text", text); - } - - @Override - public void close() throws IOException { - recognizer.close(); - } -} diff --git a/packages/firebase_ml_vision/android/user-agent.gradle b/packages/firebase_ml_vision/android/user-agent.gradle deleted file mode 100644 index 83d39fc0af02..000000000000 --- a/packages/firebase_ml_vision/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-ml-vis" -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_ml_vision/example/.metadata b/packages/firebase_ml_vision/example/.metadata deleted file mode 100644 index 9ce49c5dcc70..000000000000 --- a/packages/firebase_ml_vision/example/.metadata +++ /dev/null @@ -1,8 +0,0 @@ -# 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: d454629a0646fcbd0f5a8d61998d0ea801d52909 - channel: master diff --git a/packages/firebase_ml_vision/example/README.md b/packages/firebase_ml_vision/example/README.md deleted file mode 100644 index 51e02d473c69..000000000000 --- a/packages/firebase_ml_vision/example/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# firebase_ml_vision_example - -Demonstrates how to use the firebase_ml_vision plugin. - -## Usage - -*Important* If using on-device detectors on `iOS`, see the plugin -[README.md](https://github.com/flutter/plugins/blob/master/packages/firebase_ml_vision/README.md) on including -ML Model pods into the example project. - -This example uses the *image_picker* plugin to get images from the device gallery. If using an iOS -device you will have to configure you project with the correct permissions seen under iOS -configuration [here.](https://pub.dartlang.org/packages/image_picker). - -## Getting Started - -For help getting started with Flutter, view our online -[documentation.](https://flutter.io/) diff --git a/packages/firebase_ml_vision/example/android/app/build.gradle b/packages/firebase_ml_vision/example/android/app/build.gradle deleted file mode 100644 index edd72b27f848..000000000000 --- a/packages/firebase_ml_vision/example/android/app/build.gradle +++ /dev/null @@ -1,59 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebasemlvisionexample" - minSdkVersion 21 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - signingConfig signingConfigs.debug - } - } - - dependencies { - api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2' - api 'com.google.firebase:firebase-ml-vision-face-model:17.0.2' - } -} - -flutter { - source '../..' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_ml_vision/example/android/app/google-services.json b/packages/firebase_ml_vision/example/android/app/google-services.json deleted file mode 100644 index 91e7b73c106c..000000000000 --- a/packages/firebase_ml_vision/example/android/app/google-services.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "project_info": { - "project_number": "479882132969", - "firebase_url": "https://my-flutter-proj.firebaseio.com", - "project_id": "my-flutter-proj", - "storage_bucket": "my-flutter-proj.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:479882132969:android:632cdf3fc0a17139", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasedynamiclinksexample" - } - }, - "oauth_client": [ - { - "client_id": "479882132969-32qusitiag53931ck80h121ajhlc5a7e.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebasedynamiclinksexample", - "certificate_hash": "e733b7a303250b63e06de6f7c9767c517d69cfa0" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCrZz9T0Pg0rDnpxfNuPBrOxGhXskfebXs" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "479882132969-pn2ancg65o0e7r5ikte1qiciuvdghqf9.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.google.FirebaseCppDynamicLinksTestApp.dev", - "app_store_id": "1009116743" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:479882132969:android:ae50362b4bc06086", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasemlvisionexample" - } - }, - "oauth_client": [ - { - "client_id": "479882132969-9pp74fkgmtvt47t9rikc1p861v7n85tn.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebasemlvisionexample", - "certificate_hash": "e733b7a303250b63e06de6f7c9767c517d69cfa0" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCrZz9T0Pg0rDnpxfNuPBrOxGhXskfebXs" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "479882132969-pn2ancg65o0e7r5ikte1qiciuvdghqf9.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.google.FirebaseCppDynamicLinksTestApp.dev", - "app_store_id": "1009116743" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:479882132969:android:215a22700e1b466b", - "android_client_info": { - "package_name": "io.flutter.plugins.firebaseperformanceexample" - } - }, - "oauth_client": [ - { - "client_id": "479882132969-8h4kiv8m7ho4tvn6uuujsfcrf69unuf7.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseperformanceexample", - "certificate_hash": "e733b7a303250b63e06de6f7c9767c517d69cfa0" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCrZz9T0Pg0rDnpxfNuPBrOxGhXskfebXs" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "479882132969-pn2ancg65o0e7r5ikte1qiciuvdghqf9.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.google.FirebaseCppDynamicLinksTestApp.dev", - "app_store_id": "1009116743" - } - } - ] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_ml_vision/example/android/app/gradle.properties b/packages/firebase_ml_vision/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_ml_vision/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_ml_vision/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_ml_vision/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_ml_vision/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_ml_vision/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_ml_vision/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 2ead36173fb9..000000000000 --- a/packages/firebase_ml_vision/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_ml_vision/example/android/app/src/main/java/io/flutter/plugins/firebasemlvisionexample/MainActivity.java b/packages/firebase_ml_vision/example/android/app/src/main/java/io/flutter/plugins/firebasemlvisionexample/MainActivity.java deleted file mode 100644 index f5bfd378a945..000000000000 --- a/packages/firebase_ml_vision/example/android/app/src/main/java/io/flutter/plugins/firebasemlvisionexample/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.firebasemlvisionexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_ml_vision/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_ml_vision/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/firebase_ml_vision/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_ml_vision/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_ml_vision/example/android/app/src/main/res/values/styles.xml b/packages/firebase_ml_vision/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/firebase_ml_vision/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/firebase_ml_vision/example/android/build.gradle b/packages/firebase_ml_vision/example/android/build.gradle deleted file mode 100644 index 3759d2af578f..000000000000 --- a/packages/firebase_ml_vision/example/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_ml_vision/example/android/gradle.properties b/packages/firebase_ml_vision/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_ml_vision/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_ml_vision/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_ml_vision/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f1fd..000000000000 --- a/packages/firebase_ml_vision/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#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-4.10.2-all.zip diff --git a/packages/firebase_ml_vision/example/android/settings.gradle b/packages/firebase_ml_vision/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/firebase_ml_vision/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_ml_vision/example/assets/span_book.jpg b/packages/firebase_ml_vision/example/assets/span_book.jpg deleted file mode 100644 index 2437e1b31b2544a86debb03758d38f3f6ddaac7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73364 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

=&NnJiP1uKtt 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 CFGqg> diff --git a/packages/firebase_ml_vision/example/assets/test_barcode.jpg b/packages/firebase_ml_vision/example/assets/test_barcode.jpg deleted file mode 100644 index 9b00a21a9b5b62d558822e04ff339195070a401a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58252 zcmeFYby%CtwFI0O$Zr1UvvD9KwL-D1;|}z)#?CG6Der3I2@${{Rpu04RUJ0Kg{%%75Te z1m?eR;1m#e{^-jO$E!u){R1X~!+X)T0OY^=LSvr)4I_@h+W?Nv9?ovg4rXwE;1I1m zEwca%t-6D!`|pQvet(bs=eLWqhliybho`%x8?6v04<|RRn!1)2uMnq@00)mC#|v6s z9)1BqS~p7vOEY&%4tq;qcK|OpkFW?gzX*>YEf22D&oVllA*?;qoXb_hB4{RPo z_iwVqF#QFq!xaGlpuxF7=H}()PDc7$E=0RzC@W-eUt z*~A491Nyj_S=d{8(3)FX+d7HU{p#qUqqTi2PNyrN!mZ*WV`*cn;OAzk<)`}E!q479 z_$?h!f>z8&#K+Oa(bB_=*2mGo$z8-pobC_eB5?S3GZ!80A1EI7;&gf{>a;S>ZkDtH zocx^JbnxD8Z>>Z$U&{T}7hV&m`-@3$Z*NX-K2B#hYc3vPVPP(AUM^l<4mbvfyRVan znGc7PJN@4jURt_axY@dR*g8AW{-$VV?(FFyP6r?PPnH~A{vrDx%KkT^iw%4cy4yJa z577U4{D;DRcXAPtakDh@uzU&6;&i`_%E8SKUyiT;UT%LPsW`v2wetO6ApJqf+3mHn zvx7L@e`2-M(f-4q$nT;4rJEV1S@|#VBz~4I)WPB8YXFO780!Xh&5-x41DHp zVHlVsq-5k2&l#DRSy=f6UI+>ai^#l`m6KOcRML8_t)r`_Z(#A((#qP#*3R9-)63h( z*DpLGGAcUeU2JOF`}B;=4_Vn?3JQygOG?Yi>l+%Inp;}i+WQ9vhlWQ+zmCn$%`Yr2 zEw8NZ?1J|84-UT{9YfB}FD|dHp*Od`<$`Zd{uB#d{wdjiCl@|kE<|KxBxJPTav>mk z{}vn{8RZ!dDuI*+nwcvh9d9T)k#x%Ex;_kgK20#Ox!VjT2?PJmbI5Pe{*df{Pq486 zlw|)1_HS~n0c7A@|4zS4#NP=S>30bi0SOru1r_y=jD~@ZiiUxPii(Z}x8m;vhp@3Q zv42+{;Y9xIiim=Qgo25NiuMP}|D)n@1HLPK`nU?fMuP8}@R9HVKmZKsODxMqh=weY z@$aI#m-$Pq_ZuP&S z%Ngl$=D%p%+5e((=l+Yvo&PTycj3Qi+{OQ6<06cHoMcZqIeDq+AeOEF9A~zDyVM_b z?K-k*^!u0CJu>);2K;v!;c@Bz7(4&7CHw!~vd*L@8+s0a`Gfim0D97=7>IH5kuzu|>}&?!zbk7600zhsoey zNz;#jDqS$1A2+b;A((Y;S@S2=#Q#MPfjAj3!hf z%SH*TS8XMZgFOAVR9^x>`C7VfLfu37ri4 zCq1W!y_Qq_I9+c`L#+Ld+Ha=)evkf`g>4qNLpA%{^+OZ}tTe4xM0~(Z67Bx;V%h8P zW2>{(EYi= zgIASeouk_)tnoV?p((20qay~n>fg*5%t4t3y+H1I1i+Oy_96$vXA`@}3!rPu-SnCF zW!lk$F{NK(t;}SJ)Zsrj|Jkf%7+O?ZZE;mm_xU?eBwY2?pwNjfF|NdkUt?x_eBmVp zLhr--%U4t>*)FQKFW*8E*&Ij7bj3847UEwIo zHd}m0PH;kX&z9loG;NTM-e>cg$B};jpyp_idGxv2xu3d2l$_L6g)3KDq|?J?eDPGP zl##?JDlVVqP;vYor`=?uSrmHjPrC`lWPk}9DWj(}zNJl7bM!7jy1tZDHKZz&`nrt$hVWmypJ!o31BrOtb@j(#eD-8g z`gCE`w(LvW@oYf}WpY{d%H3vo%u=}rFGBveGK(~!Tt9OyhOFqgL{G^hz$76m_XEzC z+}fGigE($Vc(Zs}W7QkX*OWPUeo7fLSW}(e<*}V1t8<^}o{iWwr{p{WSe40m$jFX# z39#cYVQecUPqC@@J>zk|sJBl7UDm6F4-y%CxM~W&&glUUmNYH zEdMZj!T{vM%}>_}(|dKuHRWg37G7q|b5ra*mCaeQkZ}y>Rfo9E!fKu+wgR-(1K|-e}P8E#$s9~PQRY!S*z((<4J(x7b%jjjM8d;XV8OW zPQmOHr+mtm%S!>Ero)OwnmE7Dv~~IZ5P4T&T zIH|}#(xC%;#}z#Sba&P^{j3myxilJQgd+`Q`MboOxmXsf<>MgeI|jD5mz9=Ke^41u z%Rna8Bf#g=gQF(X02fscn%qdkx*YJzt|+8OD%gg1aynta+WbMda=eFFnVFv0H;4c_ zGiXuQ>}@4FL)+Pwm)F9-n#W7=S|aWyN~{fjmXz}0g^*BB)NAY@gdjJrY1)y(Te zm89nAcBv*moSLvX(o#gVeJ$UvR9!*nSdt3Q@8bhePc$MQV|c~a7BXr-#I08;bDL#m zWcqo+S2`m~3EOW^ZkC$3`jYVYU;Wr|G^BM&^7@otGWjwexl`zy*t?xT#aziX{2oBd zT#lBH4vF=<2)k6~hSjbQFx(m9tD)^5hbU4T_r+*JM~fv*P{Pk&Y4rox+zH6eJC7}6 zoKLrD79%54vG|4zw#0S|xbauJ`a#=r@2l#U`Wwbt@3vOiflBgFB&%(*fM-nfxvPaa zG-Dt8o2e?nj{xS2gCy3jW}1})`DL0uj?_VkNll&JOBybqDy#N=_OC)6d?<;z)D3X1 zq>uU$z(iA}wxH+MFc46nsux(XNqS|tK$Su>a5qc_BAi}&xGA%^PlYM7m~!nbfYE;8 zKkplP5S;{;*PV^mZHKL=j6HaKS-v&z4sWp~6rg(X+F@w&5~m3vugc_F~kBF`hBk0*#52n0tRV?A6BTHMSZJpz!Mp(9MNaZ)A! zgA-tXX07qJ9P8zqr&UvPk);OI_CH_3>FNZSeh644io5JG1(%UNVDLfArP3^0mINyv z0fX}*Jg2c5nHHeP=x^FpoXcIkyWQQ7fM~@4J=e4LXV)F34~#{Pa4HG`R#7StyDR(e z&s~DkjacM3Pd*Ec*PU~uSJQ9QX6G1!N^1(5wxEn^Cp4c{vo20VRp$}UG&g_Q2O&fO zHB9J1G{{hR5OY5g6`)_JY!Pg8=fq(J;J4nQ(k)R-RhDyCQ4;-t%8sk5A_qbX4b?dy zJJK#xSKKXMWcm=A$%H)XYkz+ng!(Hx6F=Dh<`EDnWAHxsaRKH87W_F5F$Bda(+t$$ zRgD>@lM+q}CD1b!t1-2_v7hA+hCT-l{TQ8TN+Le`CW@C$_RM=VkXK=P-((H0z?N)j zF||UmXqwi{@e%TI&fr((-DAxS36fiwd;YrOOko6kL#b~zpgqCW z&sN#IrXMh#3Js`LMxlLcfi8X5?#g+I)R1qc1FDM?qlHyenbWnC`_rEv&_Ee-KRp8U zOOr-?9|0@nCp|C%3&r@In$JMJ4{-msaDApXl;5E#UsC39LbVWRUoUf|0Hx!CGAzcZ z{o-_dD4u@=B-j`R_c3;g0XEzn#3w)0bb#hQGg!(RCaJ`QH@bgkzMbemEKZ83dIW60 zm!Om++w7Id_S3#ogFerU{vw*GDV21(EC(zKoF@5*j^GuPZvIq+eR~+lYO0@UK93jU z7`*+#geD%Rn?Buj&N0X0R{J|}JL?uR0PYt}5FRGmgChegvyGk)6aLT|DI6SmhW0Ji znV56PjfO-PuEnWuA3zTT_c9MqjeAx#s25tq0qxga!(D~_c;?`uz#5V?awAr}Al5;H zSAog6_blwjQf>vidOh2jc{nIi5Dp0WBOs4$RT!$3iPURWp%Y4l6k<$1Vco&whpU#f&GPQP{z!GJuzbw(EaV* zYa5JKgz#xv%v>=bCddWGBIam4|CEe=w-C;lElfg_{IL5HZc9xj7@_@6EyAAtgTGTv zQ*fO*vsVe|^#loIo!yOddjz42`S!$V_e%X|KrktcFnZ?=4ZrT5_x--|BLEi!H304} zUO%8P8QgIM2%u$#bb1LN79O~8x+d+uKR12Tw=?d^bS-&4q)ZceqW|vgQ&a#^pj)lKke7s1(gVf`*i(LT zXGJZ@N`M#cKY-oXBj;zHRZf>5llMDDHU(HgW z8t*bH-dc2-T~q4z5=<6s^$0+aTu$osv)hJ;K40LT!6^JH5d5X(6h>20N^|kOXUAlF z)j=$uJxCkB_MMP6QFongtJ@&t`vak+77rY~#%i(`O{+3kej{qgrCi!_Pje~q}`NiI|Oyw4&d1+vOK284}w!1yqNTGBW{z>bO z(5;qA>jm}0g}?qa0>aAPSj*mttkLQmeZm1s-`I#H43y<;3+R~d^AVuW14mo|1 zge{W7fdv>Qe`r&ea;?X zw|v1CfqMO-!tH!i+^(?z>%0AuV~(Oxwd$tg$c|!XaPTAGX-REgVX2MX$m1eZ?E%Bv zPj?qBh8+_$F-P}C-1XTbfa2~8(Z;m`tYRAoWwadcgA}MYStRkv1&I%o)%2W%jF?ur z%J0ZG=t3*&oYRFYpxWaeTt~4LWUDSJMlB3f-WSA$Uic!iBN9zk%<~ryo)l!gfGWL^ zV!wOaPzJBTfPpGCBF7LEd<9;i?S&Yn!_$S5PXw~KLR0QK1@HWVm10SZ5(Yk1xDv08 z7`(}iP#}9#Evp|znCzZ!ppY`UjhV;o8b52d?~WTwsu7Qr-9+?CPN7&5Gw&g1;d7W2 z6^&AuG_$rY**%NO#FP5M#8}hF^=&7Kup%-vN8kLRM?lCX12h++-2Vu8QW@ZtL6S$> z)bnE1e!1Z$vtiI&Ijpbuel_F9#l7{6rSQWobr$wFqmo=lRuOB2lu()?0Z(yZ&Y^eh z5k}mjA!C9TOU?!$pmkD&8w?pLPypj?hY;FbQ#hzPUFwF93#N%SbQUSUz~UqD6@btr zJ_taawyqK(f+wOhaX;tuz#~bH{3mSksgRdT?JpJgjO&>+%cogD?b$_G?>cA-Tuy%S zgdb^Hgoc|6!t9_B$mWl$5b#!CaA^Bts6AS2CyT&+bwQ==q)YQ@C0=fXCufJt3)j?@ zb)N9CuXknvehv3&o{xZ-melVBLqUX)F`Jfi&b**WPl9zi33{$GK6+woJT#o7o#LZ9 zccWYII5KzR9QSMO=POA7+~T@U@oFFCU6ORP*Z{&^N^xa1Zx7{h@%l-y9Fn;K2=w-c5=1Ar$VOwW-*K;vXM{D9Y5a}C`he)WDOB4#9`}Nu z-|5f&s9DE)i(JMNg=*3}mG86z3}?lJAqV@57S!8 z4l)}^MI^Ekm#JUBMM#@g`oN%3d@#kAn11%FZ<^v^nOf{VPXI3=+d0uuKwSE8;B4)C zHj#l6z4(MCir_0ZBn6j8KnIygy7zYQi2ZnelnM7@XW*UW@$R+qY)XwoQxDb%%H})a z^2eJ5w%u;+`}`o@0Bs;;0hqG}G)-XN z&RMr(TXXUp;uMXOJ~r0lrKclc)IU&s8q7W$K-qX-_V5DsWZ{9awRn3CE!Y>-Thc z#+?OVACV*F45_@RvLR|=rj*@uFn?&(wx~GQkhi++t#$b1BOu=K4Qqw?!7pZ6=C%Az zzR<+W&v$`qCPTYik#pZ~sr;(8AzE0*5>ddryb;iGIeeh8{-lvuLlFwZHPS}9Bhl0Guz9Ae;@pU5>qF%`$2-H5;Wv?coI zn9Kwkt{Y`dz|1J7_3X0Bn!HnEDl=B=1!Ffp#4SL5F^D|C09yJ8AcL8rY=w#$dx-%Z zZOhvw^Lvmh66>*fBQ=#usc;o)q@W4*yGe09jXeYK*xoNXu~VkRHjftSaP2oC@}lf{ zX&b%$6HJ=q49lBLoDew|g@R<^=`!OKVT+W_&*z`g6BpIdG}R2Cs*iwO>!B{RD|QHO zw8ieEab*7Bk(l^>h4>xEph$3TLbvZYDYS8~`db`Ku*=58T7T>OeKpcx6& zGF}qE!-u8~c!5oo%j^jziFCeC?hjEpDHYFzwgybXUM|(!f0z1^HJad{3bm=%d=RGD3t+G zRnf$YU0z=Kpasju1BI(7U?MAv$4wGKL!un(%O+Z$k}BSpY90B#uain9hhLxndUc1N zP+!Ui`;J9iEE%inuHO99O}IkMRxE;K`<5d5rxxh&Jz?G_3#8dlVkSwz%6u)^gU44A zfxSFgHO}mbzKLj;??FwJD=B@M`9%Qr557sgBg9CKfT&T4%OHDB_s*Qxnuc;C=`;z* zFD4E#R>~WD-|Ssi%*o>mVaye2bhk#)J;R4h$e|#zOz|pC3zuhNOsg$cPxKNX-pgvW zxee}y9$9edpm6Awo|wjOQCi)}51Ham^bA#R;^*H&{qEl{auzDf>ynS<-Pf7M2NUm; z(mc6b$t?IG=l~>NU#d$F?8!WK0lkptU}ktjQA2wHE1!pX|2WYuq`GxCX%Nyt%GgLJ zFP!LEzqdU}^}T1|d6+3<9f7}PIe-V)Zua;ichW<6A17`t`w{X=_JOlKvK)I1*l(yo z0yppO;77rkS085pVoHp!4i{g*qx^fG*uCLF-Z!BmU9OHq{sID}wnMIIP0qsqW?S}sg@^Q$p0^RJE(TU|e;BPO;|(K^*7#w-A(@AY){W=a zhU_q|Zs6#emNZr^ON(SjeF1K%#Xm>E- z(dN^(F0faMW2v1+v7^H;=Y&ShW_cW1c~+i0ulyp)n0dYN2La}!{Z-0~8uU4!O@3l~ zbd;F!uCN3FG-zt8KjoO)NU8gIs<&XqjI%a=V6LFt3X<2h*^iH9zzOL=eDg#ZyiY1>T zhV}*D6rKPm7%%t@R|GXVQ~)?Y^W@0OV6n&>XS4$%zL-hY;cI1OK`WNdY8ZlN_u~R@ zm1*Z7b2}LChlv10A`@k^sVHtR`lao!XKzRG*exwK&9HlYAipBTD0j-l zOm~e?HTb+8DX-G_HVc zi-T=k75zr&HMsb$Zz)eKdN9(#fitq{!hL1@=^!a`sU8KY25m|U=loh*OEto1dFQ)E zjd!khFKoTH$S=4O2%zPcPK`k9$pX%tTKTsP4v&`6pQ54^X9FBZ3qc-&U44 zIdb<1kIv;iiRaQWoE%qPcH29vl(lfQDU8y^0b_5Sns#e&2MWFlR5jPOj4p~)N4qvVLsCO@C3?~I&S zO9oU^B0mx8t)RgMT2(3cMtLqgyzprm%&02vN+^nI@}`t^CJYe-#CEI$09IegC7NnV z0zAPPJ>Kp+RdnK-bD9s+t?hLxTC#a7PMVxgLA<4##IbvRPyC+P8}2YAST8+beK*Ay zGxm3?U;oa%dF+iDCY0V;JJpLzEYGy8@rz)VJK*UZ57fUe7zutNCu@_(zWAwL+ZDIU z*@eCnPD6=RTH_yzjE;=M_@x-L3O(X{NM-KBUPTA}BZ(&^YtmN;gel7|S{MHoc z#3szi^=UR^hx+(HpT=JH@HKsbs98=&5rq^qWB9y8^tsDj)y0Txih*t~O4QZ#DrmrWZ9iUsFtfgfM1 z92%h~8Nxcd&#in433y{hmsc1-`#(mj)KH*TYa=FGvi~3i*lci(yx9ng;8B|9m3*2i8{bxxh$lWzg4}wU3!3*Y8@K4A@ULl6C>q zYGT;~V6~stV6>gZh7zCffgr+G6&ZzAKHKX|io$b667}MV2C7fk%WCadgz-6xFq%f1 zaL+jS4~H$pmLjYrwu&K-@tLc+F0H%-9`;ma2zGo~<=U^r+xHLHEs&{j@b1Cc@ay)J zY)A9Ot!wqsQOuio!NySUFY&JP;X@pf`aM>`;j>WP!ETI4K!o<%D~RR!rhP5tQSdCI zITp9$imK#}i+K4-QXf~ejtSeW82kVbeb7RG#v}OWgYbGyX4jErE?3m_nA=7(otmOL99#0-F;FI ziFDX)pwx7mH!=Xox9x!lXyaSf+fY%aM## zD-P_Z#sv2aY~kobMf*!7&aVcS2XP$QED96T?><8PxHZ&TCkpJ$DLr!Prg9 zB%(l^^`qHwE1b$aI-cXy5wSS(R8eR4Frro=E0hqSVKzq7#H}ZtY`Zn@x}QPPi}RVH zI!Q_)QjVhcB{Xjp-!n54WpbU9IKSV<4$aQf=|8MjeB!)AHYwZ8kSvG3kw_}G+exo@ z-{8z~@#~2(G)-~Fld#Z7zp3^~Ia5k7 zT3!zoquNePkM+kFS;mQqfL=*y*A@0_d88rl2+4 zN4k6{JB~SN7h0xqdA!MLyUIsWK!N#${0c&oDGl)So{NPDS!#UZhw?MmwaW^^i$}nZ z1@DoP#jYq~J5FPD-4h1?)Sks2y~?%(MJkI> zBf~!GA#K}6{pJX^z4%aFbE6A~w;n@MPb|JIl+u44UM1;Qlh#|53)__rZ$ zIJS}zZ%#i&7qHXw0*nsD%cYO#?$;qdzRkUqJlnuwa4oMxXywN-7)gg(_nNSpVh0$^ zIA5^A7hH4Gj~o8LwcuG$Mn5rj&c!(rmyod5Pdgl%ot`+yQwe_n7=`W#CYH_3h9nwOE3_g-RJLkwBaE^H(gsSXN22$?) zisuNhF0dgqSUJw4&i+;z+&$XVrdWi*pcdgI1$Y~!Q)3I6j&>H)1v}p{jRc|Q8+T;P zt~5R6lI_s56a*BIhRJy>kAnP~_i0OM_b`7dBDA~UxvC{vCvnno%^}FCQ1yNZINB9@ z;I~=Di>m3gD6k`)wuVU0bP8Kn8ykMSVV}S)VoIg6*nC>J?4F9~B>c7N#Ch9$aO<6p z1QTTNfueQhvQg?T>rX=j&2?s65Q~|x4CrI1z&~4#9Jg?b z--d^D2ayo^;Z0U>P26;tsdSohpa!Q|S9g>xoucE_%fm7D5>B)+j9zkqqc~5Z0Xo^k zW_kV@SAq=loiLZtlIJQ^6YNR2P%W@Ch&@Ocd>zy2Sv-A}z$e$!wB)J$i?C_Uj#NwT zlQOo9MQsVo3df&44+@pQ#e z#&z%(#qRCQa22x%1 z8|0%huQ)#V+xlOazP(#Hpe9ZHX(-+fTA~>j z{LYb#0VkrI@RZpa+hDX#@9jz8KsPNIWOFUjoo?@M;cD+MmeR*jdHzmrg&0FulW4DO zBZE4sgNwlawkO)7q4c{6ap$5nAM)Mv90>h(+WCQwcJGMTVP1OXHZVblns4qhP|NTe zCqEg#{eYwIixO|N%me1}otfAjH-y9Rl;v+IT<8H$7h$5opX`>}iz=^mL^cb`?3`lz z`JS(eoWyW5?XLrv(2$y44NcI&I-hr(PkuG3Vd1C^>WV~2Xo#_Q;Ntr4(U>&J4AW3{ z^6hNU%R;DADpu?$OiC(7-rhzCj_>uyQ)LMz;%?;fidVY$fwCly;=0mDW_MwUy}rJs0a>bWL#%Qo~iA`MK^g-*ce8)BMeKq zAC9x!xSl18zNTip&+@cQOtaqUQkJz>#>1*k*ta*ZFp4vxc5+;D(V(|Rb9o>>48!|u z*F*6@w7gp)R?*GAbb67Gz5z{>tdF`i^ncMB zg~1t6n5FF<2&N@z5 z8Ho-#8n%m6U-@eAND`XV_6h0W))UV_;LEnf#{I6wT2d=(pO3bb+@U!kN395b;*ji~ zDwq}2tPpB4GTdUqUoT=+*ypiUsyD{@VJ|X4oy0vv6~MGF{N2WzI3*fwK#k&fbt|e< z3)DlRXKZRCD451Q*Ek%;qGN-t6vCgVYr~MiaC$+URs(wiA%OnUgd~LqINBFicY+lw zR*osKy+4gppub6+{kl$W8o?GuIIx*t(+wiWvn$TmYr5%-MyS`|&4gy{HicFV@MqQ%3arCSU!NAMGqHrrA<}2t}&iQ?+C+GO#7H9RONG0DRJ)fp7i*ZM_kt>fZ`iJ*nbOtblCI=~e;g}8 zM<_6){H$zxGOr1^N)&<=B+;aKu>UIIiCDZ=`}4x&YDCyFj1@yc*zRpAvxJ#@yc?hT z#}DhMs`85^ACj{M-i8TP-eqY|eUlZr)e**AC;X=4aqg>ZmLj8R3?`{^EIk4+FQK3c@3qKPU=zqy-hQu5O7LFLYAR3Q820bdbiPc*UqNR|G3sxuYcv|_epzZ~?4oV@%hD!)enXkHMFA;=?( zI{d7(?lb&uZUB_Nk~0kwKG1Ty^U`3Uj%n_?obB>j@ja!-v(T~dp&%|FKFvG4_=~lP z_>od+5I998=&O(2eqmipmY*2<`dx^9%8?57kgjjT=XW7u9u+R^iBhYQtWGwmbtFn$6Gz5IYbnL*sc*?q}5bFcDT_EDcawT6gAQ|liv|Uc}GRp0R zUR1bjKjDEMls)@mZ<7^8cCPDif-i}!csoyW)S4k?(Pb2O8lGRx8a<(cZBBxT>SDK! zeCTRqRngxk*?&l#F6KrZfj1nc{Kop1pu_@$*Y}_|ewPPdD*Kxv9l(CZokR)CTE4NZN*pxZeO>3BgkDIE^*WIW+LGop=j z#wr?OXYf@^9e6LhW#D5z`Kd7p7iI9^1nj}|y@QkdFHAT3jTSGTVQ<&$E1@(b8?u9v zvs6z+h568L+*7P`3M$4lJT}regfbAkAz)OhvinXCGIYfmCe~apD#e(+n8H|q({sIx za$u=Fc9XK>r(6FpnXNM4gS$3t&>P(BQ=^e@(8|k6uIY8(Poq+co(Zl>dY6xtziS#5 z9icnaax0N9p`{u3Dv@?6W6x}x{dicwELop>nF(1}t7Ju{WM#20l63q=#Rq3POVFjH`D-bV`CtZ5OY++C2vK8@48N4y;)Tgl2+$TWhBP zMyV*u5X!##^#BWqK*=Btp;VEIH)q}^*@7jw^14MrT9z86XwU(fv!SwZ81-j2D0$(M zh>jN*VORu7O9t6-As9*RgHg$3FtI0&t|4UeOAk0^z`o2jk9~GBbGeg^A#=$^o&lxC z-~y*^q$&4BwF^<%-Jo`U424Rp?Zb;%&n*N~6KMVUP~GN{;LLZoso6CQT5g53@+W0f zc4N9OeL6RaX8DE4W>U+%e9K@~dtdV~vDTZu%OiPiw}y|<1yF)}Z!mVXCk~Qod*^($ ziKsn~wfQybMxp4d(-)5Zvyjv&X|zMF>MpHkt)8PjF-3vP7m)fm$aO4-`^LE&7hdS==!vZq5$- zl&!Zf7GMIOp-F>^-Vodo%>|AcxZxd+-@SXAh*OH`sIG?O&T_1xzt~Ay=Civt81!te z6Q{H|tI}sgGJ_JU0|{&TY3EE_Tt;NAHaeMOFF~C(vUwMj>2yR4X?=#D9TGDZRuZ1C zdXY0SHcbaTXBt$la&yME5qVK_ALqXFRdW&sEM6O1B6XN5#wbiz2;+!U5CZJCjUu)` zC3$Kscc1&S(LM=pLowKShq>zQ+~;VIP3M&eEAF;q%B?1Ef^mwr7*2F5oK|Ga>g{y; zAdIV`iAXD-mH|^V=&%|wjCZjq3EgCM;4>8UT5W#y?72=;$7E`$kh!86RVzJhh%Y($ z5O^!};Ta4lK>?|JKvfWaB5T*rqc(-UY+D&eF$%_Fnew3jk?BiLDzL*&MVy} zfL;0&5=nb8L^Ud`uPn2~*rcY`O5VB$EY zpe`its+<){6)B7p7M!lxC2Ul7JAYQdy{^jZr)~eCm0s*ttLxiGA=9`P4$_dOuY^cW zDQ-c9atqLD|Lc%PfLU;I%?eGTYhc`tcg!!nw#Agqz7A!oO_8gW@&<1RS8v{rSk1Kwe= zASt+Ug_RE~=Skh$k)?bjC$Hcc3B#cB(~hr06eb@L{~^7gv`zTBDiQs#$~Zn9z+9o= z)#eF6Vs}l`G1KU{U0}`^+L#j6UMAxOyUWPfORv8qASE9%hzRJc5zxfT{LVVB`T>nL zh(GmZ21uK}#OeJ5(OEES%^~x43)x|I%5xngU-~1J1QIhB^|YmCJB90yb+s5Ap*oH$-Nvid3MQzdUNPU5d7|>uQeEN@VQ9MYLmDGT~NU^LlFPs-qYK# z9$v^rS=GY$+ii<7>ZSo12-0puNG%kvwDjb_Cu%U5Nr2VodiRhuA6Z}WuG{)um0U2b z-H`v&Q}~rQ-6y?bss3}?E!|`xd`8b8HN&+LLtwiJ!f(Jhx`z}hEw$JO5mB5T^u|a) z=($hJbtNr1H_@vM#M z5ujMkR}u7WqPHe0fI6?_&g!J+Dx`e>o6(5Jvi0+is9%ype1ELAzT*nEu@a(i4kyC@ zdgr+_@*q=MlzA1Eq0#Ciz_S(zvc4duZx?kOjXO)s^)0m2M2?$3H)4~ylWrTiN(xu^ zdIZRIIp61KQU;kma}m>uc~H7E9h7$lIL3_7(c3HME_a^i>zoYP5{rW|%gL z3XjBfQlR?KOLaKkw-Flza$Q9@zxRRP?f8-R2mr?$6T+o@AKkX3<^$=$=Gh`P@rAOx z;5q0LyTe~!47I=yZ^ppcx1fGOw42R&0;uy6;#lt%TJU>W05r`?3nH6WG}GrqFa zjY2@i(drjZy*!*E@HXulJ^q2XF=JyBMHo^Qt(>d#$H0*9_a#rrHq7 z+NQiXB=0RJjVD%>wNZKzKCN-2e;f6}x@0!gEzkWTr+$k ziNJ?_L3UZQOtV_-%ytz7iJxXfga-Y92iI0TG)**6Xh8n1z=bdnY?M$z1J)B;Cb9)k>Df^nx75m*}P{lr0@A5r*_?A`p~3sIt~BVlfex8EV)JR z6nf1<{_?pNMdr`*9sNCr`lEN`z|(#BZS?)(T)fPt5D;CDa_}4bbN@RrTl@yXJw<*y zzGVgb1kv8h!pdo{=+kYA7ALjOfZvZ_pB}Lk`4sN*TaaxsBJG&oC}wwTm!uw6R!Ejo<_V( zNtZ0|@d#7)-0j}i1w0Ya-HV11lh`YBt$iFMTt5o7N${9t)&F9<$|Le&4@HoRCAoE- zSLzUrta<|5g7pFNHQp_O13SU`YX80{dzG;cTCuCJ+nEKDH#U&tY3pO=`O1pBf2@>p zWQ_aq&N0BDGfqhX=Dq7*rfXRfL$YPqs`>RiqBS1-#*O=p9zYKI9)Q#=MsRvPknI`Y zV6*!3ImSK#*14 z!CNnmjpY77x=|ATV(a^TZLkd+mQ}_N&{B*=d+mI2?1`hmVXpOC4svE0v*h^Nkue{k z8Ubhm#Cb57xEch>jA^P;{iThbahp3>CzdH3aO=5j4tt+Vpn32)3pF_~)n zJleYYB=vdA?iB|Lx}%0sq4Ad(RG|1|1>w~1|CfECkU5vH8-M>-0w23#EzJ>c>HoCcD==ta2CCvhTu@(~i4+HY7 zoxJk2$Zv;xw{tEJSKA=?MXb&*jWI8^J*tD^14wFbnm_%>qW7|=4La0AwG*dVhW(sB!G?NI;DDyCVXGW{r z1-8(fq|`i2>Oc7i(_SK@ofW5RM)F!`Ra9NC(n^nHFCKYHcYODszOoYka8TtHDbLEODvZuk( zUuS~(9i^mxdh-bIFS)-8j&16(`bFIGv*1p_C}{e2{s4#y-L>ih2PAHFG<1ExS`h=R z1BCXNG>5ybv4(uT1c4RlQg`1BFB}6D{etr?zW69Lf+3Yx)+=@!L@BYLM}Q5E`z~5! zH?B|gU=LO{LbYwXL#7vtyW=546i-*0mE3=$=(@w%e7i8UckL~0DQfRcI*qETw)Xnf zEU~v5L2GY{nxUxLdym+$Brqjo|O66u%k-&|L&a1#2T^@=q@f25Z0P=f-~>g{;>x%9=)KOlFTd$)^6+R^Dy zV&wfcnEbhMT$d99u)My9q&V^~eI^BFJoIZ>=O(5kmU#GL^OAgB`)g29?YrBOE>#eg z6$i%Xp&PYYQsut+*iHMEMgkYb?jG}#luLIisH9WY#0w_0=fnI_iX-lXSjo=M zdgda)xNn_)=7Hr?(x$g(8>7U4?!)l*9)mUY!%;BkAJK~FWdsT~w863uyd$ra{tQKz z7>1VR=Gd8B82mzH8s59Zf-GDeDRss7cWhfx-sa&0vj0;!ETc9&H?yR ztQ-S8XX&XPx0!;VD1`cnsxG!9MM|`lgq~bo69mFj1)^S0 z+Ma~|CEc30YiQd>PBpA#pr1j1TrjeE3TM8|!SG^D{s0=IM_?RIR#NroSC98^nv?Rx z%fcGQ4YS`PiHqz-v@~hCBbxW1O(VyZ==06!P8V`Lmj;Z&^>-)}P}K(%0;F z?}_fZtk+EadXw3gLZ-%J2>I>ZccWf=9FI(<4-W3>Sq$Y5u+em-FkEn7HxRE;Ysp|t zmI?HF-q-QKg4H5;@NWSpN-+}ukdR}ZhAIb;469i9=U7#4h6vJ3IO64eN%*IeDEU(! z%XLq8B{dRq>v#EX$xE4Jq+>5I#@nQ&IHa^EzuIYnTlIS9b42f#5ZNil>+P}I7xKJ-EGjOoD|_jPIy@oJ!DHH_4F9N1*IG)Q1G z#`kGR-NveU2=>f4E>z1yDG&5G-prKtWo%D*80i(Ngi*h00CYZBn%+RYH>H}1sHIl1hjCD&?uj)>#`BpOCwH|^xhcW)Hv zDIc_LtVoC7Hi8|MEP@+A9Wk(?v-gBq@EHTVte5Z6ZG?u#YVaqF`480qZUkBLP;^XF z8-M>3PXRB8DF2sVNe;2!?sC8Yd^SX8;&knNMOYR5qSXVGF^<_`=`tSEicp0ygC4O? z>oh+ycnEC|DvMiZ8jY)<5^krKDpp&PMS(W`kAtv=7^XQSED7iWX2LuMp=s6_UZASK zNsVj(v&0w&uFjk#eT0sl51Sm!}898%3-r%WN7WbT#1 z?ft+5>oG*rS{ST~IYgx+1&b>7H)y*8ZL21WEV*5+M1=(4zc{}ZZ_`Q%5AYQ(jRR2n zfW&`9%xa$4w*kmrm8)acY7BP3>~%`@cW0G6j|Xcu$Pf8O!t=B#y`|kS3RZM47o=zfSg48%^IQM%8>0NG;dTMIqV% z(RDT1XvGl~y<7x2w6XiFQ=rkTHal5wSZd_V-Yf;O&y4c%!AQPi{Q zjw}Q&76tRG?CVGxwEY+KU(Pp?q?g-QlhS=6FH?`-kU3FNtSlC04>JH?*8S1xleaQ_ ztMY~{FfU^ms8Z?&m9#)qPdyem!HHxbGx_rT3K@8B8*16+E>VE$A>vq~Q z;AMEsiAIK6*x$?D$~s=MPaQm;dG5^Tvd>+Vcz?cfQe-#@h1`DnB>^MI&p{Ep((FaG z)3q4EmhwwjI62X^lyjqm>|qqX`MSC6;82c8mN^_Ie?uTokX9}r=QY?474ElxHX_Bk z#e)0W5IOPcPO6QE+WvRxJ&%p=+2#??mJduR-z@wziP|=@XD@O|aIN&T<#jHhOWij@ z_9Ci@9q!5~|*akm&FQjQ@4{6sE6nF@s@$KYRM! zodPprK?puewJg)P$um{0vsa~$Q>FI#JYJqHze`*AwR)Y*XC)nheJ07l|BqtdQ-jwsoXai37s@uGzuUL}Bw9x)7{ikX>G*X&_cI>uKOD33=h%d&(b#l(COMvrpd6*=K-X(ua3298XDlm;1&BAWT<^Jgi6`F9kp08{1*-bmS z!P8zF6JCF?1RrxS*nJhdpqtY2;dk^DM+D0^+HXsIk7Y- zlc{R)hIOcAguVW*e{Mv@Wd3hzud;$4Z4ivGf5b746?sa}8>H_~Kp%9wvtGApk7URU z_;S6h;$T2#cnm1*#a()SbBV_?Feeo5Oy#i{jakBt*SZz_t^C!*D7Zg(wr7al$?=8& z(}QCb?T#BZ^qSQe`lu=b^!tvHV{)S>aea{dbvlC za$*F#4=o7UjIXTBOpPszPDJfZBx7-)WNY};D!pv_MQwf$111jH7b;*r;pzY~sVSAV z9AK)do1j4*j1JICnXvK~_1@cDngiBLMjwkoK|oq(BlE%!V5PQ5-9T&ku8}JXSK-(6 zvhCXZV#z z=&@p5dgM>2ke0ed7pdk1`b5nw0J{gLt%dNTe4J>l*d>eGpFKiP!CMc|7t0-SLVHJkM0mu*zubO*hYgL@ zc6-bd0^)cSQ|AXaHbRfsuOQd%XDTQY$M`{EpTj>-u-=Deus-PW%Bx0+h;Wxx=z~$=?Hljo+d9w}K%}LPt9##nv*1)BBknnejg}2UD$LGCsQY;Exqh#m2q;IjJD9PiO zZ5mvCw)?6^h6fsMHRF=T3!p}g&%Z0ajems-Y0q+Xgeg67c9ezrLLPOMhU96n)GHctbb@osnqu4}k_VJ(Dl4(@sIrS8H~*+=;w5nt#i zlsHr}*mpKm9b~L1bC?5M&JlKLe#mx~8%Q%et4X|Sm|GJhSy+>cg!V$BteaXtYlVm2 z>pEM8I~%N4IxVfguY>UgthbA%49Z+lP<*yl!c_M5$YTOGj}?ck$^Ncc5BPu5@14kh zBCaN17`F83`vIR1t6dndHUtTn(+Wn-?|w51MPY=R${X6 z&ju^s9q%jtSX0!Ltr&Hl@z(y4s5IR@#{YuGciGfy&2O`N?m7b+Z_AD<)fbDMwu;I| z99f%dn$TAIq^~$WOKI4qd02*z!Gv;72$Yd(=Dr^8deo2bk98(aEuJf8PgMjAei{N& zYVX|^Zy@w0VbK?0lAh8ZR)n{-baiqo{3F<%kT!y}6JFUq)|K*j{DMD_ly;N45;Zqs z%~^7rhjXm34qzWl2bt-wWDSh*eLwZC{Ml;C57O$16nNDs=PbcL>f_?BS7rH|HzWE8 zii+38oCaaFK3=k4t_#h(^1*LRd`(|8{n_VII1IkFucy`Wll?jssGPOwc(j6Qz4U5Y zlsk=FRGfZR<819d|Kg-fe8%aL^x>;7M;r!cH5BiX^t`Ma-$NKLzI9pt2xxqRX4;?2 zRhHwWUfuVQ7W^sv?7;O)!s|AURzqiKCn$it4?qA|xm-+34=d7x| z?W-fd-qtZM8;zePaKw@c9bE4}BKS*q{}PftBI_OgS0LTj`n3snF`F0g{T@Lhk>8}{ zO5^3jkL4lA)6bB`jbnbgs8mFo_{BWRp^mP?^q}EUU3a4K4*1c?RH5Yf^5JY7Ljv4- zq+1{PWdlW^U-z3dfI%O{w}Pq_{`^Sh%MmoFD1}G;wwJz!9}|RaNXBT$qhN#jY?$D+Lq3MKG~~dNwNt9bm_R&%9#>~Hirl5BHX*pZgoX0q98i9x zsM8TH!9MNcX(eflHTpzOfa5OVGqY^95w)Ga+7&XKDHJ}%-Ca1 z+B;gZ#S%;U&z%YorpRXxzAHJpba3KgNJxGHJ{Za=Z8AICUSro2FbgaDFz_XTwMEb^~&*S(^#v= zKeQzFBy^M=gwof$;zz(Jy?;c%gNE?;vxYSuVd%bB71+YOY#bxjVjr&M$p4p@*XS7$ zDE|)m{|FLrIm{4(ffZx5HjzVqzT;mLzh>I~6V zF(srtFcRA2AKUEe|9n9#*a)6f>WTPvajUs!<~!>yH)iyqq|Z6xP5r1WC?d7;UYsXC z({+mRy{l8QU^KZie$JN z2}0>KOQppF)O{GPBGUHEOfgJpB<+ZTsc;7uK7JX>p$>9=jG z-@<(TZKjH)XjMId^g>HV&as?c<*OGpS&Ro`? z{?&Z#`ACCog_IMtmyv1qIK)xC~-ZU#@C@B^R< zV2LGL15zqC3M5#j$VKSf|ByruIt5|~0~5QsV1v@ezaXc_uve$=aFtt+s(bVfr;UGG zqqGwpw7WtO;=C)dK0jA!uT1s-5wV&)of7-I-EJ59Mf3L`=T-XUk?QxYA_Fx0v(?YF z{{XrA;hEW=NSeJ=;#%D-d&ep=kK62%`7+!Ddq;VlKWmyk?c&L)=LY*#h%zbRDgu&u zsHw#VH*THlx#_INmnaO&}0hOQ2R&ZPg<~$yPFw5W}-j!WUrl73~;dUl4;x)J^-tnx9!Nh_5@-X40}XDodLFJG!i~dx)@&v$8k2^v^t=4S z-^a@GY!!2^M&|NUcqkna-)8DF20#f-#c*we726!1)2X8@I#eR~6#*|Zs6COVGD0kW zf8t@M-JdSzpnfee`o!YDgdBVba{VE~jce-Xe;%oCFUKv?ybU_P1eTRu8N#id;m)C~ z2rXK)1HVN2Sn03X)A3oIR-x?wDC6j=n2Yk^D=4i9}zpA50se`9q-WT4t&+D zQ(awSB<#m1kXE|C!r#W2+ExYegF=*>bspyEIUme$-WRwI3LDn9;2UTT?bEDw{#tI3 z?m8@*y@5#EI0?<1zr+cldZ3h>cIVUui&dpl+ZQ`|-@ndt>zwr%!f)N}CiR4j+oSfU zA1Cz6hkW+`ydmw?zZ(BFZkdN+K%T zNaP_^X^Z1LpE7@vqXAR<^<{e6#t(IT-qH*Nr3YiTAi#iI>ax;RiaB}Zkj8R{6_6@% zN~l$~fTPmLr;CvM^3~hf+%nb)y5t4P2&TwxbVi5g4rcL?P+LZ={lDiR@hb969jOj1 z>kFg~$Q@Zc@NOM`MVJXY56?iW{mtSw2))NIxj6v5>&Kbe>hZ?sRzKxo&pf|c^=>^_ z8qn39V>OfjRWz|hW4STT2b$AOM#<)wST)JBlr||d<^wN|Bua_s`dX`|*0{wrvFc)z z;>0_{F-inJ7)2cs^>yQx;}OAhflL77SOvlh&Rrx&$%6PE%}?T?71nEO7P@L>Le7v! ze$PvDoxPiQ9OI55n^`zkK|5N=-5!<|KCI75xiqd4jaT2q3nIG4CB77KNg2g?`FE~0 zeZN&_JlbhH5~R=F)z7}>1~k{Sz!m#B$1q}QA!KXYQWk$?`t4#geH zV{Sz9b^b6v_(#;hFl2taE{LKbo!v`~QHe^^KC`#D_)YmPVars;J7*hqR8IIKLU~`n zE6lw!zObxKDu(l%^j_;ahGVBP{Pa2-<{C|N`2)3fyBMxg-8-koEnd}X!H;jtLTLgD6jd1F;9m91jarwS86$AFf>{ChI6c~vB~``N$K{KXS@LBH zX2}<&*n1f&(m3ann=R>!6<73Yuj1y`4xJH%Dd-HkHyhv16_9IsTPQ{Y?Jzi5G@w5x z^6QnCc|Z`>+5o!bCeOI*Y!-<-RuwfDUa1%K&-d~hekzhw;=eA80sbSRs*S)YZdr3+ zhR+Qkj~9GyHC^8#7Rk~L3T8gLWw4ThcBLjr4M~8)Jch)PgcJ*hZT)4tv5!t_o|N|G zeF}%~>U2rU-4x`yy8Ej>vzN-xwQX(%W4XYnH$Q<%yz1HQr1`d z=aPy&_2-Das@|QnQ8NjX%5USR&zk;{x8Ouk&z_-b2Y79_Tr?icmo_if`UYj6l1|VK z>ix8s^t_jdplP&y-NzB!E0U&bAEPSE#Q;CwJX&P;cbBMT9V%VScZ0hQ$BS6%JUst) zd}mlQ)StEs>14FgN?wP!ZSSGsCF|0uUR&E=^lbi{#iYYEcByNw`=cpmcf07p8k=3} z%X+aM^E9a{Eg_`!Z}&HIYCtsr1I||bc;WEl^nujckfU9)YgzMvP-Z>6OZ2`|pRK^_ z+D42HZ7WU)%jbOc$v&zGO)@gOakB{`AcFN~8 zl6TYc>VRGduNoPef3OwLh00xDQ-G+U^n%4;%Q+@?j1yd=^opW+A6icOMBDCwAh}3b zY%!sS?IE$iX#|N&oDaa0irs6hENigC&6#7|W3h@hl7G9{QYzV=HB;jjgd)NAgo-*q zAE~y%gIuU_laCdb5Vv(`YL2;<`6{R^5G9bd^KRmfw5USwYn9zf4CKhO_;?_U~SE|OD5p9i^(VmCscPLrm*d-Rnsy2e(pzMdq&wnhvz&ITm+#4W9alhB8Fg9G}pw| za3iSVMNm*VoyOGh-(jp;mY&;O%)spt#|$)pePUI?eeG-kK!cy+a*qo3EDKmN!DJ)A zcX{bmzoL$#+5=fq_xnQy{yXFvQ$4!<9hm)FB5=&cyIFEszi$c3yo33M7g=O;3fAZA zYEcdw%!+q$#s4G9+HG=>0sC206uc*Sy&t>wpaz0<31*)U2KpibpsoKkCu@Cv*Qof3 zbVi|=cJ4Mu+J(cxQ8pt+c+a~CTg7n@EQYy~9HaqqgH$#m_hwyj4{LNC#P<^7f5fQ@ zOYlqpUUF`(1M`9m$te$zW8jALt~m#*;2Oxng|{%4`cMG2YgxQ74IGK z!*o6*hTkjW5b?Iu3fG|eSU@$?rB!Mfko9g6Fr+wZd2sb9e)wS^-@2;b$k&((1Oth{0*%b-$T|hW~)?P(Cy@HPv}b7jPN}{vg%E!=}NC zfmE+KODaaWP8C#%1q{Y(+tf3lIA^QRTjJNY;}|?{jDL{iaSB?C2s@%$~{-Pak|W)`7d+N&IWmkF36zGt$Xby zGNCY&U{k5B&7qEc%ScM7VbK+{nL4{{lUSisBi}RL5;Vpr5>|h; z|K9Ce#wZK%xj&92$-edWo3F`~?8A%igl2HbzV;V)dRpK?i0EG^p8B)jhuge|(WIQd zxds;lZupGrA`j0K(fx*Imj@S)8437DW)>u$3o(S1qGL%$L^Lh`+X)Za*M{@9q<(`hD) zmp_l%6wlD&;O#VS0rx348~nh}bE!1`XQ8F0{%KbRTz9s)n$}4teDy`QWALH>i z)gFl=2YVXgq1)Hg$^uVKhCNJpk`_vfopPcYAMAg!O858mc;7JM>T=d@ZTYhVxxrC! z$TAyI*rMxIJxup$2W#8Ard)uCqA^wE{j(F;11n_f?`?0ZY6$XF!1fv&HW{G+B zejZW49dCNU{qwlGZ1%pwxB0al#!BrUM!(-Xya-8L2);`Q*N*_^EkK+Y_3uOD9=5L8 zt|zX@>N~DLUucZR8nu>NW8ZxmnPGN-;+h4rhM|Xm{-Zo<`>XjZ!9$Ni&>DeiFZ_$w zS|finHh0W+NnLt;`PkIgZEEXPu_vNoKSja>LMKT@bJ=?8{D)!z39FVVTkXST|wuflWR*#-$&YpVr}Z{=pD(fDrdF5 z7Z_=@7r_cip|u3u&&qpu2OF%-?i@o~l_3?iEmW~Tvz!ne3iJki<5(ryRJ7oGk5s-1&V(|bVIOTS z$ko)eKz*8AHSqp_W=0B7SH!b@?ayTPa`#zUE?!S`w;JuVlua4)2}i$cOwu+A-0Kts z#hTlEe>9SrN=noBuKh~*ei%*0WRO3O*+v(JafL>W@pi?f9eNAYP!T_#JAoZM1|$Z! zhd0Gaq^YZ{ul&lmXR<{}6-Zs9L{fXFCyj6bTrpsCw9qjGb>>P>A+`Uhd*S$?3*yI8 z-A<}yPJc{V;FZ2b{-!`(0W*Z^;hEEyB;_KXHWY2?t!T zZpnMktL0vn-Il67Ls^~o5#F>KT$r~@W@t$A#pw~00q)GM$!(%AI6LXB`cr&ogp0XZ z(=>+XjV@2zhl*aFxa@ZpRjGm>WxrU6JM;KFZ zjxJ#IkPL7L!hP@*ql5ED&EZ)IL38=*7ptaPxdvZ%{*;JS8vJ!Rh3=#MNJ*qBo3$;m z?)t(cx_v4XMo@NlUk$o1FAYK%d+r4g3J(96rfSe2n^EQ?mHvblf7usqX37u6bSdXs z7=Gyt%Mgu&S0E#c*7ffFr|}b8`I2wYS3}ID`!|~3sxB{|z3JRpi!#mRNVR&}F80(` zZMP2W2>s2_*WuVN$p-G<#}IFsZ*W=%#+yNoBvG|nO^R^0Y&2jie!rvOtGk5Sgl12(fSTlkJI}p_ry_eF`V&Z-6%F^j zKl-Rd4@2NVm#&!FO?L+TET0$(60fF=yai#|=-v$!@Z`SA)tWa`NV_+F#Z0volF&Xb zljq^(X^v3DvD~o^x8}x6d<3$bh(APKMc`zM)-j-04J|Yw;Gj=#EGq;eB~tczp~szw z!93d7;1{T@%dfXTHAI3n7Vt_Kh5fBatnUWE4O$}r`cT5ef*ES-FyB;JshZ3C?iI%Vr+&G#XxVCI;N7+0FGD+Qk5Zw+ z#D_!v8uxD@UB1<;IEqfwrVICIuC@*|Q}@h-(53uP>RlYPOT%S6aOEuG(j(1;#o^I&C^^+57nI%?52xm-|uwdVExB-0-`x`l6*h%??i_-PyAe;(FBaim-u ztbE%drlEwBUl0@TV)T7@Sy~+sSi{S;WYpGrW)&3B|5a2N4jX6vZ)A7vYy<&Wwne%V zfbAITyAq-F0ia$D36$fI=-+uYtt}uQOip@vog?j$-7_AU>cQ9ino-g z(D`T|ksN~;!Z?va*qXs~2VA!qtBXsYq9fe~GqaqlvF#Dt*Yx|%IbtpS9-L8hfvv}> z*jLUQjW7a|@cG=?`mXq228u&MQ+6L+I(eYAovVFh7ckNJNIG0GYdj^eZ&bb#%Y>h_ zdT^Vi#*6?`Vxo;^CF$!C?H4h2GjgX5k9&d*I2r%rWE2?}FnnWv^+85w(&V-%lo*qR z*cgUnNjJ}LSQ^et!_GvWoORO-_+H+g!gT{RkW8PHFt?{l+FH8-fJH^sRg_)p@ z`r2bd;1Q?g|)B*~E}SQRxVnFv;_wms{2zYmc==oXvirE4Do(gd%9;i#eRae&hj?lsblEVF zM&mB#-5``9RCsdBq}iRvsl^OJFnwC9Q@;rO}jE*LW%rQcJ0$#2*E8zFu(!oJ6vc3vids6> zL%;|^4vG5By;d|Z`tO<)JRnvgzVFgn>Xh#_@q~5&?8&@AK!dn|9#)Z%q+2D2t@-fd zP%imOOItHkMrk!Z5fLx?qE#g$a{2>j&ixFXnUpBeNHL~= z4Tl@6b*m3jb639ECjOGPnq<*!5qPo17)Y{_qrcpFX^&Ry-(U$SLrM-w@(dvK`7onH zx0U6~zvZj*o9;&4H8<}!9oNi_6{vR*Nc%*6q;UshKGH*paRqIi#y;AbsT}h5I)_l3 z>blz*?)tw?9iJN4c4;x$iDwLZT(##|@7bZso%BR$SjCtaRiEAEgxqJirTbjgoLE?s zJkq0qS{k_JIViZ-Wq)pNUtJ>FgE)CND{RX%x>pBy7e-a({>6%Ku_>7zR*7j4h&Nii zpdvtDl(`<^+x#x~2*5nSKr5*82=*!7l=eU%or06sxoej80_G-S8b%UVvqy6MKAg7H zd*mNcMd8;P760;wN)+nO6us}};9(-`I^pRzMj`W&S>Z!gZ5By^Rfp^3)6$P!g8vVM z8n)fV(bRouq0QM2AnD=vw$77HBd`xcBMCUXsapb=>aQ>{plk74Dn#1~sxEk<7outY zgDx1x&vt53DM?-!vUal&tHTo)KBj(svjm#oc` zXzoquXlq~I#`(G*!Qj^Y>5U$~FZ8kdoZ#v}(71vxFrR>SH~Lk{xhEEI&z~ntnzaJ+ zDuAgqW+Ef?hLCy%F9-R1ewEXc5fuA5lXdqujjT@+xVq_Aqe`x1S7)1*k2i8!`8>l9 z<6w4uB@M#j^9?7KFI|ZI5A6lFaC5QhbqQ$FWH1$bvZ&6KLHTeSZLKzZ<#lBO^jPp@i zoJ#ih;{I%Lj<9-doF)zIn<^|0DV>V~ouVGhAlVzGj9uOh%~ z5#CLNDZRclTsllD0Ql~G7M^keD^wXKp=R>F+!%;TpUh)SlFb8zE?lH|nDZBve^=Mu z-!~@TY?AQun!bKHM_|BWIs1FZoDgFSUU zqR-baMGq)PSEZD%Dy7pX-c34Jyg%{Aii9L*yFfRSq4lh-6YLSV$KDB<=z>Deses$7 z@sOb)_ddvS<>p9lvWj~Yo-S$XU{@e+&!E7#VAo`xh_y5&>qGBBV6Tu+&M`ZYT~gP4 zeb2N^(1J?3^JL;v8ao4YSp-fRP4OH|k12a)p6hS#bDhoih-F70aXu<>ezUTimU8q# z`|lo(;3sq8%`*hX&%PUQq4YR1W3KS;IiL9Ch0Vx(&e1@5S=7joz_KB9 zy5q_Mm!psa#kx6t-U1FPl38EIqfLN+rv_eG-!|23D^03fK=iArns|P0Y4uBTBwrAS zR|&cN-xJlr8Kp|W574yVm~jE{khAMVaO+61t`5O#Z5M z7|h)|G0HUv`bSha_(;Fc!GR1f8nD(4MtuK(%j^_L{hD6Tbn*4_L6$82yEp(zRj#0Q ztd$~R=sCTlgg5yC3A<5cfQ+mwxT#`>j{q}=tsChHHmN)cUO{g=$yhuoHW{L(OmR*~ z{gL6Ne?+rp4>1&558Bd)tfbws`4^11A2mB`e)AgcUK`aszmyI7TaT_c2bKm4B(MGv z#UbAkEGPa-9$jsM#rO{kL|wdLi5EaT(6SMbd+J+8zUevgN%@;s@fTp@NZ3^b92!Sx zlWkkd{t=DrQyiUdimy6{3LlPXD9ryOx_;0Zt6{Wxfkz?dw5yDMhAEPG^#B0}_7(X4^yUF?B!OmHnoo?q*jaA2K(3)%n ze2q{Bpt29ZxYWg*jmFb~C5l_g!OznSoCnspRLcn|!(ojKW}S1}ADWNb58EaOHuH!g!w zT-*PMoG^u0!fgVTgV8r%@Gv~dyDsNYp|PW2$NztFvYl!Xa@zkrBaHXYu3b~=uK@Qg z3PO2Hq7(&e+q#swlY~-90_HdJ2-gsEDyO^P>f&eg_Vi54?8;v^q*8r=_nhV zPKpmQDQKQJH${uadCSW3D26&K@~iR96SI^ge@(bC49r84pjgGKSLBVfNTB@PL@yNd zUm0>Yj|yxC87^-C_eu>qJ~ZvkRo@8$5E{}xbNM@Jyj%G|NUi}vaw|-r$}}4HG4ps^ z6S8Wbh1-Hlm#7^j>6i!RA5jm1IUTvHBmf!jDI@+t4_taTLTF1kGj{qoCLbf!=FeDp zY$|&gcn_<3KX50r1iBvHfG_r|JVLEBzS?)2pBGLOEZh`RqhEupxA28NwQT!0DK|#*|j$ zo}(ncT&RX{5B5mTRY{yI`Bqo2AxhE``@AY%Yp*^=wzIYt9~yBjRBSjIgVY`_KTqA` zG!hv=-AnH88X3}HMEg~v`$w#%n{~uovIf!!+NezFR|1~i%vD0auq8F;DY9Xo{xePw zxWY4mbT+4htplsH+-+SetPY}7V|o8#r7Jk^w;7tw32Gar`m<5T8M{9;+18_jWkAeF zRKn;_)-xpGcYQrO53My!_cxepFK%UD&jrg?YCzZ%+~qYF^x#$G{Xvhuyd(}edNx|Q zlfmuTSy$CbP=xFaqkCO!9EFeFaui%)SUP9*to8@Nh zOIEqh1$%QcmVItf1k;OoU&sH5aC&c1BS|=AL?Y9Q<(y>1%DQT4UE825zi7i<)+C*A zKGh`9R1bf!I-0z73q}qf`#y;f4Y_mqs5#^TepgZkCtf*NwG$Jk!=z;@weiSqw2#Kh zoBgO8eJ4cp@!W+g@8Z;wPQg%9w~%40=A5pz+8^|!oY?z7d*Y8R+CLr+2Ml?A=gEha zTBn=XxfbuZNvau=_T zQ^NReEiB1P61;!Ahkmxrx!BA&=Ucxt^3XF?V;DEKVg0ynGdC`o2=wMy;9DHm)=TD}|}q7|813MTJct6)xf= zL8VqBA)cN-F0|~-Q(Wx-@%^Va5OUV`ABW?~tkb=&WMd2z4bj9X7MmTwYm$9KF3We4 zgpW((q)0u+WZ43<4MI(R3s0HG7%aBR1NktH13ffZ2!_~Z?Z4fEE3dJ>$GhKyOPj+4 zF9UV3;l`(qKj=RhLxMvw4@1x?PQs1*t!y3Of?21W4!!N{l@C#83XvJew(xWxH~ROT zcMV(WexWJ)PYJ@AqcTKobk0b;M6fx6CZ7wZRngpfqgf;t^O7xIm1K{^#`P6(So?#F zl#{6geK_+bj?4UziQuj>uJ_m^rT(Rzq8?|)ea7SUsZqsyH0Ojh3J!cBOfOAKb z$+i(Bko=xwMlU6|z?~sYYCoC=d?fZAP6JI5e<~NGyNjP}o%30V@ud)sN08IT*-FLXg27?Am0ud@KS+0 z6p8avL?hxa9ndc(n~+wR8aFronWjoQ3GF6rq`7z5TJARo-_=(&lg)OVhWA6?WGhe4 z;fXQnujfbNk2M5c(Zmb2?gG$sEyC8g&Lq-I27Z4^4H)zNjW!le@l0~dh@<@z@JDE* zS!iouAwfbIWcz`2V%5sRbTo6hB|+CCUYeT|`KD#O+bXsD6&RzD_vpmTqB6@>GtLs=^4lsVku~wEhUb$LFL=_l zx?#i?K+$t!PbakG0J{R$df8>{+ogdk=7Dlc9Y&LZr{O#BktmupDqc<#zgoqtO9CR> z1ITdbUQn~j%n?7yE&b>(2q!bC**417-Fgbto?o&?QG*X!l}A_ua%(h2|%exU#`+XJu)i0&`oA@Bz{eAHiKe%GW; zT>@<#vh-$;k#TU-W899; zOR`>@bQxLtm)}XQUO0jvjY84BqNhfn=)@rtk zYj`y^U+bxJ1Pz^Ibpo{XKEF>lne$~$9=J@=X#6?i{2i{m8%6aXoHNfoQ0;=6ubBiZw%XC?NYWSwkQ)IK?g_B~h zJNa6Gw7x&bqM_g*Sl7VpI=2xNR8wL(|^47Q(bW+2BD4~8;D*5nSf zxM6oK>tK?!=twklSPH;bw%C(EL&$5 zM7S2S4}zOtbu=emo(>edEfx>tG@X|oJz3{I6g@OIj`_A)OeQl*zj(i{)SUMd0IrXW zDnnWK-?%lFjyUc*b7ePe_>(qXgFF0QyVogj*&L7E`x@^Op;B2FJ`c0*JE*RgIPJ{6E`u9 znO!Zq`8S+g6!v>j9O`J;r=94LeE&X`zbX_%@uKYPa2Ml6m8eLb&gTxh+=0QrO9Y1b zgJL+^9LOwVY3lZ#^=}ZX0X8?j7(+>$LY^6@h_96nRWuK6t3Hl=E;Y=iclkC@0T=($zv?e$b#|Ff!KfzG6?`7`%|}S*L<8 z6wWbGMqGO9l^+`5Cnvox1rtMEN5}>L(>8c;XH=Wzls0rK^$(ZvmrP)cS%+nS zt)9Z^{kx;BjoJofZC`b`0V+?cvq%*LJSbN|fIjO+gY*||O@wI25@?{h`7ZGNnKjL6 zxH#_oBu#;mqdv}pXeh$%zehE1%~Kb~(1%ZE<@31*H15wyerQ`1M`Go-ow%Q#<@$Xq ze6wqCHjJ^!^}2I1MuaRoRxUe$TZLC+ytnY}{!R#98&y$L=*;}rk9Jv8BvWd{oMiO8 z+V_6)lM+M%U)YBY0;T{=2TpP-37@`rh(4>cD9vtS=yW(!E54#(p;aU!&jc(_=rm_v zJV*a1yDhod>8bE#jasJBXVC=Y2*f=1*Zftp;;*pjf2ZQf$0BE)@3`Q)1-hDS_hM(R zmLgyO09qBjm?y68bSviBcIS3PL<2lbu;y%I5|VEE>T{CCHc^IfF2CqsTans^wTPyt|%NWt@7XHt+`w#5a>c2%e4#`Ld&b zRO1SUA2(_~A-Js_aK=(CW=;nme%`3|nscl*_!!!RAHJCYSvS^3*4TTP`uv=!Q>_Ke zcAK&95zMr$hzUjU)q)xJ(rwl@HC9TGu$zJEe-vGJJk28C&)fU;dOcsyaaU;h2NaM6 zS_oq9Q+)q^e}laIuQG2}aznP~!)<}81+BgbSO(8<_0zuaJ;)}B)6XA&$|E#~fdT)s zxUBWk+nbe^(Ykjb<&=VCpbR68v)#q5lBDZ=Z7M)i6_?K(0D3=fv7g5?DeBZfI=>F# zfA{i90pGg$z2-j6*NgoWH-19FGp)2VeF>u9(dUY4Wqb5U>`O{lGWnY+Bd)=^&woVx z4BbfkMm?!4fTu+__9p!EhN{9#RWQ4aCU-qVp~YdA5$zsf)!JVFVnRKA8>2}+1_5i~ z*_RlR%xtoi6$`z>YH8+Qrd(Fzu!BDJgL^L?@I>C;p1Sc^^8NIv&|1}@pufM<_d%47 zR@9z_bhZep=;zDK^u-ZL^89TO@e`M%jw)36^;TjgT=wILcUC1lMT-|t+ zUi8gQTI3e+3=7+~oSLm3rrf;I^RCS9S^+9kkN(q6XK6WGm;0RU#pUlrgxFkEOUkm> z%GRx*hq}iU6mqNx&2}oBG`s9!eRsIM-Nd)aZ#lyTX^-ibnU>=@_5GXDz$SyEswIEk zr$0rm6}U7^3Al&zUO(4qq2bvzkq$<;wTy)LN(v=J$Qc+sQ@%ZaYg*(Z5SSR9gi%{A zVvY^~#fa-v6z06QNNSitY<7C{|9rtq`Y0|jepjCH0qOP@*{ucyj07rNKgq5I%qeR8 z6;H+8%c#~L=LLjsHd5ZKRm^h^K9(EPoQfbC?|VO8 zNvHo7sBaqiIp8@j@!|8ZfKe0@NUw9l!|SV(L2I(phudhw?llC{)!x|asjbA60}T1c zCKT%H~^ z<%mK6f{Qz-4pZfa-b_{ykbb%mBoSPyl*6jc_~iAkXNmO6?~^}$`6xNQnL~T{7{hGw z8%!w~s@Fj1kMr<&I9*x49skJlNZ6@`mLECK8kH|Jtmev){xI#<(|~p^2=XO-&SJj@ zd0$aS_*Z7|{5NF#WT3g7Yo3U903~%fk8ktzD`t40)p{FS_gZkbyAl(aW*$PTkpj;3 z{%W5S@ci*pKN*2V4*$fNRCHr>ayk%hf%)r^lC#I%b* zwpDOhhzyKqHWpaHbL<37LUiq2os&m-;3kJiQ}Gsc zu6as{=(gK6>fG*e`j4cok!6f5uhn?+$F8j_bImSV_-CPT7vpj>i>&OxD(z5~?1ZA2 z1#S| zMXg#|9zMrTA8m|#ib|EMb~MT`?TgM*97Ps>;aYMJ4F~C`$*yIN3Yh(qc$|2zFn}kh z^sJ3mePXMndGhSv_psgfjTNz^*)jIOFk zN_5UR{bLXE#QP0fy3Xc4hffzP7(6H&edNw18yk{*H+U#Y?>u>)O4{;v)u9Ni9HGZJ zW%?A+0kBNGg)s zX9BIXy0~}O&+#u?bv$W}XU{%itczCSB$-<#s6lfkHI|ZeyAzp-49-o`b(elb^kq8f zN&kndm)f`Y^WC2NP@YSoL=DoKPn}ax$a(H{sYU7E%4O>!Y+@`Hi?}GY%zdq=U)ko_ zP2LIfFR`2~ZM&P}oBbcG$Z|ii^M)$piZJ;-dE(;@N&%4gNp*~5EiPWc62XZg4p%oc zzIB}3ApCO-adHpo@xJa8dCDO$es-6Pv&V3t)PUQf>aBL%X-O~O@sZHGEI@Is(X+m+ z2k*Lou}>iCv)e~}?Y$72d9JDnn}KhxFKSz#OUhb(ov_7g;$n&|AbH)^Q;KRnP=@lt zTa$*y;TBhW>oWCUmszqSMe2YK$9O)^VH%=!upvBC(|r8FOZv027{((&4_b>%T+8 z_-?M;t$1rsj&1EF?+v}!imIBIZ>l@3J6GA`Zn@V_7Q6iU zIl^Qfr$*0ch$&}!pikq^C4hmacm@XB(%@Qp(rV{ilh#<0(k11KcQu=3_<9HXX;0kFJ2ytm$!GbjygzVyp>A-!Mz&5y;<9 z)fwU>=4jHyIckD!ASj$NH9TKHM@)e8Xf&xWBtYf96{LV%Z%Jn3( zESK3W7o|=eJFXL&>Mvf44yg{}AKednkm}cy8eaf2Cgq#XF7!=Bwi&efH?khiMAD9? z;GQJy=A#;lYP=qf+jU&k%?_P1u?n;U1gFSc8>*D~=Ud9~z+%hC+)>>7w$el3hwUxY zi0H@@4M25N5&0?tmT_0}I7K^CpCQtXY)sYiUJhG71q)CTKnL;9E#+<`js3rMZDV6B z18iaCno{`QO(bw+YrtGjYCi~ahWZ=2(gE=lcwej6%P}?2&RmF;MWt>19S+{S@Um(C zJ4zCaNJRK!>d1DWOh!8Fc>sg8l;<-zK5Q@I{TU5QRoS6-^r_sa_-v6?<1_V75`MSk zu8j9xZ|~ynjJ)e0L7kWXnhZ^LQyG8HC{S+)cV)uB^a=me^*j_4*#|+K3*z7thwaEMAW<+xs~m zb^e}hPn7eOG!fjuPaS<%ibyQ!sl$M^g4jp#*9C!cf(`ltU3YJve{*)}@s3;Oz!|O8 ztmiWj5QzD!`BBN5I@isRN&!uKgM={&`N&WbKTVRHEq=mJW$uQh%CCh$8YcF;uWz8& zl@;4todj3U9_QEDPL6b6bXZws->hZvY}G4ELKU;t8>1Z1BgOUe&~djJ8MO87o4I_y znvw&_wb(y>?%?H(^ikbvq8gjKv3y|`1rWp}b=vIC6A<86%~JuIqC9yaKjIlF$)Ksi zuTYj-g4Nqmx|J%33)}e3AK@yBpbf&jz(0@!l%a&ibv-5;G#Qh-qv&_Qr zuKBg}-3bk;?=ArT<91=uK3UN!jsUyZNsYAZ8!S9%2upwrkK9(c*z_?9G05%In_F*! z-zWC7fsz`+2*Eut>EG_dhZ0u;O);;-*&KA2{p>wRlW9D*@nIH$XDE&Xg;1>U8*((_&| zjwhWA@`wuh;U_O7)aaA4v!^qpDPA-*QpcM{g!OF$oJj|LoOEqr9@W%&NsLCyt9!0a z)O7_mFFb3dJeZ(=SnjUA@l(?Zzt(>%hEC{(GqpbWp;Kv&^P`m?Vi)>EVQl11(-oo% zG3@dw2v(<%Dp+5MBGO`zah}ju6RK%bgol!O5tj(wY3 zcsrZNfX%=00Ya@)s_MyX(|8{b3q zR)cKA{L+O`*m$c0XQIa_eb}AM||K%~A3Bsb*U5&?*}9 zz5kcIb9JTi4ZLVGrXG1u5PdC$Z`2Fg$2LQw0{(uc8B1>&KE)T*jVvI&SxZ~Br%r6| zz&ll?I4wKra0}LGSXyRuclSkB`flTepN6xPP}Azur$JM@1=~Yo!n1IOELLa}Q*)}z))|4n;3O8@Ge$WO05Oga-x#OuGF?agL z9t04ihnArI9noFBzRrlTkxgxx$8x-aQ!_Eq?Myh0&gF->JvOX0IRlIAC7BbHRw|QL zf9k+8SzlY`W_@`AT|j+vhQ4nqQ$V=MYg0(UnpjVpMh6{4LBBcK_O6EDhe}Z?fw%@5 zw-=97z`pedCYssZm8jT_A$);ktN69MS_N*qgNtrTI3U)vcbTic87aP(oil+wS~fql zPZsD*6R-^F{J0uv&!UjL0-jZ7hTQMT;{h|c=dna@5g&icWY0FpOx84XjLZ7_b5XaM zvrsCd7&gXDepW@(y`~3Rn|>c8eLAP-PVo_(hP9`2GsrU?I(aac=y}p>_(`NXUwpF> z`Kz%K7Ki? z{0ukS4W~SS2A8^;n3`q*r#ApaWwvDgq%*Lz`|YU17gpnGM`zM%meQTOZc8Nxlj!H& z8pyw^xG*;Wq~vu8=7`h~@kYYaDD4fEEG^8a736{3POo?9_Su5bAC)5*=>*+dM`k$of$PiT>4XfE)n zPf?nNdsthy>iCwt<)XK9z1uqP8*VeSHQ{qB#<$G-WWxY_{J;#?@#K%{VpBy6_d=L) zE1IjS)NPr2{0vFIbHyLOvNIoDY$BxRytmrTKtDt(Laf+``IIWj9TvflAJt z^H%H;sT!Jo%W#F{nZ0j%0CKP zbOK#Vg`*sgRBrko>s8m3Q@vZ+H5FM90eFQK!y%MpQlU%n)t5gj;v~uZ>uEZGq-V&Lmvz{~S+3@?d>rwkN#aqJFa?kaem2v9Xe;A0-7K=MvV{Dk{{Q_s7>@rMs zUUtFyy9xy%(r~A`g*3Rn$)x7XvR*l*8-}kIv1_X<@fAM*k+2;x6PtIKqCh!pYG~%3 zLGdkUzzj1dYNFy6{DibBk*Ew1jnn}C6fG%K6rGg_mGWQ1c{QZm!=;0#6baNrO*Kde z&%EO1JhXl|aM2I4YxcVl&rpTUiNfkm5XCI^+1U1jL3D!SUQTQ*Cu+6-BzJB)zldH$ zh6VG?w0G&*Y}qVRy*LU{=7g%)#le(tDOG3-Gg`v0k_D(3CgG8Jy8@*2V&Iy7`{Y*@ zfIqo_7EZB=xbNt4GmL4xqE<;8HXkF{&8FQ}na-huRahu>_^O?@Se+W-vGK;fy>J31 zgzJLOANPXpcm)~+SStXrO+U@%F17Di4F`uXq_nUnn>^~H?C9szb9myHAo4mfc>?rd z9xz8h*(T(2W&Neyyj_&OCWU#mg}1>Zz!x3GPE>6u0gV0+p|D+q_}4xrkn zCspsto5{h3crgLGdqc!SQ;@X2z8(aaQyH)AVH3)Caju2#L@r!Gn2WzyKlt8T8GkiT zQn3=t#i44|Q+1U)u?0Tt$#NcF{+106%~BXXwz>|0ay14mfqKSRYWhGMPTBA?4#Skl zc^zOk!VT#KI%q@-_u&4i3wDvv400EXhS%pOVamg^Sm>8R!l%~jmjz^U{`4-5 z!+jEOGXxpK(%Ht-8&VAZBl*C&_M@l>15e0JCW^QJKhkO(&E8o_;(Z^2sP*$lDZKz# zucp1qiiBdK5>SM=;jSr^mQbVViS8~K`IMNV_}jEnJ$c8-8MQP;QPo@Odz!43D}ed4 zZ9JQP70S{R)PGf>Q?i1W4O2_rc}HzJ8^<|ODNp(ODJ*1!Ysh5Ls{&lgha+DNxxG>j z$%r6cBs7o#(Y9r@2Lv?1QpCUN7v!?l6b8pO_`+*rlJOer2=8@7O03jy%gTXmeDDmD zPT*tjx(*S9lV9)0A!^pa`znMDP< z^rpR>#Pw{!EuL+uocCW4ewS&c%5eZX5RUT$FV0XNfMburK-NUn!8Q7?-%Mz#^40m; z7*VZK0egV~$13t)b3#=ypbt{z2nE9$^jY29@|^y-4psSM>Wad9u=l3JD-HjV^djSy zxp4lN%41brLgn085&kv0N8Tgzcl~%n1^wW&q|s?obT>i1x$Jp#Mnhtz8HRiyfeEdLZrL^aFAZM;~vkT z)7O(CQoO}(GNG*}U}sacWHoWkQ42+7Gf!S>t^E;@17DS2ctseuSAGQdozCsVc{;3m9wdSSeO{*6f<|f09w+^vA=wCmkcU!6Vj+Y#tu9$V~p^J)vA* zjy=W*`bU0biBE5?PW91@Wp2v#s&9|GtkQP1V%7$I0UB#h7eF~nD9s06s*9AQ#N?4o zRRXZx$`F1TiCe;iz+GtHh5p1FVwe}C#Ny^Neiir=ntk}1BizP+_6vFciDllrGe@c~ z?`x||T(D8VWWGbua;gG=I^&+nWAAIFy^Cr@(OGJ&SK7wSug|NgcsM9n?Dj3R(-X#l zc$S(wKisg&AG{+#G_=xJo{O~emf`k$(nbd+25QFjZ5WrX6h^b1P%KipX06R;)#BgE z9?kD#z26?6*D`f!jvfn$d{6J?z5e^Q=z(P zai#~jO{pYt03r%(U-6C<;%zQq7AK*}eZ7ZXA0+Ni1(sR~d9e(hGhBF}+n&(l9O?u2{PhPP#M&Rp zUKu`X6j#c``PkV23z zZ_y;_&-=9IJ|Q84^b6gk{!nWb{C7gdar?scbKEbK5AU_xo5C;-xb`V4V2)LX+YTp` z0NDyz3w2xWSsM9Q2h+W}-8Z)tXaA{LS8QpxD1%zV5e zv2VQ^-{J=HdyWiXk}C=eXaCPKF8XE#nE$e54qfPfVoGXKyeDL&iJ|IH`9!yGt<;z5 zF1|cOd1Yb^Tyoz&X6ll~uYGts?7v(Vm7!!m2HfJ2fw;_P*P3Q3h(B0nNMTu$QcK!sRb094c%?o7xsFvqim~F+Uh2~&S%J$@^ z2P8J`X;yr8ysU)-$}TYq-h+MH|-|C?)$6Ma;ybu(a6#I=E_+5;gsJS zf1qa>AlZM7f}-6Z3p}qIeG$X%kIo6MUAC%yq0^8>2cI&=T6s*qh0296-@n7F$qAJe zLTH49OIFF_&Vg@g4SXrKp&QUU!`>KBUr=-3Wx!=k%CTiF{2*hp;t%uIi0?8>^9fM~ z_hY3b_s4EpO67GC@e}DX6FWo-Lz_?%qlX(_4~hN1IpMseN`}^f%LL*fKve~n(%0ri z{8|*~s@Qggz8rW@6<1SN2CjeATD58aw~iS=D*t$OZTt#$$!Pc%4WB1+z{Zvtyg+}6 zB9Mv2tJ5&Q>AtSRV4$KBe}`B;>__Pei0^K>K0=O+1S5Z0mz(1$q`mw+h>DOeLAy^D zbwTQtRNapAEGr3zUTe(Jzx30ujTo^+APr>w}5+u!{EWfXi~H46MCx3&Kxp&&lKnNCpKj`AAB z##p+5zDZqCmDFSm(2 zn%%^!3^>*Tld_O(SA=J40f^d9kLS62=;>wq_RR%>k13x;0(rCvw(+(c^-hZY>)0&s znUhNpRvUQF?ms*)W~sdN#w<2=%J^v*C}sw{)%VHv_=at_B47p~E(&*FiS0>gJ`D>5eH=YY?J4E`+P)UcW|QM8N6u+H~Q7TM&eBS;|{Vz3zKXCmFtCi+$;!pyld+R z>zV)9ifi-^hfmL`rU~5_k z-?2pmb2EFXOyS`W#K$Xemw9w}g9&37-r_?Mp$X|4COazz>JkZgO*-{eOy^+>cRbJ1 zu8nMSEFiw?B1iw;7bIryC9ez^eEp~dE&@abQ5(2Z)cbJII@(H_wmrM#%j_rExFHKs z0IL0BVO^}-97)@#g1i<9Ejh@%R_2HL#BiS)%bXLj=_NUsv3dIg4NUNQMw23Nuy@dlVpwf|30lJMEjh=zUZLa$*omV9AB5207i)JlUhVbpyv&MCosC?WQo?;AxP1N}iC?=Kp_VayZMOdhK2Fhdwak=^_{AeDf2cCyVVPi; zIsO>;@VMu;S@=SmEl?D7U+59u$IQc5^YZJZQU~cR+_Zzvw_hZ_=Dr0F0S>e~E|zpR zxE#K#&6b5FUlBZD#t>Oz7iTWkRR1HXeqxg1olS>JJ@Y;&@omATW7t#HajL8B1jv+7 z3~=8>0R0uvSn~ZxGE#%9AloOVyIThzWP|XI(oNT=`B8a*uyf&R9l84L{(X#XuSgUi zfEZc-sB%cma5wA6MW+#2PnL@h;Lh;5vnpGhMNSzYgqX5d7TQBDKf0KeED zBh}Q14EQhxnyUu-FW5|VyW%hC4dzJw=Aygd$}8TMTz8-l9o_DL$+c}Fi4Ym8u$G(b zc^n@0aKcpfKa$e-jQ!lPdpp6e{#Zj~&x-55{#!aPeHGdNWh-|puU@LO|Ic>g`s3Vw zr(%Uj;2v{t?k79{`HabAaQkwS^}@d&rFo#z=bD>>&M*C5{^^5Aa)oO$s)1g%G%<=r zl3v<*a8$X$0tYkc(xxMFHAo z9D)$>a}Z0zCXtjUT_#IsFSNxkKIZjr#H1W09VZ4_rjKQp>CcT-B*GE?rySzj`=;k1 zIbmf2BEvPpu!gVCf;y_I!?;Awc|N}DgIgqgLCcP4$y|5+5Y}A(<{1&lw?V9L1|R>w zWA1DO$&QE}A)AeT5h;Kdq-pX27v<_jNqxMJ*7i(ut=I!EQ3*Bc`V^x)rLo6k)l~v? z%0G?4syGV794;7T8y#5wP1j(b&bz;WGyhr&_HEanq9J8ij$KyjlC`jHG`D=-wtj;> z?DGbSkVylSA@|PT<+i&_!RD8I4N0BnLs8cB6OUF)j}^Y^8bN#YsGSm@Kw)cqB{v&o6%XL`yr}*tP;*VRQjMGIXpo<~eq4ueeQQ4~a z|42M8aZV zHEEr_{Ri{r4{7W+H`&Ls;=X!*$@ON#g?hLYquAiu=e7%6UF`WWaAs$tbc)_KdXM{k z{F5SbgwWYUJXfA&%A6QVAeV(D8cbu8o;M8J>qoz?960dPoF}9Q@;ab(P>%R?@6|); zQ?jxX@4`?5#Y_i@P}uElf;le;Pa}# zo$m$CGz59A2DtT%jDRWs zlot1h{0F?N23PtNJ`Pi?=(q~Wi_*syGKNyZ7K#DDF=Lw> zZNLvgmlI`pSf4`eCmhF$32bw&8Ytv99ZfD^-A7K}gKXfqAcdp0yXDyf&KvsAs%n6| zGoav8@pk*3tz1jv4D!PpnG*=^DC7c$IEmTUMDAnr$sjQBC@aNTRTapN)fnosN*U!i z24tk^4E{%wXPOMchW^ec`9?sED)X54t)O3dC(Tq%T(6l_eYqITE=eI|oguiHtaGbK zAYJF0m+cf#Q1jJ6+gD`K3)D_Gyi=d}&^&cytSkIQ3L+6`znm)cEDgSbT;TVYdGlpq z!!VjA>abS-#V^EwvU?S@9slc*>e%s!DKJs%>{e?}16r(KBG1M1amPe%#S5%B^^ z5O=$LhV4oRQNtw3#w+o+QAAv<%h}JuCy7z39zVc1-u|B0xZS|=|44RrMs)t)H)UjD zxp1d!C%UFhTu6+dMFIMb!3tUv6qhOs!km^n5U&%bkZACA1jv3R`7cX8K@H{A&wX;+ z2BbZHcq);+bH$F;{U~-wj<}zH$=goT4+3hTRq)}}pB2W|*K;T$Ye~<4B#3E5plz+k zKf*Vu@4IMt=gKwQD(i6Xn#hOivl+aWg?v!yx1N0p|KPyA&W4P*jD{i)2-ixgAA_OV z)6W3&h9je+B-fA3JE5ER0R|mDMd`MnC6hNzH-~ z{+o+Hq^3=)almI!ns|Rr;Lb^1Me*eo=e9<5mgcCm8bPNy^`7#D`1!aArr&(Cp3R$n zp$}(E+Bn*Z;5vx}TO<{BbSO{te>z`Eaf>T4%Ge#-R-uwCq%|@w`sDclEU72M8NzjL z7=kX04Ec8Zxbk`5^TZtBU?hcBgu=VU=$2X>hQ=%P!{I^Gb1VANPDt$&&^-Kgu0D<( zMTNjoeOp`&-V`UePRvx8<_N&aK%(0o(2`QJw%4DIMxXRf+N&$a%p#1kYtm@7ulg1g zU79&!I9|V8MM+{i_VIhtJa-|53MBl=(;i_H2k^_?t2>F!oDq^CNqZnMVuR3+6u=kk zc}=o(`bAaRT`eg;YxPm;3O|yt8P1xPX20>IvPr=*ypTGlz$0Xc%pb6d`$(e4*mu7J zzN`xw@69e+rGcs`?|1SYv&u{me^d4K@Q1eskAg_tPw9A6hUOMVp9-B>VpXPo{00nA zgrR?XC3{{RyiO$ux#g3N@s}MKXhQg#INdhro!*U#&)11;Eq+S}LRkxHN+XgI!hztJ za`C4e@F$~@Hp+&u4Ex6scIi0hikRjCj)D^9b49~Q2@S@)bjNos`y+bPI4KJ=_4vX5 z)3R5iq^~BIODpz#$6yV10v)}YOs{H{^xaf8xHR^S9dbE$yWVv3&AidCScntkIcFSz zd_h$8fvKzyx!bF!JZr-zPoK-)9x0{ukws`3Wfd%J9kzJuj^zh=rMBW06%_TDX` z8N7J;us7OW3AJYp)5=n=^B!@Zrj_Y&m4kyev`k4Ue~GVG5f23`!1oB{&cB*)?ig=7 z_9Ib6=87gx{J#n6|425TU~K1>`KLfGz%jZ~4^gJ7{mqT-J5nb$>?0W~zhg8yy}8^B zI0(qq{HQ>Fds=*5-YO8B2gV6hMFe=qw<}}Dy1;aL!a>Rp&^ilNEZpt~mLHbtv9hp+ zsT{2@2pQfaLfXvM8u7{7%%7BPIHjsmn{3B>wZP4zj#LplTF*k6c7PdLME6%{_DmA` zA#=%aEeI!R$ivdn{~nccXXv>(-7_!jnK2Pvdo&dar5G>x2fvHc|;|^H)_8$ ze;u!XxSsNukj&uPPiPiveelW*LJ19%cIL|*2DIEp~nE72ag&xf~ihz{!s8|1o zFxA#~aSfK$-ECCz+=&}mRdR9rX8y35#tXs&&W}%>+@BhSZkn}Dl{fx<*_JWT8 z`*5qMTrq6@^>YyJ39-S0vKJW9h6}y>0DuaYv$Rfw#VQ;wTPCdJnpHxC zVr9-9ZYqSLCmQ&Kzk^&~ivb;-bddPq;~+D{QLKu2vn=h@=}WhO$K63;f(JEzPPlzc z8C@-HTz!b@*u|L+7+v+0fH)inra}t|$3t}1yQ2uM8h2A+5H%v46WzGh_yNitScW@Q zt4~unX6SYDEpO5PQ>!RlcIRH@f@I9y?Mr7>6IhA|3 zpbf?#+x`QhLbNb2+fIT~v2@FoGW9hRD@Y>3UDnVLTA;9ureIDQL}hFYk%>JqS#FTEs(; z38P{6NIdPdPILkQ0}M)nZ=&TY!#Y=}KrU7DI-M|{rYS|rU`k}(qy|Pmy=-7u(#X{d z`q|d~&3ln%bA67dicv2Ghv<{WvXL$^uE^Ci5X1K@-r?WVKH@2t8`IuIO57YF1tw=c zR6;{D>ut?<=K}mb2vo;a@DqZ>3gg08St(*rwP9avjME8skJK~lavqHy{xSY5M0avT z9vV$X)uk+e<3@+AWhEZBvlGXd_0a#8t<7;IM)l2Vz?|ODFtzKYza2;Nk^Z(bU5&BV zGcT`&dj-w`+_hE}fOGb_vljv#*11`?PyA|yJOqY*j4fmu(@Dsas@CKNyc&e21ZG;5 z(A(<_Y^I%6?~bjq-Hm`bs4+-#01o>*BKTNjxPIX!}482vxxFDqGUhM^mD(hD7cZ`SdNo-J1#6Q?KiCXJz z&#gi;G343A;`UTRMG&$#KmL1eG|p+Q6m;BXvg2@$*qS7^{#nm)`FBNiIF2yoNC-G4 z4pjQDUvDjR*JN(Cn%kvx)DS-{`LDagw9?+nE_A!Mv}C)y@XW&XD!eAsmHuhV3MMO&@tmn2UlK4r^lRq8%|!v86V3GCGMnJ{S;n2 zo3^W_-i~)4e3!X~dP<^8lIacF(fWDxiv<&~Q%b1a$J1W(&7;=;%Pl@`%u*qR`YTk}ur3 zjHmsFBkNSzNat{;e+<`ZoAs*T?@h1pA6%nn?~`xo8N2CSa_7s4HGfW>ns(LP;2tf^ zG|<{^GYK}hOS^At2x(+HY{8W!u2faIX=x1(t{04X5FXnaP7mIlk(KlWo8XaGQ=L2% zRr@+yw6-%}|BeB!GWzv(me7aAi;2|9u;N0^)?a`hZm0`>{gWvB+tGD>T7SdtTjz@- z5#V+A;lz}}&FXPVXKGWW@+0s+7t`d^RlN^2pR?*(o8DJ_yQ|5aS{1k6IQ&8699vZm zdJ}HMb!WD|BGGa$c8`*H<^YOTa}^A5Fl3s#ik!HFetR~EEq`TGJD7OEnBaWK=PvLk zl*DcE3H66=zcBk^kyz721N1yR5C?0`3Pn5e_Uv+X5ZnR&uvA#SUjHBc z1I0+W&Q21HwXn^DzvD1#=P~Z{vwW1^U~PczsVm4H`Tjo6ZNJNte7CLz{h=h<(Fl4e z&2%)vwtd~v0$uWPMUsN-Rw4n#etuFB<|0DmoDZ4SrK2GeS~&S2Y0kXe)c)Bgn^25R z0e4&gZxo>cXp`Q#5+zaV)-?L;mUY|2JQOex$dxS0y$Lz)DXVHV^;{RDz*A$0Dc{{Q z6H&Hl+gj#d`7`f1e2jJ)8;)v8U1;zJkt;vIv!QJdY5;@P(Do$qqF-^vzj6yoz3Yc1 zf4sOgY-;!0Tj?(Y?{T!zL<^D?DuLrf5!4#MOs=6K2S<69gNilugM`U3-hUg0xbih* z#~ABdHkW8coq`=^i=dBd^}}*G_ZjPMKDzT*){r5!-(F4G{ejskUIG2W9M`k7fr8HG*Wz+4-6S76;K%f_Aqwme`T;v_KV!Pm`fGXkGSCve!{kwwLIFtUx z{b0VQLtm}lxArlVv*4s$nH_!H2{4QHnQi#~dY-X|Eeu*%mX{WOaLo9eruD|pPfKyC ztp2W`3`U;N>R$}W?E+D>KbeELzn)aw3Ea-oP5LU3#u%7>(X=W=*6PTWJv93nDu=lh zbt?-PAHPd}u1~u2NG#x=!|A*xPijS;teG}G1OE7z!kfm=ZS!qaz3pT;D%4laJ)+2D zt3tScoonWiCTGo#mXcDrky!)oMI|l}DpbC>W3)T)&ScawR@Y8Lwf@ViF{kP;`hp!< zCcpC!M^Fk&OzUz81d;RYui09awG2_%Z0H(GvP|rpzWmy|W9!)-?swdGl?9gfV z2}Qc480LOQ$0CoV`=b@fuUF;YHLDu+t-22>GwmUn-vD!(!y0!KR;OYw zs^8RvYW>=Lf_ds&y2Du6W1m+g?8`hV;@P|dcM9HKaNpbKCQ~%x@WEwSqYwAgh!s|g zFV|q%0+p_|_h58yO%h6WZN$dkypuKi-jYa)Bh%BXjNC*Tb+*&D*Q~D0m+PaGGtfEV z61SB()m()Q-BLCGc8LL|jIo0sGY3FDT6}qK(YdIVJGYM>W{`4 zCp&C&6@T8E-7Ds0yGLm3EC=ZBHsr>*O=x zsq+nq^SM^zT*pM1tk@+=%4QtP{P4){cYbm!Z^2F|s1weDTL=19`9fv3+NLPW(}`t; zZ{?eV4F1ZhfkK%tqM{9jKv*^OO!_+Vy|OTxHa@^C(DRlpgB#P#RmNs9MXbkSIeWG- za)v1=l`4<#||d=j9je%)4|iQK^rMN#g7e4nX zl%t@@-O;Jl6daFOSO*35Jt-A>npO?GWI-0+ylQs!-0Rf(Y{R}O5Fn*_+p{M>^@99J z1sVE&Tlp=~P!>N#Erq`J_D!EDYnWvnEX})cMdkN>X5MHTc-pG{Dv;0k4O{HQ;)im#wl>ZLpOf>9*Y$ADRiy z>=R1Alj$gT^XaSEiTcDp?nZveF$>uH6{$3Z)YsGXAEQn%Hd;>CV5k7!Bh1Z#xiy~li4LvCh}QwTHpTIriHrZx=+qdXobxEZ`YTs8^-@cbsX|Eib6O*4OtzT zDPkBgU8B5UD^Fse^CY$oN9DEbIonIaXg)O%ndVY`_9*9Eu`G>)FR>vynV{@F{QDEI0;)?^QKKL+D2-GZ@C1$m8- z`+ymzM!lw0@dRE02eqVH(^E*f3IL{QR*0e^xMF=$I7PrKCE5`w5|fIFskQ z_tO6(dB8qF3$I7wCi{}^Lu*!SzJyxK5gU}ppKeNl)=1IpB+Ok`A>8MC`D=##04mT? z@NO;lu9Bw_UPv6O_&OxX7bZR{L#rv7`$o2<1@C2vf4i;nW8~c`m@KM4+5@5l8_HkP zx4nrIl;z^60p9Nj{3`uydOz>6ZS4RLZ)_64!9dp%(;@e*@(}>alB81_Gcb~ZdkN(z z*!(NpKQRaI`UJ7?KFZ z^L8%u?{`UTQx3$>VmQMjvThYxT*d9wBY}RCu<*_*$^sV-n)TQ&cHzAm=Tl})bXs0ge|D-5>P!1* zw%^*u0v~>qb@FYb;HB(6f`m|9CcxHY`depZYxa<~bu6ffJJ;Bu5-)A`2f1Kjz`gAL zumAk#cK8R!V5HXs>FAC|iMINbq%n)@8aG$+G_N@64VyL&5bb4TCeK( z$8eb^{a4wh;L!IAtbQtYhe_$t-tQ+qqHj3eg(6Zy;t-y@@+`2+W2HJ+YYHe z0YRah7LN`~S%|`#{AzNC<8)sp-lfPWmfI#?mO2xf0P?47?Zc@`expg}oDjkj!couM zv!#{(c21kS2wDR631#~OoSRt2x#r-3>Ieh?NYMtg5i{FNShmD?d5^kR_z|aNc&9py zK}CBG_sr-Mc4<=-ZlQG4Yi@QW4US#rdIN3KyDLvZ`7@ZC{){DyHlQC#*N8J6$yz}h zR*_qZUV~$@`cqI%NgBIWB>)v>wLCODp5+Yr;i1NVBqd4Ux4;_0V7iadsrI41xJAD0 z4*Xt4;F6OhLRt-4AijKC(V^HKre!22cwRN83A`O4zrl9+tAxArtD^8T`h(xYS#JkA zZS2Wbstkk>|Lf|^qoHoYK2C}U52a_sM3h98NygHMlzTtX6&**@9(^Syyv{nAK!oO|E_bL``q_+-`Dm10GR17VeaL$ z)oknI+afje-Ld_%`Q{(1PBwTIrk}8F$+tWH7exX2bu*BEC!N5 z1QuNm%pRH4?`ZjPt|&KlYziTky&+D2?WeHU01LbnLX~c?gL^webX{CoDOzSNhcHy(WBi=;}zLV1|D@E!c zb%tfS+uI4(qlBeoLFCD|qy?}ej4y+w0wBP*sv~5_vz2~FU#BkNYFZG0rG`u0QdPu8TpOCeU%FcP`($HRtiHd#$*(Su!z^4lf`p7aAbGODQ@MTj1XW=9kt?d(zEb4m zgq%kso?GoY^rcDrQe5tR-uk8!Io!QEtaCtT{=mNTBjvB|E_UI{A#qCw6*BLeb8D(J z=!<-l&cO%w+n%VZqK+RM zE0wXAg79Yy*X`J!n~yh=&ci5_<$WhxUnW3D%lCWMh{>bskvk8zddX^w`h>sz>dcSL zM`e8%2|`(1-Mo5w+hNe-%U*zJ7c|n2M2+rgBwdf5(0Wex>joXgf z>GRfUefR=D7rzW~{Iv6a0dleNo>~~ha9%6{GEyw|;8Ei!R3C7k+M$9@;5y0vX@kLX z5z*}xRi7Fxds=-@W~|xV;rf9{{g*?dT1q?5iM7<@L~g$OVFQoCY9D{K0F^vCOWl6z zYTSkK(Hgq89-ZtIx7~4A?7$JFxTJ%2g@nU$S8Q&`s3x|-F=^S_ZH%{u``%H*#76+} z!=s>N8vh6Oy=S|7ZN5N4eP^R9`z#h0{_dZk?+#X+=~O*MQ|KUv@LEo4+{6~?2VdBd z<7)jCiCi^S$XA83pLpw1II7OT&Ij!L=f{-IcIOW5CoXX+B@1}(Ohjiod8Qel9(reU zotg2xi&vz}9{2RAi=FxaWIX`*PB)J`8+m(7531KJ`4b>zx&78XKkhU3&?~&GB|9ix zbsjj*&SSXchgY$yzCZlae})G1VFMG1BW1-!H{m7Jk3+!BOZ?*^kIxul!f10i)$-(aFh&W)&x{^q=lkaBbxCrbTAKW(9U!N3+aM-_Ol555KxSrf*a>nz-OK|IMu8T)&<};83z`D6a=bl znCcX1N-@&;+N8C#VV_@!Ya8y&zQQ(}c$MI;N$3fb#_$qRNgBz%7smsF8$P&vn@-nG zrZCy_=~7^vrPBrpKw>+l@~{1ng^c<}Nhj{h5AaAdBoVxWzm#}llb8c%dq3+GG>rNF zdB*xoqmoeQ18T5J$3%*M@yL~nW~G zS5lgf5&RG|6x6LbIaj92w*75*(W6sB-l_}~#duSV3~l~kl)o1-T7RfZw@L*EV%JSc z5iDKpbC6fU4fJzDgLJvdx*YHG^u5u?7+>dwzCR@uTE`MEzy7aI0wdgB&tTz;rlRhX zQ~4hQaq!IF#}tyOnW?C!Ts*@0sIX4;daQ_~au}UCRe`BC@_540Et2x2E%@Sccshg~ zEU;Q~U+oI`p4r>(gR|KkUEpS0gcGk4 z9wDKhhJ^KhZmWu!_L426YbzEI&j;n7u|}Jwx$B=$x{FOJgJqnvmTU)d2I;%D8;xPQ zS^AF0GMXlYX(s~XD{I~jWn}b32?Tu-ylR3h3-DuxDq1w22O0w*U#WNcFrmVEZfM72 zZyWtb>q)v)lTmtYgIgB2nx)P3m~A9+FrAV0^$0oqxrYETc6g{ZO?*HnnXDJYtj(1F zR`)*ELZ5k;L}9+{5vn?95-4byw-3$D7MEyvQ;qx4XspF@H2;@F7qxdg$YpqeGGe%x z_VScp$w;<#Oy$Ktx3PNI z*9DQi>yVY#gs^I!{;Qk|>C9#R3r*2Db5llxr%jHKnE&1`{Elp5Y6SmKsVWY+>A5#z zWx)m^437!cBMdn}h+8S(OLGu1muYRiZP~~|^g>dUt+7Y2EbYZ7A^5MzjAbKU9;qrv zKeZ{{+3rkV5yFw9WPbr(U@0%47%!8UZ}%;QeaQCQ;FoBtUn99xxmtPPNH>E0FO|e= z@tmi4IS6#3ERDHxy~T32gi7ihgPi9z@F`qs2C9f!w%c|M)~07PZZ@) z&WwAvZSlv4p7OU~{T_i>YHR;gxu*WA|a6be9A{b-}GCm>qKTdZHSRrHGfbcpLpQWj{~eFa$8sbm_@MMSnR^qCUBoP5~}cC z*?3K&A#0YUwCMtt%0ej;22#;JuMaBq7ZJ%N*xQiXAt4Co%;nAk1g?jKXv<^CcW$iQ zdSB?<5Ac^Gg7^w72~OuvqeZVTnh$hh{4ean;FPh2ODX6Kd_U3@aB+|C$+z3@qJrax zUac*brVDqks^bY!Ggk2t%euR6!nycT zp;50Lg^y`Oe{1oGg)iT%bKZ^dA+8`^Xf2U7tcx|T?=-{7;hY-{= zn0h@rxvug&-C+clOil+6hz$Y2x|MOKK&Ur0&$}p^w@q>< z!Qe2<&sYwQ_iE;N$|Es$B}aoHZvA41wzA|L&{{xB9VO@$%jYmgvX@ua)`84oJ2y)N zZBK`_FXwl1ZYnHCr={Jga`COX_b#CD5ck4c0zsw?|Gead zS7DV5I!+2HaU3WpN0=pfcRn`^RjN5$+a1RolIq)^6i;Q!t5oV=v3*<+*&4#5$(GBC zwjLe1@E+#s_Y9docs4E5^^GCOMxF0+QOth@1I85;)t~2`5UU;g7~P#szIi(a3RLTCQe>^SNdM{flT%(>PdCH(iNC}R47rYpapujH-vGCm1ZAg$(Gp|l(_;H( zLrOe0gt-W4UyoK_5*?J{OL?d#ui9MrdK0Klj)$Qd#NM*ZdWX{Zqn0J+To>K8oWL+hO!s`e%RzAFcU$X%0YW^mX? zM2z))jv_SJW$CAFRyQxBC=-ZPm8np)t##f%_;gyzBj2XW{AY_#tI&08YveZRi`SElGX#@F_5Pd>iCvRlAJ zhG-z>Fi#nR!`w~*XXQa6t* z6P|JG`gmx;LO4V^P*wE6A3s%)nD+V|Yd7{^jxB4;$8C<%9vt{e@j>zvKd8QUBAJF! z)z_O}4$M~erhMfbTdJsuRvzPyKsjfEBZi02zs4QUoND={;P^WQeI>*hkD&?5Cy$MD zN);6>>It4Su=UENwLo|sMyw@(M?qO{P2H{B@RMm;@R`wBW0#(4e@Q1vCfVup@4yKh Tn{8W^s9=Ky!r}O@{{8+xZ=T^Z diff --git a/packages/firebase_ml_vision/example/assets/test_contact_barcode.png b/packages/firebase_ml_vision/example/assets/test_contact_barcode.png deleted file mode 100644 index 8bd7e1c900e12f368fbca52b0b84503a0e5b5c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16598 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 mKIFZuMGky;Qd*$N$;<;WBgp diff --git a/packages/firebase_ml_vision/example/assets/test_text.png b/packages/firebase_ml_vision/example/assets/test_text.png deleted file mode 100644 index 6a316527d9cfab4b036298bae4ddd29c678886e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5870 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 - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_ml_vision/example/ios/Flutter/Debug.xcconfig b/packages/firebase_ml_vision/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_ml_vision/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_ml_vision/example/ios/Flutter/Release.xcconfig b/packages/firebase_ml_vision/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_ml_vision/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_ml_vision/example/ios/Podfile b/packages/firebase_ml_vision/example/ios/Podfile deleted file mode 100644 index 5d488a88c6aa..000000000000 --- a/packages/firebase_ml_vision/example/ios/Podfile +++ /dev/null @@ -1,71 +0,0 @@ -# Uncomment this line to define a global platform for your project -platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; - end - pods_ary = [] - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) { |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - pods_ary.push({:name => podname, :path => podpath}); - else - puts "Invalid plugin specification: #{line}" - end - } - return pods_ary -end - -target 'Runner' do - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - - # Flutter Pods - generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') - if generated_xcode_build_settings.empty? - puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." - end - generated_xcode_build_settings.map { |p| - if p[:name] == 'FLUTTER_FRAMEWORK_DIR' - symlink = File.join('.symlinks', 'flutter') - File.symlink(File.dirname(p[:path]), symlink) - pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) - end - } - - # Plugin Pods - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.map { |p| - symlink = File.join('.symlinks', 'plugins', p[:name]) - File.symlink(p[:path], symlink) - pod p[:name], :path => File.join(symlink, 'ios') - } -end - -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end - end -end - -pod 'Firebase/MLVisionBarcodeModel' -pod 'Firebase/MLVisionFaceModel' -pod 'Firebase/MLVisionLabelModel' -pod 'Firebase/MLVisionTextModel' diff --git a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 826fc6e9146c..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,518 +0,0 @@ -// !$*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 */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 8FDA56F920D046020020E776 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8FDA56F820D046020020E776 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 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 */; }; - D8D4CC03A45432EE564AF6EC /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 47511359F254D1FA05DF3B06 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 47511359F254D1FA05DF3B06 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 8FDA56F820D046020020E776 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - D8D4CC03A45432EE564AF6EC /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 060D02122DE17098607AD6EA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 47511359F254D1FA05DF3B06 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - FC90A70078657ED2825B5943 /* Pods */, - 060D02122DE17098607AD6EA /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 8FDA56F820D046020020E776 /* GoogleService-Info.plist */, - 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 = ""; - }; - FC90A70078657ED2825B5943 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 96E46CF45834A6C37B9BB190 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 76593FE57A112D467FCA6E60 /* [CP] Embed Pods Frameworks */, - A29312BDBCEC3EBFF001E62D /* [CP] Copy Pods Resources */, - ); - 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 = 1000; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 8FDA56F920D046020020E776 /* GoogleService-Info.plist 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\" thin"; - }; - 76593FE57A112D467FCA6E60 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 96E46CF45834A6C37B9BB190 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - A29312BDBCEC3EBFF001E62D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleMobileVision/GoogleMVFaceDetectorResources.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleMobileVision/GoogleMVTextDetectorResources.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMVFaceDetectorResources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMVTextDetectorResources.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseMlVisionExample; - 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; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseMlVisionExample; - 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 */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d68..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index ba1a98224109..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_ml_vision/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_ml_vision/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_ml_vision/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_ml_vision/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d68..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/packages/firebase_ml_vision/example/ios/Runner/AppDelegate.h b/packages/firebase_ml_vision/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_ml_vision/example/ios/Runner/AppDelegate.m b/packages/firebase_ml_vision/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d9d..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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_ml_vision/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_ml_vision/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_ml_vision/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_ml_vision/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_ml_vision/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_ml_vision/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 0562b2ee756f..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 479882132969-gjp4e63ogu2h6guttj2ie6t3f10ic7i8.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.479882132969-gjp4e63ogu2h6guttj2ie6t3f10ic7i8 - API_KEY - AIzaSyBECOwLTAN6PU4Aet1b2QLGIb3kRK8Xjew - GCM_SENDER_ID - 479882132969 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebaseMlVisionExample - PROJECT_ID - my-flutter-proj - STORAGE_BUCKET - my-flutter-proj.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:479882132969:ios:249503bd2f4091a3 - DATABASE_URL - https://my-flutter-proj.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_ml_vision/example/ios/Runner/Info.plist b/packages/firebase_ml_vision/example/ios/Runner/Info.plist deleted file mode 100644 index b00979ea6bac..000000000000 --- a/packages/firebase_ml_vision/example/ios/Runner/Info.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - NSCameraUsageDescription - - NSPhotoLibraryUsageDescription - - LSApplicationCategoryType - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_ml_vision_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 - - NSCameraUsageDescription - Can I use the camera please? - - diff --git a/packages/firebase_ml_vision/example/ios/Runner/main.m b/packages/firebase_ml_vision/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_ml_vision/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_ml_vision/example/lib/camera_preview_scanner.dart b/packages/firebase_ml_vision/example/lib/camera_preview_scanner.dart deleted file mode 100644 index f40e20d6591c..000000000000 --- a/packages/firebase_ml_vision/example/lib/camera_preview_scanner.dart +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:camera/camera.dart'; -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'detector_painters.dart'; -import 'scanner_utils.dart'; - -class CameraPreviewScanner extends StatefulWidget { - @override - State createState() => _CameraPreviewScannerState(); -} - -class _CameraPreviewScannerState extends State { - dynamic _scanResults; - CameraController _camera; - Detector _currentDetector = Detector.text; - bool _isDetecting = false; - CameraLensDirection _direction = CameraLensDirection.back; - - final BarcodeDetector _barcodeDetector = - FirebaseVision.instance.barcodeDetector(); - final FaceDetector _faceDetector = FirebaseVision.instance.faceDetector(); - final ImageLabeler _imageLabeler = FirebaseVision.instance.imageLabeler(); - final ImageLabeler _cloudImageLabeler = - FirebaseVision.instance.cloudImageLabeler(); - final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer(); - final TextRecognizer _cloudRecognizer = - FirebaseVision.instance.cloudTextRecognizer(); - - @override - void initState() { - super.initState(); - _initializeCamera(); - } - - void _initializeCamera() async { - final CameraDescription description = - await ScannerUtils.getCamera(_direction); - - _camera = CameraController( - description, - defaultTargetPlatform == TargetPlatform.iOS - ? ResolutionPreset.low - : ResolutionPreset.medium, - ); - await _camera.initialize(); - - _camera.startImageStream((CameraImage image) { - if (_isDetecting) return; - - _isDetecting = true; - - ScannerUtils.detect( - image: image, - detectInImage: _getDetectionMethod(), - imageRotation: description.sensorOrientation, - ).then( - (dynamic results) { - if (_currentDetector == null) return; - setState(() { - _scanResults = results; - }); - }, - ).whenComplete(() => _isDetecting = false); - }); - } - - Future Function(FirebaseVisionImage image) _getDetectionMethod() { - switch (_currentDetector) { - case Detector.text: - return _recognizer.processImage; - case Detector.cloudText: - return _cloudRecognizer.processImage; - case Detector.barcode: - return _barcodeDetector.detectInImage; - case Detector.label: - return _imageLabeler.processImage; - case Detector.cloudLabel: - return _cloudImageLabeler.processImage; - case Detector.face: - return _faceDetector.processImage; - } - - return null; - } - - Widget _buildResults() { - const Text noResultsText = Text('No results!'); - - if (_scanResults == null || - _camera == null || - !_camera.value.isInitialized) { - return noResultsText; - } - - CustomPainter painter; - - final Size imageSize = Size( - _camera.value.previewSize.height, - _camera.value.previewSize.width, - ); - - switch (_currentDetector) { - case Detector.barcode: - if (_scanResults is! List) return noResultsText; - painter = BarcodeDetectorPainter(imageSize, _scanResults); - break; - case Detector.face: - if (_scanResults is! List) return noResultsText; - painter = FaceDetectorPainter(imageSize, _scanResults); - break; - case Detector.label: - if (_scanResults is! List) return noResultsText; - painter = LabelDetectorPainter(imageSize, _scanResults); - break; - case Detector.cloudLabel: - if (_scanResults is! List) return noResultsText; - painter = LabelDetectorPainter(imageSize, _scanResults); - break; - default: - assert(_currentDetector == Detector.text || - _currentDetector == Detector.cloudText); - if (_scanResults is! VisionText) return noResultsText; - painter = TextDetectorPainter(imageSize, _scanResults); - } - - return CustomPaint( - painter: painter, - ); - } - - Widget _buildImage() { - return Container( - constraints: const BoxConstraints.expand(), - child: _camera == null - ? const Center( - child: Text( - 'Initializing Camera...', - style: TextStyle( - color: Colors.green, - fontSize: 30.0, - ), - ), - ) - : Stack( - fit: StackFit.expand, - children: [ - CameraPreview(_camera), - _buildResults(), - ], - ), - ); - } - - void _toggleCameraDirection() async { - if (_direction == CameraLensDirection.back) { - _direction = CameraLensDirection.front; - } else { - _direction = CameraLensDirection.back; - } - - await _camera.stopImageStream(); - await _camera.dispose(); - - setState(() { - _camera = null; - }); - - _initializeCamera(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('ML Vision Example'), - actions: [ - PopupMenuButton( - onSelected: (Detector result) { - _currentDetector = result; - }, - itemBuilder: (BuildContext context) => >[ - const PopupMenuItem( - child: Text('Detect Barcode'), - value: Detector.barcode, - ), - const PopupMenuItem( - child: Text('Detect Face'), - value: Detector.face, - ), - const PopupMenuItem( - child: Text('Detect Label'), - value: Detector.label, - ), - const PopupMenuItem( - child: Text('Detect Cloud Label'), - value: Detector.cloudLabel, - ), - const PopupMenuItem( - child: Text('Detect Text'), - value: Detector.text, - ), - const PopupMenuItem( - child: Text('Detect Cloud Text'), - value: Detector.cloudText, - ), - ], - ), - ], - ), - body: _buildImage(), - floatingActionButton: FloatingActionButton( - onPressed: _toggleCameraDirection, - child: _direction == CameraLensDirection.back - ? const Icon(Icons.camera_front) - : const Icon(Icons.camera_rear), - ), - ); - } - - @override - void dispose() { - _camera.dispose().then((_) { - _barcodeDetector.close(); - _faceDetector.close(); - _imageLabeler.close(); - _cloudImageLabeler.close(); - _recognizer.close(); - _cloudRecognizer.close(); - }); - - _currentDetector = null; - super.dispose(); - } -} diff --git a/packages/firebase_ml_vision/example/lib/colors.dart b/packages/firebase_ml_vision/example/lib/colors.dart deleted file mode 100644 index 37d92e6d2374..000000000000 --- a/packages/firebase_ml_vision/example/lib/colors.dart +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - -const Color kShrinePink50 = Color(0xFFFEEAE6); -const Color kShrinePink100 = Color(0xFFFEDBD0); -const Color kShrineFrameBrown = Color(0x8A442C2E); -const Color kShrineScrim = Color(0x73442C2E); diff --git a/packages/firebase_ml_vision/example/lib/detector_painters.dart b/packages/firebase_ml_vision/example/lib/detector_painters.dart deleted file mode 100644 index d8d7316f2509..000000000000 --- a/packages/firebase_ml_vision/example/lib/detector_painters.dart +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2018 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:ui' as ui; - -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/material.dart'; - -enum Detector { barcode, face, label, cloudLabel, text, cloudText } - -class BarcodeDetectorPainter extends CustomPainter { - BarcodeDetectorPainter(this.absoluteImageSize, this.barcodeLocations); - - final Size absoluteImageSize; - final List barcodeLocations; - - @override - void paint(Canvas canvas, Size size) { - final double scaleX = size.width / absoluteImageSize.width; - final double scaleY = size.height / absoluteImageSize.height; - - Rect scaleRect(Barcode barcode) { - return Rect.fromLTRB( - barcode.boundingBox.left * scaleX, - barcode.boundingBox.top * scaleY, - barcode.boundingBox.right * scaleX, - barcode.boundingBox.bottom * scaleY, - ); - } - - final Paint paint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = 2.0; - - for (Barcode barcode in barcodeLocations) { - paint.color = Colors.green; - canvas.drawRect(scaleRect(barcode), paint); - } - } - - @override - bool shouldRepaint(BarcodeDetectorPainter oldDelegate) { - return oldDelegate.absoluteImageSize != absoluteImageSize || - oldDelegate.barcodeLocations != barcodeLocations; - } -} - -class FaceDetectorPainter extends CustomPainter { - FaceDetectorPainter(this.absoluteImageSize, this.faces); - - final Size absoluteImageSize; - final List faces; - - @override - void paint(Canvas canvas, Size size) { - final double scaleX = size.width / absoluteImageSize.width; - final double scaleY = size.height / absoluteImageSize.height; - - final Paint paint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = 2.0 - ..color = Colors.red; - - for (Face face in faces) { - canvas.drawRect( - Rect.fromLTRB( - face.boundingBox.left * scaleX, - face.boundingBox.top * scaleY, - face.boundingBox.right * scaleX, - face.boundingBox.bottom * scaleY, - ), - paint, - ); - } - } - - @override - bool shouldRepaint(FaceDetectorPainter oldDelegate) { - return oldDelegate.absoluteImageSize != absoluteImageSize || - oldDelegate.faces != faces; - } -} - -class LabelDetectorPainter extends CustomPainter { - LabelDetectorPainter(this.absoluteImageSize, this.labels); - - final Size absoluteImageSize; - final List labels; - - @override - void paint(Canvas canvas, Size size) { - final ui.ParagraphBuilder builder = ui.ParagraphBuilder( - ui.ParagraphStyle( - textAlign: TextAlign.left, - fontSize: 23.0, - textDirection: TextDirection.ltr), - ); - - builder.pushStyle(ui.TextStyle(color: Colors.green)); - for (ImageLabel label in labels) { - builder.addText('Label: ${label.text}, ' - 'Confidence: ${label.confidence.toStringAsFixed(2)}\n'); - } - builder.pop(); - - canvas.drawParagraph( - builder.build() - ..layout(ui.ParagraphConstraints( - width: size.width, - )), - const Offset(0.0, 0.0), - ); - } - - @override - bool shouldRepaint(LabelDetectorPainter oldDelegate) { - return oldDelegate.absoluteImageSize != absoluteImageSize || - oldDelegate.labels != labels; - } -} - -// Paints rectangles around all the text in the image. -class TextDetectorPainter extends CustomPainter { - TextDetectorPainter(this.absoluteImageSize, this.visionText); - - final Size absoluteImageSize; - final VisionText visionText; - - @override - void paint(Canvas canvas, Size size) { - final double scaleX = size.width / absoluteImageSize.width; - final double scaleY = size.height / absoluteImageSize.height; - - Rect scaleRect(TextContainer container) { - return Rect.fromLTRB( - container.boundingBox.left * scaleX, - container.boundingBox.top * scaleY, - container.boundingBox.right * scaleX, - container.boundingBox.bottom * scaleY, - ); - } - - final Paint paint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = 2.0; - - for (TextBlock block in visionText.blocks) { - for (TextLine line in block.lines) { - for (TextElement element in line.elements) { - paint.color = Colors.green; - canvas.drawRect(scaleRect(element), paint); - } - - paint.color = Colors.yellow; - canvas.drawRect(scaleRect(line), paint); - } - - paint.color = Colors.red; - canvas.drawRect(scaleRect(block), paint); - } - } - - @override - bool shouldRepaint(TextDetectorPainter oldDelegate) { - return oldDelegate.absoluteImageSize != absoluteImageSize || - oldDelegate.visionText != visionText; - } -} diff --git a/packages/firebase_ml_vision/example/lib/main.dart b/packages/firebase_ml_vision/example/lib/main.dart deleted file mode 100644 index c1fe123258b7..000000000000 --- a/packages/firebase_ml_vision/example/lib/main.dart +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2018 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:flutter/material.dart'; - -import 'camera_preview_scanner.dart'; -import 'material_barcode_scanner.dart'; -import 'picture_scanner.dart'; - -void main() { - runApp( - MaterialApp( - routes: { - '/': (BuildContext context) => _ExampleList(), - '/$PictureScanner': (BuildContext context) => PictureScanner(), - '/$CameraPreviewScanner': (BuildContext context) => - CameraPreviewScanner(), - '/$MaterialBarcodeScanner': (BuildContext context) => - const MaterialBarcodeScanner(), - }, - ), - ); -} - -class _ExampleList extends StatefulWidget { - @override - State createState() => _ExampleListState(); -} - -class _ExampleListState extends State<_ExampleList> { - static final List _exampleWidgetNames = [ - '$PictureScanner', - '$CameraPreviewScanner', - '$MaterialBarcodeScanner', - ]; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Example List'), - ), - body: ListView.builder( - itemCount: _exampleWidgetNames.length, - itemBuilder: (BuildContext context, int index) { - final String widgetName = _exampleWidgetNames[index]; - - return Container( - decoration: BoxDecoration( - border: Border(bottom: BorderSide(color: Colors.grey)), - ), - child: ListTile( - title: Text(widgetName), - onTap: () => Navigator.pushNamed(context, '/$widgetName'), - ), - ); - }, - ), - ); - } -} diff --git a/packages/firebase_ml_vision/example/lib/material_barcode_scanner.dart b/packages/firebase_ml_vision/example/lib/material_barcode_scanner.dart deleted file mode 100644 index 33b5994dd48c..000000000000 --- a/packages/firebase_ml_vision/example/lib/material_barcode_scanner.dart +++ /dev/null @@ -1,763 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:io'; -import 'dart:ui' show lerpDouble; - -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:camera/camera.dart'; -import 'package:flutter/services.dart'; -import 'package:path_provider/path_provider.dart'; - -import 'colors.dart'; -import 'scanner_utils.dart'; - -enum AnimationState { search, barcodeNear, barcodeFound, endSearch } - -class MaterialBarcodeScanner extends StatefulWidget { - const MaterialBarcodeScanner({ - this.validRectangle = const Rectangle(width: 320, height: 144), - this.frameColor = kShrineScrim, - this.traceMultiplier = 1.2, - }); - - final Rectangle validRectangle; - final Color frameColor; - final double traceMultiplier; - - @override - _MaterialBarcodeScannerState createState() => _MaterialBarcodeScannerState(); -} - -class _MaterialBarcodeScannerState extends State - with TickerProviderStateMixin { - CameraController _cameraController; - AnimationController _animationController; - String _scannerHint; - bool _closeWindow = false; - String _barcodePictureFilePath; - Size _previewSize; - AnimationState _currentState = AnimationState.search; - CustomPainter _animationPainter; - int _animationStart = DateTime.now().millisecondsSinceEpoch; - final BarcodeDetector _barcodeDetector = - FirebaseVision.instance.barcodeDetector(); - - @override - void initState() { - super.initState(); - - SystemChrome.setEnabledSystemUIOverlays([]); - SystemChrome.setPreferredOrientations( - [DeviceOrientation.portraitUp], - ); - _initCameraAndScanner(); - _switchAnimationState(AnimationState.search); - } - - void _initCameraAndScanner() { - ScannerUtils.getCamera(CameraLensDirection.back).then( - (CameraDescription camera) async { - await _openCamera(camera); - await _startStreamingImagesToScanner(camera.sensorOrientation); - }, - ); - } - - void _initAnimation(Duration duration) { - setState(() { - _animationPainter = null; - }); - - _animationController?.dispose(); - _animationController = AnimationController(duration: duration, vsync: this); - } - - void _switchAnimationState(AnimationState newState) { - if (newState == AnimationState.search) { - _initAnimation(const Duration(milliseconds: 750)); - - _animationPainter = RectangleOutlinePainter( - animation: RectangleTween( - Rectangle( - width: widget.validRectangle.width, - height: widget.validRectangle.height, - color: Colors.white, - ), - Rectangle( - width: widget.validRectangle.width * widget.traceMultiplier, - height: widget.validRectangle.height * widget.traceMultiplier, - color: Colors.transparent, - ), - ).animate(_animationController), - ); - - _animationController.addStatusListener((AnimationStatus status) { - if (status == AnimationStatus.completed) { - Future.delayed(const Duration(milliseconds: 1600), () { - if (_currentState == AnimationState.search) { - _animationController.forward(from: 0); - } - }); - } - }); - } else if (newState == AnimationState.barcodeNear || - newState == AnimationState.barcodeFound || - newState == AnimationState.endSearch) { - double begin; - if (_currentState == AnimationState.barcodeNear) { - begin = lerpDouble(0.0, 0.5, _animationController.value); - } else if (_currentState == AnimationState.search) { - _initAnimation(const Duration(milliseconds: 500)); - begin = 0.0; - } - - _animationPainter = RectangleTracePainter( - rectangle: Rectangle( - width: widget.validRectangle.width, - height: widget.validRectangle.height, - color: newState == AnimationState.endSearch - ? Colors.transparent - : Colors.white, - ), - animation: Tween( - begin: begin, - end: newState == AnimationState.barcodeNear ? 0.5 : 1.0, - ).animate(_animationController), - ); - - if (newState == AnimationState.barcodeFound) { - _animationController.addStatusListener((AnimationStatus status) { - if (status == AnimationStatus.completed) { - Future.delayed(const Duration(milliseconds: 300), () { - if (_currentState != AnimationState.endSearch) { - _switchAnimationState(AnimationState.endSearch); - setState(() {}); - _showBottomSheet(); - } - }); - } - }); - } - } - - _currentState = newState; - if (newState != AnimationState.endSearch) { - _animationController.forward(from: 0); - _animationStart = DateTime.now().millisecondsSinceEpoch; - } - } - - Future _openCamera(CameraDescription camera) async { - final ResolutionPreset preset = - defaultTargetPlatform == TargetPlatform.android - ? ResolutionPreset.medium - : ResolutionPreset.low; - - _cameraController = CameraController(camera, preset); - await _cameraController.initialize(); - _previewSize = _cameraController.value.previewSize; - setState(() {}); - } - - Future _startStreamingImagesToScanner(int sensorOrientation) async { - bool isDetecting = false; - final MediaQueryData data = MediaQuery.of(context); - - _cameraController.startImageStream((CameraImage image) { - if (isDetecting) { - return; - } - - isDetecting = true; - - ScannerUtils.detect( - image: image, - detectInImage: _barcodeDetector.detectInImage, - imageRotation: sensorOrientation, - ).then( - (dynamic result) { - _handleResult( - barcodes: result, - data: data, - imageSize: Size(image.width.toDouble(), image.height.toDouble()), - ); - }, - ).whenComplete(() => isDetecting = false); - }); - } - - bool get _barcodeNearAnimationInProgress { - return _currentState == AnimationState.barcodeNear && - DateTime.now().millisecondsSinceEpoch - _animationStart < 2500; - } - - void _handleResult({ - @required List barcodes, - @required MediaQueryData data, - @required Size imageSize, - }) { - if (!_cameraController.value.isStreamingImages) { - return; - } - - final EdgeInsets padding = data.padding; - final double maxLogicalHeight = - data.size.height - padding.top - padding.bottom; - - // Width & height are flipped from CameraController.previewSize on iOS - final double imageHeight = defaultTargetPlatform == TargetPlatform.iOS - ? imageSize.height - : imageSize.width; - - final double imageScale = imageHeight / maxLogicalHeight; - final double halfWidth = imageScale * widget.validRectangle.width / 2; - final double halfHeight = imageScale * widget.validRectangle.height / 2; - - final Offset center = imageSize.center(Offset.zero); - final Rect validRect = Rect.fromLTRB( - center.dx - halfWidth, - center.dy - halfHeight, - center.dx + halfWidth, - center.dy + halfHeight, - ); - - for (Barcode barcode in barcodes) { - final Rect intersection = validRect.intersect(barcode.boundingBox); - - final bool doesContain = intersection == barcode.boundingBox; - - if (doesContain) { - _cameraController.stopImageStream().then((_) => _takePicture()); - - if (_currentState != AnimationState.barcodeFound) { - _closeWindow = true; - _scannerHint = 'Loading Information...'; - _switchAnimationState(AnimationState.barcodeFound); - setState(() {}); - } - return; - } else if (barcode.boundingBox.overlaps(validRect)) { - if (_currentState != AnimationState.barcodeNear) { - _scannerHint = 'Move closer to the barcode'; - _switchAnimationState(AnimationState.barcodeNear); - setState(() {}); - } - return; - } - } - - if (_barcodeNearAnimationInProgress) { - return; - } - - if (_currentState != AnimationState.search) { - _scannerHint = null; - _switchAnimationState(AnimationState.search); - setState(() {}); - } - } - - @override - void dispose() { - _currentState = AnimationState.endSearch; - _cameraController?.stopImageStream(); - _cameraController?.dispose(); - _animationController?.dispose(); - _barcodeDetector.close(); - - SystemChrome.setPreferredOrientations([]); - SystemChrome.setEnabledSystemUIOverlays([ - SystemUiOverlay.top, - SystemUiOverlay.bottom, - ]); - - super.dispose(); - } - - Future _takePicture() async { - final Directory extDir = await getApplicationDocumentsDirectory(); - - final String dirPath = '${extDir.path}/Pictures/barcodePics'; - await Directory(dirPath).create(recursive: true); - - final String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); - - final String filePath = '$dirPath/$timestamp.jpg'; - - try { - await _cameraController.takePicture(filePath); - } on CameraException catch (e) { - print(e); - } - - _cameraController.dispose(); - _cameraController = null; - - setState(() { - _barcodePictureFilePath = filePath; - }); - } - - Widget _buildCameraPreview() { - return Container( - color: Colors.black, - child: Transform.scale( - scale: _getImageZoom(MediaQuery.of(context)), - child: Center( - child: AspectRatio( - aspectRatio: _cameraController.value.aspectRatio, - child: CameraPreview(_cameraController), - ), - ), - ), - ); - } - - double _getImageZoom(MediaQueryData data) { - final double logicalWidth = data.size.width; - final double logicalHeight = _previewSize.aspectRatio * logicalWidth; - - final EdgeInsets padding = data.padding; - final double maxLogicalHeight = - data.size.height - padding.top - padding.bottom; - - return maxLogicalHeight / logicalHeight; - } - - void _showBottomSheet() { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return Container( - width: double.infinity, - height: 368, - child: Column( - children: [ - Container( - height: 56, - alignment: Alignment.centerLeft, - decoration: BoxDecoration( - border: Border(bottom: const BorderSide(color: Colors.grey)), - ), - child: Padding( - padding: const EdgeInsets.all(16), - child: Text( - '1 result found', - style: Theme.of(context).textTheme.body2, - ), - ), - ), - Expanded( - child: Container( - padding: const EdgeInsets.all(24), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset( - 'assets/span_book.jpg', - fit: BoxFit.cover, - width: 96, - height: 96, - ), - Container( - height: 96, - margin: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - margin: const EdgeInsets.only(bottom: 4), - child: Text( - 'SPAN Reader', - style: Theme.of(context).textTheme.body2, - ), - ), - Text( - 'Vol. 2', - style: Theme.of(context).textTheme.body2, - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Container( - margin: - const EdgeInsets.only(bottom: 3), - child: const Text('Material Design'), - ), - const Text('120 pages'), - ], - ), - ), - ], - ), - ) - ], - ), - Container( - margin: const EdgeInsets.only(top: 30), - child: const Text( - 'A Japanese & English accompaniment to the 2016 SPAN ' - 'conference.', - ), - ), - Expanded( - child: Container( - padding: const EdgeInsets.only(bottom: 4), - alignment: Alignment.bottomCenter, - child: ButtonTheme( - minWidth: 312, - height: 48, - child: RaisedButton.icon( - onPressed: () => Navigator.of(context).pop(), - color: kShrinePink100, - label: const Text('ADD TO CART - \$12.99'), - icon: const Icon(Icons.add_shopping_cart), - elevation: 8.0, - shape: const BeveledRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(7.0), - ), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ], - ), - ); - }, - ).then((_) => _reset()); - } - - void _reset() { - _initCameraAndScanner(); - setState(() { - _closeWindow = false; - _barcodePictureFilePath = null; - _scannerHint = null; - _switchAnimationState(AnimationState.search); - }); - } - - @override - Widget build(BuildContext context) { - Widget background; - if (_barcodePictureFilePath != null) { - background = Container( - color: Colors.black, - child: Transform.scale( - scale: _getImageZoom(MediaQuery.of(context)), - child: Center( - child: Image.file( - File(_barcodePictureFilePath), - fit: BoxFit.fitWidth, - ), - ), - ), - ); - } else if (_cameraController != null && - _cameraController.value.isInitialized) { - background = _buildCameraPreview(); - } else { - background = Container( - color: Colors.black, - ); - } - - return SafeArea( - child: Scaffold( - body: Stack( - children: [ - background, - Container( - constraints: const BoxConstraints.expand(), - child: CustomPaint( - painter: WindowPainter( - windowSize: Size(widget.validRectangle.width, - widget.validRectangle.height), - outerFrameColor: widget.frameColor, - closeWindow: _closeWindow, - innerFrameColor: _currentState == AnimationState.endSearch - ? Colors.transparent - : kShrineFrameBrown, - ), - ), - ), - Positioned( - left: 0, - right: 0, - top: 0, - child: Container( - height: 56, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: const [Colors.black87, Colors.transparent], - ), - ), - ), - ), - Positioned( - left: 0.0, - bottom: 0.0, - right: 0.0, - height: 56, - child: Container( - color: kShrinePink50, - child: Center( - child: Text( - _scannerHint ?? 'Point your camera at a barcode', - style: Theme.of(context).textTheme.button, - ), - ), - ), - ), - Container( - constraints: const BoxConstraints.expand(), - child: CustomPaint( - painter: _animationPainter, - ), - ), - AppBar( - leading: IconButton( - icon: const Icon(Icons.close, color: Colors.white), - onPressed: () => Navigator.of(context).pop(), - ), - backgroundColor: Colors.transparent, - elevation: 0.0, - actions: [ - IconButton( - icon: const Icon( - Icons.flash_off, - color: Colors.white, - ), - onPressed: () {}, - ), - IconButton( - icon: const Icon( - Icons.help_outline, - color: Colors.white, - ), - onPressed: () {}, - ), - ], - ), - ], - ), - ), - ); - } -} - -class WindowPainter extends CustomPainter { - WindowPainter({ - @required this.windowSize, - this.outerFrameColor = Colors.white54, - this.innerFrameColor = const Color(0xFF442C2E), - this.innerFrameStrokeWidth = 3, - this.closeWindow = false, - }); - - final Size windowSize; - final Color outerFrameColor; - final Color innerFrameColor; - final double innerFrameStrokeWidth; - final bool closeWindow; - - @override - void paint(Canvas canvas, Size size) { - final Offset center = size.center(Offset.zero); - final double windowHalfWidth = windowSize.width / 2; - final double windowHalfHeight = windowSize.height / 2; - - final Rect windowRect = Rect.fromLTRB( - center.dx - windowHalfWidth, - center.dy - windowHalfHeight, - center.dx + windowHalfWidth, - center.dy + windowHalfHeight, - ); - - final Rect left = - Rect.fromLTRB(0, windowRect.top, windowRect.left, windowRect.bottom); - final Rect top = Rect.fromLTRB(0, 0, size.width, windowRect.top); - final Rect right = Rect.fromLTRB( - windowRect.right, - windowRect.top, - size.width, - windowRect.bottom, - ); - final Rect bottom = Rect.fromLTRB( - 0, - windowRect.bottom, - size.width, - size.height, - ); - - canvas.drawRect( - windowRect, - Paint() - ..color = innerFrameColor - ..style = PaintingStyle.stroke - ..strokeWidth = innerFrameStrokeWidth); - - final Paint paint = Paint()..color = outerFrameColor; - canvas.drawRect(left, paint); - canvas.drawRect(top, paint); - canvas.drawRect(right, paint); - canvas.drawRect(bottom, paint); - - if (closeWindow) { - canvas.drawRect(windowRect, paint); - } - } - - @override - bool shouldRepaint(WindowPainter oldDelegate) => - oldDelegate.closeWindow != closeWindow; -} - -class Rectangle { - const Rectangle({this.width, this.height, this.color}); - - final double width; - final double height; - final Color color; - - static Rectangle lerp(Rectangle begin, Rectangle end, double t) { - Color color; - if (t > .5) { - color = Color.lerp(begin.color, end.color, (t - .5) / .25); - } else { - color = begin.color; - } - - return Rectangle( - width: lerpDouble(begin.width, end.width, t), - height: lerpDouble(begin.height, end.height, t), - color: color, - ); - } -} - -class RectangleTween extends Tween { - RectangleTween(Rectangle begin, Rectangle end) - : super(begin: begin, end: end); - - @override - Rectangle lerp(double t) => Rectangle.lerp(begin, end, t); -} - -class RectangleOutlinePainter extends CustomPainter { - RectangleOutlinePainter({ - @required this.animation, - this.strokeWidth = 3, - }) : super(repaint: animation); - - final Animation animation; - final double strokeWidth; - - @override - void paint(Canvas canvas, Size size) { - final Rectangle rectangle = animation.value; - - final Paint paint = Paint() - ..strokeWidth = strokeWidth - ..color = rectangle.color - ..style = PaintingStyle.stroke; - - final Offset center = size.center(Offset.zero); - final double halfWidth = rectangle.width / 2; - final double halfHeight = rectangle.height / 2; - - final Rect rect = Rect.fromLTRB( - center.dx - halfWidth, - center.dy - halfHeight, - center.dx + halfWidth, - center.dy + halfHeight, - ); - - canvas.drawRect(rect, paint); - } - - @override - bool shouldRepaint(RectangleOutlinePainter oldDelegate) => false; -} - -class RectangleTracePainter extends CustomPainter { - RectangleTracePainter({ - @required this.animation, - @required this.rectangle, - this.strokeWidth = 3, - }) : super(repaint: animation); - - final Animation animation; - final Rectangle rectangle; - final double strokeWidth; - - @override - void paint(Canvas canvas, Size size) { - final double value = animation.value; - - final Offset center = size.center(Offset.zero); - final double halfWidth = rectangle.width / 2; - final double halfHeight = rectangle.height / 2; - - final Rect rect = Rect.fromLTRB( - center.dx - halfWidth, - center.dy - halfHeight, - center.dx + halfWidth, - center.dy + halfHeight, - ); - - final Paint paint = Paint() - ..strokeWidth = strokeWidth - ..color = rectangle.color; - - final double halfStrokeWidth = strokeWidth / 2; - - final double heightProportion = (halfStrokeWidth + rect.height) * value; - final double widthProportion = (halfStrokeWidth + rect.width) * value; - - canvas.drawLine( - Offset(rect.right, rect.bottom + halfStrokeWidth), - Offset(rect.right, rect.bottom - heightProportion), - paint, - ); - - canvas.drawLine( - Offset(rect.right + halfStrokeWidth, rect.bottom), - Offset(rect.right - widthProportion, rect.bottom), - paint, - ); - - canvas.drawLine( - Offset(rect.left, rect.top - halfStrokeWidth), - Offset(rect.left, rect.top + heightProportion), - paint, - ); - - canvas.drawLine( - Offset(rect.left - halfStrokeWidth, rect.top), - Offset(rect.left + widthProportion, rect.top), - paint, - ); - } - - @override - bool shouldRepaint(RectangleTracePainter oldDelegate) => false; -} diff --git a/packages/firebase_ml_vision/example/lib/picture_scanner.dart b/packages/firebase_ml_vision/example/lib/picture_scanner.dart deleted file mode 100644 index 182a55a46020..000000000000 --- a/packages/firebase_ml_vision/example/lib/picture_scanner.dart +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:io'; -import 'dart:ui'; - -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/material.dart'; -import 'package:image_picker/image_picker.dart'; - -import 'detector_painters.dart'; - -class PictureScanner extends StatefulWidget { - @override - State createState() => _PictureScannerState(); -} - -class _PictureScannerState extends State { - File _imageFile; - Size _imageSize; - dynamic _scanResults; - Detector _currentDetector = Detector.text; - final BarcodeDetector _barcodeDetector = - FirebaseVision.instance.barcodeDetector(); - final FaceDetector _faceDetector = FirebaseVision.instance.faceDetector(); - final ImageLabeler _imageLabeler = FirebaseVision.instance.imageLabeler(); - final ImageLabeler _cloudImageLabeler = - FirebaseVision.instance.cloudImageLabeler(); - final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer(); - final TextRecognizer _cloudRecognizer = - FirebaseVision.instance.cloudTextRecognizer(); - - Future _getAndScanImage() async { - setState(() { - _imageFile = null; - _imageSize = null; - }); - - final File imageFile = - await ImagePicker.pickImage(source: ImageSource.gallery); - - if (imageFile != null) { - _getImageSize(imageFile); - _scanImage(imageFile); - } - - setState(() { - _imageFile = imageFile; - }); - } - - Future _getImageSize(File imageFile) async { - final Completer completer = Completer(); - - final Image image = Image.file(imageFile); - image.image.resolve(const ImageConfiguration()).addListener( - ImageStreamListener((ImageInfo info, bool _) { - completer.complete(Size( - info.image.width.toDouble(), - info.image.height.toDouble(), - )); - }), - ); - - final Size imageSize = await completer.future; - setState(() { - _imageSize = imageSize; - }); - } - - Future _scanImage(File imageFile) async { - setState(() { - _scanResults = null; - }); - - final FirebaseVisionImage visionImage = - FirebaseVisionImage.fromFile(imageFile); - - dynamic results; - switch (_currentDetector) { - case Detector.barcode: - results = await _barcodeDetector.detectInImage(visionImage); - break; - case Detector.face: - results = await _faceDetector.processImage(visionImage); - break; - case Detector.label: - results = await _imageLabeler.processImage(visionImage); - break; - case Detector.cloudLabel: - results = await _cloudImageLabeler.processImage(visionImage); - break; - case Detector.text: - results = await _recognizer.processImage(visionImage); - break; - case Detector.cloudText: - results = await _cloudRecognizer.processImage(visionImage); - break; - default: - return; - } - - setState(() { - _scanResults = results; - }); - } - - CustomPaint _buildResults(Size imageSize, dynamic results) { - CustomPainter painter; - - switch (_currentDetector) { - case Detector.barcode: - painter = BarcodeDetectorPainter(_imageSize, results); - break; - case Detector.face: - painter = FaceDetectorPainter(_imageSize, results); - break; - case Detector.label: - painter = LabelDetectorPainter(_imageSize, results); - break; - case Detector.cloudLabel: - painter = LabelDetectorPainter(_imageSize, results); - break; - case Detector.text: - painter = TextDetectorPainter(_imageSize, results); - break; - case Detector.cloudText: - painter = TextDetectorPainter(_imageSize, results); - break; - default: - break; - } - - return CustomPaint( - painter: painter, - ); - } - - Widget _buildImage() { - return Container( - constraints: const BoxConstraints.expand(), - decoration: BoxDecoration( - image: DecorationImage( - image: Image.file(_imageFile).image, - fit: BoxFit.fill, - ), - ), - child: _imageSize == null || _scanResults == null - ? const Center( - child: Text( - 'Scanning...', - style: TextStyle( - color: Colors.green, - fontSize: 30.0, - ), - ), - ) - : _buildResults(_imageSize, _scanResults), - ); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Picture Scanner'), - actions: [ - PopupMenuButton( - onSelected: (Detector result) { - _currentDetector = result; - if (_imageFile != null) _scanImage(_imageFile); - }, - itemBuilder: (BuildContext context) => >[ - const PopupMenuItem( - child: Text('Detect Barcode'), - value: Detector.barcode, - ), - const PopupMenuItem( - child: Text('Detect Face'), - value: Detector.face, - ), - const PopupMenuItem( - child: Text('Detect Label'), - value: Detector.label, - ), - const PopupMenuItem( - child: Text('Detect Cloud Label'), - value: Detector.cloudLabel, - ), - const PopupMenuItem( - child: Text('Detect Text'), - value: Detector.text, - ), - const PopupMenuItem( - child: Text('Detect Cloud Text'), - value: Detector.cloudText, - ), - ], - ), - ], - ), - body: _imageFile == null - ? const Center(child: Text('No image selected.')) - : _buildImage(), - floatingActionButton: FloatingActionButton( - onPressed: _getAndScanImage, - tooltip: 'Pick Image', - child: const Icon(Icons.add_a_photo), - ), - ); - } - - @override - void dispose() { - _barcodeDetector.close(); - _faceDetector.close(); - _imageLabeler.close(); - _cloudImageLabeler.close(); - _recognizer.close(); - _cloudRecognizer.close(); - super.dispose(); - } -} diff --git a/packages/firebase_ml_vision/example/lib/scanner_utils.dart b/packages/firebase_ml_vision/example/lib/scanner_utils.dart deleted file mode 100644 index 6bd156448189..000000000000 --- a/packages/firebase_ml_vision/example/lib/scanner_utils.dart +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:typed_data'; -import 'dart:ui'; - -import 'package:camera/camera.dart'; -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/foundation.dart'; - -class ScannerUtils { - ScannerUtils._(); - - static Future getCamera(CameraLensDirection dir) async { - return await availableCameras().then( - (List cameras) => cameras.firstWhere( - (CameraDescription camera) => camera.lensDirection == dir, - ), - ); - } - - static Future detect({ - @required CameraImage image, - @required Future Function(FirebaseVisionImage image) detectInImage, - @required int imageRotation, - }) async { - return detectInImage( - FirebaseVisionImage.fromBytes( - _concatenatePlanes(image.planes), - _buildMetaData(image, _rotationIntToImageRotation(imageRotation)), - ), - ); - } - - static Uint8List _concatenatePlanes(List planes) { - final WriteBuffer allBytes = WriteBuffer(); - for (Plane plane in planes) { - allBytes.putUint8List(plane.bytes); - } - return allBytes.done().buffer.asUint8List(); - } - - static FirebaseVisionImageMetadata _buildMetaData( - CameraImage image, - ImageRotation rotation, - ) { - return FirebaseVisionImageMetadata( - rawFormat: image.format.raw, - size: Size(image.width.toDouble(), image.height.toDouble()), - rotation: rotation, - planeData: image.planes.map( - (Plane plane) { - return FirebaseVisionImagePlaneMetadata( - bytesPerRow: plane.bytesPerRow, - height: plane.height, - width: plane.width, - ); - }, - ).toList(), - ); - } - - static ImageRotation _rotationIntToImageRotation(int rotation) { - switch (rotation) { - case 0: - return ImageRotation.rotation0; - case 90: - return ImageRotation.rotation90; - case 180: - return ImageRotation.rotation180; - default: - assert(rotation == 270); - return ImageRotation.rotation270; - } - } -} diff --git a/packages/firebase_ml_vision/example/pubspec.yaml b/packages/firebase_ml_vision/example/pubspec.yaml deleted file mode 100644 index f8ecf0e489f2..000000000000 --- a/packages/firebase_ml_vision/example/pubspec.yaml +++ /dev/null @@ -1,32 +0,0 @@ -name: firebase_ml_vision_example -description: Demonstrates how to use the firebase_ml_vision plugin. -author: Flutter Team - -dependencies: - flutter: - sdk: flutter - - image_picker: ^0.5.0 - cupertino_icons: ^0.1.2 - firebase_ml_vision: - path: ../ - firebase_core: ^0.4.0 - camera: ^0.5.2+1 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - path: ^1.6.2 - path_provider: ^0.5.0+1 - -flutter: - uses-material-design: true - assets: - - assets/test_face.jpg - - assets/test_barcode.jpg - - assets/test_contact_barcode.png - - assets/test_text.png - - assets/span_book.jpg diff --git a/packages/firebase_ml_vision/example/test_driver/barcode_detector.dart b/packages/firebase_ml_vision/example/test_driver/barcode_detector.dart deleted file mode 100644 index 43cdb0375d80..000000000000 --- a/packages/firebase_ml_vision/example/test_driver/barcode_detector.dart +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of 'firebase_ml_vision.dart'; - -void barcodeDetectorTests() { - group('$BarcodeDetector', () { - final BarcodeDetector detector = FirebaseVision.instance.barcodeDetector(); - - test('detectInImage', () async { - final String tmpFilename = await _loadImage('assets/test_barcode.jpg'); - final FirebaseVisionImage visionImage = - FirebaseVisionImage.fromFilePath(tmpFilename); - - final List barcodes = await detector.detectInImage( - visionImage, - ); - - expect(barcodes.length, 1); - }); - - test('detectInImage contactInfo', () async { - final String tmpFilename = await _loadImage( - 'assets/test_contact_barcode.png', - ); - - final FirebaseVisionImage visionImage = FirebaseVisionImage.fromFilePath( - tmpFilename, - ); - - final BarcodeDetector detector = - FirebaseVision.instance.barcodeDetector(); - final List barcodes = await detector.detectInImage( - visionImage, - ); - - expect(barcodes, hasLength(1)); - final BarcodeContactInfo info = barcodes[0].contactInfo; - - final BarcodePersonName name = info.name; - expect(name.first, 'John'); - expect(name.last, 'Doe'); - expect(name.formattedName, 'John Doe'); - expect(name.middle, anyOf(isNull, isEmpty)); - expect(name.prefix, anyOf(isNull, isEmpty)); - expect(name.pronunciation, anyOf(isNull, isEmpty)); - expect(name.suffix, anyOf(isNull, isEmpty)); - - expect(info.jobTitle, anyOf(isNull, isEmpty)); - expect(info.organization, anyOf(isNull, isEmpty)); - expect(info.urls, ['http://www.example.com']); - expect(info.addresses, anyOf(isNull, isEmpty)); - - expect(info.emails, hasLength(1)); - final BarcodeEmail email = info.emails[0]; - expect(email.address, 'email@example.com'); - expect(email.body, anyOf(isNull, isEmpty)); - expect(email.subject, anyOf(isNull, isEmpty)); - expect(email.type, BarcodeEmailType.unknown); - - expect(info.phones, hasLength(1)); - final BarcodePhone phone = info.phones[0]; - expect(phone.number, '555-555-5555'); - expect(phone.type, BarcodePhoneType.unknown); - }); - - test('close', () { - expect(detector.close(), completes); - }); - }); -} diff --git a/packages/firebase_ml_vision/example/test_driver/face_detector.dart b/packages/firebase_ml_vision/example/test_driver/face_detector.dart deleted file mode 100644 index 666b200e301c..000000000000 --- a/packages/firebase_ml_vision/example/test_driver/face_detector.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of 'firebase_ml_vision.dart'; - -void faceDetectorTests() { - group('$FaceDetector', () { - final FaceDetector detector = FirebaseVision.instance.faceDetector( - FaceDetectorOptions( - enableContours: true, mode: FaceDetectorMode.accurate), - ); - - test('processImage', () async { - final String tmpFilename = await _loadImage('assets/test_face.jpg'); - final FirebaseVisionImage visionImage = - FirebaseVisionImage.fromFilePath(tmpFilename); - - final List faces = await detector.processImage(visionImage); - - expect(faces.length, 1); - expect( - faces[0].getContour(FaceContourType.allPoints).positionsList, - isNotEmpty, - ); - }); - - test('close', () { - expect(detector.close(), completes); - }); - }); -} diff --git a/packages/firebase_ml_vision/example/test_driver/firebase_ml_vision.dart b/packages/firebase_ml_vision/example/test_driver/firebase_ml_vision.dart deleted file mode 100644 index 18ab23047250..000000000000 --- a/packages/firebase_ml_vision/example/test_driver/firebase_ml_vision.dart +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:flutter/services.dart'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:path/path.dart' as path; -import 'package:path_provider/path_provider.dart'; - -part 'barcode_detector.dart'; -part 'face_detector.dart'; -part 'image_labeler.dart'; -part 'text_recognizer.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$FirebaseVision', () { - barcodeDetectorTests(); - faceDetectorTests(); - imageLabelerTests(); - textRecognizerTests(); - }); -} - -int nextHandle = 0; - -// Since there is no way to get the full asset filename, this method loads the -// image into a temporary file. -Future _loadImage(String assetFilename) async { - final Directory directory = await getTemporaryDirectory(); - - final String tmpFilename = path.join( - directory.path, - "tmp${nextHandle++}.jpg", - ); - - final ByteData data = await rootBundle.load(assetFilename); - final Uint8List bytes = data.buffer.asUint8List( - data.offsetInBytes, - data.lengthInBytes, - ); - - await File(tmpFilename).writeAsBytes(bytes); - - return tmpFilename; -} diff --git a/packages/firebase_ml_vision/example/test_driver/firebase_ml_vision_test.dart b/packages/firebase_ml_vision/example/test_driver/firebase_ml_vision_test.dart deleted file mode 100644 index b9753054ad5b..000000000000 --- a/packages/firebase_ml_vision/example/test_driver/firebase_ml_vision_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_driver/flutter_driver.dart'; - -void main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_ml_vision/example/test_driver/image_labeler.dart b/packages/firebase_ml_vision/example/test_driver/image_labeler.dart deleted file mode 100644 index fa1655583271..000000000000 --- a/packages/firebase_ml_vision/example/test_driver/image_labeler.dart +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of 'firebase_ml_vision.dart'; - -void imageLabelerTests() { - group('$ImageLabeler', () { - final ImageLabeler labeler = FirebaseVision.instance.imageLabeler(); - - test('processImage', () async { - final String tmpFilename = await _loadImage('assets/test_barcode.jpg'); - final FirebaseVisionImage visionImage = - FirebaseVisionImage.fromFilePath(tmpFilename); - - final List labels = await labeler.processImage(visionImage); - - expect(labels.length, greaterThan(0)); - }); - - test('close', () { - expect(labeler.close(), completes); - }); - }); -} diff --git a/packages/firebase_ml_vision/example/test_driver/text_recognizer.dart b/packages/firebase_ml_vision/example/test_driver/text_recognizer.dart deleted file mode 100644 index 49810f32db50..000000000000 --- a/packages/firebase_ml_vision/example/test_driver/text_recognizer.dart +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of 'firebase_ml_vision.dart'; - -void textRecognizerTests() { - group('$TextRecognizer', () { - final TextRecognizer recognizer = FirebaseVision.instance.textRecognizer(); - - test('processImage', () async { - final String tmpFilename = await _loadImage('assets/test_text.png'); - final FirebaseVisionImage visionImage = - FirebaseVisionImage.fromFilePath(tmpFilename); - - final VisionText text = await recognizer.processImage(visionImage); - - expect(text.text, 'TEXT'); - }); - - test('close', () { - expect(recognizer.close(), completes); - }); - }); -} diff --git a/packages/firebase_ml_vision/ios/Assets/.gitkeep b/packages/firebase_ml_vision/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m b/packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m deleted file mode 100644 index 810b2417dfbf..000000000000 --- a/packages/firebase_ml_vision/ios/Classes/BarcodeDetector.m +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseMlVisionPlugin.h" - -@interface BarcodeDetector () -@property FIRVisionBarcodeDetector *detector; -@end - -@implementation BarcodeDetector -- (instancetype)initWithVision:(FIRVision *)vision options:(NSDictionary *)options { - self = [super init]; - if (self) { - _detector = [vision barcodeDetectorWithOptions:[BarcodeDetector parseOptions:options]]; - } - return self; -} - -- (void)handleDetection:(FIRVisionImage *)image result:(FlutterResult)result { - [_detector detectInImage:image - completion:^(NSArray *barcodes, NSError *error) { - if (error) { - [FLTFirebaseMlVisionPlugin handleError:error result:result]; - return; - } else if (!barcodes) { - result(@[]); - return; - } - - NSMutableArray *ret = [NSMutableArray array]; - for (FIRVisionBarcode *barcode in barcodes) { - [ret addObject:visionBarcodeToDictionary(barcode)]; - } - result(ret); - }]; -} - -NSDictionary *visionBarcodeToDictionary(FIRVisionBarcode *barcode) { - __block NSMutableArray *points = [NSMutableArray array]; - - for (NSValue *point in barcode.cornerPoints) { - [points addObject:@[ @(point.CGPointValue.x), @(point.CGPointValue.y) ]]; - } - return @{ - @"rawValue" : barcode.rawValue, - @"displayValue" : barcode.displayValue ? barcode.displayValue : [NSNull null], - @"left" : @(barcode.frame.origin.x), - @"top" : @(barcode.frame.origin.y), - @"width" : @(barcode.frame.size.width), - @"height" : @(barcode.frame.size.height), - @"format" : @(barcode.format), - @"valueType" : @(barcode.valueType), - @"points" : points, - @"wifi" : barcode.wifi ? visionBarcodeWiFiToDictionary(barcode.wifi) : [NSNull null], - @"email" : barcode.email ? visionBarcodeEmailToDictionary(barcode.email) : [NSNull null], - @"phone" : barcode.phone ? visionBarcodePhoneToDictionary(barcode.phone) : [NSNull null], - @"sms" : barcode.sms ? visionBarcodeSMSToDictionary(barcode.sms) : [NSNull null], - @"url" : barcode.URL ? visionBarcodeURLToDictionary(barcode.URL) : [NSNull null], - @"geoPoint" : barcode.geoPoint ? visionBarcodeGeoPointToDictionary(barcode.geoPoint) - : [NSNull null], - @"contactInfo" : barcode.contactInfo ? barcodeContactInfoToDictionary(barcode.contactInfo) - : [NSNull null], - @"calendarEvent" : barcode.calendarEvent ? calendarEventToDictionary(barcode.calendarEvent) - : [NSNull null], - @"driverLicense" : barcode.driverLicense ? driverLicenseToDictionary(barcode.driverLicense) - : [NSNull null], - }; -} - -NSDictionary *visionBarcodeWiFiToDictionary(FIRVisionBarcodeWiFi *wifi) { - return @{ - @"ssid" : wifi.ssid, - @"password" : wifi.password, - @"encryptionType" : @(wifi.type), - }; -} - -NSDictionary *visionBarcodeEmailToDictionary(FIRVisionBarcodeEmail *email) { - return @{ - @"address" : email.address, - @"body" : email.body, - @"subject" : email.subject, - @"type" : @(email.type), - }; -} - -NSDictionary *visionBarcodePhoneToDictionary(FIRVisionBarcodePhone *phone) { - return @{ - @"number" : phone.number, - @"type" : @(phone.type), - }; -} - -NSDictionary *visionBarcodeSMSToDictionary(FIRVisionBarcodeSMS *sms) { - return @{ - @"phoneNumber" : sms.phoneNumber, - @"message" : sms.message, - }; -} - -NSDictionary *visionBarcodeURLToDictionary(FIRVisionBarcodeURLBookmark *url) { - return @{ - @"title" : url.title ? url.title : [NSNull null], - @"url" : url.url ? url.url : [NSNull null], - }; -} - -NSDictionary *visionBarcodeGeoPointToDictionary(FIRVisionBarcodeGeoPoint *geo) { - return @{ - @"longitude" : @(geo.longitude), - @"latitude" : @(geo.latitude), - }; -} - -NSDictionary *barcodeContactInfoToDictionary(FIRVisionBarcodeContactInfo *contact) { - __block NSMutableArray *addresses = [NSMutableArray array]; - [contact.addresses enumerateObjectsUsingBlock:^(FIRVisionBarcodeAddress *_Nonnull address, - NSUInteger idx, BOOL *_Nonnull stop) { - __block NSMutableArray *addressLines = [NSMutableArray array]; - [address.addressLines enumerateObjectsUsingBlock:^(NSString *_Nonnull addressLine, - NSUInteger idx, BOOL *_Nonnull stop) { - [addressLines addObject:addressLine]; - }]; - [addresses addObject:@{ - @"addressLines" : addressLines, - @"type" : @(address.type), - }]; - }]; - - __block NSMutableArray *emails = [NSMutableArray array]; - [contact.emails enumerateObjectsUsingBlock:^(FIRVisionBarcodeEmail *_Nonnull email, - NSUInteger idx, BOOL *_Nonnull stop) { - [emails addObject:@{ - @"address" : email.address ? email.address : [NSNull null], - @"body" : email.body ? email.body : [NSNull null], - @"subject" : email.subject ? email.subject : [NSNull null], - @"type" : @(email.type), - }]; - }]; - - __block NSMutableArray *phones = [NSMutableArray array]; - [contact.phones enumerateObjectsUsingBlock:^(FIRVisionBarcodePhone *_Nonnull phone, - NSUInteger idx, BOOL *_Nonnull stop) { - [phones addObject:@{ - @"number" : phone.number ? phone.number : [NSNull null], - @"type" : @(phone.type), - }]; - }]; - - __block NSMutableArray *urls = [NSMutableArray array]; - [contact.urls - enumerateObjectsUsingBlock:^(NSString *_Nonnull url, NSUInteger idx, BOOL *_Nonnull stop) { - [urls addObject:url]; - }]; - return @{ - @"addresses" : addresses, - @"emails" : emails, - @"phones" : phones, - @"urls" : urls, - @"name" : @{ - @"formattedName" : contact.name.formattedName ? contact.name.formattedName : [NSNull null], - @"first" : contact.name.first ? contact.name.first : [NSNull null], - @"last" : contact.name.last ? contact.name.last : [NSNull null], - @"middle" : contact.name.middle ? contact.name.middle : [NSNull null], - @"prefix" : contact.name.prefix ? contact.name.prefix : [NSNull null], - @"pronunciation" : contact.name.pronounciation ? contact.name.pronounciation : [NSNull null], - @"suffix" : contact.name.suffix ? contact.name.suffix : [NSNull null], - }, - @"jobTitle" : contact.jobTitle ? contact.jobTitle : [NSNull null], - @"organization" : contact.organization ? contact.jobTitle : [NSNull null], - }; -} - -NSDictionary *calendarEventToDictionary(FIRVisionBarcodeCalendarEvent *calendar) { - NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; - dateFormatter.dateFormat = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"; - dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; - return @{ - @"eventDescription" : calendar.eventDescription, - @"location" : calendar.location, - @"organizer" : calendar.organizer, - @"status" : calendar.status, - @"summary" : calendar.summary, - @"start" : [dateFormatter stringFromDate:calendar.start], - @"end" : [dateFormatter stringFromDate:calendar.end], - }; -} - -NSDictionary *driverLicenseToDictionary(FIRVisionBarcodeDriverLicense *license) { - return @{ - @"firstName" : license.firstName, - @"middleName" : license.middleName, - @"lastName" : license.lastName, - @"gender" : license.gender, - @"addressCity" : license.addressCity, - @"addressStreet" : license.addressStreet, - @"addressState" : license.addressState, - @"addressZip" : license.addressZip, - @"birthDate" : license.birthDate, - @"documentType" : license.documentType, - @"licenseNumber" : license.licenseNumber, - @"expiryDate" : license.expiryDate, - @"issuingDate" : license.issuingDate, - @"issuingCountry" : license.issuingCountry, - }; -} - -+ (FIRVisionBarcodeDetectorOptions *)parseOptions:(NSDictionary *)optionsData { - NSNumber *barcodeFormat = optionsData[@"barcodeFormats"]; - return [[FIRVisionBarcodeDetectorOptions alloc] - initWithFormats:(FIRVisionBarcodeFormat)barcodeFormat.intValue]; -} -@end diff --git a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m b/packages/firebase_ml_vision/ios/Classes/FaceDetector.m deleted file mode 100644 index 9d9bed56567f..000000000000 --- a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseMlVisionPlugin.h" - -@interface FaceDetector () -@property FIRVisionFaceDetector *detector; -@end - -@implementation FaceDetector -- (instancetype)initWithVision:(FIRVision *)vision options:(NSDictionary *)options { - self = [super init]; - if (self) { - _detector = [vision faceDetectorWithOptions:[FaceDetector parseOptions:options]]; - } - return self; -} - -- (void)handleDetection:(FIRVisionImage *)image result:(FlutterResult)result { - [_detector - processImage:image - completion:^(NSArray *_Nullable faces, NSError *_Nullable error) { - if (error) { - [FLTFirebaseMlVisionPlugin handleError:error result:result]; - return; - } else if (!faces) { - result(@[]); - return; - } - - NSMutableArray *faceData = [NSMutableArray array]; - for (FIRVisionFace *face in faces) { - id smileProb = face.hasSmilingProbability ? @(face.smilingProbability) : [NSNull null]; - id leftProb = - face.hasLeftEyeOpenProbability ? @(face.leftEyeOpenProbability) : [NSNull null]; - id rightProb = - face.hasRightEyeOpenProbability ? @(face.rightEyeOpenProbability) : [NSNull null]; - - NSDictionary *data = @{ - @"left" : @(face.frame.origin.x), - @"top" : @(face.frame.origin.y), - @"width" : @(face.frame.size.width), - @"height" : @(face.frame.size.height), - @"headEulerAngleY" : face.hasHeadEulerAngleY ? @(face.headEulerAngleY) - : [NSNull null], - @"headEulerAngleZ" : face.hasHeadEulerAngleZ ? @(face.headEulerAngleZ) - : [NSNull null], - @"smilingProbability" : smileProb, - @"leftEyeOpenProbability" : leftProb, - @"rightEyeOpenProbability" : rightProb, - @"trackingId" : face.hasTrackingID ? @(face.trackingID) : [NSNull null], - @"landmarks" : @{ - @"bottomMouth" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeMouthBottom], - @"leftCheek" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeLeftCheek], - @"leftEar" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeLeftEar], - @"leftEye" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeLeftEye], - @"leftMouth" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeMouthLeft], - @"noseBase" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeNoseBase], - @"rightCheek" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeRightCheek], - @"rightEar" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeRightEar], - @"rightEye" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeRightEye], - @"rightMouth" : [FaceDetector getLandmarkPosition:face - landmark:FIRFaceLandmarkTypeMouthRight], - }, - @"contours" : @{ - @"allPoints" : [FaceDetector getContourPoints:face contour:FIRFaceContourTypeAll], - @"face" : [FaceDetector getContourPoints:face contour:FIRFaceContourTypeFace], - @"leftEye" : [FaceDetector getContourPoints:face contour:FIRFaceContourTypeLeftEye], - @"leftEyebrowBottom" : - [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeLeftEyebrowBottom], - @"leftEyebrowTop" : - [FaceDetector getContourPoints:face contour:FIRFaceContourTypeLeftEyebrowTop], - @"lowerLipBottom" : - [FaceDetector getContourPoints:face contour:FIRFaceContourTypeLowerLipBottom], - @"lowerLipTop" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeLowerLipTop], - @"noseBottom" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeNoseBottom], - @"noseBridge" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeNoseBridge], - @"rightEye" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeRightEye], - @"rightEyebrowBottom" : - [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeRightEyebrowBottom], - @"rightEyebrowTop" : - [FaceDetector getContourPoints:face contour:FIRFaceContourTypeRightEyebrowTop], - @"upperLipBottom" : - [FaceDetector getContourPoints:face contour:FIRFaceContourTypeUpperLipBottom], - @"upperLipTop" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeUpperLipTop], - } - }; - - [faceData addObject:data]; - } - - result(faceData); - }]; -} - -+ (id)getLandmarkPosition:(FIRVisionFace *)face landmark:(FIRFaceLandmarkType)landmarkType { - FIRVisionFaceLandmark *landmark = [face landmarkOfType:landmarkType]; - if (landmark) { - return @[ landmark.position.x, landmark.position.y ]; - } - - return [NSNull null]; -} - -+ (id)getContourPoints:(FIRVisionFace *)face contour:(FIRFaceContourType)contourType { - FIRVisionFaceContour *contour = [face contourOfType:contourType]; - if (contour) { - NSArray *contourPoints = contour.points; - NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[contourPoints count]]; - for (int i = 0; i < [contourPoints count]; i++) { - FIRVisionPoint *point = [contourPoints objectAtIndex:i]; - [result insertObject:@[ point.x, point.y ] atIndex:i]; - } - return [result copy]; - } - - return [NSNull null]; -} - -+ (FIRVisionFaceDetectorOptions *)parseOptions:(NSDictionary *)optionsData { - FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init]; - - NSNumber *enableClassification = optionsData[@"enableClassification"]; - if (enableClassification.boolValue) { - options.classificationMode = FIRVisionFaceDetectorClassificationModeAll; - } else { - options.classificationMode = FIRVisionFaceDetectorClassificationModeNone; - } - - NSNumber *enableLandmarks = optionsData[@"enableLandmarks"]; - if (enableLandmarks.boolValue) { - options.landmarkMode = FIRVisionFaceDetectorLandmarkModeAll; - } else { - options.landmarkMode = FIRVisionFaceDetectorLandmarkModeNone; - } - - NSNumber *enableContours = optionsData[@"enableContours"]; - if (enableContours.boolValue) { - options.contourMode = FIRVisionFaceDetectorContourModeAll; - } else { - options.contourMode = FIRVisionFaceDetectorContourModeNone; - } - - NSNumber *enableTracking = optionsData[@"enableTracking"]; - options.trackingEnabled = enableTracking.boolValue; - - NSNumber *minFaceSize = optionsData[@"minFaceSize"]; - options.minFaceSize = [minFaceSize doubleValue]; - - NSString *mode = optionsData[@"mode"]; - if ([mode isEqualToString:@"accurate"]) { - options.performanceMode = FIRVisionFaceDetectorPerformanceModeAccurate; - } else if ([mode isEqualToString:@"fast"]) { - options.performanceMode = FIRVisionFaceDetectorPerformanceModeFast; - } - - return options; -} -@end diff --git a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h b/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h deleted file mode 100644 index 78060e8e1a08..000000000000 --- a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -#import "Firebase/Firebase.h" - -@interface FLTFirebaseMlVisionPlugin : NSObject -+ (void)handleError:(NSError *)error result:(FlutterResult)result; -@end - -@protocol Detector -@required -- (instancetype)initWithVision:(FIRVision *)vision options:(NSDictionary *)options; -- (void)handleDetection:(FIRVisionImage *)image result:(FlutterResult)result; -@optional -@end - -@interface BarcodeDetector : NSObject -@end - -@interface FaceDetector : NSObject -@end - -@interface ImageLabeler : NSObject -@end - -@interface TextRecognizer : NSObject -@end diff --git a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m b/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m deleted file mode 100644 index d453b7928852..000000000000 --- a/packages/firebase_ml_vision/ios/Classes/FirebaseMlVisionPlugin.m +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseMlVisionPlugin.h" -#import "UserAgent.h" - -static FlutterError *getFlutterError(NSError *error) { - return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %d", (int)error.code] - message:error.domain - details:error.localizedDescription]; -} - -@implementation FLTFirebaseMlVisionPlugin -static NSMutableDictionary> *detectors; - -+ (void)handleError:(NSError *)error result:(FlutterResult)result { - result(getFlutterError(error)); -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - detectors = [NSMutableDictionary new]; - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_ml_vision" - binaryMessenger:[registrar messenger]]; - FLTFirebaseMlVisionPlugin *instance = [[FLTFirebaseMlVisionPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"BarcodeDetector#detectInImage" isEqualToString:call.method] || - [@"FaceDetector#processImage" isEqualToString:call.method] || - [@"ImageLabeler#processImage" isEqualToString:call.method] || - [@"TextRecognizer#processImage" isEqualToString:call.method]) { - [self handleDetection:call result:result]; - } else if ([@"BarcodeDetector#close" isEqualToString:call.method] || - [@"FaceDetector#close" isEqualToString:call.method] || - [@"ImageLabeler#close" isEqualToString:call.method] || - [@"TextRecognizer#close" isEqualToString:call.method]) { - NSNumber *handle = call.arguments[@"handle"]; - [detectors removeObjectForKey:handle]; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -- (void)handleDetection:(FlutterMethodCall *)call result:(FlutterResult)result { - FIRVisionImage *image = [self dataToVisionImage:call.arguments]; - NSDictionary *options = call.arguments[@"options"]; - - NSNumber *handle = call.arguments[@"handle"]; - id detector = detectors[handle]; - if (!detector) { - if ([call.method hasPrefix:@"BarcodeDetector"]) { - detector = [[BarcodeDetector alloc] initWithVision:[FIRVision vision] options:options]; - } else if ([call.method hasPrefix:@"FaceDetector"]) { - detector = [[FaceDetector alloc] initWithVision:[FIRVision vision] options:options]; - } else if ([call.method hasPrefix:@"ImageLabeler"]) { - detector = [[ImageLabeler alloc] initWithVision:[FIRVision vision] options:options]; - } else if ([call.method hasPrefix:@"TextRecognizer"]) { - detector = [[TextRecognizer alloc] initWithVision:[FIRVision vision] options:options]; - } - - [FLTFirebaseMlVisionPlugin addDetector:handle detector:detector]; - } - - [detectors[handle] handleDetection:image result:result]; -} - -- (FIRVisionImage *)dataToVisionImage:(NSDictionary *)imageData { - NSString *imageType = imageData[@"type"]; - - if ([@"file" isEqualToString:imageType]) { - return [self filePathToVisionImage:imageData[@"path"]]; - } else if ([@"bytes" isEqualToString:imageType]) { - return [self bytesToVisionImage:imageData]; - } else { - NSString *errorReason = [NSString stringWithFormat:@"No image type for: %@", imageType]; - @throw [NSException exceptionWithName:NSInvalidArgumentException - reason:errorReason - userInfo:nil]; - } -} - -- (FIRVisionImage *)filePathToVisionImage:(NSString *)filePath { - UIImage *image = [UIImage imageWithContentsOfFile:filePath]; - - if (image.imageOrientation != UIImageOrientationUp) { - CGImageRef imgRef = image.CGImage; - CGRect bounds = CGRectMake(0, 0, CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); - UIGraphicsBeginImageContext(bounds.size); - CGContextDrawImage(UIGraphicsGetCurrentContext(), bounds, imgRef); - UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - image = newImage; - } - - return [[FIRVisionImage alloc] initWithImage:image]; -} - -- (FIRVisionImage *)bytesToVisionImage:(NSDictionary *)imageData { - FlutterStandardTypedData *byteData = imageData[@"bytes"]; - NSData *imageBytes = byteData.data; - - NSDictionary *metadata = imageData[@"metadata"]; - NSArray *planeData = metadata[@"planeData"]; - size_t planeCount = planeData.count; - - NSNumber *width = metadata[@"width"]; - NSNumber *height = metadata[@"height"]; - - NSNumber *rawFormat = metadata[@"rawFormat"]; - FourCharCode format = FOUR_CHAR_CODE(rawFormat.unsignedIntValue); - - CVPixelBufferRef pxBuffer = NULL; - if (planeCount == 0) { - @throw [NSException exceptionWithName:NSInvalidArgumentException - reason:@"Can't create image buffer with 0 planes." - userInfo:nil]; - } else if (planeCount == 1) { - NSDictionary *plane = planeData[0]; - NSNumber *bytesPerRow = plane[@"bytesPerRow"]; - - pxBuffer = [self bytesToPixelBuffer:width.unsignedLongValue - height:height.unsignedLongValue - format:format - baseAddress:(void *)imageBytes.bytes - bytesPerRow:bytesPerRow.unsignedLongValue]; - } else { - pxBuffer = [self planarBytesToPixelBuffer:width.unsignedLongValue - height:height.unsignedLongValue - format:format - baseAddress:(void *)imageBytes.bytes - dataSize:imageBytes.length - planeCount:planeCount - planeData:planeData]; - } - - return [self pixelBufferToVisionImage:pxBuffer]; -} - -- (CVPixelBufferRef)bytesToPixelBuffer:(size_t)width - height:(size_t)height - format:(FourCharCode)format - baseAddress:(void *)baseAddress - bytesPerRow:(size_t)bytesPerRow { - CVPixelBufferRef pxBuffer = NULL; - CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, format, baseAddress, bytesPerRow, - NULL, NULL, NULL, &pxBuffer); - return pxBuffer; -} - -- (CVPixelBufferRef)planarBytesToPixelBuffer:(size_t)width - height:(size_t)height - format:(FourCharCode)format - baseAddress:(void *)baseAddress - dataSize:(size_t)dataSize - planeCount:(size_t)planeCount - planeData:(NSArray *)planeData { - size_t widths[planeCount]; - size_t heights[planeCount]; - size_t bytesPerRows[planeCount]; - - void *baseAddresses[planeCount]; - baseAddresses[0] = baseAddress; - - size_t lastAddressIndex = 0; // Used to get base address for each plane - for (int i = 0; i < planeCount; i++) { - NSDictionary *plane = planeData[i]; - - NSNumber *width = plane[@"width"]; - NSNumber *height = plane[@"height"]; - NSNumber *bytesPerRow = plane[@"bytesPerRow"]; - - widths[i] = width.unsignedLongValue; - heights[i] = height.unsignedLongValue; - bytesPerRows[i] = bytesPerRow.unsignedLongValue; - - if (i > 0) { - size_t addressIndex = lastAddressIndex + heights[i - 1] * bytesPerRows[i - 1]; - baseAddresses[i] = baseAddress + addressIndex; - lastAddressIndex = addressIndex; - } - } - - CVPixelBufferRef pxBuffer = NULL; - CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault, width, height, format, NULL, dataSize, - planeCount, baseAddresses, widths, heights, bytesPerRows, NULL, - NULL, NULL, &pxBuffer); - - return pxBuffer; -} - -- (FIRVisionImage *)pixelBufferToVisionImage:(CVPixelBufferRef)pixelBufferRef { - CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBufferRef]; - - CIContext *temporaryContext = [CIContext contextWithOptions:nil]; - CGImageRef videoImage = - [temporaryContext createCGImage:ciImage - fromRect:CGRectMake(0, 0, CVPixelBufferGetWidth(pixelBufferRef), - CVPixelBufferGetHeight(pixelBufferRef))]; - - UIImage *uiImage = [UIImage imageWithCGImage:videoImage]; - CVPixelBufferRelease(pixelBufferRef); - CGImageRelease(videoImage); - return [[FIRVisionImage alloc] initWithImage:uiImage]; -} - -+ (void)addDetector:(NSNumber *)handle detector:(id)detector { - if (detectors[handle]) { - NSString *reason = - [[NSString alloc] initWithFormat:@"Object for handle already exists: %d", handle.intValue]; - @throw [[NSException alloc] initWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } - - detectors[handle] = detector; -} -@end diff --git a/packages/firebase_ml_vision/ios/Classes/ImageLabeler.m b/packages/firebase_ml_vision/ios/Classes/ImageLabeler.m deleted file mode 100644 index 6cb8341597bc..000000000000 --- a/packages/firebase_ml_vision/ios/Classes/ImageLabeler.m +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseMlVisionPlugin.h" - -@interface ImageLabeler () -@property FIRVisionImageLabeler *labeler; -@end - -@implementation ImageLabeler -- (instancetype)initWithVision:(FIRVision *)vision options:(NSDictionary *)options { - self = [super init]; - if (self) { - if ([@"onDevice" isEqualToString:options[@"modelType"]]) { - _labeler = [vision onDeviceImageLabelerWithOptions:[ImageLabeler parseOptions:options]]; - } else if ([@"cloud" isEqualToString:options[@"modelType"]]) { - _labeler = [vision cloudImageLabelerWithOptions:[ImageLabeler parseCloudOptions:options]]; - } else { - NSString *reason = - [NSString stringWithFormat:@"Invalid model type: %@", options[@"modelType"]]; - @throw [[NSException alloc] initWithName:NSInvalidArgumentException - reason:reason - userInfo:nil]; - } - } - return self; -} - -- (void)handleDetection:(FIRVisionImage *)image result:(FlutterResult)result { - [_labeler - processImage:image - completion:^(NSArray *_Nullable labels, NSError *_Nullable error) { - if (error) { - [FLTFirebaseMlVisionPlugin handleError:error result:result]; - return; - } else if (!labels) { - result(@[]); - } - - NSMutableArray *labelData = [NSMutableArray array]; - for (FIRVisionImageLabel *label in labels) { - NSDictionary *data = @{ - @"confidence" : label.confidence, - @"entityID" : label.entityID, - @"text" : label.text, - }; - [labelData addObject:data]; - } - - result(labelData); - }]; -} - -+ (FIRVisionOnDeviceImageLabelerOptions *)parseOptions:(NSDictionary *)optionsData { - NSNumber *conf = optionsData[@"confidenceThreshold"]; - - FIRVisionOnDeviceImageLabelerOptions *options = [FIRVisionOnDeviceImageLabelerOptions new]; - options.confidenceThreshold = [conf floatValue]; - - return options; -} - -+ (FIRVisionCloudImageLabelerOptions *)parseCloudOptions:(NSDictionary *)optionsData { - NSNumber *conf = optionsData[@"confidenceThreshold"]; - - FIRVisionCloudImageLabelerOptions *options = [FIRVisionCloudImageLabelerOptions new]; - options.confidenceThreshold = [conf floatValue]; - - return options; -} -@end diff --git a/packages/firebase_ml_vision/ios/Classes/TextRecognizer.m b/packages/firebase_ml_vision/ios/Classes/TextRecognizer.m deleted file mode 100644 index a6f401b9ca39..000000000000 --- a/packages/firebase_ml_vision/ios/Classes/TextRecognizer.m +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseMlVisionPlugin.h" - -@interface TextRecognizer () -@property FIRVisionTextRecognizer *recognizer; -@end - -@implementation TextRecognizer -- (instancetype)initWithVision:(FIRVision *)vision options:(NSDictionary *)options { - self = [super init]; - if (self) { - if ([@"onDevice" isEqualToString:options[@"modelType"]]) { - _recognizer = [vision onDeviceTextRecognizer]; - } else if ([@"cloud" isEqualToString:options[@"modelType"]]) { - _recognizer = [vision cloudTextRecognizer]; - } else { - NSString *reason = - [NSString stringWithFormat:@"Invalid model type: %@", options[@"modelType"]]; - @throw [[NSException alloc] initWithName:NSInvalidArgumentException - reason:reason - userInfo:nil]; - } - } - return self; -} - -- (void)handleDetection:(FIRVisionImage *)image result:(FlutterResult)result { - [_recognizer processImage:image - completion:^(FIRVisionText *_Nullable visionText, NSError *_Nullable error) { - if (error) { - [FLTFirebaseMlVisionPlugin handleError:error result:result]; - return; - } else if (!visionText) { - result(@{@"text" : @"", @"blocks" : @[]}); - return; - } - - NSMutableDictionary *visionTextData = [NSMutableDictionary dictionary]; - visionTextData[@"text"] = visionText.text; - - NSMutableArray *allBlockData = [NSMutableArray array]; - for (FIRVisionTextBlock *block in visionText.blocks) { - NSMutableDictionary *blockData = [NSMutableDictionary dictionary]; - - [self addData:blockData - confidence:block.confidence - cornerPoints:block.cornerPoints - frame:block.frame - languages:block.recognizedLanguages - text:block.text]; - - NSMutableArray *allLineData = [NSMutableArray array]; - for (FIRVisionTextLine *line in block.lines) { - NSMutableDictionary *lineData = [NSMutableDictionary dictionary]; - - [self addData:lineData - confidence:line.confidence - cornerPoints:line.cornerPoints - frame:line.frame - languages:line.recognizedLanguages - text:line.text]; - - NSMutableArray *allElementData = [NSMutableArray array]; - for (FIRVisionTextElement *element in line.elements) { - NSMutableDictionary *elementData = [NSMutableDictionary dictionary]; - - [self addData:elementData - confidence:element.confidence - cornerPoints:element.cornerPoints - frame:element.frame - languages:element.recognizedLanguages - text:element.text]; - - [allElementData addObject:elementData]; - } - - lineData[@"elements"] = allElementData; - [allLineData addObject:lineData]; - } - - blockData[@"lines"] = allLineData; - [allBlockData addObject:blockData]; - } - - visionTextData[@"blocks"] = allBlockData; - result(visionTextData); - }]; -} - -- (void)addData:(NSMutableDictionary *)addTo - confidence:(NSNumber *)confidence - cornerPoints:(NSArray *)cornerPoints - frame:(CGRect)frame - languages:(NSArray *)languages - text:(NSString *)text { - __block NSMutableArray *points = [NSMutableArray array]; - - for (NSValue *point in cornerPoints) { - [points addObject:@[ @(point.CGPointValue.x), @(point.CGPointValue.y) ]]; - } - - __block NSMutableArray *allLanguageData = [NSMutableArray array]; - for (FIRVisionTextRecognizedLanguage *language in languages) { - [allLanguageData addObject:@{ - @"languageCode" : language.languageCode ? language.languageCode : [NSNull null] - }]; - } - - [addTo addEntriesFromDictionary:@{ - @"confidence" : confidence ? confidence : [NSNull null], - @"points" : points, - @"left" : @(frame.origin.x), - @"top" : @(frame.origin.y), - @"width" : @(frame.size.width), - @"height" : @(frame.size.height), - @"recognizedLanguages" : allLanguageData, - @"text" : text, - }]; -} -@end diff --git a/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec b/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec deleted file mode 100644 index eb497c1db866..000000000000 --- a/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec +++ /dev/null @@ -1,34 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_ml_vision' - s.version = '0.1.1' - s.summary = 'Flutter plugin for Google ML Vision for Firebase.' - s.description = <<-DESC -An SDK that brings Google's machine learning expertise to Android and iOS apps in a powerful yet - easy-to-use package. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_ml_vision' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/MLVision' - s.ios.deployment_target = '9.0' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-ml-vis\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_ml_vision/lib/firebase_ml_vision.dart b/packages/firebase_ml_vision/lib/firebase_ml_vision.dart deleted file mode 100644 index 7e90b95b4a44..000000000000 --- a/packages/firebase_ml_vision/lib/firebase_ml_vision.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018 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_ml_vision; - -import 'dart:async'; -import 'dart:io'; -import 'dart:typed_data'; -import 'dart:ui'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; - -part 'src/barcode_detector.dart'; -part 'src/face_detector.dart'; -part 'src/firebase_vision.dart'; -part 'src/image_labeler.dart'; -part 'src/text_recognizer.dart'; diff --git a/packages/firebase_ml_vision/lib/src/barcode_detector.dart b/packages/firebase_ml_vision/lib/src/barcode_detector.dart deleted file mode 100644 index d7e3eb76b212..000000000000 --- a/packages/firebase_ml_vision/lib/src/barcode_detector.dart +++ /dev/null @@ -1,661 +0,0 @@ -// Copyright 2018 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_ml_vision; - -/// Enumeration of supported barcode content value types for [Barcode.valueType]. -/// -/// Note that the built-in parsers only recognize a few popular value -/// structures. For your specific use case, you may want to implement your own -/// parsing logic. -enum BarcodeValueType { - /// Unknown Barcode value types. - unknown, - - /// Barcode value type for contact info. - contactInfo, - - /// Barcode value type for email addresses. - email, - - /// Barcode value type for ISBNs. - isbn, - - /// Barcode value type for phone numbers. - phone, - - /// Barcode value type for product codes. - product, - - /// Barcode value type for SMS details. - sms, - - /// Barcode value type for plain text. - text, - - /// Barcode value type for URLs/bookmarks. - url, - - /// Barcode value type for Wi-Fi access point details. - wifi, - - /// Barcode value type for geographic coordinates. - geographicCoordinates, - - /// Barcode value type for calendar events. - calendarEvent, - - /// Barcode value type for driver's license data. - driverLicense, -} - -/// The type of email for [BarcodeEmail.type]. -enum BarcodeEmailType { - /// Unknown email type. - unknown, - - /// Barcode work email type. - work, - - /// Barcode home email type. - home, -} - -/// The type of phone number for [BarcodePhone.type]. -enum BarcodePhoneType { - /// Unknown phone type. - unknown, - - /// Barcode work phone type. - work, - - /// Barcode home phone type. - home, - - /// Barcode fax phone type. - fax, - - /// Barcode mobile phone type. - mobile, -} - -/// Wifi encryption type constants for [BarcodeWiFi.encryptionType]. -enum BarcodeWiFiEncryptionType { - /// Barcode unknown Wi-Fi encryption type. - unknown, - - /// Barcode open Wi-Fi encryption type. - open, - - /// Barcode WPA Wi-Fi encryption type. - wpa, - - /// Barcode WEP Wi-Fi encryption type. - wep, -} - -/// Address type constants for [BarcodeAddress.type] -enum BarcodeAddressType { - /// Barcode unknown address type. - unknown, - - /// Barcode work address type. - work, - - /// Barcode home address type. - home, -} - -/// Class containing supported barcode format constants for [BarcodeDetector]. -/// -/// Passed to [BarcodeDetectorOptions] to set which formats the detector should -/// detect. -/// -/// Also, represents possible values for [Barcode.format]. -class BarcodeFormat { - const BarcodeFormat._(this.value); - - /// Barcode format constant representing the union of all supported formats. - static const BarcodeFormat all = BarcodeFormat._(0xFFFF); - - /// Barcode format unknown to the current SDK. - static const BarcodeFormat unknown = BarcodeFormat._(0); - - /// Barcode format constant for Code 128. - static const BarcodeFormat code128 = BarcodeFormat._(0x0001); - - /// Barcode format constant for Code 39. - static const BarcodeFormat code39 = BarcodeFormat._(0x0002); - - /// Barcode format constant for Code 93. - static const BarcodeFormat code93 = BarcodeFormat._(0x0004); - - /// Barcode format constant for CodaBar. - static const BarcodeFormat codabar = BarcodeFormat._(0x0008); - - /// Barcode format constant for Data Matrix. - static const BarcodeFormat dataMatrix = BarcodeFormat._(0x0010); - - /// Barcode format constant for EAN-13. - static const BarcodeFormat ean13 = BarcodeFormat._(0x0020); - - /// Barcode format constant for EAN-8. - static const BarcodeFormat ean8 = BarcodeFormat._(0x0040); - - /// Barcode format constant for ITF (Interleaved Two-of-Five). - static const BarcodeFormat itf = BarcodeFormat._(0x0080); - - /// Barcode format constant for QR Code. - static const BarcodeFormat qrCode = BarcodeFormat._(0x0100); - - /// Barcode format constant for UPC-A. - static const BarcodeFormat upca = BarcodeFormat._(0x0200); - - /// Barcode format constant for UPC-E. - static const BarcodeFormat upce = BarcodeFormat._(0x0400); - - /// Barcode format constant for PDF-417. - static const BarcodeFormat pdf417 = BarcodeFormat._(0x0800); - - /// Barcode format constant for AZTEC. - static const BarcodeFormat aztec = BarcodeFormat._(0x1000); - - /// Raw BarcodeFormat value. - final int value; - - BarcodeFormat operator |(BarcodeFormat other) => - BarcodeFormat._(value | other.value); -} - -/// Detector for performing barcode scanning on an input image. -/// -/// A barcode detector is created via -/// `barcodeDetector([BarcodeDetectorOptions options])` in [FirebaseVision]: -/// -/// ```dart -/// final FirebaseVisionImage image = -/// FirebaseVisionImage.fromFilePath('path/to/file'); -/// -/// final BarcodeDetector barcodeDetector = -/// FirebaseVision.instance.barcodeDetector(); -/// -/// final List barcodes = await barcodeDetector.detectInImage(image); -/// ``` -class BarcodeDetector { - BarcodeDetector._(this.options, this._handle) : assert(options != null); - - /// The options for configuring this detector. - final BarcodeDetectorOptions options; - final int _handle; - bool _hasBeenOpened = false; - bool _isClosed = false; - - /// Detects barcodes in the input image. - Future> detectInImage(FirebaseVisionImage visionImage) async { - assert(!_isClosed); - - _hasBeenOpened = true; - final List reply = - await FirebaseVision.channel.invokeListMethod( - 'BarcodeDetector#detectInImage', - { - 'handle': _handle, - 'options': { - 'barcodeFormats': options.barcodeFormats.value, - }, - }..addAll(visionImage._serialize()), - ); - - final List barcodes = []; - reply.forEach((dynamic barcode) { - barcodes.add(Barcode._(barcode)); - }); - - return barcodes; - } - - /// Release resources used by this detector. - Future close() { - if (!_hasBeenOpened) _isClosed = true; - if (_isClosed) return Future.value(null); - - _isClosed = true; - return FirebaseVision.channel.invokeMethod( - 'BarcodeDetector#close', - {'handle': _handle}, - ); - } -} - -/// Immutable options to configure [BarcodeDetector]. -/// -/// Sets which barcode formats the detector will detect. Defaults to -/// [BarcodeFormat.all]. -/// -/// Example usage: -/// ```dart -/// final BarcodeDetectorOptions options = -/// BarcodeDetectorOptions(barcodeFormats: BarcodeFormat.aztec | BarcodeFormat.ean8); -/// ``` -class BarcodeDetectorOptions { - const BarcodeDetectorOptions({this.barcodeFormats = BarcodeFormat.all}); - - final BarcodeFormat barcodeFormats; -} - -// TODO(bparrishMines): Normalize default string values. Some values return null on iOS while Android returns empty string. -/// Represents a single recognized barcode and its value. -class Barcode { - Barcode._(Map _data) - : boundingBox = _data['left'] != null - ? Rect.fromLTWH( - _data['left'], - _data['top'], - _data['width'], - _data['height'], - ) - : null, - rawValue = _data['rawValue'], - displayValue = _data['displayValue'], - format = BarcodeFormat._(_data['format']), - _cornerPoints = _data['points'] == null - ? null - : _data['points'] - .map((dynamic item) => Offset( - item[0], - item[1], - )) - .toList(), - valueType = BarcodeValueType.values[_data['valueType']], - email = _data['email'] == null ? null : BarcodeEmail._(_data['email']), - phone = _data['phone'] == null ? null : BarcodePhone._(_data['phone']), - sms = _data['sms'] == null ? null : BarcodeSMS._(_data['sms']), - url = _data['url'] == null ? null : BarcodeURLBookmark._(_data['url']), - wifi = _data['wifi'] == null ? null : BarcodeWiFi._(_data['wifi']), - geoPoint = _data['geoPoint'] == null - ? null - : BarcodeGeoPoint._(_data['geoPoint']), - contactInfo = _data['contactInfo'] == null - ? null - : BarcodeContactInfo._(_data['contactInfo']), - calendarEvent = _data['calendarEvent'] == null - ? null - : BarcodeCalendarEvent._(_data['calendarEvent']), - driverLicense = _data['driverLicense'] == null - ? null - : BarcodeDriverLicense._(_data['driverLicense']); - - final List _cornerPoints; - - /// The bounding rectangle of the detected barcode. - /// - /// Could be null if the bounding rectangle can not be determined. - final Rect boundingBox; - - /// Barcode value as it was encoded in the barcode. - /// - /// Structured values are not parsed, for example: 'MEBKM:TITLE:Google;URL://www.google.com;;'. - /// - /// Null if nothing found. - final String rawValue; - - /// Barcode value in a user-friendly format. - /// - /// May omit some of the information encoded in the barcode. - /// For example, if rawValue is 'MEBKM:TITLE:Google;URL://www.google.com;;', - /// the displayValue might be '//www.google.com'. - /// If valueType = [BarcodeValueType.text], this field will be equal to rawValue. - /// - /// This value may be multiline, for example, when line breaks are encoded into the original TEXT barcode value. - /// May include the supplement value. - /// - /// Null if nothing found. - final String displayValue; - - /// The barcode format, for example [BarcodeFormat.ean13]. - final BarcodeFormat format; - - /// The four corner points in clockwise direction starting with top-left. - /// - /// Due to the possible perspective distortions, this is not necessarily a rectangle. - List get cornerPoints => List.from(_cornerPoints); - - /// The format type of the barcode value. - /// - /// For example, [BarcodeValueType.text], [BarcodeValueType.product], [BarcodeValueType.url], etc. - /// - /// If the value structure cannot be parsed, [BarcodeValueType.text] will be returned. - /// If the recognized structure type is not defined in your current version of SDK, [BarcodeValueType.unknown] will be returned. - /// - /// Note that the built-in parsers only recognize a few popular value structures. - /// For your specific use case, you might want to directly consume rawValue - /// and implement your own parsing logic. - final BarcodeValueType valueType; - - /// Parsed email details. (set iff [valueType] is [BarcodeValueType.email]). - final BarcodeEmail email; - - /// Parsed phone details. (set iff [valueType] is [BarcodeValueType.phone]). - final BarcodePhone phone; - - /// Parsed SMS details. (set iff [valueType] is [BarcodeValueType.sms]). - final BarcodeSMS sms; - - /// Parsed URL bookmark details. (set iff [valueType] is [BarcodeValueType.url]). - final BarcodeURLBookmark url; - - /// Parsed WiFi AP details. (set iff [valueType] is [BarcodeValueType.wifi]). - final BarcodeWiFi wifi; - - /// Parsed geo coordinates. (set iff [valueType] is [BarcodeValueType.geographicCoordinates]). - final BarcodeGeoPoint geoPoint; - - /// Parsed contact details. (set iff [valueType] is [BarcodeValueType.contactInfo]). - final BarcodeContactInfo contactInfo; - - /// Parsed calendar event details. (set iff [valueType] is [BarcodeValueType.calendarEvent]). - final BarcodeCalendarEvent calendarEvent; - - /// Parsed driver's license details. (set iff [valueType] is [BarcodeValueType.driverLicense]). - final BarcodeDriverLicense driverLicense; -} - -/// An email message from a 'MAILTO:' or similar QRCode type. -class BarcodeEmail { - BarcodeEmail._(Map data) - : type = BarcodeEmailType.values[data['type']], - address = data['address'], - body = data['body'], - subject = data['subject']; - - /// The email's address. - final String address; - - /// The email's body. - final String body; - - /// The email's subject. - final String subject; - - /// The type of the email. - final BarcodeEmailType type; -} - -/// Phone number info. -class BarcodePhone { - BarcodePhone._(Map data) - : number = data['number'], - type = BarcodePhoneType.values[data['type']]; - - /// Phone number. - final String number; - - /// Type of the phone number. - /// - /// See also [BarcodePhoneType] - final BarcodePhoneType type; -} - -/// An sms message from an 'SMS:' or similar QRCode type. -class BarcodeSMS { - BarcodeSMS._(Map data) - : message = data['message'], - phoneNumber = data['phoneNumber']; - - /// An SMS message body. - final String message; - - /// An SMS message phone number. - final String phoneNumber; -} - -/// A URL and title from a 'MEBKM:' or similar QRCode type. -class BarcodeURLBookmark { - BarcodeURLBookmark._(Map data) - : title = data['title'], - url = data['url']; - - /// A URL bookmark title. - final String title; - - /// A URL bookmark url. - final String url; -} - -/// A wifi network parameters from a 'WIFI:' or similar QRCode type. -class BarcodeWiFi { - BarcodeWiFi._(Map data) - : ssid = data['ssid'], - password = data['password'], - encryptionType = - BarcodeWiFiEncryptionType.values[data['encryptionType']]; - - /// A Wi-Fi access point SSID. - final String ssid; - - /// A Wi-Fi access point password. - final String password; - - /// The encryption type of the WIFI - /// - /// See all [BarcodeWiFiEncryptionType] - final BarcodeWiFiEncryptionType encryptionType; -} - -/// GPS coordinates from a 'GEO:' or similar QRCode type. -class BarcodeGeoPoint { - BarcodeGeoPoint._(Map data) - : latitude = data['latitude'], - longitude = data['longitude']; - - /// A location latitude. - final double latitude; - - /// A location longitude. - final double longitude; -} - -/// A person's or organization's business card. -class BarcodeContactInfo { - BarcodeContactInfo._(Map data) - : addresses = data['addresses'] == null - ? null - : List.unmodifiable(data['addresses'] - .map((dynamic item) => BarcodeAddress._(item))), - emails = data['emails'] == null - ? null - : List.unmodifiable(data['emails'] - .map((dynamic item) => BarcodeEmail._(item))), - name = data['name'] == null ? null : BarcodePersonName._(data['name']), - phones = data['phones'] == null - ? null - : List.unmodifiable(data['phones'] - .map((dynamic item) => BarcodePhone._(item))), - urls = data['urls'] == null - ? null - : List.unmodifiable( - data['urls'].map((dynamic item) { - final String s = item; - return s; - })), - jobTitle = data['jobTitle'], - organization = data['organization']; - - /// Contact person's addresses. - /// - /// Could be an empty list if nothing found. - final List addresses; - - /// Contact person's emails. - /// - /// Could be an empty list if nothing found. - final List emails; - - /// Contact person's name. - final BarcodePersonName name; - - /// Contact person's phones. - /// - /// Could be an empty list if nothing found. - final List phones; - - /// Contact urls associated with this person. - final List urls; - - /// Contact person's title. - final String jobTitle; - - /// Contact person's organization. - final String organization; -} - -/// An address. -class BarcodeAddress { - BarcodeAddress._(Map data) - : addressLines = List.unmodifiable( - data['addressLines'].map((dynamic item) { - final String s = item; - return s; - })), - type = BarcodeAddressType.values[data['type']]; - - /// Formatted address, multiple lines when appropriate. - /// - /// This field always contains at least one line. - final List addressLines; - - /// Type of the address. - /// - /// See also [BarcodeAddressType] - final BarcodeAddressType type; -} - -/// A person's name, both formatted version and individual name components. -class BarcodePersonName { - BarcodePersonName._(Map data) - : formattedName = data['formattedName'], - first = data['first'], - last = data['last'], - middle = data['middle'], - prefix = data['prefix'], - pronunciation = data['pronunciation'], - suffix = data['suffix']; - - /// The properly formatted name. - final String formattedName; - - /// First name - final String first; - - /// Last name - final String last; - - /// Middle name - final String middle; - - /// Prefix of the name - final String prefix; - - /// Designates a text string to be set as the kana name in the phonebook. Used for Japanese contacts. - final String pronunciation; - - /// Suffix of the person's name - final String suffix; -} - -/// DateTime data type used in calendar events. -class BarcodeCalendarEvent { - BarcodeCalendarEvent._(Map data) - : eventDescription = data['eventDescription'], - location = data['location'], - organizer = data['organizer'], - status = data['status'], - summary = data['summary'], - start = DateTime.parse(data['start']), - end = DateTime.parse(data['end']); - - /// The description of the calendar event. - final String eventDescription; - - /// The location of the calendar event. - final String location; - - /// The organizer of the calendar event. - final String organizer; - - /// The status of the calendar event. - final String status; - - /// The summary of the calendar event. - final String summary; - - /// The start date time of the calendar event. - final DateTime start; - - /// The end date time of the calendar event. - final DateTime end; -} - -/// A driver license or ID card. -class BarcodeDriverLicense { - BarcodeDriverLicense._(Map data) - : firstName = data['firstName'], - middleName = data['middleName'], - lastName = data['lastName'], - gender = data['gender'], - addressCity = data['addressCity'], - addressState = data['addressState'], - addressStreet = data['addressStreet'], - addressZip = data['addressZip'], - birthDate = data['birthDate'], - documentType = data['documentType'], - licenseNumber = data['licenseNumber'], - expiryDate = data['expiryDate'], - issuingDate = data['issuingDate'], - issuingCountry = data['issuingCountry']; - - /// Holder's first name. - final String firstName; - - /// Holder's middle name. - final String middleName; - - /// Holder's last name. - final String lastName; - - /// Holder's gender. 1 - male, 2 - female. - final String gender; - - /// City of holder's address. - final String addressCity; - - /// State of holder's address. - final String addressState; - - /// Holder's street address. - final String addressStreet; - - /// Zip code of holder's address. - final String addressZip; - - /// Birth date of the holder. - final String birthDate; - - /// "DL" for driver licenses, "ID" for ID cards. - final String documentType; - - /// Driver license ID number. - final String licenseNumber; - - /// Expiry date of the license. - final String expiryDate; - - /// Issue date of the license. - /// - /// The date format depends on the issuing country. MMDDYYYY for the US, YYYYMMDD for Canada. - final String issuingDate; - - /// Country in which DL/ID was issued. US = "USA", Canada = "CAN". - final String issuingCountry; -} diff --git a/packages/firebase_ml_vision/lib/src/face_detector.dart b/packages/firebase_ml_vision/lib/src/face_detector.dart deleted file mode 100644 index aa4d0d76f560..000000000000 --- a/packages/firebase_ml_vision/lib/src/face_detector.dart +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2018 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_ml_vision; - -/// Option for controlling additional trade-offs in performing face detection. -/// -/// Accurate tends to detect more faces and may be more precise in determining -/// values such as position, at the cost of speed. -enum FaceDetectorMode { accurate, fast } - -/// Available face landmarks detected by [FaceDetector]. -enum FaceLandmarkType { - bottomMouth, - leftCheek, - leftEar, - leftEye, - leftMouth, - noseBase, - rightCheek, - rightEar, - rightEye, - rightMouth, -} - -/// Available face contour types detected by [FaceDetector]. -enum FaceContourType { - allPoints, - face, - leftEye, - leftEyebrowBottom, - leftEyebrowTop, - lowerLipBottom, - lowerLipTop, - noseBottom, - noseBridge, - rightEye, - rightEyebrowBottom, - rightEyebrowTop, - upperLipBottom, - upperLipTop -} - -/// Detector for detecting faces in an input image. -/// -/// A face detector is created via -/// `faceDetector([FaceDetectorOptions options])` in [FirebaseVision]: -/// -/// ```dart -/// final FirebaseVisionImage image = -/// FirebaseVisionImage.fromFilePath('path/to/file'); -/// -/// final FaceDetector faceDetector = FirebaseVision.instance.faceDetector(); -/// -/// final List faces = await faceDetector.processImage(image); -/// ``` -class FaceDetector { - FaceDetector._(this.options, this._handle) : assert(options != null); - - /// The options for the face detector. - final FaceDetectorOptions options; - final int _handle; - bool _hasBeenOpened = false; - bool _isClosed = false; - - /// Detects faces in the input image. - Future> processImage(FirebaseVisionImage visionImage) async { - assert(!_isClosed); - - _hasBeenOpened = true; - final List reply = - await FirebaseVision.channel.invokeListMethod( - 'FaceDetector#processImage', - { - 'handle': _handle, - 'options': { - 'enableClassification': options.enableClassification, - 'enableLandmarks': options.enableLandmarks, - 'enableContours': options.enableContours, - 'enableTracking': options.enableTracking, - 'minFaceSize': options.minFaceSize, - 'mode': _enumToString(options.mode), - }, - }..addAll(visionImage._serialize()), - ); - - final List faces = []; - for (dynamic data in reply) { - faces.add(Face._(data)); - } - - return faces; - } - - /// Release resources used by this detector. - Future close() { - if (!_hasBeenOpened) _isClosed = true; - if (_isClosed) return Future.value(null); - - _isClosed = true; - return FirebaseVision.channel.invokeMethod( - 'FaceDetector#close', - {'handle': _handle}, - ); - } -} - -/// Immutable options for configuring features of [FaceDetector]. -/// -/// Used to configure features such as classification, face tracking, speed, -/// etc. -class FaceDetectorOptions { - /// Constructor for [FaceDetectorOptions]. - /// - /// The parameter minFaceValue must be between 0.0 and 1.0, inclusive. - const FaceDetectorOptions({ - this.enableClassification = false, - this.enableLandmarks = false, - this.enableContours = false, - this.enableTracking = false, - this.minFaceSize = 0.1, - this.mode = FaceDetectorMode.fast, - }) : assert(minFaceSize >= 0.0), - assert(minFaceSize <= 1.0); - - /// Whether to run additional classifiers for characterizing attributes. - /// - /// E.g. "smiling" and "eyes open". - final bool enableClassification; - - /// Whether to detect [FaceLandmark]s. - final bool enableLandmarks; - - /// Whether to detect [FaceContour]s. - final bool enableContours; - - /// Whether to enable face tracking. - /// - /// If enabled, the detector will maintain a consistent ID for each face when - /// processing consecutive frames. - final bool enableTracking; - - /// The smallest desired face size. - /// - /// Expressed as a proportion of the width of the head to the image width. - /// - /// Must be a value between 0.0 and 1.0. - final double minFaceSize; - - /// Option for controlling additional accuracy / speed trade-offs. - final FaceDetectorMode mode; -} - -/// Represents a face detected by [FaceDetector]. -class Face { - Face._(dynamic data) - : boundingBox = Rect.fromLTWH( - data['left'], - data['top'], - data['width'], - data['height'], - ), - headEulerAngleY = data['headEulerAngleY'], - headEulerAngleZ = data['headEulerAngleZ'], - leftEyeOpenProbability = data['leftEyeOpenProbability'], - rightEyeOpenProbability = data['rightEyeOpenProbability'], - smilingProbability = data['smilingProbability'], - trackingId = data['trackingId'], - _landmarks = Map.fromIterables( - FaceLandmarkType.values, - FaceLandmarkType.values.map((FaceLandmarkType type) { - final List pos = data['landmarks'][_enumToString(type)]; - return (pos == null) - ? null - : FaceLandmark._( - type, - Offset(pos[0], pos[1]), - ); - })), - _contours = Map.fromIterables( - FaceContourType.values, - FaceContourType.values.map((FaceContourType type) { - /// added empty map to pass the tests - final List arr = - (data['contours'] ?? {})[_enumToString(type)]; - return (arr == null) - ? null - : FaceContour._( - type, - arr - .map((dynamic pos) => Offset(pos[0], pos[1])) - .toList(), - ); - })); - - final Map _landmarks; - final Map _contours; - - /// The axis-aligned bounding rectangle of the detected face. - /// - /// The point (0, 0) is defined as the upper-left corner of the image. - final Rect boundingBox; - - /// The rotation of the face about the vertical axis of the image. - /// - /// Represented in degrees. - /// - /// A face with a positive Euler Y angle is turned to the camera's right and - /// to its left. - /// - /// The Euler Y angle is guaranteed only when using the "accurate" mode - /// setting of the face detector (as opposed to the "fast" mode setting, which - /// takes some shortcuts to make detection faster). - final double headEulerAngleY; - - /// The rotation of the face about the axis pointing out of the image. - /// - /// Represented in degrees. - /// - /// A face with a positive Euler Z angle is rotated counter-clockwise relative - /// to the camera. - /// - /// ML Kit always reports the Euler Z angle of a detected face. - final double headEulerAngleZ; - - /// Probability that the face's left eye is open. - /// - /// A value between 0.0 and 1.0 inclusive, or null if probability was not - /// computed. - final double leftEyeOpenProbability; - - /// Probability that the face's right eye is open. - /// - /// A value between 0.0 and 1.0 inclusive, or null if probability was not - /// computed. - final double rightEyeOpenProbability; - - /// Probability that the face is smiling. - /// - /// A value between 0.0 and 1.0 inclusive, or null if probability was not - /// computed. - final double smilingProbability; - - /// The tracking ID if the tracking is enabled. - /// - /// Null if tracking was not enabled. - final int trackingId; - - /// Gets the landmark based on the provided [FaceLandmarkType]. - /// - /// Null if landmark was not detected. - FaceLandmark getLandmark(FaceLandmarkType landmark) => _landmarks[landmark]; - - /// Gets the contour based on the provided [FaceContourType]. - /// - /// Null if contour was not detected. - FaceContour getContour(FaceContourType contour) => _contours[contour]; -} - -/// Represent a face landmark. -/// -/// A landmark is a point on a detected face, such as an eye, nose, or mouth. -class FaceLandmark { - FaceLandmark._(this.type, this.position); - - /// The [FaceLandmarkType] of this landmark. - final FaceLandmarkType type; - - /// Gets a 2D point for landmark position. - /// - /// The point (0, 0) is defined as the upper-left corner of the image. - final Offset position; -} - -/// Represent a face contour. -/// -/// Contours of facial features. -class FaceContour { - FaceContour._(this.type, this.positionsList); - - /// The [FaceContourType] of this contour. - final FaceContourType type; - - /// Gets a 2D point [List] for contour positions. - /// - /// The point (0, 0) is defined as the upper-left corner of the image. - final List positionsList; -} diff --git a/packages/firebase_ml_vision/lib/src/firebase_vision.dart b/packages/firebase_ml_vision/lib/src/firebase_vision.dart deleted file mode 100644 index d0f593cff8f8..000000000000 --- a/packages/firebase_ml_vision/lib/src/firebase_vision.dart +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2018 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_ml_vision; - -enum _ImageType { file, bytes } - -/// Indicates the image rotation. -/// -/// Rotation is counter-clockwise. -enum ImageRotation { rotation0, rotation90, rotation180, rotation270 } - -/// Indicates whether a model is ran on device or in the cloud. -enum ModelType { onDevice, cloud } - -/// The Firebase machine learning vision API. -/// -/// You can get an instance by calling [FirebaseVision.instance] and then get -/// a detector from the instance: -/// -/// ```dart -/// TextRecognizer textRecognizer = FirebaseVision.instance.textRecognizer(); -/// ``` -class FirebaseVision { - FirebaseVision._(); - - @visibleForTesting - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_ml_vision'); - - @visibleForTesting - static int nextHandle = 0; - - /// Singleton of [FirebaseVision]. - /// - /// Use this get an instance of a detector: - /// - /// ```dart - /// TextRecognizer textRecognizer = FirebaseVision.instance.textRecognizer(); - /// ``` - static final FirebaseVision instance = FirebaseVision._(); - - /// Creates an instance of [BarcodeDetector]. - BarcodeDetector barcodeDetector([BarcodeDetectorOptions options]) { - return BarcodeDetector._( - options ?? const BarcodeDetectorOptions(), - nextHandle++, - ); - } - - /// Creates an instance of [FaceDetector]. - FaceDetector faceDetector([FaceDetectorOptions options]) { - return FaceDetector._( - options ?? const FaceDetectorOptions(), - nextHandle++, - ); - } - - /// Creates an on device instance of [ImageLabeler]. - ImageLabeler imageLabeler([ImageLabelerOptions options]) { - return ImageLabeler._( - options: options ?? const ImageLabelerOptions(), - modelType: ModelType.onDevice, - handle: nextHandle++, - ); - } - - /// Creates an instance of [TextRecognizer]. - TextRecognizer textRecognizer() { - return TextRecognizer._( - modelType: ModelType.onDevice, - handle: nextHandle++, - ); - } - - /// Creates a cloud instance of [ImageLabeler]. - ImageLabeler cloudImageLabeler([CloudImageLabelerOptions options]) { - return ImageLabeler._( - options: options ?? const CloudImageLabelerOptions(), - modelType: ModelType.cloud, - handle: nextHandle++, - ); - } - - /// Creates a cloud instance of [TextRecognizer]. - TextRecognizer cloudTextRecognizer() { - return TextRecognizer._( - modelType: ModelType.cloud, - handle: nextHandle++, - ); - } -} - -/// Represents an image object used for both on-device and cloud API detectors. -/// -/// Create an instance by calling one of the factory constructors. -class FirebaseVisionImage { - FirebaseVisionImage._({ - @required _ImageType type, - FirebaseVisionImageMetadata metadata, - File imageFile, - Uint8List bytes, - }) : _imageFile = imageFile, - _metadata = metadata, - _bytes = bytes, - _type = type; - - /// Construct a [FirebaseVisionImage] from a file. - factory FirebaseVisionImage.fromFile(File imageFile) { - assert(imageFile != null); - return FirebaseVisionImage._( - type: _ImageType.file, - imageFile: imageFile, - ); - } - - /// Construct a [FirebaseVisionImage] from a file path. - factory FirebaseVisionImage.fromFilePath(String imagePath) { - assert(imagePath != null); - return FirebaseVisionImage._( - type: _ImageType.file, - imageFile: File(imagePath), - ); - } - - /// Construct a [FirebaseVisionImage] from a list of bytes. - /// - /// On Android, expects `android.graphics.ImageFormat.NV21` format. Note: - /// Concatenating the planes of `android.graphics.ImageFormat.YUV_420_888` - /// into a single plane, converts it to `android.graphics.ImageFormat.NV21`. - /// - /// On iOS, expects `kCVPixelFormatType_32BGRA` format. However, this should - /// work with most formats from `kCVPixelFormatType_*`. - factory FirebaseVisionImage.fromBytes( - Uint8List bytes, - FirebaseVisionImageMetadata metadata, - ) { - assert(bytes != null); - assert(metadata != null); - return FirebaseVisionImage._( - type: _ImageType.bytes, - bytes: bytes, - metadata: metadata, - ); - } - - final Uint8List _bytes; - final File _imageFile; - final FirebaseVisionImageMetadata _metadata; - final _ImageType _type; - - Map _serialize() => { - 'type': _enumToString(_type), - 'bytes': _bytes, - 'path': _imageFile?.path, - 'metadata': _type == _ImageType.bytes ? _metadata._serialize() : null, - }; -} - -/// Plane attributes to create the image buffer on iOS. -/// -/// When using iOS, [bytesPerRow], [height], and [width] throw [AssertionError] -/// if `null`. -class FirebaseVisionImagePlaneMetadata { - FirebaseVisionImagePlaneMetadata({ - @required this.bytesPerRow, - @required this.height, - @required this.width, - }) : assert(defaultTargetPlatform == TargetPlatform.iOS - ? bytesPerRow != null - : true), - assert(defaultTargetPlatform == TargetPlatform.iOS - ? height != null - : true), - assert( - defaultTargetPlatform == TargetPlatform.iOS ? width != null : true); - - /// The row stride for this color plane, in bytes. - final int bytesPerRow; - - /// Height of the pixel buffer on iOS. - final int height; - - /// Width of the pixel buffer on iOS. - final int width; - - Map _serialize() => { - 'bytesPerRow': bytesPerRow, - 'height': height, - 'width': width, - }; -} - -/// Image metadata used by [FirebaseVision] detectors. -/// -/// [rotation] defaults to [ImageRotation.rotation0]. Currently only rotates on -/// Android. -/// -/// When using iOS, [rawFormat] and [planeData] throw [AssertionError] if -/// `null`. -class FirebaseVisionImageMetadata { - FirebaseVisionImageMetadata({ - @required this.size, - @required this.rawFormat, - @required this.planeData, - this.rotation = ImageRotation.rotation0, - }) : assert(size != null), - assert(defaultTargetPlatform == TargetPlatform.iOS - ? rawFormat != null - : true), - assert(defaultTargetPlatform == TargetPlatform.iOS - ? planeData != null - : true), - assert(defaultTargetPlatform == TargetPlatform.iOS - ? planeData.isNotEmpty - : true); - - /// Size of the image in pixels. - final Size size; - - /// Rotation of the image for Android. - /// - /// Not currently used on iOS. - final ImageRotation rotation; - - /// Raw version of the format from the iOS platform. - /// - /// Since iOS can use any planar format, this format will be used to create - /// the image buffer on iOS. - /// - /// On iOS, this is a `FourCharCode` constant from Pixel Format Identifiers. - /// See https://developer.apple.com/documentation/corevideo/1563591-pixel_format_identifiers?language=objc - /// - /// Not used on Android. - final dynamic rawFormat; - - /// The plane attributes to create the image buffer on iOS. - /// - /// Not used on Android. - final List planeData; - - int _imageRotationToInt(ImageRotation rotation) { - switch (rotation) { - case ImageRotation.rotation90: - return 90; - case ImageRotation.rotation180: - return 180; - case ImageRotation.rotation270: - return 270; - default: - assert(rotation == ImageRotation.rotation0); - return 0; - } - } - - Map _serialize() => { - 'width': size.width, - 'height': size.height, - 'rotation': _imageRotationToInt(rotation), - 'rawFormat': rawFormat, - 'planeData': planeData - .map((FirebaseVisionImagePlaneMetadata plane) => plane._serialize()) - .toList(), - }; -} - -String _enumToString(dynamic enumValue) { - final String enumString = enumValue.toString(); - return enumString.substring(enumString.indexOf('.') + 1); -} diff --git a/packages/firebase_ml_vision/lib/src/image_labeler.dart b/packages/firebase_ml_vision/lib/src/image_labeler.dart deleted file mode 100644 index f644676bc6bd..000000000000 --- a/packages/firebase_ml_vision/lib/src/image_labeler.dart +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2018 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_ml_vision; - -/// Used for finding [ImageLabel]s in a supplied image. -/// -/// When you use the API, you get a list of the entities that were recognized: -/// people, things, places, activities, and so on. Each label found comes with a -/// score that indicates the confidence the ML model has in its relevance. With -/// this information, you can perform tasks such as automatic metadata -/// generation and content moderation. -/// -/// A image labeler is created via -/// `imageLabeler([ImageLabelerOptions options])` or -/// `cloudImageLabeler([CloudImageLabelerOptions options])` in [FirebaseVision]: -/// -/// ```dart -/// final FirebaseVisionImage image = -/// FirebaseVisionImage.fromFilePath('path/to/file'); -/// -/// final ImageLabeler imageLabeler = -/// FirebaseVision.instance.imageLabeler(options); -/// -/// final List labels = await imageLabeler.processImage(image); -/// ``` -class ImageLabeler { - ImageLabeler._({ - @required dynamic options, - @required this.modelType, - @required int handle, - }) : _options = options, - _handle = handle, - assert(options != null), - assert(modelType != null); - - /// Indicates whether this labeler is ran on device or in the cloud. - final ModelType modelType; - - // Should be of type ImageLabelerOptions or CloudImageLabelerOptions. - final dynamic _options; - final int _handle; - bool _hasBeenOpened = false; - bool _isClosed = false; - - /// Finds entities in the input image. - Future> processImage(FirebaseVisionImage visionImage) async { - assert(!_isClosed); - - _hasBeenOpened = true; - final List reply = - await FirebaseVision.channel.invokeListMethod( - 'ImageLabeler#processImage', - { - 'handle': _handle, - 'options': { - 'modelType': _enumToString(modelType), - 'confidenceThreshold': _options.confidenceThreshold, - }, - }..addAll(visionImage._serialize()), - ); - - final List labels = []; - for (dynamic data in reply) { - labels.add(ImageLabel._(data)); - } - - return labels; - } - - /// Release resources used by this labeler. - Future close() { - if (!_hasBeenOpened) _isClosed = true; - if (_isClosed) return Future.value(null); - - _isClosed = true; - return FirebaseVision.channel.invokeMethod( - 'ImageLabeler#close', - {'handle': _handle}, - ); - } -} - -/// Options for on device image labeler. -/// -/// Confidence threshold could be provided for the label detection. For example, -/// if the confidence threshold is set to 0.7, only labels with -/// confidence >= 0.7 would be returned. The default threshold is 0.5. -class ImageLabelerOptions { - /// Constructor for [ImageLabelerOptions]. - /// - /// Confidence threshold could be provided for the label detection. - /// For example, if the confidence threshold is set to 0.7, only labels with - /// confidence >= 0.7 would be returned. The default threshold is 0.5. - const ImageLabelerOptions({this.confidenceThreshold = 0.5}) - : assert(confidenceThreshold >= 0.0), - assert(confidenceThreshold <= 1.0); - - /// The minimum confidence threshold of labels to be detected. - /// - /// Required to be in range [0.0, 1.0]. - final double confidenceThreshold; -} - -/// Options for cloud image labeler. -/// -/// Confidence threshold could be provided for the label detection. For example, -/// if the confidence threshold is set to 0.7, only labels with -/// confidence >= 0.7 would be returned. The default threshold is 0.5. -class CloudImageLabelerOptions { - /// Constructor for [CloudImageLabelerOptions]. - /// - /// Confidence threshold could be provided for the label detection. - /// For example, if the confidence threshold is set to 0.7, only labels with - /// confidence >= 0.7 would be returned. The default threshold is 0.5. - const CloudImageLabelerOptions({this.confidenceThreshold = 0.5}) - : assert(confidenceThreshold >= 0.0), - assert(confidenceThreshold <= 1.0); - - /// The minimum confidence threshold of labels to be detected. - /// - /// Required to be in range [0.0, 1.0]. - final double confidenceThreshold; -} - -/// Represents an entity label detected by [ImageLabeler] and [CloudImageLabeler]. -class ImageLabel { - ImageLabel._(dynamic data) - : confidence = data['confidence'], - entityId = data['entityId'], - text = data['text']; - - /// The overall confidence of the result. Range [0.0, 1.0]. - final double confidence; - - /// The opaque entity ID. - /// - /// IDs are available in Google Knowledge Graph Search API - /// https://developers.google.com/knowledge-graph/ - final String entityId; - - /// A detected label from the given image. - /// - /// The label returned here is in English only. The end developer should use - /// [entityId] to retrieve unique id. - final String text; -} diff --git a/packages/firebase_ml_vision/lib/src/text_recognizer.dart b/packages/firebase_ml_vision/lib/src/text_recognizer.dart deleted file mode 100644 index 98936f66a906..000000000000 --- a/packages/firebase_ml_vision/lib/src/text_recognizer.dart +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2018 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_ml_vision; - -/// Detector for performing optical character recognition(OCR) on an input image. -/// -/// A text recognizer is created via `textRecognizer()` in [FirebaseVision]: -/// -/// ```dart -/// final FirebaseVisionImage image = -/// FirebaseVisionImage.fromFilePath('path/to/file'); -/// -/// final TextRecognizer textRecognizer = -/// FirebaseVision.instance.textRecognizer(); -/// -/// final List recognizedText = -/// await textRecognizer.processImage(image); -/// ``` -class TextRecognizer { - TextRecognizer._({ - @required this.modelType, - @required int handle, - }) : _handle = handle, - assert(modelType != null); - - final ModelType modelType; - - final int _handle; - bool _hasBeenOpened = false; - bool _isClosed = false; - - /// Detects [VisionText] from a [FirebaseVisionImage]. - Future processImage(FirebaseVisionImage visionImage) async { - assert(!_isClosed); - - _hasBeenOpened = true; - final Map reply = - await FirebaseVision.channel.invokeMapMethod( - 'TextRecognizer#processImage', - { - 'handle': _handle, - 'options': { - 'modelType': _enumToString(modelType), - }, - }..addAll(visionImage._serialize()), - ); - - return VisionText._(reply); - } - - /// Release resources used by this recognizer. - Future close() { - if (!_hasBeenOpened) _isClosed = true; - if (_isClosed) return Future.value(null); - - _isClosed = true; - return FirebaseVision.channel.invokeMethod( - 'TextRecognizer#close', - {'handle': _handle}, - ); - } -} - -/// Recognized text in an image. -class VisionText { - VisionText._(Map data) - : text = data['text'], - blocks = List.unmodifiable(data['blocks'] - .map((dynamic block) => TextBlock._(block))); - - /// String representation of the recognized text. - final String text; - - /// All recognized text broken down into individual blocks/paragraphs. - final List blocks; -} - -/// Detected language from text recognition. -class RecognizedLanguage { - RecognizedLanguage._(dynamic data) : languageCode = data['languageCode']; - - /// The BCP-47 language code, such as, en-US or sr-Latn. For more information, - /// see http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. - final String languageCode; -} - -/// Abstract class representing dimensions of recognized text in an image. -abstract class TextContainer { - TextContainer._(Map data) - : boundingBox = data['left'] != null - ? Rect.fromLTWH( - data['left'], - data['top'], - data['width'], - data['height'], - ) - : null, - confidence = data['confidence'], - cornerPoints = List.unmodifiable( - data['points'].map((dynamic point) => Offset( - point[0], - point[1], - ))), - recognizedLanguages = List.unmodifiable( - data['recognizedLanguages'].map( - (dynamic language) => RecognizedLanguage._(language))), - text = data['text']; - - /// Axis-aligned bounding rectangle of the detected text. - /// - /// The point (0, 0) is defined as the upper-left corner of the image. - /// - /// Could be null even if text is found. - final Rect boundingBox; - - /// The confidence of the recognized text block. - /// - /// The value is null for all text recognizers except for cloud text - /// recognizers. - final double confidence; - - /// The four corner points in clockwise direction starting with top-left. - /// - /// Due to the possible perspective distortions, this is not necessarily a - /// rectangle. Parts of the region could be outside of the image. - /// - /// Could be empty even if text is found. - final List cornerPoints; - - /// All detected languages from recognized text. - /// - /// On-device text recognizers only detect Latin-based languages, while cloud - /// text recognizers can detect multiple languages. If no languages are - /// recognized, the list is empty. - final List recognizedLanguages; - - /// The recognized text as a string. - /// - /// Returned in reading order for the language. For Latin, this is top to - /// bottom within a Block, and left-to-right within a Line. - final String text; -} - -/// A block of text (think of it as a paragraph) as deemed by the OCR engine. -class TextBlock extends TextContainer { - TextBlock._(Map block) - : lines = List.unmodifiable( - block['lines'].map((dynamic line) => TextLine._(line))), - super._(block); - - /// The contents of the text block, broken down into individual lines. - final List lines; -} - -/// Represents a line of text. -class TextLine extends TextContainer { - TextLine._(Map line) - : elements = List.unmodifiable(line['elements'] - .map((dynamic element) => TextElement._(element))), - super._(line); - - /// The contents of this line, broken down into individual elements. - final List elements; -} - -/// Roughly equivalent to a space-separated "word." -/// -/// The API separates elements into words in most Latin languages, but could -/// separate by characters in others. -/// -/// If a word is split between two lines by a hyphen, each part is encoded as a -/// separate element. -class TextElement extends TextContainer { - TextElement._(Map element) : super._(element); -} diff --git a/packages/firebase_ml_vision/pubspec.yaml b/packages/firebase_ml_vision/pubspec.yaml deleted file mode 100644 index 05bdfe95d299..000000000000 --- a/packages/firebase_ml_vision/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: firebase_ml_vision -description: Flutter plugin for Firebase machine learning vision services. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_ml_vision -version: 0.9.2 - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - image_picker: ^0.5.0 - flutter_test: - sdk: flutter - firebase_core: ^0.4.0 - flutter_driver: - sdk: flutter - test: any - path: ^1.6.2 - path_provider: ^0.5.0+1 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebasemlvision - iosPrefix: FLT - pluginClass: FirebaseMlVisionPlugin - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart b/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart deleted file mode 100644 index 59dea115f83f..000000000000 --- a/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart +++ /dev/null @@ -1,1294 +0,0 @@ -// Copyright 2018 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:typed_data'; -import 'dart:ui'; - -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$FirebaseVision', () { - final List log = []; - dynamic returnValue; - - setUp(() { - FirebaseVision.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - - switch (methodCall.method) { - case 'BarcodeDetector#detectInImage': - return returnValue; - case 'FaceDetector#processImage': - return returnValue; - case 'TextRecognizer#processImage': - return returnValue; - default: - return null; - } - }); - log.clear(); - FirebaseVision.nextHandle = 0; - }); - - group('$FirebaseVisionImageMetadata', () { - final TextRecognizer recognizer = - FirebaseVision.instance.textRecognizer(); - - setUp(() { - returnValue = { - 'text': '', - 'blocks': [], - }; - }); - - test('default serialization', () async { - final FirebaseVisionImageMetadata metadata = - FirebaseVisionImageMetadata( - rawFormat: 35, - size: const Size(1.0, 1.0), - planeData: [ - FirebaseVisionImagePlaneMetadata( - bytesPerRow: 1000, - height: 480, - width: 480, - ), - ], - ); - final FirebaseVisionImage image = - FirebaseVisionImage.fromBytes(Uint8List(0), metadata); - await recognizer.processImage(image); - - expect(log, [ - isMethodCall( - 'TextRecognizer#processImage', - arguments: { - 'handle': 0, - 'type': 'bytes', - 'path': null, - 'bytes': Uint8List(0), - 'metadata': { - 'width': 1.0, - 'height': 1.0, - 'rotation': 0, - 'rawFormat': 35, - 'planeData': [ - { - 'bytesPerRow': 1000, - 'height': 480, - 'width': 480, - }, - ], - }, - 'options': { - 'modelType': 'onDevice', - }, - }, - ), - ]); - }); - }); - - group('$BarcodeDetector', () { - BarcodeDetector detector; - FirebaseVisionImage image; - List returnBarcodes; - - setUp(() { - detector = FirebaseVision.instance.barcodeDetector(); - image = FirebaseVisionImage.fromFilePath('empty'); - returnBarcodes = [ - { - 'rawValue': 'hello:raw', - 'displayValue': 'hello:display', - 'format': 0, - 'left': 1.0, - 'top': 2.0, - 'width': 3.0, - 'height': 4.0, - 'points': [ - [5.0, 6.0], - [7.0, 8.0], - ], - }, - ]; - }); - - test('detectInImage unknown', () async { - returnBarcodes[0]['valueType'] = BarcodeValueType.unknown.index; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - expect(log, [ - isMethodCall( - 'BarcodeDetector#detectInImage', - arguments: { - 'handle': 0, - 'type': 'file', - 'path': 'empty', - 'bytes': null, - 'metadata': null, - 'options': { - 'barcodeFormats': 0xFFFF, - }, - }, - ), - ]); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.unknown); - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(barcode.boundingBox, Rect.fromLTWH(1.0, 2.0, 3.0, 4.0)); - expect(barcode.rawValue, 'hello:raw'); - expect(barcode.displayValue, 'hello:display'); - expect(barcode.cornerPoints, const [ - Offset(5.0, 6.0), - Offset(7.0, 8.0), - ]); - }); - - test('detectInImage email', () async { - final Map email = { - 'address': 'a', - 'body': 'b', - 'subject': 's', - 'type': BarcodeEmailType.home.index, - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.email.index; - returnBarcodes[0]['email'] = email; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.email); - expect(barcode.email.address, 'a'); - expect(barcode.email.body, 'b'); - expect(barcode.email.subject, 's'); - expect(barcode.email.type, BarcodeEmailType.home); - }); - - test('detectInImage phone', () async { - final Map phone = { - 'number': '000', - 'type': BarcodePhoneType.fax.index, - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.phone.index; - returnBarcodes[0]['phone'] = phone; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.phone); - expect(barcode.phone.number, '000'); - expect(barcode.phone.type, BarcodePhoneType.fax); - }); - - test('detectInImage sms', () async { - final Map sms = { - 'phoneNumber': '000', - 'message': 'm' - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.sms.index; - returnBarcodes[0]['sms'] = sms; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.sms); - expect(barcode.sms.phoneNumber, '000'); - expect(barcode.sms.message, 'm'); - }); - - test('detectInImage url', () async { - final Map url = { - 'title': 't', - 'url': 'u' - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.url.index; - returnBarcodes[0]['url'] = url; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.url); - expect(barcode.url.title, 't'); - expect(barcode.url.url, 'u'); - }); - - test('detectInImage wifi', () async { - final Map wifi = { - 'ssid': 's', - 'password': 'p', - 'encryptionType': BarcodeWiFiEncryptionType.wep.index, - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.wifi.index; - returnBarcodes[0]['wifi'] = wifi; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.wifi); - expect(barcode.wifi.ssid, 's'); - expect(barcode.wifi.password, 'p'); - expect(barcode.wifi.encryptionType, BarcodeWiFiEncryptionType.wep); - }); - - test('detectInImage geoPoint', () async { - final Map geoPoint = { - 'latitude': 0.2, - 'longitude': 0.3, - }; - - returnBarcodes[0]['valueType'] = - BarcodeValueType.geographicCoordinates.index; - returnBarcodes[0]['geoPoint'] = geoPoint; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.geographicCoordinates); - expect(barcode.geoPoint.latitude, 0.2); - expect(barcode.geoPoint.longitude, 0.3); - }); - - test('detectInImage contactInfo', () async { - final Map contact = { - 'addresses': [ - { - 'addressLines': ['al'], - 'type': BarcodeAddressType.work.index, - } - ], - 'emails': [ - { - 'type': BarcodeEmailType.home.index, - 'address': 'a', - 'body': 'b', - 'subject': 's' - }, - ], - 'name': { - 'formattedName': 'fn', - 'first': 'f', - 'last': 'l', - 'middle': 'm', - 'prefix': 'p', - 'pronunciation': 'pn', - 'suffix': 's', - }, - 'phones': [ - { - 'number': '012', - 'type': BarcodePhoneType.mobile.index, - } - ], - 'urls': ['url'], - 'jobTitle': 'j', - 'organization': 'o' - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.contactInfo.index; - returnBarcodes[0]['contactInfo'] = contact; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.contactInfo); - expect(barcode.contactInfo.addresses[0].type, BarcodeAddressType.work); - expect(barcode.contactInfo.addresses[0].addressLines[0], 'al'); - expect(barcode.contactInfo.emails[0].type, BarcodeEmailType.home); - expect(barcode.contactInfo.emails[0].address, 'a'); - expect(barcode.contactInfo.emails[0].body, 'b'); - expect(barcode.contactInfo.emails[0].subject, 's'); - expect(barcode.contactInfo.name.first, 'f'); - expect(barcode.contactInfo.name.last, 'l'); - expect(barcode.contactInfo.name.middle, 'm'); - expect(barcode.contactInfo.name.formattedName, 'fn'); - expect(barcode.contactInfo.name.prefix, 'p'); - expect(barcode.contactInfo.name.suffix, 's'); - expect(barcode.contactInfo.name.pronunciation, 'pn'); - expect(barcode.contactInfo.phones[0].type, BarcodePhoneType.mobile); - expect(barcode.contactInfo.phones[0].number, '012'); - expect(barcode.contactInfo.urls[0], 'url'); - expect(barcode.contactInfo.jobTitle, 'j'); - expect(barcode.contactInfo.organization, 'o'); - }); - - test('detectInImage calendarEvent', () async { - final Map calendar = { - 'eventDescription': 'e', - 'location': 'l', - 'organizer': 'o', - 'status': 'st', - 'summary': 'sm', - 'start': '2017-07-04 12:34:56.123', - 'end': '2018-08-05 01:23:45.456', - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.calendarEvent.index; - returnBarcodes[0]['calendarEvent'] = calendar; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.calendarEvent); - expect(barcode.calendarEvent.eventDescription, 'e'); - expect(barcode.calendarEvent.location, 'l'); - expect(barcode.calendarEvent.organizer, 'o'); - expect(barcode.calendarEvent.status, 'st'); - expect(barcode.calendarEvent.summary, 'sm'); - expect( - barcode.calendarEvent.start, DateTime(2017, 7, 4, 12, 34, 56, 123)); - expect(barcode.calendarEvent.end, DateTime(2018, 8, 5, 1, 23, 45, 456)); - }); - - test('detectInImage driversLicense', () async { - final Map driver = { - 'firstName': 'fn', - 'middleName': 'mn', - 'lastName': 'ln', - 'gender': 'g', - 'addressCity': 'ac', - 'addressState': 'a', - 'addressStreet': 'st', - 'addressZip': 'az', - 'birthDate': 'bd', - 'documentType': 'dt', - 'licenseNumber': 'l', - 'expiryDate': 'ed', - 'issuingDate': 'id', - 'issuingCountry': 'ic' - }; - - returnBarcodes[0]['valueType'] = BarcodeValueType.driverLicense.index; - returnBarcodes[0]['driverLicense'] = driver; - returnValue = returnBarcodes; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.valueType, BarcodeValueType.driverLicense); - expect(barcode.driverLicense.firstName, 'fn'); - expect(barcode.driverLicense.middleName, 'mn'); - expect(barcode.driverLicense.lastName, 'ln'); - expect(barcode.driverLicense.gender, 'g'); - expect(barcode.driverLicense.addressCity, 'ac'); - expect(barcode.driverLicense.addressState, 'a'); - expect(barcode.driverLicense.addressStreet, 'st'); - expect(barcode.driverLicense.addressZip, 'az'); - expect(barcode.driverLicense.birthDate, 'bd'); - expect(barcode.driverLicense.documentType, 'dt'); - expect(barcode.driverLicense.licenseNumber, 'l'); - expect(barcode.driverLicense.expiryDate, 'ed'); - expect(barcode.driverLicense.issuingDate, 'id'); - expect(barcode.driverLicense.issuingCountry, 'ic'); - }); - - test('detectInImage no blocks', () async { - returnValue = []; - - final List blocks = await detector.detectInImage(image); - expect(blocks, isEmpty); - }); - - test('detectInImage no bounding box', () async { - returnValue = [ - { - 'rawValue': 'potato:raw', - 'displayValue': 'potato:display', - 'valueType': 0, - 'format': 0, - 'points': [ - [17.0, 18.0], - [19.0, 20.0], - ], - }, - ]; - - final List barcodes = await detector.detectInImage(image); - - final Barcode barcode = barcodes[0]; - expect(barcode.boundingBox, null); - expect(barcode.rawValue, 'potato:raw'); - expect(barcode.displayValue, 'potato:display'); - expect(barcode.cornerPoints, const [ - Offset(17.0, 18.0), - Offset(19.0, 20.0), - ]); - }); - - test('enums match device APIs', () { - expect(BarcodeValueType.values.length, 13); - expect(BarcodeValueType.unknown.index, 0); - expect(BarcodeValueType.contactInfo.index, 1); - expect(BarcodeValueType.email.index, 2); - expect(BarcodeValueType.isbn.index, 3); - expect(BarcodeValueType.phone.index, 4); - expect(BarcodeValueType.product.index, 5); - expect(BarcodeValueType.sms.index, 6); - expect(BarcodeValueType.text.index, 7); - expect(BarcodeValueType.url.index, 8); - expect(BarcodeValueType.wifi.index, 9); - expect(BarcodeValueType.geographicCoordinates.index, 10); - expect(BarcodeValueType.calendarEvent.index, 11); - expect(BarcodeValueType.driverLicense.index, 12); - - expect(BarcodeEmailType.values.length, 3); - expect(BarcodeEmailType.unknown.index, 0); - expect(BarcodeEmailType.work.index, 1); - expect(BarcodeEmailType.home.index, 2); - - expect(BarcodePhoneType.values.length, 5); - expect(BarcodePhoneType.unknown.index, 0); - expect(BarcodePhoneType.work.index, 1); - expect(BarcodePhoneType.home.index, 2); - expect(BarcodePhoneType.fax.index, 3); - expect(BarcodePhoneType.mobile.index, 4); - - expect(BarcodeWiFiEncryptionType.values.length, 4); - expect(BarcodeWiFiEncryptionType.unknown.index, 0); - expect(BarcodeWiFiEncryptionType.open.index, 1); - expect(BarcodeWiFiEncryptionType.wpa.index, 2); - expect(BarcodeWiFiEncryptionType.wep.index, 3); - - expect(BarcodeAddressType.values.length, 3); - expect(BarcodeAddressType.unknown.index, 0); - expect(BarcodeAddressType.work.index, 1); - expect(BarcodeAddressType.home.index, 2); - }); - - group('$BarcodeDetectorOptions', () { - test('barcodeFormats', () async { - // The constructor for `BarcodeDetectorOptions` can't be `const` - // without triggering a `CONST_EVAL_TYPE_BOOL_INT` error. - // ignore: prefer_const_constructors - final BarcodeDetectorOptions options = BarcodeDetectorOptions( - barcodeFormats: BarcodeFormat.code128 | - BarcodeFormat.dataMatrix | - BarcodeFormat.ean8, - ); - - final BarcodeDetector detector = - FirebaseVision.instance.barcodeDetector(options); - await detector.detectInImage(image); - - expect( - log[0].arguments['options']['barcodeFormats'], - 0x0001 | 0x0010 | 0x0040, - ); - }); - }); - }); - - group('$FaceDetector', () { - List testFaces; - - setUp(() { - testFaces = [ - { - 'left': 0.0, - 'top': 1.0, - 'width': 2.0, - 'height': 3.0, - 'headEulerAngleY': 4.0, - 'headEulerAngleZ': 5.0, - 'leftEyeOpenProbability': 0.4, - 'rightEyeOpenProbability': 0.5, - 'smilingProbability': 0.2, - 'trackingId': 8, - 'landmarks': { - 'bottomMouth': [0.1, 1.1], - 'leftCheek': [2.1, 3.1], - 'leftEar': [4.1, 5.1], - 'leftEye': [6.1, 7.1], - 'leftMouth': [8.1, 9.1], - 'noseBase': [10.1, 11.1], - 'rightCheek': [12.1, 13.1], - 'rightEar': [14.1, 15.1], - 'rightEye': [16.1, 17.1], - 'rightMouth': [18.1, 19.1], - }, - 'contours': { - 'allPoints': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'face': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'leftEye': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'leftEyebrowBottom': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'leftEyebrowTop': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'lowerLipBottom': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'lowerLipTop': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'noseBottom': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'noseBridge': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'rightEye': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'rightEyebrowBottom': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'rightEyebrowTop': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'upperLipBottom': [ - [1.1, 2.2], - [3.3, 4.4], - ], - 'upperLipTop': [ - [1.1, 2.2], - [3.3, 4.4], - ], - }, - }, - ]; - }); - - test('processImage', () async { - returnValue = testFaces; - - final FaceDetector detector = FirebaseVision.instance.faceDetector( - const FaceDetectorOptions( - enableClassification: true, - enableLandmarks: true, - enableTracking: false, - enableContours: true, - minFaceSize: 0.5, - mode: FaceDetectorMode.accurate, - ), - ); - - final FirebaseVisionImage image = FirebaseVisionImage.fromFilePath( - 'empty', - ); - - final List faces = await detector.processImage(image); - - expect(log, [ - isMethodCall( - 'FaceDetector#processImage', - arguments: { - 'handle': 0, - 'type': 'file', - 'path': 'empty', - 'bytes': null, - 'metadata': null, - 'options': { - 'enableClassification': true, - 'enableLandmarks': true, - 'enableContours': true, - 'enableTracking': false, - 'minFaceSize': 0.5, - 'mode': 'accurate', - }, - }, - ), - ]); - - final Face face = faces[0]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(face.boundingBox, Rect.fromLTWH(0.0, 1.0, 2.0, 3.0)); - expect(face.headEulerAngleY, 4.0); - expect(face.headEulerAngleZ, 5.0); - expect(face.leftEyeOpenProbability, 0.4); - expect(face.rightEyeOpenProbability, 0.5); - expect(face.smilingProbability, 0.2); - expect(face.trackingId, 8); - - for (FaceLandmarkType type in FaceLandmarkType.values) { - expect(face.getLandmark(type).type, type); - } - - Offset p(FaceLandmarkType type) { - return face.getLandmark(type).position; - } - - expect(p(FaceLandmarkType.bottomMouth), const Offset(0.1, 1.1)); - expect(p(FaceLandmarkType.leftCheek), const Offset(2.1, 3.1)); - expect(p(FaceLandmarkType.leftEar), const Offset(4.1, 5.1)); - expect(p(FaceLandmarkType.leftEye), const Offset(6.1, 7.1)); - expect(p(FaceLandmarkType.leftMouth), const Offset(8.1, 9.1)); - expect(p(FaceLandmarkType.noseBase), const Offset(10.1, 11.1)); - expect(p(FaceLandmarkType.rightCheek), const Offset(12.1, 13.1)); - expect(p(FaceLandmarkType.rightEar), const Offset(14.1, 15.1)); - expect(p(FaceLandmarkType.rightEye), const Offset(16.1, 17.1)); - expect(p(FaceLandmarkType.rightMouth), const Offset(18.1, 19.1)); - - List c(FaceContourType type) { - return face.getContour(type).positionsList; - } - - expect( - c(FaceContourType.allPoints), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.face), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.leftEye), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.leftEyebrowBottom), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.leftEyebrowTop), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.lowerLipBottom), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.lowerLipTop), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.noseBottom), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.noseBridge), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.rightEye), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.rightEyebrowBottom), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.rightEyebrowTop), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.upperLipBottom), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - expect( - c(FaceContourType.upperLipTop), - containsAllInOrder( - [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), - ); - }); - - test('processImage with null landmark', () async { - testFaces[0]['landmarks']['bottomMouth'] = null; - returnValue = testFaces; - - final FaceDetector detector = FirebaseVision.instance.faceDetector( - const FaceDetectorOptions(), - ); - final FirebaseVisionImage image = FirebaseVisionImage.fromFilePath( - 'empty', - ); - - final List faces = await detector.processImage(image); - - expect(faces[0].getLandmark(FaceLandmarkType.bottomMouth), isNull); - }); - - test('processImage no faces', () async { - returnValue = []; - - final FaceDetector detector = FirebaseVision.instance.faceDetector( - const FaceDetectorOptions(), - ); - final FirebaseVisionImage image = FirebaseVisionImage.fromFilePath( - 'empty', - ); - - final List faces = await detector.processImage(image); - expect(faces, isEmpty); - }); - }); - - group('$TextRecognizer', () { - TextRecognizer recognizer; - final FirebaseVisionImage image = FirebaseVisionImage.fromFilePath( - 'empty', - ); - - setUp(() { - recognizer = FirebaseVision.instance.textRecognizer(); - final List elements = [ - { - 'text': 'hello', - 'left': 1.0, - 'top': 2.0, - 'width': 3.0, - 'height': 4.0, - 'points': [ - [5.0, 6.0], - [7.0, 8.0], - ], - 'recognizedLanguages': [ - { - 'languageCode': 'ab', - }, - { - 'languageCode': 'cd', - } - ], - 'confidence': 0.1, - }, - { - 'text': 'my', - 'left': 4.0, - 'top': 3.0, - 'width': 2.0, - 'height': 1.0, - 'points': [ - [6.0, 5.0], - [8.0, 7.0], - ], - 'recognizedLanguages': [], - 'confidence': 0.2, - }, - ]; - - final List lines = [ - { - 'text': 'friend', - 'left': 5.0, - 'top': 6.0, - 'width': 7.0, - 'height': 8.0, - 'points': [ - [9.0, 10.0], - [11.0, 12.0], - ], - 'recognizedLanguages': [ - { - 'languageCode': 'ef', - }, - { - 'languageCode': 'gh', - } - ], - 'elements': elements, - 'confidence': 0.3, - }, - { - 'text': 'how', - 'left': 8.0, - 'top': 7.0, - 'width': 4.0, - 'height': 5.0, - 'points': [ - [10.0, 9.0], - [12.0, 11.0], - ], - 'recognizedLanguages': [], - 'elements': [], - 'confidence': 0.4, - }, - ]; - - final List blocks = [ - { - 'text': 'friend', - 'left': 13.0, - 'top': 14.0, - 'width': 15.0, - 'height': 16.0, - 'points': [ - [17.0, 18.0], - [19.0, 20.0], - ], - 'recognizedLanguages': [ - { - 'languageCode': 'ij', - }, - { - 'languageCode': 'kl', - } - ], - 'lines': lines, - 'confidence': 0.5, - }, - { - 'text': 'hello', - 'left': 14.0, - 'top': 13.0, - 'width': 16.0, - 'height': 15.0, - 'points': [ - [18.0, 17.0], - [20.0, 19.0], - ], - 'recognizedLanguages': [], - 'lines': [], - 'confidence': 0.6, - }, - ]; - - final dynamic visionText = { - 'text': 'testext', - 'blocks': blocks, - }; - - returnValue = visionText; - }); - - group('$TextBlock', () { - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - expect(text.blocks, hasLength(2)); - - TextBlock block = text.blocks[0]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(block.boundingBox, Rect.fromLTWH(13.0, 14.0, 15.0, 16.0)); - expect(block.text, 'friend'); - expect(block.cornerPoints, const [ - Offset(17.0, 18.0), - Offset(19.0, 20.0), - ]); - expect(block.recognizedLanguages, hasLength(2)); - expect(block.recognizedLanguages[0].languageCode, 'ij'); - expect(block.recognizedLanguages[1].languageCode, 'kl'); - expect(block.confidence, 0.5); - - block = text.blocks[1]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(block.boundingBox, Rect.fromLTWH(14.0, 13.0, 16.0, 15.0)); - expect(block.text, 'hello'); - expect(block.cornerPoints, const [ - Offset(18.0, 17.0), - Offset(20.0, 19.0), - ]); - expect(block.confidence, 0.6); - }); - }); - - group('$TextLine', () { - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - TextLine line = text.blocks[0].lines[0]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(line.boundingBox, Rect.fromLTWH(5, 6, 7, 8)); - expect(line.text, 'friend'); - expect(line.cornerPoints, const [ - Offset(9.0, 10.0), - Offset(11.0, 12.0), - ]); - expect(line.recognizedLanguages, hasLength(2)); - expect(line.recognizedLanguages[0].languageCode, 'ef'); - expect(line.recognizedLanguages[1].languageCode, 'gh'); - expect(line.confidence, 0.3); - - line = text.blocks[0].lines[1]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(line.boundingBox, Rect.fromLTWH(8.0, 7.0, 4.0, 5.0)); - expect(line.text, 'how'); - expect(line.cornerPoints, const [ - Offset(10.0, 9.0), - Offset(12.0, 11.0), - ]); - expect(line.confidence, 0.4); - }); - }); - - group('$TextElement', () { - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - TextElement element = text.blocks[0].lines[0].elements[0]; - // ignore: prefer_const_constructors - expect(element.boundingBox, Rect.fromLTWH(1.0, 2.0, 3.0, 4.0)); - expect(element.text, 'hello'); - expect(element.cornerPoints, const [ - Offset(5.0, 6.0), - Offset(7.0, 8.0), - ]); - expect(element.recognizedLanguages, hasLength(2)); - expect(element.recognizedLanguages[0].languageCode, 'ab'); - expect(element.recognizedLanguages[1].languageCode, 'cd'); - expect(element.confidence, 0.1); - - element = text.blocks[0].lines[0].elements[1]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(element.boundingBox, Rect.fromLTWH(4.0, 3.0, 2.0, 1.0)); - expect(element.text, 'my'); - expect(element.cornerPoints, const [ - Offset(6.0, 5.0), - Offset(8.0, 7.0), - ]); - expect(element.confidence, 0.2); - }); - }); - - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - expect(text.text, 'testext'); - expect(log, [ - isMethodCall( - 'TextRecognizer#processImage', - arguments: { - 'handle': 0, - 'type': 'file', - 'path': 'empty', - 'bytes': null, - 'metadata': null, - 'options': { - 'modelType': 'onDevice', - }, - }, - ), - ]); - }); - - test('processImage no bounding box', () async { - returnValue = { - 'blocks': [ - { - 'text': '', - 'points': [], - 'recognizedLanguages': [], - 'lines': [], - }, - ], - }; - - final VisionText text = await recognizer.processImage(image); - - final TextBlock block = text.blocks[0]; - expect(block.boundingBox, null); - }); - }); - - group('Cloud $TextRecognizer', () { - TextRecognizer recognizer; - final FirebaseVisionImage image = FirebaseVisionImage.fromFilePath( - 'empty', - ); - - setUp(() { - recognizer = FirebaseVision.instance.cloudTextRecognizer(); - final List elements = [ - { - 'text': 'hello', - 'left': 1.0, - 'top': 2.0, - 'width': 3.0, - 'height': 4.0, - 'points': [ - [5.0, 6.0], - [7.0, 8.0], - ], - 'recognizedLanguages': [ - { - 'languageCode': 'ab', - }, - { - 'languageCode': 'cd', - } - ], - 'confidence': 0.1, - }, - { - 'text': 'my', - 'left': 4.0, - 'top': 3.0, - 'width': 2.0, - 'height': 1.0, - 'points': [ - [6.0, 5.0], - [8.0, 7.0], - ], - 'recognizedLanguages': [], - 'confidence': 0.2, - }, - ]; - - final List lines = [ - { - 'text': 'friend', - 'left': 5.0, - 'top': 6.0, - 'width': 7.0, - 'height': 8.0, - 'points': [ - [9.0, 10.0], - [11.0, 12.0], - ], - 'recognizedLanguages': [ - { - 'languageCode': 'ef', - }, - { - 'languageCode': 'gh', - } - ], - 'elements': elements, - 'confidence': 0.3, - }, - { - 'text': 'how', - 'left': 8.0, - 'top': 7.0, - 'width': 4.0, - 'height': 5.0, - 'points': [ - [10.0, 9.0], - [12.0, 11.0], - ], - 'recognizedLanguages': [], - 'elements': [], - 'confidence': 0.4, - }, - ]; - - final List blocks = [ - { - 'text': 'friend', - 'left': 13.0, - 'top': 14.0, - 'width': 15.0, - 'height': 16.0, - 'points': [ - [17.0, 18.0], - [19.0, 20.0], - ], - 'recognizedLanguages': [ - { - 'languageCode': 'ij', - }, - { - 'languageCode': 'kl', - } - ], - 'lines': lines, - 'confidence': 0.5, - }, - { - 'text': 'hello', - 'left': 14.0, - 'top': 13.0, - 'width': 16.0, - 'height': 15.0, - 'points': [ - [18.0, 17.0], - [20.0, 19.0], - ], - 'recognizedLanguages': [], - 'lines': [], - 'confidence': 0.6, - }, - ]; - - final dynamic visionText = { - 'text': 'testext', - 'blocks': blocks, - }; - - returnValue = visionText; - }); - - group('$TextBlock', () { - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - expect(text.blocks, hasLength(2)); - - TextBlock block = text.blocks[0]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(block.boundingBox, Rect.fromLTWH(13.0, 14.0, 15.0, 16.0)); - expect(block.text, 'friend'); - expect(block.cornerPoints, const [ - Offset(17.0, 18.0), - Offset(19.0, 20.0), - ]); - expect(block.recognizedLanguages, hasLength(2)); - expect(block.recognizedLanguages[0].languageCode, 'ij'); - expect(block.recognizedLanguages[1].languageCode, 'kl'); - expect(block.confidence, 0.5); - - block = text.blocks[1]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(block.boundingBox, Rect.fromLTWH(14.0, 13.0, 16.0, 15.0)); - expect(block.text, 'hello'); - expect(block.cornerPoints, const [ - Offset(18.0, 17.0), - Offset(20.0, 19.0), - ]); - expect(block.confidence, 0.6); - }); - }); - - group('$TextLine', () { - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - TextLine line = text.blocks[0].lines[0]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(line.boundingBox, Rect.fromLTWH(5, 6, 7, 8)); - expect(line.text, 'friend'); - expect(line.cornerPoints, const [ - Offset(9.0, 10.0), - Offset(11.0, 12.0), - ]); - expect(line.recognizedLanguages, hasLength(2)); - expect(line.recognizedLanguages[0].languageCode, 'ef'); - expect(line.recognizedLanguages[1].languageCode, 'gh'); - expect(line.confidence, 0.3); - - line = text.blocks[0].lines[1]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(line.boundingBox, Rect.fromLTWH(8.0, 7.0, 4.0, 5.0)); - expect(line.text, 'how'); - expect(line.cornerPoints, const [ - Offset(10.0, 9.0), - Offset(12.0, 11.0), - ]); - expect(line.confidence, 0.4); - }); - }); - - group('$TextElement', () { - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - TextElement element = text.blocks[0].lines[0].elements[0]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(element.boundingBox, Rect.fromLTWH(1.0, 2.0, 3.0, 4.0)); - expect(element.text, 'hello'); - expect(element.cornerPoints, const [ - Offset(5.0, 6.0), - Offset(7.0, 8.0), - ]); - expect(element.recognizedLanguages, hasLength(2)); - expect(element.recognizedLanguages[0].languageCode, 'ab'); - expect(element.recognizedLanguages[1].languageCode, 'cd'); - expect(element.confidence, 0.1); - - element = text.blocks[0].lines[0].elements[1]; - // TODO(jackson): Use const Rect when available in minimum Flutter SDK - // ignore: prefer_const_constructors - expect(element.boundingBox, Rect.fromLTWH(4.0, 3.0, 2.0, 1.0)); - expect(element.text, 'my'); - expect(element.cornerPoints, const [ - Offset(6.0, 5.0), - Offset(8.0, 7.0), - ]); - expect(element.confidence, 0.2); - }); - }); - - test('processImage', () async { - final VisionText text = await recognizer.processImage(image); - - expect(text.text, 'testext'); - expect(log, [ - isMethodCall( - 'TextRecognizer#processImage', - arguments: { - 'handle': 0, - 'type': 'file', - 'path': 'empty', - 'bytes': null, - 'metadata': null, - 'options': { - 'modelType': 'cloud', - }, - }, - ), - ]); - }); - - test('processImage no bounding box', () async { - returnValue = { - 'blocks': [ - { - 'text': '', - 'points': [], - 'recognizedLanguages': [], - 'lines': [], - }, - ], - }; - - final VisionText text = await recognizer.processImage(image); - - final TextBlock block = text.blocks[0]; - expect(block.boundingBox, null); - }); - }); - }); -} diff --git a/packages/firebase_ml_vision/test/image_labeler_test.dart b/packages/firebase_ml_vision/test/image_labeler_test.dart deleted file mode 100644 index a95cca264235..000000000000 --- a/packages/firebase_ml_vision/test/image_labeler_test.dart +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:firebase_ml_vision/firebase_ml_vision.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$FirebaseVision', () { - final List log = []; - dynamic returnValue; - - setUp(() { - FirebaseVision.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - - switch (methodCall.method) { - case 'ImageLabeler#processImage': - return returnValue; - default: - return null; - } - }); - log.clear(); - FirebaseVision.nextHandle = 0; - }); - - group('$ImageLabeler', () { - test('processImage', () async { - final List labelData = [ - { - 'confidence': 0.6, - 'entityId': 'hello', - 'text': 'friend', - }, - { - 'confidence': 0.8, - 'entityId': 'hi', - 'text': 'brother', - }, - ]; - - returnValue = labelData; - - final ImageLabeler detector = FirebaseVision.instance.imageLabeler( - const ImageLabelerOptions(confidenceThreshold: 0.2), - ); - - final FirebaseVisionImage image = FirebaseVisionImage.fromFilePath( - 'empty', - ); - - final List labels = await detector.processImage(image); - - expect(log, [ - isMethodCall( - 'ImageLabeler#processImage', - arguments: { - 'handle': 0, - 'type': 'file', - 'path': 'empty', - 'bytes': null, - 'metadata': null, - 'options': { - 'modelType': 'onDevice', - 'confidenceThreshold': 0.2, - }, - }, - ), - ]); - - expect(labels[0].confidence, 0.6); - expect(labels[0].entityId, 'hello'); - expect(labels[0].text, 'friend'); - - expect(labels[1].confidence, 0.8); - expect(labels[1].entityId, 'hi'); - expect(labels[1].text, 'brother'); - }); - - test('processImage no blocks', () async { - returnValue = []; - - final ImageLabeler detector = FirebaseVision.instance.imageLabeler( - const ImageLabelerOptions(), - ); - final FirebaseVisionImage image = - FirebaseVisionImage.fromFilePath('empty'); - - final List labels = await detector.processImage(image); - - expect(log, [ - isMethodCall( - 'ImageLabeler#processImage', - arguments: { - 'handle': 0, - 'type': 'file', - 'path': 'empty', - 'bytes': null, - 'metadata': null, - 'options': { - 'modelType': 'onDevice', - 'confidenceThreshold': 0.5, - }, - }, - ), - ]); - - expect(labels, isEmpty); - }); - }); - - group('Cloud $ImageLabeler', () { - test('processImage', () async { - final List labelData = [ - { - 'confidence': 0.6, - 'entityId': '/m/0', - 'text': 'banana', - }, - { - 'confidence': 0.8, - 'entityId': '/m/1', - 'text': 'apple', - }, - ]; - - returnValue = labelData; - - final ImageLabeler labeler = FirebaseVision.instance.cloudImageLabeler( - const CloudImageLabelerOptions(confidenceThreshold: 0.6), - ); - - final FirebaseVisionImage image = FirebaseVisionImage.fromFilePath( - 'empty', - ); - - final List labels = await labeler.processImage(image); - - expect(log, [ - isMethodCall( - 'ImageLabeler#processImage', - arguments: { - 'handle': 0, - 'type': 'file', - 'path': 'empty', - 'bytes': null, - 'metadata': null, - 'options': { - 'modelType': 'cloud', - 'confidenceThreshold': 0.6, - }, - }, - ), - ]); - - expect(labels[0].confidence, 0.6); - expect(labels[0].entityId, '/m/0'); - expect(labels[0].text, 'banana'); - - expect(labels[1].confidence, 0.8); - expect(labels[1].entityId, '/m/1'); - expect(labels[1].text, 'apple'); - }); - }); - }); -} diff --git a/packages/firebase_performance/.gitignore b/packages/firebase_performance/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_performance/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_performance/CHANGELOG.md b/packages/firebase_performance/CHANGELOG.md deleted file mode 100644 index 64e95feed5a8..000000000000 --- a/packages/firebase_performance/CHANGELOG.md +++ /dev/null @@ -1,94 +0,0 @@ -## 0.3.0+4 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.3.0+3 - -* Fix bug that caused `invokeMethod` to fail with Dart code obfuscation - -## 0.3.0+2 - -* Fix bug preventing this plugin from working with hot restart. - -## 0.3.0+1 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.3.0 - -* **Breaking Change** Removed `Trace.incrementCounter`. Please use `Trace.incrementMetric`. -* Assertion errors are no longer thrown for incorrect input for `Trace`s and `HttpMetric`s. -* You can now get entire list of attributes from `Trace` and `HttpMetric` with `getAttributes()`. -* Added access to `Trace` value `name`. -* Added access to `HttpMetric` values `url` and `HttpMethod`. - -## 0.2.0 - -* Update Android dependencies to latest. - -## 0.1.1 - -* Deprecate `Trace.incrementCounter` and add `Trace.incrementMetric`. -* Additional integration testing. - -## 0.1.0+4 - -* Remove deprecated methods for iOS. -* Fix bug where `Trace` attributes were not set correctly. - -## 0.1.0+3 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.1.0+2 - -* Fixed bug where `Traces` and `HttpMetrics` weren't being passed to Firebase on iOS. - -## 0.1.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.1.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.0.8+1 - -* Bump Android dependencies to latest. - -## 0.0.8 - -* Set http version to be compatible with flutter_test. - -## 0.0.7 - -* Added missing http package dependency. - -## 0.0.6 - -* Bump Android and Firebase dependency versions. - -## 0.0.5 - -Added comments explaining the time it takes to see performance results. - -## 0.0.4 - -* Formatted code, updated comments, and removed unnecessary files. - -## 0.0.3 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.0.2 - -* Added HttpMetric for monitoring for specific network requests. - -## 0.0.1 - -* Initial Release. diff --git a/packages/firebase_performance/LICENSE b/packages/firebase_performance/LICENSE deleted file mode 100644 index 8940a4be1b58..000000000000 --- a/packages/firebase_performance/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018 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. diff --git a/packages/firebase_performance/README.md b/packages/firebase_performance/README.md deleted file mode 100644 index 8dc69662364e..000000000000 --- a/packages/firebase_performance/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# Google Performance Monitoring for Firebase - -[![pub package](https://img.shields.io/pub/v/firebase_performance.svg)](https://pub.dartlang.org/packages/firebase_performance) - -A Flutter plugin to use the [Google Performance Monitoring for Firebase API](https://firebase.google.com/docs/perf-mon/). - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -To use this plugin, add `firebase_performance` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). You must also configure firebase performance monitoring for each platform project: Android and iOS (see the example folder or https://codelabs.developers.google.com/codelabs/flutter-firebase/#4 for step by step details). - -You can confirm that Performance Monitoring results appear in the [Firebase console.](https://console.firebase.google.com/) Results should appear within 12 hours. - -## Define a Custom Trace - -A custom trace is a report of performance data associated with some of the code in your app. To learn more about custom traces, see the [Performance Monitoring overview](https://firebase.google.com/docs/perf-mon/#how_does_it_work). - -```dart -final Trace myTrace = FirebasePerformance.instance.newTrace("test_trace"); -myTrace.start(); - -final Item item = cache.fetch("item"); -if (item != null) { - myTrace.incrementMetric("item_cache_hit", 1); -} else { - myTrace.incrementMetric("item_cache_miss", 1); -} - -myTrace.stop(); -``` - -## Add monitoring for specific network requests - -Performance Monitoring collects network requests automatically. Although this includes most network requests for your app, some might not be reported. To include specific network requests in Performance Monitoring, add the following code to your app: - -```dart -class _MetricHttpClient extends BaseClient { - _MetricHttpClient(this._inner); - - final Client _inner; - - @override - Future send(BaseRequest request) async { - final HttpMetric metric = FirebasePerformance.instance - .newHttpMetric(request.url.toString(), HttpMethod.Get); - - await metric.start(); - - StreamedResponse response; - try { - response = await _inner.send(request); - metric - ..responsePayloadSize = response.contentLength - ..responseContentType = response.headers['Content-Type'] - ..requestPayloadSize = request.contentLength - ..httpResponseCode = response.statusCode; - } finally { - await metric.stop(); - } - - return response; - } -} - -class _MyAppState extends State { -. -. -. - Future testHttpMetric() async { - final _MetricHttpClient metricHttpClient = _MetricHttpClient(Client()); - - final Request request = - Request("SEND", Uri.parse("https://www.google.com")); - - metricHttpClient.send(request); - } -. -. -. -} -``` - -## Getting Started - -See the `example` directory for a complete sample app using Google Performance Monitoring for Firebase. diff --git a/packages/firebase_performance/android/build.gradle b/packages/firebase_performance/android/build.gradle deleted file mode 100644 index 82b655b7136b..000000000000 --- a/packages/firebase_performance/android/build.gradle +++ /dev/null @@ -1,53 +0,0 @@ -def PLUGIN = "firebase_performance"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebaseperformance' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-perf:17.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_performance/android/gradle.properties b/packages/firebase_performance/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_performance/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_performance/android/settings.gradle b/packages/firebase_performance/android/settings.gradle deleted file mode 100644 index 50c3a2d77af8..000000000000 --- a/packages/firebase_performance/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_performance' diff --git a/packages/firebase_performance/android/src/main/AndroidManifest.xml b/packages/firebase_performance/android/src/main/AndroidManifest.xml deleted file mode 100644 index 2d19cbfdc23e..000000000000 --- a/packages/firebase_performance/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FirebasePerformancePlugin.java b/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FirebasePerformancePlugin.java deleted file mode 100644 index 53cbaae72737..000000000000 --- a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FirebasePerformancePlugin.java +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2018 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.firebaseperformance; - -import android.util.SparseArray; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.PluginRegistry.Registrar; - -/** FirebasePerformancePlugin */ -public class FirebasePerformancePlugin implements MethodChannel.MethodCallHandler { - private static final String CHANNEL_NAME = "plugins.flutter.io/firebase_performance"; - - private static final SparseArray handlers = new SparseArray<>(); - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL_NAME); - channel.setMethodCallHandler(new FirebasePerformancePlugin()); - } - - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - if (call.method.equals("FirebasePerformance#instance")) { - handlers.clear(); - FlutterFirebasePerformance.getInstance(call, result); - } else { - final MethodChannel.MethodCallHandler handler = getHandler(call); - - if (handler != null) { - handler.onMethodCall(call, result); - } else { - result.notImplemented(); - } - } - } - - static void addHandler(final int handle, final MethodChannel.MethodCallHandler handler) { - if (handlers.get(handle) != null) { - final String message = String.format("Object for handle already exists: %s", handle); - throw new IllegalArgumentException(message); - } - - handlers.put(handle, handler); - } - - static void removeHandler(final int handle) { - handlers.remove(handle); - } - - private static MethodChannel.MethodCallHandler getHandler(final MethodCall call) { - final Integer handle = call.argument("handle"); - - if (handle == null) return null; - return handlers.get(handle); - } -} diff --git a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java b/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 37bf5a31dea6..000000000000 --- a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebaseperformance; - -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; - -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_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebasePerformance.java b/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebasePerformance.java deleted file mode 100644 index ce04044a1ea8..000000000000 --- a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterFirebasePerformance.java +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebaseperformance; - -import com.google.firebase.perf.FirebasePerformance; -import com.google.firebase.perf.metrics.HttpMetric; -import com.google.firebase.perf.metrics.Trace; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; - -public class FlutterFirebasePerformance implements MethodChannel.MethodCallHandler { - private static String parseHttpMethod(String httpMethod) { - switch (httpMethod) { - case "HttpMethod.Connect": - return FirebasePerformance.HttpMethod.CONNECT; - case "HttpMethod.Delete": - return FirebasePerformance.HttpMethod.DELETE; - case "HttpMethod.Get": - return FirebasePerformance.HttpMethod.GET; - case "HttpMethod.Head": - return FirebasePerformance.HttpMethod.HEAD; - case "HttpMethod.Options": - return FirebasePerformance.HttpMethod.OPTIONS; - case "HttpMethod.Patch": - return FirebasePerformance.HttpMethod.PATCH; - case "HttpMethod.Post": - return FirebasePerformance.HttpMethod.POST; - case "HttpMethod.Put": - return FirebasePerformance.HttpMethod.PUT; - case "HttpMethod.Trace": - return FirebasePerformance.HttpMethod.TRACE; - default: - throw new IllegalArgumentException(String.format("No HttpMethod for: %s", httpMethod)); - } - } - - private final FirebasePerformance performance; - - @SuppressWarnings("ConstantConditions") - static void getInstance(MethodCall call, MethodChannel.Result result) { - final Integer handle = call.argument("handle"); - FirebasePerformancePlugin.addHandler(handle, new FlutterFirebasePerformance()); - result.success(null); - } - - private FlutterFirebasePerformance() { - this.performance = FirebasePerformance.getInstance(); - } - - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - switch (call.method) { - case "FirebasePerformance#isPerformanceCollectionEnabled": - isPerformanceCollectionEnabled(result); - break; - case "FirebasePerformance#setPerformanceCollectionEnabled": - setPerformanceCollectionEnabled(call, result); - break; - case "FirebasePerformance#newTrace": - newTrace(call, result); - break; - case "FirebasePerformance#newHttpMetric": - newHttpMetric(call, result); - break; - default: - result.notImplemented(); - } - } - - private void isPerformanceCollectionEnabled(MethodChannel.Result result) { - result.success(performance.isPerformanceCollectionEnabled()); - } - - @SuppressWarnings("ConstantConditions") - private void setPerformanceCollectionEnabled(MethodCall call, MethodChannel.Result result) { - final Boolean enable = call.argument("enable"); - performance.setPerformanceCollectionEnabled(enable); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void newTrace(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - final Trace trace = performance.newTrace(name); - - final Integer handle = call.argument("traceHandle"); - FirebasePerformancePlugin.addHandler(handle, new FlutterTrace(trace)); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void newHttpMetric(MethodCall call, MethodChannel.Result result) { - final String url = call.argument("url"); - final String httpMethod = call.argument("httpMethod"); - - final HttpMetric metric = performance.newHttpMetric(url, parseHttpMethod(httpMethod)); - - final Integer handle = call.argument("httpMetricHandle"); - FirebasePerformancePlugin.addHandler(handle, new FlutterHttpMetric(metric)); - - result.success(null); - } -} diff --git a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterHttpMetric.java b/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterHttpMetric.java deleted file mode 100644 index 2e2f2e6e4ed3..000000000000 --- a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterHttpMetric.java +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebaseperformance; - -import com.google.firebase.perf.metrics.HttpMetric; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; - -public class FlutterHttpMetric implements MethodChannel.MethodCallHandler { - private final HttpMetric httpMetric; - - FlutterHttpMetric(final HttpMetric metric) { - this.httpMetric = metric; - } - - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - switch (call.method) { - case "HttpMetric#start": - start(result); - break; - case "HttpMetric#stop": - stop(call, result); - break; - case "HttpMetric#httpResponseCode": - setHttpResponseCode(call, result); - break; - case "HttpMetric#requestPayloadSize": - setRequestPayloadSize(call, result); - break; - case "HttpMetric#responseContentType": - setResponseContentType(call, result); - break; - case "HttpMetric#responsePayloadSize": - setResponsePayloadSize(call, result); - break; - case "PerformanceAttributes#putAttribute": - putAttribute(call, result); - break; - case "PerformanceAttributes#removeAttribute": - removeAttribute(call, result); - break; - case "PerformanceAttributes#getAttributes": - getAttributes(result); - break; - default: - result.notImplemented(); - } - } - - private void start(MethodChannel.Result result) { - httpMetric.start(); - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void stop(MethodCall call, MethodChannel.Result result) { - httpMetric.stop(); - - final Integer handle = call.argument("handle"); - FirebasePerformancePlugin.removeHandler(handle); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void setHttpResponseCode(MethodCall call, MethodChannel.Result result) { - final Integer httpResponseCode = call.argument("httpResponseCode"); - httpMetric.setHttpResponseCode(httpResponseCode); - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void setRequestPayloadSize(MethodCall call, MethodChannel.Result result) { - final Number payloadSize = call.argument("requestPayloadSize"); - httpMetric.setRequestPayloadSize(payloadSize.longValue()); - result.success(null); - } - - private void setResponseContentType(MethodCall call, MethodChannel.Result result) { - final String contentType = call.argument("responseContentType"); - httpMetric.setResponseContentType(contentType); - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void setResponsePayloadSize(MethodCall call, MethodChannel.Result result) { - final Number payloadSize = call.argument("responsePayloadSize"); - httpMetric.setResponsePayloadSize(payloadSize.longValue()); - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void putAttribute(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - final String value = call.argument("value"); - - httpMetric.putAttribute(name, value); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void removeAttribute(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - httpMetric.removeAttribute(name); - - result.success(null); - } - - private void getAttributes(MethodChannel.Result result) { - result.success(httpMetric.getAttributes()); - } -} diff --git a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterTrace.java b/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterTrace.java deleted file mode 100644 index 0bcb54f34834..000000000000 --- a/packages/firebase_performance/android/src/main/java/io/flutter/plugins/firebaseperformance/FlutterTrace.java +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebaseperformance; - -import com.google.firebase.perf.metrics.Trace; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; - -public class FlutterTrace implements MethodChannel.MethodCallHandler { - private final Trace trace; - - FlutterTrace(final Trace trace) { - this.trace = trace; - } - - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - switch (call.method) { - case "Trace#start": - start(result); - break; - case "Trace#stop": - stop(call, result); - break; - case "Trace#setMetric": - setMetric(call, result); - break; - case "Trace#incrementMetric": - incrementMetric(call, result); - break; - case "Trace#getMetric": - getMetric(call, result); - break; - case "PerformanceAttributes#putAttribute": - putAttribute(call, result); - break; - case "PerformanceAttributes#removeAttribute": - removeAttribute(call, result); - break; - case "PerformanceAttributes#getAttributes": - getAttributes(result); - break; - default: - result.notImplemented(); - } - } - - private void start(MethodChannel.Result result) { - trace.start(); - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void stop(MethodCall call, MethodChannel.Result result) { - trace.stop(); - - final Integer handle = call.argument("handle"); - FirebasePerformancePlugin.removeHandler(handle); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void setMetric(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - final Number value = call.argument("value"); - trace.putMetric(name, value.longValue()); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void incrementMetric(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - final Number value = call.argument("value"); - trace.incrementMetric(name, value.longValue()); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void getMetric(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - - result.success(trace.getLongMetric(name)); - } - - @SuppressWarnings("ConstantConditions") - private void putAttribute(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - final String value = call.argument("value"); - - trace.putAttribute(name, value); - - result.success(null); - } - - @SuppressWarnings("ConstantConditions") - private void removeAttribute(MethodCall call, MethodChannel.Result result) { - final String name = call.argument("name"); - trace.removeAttribute(name); - - result.success(null); - } - - private void getAttributes(MethodChannel.Result result) { - result.success(trace.getAttributes()); - } -} diff --git a/packages/firebase_performance/android/user-agent.gradle b/packages/firebase_performance/android/user-agent.gradle deleted file mode 100644 index 9ad33e05b6ed..000000000000 --- a/packages/firebase_performance/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-perf" -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_performance/example/.metadata b/packages/firebase_performance/example/.metadata deleted file mode 100644 index 866a061a7a7f..000000000000 --- a/packages/firebase_performance/example/.metadata +++ /dev/null @@ -1,8 +0,0 @@ -# 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: f408bb06f9361793ca85493c38d809ee1e2f7e30 - channel: master diff --git a/packages/firebase_performance/example/README.md b/packages/firebase_performance/example/README.md deleted file mode 100644 index cb4342d67998..000000000000 --- a/packages/firebase_performance/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_performance_example - -Demonstrates how to use the firebase_performance plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](https://flutter.io/). diff --git a/packages/firebase_performance/example/android/app/build.gradle b/packages/firebase_performance/example/android/app/build.gradle deleted file mode 100644 index 994afa5ec9d8..000000000000 --- a/packages/firebase_performance/example/android/app/build.gradle +++ /dev/null @@ -1,57 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebaseperformanceexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { -} - -apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/packages/firebase_performance/example/android/app/google-services.json b/packages/firebase_performance/example/android/app/google-services.json deleted file mode 100644 index 007c845bee36..000000000000 --- a/packages/firebase_performance/example/android/app/google-services.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "project_info": { - "project_number": "479882132969", - "firebase_url": "https://my-flutter-proj.firebaseio.com", - "project_id": "my-flutter-proj", - "storage_bucket": "my-flutter-proj.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:479882132969:android:215a22700e1b466b", - "android_client_info": { - "package_name": "io.flutter.plugins.firebaseperformanceexample" - } - }, - "oauth_client": [ - { - "client_id": "479882132969-8h4kiv8m7ho4tvn6uuujsfcrf69unuf7.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebaseperformanceexample", - "certificate_hash": "e733b7a303250b63e06de6f7c9767c517d69cfa0" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCrZz9T0Pg0rDnpxfNuPBrOxGhXskfebXs" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "479882132969-3nf0of470m8do5qa83e8tiivv7e1thq1.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "io.flutter.plugins.firebasePerfExample" - } - }, - { - "client_id": "479882132969-0d20fkjtr1p8evfomfkf3vmi50uajml2.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_performance/example/android/app/gradle.properties b/packages/firebase_performance/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_performance/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_performance/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_performance/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_performance/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_performance/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_performance/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 1e529d80ab04..000000000000 --- a/packages/firebase_performance/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/firebase_performance/example/android/app/src/main/java/io/flutter/plugins/firebaseperformanceexample/MainActivity.java b/packages/firebase_performance/example/android/app/src/main/java/io/flutter/plugins/firebaseperformanceexample/MainActivity.java deleted file mode 100644 index 945f06506be7..000000000000 --- a/packages/firebase_performance/example/android/app/src/main/java/io/flutter/plugins/firebaseperformanceexample/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.firebaseperformanceexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_performance/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_performance/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/firebase_performance/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/firebase_performance/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_performance/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_performance/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_performance/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_performance/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_performance/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_performance/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_performance/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_performance/example/android/app/src/main/res/values/styles.xml b/packages/firebase_performance/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/firebase_performance/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/firebase_performance/example/android/build.gradle b/packages/firebase_performance/example/android/build.gradle deleted file mode 100644 index 695de848ec30..000000000000 --- a/packages/firebase_performance/example/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - mavenLocal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_performance/example/android/gradle.properties b/packages/firebase_performance/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_performance/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_performance/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_performance/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f1fd..000000000000 --- a/packages/firebase_performance/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#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-4.10.2-all.zip diff --git a/packages/firebase_performance/example/android/settings.gradle b/packages/firebase_performance/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/firebase_performance/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_performance/example/firebase_performance_example.iml b/packages/firebase_performance/example/firebase_performance_example.iml deleted file mode 100644 index e5c837191e06..000000000000 --- a/packages/firebase_performance/example/firebase_performance_example.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_performance/example/firebase_performance_example_android.iml b/packages/firebase_performance/example/firebase_performance_example_android.iml deleted file mode 100644 index b050030a1b87..000000000000 --- a/packages/firebase_performance/example/firebase_performance_example_android.iml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_performance/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_performance/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6c2de8086bcd..000000000000 --- a/packages/firebase_performance/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_performance/example/ios/Flutter/Debug.xcconfig b/packages/firebase_performance/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_performance/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_performance/example/ios/Flutter/Release.xcconfig b/packages/firebase_performance/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_performance/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_performance/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_performance/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 36e9fe7d7e2d..000000000000 --- a/packages/firebase_performance/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,501 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 4F30D5F713FAE573DBE831BD /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AADA30890C75F448DA1E1040 /* libPods-Runner.a */; }; - 8FF7AD1520880821009B43A2 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8FF7AD1420880820009B43A2 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; - 8FF7AD1420880820009B43A2 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - AADA30890C75F448DA1E1040 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 4F30D5F713FAE573DBE831BD /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 556632B50846818D9A90AA4B /* Frameworks */ = { - isa = PBXGroup; - children = ( - AADA30890C75F448DA1E1040 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - DE7EB5CF2B4FC4A8BCD09CC6 /* Pods */, - 556632B50846818D9A90AA4B /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 8FF7AD1420880820009B43A2 /* GoogleService-Info.plist */, - 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 = ""; - }; - DE7EB5CF2B4FC4A8BCD09CC6 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 92CA2C06BD2DACC2EF38987C /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - EEF842937EAC4019A711CBB3 /* [CP] Embed Pods Frameworks */, - ); - 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 = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 8FF7AD1520880821009B43A2 /* GoogleService-Info.plist in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets 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\" thin"; - }; - 92CA2C06BD2DACC2EF38987C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - EEF842937EAC4019A711CBB3 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebasePerformanceExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebasePerformanceExample; - 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 */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_performance/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_performance/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/firebase_performance/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/firebase_performance/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_performance/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1263ac84b105..000000000000 --- a/packages/firebase_performance/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_performance/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_performance/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_performance/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_performance/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/firebase_performance/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d68..000000000000 --- a/packages/firebase_performance/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/packages/firebase_performance/example/ios/Runner/AppDelegate.h b/packages/firebase_performance/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_performance/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_performance/example/ios/Runner/AppDelegate.m b/packages/firebase_performance/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/firebase_performance/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d9d..000000000000 --- a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/firebase_performance/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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_performance/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_performance/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/firebase_performance/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_performance/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_performance/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_performance/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_performance/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_performance/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 2064ea6415c8..000000000000 --- a/packages/firebase_performance/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 479882132969-sbr97a40ji0hqujs9ksm2lrm1mfhdum3.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.479882132969-sbr97a40ji0hqujs9ksm2lrm1mfhdum3 - API_KEY - AIzaSyBECOwLTAN6PU4Aet1b2QLGIb3kRK8Xjew - GCM_SENDER_ID - 479882132969 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebasePerformanceExample - PROJECT_ID - my-flutter-proj - STORAGE_BUCKET - my-flutter-proj.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:479882132969:ios:0f2b615ff954f3ae - DATABASE_URL - https://my-flutter-proj.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_performance/example/ios/Runner/Info.plist b/packages/firebase_performance/example/ios/Runner/Info.plist deleted file mode 100644 index 930df5baa66b..000000000000 --- a/packages/firebase_performance/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_performance_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_performance/example/ios/Runner/main.m b/packages/firebase_performance/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_performance/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_performance/example/lib/main.dart b/packages/firebase_performance/example/lib/main.dart deleted file mode 100644 index e947cd5bfd65..000000000000 --- a/packages/firebase_performance/example/lib/main.dart +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:http/http.dart'; -import 'package:flutter/material.dart'; - -import 'package:firebase_performance/firebase_performance.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatefulWidget { - @override - _MyAppState createState() => _MyAppState(); -} - -class _MetricHttpClient extends BaseClient { - _MetricHttpClient(this._inner); - - final Client _inner; - - @override - Future send(BaseRequest request) async { - final HttpMetric metric = FirebasePerformance.instance - .newHttpMetric(request.url.toString(), HttpMethod.Get); - - await metric.start(); - - StreamedResponse response; - try { - response = await _inner.send(request); - metric - ..responsePayloadSize = response.contentLength - ..responseContentType = response.headers['Content-Type'] - ..requestPayloadSize = request.contentLength - ..httpResponseCode = response.statusCode; - } finally { - await metric.stop(); - } - - return response; - } -} - -class _MyAppState extends State { - FirebasePerformance _performance = FirebasePerformance.instance; - bool _isPerformanceCollectionEnabled = false; - String _performanceCollectionMessage = - 'Unknown status of performance collection.'; - bool _traceHasRan = false; - bool _httpMetricHasRan = false; - - @override - void initState() { - super.initState(); - _togglePerformanceCollection(); - } - - Future _togglePerformanceCollection() async { - await _performance - .setPerformanceCollectionEnabled(!_isPerformanceCollectionEnabled); - - final bool isEnabled = await _performance.isPerformanceCollectionEnabled(); - setState(() { - _isPerformanceCollectionEnabled = isEnabled; - _performanceCollectionMessage = _isPerformanceCollectionEnabled - ? 'Performance collection is enabled.' - : 'Performance collection is disabled.'; - }); - } - - Future _testTrace() async { - setState(() { - _traceHasRan = false; - }); - - final Trace trace = _performance.newTrace("test"); - trace.incrementMetric("metric1", 16); - trace.putAttribute("favorite_color", "blue"); - - await trace.start(); - - int sum = 0; - for (int i = 0; i < 10000000; i++) { - sum += i; - } - print(sum); - - await trace.stop(); - - setState(() { - _traceHasRan = true; - }); - } - - Future _testHttpMetric() async { - setState(() { - _httpMetricHasRan = false; - }); - - final _MetricHttpClient metricHttpClient = _MetricHttpClient(Client()); - - final Request request = Request( - "SEND", - Uri.parse("https://www.google.com"), - ); - - metricHttpClient.send(request); - - setState(() { - _httpMetricHasRan = true; - }); - } - - @override - Widget build(BuildContext context) { - final TextStyle textStyle = - const TextStyle(color: Colors.lightGreenAccent, fontSize: 25.0); - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Firebase Performance Example'), - ), - body: Center( - child: Column( - children: [ - Text(_performanceCollectionMessage), - RaisedButton( - onPressed: _togglePerformanceCollection, - child: const Text('Toggle Data Collection'), - ), - RaisedButton( - onPressed: _testTrace, - child: const Text('Run Trace'), - ), - Text( - _traceHasRan ? 'Trace Ran!' : '', - style: textStyle, - ), - RaisedButton( - onPressed: _testHttpMetric, - child: const Text('Run HttpMetric'), - ), - Text( - _httpMetricHasRan ? 'HttpMetric Ran!' : '', - style: textStyle, - ), - ], - ), - ), - ), - ); - } -} diff --git a/packages/firebase_performance/example/pubspec.yaml b/packages/firebase_performance/example/pubspec.yaml deleted file mode 100644 index f5a91e28453a..000000000000 --- a/packages/firebase_performance/example/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: firebase_performance_example -description: Demonstrates how to use the firebase_performance plugin. -author: Flutter Team - -dependencies: - http: ^0.12.0 - flutter: - sdk: flutter - firebase_performance: - path: ../ - firebase_core: ^0.4.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - -flutter: - uses-material-design: true diff --git a/packages/firebase_performance/example/test_driver/firebase_performance.dart b/packages/firebase_performance/example/test_driver/firebase_performance.dart deleted file mode 100644 index 7ae6381bfb53..000000000000 --- a/packages/firebase_performance/example/test_driver/firebase_performance.dart +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_performance/firebase_performance.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('firebase_performance', () { - final FirebasePerformance performance = FirebasePerformance.instance; - - group('$FirebasePerformance', () { - test('setPerformanceCollectionEnabled', () { - performance.setPerformanceCollectionEnabled(true); - expect( - performance.isPerformanceCollectionEnabled(), - completion(isTrue), - ); - - performance.setPerformanceCollectionEnabled(false); - expect( - performance.isPerformanceCollectionEnabled(), - completion(isFalse), - ); - }); - }); - - group('$HttpMethod', () { - test('test all values', () { - for (HttpMethod method in HttpMethod.values) { - final HttpMetric testMetric = performance.newHttpMetric( - 'https://www.google.com/', - method, - ); - testMetric.start(); - testMetric.stop(); - } - }); - }); - - group('$Trace', () { - Trace testTrace; - - setUpAll(() { - performance.setPerformanceCollectionEnabled(true); - }); - - setUp(() { - testTrace = performance.newTrace('test-trace'); - }); - - tearDown(() { - testTrace.stop(); - testTrace = null; - }); - - test('incrementMetric', () { - testTrace.start(); - - testTrace.incrementMetric('metric', 14); - expectLater(testTrace.getMetric('metric'), completion(14)); - - testTrace.incrementMetric('metric', 45); - expect(testTrace.getMetric('metric'), completion(59)); - }); - - test('setMetric', () { - testTrace.start(); - - testTrace.setMetric('metric2', 37); - expect(testTrace.getMetric('metric2'), completion(37)); - }); - - test('putAttribute', () { - testTrace.putAttribute('apple', 'sauce'); - testTrace.putAttribute('banana', 'pie'); - - expect( - testTrace.getAttributes(), - completion({'apple': 'sauce', 'banana': 'pie'}), - ); - }); - - test('removeAttribute', () { - testTrace.putAttribute('sponge', 'bob'); - testTrace.putAttribute('patrick', 'star'); - testTrace.removeAttribute('sponge'); - - expect( - testTrace.getAttributes(), - completion({'patrick': 'star'}), - ); - }); - - test('getAttributes', () { - testTrace.putAttribute('yugi', 'oh'); - - expect( - testTrace.getAttributes(), - completion({'yugi': 'oh'}), - ); - - testTrace.start(); - testTrace.stop(); - expect( - testTrace.getAttributes(), - completion({'yugi': 'oh'}), - ); - }); - }); - - group('$HttpMetric', () { - HttpMetric testMetric; - - setUpAll(() { - performance.setPerformanceCollectionEnabled(true); - }); - - setUp(() { - testMetric = performance.newHttpMetric( - 'https://www.google.com/', - HttpMethod.Delete, - ); - }); - - test('putAttribute', () { - testMetric.putAttribute('apple', 'sauce'); - testMetric.putAttribute('banana', 'pie'); - - expect( - testMetric.getAttributes(), - completion({'apple': 'sauce', 'banana': 'pie'}), - ); - }); - - test('removeAttribute', () { - testMetric.putAttribute('sponge', 'bob'); - testMetric.putAttribute('patrick', 'star'); - testMetric.removeAttribute('sponge'); - - expect( - testMetric.getAttributes(), - completion({'patrick': 'star'}), - ); - }); - - test('getAttributes', () { - testMetric.putAttribute('yugi', 'oh'); - - expect( - testMetric.getAttributes(), - completion({'yugi': 'oh'}), - ); - - testMetric.start(); - testMetric.stop(); - expect( - testMetric.getAttributes(), - completion({'yugi': 'oh'}), - ); - }); - - test('http setters shouldn\'t cause a crash', () async { - testMetric.start(); - - testMetric.httpResponseCode = 443; - testMetric.requestPayloadSize = 56734; - testMetric.responseContentType = '1984'; - testMetric.responsePayloadSize = 4949; - - await pumpEventQueue(); - }); - }); - }); -} diff --git a/packages/firebase_performance/example/test_driver/firebase_performance_test.dart b/packages/firebase_performance/example/test_driver/firebase_performance_test.dart deleted file mode 100644 index b9753054ad5b..000000000000 --- a/packages/firebase_performance/example/test_driver/firebase_performance_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_driver/flutter_driver.dart'; - -void main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_performance/firebase_performance_android.iml b/packages/firebase_performance/firebase_performance_android.iml deleted file mode 100644 index ac5d744d7acc..000000000000 --- a/packages/firebase_performance/firebase_performance_android.iml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_performance/ios/Assets/.gitkeep b/packages/firebase_performance/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_performance/ios/Classes/FLTFirebasePerformance.m b/packages/firebase_performance/ios/Classes/FLTFirebasePerformance.m deleted file mode 100644 index 81cf29c06559..000000000000 --- a/packages/firebase_performance/ios/Classes/FLTFirebasePerformance.m +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebasePerformancePlugin+Internal.h" - -@interface FLTFirebasePerformance () -@property FIRPerformance *performance; -@end - -@implementation FLTFirebasePerformance -+ (instancetype _Nonnull)sharedInstance { - static FLTFirebasePerformance *sharedInstance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedInstance = [[FLTFirebasePerformance alloc] init]; - sharedInstance.performance = [FIRPerformance sharedInstance]; - }); - return sharedInstance; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"FirebasePerformance#isPerformanceCollectionEnabled" isEqualToString:call.method]) { - [self isPerformanceCollectionEnabled:result]; - } else if ([@"FirebasePerformance#setPerformanceCollectionEnabled" isEqualToString:call.method]) { - [self setPerformanceCollectionEnabled:call result:result]; - } else if ([@"FirebasePerformance#newTrace" isEqualToString:call.method]) { - [self newTrace:call result:result]; - } else if ([@"FirebasePerformance#newHttpMetric" isEqualToString:call.method]) { - [self newHttpMetric:call result:result]; - } else { - result(FlutterMethodNotImplemented); - } -} - -- (void)isPerformanceCollectionEnabled:(FlutterResult)result { - result(@([_performance isDataCollectionEnabled])); -} - -- (void)setPerformanceCollectionEnabled:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *enable = call.arguments[@"enable"]; - [_performance setDataCollectionEnabled:[enable boolValue]]; - result(nil); -} - -- (void)newTrace:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - FIRTrace *trace = [_performance traceWithName:name]; - FLTTrace *handler = [[FLTTrace alloc] initWithTrace:trace]; - - NSNumber *handle = call.arguments[@"traceHandle"]; - [FLTFirebasePerformancePlugin addMethodHandler:handle methodHandler:handler]; - - result(nil); -} - -- (void)newHttpMetric:(FlutterMethodCall *)call result:(FlutterResult)result { - FIRHTTPMethod method = [FLTFirebasePerformance parseHttpMethod:call.arguments[@"httpMethod"]]; - NSURL *url = [NSURL URLWithString:call.arguments[@"url"]]; - - FIRHTTPMetric *metric = [[FIRHTTPMetric alloc] initWithURL:url HTTPMethod:method]; - FLTHttpMetric *handler = [[FLTHttpMetric alloc] initWithHTTPMetric:metric]; - - NSNumber *handle = call.arguments[@"httpMetricHandle"]; - [FLTFirebasePerformancePlugin addMethodHandler:handle methodHandler:handler]; - - result(nil); -} - -+ (FIRHTTPMethod)parseHttpMethod:(NSString *)method { - if ([@"HttpMethod.Connect" isEqualToString:method]) { - return FIRHTTPMethodCONNECT; - } else if ([@"HttpMethod.Delete" isEqualToString:method]) { - return FIRHTTPMethodDELETE; - } else if ([@"HttpMethod.Get" isEqualToString:method]) { - return FIRHTTPMethodGET; - } else if ([@"HttpMethod.Head" isEqualToString:method]) { - return FIRHTTPMethodHEAD; - } else if ([@"HttpMethod.Options" isEqualToString:method]) { - return FIRHTTPMethodOPTIONS; - } else if ([@"HttpMethod.Patch" isEqualToString:method]) { - return FIRHTTPMethodPATCH; - } else if ([@"HttpMethod.Post" isEqualToString:method]) { - return FIRHTTPMethodPOST; - } else if ([@"HttpMethod.Put" isEqualToString:method]) { - return FIRHTTPMethodPUT; - } else if ([@"HttpMethod.Trace" isEqualToString:method]) { - return FIRHTTPMethodTRACE; - } - - NSString *reason = [NSString stringWithFormat:@"Invalid HttpMethod: %@", method]; - @throw [[NSException alloc] initWithName:NSInvalidArgumentException reason:reason userInfo:nil]; -} -@end diff --git a/packages/firebase_performance/ios/Classes/FLTHttpMetric.m b/packages/firebase_performance/ios/Classes/FLTHttpMetric.m deleted file mode 100644 index 3a12f3400613..000000000000 --- a/packages/firebase_performance/ios/Classes/FLTHttpMetric.m +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebasePerformancePlugin+Internal.h" - -@interface FLTHttpMetric () -@property FIRHTTPMetric *metric; -@end - -@implementation FLTHttpMetric -- (instancetype _Nonnull)initWithHTTPMetric:(FIRHTTPMetric *)metric { - self = [self init]; - if (self) { - _metric = metric; - } - - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"HttpMetric#start" isEqualToString:call.method]) { - [self start:result]; - } else if ([@"HttpMetric#stop" isEqualToString:call.method]) { - [self stop:call result:result]; - } else if ([@"HttpMetric#httpResponseCode" isEqualToString:call.method]) { - [self setHttpResponseCode:call result:result]; - } else if ([@"HttpMetric#requestPayloadSize" isEqualToString:call.method]) { - [self requestPayloadSize:call result:result]; - } else if ([@"HttpMetric#responseContentType" isEqualToString:call.method]) { - [self responseContentType:call result:result]; - } else if ([@"HttpMetric#responsePayloadSize" isEqualToString:call.method]) { - [self responsePayloadSize:call result:result]; - } else if ([@"PerformanceAttributes#putAttribute" isEqualToString:call.method]) { - [self putAttribute:call result:result]; - } else if ([@"PerformanceAttributes#removeAttribute" isEqualToString:call.method]) { - [self removeAttribute:call result:result]; - } else if ([@"PerformanceAttributes#getAttributes" isEqualToString:call.method]) { - [self getAttributes:result]; - } else { - result(FlutterMethodNotImplemented); - } -} - -- (void)start:(FlutterResult)result { - [_metric start]; - result(nil); -} - -- (void)stop:(FlutterMethodCall *)call result:(FlutterResult)result { - [_metric stop]; - - NSNumber *handle = call.arguments[@"handle"]; - [FLTFirebasePerformancePlugin removeMethodHandler:handle]; - - result(nil); -} - -- (void)setHttpResponseCode:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *responseCode = call.arguments[@"httpResponseCode"]; - - if (![responseCode isEqual:[NSNull null]]) _metric.responseCode = [responseCode integerValue]; - result(nil); -} - -- (void)requestPayloadSize:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *requestPayloadSize = call.arguments[@"requestPayloadSize"]; - - if (![requestPayloadSize isEqual:[NSNull null]]) { - _metric.requestPayloadSize = [requestPayloadSize longValue]; - } - result(nil); -} - -- (void)responseContentType:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *responseContentType = call.arguments[@"responseContentType"]; - - if (![responseContentType isEqual:[NSNull null]]) { - _metric.responseContentType = responseContentType; - } - result(nil); -} - -- (void)responsePayloadSize:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *responsePayloadSize = call.arguments[@"responsePayloadSize"]; - - if (![responsePayloadSize isEqual:[NSNull null]]) { - _metric.responsePayloadSize = [responsePayloadSize longValue]; - } - result(nil); -} - -- (void)putAttribute:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - NSString *value = call.arguments[@"value"]; - - [_metric setValue:value forAttribute:name]; - result(nil); -} - -- (void)removeAttribute:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - - [_metric removeAttribute:name]; - result(nil); -} - -- (void)getAttributes:(FlutterResult)result { - result([_metric attributes]); -} -@end diff --git a/packages/firebase_performance/ios/Classes/FLTTrace.m b/packages/firebase_performance/ios/Classes/FLTTrace.m deleted file mode 100644 index 3ce6af5fc3ef..000000000000 --- a/packages/firebase_performance/ios/Classes/FLTTrace.m +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebasePerformancePlugin+Internal.h" - -@interface FLTTrace () -@property FIRTrace *trace; -@end - -@implementation FLTTrace -- (instancetype _Nonnull)initWithTrace:(FIRTrace *)trace { - self = [self init]; - if (self) { - _trace = trace; - } - - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"Trace#start" isEqualToString:call.method]) { - [self start:result]; - } else if ([@"Trace#stop" isEqualToString:call.method]) { - [self stop:call result:result]; - } else if ([@"Trace#setMetric" isEqualToString:call.method]) { - [self setMetric:call result:result]; - } else if ([@"Trace#incrementMetric" isEqualToString:call.method]) { - [self incrementMetric:call result:result]; - } else if ([@"Trace#getMetric" isEqualToString:call.method]) { - [self getMetric:call result:result]; - } else if ([@"PerformanceAttributes#putAttribute" isEqualToString:call.method]) { - [self putAttribute:call result:result]; - } else if ([@"PerformanceAttributes#removeAttribute" isEqualToString:call.method]) { - [self removeAttribute:call result:result]; - } else if ([@"PerformanceAttributes#getAttributes" isEqualToString:call.method]) { - [self getAttributes:result]; - } else { - result(FlutterMethodNotImplemented); - } -} - -- (void)start:(FlutterResult)result { - [_trace start]; - result(nil); -} - -- (void)stop:(FlutterMethodCall *)call result:(FlutterResult)result { - [_trace stop]; - - NSNumber *handle = call.arguments[@"handle"]; - [FLTFirebasePerformancePlugin removeMethodHandler:handle]; - - result(nil); -} - -- (void)setMetric:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - NSNumber *value = call.arguments[@"value"]; - - [_trace setIntValue:value.longValue forMetric:name]; - result(nil); -} - -- (void)incrementMetric:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - NSNumber *value = call.arguments[@"value"]; - - [_trace incrementMetric:name byInt:value.longValue]; - result(nil); -} - -- (void)getMetric:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - - int64_t metric = [_trace valueForIntMetric:name]; - result(@(metric)); -} - -- (void)putAttribute:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - NSString *value = call.arguments[@"value"]; - - [_trace setValue:value forAttribute:name]; - result(nil); -} - -- (void)removeAttribute:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *name = call.arguments[@"name"]; - - [_trace removeAttribute:name]; - result(nil); -} - -- (void)getAttributes:(FlutterResult)result { - result([_trace attributes]); -} -@end diff --git a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin+Internal.h b/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin+Internal.h deleted file mode 100644 index f0adca5b905b..000000000000 --- a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin+Internal.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebasePerformancePlugin.h" - -@protocol MethodCallHandler -@required -- (void)handleMethodCall:(FlutterMethodCall *_Nonnull)call result:(FlutterResult _Nonnull)result; -@end - -@interface FLTFirebasePerformancePlugin (Internal) -+ (void)addMethodHandler:(NSNumber *_Nonnull)handle - methodHandler:(id _Nonnull)handler; -+ (void)removeMethodHandler:(NSNumber *_Nonnull)handle; -@end - -@interface FLTFirebasePerformance : NSObject -+ (instancetype _Nonnull)sharedInstance; -@end - -@interface FLTTrace : NSObject -- (instancetype _Nonnull)initWithTrace:(FIRTrace *_Nonnull)trace; -@end - -@interface FLTHttpMetric : NSObject -- (instancetype _Nonnull)initWithHTTPMetric:(FIRHTTPMetric *_Nonnull)metric; -@end diff --git a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h b/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h deleted file mode 100644 index f5258a1c561d..000000000000 --- a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.h +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface FLTFirebasePerformancePlugin : NSObject -@end diff --git a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.m b/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.m deleted file mode 100644 index 51000f3b5153..000000000000 --- a/packages/firebase_performance/ios/Classes/FirebasePerformancePlugin.m +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2018 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 "FirebasePerformancePlugin+Internal.h" -#import "UserAgent.h" - -@implementation FLTFirebasePerformancePlugin -static NSMutableDictionary> *methodHandlers; - -+ (void)registerWithRegistrar:(NSObject *)registrar { - methodHandlers = [NSMutableDictionary new]; - - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_performance" - binaryMessenger:[registrar messenger]]; - - FLTFirebasePerformancePlugin *instance = [FLTFirebasePerformancePlugin new]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"FirebasePerformance#instance" isEqualToString:call.method]) { - [methodHandlers removeAllObjects]; - - NSNumber *handle = call.arguments[@"handle"]; - FLTFirebasePerformance *performance = [FLTFirebasePerformance sharedInstance]; - - [FLTFirebasePerformancePlugin addMethodHandler:handle methodHandler:performance]; - result(nil); - } else { - NSNumber *handle = call.arguments[@"handle"]; - - if (![handle isEqual:[NSNull null]]) { - [methodHandlers[handle] handleMethodCall:call result:result]; - } else { - result(FlutterMethodNotImplemented); - } - } -} - -+ (void)addMethodHandler:(NSNumber *)handle methodHandler:(id)handler { - if (methodHandlers[handle]) { - NSString *reason = - [[NSString alloc] initWithFormat:@"Object for handle already exists: %d", handle.intValue]; - @throw [[NSException alloc] initWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } - - methodHandlers[handle] = handler; -} - -+ (void)removeMethodHandler:(NSNumber *)handle { - [methodHandlers removeObjectForKey:handle]; -} -@end diff --git a/packages/firebase_performance/ios/firebase_performance.podspec b/packages/firebase_performance/ios/firebase_performance.podspec deleted file mode 100644 index 0759c43b20ee..000000000000 --- a/packages/firebase_performance/ios/firebase_performance.podspec +++ /dev/null @@ -1,33 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_performance' - s.version = '0.0.1' - s.summary = 'Firebase Performance plugin for Flutter.' - s.description = <<-DESC -Firebase Performance plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_performance' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/Performance' - s.ios.deployment_target = '8.0' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-perf\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_performance/lib/firebase_performance.dart b/packages/firebase_performance/lib/firebase_performance.dart deleted file mode 100644 index a4574ab47dd1..000000000000 --- a/packages/firebase_performance/lib/firebase_performance.dart +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library firebase_performance; - -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:flutter/foundation.dart'; - -part 'src/firebase_performance.dart'; -part 'src/http_metric.dart'; -part 'src/performance_attributes.dart'; -part 'src/trace.dart'; diff --git a/packages/firebase_performance/lib/src/firebase_performance.dart b/packages/firebase_performance/lib/src/firebase_performance.dart deleted file mode 100644 index c0d15573c96a..000000000000 --- a/packages/firebase_performance/lib/src/firebase_performance.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_performance; - -/// Valid HttpMethods for manual network APIs. -enum HttpMethod { Connect, Delete, Get, Head, Options, Patch, Post, Put, Trace } - -/// The Firebase Performance API. -/// -/// You can get an instance by calling [FirebasePerformance.instance]. -class FirebasePerformance { - FirebasePerformance._(this._handle) { - channel.invokeMethod( - 'FirebasePerformance#instance', - {'handle': _handle}, - ); - } - - static int _nextHandle = 0; - - final int _handle; - - @visibleForTesting - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_performance'); - - /// Singleton of [FirebasePerformance]. - static final FirebasePerformance instance = - FirebasePerformance._(_nextHandle++); - - /// Determines whether performance monitoring is enabled or disabled. - /// - /// True if performance monitoring is enabled and false if performance - /// monitoring is disabled. This is for dynamic enable/disable state. This - /// does not reflect whether instrumentation is enabled/disabled. - Future isPerformanceCollectionEnabled() { - return channel.invokeMethod( - 'FirebasePerformance#isPerformanceCollectionEnabled', - {'handle': _handle}, - ); - } - - /// Enables or disables performance monitoring. - /// - /// This setting is persisted and applied on future invocations of your - /// application. By default, performance monitoring is enabled. - Future setPerformanceCollectionEnabled(bool enable) { - return channel.invokeMethod( - 'FirebasePerformance#setPerformanceCollectionEnabled', - {'handle': _handle, 'enable': enable}, - ); - } - - /// Creates a [Trace] object with given [name]. - /// - /// The [name] requires no leading or trailing whitespace, no leading - /// underscore _ character, and max length of [Trace.maxTraceNameLength] - /// characters. - Trace newTrace(String name) { - final int handle = _nextHandle++; - - FirebasePerformance.channel.invokeMethod( - 'FirebasePerformance#newTrace', - {'handle': _handle, 'traceHandle': handle, 'name': name}, - ); - - return Trace._(handle, name); - } - - /// Creates [HttpMetric] for collecting performance for one request/response. - HttpMetric newHttpMetric(String url, HttpMethod httpMethod) { - final int handle = _nextHandle++; - - FirebasePerformance.channel.invokeMethod( - 'FirebasePerformance#newHttpMetric', - { - 'handle': _handle, - 'httpMetricHandle': handle, - 'url': url, - 'httpMethod': httpMethod.toString(), - }, - ); - - return HttpMetric._(handle, url, httpMethod); - } - - /// Creates a [Trace] object with given [name] and starts the trace. - /// - /// The [name] requires no leading or trailing whitespace, no leading - /// underscore _ character, max length of [Trace.maxTraceNameLength] - /// characters. - static Future startTrace(String name) async { - final Trace trace = instance.newTrace(name); - await trace.start(); - return trace; - } -} diff --git a/packages/firebase_performance/lib/src/http_metric.dart b/packages/firebase_performance/lib/src/http_metric.dart deleted file mode 100644 index 2586a1455cc5..000000000000 --- a/packages/firebase_performance/lib/src/http_metric.dart +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_performance; - -/// Metric used to collect data for network requests/responses. -/// -/// It is possible to have more than one [HttpMetric] running at a time. -/// Attributes can also be added to help measure performance related events. A -/// [HttpMetric] also measures the time between calling `start()` and `stop()`. -/// -/// Data collected is automatically sent to the associated Firebase console -/// after stop() is called. -/// -/// You can confirm that Performance Monitoring results appear in the Firebase -/// console. Results should appear within 12 hours. -/// -/// It is highly recommended that one always calls `start()` and `stop()` on -/// each created [HttpMetric] to avoid leaking on the platform side. -class HttpMetric extends PerformanceAttributes { - HttpMetric._(this._handle, this.url, this.httpMethod); - - final String url; - final HttpMethod httpMethod; - - @override - bool _hasStarted = false; - - @override - bool _hasStopped = false; - - int _httpResponseCode; - int _requestPayloadSize; - String _responseContentType; - int _responsePayloadSize; - - @override - final int _handle; - - /// HttpResponse code of the request. - int get httpResponseCode => _httpResponseCode; - - /// Size of the request payload. - int get requestPayloadSize => _requestPayloadSize; - - /// Content type of the response such as text/html, application/json, etc... - String get responseContentType => _responseContentType; - - /// Size of the response payload. - int get responsePayloadSize => _responsePayloadSize; - - /// HttpResponse code of the request. - /// - /// If the [HttpMetric] has already been stopped, returns immediately without - /// taking action. - set httpResponseCode(int httpResponseCode) { - if (_hasStopped) return; - - _httpResponseCode = httpResponseCode; - FirebasePerformance.channel.invokeMethod( - 'HttpMetric#httpResponseCode', - { - 'handle': _handle, - 'httpResponseCode': httpResponseCode, - }, - ); - } - - /// Size of the request payload. - /// - /// If the [HttpMetric] has already been stopped, returns immediately without - /// taking action. - set requestPayloadSize(int requestPayloadSize) { - if (_hasStopped) return; - - _requestPayloadSize = requestPayloadSize; - FirebasePerformance.channel.invokeMethod( - 'HttpMetric#requestPayloadSize', - { - 'handle': _handle, - 'requestPayloadSize': requestPayloadSize, - }, - ); - } - - /// Content type of the response such as text/html, application/json, etc... - /// - /// If the [HttpMetric] has already been stopped, returns immediately without - /// taking action. - set responseContentType(String responseContentType) { - if (_hasStopped) return; - - _responseContentType = responseContentType; - FirebasePerformance.channel.invokeMethod( - 'HttpMetric#responseContentType', - { - 'handle': _handle, - 'responseContentType': responseContentType, - }, - ); - } - - /// Size of the response payload. - /// - /// If the [HttpMetric] has already been stopped, returns immediately without - /// taking action. - set responsePayloadSize(int responsePayloadSize) { - if (_hasStopped) return; - - _responsePayloadSize = responsePayloadSize; - FirebasePerformance.channel.invokeMethod( - 'HttpMetric#responsePayloadSize', - { - 'handle': _handle, - 'responsePayloadSize': responsePayloadSize, - }, - ); - } - - /// Starts this [HttpMetric]. - /// - /// Can only be called once. - /// - /// Using `await` with this method is only necessary when accurate timing - /// is relevant. - Future start() { - if (_hasStopped) return Future.value(null); - - _hasStarted = true; - return FirebasePerformance.channel.invokeMethod( - 'HttpMetric#start', - {'handle': _handle}, - ); - } - - /// Stops this [HttpMetric]. - /// - /// Can only be called once and only after start(), Data collected is - /// automatically sent to the associate Firebase console after stop() is - /// called. You can confirm that Performance Monitoring results appear in the - /// Firebase console. Results should appear within 12 hours. - /// - /// Not necessary to use `await` with this method. - Future stop() { - if (_hasStopped) return Future.value(null); - - _hasStopped = true; - return FirebasePerformance.channel.invokeMethod( - 'HttpMetric#stop', - {'handle': _handle}, - ); - } -} diff --git a/packages/firebase_performance/lib/src/performance_attributes.dart b/packages/firebase_performance/lib/src/performance_attributes.dart deleted file mode 100644 index 96a77a009f57..000000000000 --- a/packages/firebase_performance/lib/src/performance_attributes.dart +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_performance; - -/// Abstract class that allows adding/removing attributes to an object. -abstract class PerformanceAttributes { - /// Maximum allowed length of a key passed to [putAttribute]. - static const int maxAttributeKeyLength = 40; - - /// Maximum allowed length of a value passed to [putAttribute]. - static const int maxAttributeValueLength = 100; - - /// Maximum allowed number of attributes that can be added. - static const int maxCustomAttributes = 5; - - final Map _attributes = {}; - - bool get _hasStarted; - bool get _hasStopped; - - int get _handle; - - /// Sets a String [value] for the specified attribute with [name]. - /// - /// Updates the value of the attribute if the attribute already exists. - /// The maximum number of attributes that can be added are - /// [maxCustomAttributes]. An attempt to add more than [maxCustomAttributes] - /// to this object will return without adding the attribute. - /// - /// Name of the attribute has max length of [maxAttributeKeyLength] - /// characters. Value of the attribute has max length of - /// [maxAttributeValueLength] characters. If the name has a length greater - /// than [maxAttributeKeyLength] or the value has a length greater than - /// [maxAttributeValueLength], this method will return without adding - /// anything. - /// - /// If this object has been stopped, this method returns without adding the - /// attribute. - Future putAttribute(String name, String value) { - if (_hasStopped || - name.length > maxAttributeKeyLength || - value.length > maxAttributeValueLength || - _attributes.length == maxCustomAttributes) { - return Future.value(null); - } - - _attributes[name] = value; - return FirebasePerformance.channel.invokeMethod( - 'PerformanceAttributes#putAttribute', - { - 'handle': _handle, - 'name': name, - 'value': value, - }, - ); - } - - /// Removes an already added attribute. - /// - /// If this object has been stopped, this method returns without removing the - /// attribute. - Future removeAttribute(String name) { - if (_hasStopped) return Future.value(null); - - _attributes.remove(name); - return FirebasePerformance.channel.invokeMethod( - 'PerformanceAttributes#removeAttribute', - {'handle': _handle, 'name': name}, - ); - } - - /// Returns the value of an attribute. - /// - /// Returns `null` if an attribute with this [name] has not been added. - String getAttribute(String name) => _attributes[name]; - - /// All attributes added. - Future> getAttributes() { - if (_hasStopped) { - return Future>.value( - Map.unmodifiable(_attributes), - ); - } - - return FirebasePerformance.channel.invokeMapMethod( - 'PerformanceAttributes#getAttributes', - {'handle': _handle}, - ); - } -} diff --git a/packages/firebase_performance/lib/src/trace.dart b/packages/firebase_performance/lib/src/trace.dart deleted file mode 100644 index 873a138c7392..000000000000 --- a/packages/firebase_performance/lib/src/trace.dart +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_performance; - -/// [Trace] allows you to set the beginning and end of a custom trace in your app. -/// -/// A trace is a report of performance data associated with some of the -/// code in your app. You can have multiple custom traces, and it is -/// possible to have more than one custom trace running at a time. Each custom -/// trace can have multiple metrics and attributes added to help measure -/// performance related events. A trace also measures the time between calling -/// `start()` and `stop()`. -/// -/// Data collected is automatically sent to the associated Firebase console -/// after stop() is called. -/// -/// You can confirm that Performance Monitoring results appear in the Firebase -/// console. Results should appear within 12 hours. -/// -/// It is highly recommended that one always calls `start()` and `stop()` on -/// each created [Trace] to not avoid leaking on the platform side. -class Trace extends PerformanceAttributes { - Trace._(this._handle, this.name); - - /// Maximum allowed length of the name of a [Trace]. - static const int maxTraceNameLength = 100; - - final Map _metrics = {}; - - @override - bool _hasStarted = false; - - @override - bool _hasStopped = false; - - @override - final int _handle; - - /// Name representing this [Trace] on the Firebase Console. - final String name; - - /// Starts this [Trace]. - /// - /// Can only be called once. - /// - /// Using `await` with this method is only necessary when accurate timing - /// is relevant. - Future start() { - if (_hasStopped) return Future.value(null); - - _hasStarted = true; - return FirebasePerformance.channel.invokeMethod( - 'Trace#start', - {'handle': _handle}, - ); - } - - /// Stops this [Trace]. - /// - /// Can only be called once and only after start() Data collected is - /// automatically sent to the associated Firebase console after stop() is - /// called. You can confirm that Performance Monitoring results appear in the - /// Firebase console. Results should appear within 12 hours. - /// - /// Not necessary to use `await` with this method. - Future stop() { - if (_hasStopped) return Future.value(null); - - _hasStopped = true; - return FirebasePerformance.channel.invokeMethod( - 'Trace#stop', - {'handle': _handle}, - ); - } - - /// Increments the metric with the given [name]. - /// - /// If the metric does not exist, a new one will be created. If the [Trace] has - /// not been started or has already been stopped, returns immediately without - /// taking action. - Future incrementMetric(String name, int value) { - if (!_hasStarted || _hasStopped) { - return Future.value(null); - } - - _metrics.putIfAbsent(name, () => 0); - _metrics[name] += value; - return FirebasePerformance.channel.invokeMethod( - 'Trace#incrementMetric', - {'handle': _handle, 'name': name, 'value': value}, - ); - } - - /// Sets the [value] of the metric with the given [name]. - /// - /// If a metric with the given name doesn't exist, a new one will be created. - /// If the [Trace] has not been started or has already been stopped, returns - /// immediately without taking action. - Future setMetric(String name, int value) { - if (!_hasStarted || _hasStopped) return Future.value(null); - - _metrics[name] = value; - return FirebasePerformance.channel.invokeMethod( - 'Trace#setMetric', - {'handle': _handle, 'name': name, 'value': value}, - ); - } - - /// Gets the value of the metric with the given [name]. - /// - /// If a metric with the given name doesn't exist, it is NOT created and a 0 - /// is returned. - Future getMetric(String name) { - if (_hasStopped) return Future.value(_metrics[name] ?? 0); - - return FirebasePerformance.channel.invokeMethod( - 'Trace#getMetric', - {'handle': _handle, 'name': name}, - ); - } -} diff --git a/packages/firebase_performance/pubspec.yaml b/packages/firebase_performance/pubspec.yaml deleted file mode 100644 index f864e84745b7..000000000000 --- a/packages/firebase_performance/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: firebase_performance -description: Flutter plugin for Google Performance Monitoring for Firebase, an app - measurement solution that monitors traces and HTTP/S network requests on Android and - iOS. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_performance -version: 0.3.0+4 - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - http: ^0.12.0 - flutter_test: - sdk: flutter - firebase_core: ^0.4.0 - flutter_driver: - sdk: flutter - test: any - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebaseperformance - iosPrefix: FLT - pluginClass: FirebasePerformancePlugin - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=0.2.4 <2.0.0" diff --git a/packages/firebase_performance/test/firebase_performance_test.dart b/packages/firebase_performance/test/firebase_performance_test.dart deleted file mode 100644 index 70549a0501e4..000000000000 --- a/packages/firebase_performance/test/firebase_performance_test.dart +++ /dev/null @@ -1,493 +0,0 @@ -// Copyright 2018 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:flutter/services.dart'; - -import 'package:firebase_performance/firebase_performance.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('$FirebasePerformance', () { - final List performanceLog = []; - - FirebasePerformance performance; - int firebasePerformanceHandle; - - int nextHandle = 0; - - bool isPerformanceCollectionEnabledResult; - - setUpAll(() { - FirebasePerformance.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - performanceLog.add(methodCall); - switch (methodCall.method) { - case 'FirebasePerformance#isPerformanceCollectionEnabled': - return isPerformanceCollectionEnabledResult; - default: - return null; - } - }); - }); - - setUp(() { - performanceLog.clear(); - }); - - test('instance', () { - firebasePerformanceHandle = nextHandle++; - performance = FirebasePerformance.instance; - - expect(performanceLog, [ - isMethodCall( - 'FirebasePerformance#instance', - arguments: {'handle': firebasePerformanceHandle}, - ), - ]); - }); - - test('isPerformanceCollectionEnabled', () async { - isPerformanceCollectionEnabledResult = true; - final bool enabled = await performance.isPerformanceCollectionEnabled(); - expect(enabled, isTrue); - - isPerformanceCollectionEnabledResult = false; - final bool disabled = await performance.isPerformanceCollectionEnabled(); - expect(disabled, isFalse); - - expect(performanceLog, [ - isMethodCall( - 'FirebasePerformance#isPerformanceCollectionEnabled', - arguments: {'handle': firebasePerformanceHandle}, - ), - isMethodCall( - 'FirebasePerformance#isPerformanceCollectionEnabled', - arguments: {'handle': firebasePerformanceHandle}, - ), - ]); - }); - - test('setPerformanceCollectionEnabled', () { - performance.setPerformanceCollectionEnabled(true); - performance.setPerformanceCollectionEnabled(false); - - expect(performanceLog, [ - isMethodCall( - 'FirebasePerformance#setPerformanceCollectionEnabled', - arguments: { - 'handle': firebasePerformanceHandle, - 'enable': true, - }, - ), - isMethodCall( - 'FirebasePerformance#setPerformanceCollectionEnabled', - arguments: { - 'handle': firebasePerformanceHandle, - 'enable': false, - }, - ), - ]); - }); - - test('newTrace', () { - performance.newTrace('test-trace'); - - expect(performanceLog, [ - isMethodCall( - 'FirebasePerformance#newTrace', - arguments: { - 'handle': firebasePerformanceHandle, - 'traceHandle': nextHandle++, - 'name': 'test-trace', - }, - ), - ]); - }); - - test('newHttpMetric', () { - performance.newHttpMetric('https://google.com', HttpMethod.Connect); - - expect(performanceLog, [ - isMethodCall( - 'FirebasePerformance#newHttpMetric', - arguments: { - 'handle': firebasePerformanceHandle, - 'httpMetricHandle': nextHandle++, - 'url': 'https://google.com', - 'httpMethod': HttpMethod.Connect.toString(), - }, - ), - ]); - }); - - test('startTrace', () { - final int currentHandle = nextHandle++; - FirebasePerformance.startTrace('test-start-trace'); - - expect(performanceLog, [ - isMethodCall( - 'FirebasePerformance#newTrace', - arguments: { - 'handle': firebasePerformanceHandle, - 'traceHandle': currentHandle, - 'name': 'test-start-trace', - }, - ), - isMethodCall( - 'Trace#start', - arguments: {'handle': currentHandle}, - ), - ]); - }); - - test('$HttpMethod', () { - performance.newHttpMetric('https://google.com', HttpMethod.Delete); - - expect(performanceLog, [ - isMethodCall( - 'FirebasePerformance#newHttpMetric', - arguments: { - 'handle': firebasePerformanceHandle, - 'httpMetricHandle': nextHandle++, - 'url': 'https://google.com', - 'httpMethod': HttpMethod.Delete.toString(), - }, - ), - ]); - }); - - group('$Trace', () { - final List traceLog = []; - - Trace testTrace; - int currentTestTraceHandle; - - setUpAll(() { - FirebasePerformance.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - traceLog.add(methodCall); - switch (methodCall.method) { - case 'FirebasePerformance#isPerformanceCollectionEnabled': - return isPerformanceCollectionEnabledResult; - default: - return null; - } - }); - }); - - setUp(() { - testTrace = performance.newTrace('test'); - currentTestTraceHandle = nextHandle++; - - traceLog.clear(); - }); - - test('start', () { - testTrace.start(); - - expect(traceLog, [ - isMethodCall( - 'Trace#start', - arguments: {'handle': currentTestTraceHandle}, - ), - ]); - }); - - test('stop', () { - testTrace.start(); - traceLog.clear(); - - testTrace.stop(); - - expect(traceLog, [ - isMethodCall( - 'Trace#stop', - arguments: {'handle': currentTestTraceHandle}, - ), - ]); - }); - - test('incrementMetric', () { - testTrace.start(); - traceLog.clear(); - - testTrace.incrementMetric('metric1', 3); - - expect(traceLog, [ - isMethodCall( - 'Trace#incrementMetric', - arguments: { - 'handle': currentTestTraceHandle, - 'name': 'metric1', - 'value': 3, - }, - ), - ]); - }); - - test('setMetric', () { - testTrace.start(); - traceLog.clear(); - - testTrace.setMetric('metric3', 5); - - expect(traceLog, [ - isMethodCall( - 'Trace#setMetric', - arguments: { - 'handle': currentTestTraceHandle, - 'name': 'metric3', - 'value': 5, - }, - ), - ]); - }); - - test('getMetric', () { - testTrace.getMetric('metric4'); - - expect(traceLog, [ - isMethodCall( - 'Trace#getMetric', - arguments: { - 'handle': currentTestTraceHandle, - 'name': 'metric4', - }, - ), - ]); - }); - - test('invokeMethod not called if trace hasn\'t started', () { - testTrace.incrementMetric('any', 211); - testTrace.setMetric('what', 23); - - expect(traceLog, isEmpty); - }); - - test('invokeMethod not called if trace has stopped', () { - testTrace.start(); - testTrace.stop(); - traceLog.clear(); - - testTrace.start(); - testTrace.stop(); - testTrace.incrementMetric('any', 211); - testTrace.setMetric('what', 23); - testTrace.getMetric('efser'); - - expect(traceLog, isEmpty); - }); - }); - - group('$HttpMetric', () { - final List httpMetricLog = []; - - HttpMetric testMetric; - int currentTestMetricHandle; - - setUpAll(() { - FirebasePerformance.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - httpMetricLog.add(methodCall); - switch (methodCall.method) { - case 'FirebasePerformance#isPerformanceCollectionEnabled': - return isPerformanceCollectionEnabledResult; - default: - return null; - } - }); - }); - - setUp(() { - testMetric = performance.newHttpMetric( - 'https://google.com', - HttpMethod.Get, - ); - currentTestMetricHandle = nextHandle++; - - httpMetricLog.clear(); - }); - - test('start', () { - testMetric.start(); - - expect(httpMetricLog, [ - isMethodCall( - 'HttpMetric#start', - arguments: {'handle': currentTestMetricHandle}, - ), - ]); - }); - - test('stop', () { - testMetric.start(); - httpMetricLog.clear(); - - testMetric.stop(); - - expect(httpMetricLog, [ - isMethodCall( - 'HttpMetric#stop', - arguments: {'handle': currentTestMetricHandle}, - ), - ]); - }); - - test('httpResponseCode', () { - testMetric.httpResponseCode = 45; - - expect(httpMetricLog, [ - isMethodCall( - 'HttpMetric#httpResponseCode', - arguments: { - 'handle': currentTestMetricHandle, - 'httpResponseCode': 45, - }, - ), - ]); - }); - - test('requestPayloadSize', () { - testMetric.requestPayloadSize = 436; - - expect(httpMetricLog, [ - isMethodCall( - 'HttpMetric#requestPayloadSize', - arguments: { - 'handle': currentTestMetricHandle, - 'requestPayloadSize': 436, - }, - ), - ]); - }); - - test('responseContentType', () { - testMetric.responseContentType = 'hi'; - - expect(httpMetricLog, [ - isMethodCall( - 'HttpMetric#responseContentType', - arguments: { - 'handle': currentTestMetricHandle, - 'responseContentType': 'hi', - }, - ), - ]); - }); - - test('responsePayloadSize', () { - testMetric.responsePayloadSize = 12; - - expect(httpMetricLog, [ - isMethodCall( - 'HttpMetric#responsePayloadSize', - arguments: { - 'handle': currentTestMetricHandle, - 'responsePayloadSize': 12, - }, - ), - ]); - }); - - test('invokeMethod not called if httpMetric has stopped', () { - testMetric.start(); - testMetric.stop(); - httpMetricLog.clear(); - - testMetric.start(); - testMetric.stop(); - testMetric.httpResponseCode = 12; - testMetric.requestPayloadSize = 23; - testMetric.responseContentType = 'potato'; - testMetric.responsePayloadSize = 123; - - expect(httpMetricLog, isEmpty); - }); - }); - - group('$PerformanceAttributes', () { - final List attributeLog = []; - - Trace attributeTrace; - int currentTraceHandle; - - setUpAll(() { - FirebasePerformance.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - attributeLog.add(methodCall); - switch (methodCall.method) { - case 'PerformanceAttributes#getAttributes': - return { - 'a1': 'hello', - 'a2': 'friend', - }; - default: - return null; - } - }); - }); - - setUp(() { - attributeTrace = performance.newTrace('trace'); - currentTraceHandle = nextHandle++; - - attributeLog.clear(); - }); - - test('putAttribute', () { - attributeTrace.putAttribute('attr1', 'apple'); - - expect(attributeLog, [ - isMethodCall( - 'PerformanceAttributes#putAttribute', - arguments: { - 'handle': currentTraceHandle, - 'name': 'attr1', - 'value': 'apple', - }, - ), - ]); - }); - - test('removeAttribute', () { - attributeTrace.removeAttribute('attr14'); - - expect(attributeLog, [ - isMethodCall( - 'PerformanceAttributes#removeAttribute', - arguments: { - 'handle': currentTraceHandle, - 'name': 'attr14', - }, - ), - ]); - }); - - test('getAttributes', () async { - final Map result = await attributeTrace.getAttributes(); - - expect(attributeLog, [ - isMethodCall( - 'PerformanceAttributes#getAttributes', - arguments: {'handle': currentTraceHandle}, - ), - ]); - - expect(result, {'a1': 'hello', 'a2': 'friend'}); - }); - - test('invokeMethod not called if trace has stopped', () { - attributeTrace.start(); - attributeTrace.stop(); - attributeLog.clear(); - - attributeTrace.putAttribute('tonto', 'orale'); - attributeTrace.removeAttribute('ewfo'); - attributeTrace.getAttributes(); - - expect(attributeLog, isEmpty); - }); - }); - }); -} diff --git a/packages/firebase_remote_config/.gitignore b/packages/firebase_remote_config/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_remote_config/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_remote_config/CHANGELOG.md b/packages/firebase_remote_config/CHANGELOG.md deleted file mode 100644 index bdc6d78948a5..000000000000 --- a/packages/firebase_remote_config/CHANGELOG.md +++ /dev/null @@ -1,81 +0,0 @@ -## 0.2.0+5 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 0.2.0+4 - -* Fixed a bug where `RemoteConfigValue` could incorrectly report a remote `source` for default values. -* Added an integration test for the fixed behavior of `source`. -* Removed a test that made integration test flaky. - -## 0.2.0+3 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 0.2.0+2 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. -* Replace invokeMethod with invokeMapMethod wherever necessary. - -## 0.2.0+1 - -* Minor internal code cleanup in Java implementation. - -## 0.2.0 - -* Update Android dependencies to latest. - -## 0.1.0+3 - -* Initial integration tests. - -## 0.1.0+2 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.1.0+1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.1.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.0.6+1 - -* Bump Android dependencies to latest. - -## 0.0.6 - -* Allowed extending the RemoteConfig class. - -## 0.0.5 - -* Bump Android and Firebase dependency versions. - -## 0.0.4 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.0.3 - -* Added missing await in setDefaults. -* Fixed example code in README. - -## 0.0.2 - -* Update iOS plugin so that it returns fetch status - as a String instead of an int. -* Bump Android library version to 15.+. The Android plugins for - FlutterFire need to all be on the same version. Updating - Remote Config to match other FlutterFire plugins. - -## 0.0.1 - -* Implement Firebase Remote Config. diff --git a/packages/firebase_remote_config/LICENSE b/packages/firebase_remote_config/LICENSE deleted file mode 100644 index dd2a7aca4242..000000000000 --- a/packages/firebase_remote_config/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2018, the Chromium project 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_remote_config/README.md b/packages/firebase_remote_config/README.md deleted file mode 100644 index 07f0c223d90b..000000000000 --- a/packages/firebase_remote_config/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# firebase_remote_config plugin - -A Flutter plugin to use the [Firebase Remote Config API](https://firebase.google.com/products/remote-config/). - -[![pub package](https://img.shields.io/pub/v/firebase_remote_config.svg)](https://pub.dartlang.org/packages/firebase_remote_config) - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -### Import the firebase_remote_config plugin -To use the firebase_remote_config plugin, follow the [plugin installation instructions](https://pub.dartlang.org/packages/firebase_remote_config#pub-pkg-tab-installing). - -### Android integration - -Enable the Google services by configuring the Gradle scripts as such. - -1. Add the classpath to the `[project]/android/build.gradle` file. -```gradle -dependencies { - // Example existing classpath - classpath 'com.android.tools.build:gradle:3.2.1' - // Add the google services classpath - classpath 'com.google.gms:google-services:4.3.0' -} -``` - -2. Add the apply plugin to the `[project]/android/app/build.gradle` file. -```gradle -// ADD THIS AT THE BOTTOM -apply plugin: 'com.google.gms.google-services' -``` - -*Note:* If this section is not completed you will get an error like this: -``` -java.lang.IllegalStateException: -Default FirebaseApp is not initialized in this process [package name]. -Make sure to call FirebaseApp.initializeApp(Context) first. -``` - -*Note:* When you are debugging on android, use a device or AVD with Google Play services. -Otherwise you will not be able to use Firebase Remote Config. - -### Use the plugin - -Add the following imports to your Dart code: -```dart -import 'package:firebase_remote_config/firebase_remote_config.dart'; -``` - -Initialize `RemoteConfig`: -```dart -final RemoteConfig remoteConfig = await RemoteConfig.instance; -``` - -You can now use the Firebase `remoteConfig` to fetch remote configurations in your Dart code, e.g. -```dart -final defaults = {'welcome': 'default welcome'}; -await remoteConfig.setDefaults(defaults); - -await remoteConfig.fetch(expiration: const Duration(hours: 5)); -await remoteConfig.activateFetched(); -print('welcome message: ' + remoteConfig.getString('welcome')); -``` - -## Example - -See the [example application](https://github.com/flutter/plugins/tree/master/packages/firebase_remote_config/example) source -for a complete sample app using the Firebase Remote Config. - -## Issues and feedback - -Please file [issues](https://github.com/flutter/flutter/issues/new) -to send feedback or report a bug. Thank you! diff --git a/packages/firebase_remote_config/android/build.gradle b/packages/firebase_remote_config/android/build.gradle deleted file mode 100644 index b4eb1e6158d7..000000000000 --- a/packages/firebase_remote_config/android/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -def PLUGIN = "firebase_remote_config"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebase.firebaseremoteconfig' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-config:16.4.1' - implementation 'com.google.firebase:firebase-common:16.1.0' - implementation 'androidx.annotation:annotation:1.0.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_remote_config/android/gradle.properties b/packages/firebase_remote_config/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_remote_config/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_remote_config/android/settings.gradle b/packages/firebase_remote_config/android/settings.gradle deleted file mode 100644 index 1ab71539c02f..000000000000 --- a/packages/firebase_remote_config/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_remote_config' diff --git a/packages/firebase_remote_config/android/src/main/AndroidManifest.xml b/packages/firebase_remote_config/android/src/main/AndroidManifest.xml deleted file mode 100644 index 4cc4c7d7c467..000000000000 --- a/packages/firebase_remote_config/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java b/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java deleted file mode 100644 index d07a9ad1d57a..000000000000 --- a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FirebaseRemoteConfigPlugin.java +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.firebaseremoteconfig; - -import android.content.Context; -import android.content.SharedPreferences; -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.remoteconfig.FirebaseRemoteConfig; -import com.google.firebase.remoteconfig.FirebaseRemoteConfigFetchThrottledException; -import com.google.firebase.remoteconfig.FirebaseRemoteConfigInfo; -import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings; -import com.google.firebase.remoteconfig.FirebaseRemoteConfigValue; -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.plugin.common.PluginRegistry.Registrar; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** FirebaseRemoteConfigPlugin */ -public class FirebaseRemoteConfigPlugin implements MethodCallHandler { - - public static final String TAG = "FirebaseRemoteConfigPlugin"; - public static final String PREFS_NAME = - "io.flutter.plugins.firebase.firebaseremoteconfig.FirebaseRemoteConfigPlugin"; - public static final String DEFAULT_PREF_KEY = "default_keys"; - - private static SharedPreferences sharedPreferences; - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_remote_config"); - channel.setMethodCallHandler(new FirebaseRemoteConfigPlugin()); - sharedPreferences = registrar.context().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); - } - - @Override - public void onMethodCall(MethodCall call, final Result result) { - switch (call.method) { - case "RemoteConfig#instance": - { - FirebaseRemoteConfigInfo firebaseRemoteConfigInfo = - FirebaseRemoteConfig.getInstance().getInfo(); - - Map properties = new HashMap<>(); - properties.put("lastFetchTime", firebaseRemoteConfigInfo.getFetchTimeMillis()); - properties.put( - "lastFetchStatus", mapLastFetchStatus(firebaseRemoteConfigInfo.getLastFetchStatus())); - properties.put( - "inDebugMode", firebaseRemoteConfigInfo.getConfigSettings().isDeveloperModeEnabled()); - properties.put("parameters", getConfigParameters()); - result.success(properties); - break; - } - case "RemoteConfig#setConfigSettings": - { - boolean debugMode = call.argument("debugMode"); - final FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); - FirebaseRemoteConfigSettings settings = - new FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(debugMode).build(); - firebaseRemoteConfig.setConfigSettings(settings); - result.success(null); - break; - } - case "RemoteConfig#fetch": - { - long expiration = ((Number) call.argument("expiration")).longValue(); - final FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); - firebaseRemoteConfig - .fetch(expiration) - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - FirebaseRemoteConfigInfo firebaseRemoteConfigInfo = - firebaseRemoteConfig.getInfo(); - Map properties = new HashMap<>(); - properties.put( - "lastFetchTime", firebaseRemoteConfigInfo.getFetchTimeMillis()); - properties.put( - "lastFetchStatus", - mapLastFetchStatus(firebaseRemoteConfigInfo.getLastFetchStatus())); - if (!task.isSuccessful()) { - final Exception exception = task.getException(); - - if (exception instanceof FirebaseRemoteConfigFetchThrottledException) { - properties.put( - "fetchThrottledEnd", - ((FirebaseRemoteConfigFetchThrottledException) exception) - .getThrottleEndTimeMillis()); - String errorMessage = - "Fetch has been throttled. See the error's " - + "FETCH_THROTTLED_END field for throttle end time."; - result.error("fetchFailedThrottled", errorMessage, properties); - } else { - String errorMessage = - "Unable to complete fetch. Reason is unknown " - + "but this could be due to lack of connectivity."; - result.error("fetchFailed", errorMessage, properties); - } - } else { - result.success(properties); - } - } - }); - break; - } - case "RemoteConfig#activate": - { - boolean newConfig = FirebaseRemoteConfig.getInstance().activateFetched(); - Map properties = new HashMap<>(); - properties.put("parameters", getConfigParameters()); - properties.put("newConfig", newConfig); - result.success(properties); - break; - } - case "RemoteConfig#setDefaults": - { - Map defaults = call.argument("defaults"); - FirebaseRemoteConfig.getInstance().setDefaults(defaults); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putStringSet(DEFAULT_PREF_KEY, defaults.keySet()).apply(); - result.success(null); - break; - } - default: - { - result.notImplemented(); - break; - } - } - } - - private Map getConfigParameters() { - FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); - Map parameterMap = new HashMap<>(); - Set keys = firebaseRemoteConfig.getKeysByPrefix(""); - for (String key : keys) { - FirebaseRemoteConfigValue remoteConfigValue = firebaseRemoteConfig.getValue(key); - parameterMap.put(key, createRemoteConfigValueMap(remoteConfigValue)); - } - // Add default parameters if missing since `getKeysByPrefix` does not return default keys. - Set defaultKeys = - sharedPreferences.getStringSet(DEFAULT_PREF_KEY, new HashSet()); - for (String defaultKey : defaultKeys) { - if (!parameterMap.containsKey(defaultKey)) { - FirebaseRemoteConfigValue remoteConfigValue = firebaseRemoteConfig.getValue(defaultKey); - parameterMap.put(defaultKey, createRemoteConfigValueMap(remoteConfigValue)); - } - } - return parameterMap; - } - - private Map createRemoteConfigValueMap( - FirebaseRemoteConfigValue remoteConfigValue) { - Map valueMap = new HashMap<>(); - valueMap.put("value", remoteConfigValue.asByteArray()); - valueMap.put("source", mapValueSource(remoteConfigValue.getSource())); - return valueMap; - } - - private String mapLastFetchStatus(int status) { - switch (status) { - case FirebaseRemoteConfig.LAST_FETCH_STATUS_SUCCESS: - return "success"; - case FirebaseRemoteConfig.LAST_FETCH_STATUS_FAILURE: - return "failure"; - case FirebaseRemoteConfig.LAST_FETCH_STATUS_THROTTLED: - return "throttled"; - case FirebaseRemoteConfig.LAST_FETCH_STATUS_NO_FETCH_YET: - return "noFetchYet"; - default: - return "failure"; - } - } - - private String mapValueSource(int source) { - switch (source) { - case FirebaseRemoteConfig.VALUE_SOURCE_STATIC: - return "static"; - case FirebaseRemoteConfig.VALUE_SOURCE_DEFAULT: - return "default"; - case FirebaseRemoteConfig.VALUE_SOURCE_REMOTE: - return "remote"; - default: - return "static"; - } - } -} diff --git a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java b/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index 6be694a853be..000000000000 --- a/packages/firebase_remote_config/android/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfig/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.firebaseremoteconfig; - -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; - -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_remote_config/android/user-agent.gradle b/packages/firebase_remote_config/android/user-agent.gradle deleted file mode 100644 index 3454bf0b3a48..000000000000 --- a/packages/firebase_remote_config/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -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_remote_config/example/.metadata b/packages/firebase_remote_config/example/.metadata deleted file mode 100644 index bdd1083db148..000000000000 --- a/packages/firebase_remote_config/example/.metadata +++ /dev/null @@ -1,8 +0,0 @@ -# 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: 538ba522eeeffb8a754ecb12b77eddac3452ed74 - channel: master diff --git a/packages/firebase_remote_config/example/README.md b/packages/firebase_remote_config/example/README.md deleted file mode 100644 index 5890edf8f25b..000000000000 --- a/packages/firebase_remote_config/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_remote_config_example - -Demonstrates how to use the firebase_remote_config plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_remote_config/example/android.iml b/packages/firebase_remote_config/example/android.iml deleted file mode 100644 index 462b903e05b6..000000000000 --- a/packages/firebase_remote_config/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_remote_config/example/android/app/build.gradle b/packages/firebase_remote_config/example/android/app/build.gradle deleted file mode 100644 index 0912407d96fa..000000000000 --- a/packages/firebase_remote_config/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.firebase.firebaseremoteconfigexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/packages/firebase_remote_config/example/android/app/google-services.json b/packages/firebase_remote_config/example/android/app/google-services.json deleted file mode 100644 index 5de4fcc09915..000000000000 --- a/packages/firebase_remote_config/example/android/app/google-services.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "project_info": { - "project_number": "297855924061", - "firebase_url": "https://flutterfire-cd2f7.firebaseio.com", - "project_id": "flutterfire-cd2f7", - "storage_bucket": "flutterfire-cd2f7.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:669871c998cc21bd", - "android_client_info": { - "package_name": "com.yourcompany.firebaseauth.example" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-r1u58cnh4p6l1ghpkteil46erlkfll62.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.yourcompany.firebaseauth.example", - "certificate_hash": "c3adef7e7773e40e777d5c236dbba7461cbea5f0" - } - }, - { - "client_id": "297855924061-col4in4uubarifm60nbq8id01ec3ss4c.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.yourcompany.firebaseauth.example", - "certificate_hash": "8a4e194f5bfc3fb1075e7daae8dcddd526fde207" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "297855924061-1skfqv2sc9avlclefi3q2l229t98dpda.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.yourcompany.firestoreExample" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:92efa9a0df6f077f", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase_storage_example" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:db912bec12847bd9", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase_database_example" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-fbg7lp8bvtbibn2edns7d5fc3k0fhsa3.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebase_database_example", - "certificate_hash": "c3adef7e7773e40e777d5c236dbba7461cbea5f0" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "297855924061-1skfqv2sc9avlclefi3q2l229t98dpda.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.yourcompany.firestoreExample" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:236f9daea101f77e", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-n8i063j2dib6goh5or4lrctg6sccpevi.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "io.flutter.plugins.firebase.firestoreexample", - "certificate_hash": "a8fc78a37cd4f0471580936de67a2cb2ae4657c7" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "297855924061-1skfqv2sc9avlclefi3q2l229t98dpda.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.yourcompany.firestoreExample" - } - }, - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:297855924061:android:6ef94ae486218531", - "android_client_info": { - "package_name": "io.flutter.plugins.firebase.firebaseremoteconfigexample" - } - }, - "oauth_client": [ - { - "client_id": "297855924061-f68m5v860ms5faiotn5mv9f50cmpacdq.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyD_shO5mfO9lhy2TVWhfo1VUmARKlG4suk" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/packages/firebase_remote_config/example/android/app/gradle.properties b/packages/firebase_remote_config/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_remote_config/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_remote_config/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_remote_config/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_remote_config/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_remote_config/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_remote_config/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index fe4292fe0322..000000000000 --- a/packages/firebase_remote_config/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_remote_config/example/android/app/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfigexample/MainActivity.java b/packages/firebase_remote_config/example/android/app/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfigexample/MainActivity.java deleted file mode 100644 index ef048c74f4df..000000000000 --- a/packages/firebase_remote_config/example/android/app/src/main/java/io/flutter/plugins/firebase/firebaseremoteconfigexample/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.firebase.firebaseremoteconfigexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_remote_config/example/android/app/src/main/res/drawable/launch_background.xml b/packages/firebase_remote_config/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/firebase_remote_config/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_remote_config/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_remote_config/example/android/app/src/main/res/values/styles.xml b/packages/firebase_remote_config/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/firebase_remote_config/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/firebase_remote_config/example/android/build.gradle b/packages/firebase_remote_config/example/android/build.gradle deleted file mode 100644 index 359119307d55..000000000000 --- a/packages/firebase_remote_config/example/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_remote_config/example/android/gradle.properties b/packages/firebase_remote_config/example/android/gradle.properties deleted file mode 100644 index 8bd86f680510..000000000000 --- a/packages/firebase_remote_config/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_remote_config/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_remote_config/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f1fd..000000000000 --- a/packages/firebase_remote_config/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#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-4.10.2-all.zip diff --git a/packages/firebase_remote_config/example/android/settings.gradle b/packages/firebase_remote_config/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/firebase_remote_config/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_remote_config/example/firebase_remote_config_example.iml b/packages/firebase_remote_config/example/firebase_remote_config_example.iml deleted file mode 100644 index 4881df8aeff2..000000000000 --- a/packages/firebase_remote_config/example/firebase_remote_config_example.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_remote_config/example/firebase_remote_config_example_android.iml b/packages/firebase_remote_config/example/firebase_remote_config_example_android.iml deleted file mode 100644 index 0ca70ed93eaf..000000000000 --- a/packages/firebase_remote_config/example/firebase_remote_config_example_android.iml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_remote_config/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_remote_config/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6c2de8086bcd..000000000000 --- a/packages/firebase_remote_config/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_remote_config/example/ios/Flutter/Debug.xcconfig b/packages/firebase_remote_config/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114687..000000000000 --- a/packages/firebase_remote_config/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_remote_config/example/ios/Flutter/Release.xcconfig b/packages/firebase_remote_config/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e6f6..000000000000 --- a/packages/firebase_remote_config/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 1d083180dd16..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,493 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D6D2766E14E657030745966 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9305D2E097F7C3459489ECC /* libPods-Runner.a */; }; - 32F83A89202CD0EF00F9ABDD /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 32F83A88202CD0EF00F9ABDD /* GoogleService-Info.plist */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 32F83A88202CD0EF00F9ABDD /* 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 = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - A9305D2E097F7C3459489ECC /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 2D6D2766E14E657030745966 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 23DAF82DF3F4525BB2F90DDE /* Frameworks */ = { - isa = PBXGroup; - children = ( - A9305D2E097F7C3459489ECC /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - DC0A69E1FF6565F85D3F7801 /* Pods */, - 23DAF82DF3F4525BB2F90DDE /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 32F83A88202CD0EF00F9ABDD /* GoogleService-Info.plist */, - 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 = ""; - }; - DC0A69E1FF6565F85D3F7801 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 8F3B99257FEBEE68D8CDFD61 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 5CC7800A6771FA590AF8C939 /* [CP] Embed Pods Frameworks */, - ); - 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 = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 32F83A89202CD0EF00F9ABDD /* GoogleService-Info.plist in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; - }; - 5CC7800A6771FA590AF8C939 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 8F3B99257FEBEE68D8CDFD61 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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; - 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.firebaseRemoteConfigExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebase.firebaseRemoteConfigExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/firebase_remote_config/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_remote_config/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1263ac84b105..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_remote_config/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_remote_config/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c74e..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_remote_config/example/ios/Runner/AppDelegate.h b/packages/firebase_remote_config/example/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_remote_config/example/ios/Runner/AppDelegate.m b/packages/firebase_remote_config/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d22f10b2ab63..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 zcmV-m2cP(fP)x~L`~4d)Rspd&<9kFh{hn*KP1LP0~$;u(LfAu zp%fx&qLBcRHx$G|3q(bv@+b;o0*D|jwD-Q9uQR(l*ST}s+uPgQ-MeFwZ#GS?b332? z&Tk$&_miXn3IGq)AmQ)3sisq{raD4(k*bHvpCe-TdWq^NRTEVM)i9xbgQ&ccnUVx* zEY%vS%gDcSg=!tuIK8$Th2_((_h^+7;R|G{n06&O2#6%LK`a}n?h_fL18btz<@lFG za}xS}u?#DBMB> zw^b($1Z)`9G?eP95EKi&$eOy@K%h;ryrR3la%;>|o*>CgB(s>dDcNOXg}CK9SPmD? zmr-s{0wRmxUnbDrYfRvnZ@d z6johZ2sMX{YkGSKWd}m|@V7`Degt-43=2M?+jR%8{(H$&MLLmS;-|JxnX2pnz;el1jsvqQz}pGSF<`mqEXRQ5sC4#BbwnB_4` zc5bFE-Gb#JV3tox9fp-vVEN{(tOCpRse`S+@)?%pz+zVJXSooTrNCUg`R6`hxwb{) zC@{O6MKY8tfZ5@!yy=p5Y|#+myRL=^{tc(6YgAnkg3I(Cd!r5l;|;l-MQ8B`;*SCE z{u)uP^C$lOPM z5d~UhKhRRmvv{LIa^|oavk1$QiEApSrP@~Jjbg`<*dW4TO?4qG%a%sTPUFz(QtW5( zM)lA+5)0TvH~aBaOAs|}?u2FO;yc-CZ1gNM1dAxJ?%m?YsGR`}-xk2*dxC}r5j$d* zE!#Vtbo69h>V4V`BL%_&$} z+oJAo@jQ^Tk`;%xw-4G>hhb&)B?##U+(6Fi7nno`C<|#PVA%$Y{}N-?(Gc$1%tr4Pc}}hm~yY#fTOe!@v9s-ik$dX~|ygArPhByaXn8 zpI^FUjNWMsTFKTP3X7m?UK)3m zp6rI^_zxRYrx6_QmhoWoDR`fp4R7gu6;gdO)!KexaoO2D88F9x#TM1(9Bn7g;|?|o z)~$n&Lh#hCP6_LOPD>a)NmhW})LADx2kq=X7}7wYRj-0?dXr&bHaRWCfSqvzFa=sn z-8^gSyn-RmH=BZ{AJZ~!8n5621GbUJV7Qvs%JNv&$%Q17s_X%s-41vAPfIR>;x0Wlqr5?09S>x#%Qkt>?(&XjFRY}*L6BeQ3 z<6XEBh^S7>AbwGm@XP{RkeEKj6@_o%oV?hDuUpUJ+r#JZO?!IUc;r0R?>mi)*ZpQ) z#((dn=A#i_&EQn|hd)N$#A*fjBFuiHcYvo?@y1 z5|fV=a^a~d!c-%ZbMNqkMKiSzM{Yq=7_c&1H!mXk60Uv32dV;vMg&-kQ)Q{+PFtwc zj|-uQ;b^gts??J*9VxxOro}W~Q9j4Em|zSRv)(WSO9$F$s=Ydu%Q+5DOid~lwk&we zY%W(Z@ofdwPHncEZzZgmqS|!gTj3wQq9rxQy+^eNYKr1mj&?tm@wkO*9@UtnRMG>c aR{jt9+;fr}hV%pg00001^@s67{VYS000c7NklQEG_j zup^)eW&WUIApqy$=APz8jE@awGp)!bsTjDbrJO`$x^ZR^dr;>)LW>{ zs70vpsD38v)19rI=GNk1b(0?Js9~rjsQsu*K;@SD40RB-3^gKU-MYC7G!Bw{fZsqp zih4iIi;Hr_xZ033Iu{sQxLS=}yBXgLMn40d++>aQ0#%8D1EbGZp7+ z5=mK?t31BkVYbGOxE9`i748x`YgCMwL$qMsChbSGSE1`p{nSmadR zcQ#R)(?!~dmtD0+D2!K zR9%!Xp1oOJzm(vbLvT^$IKp@+W2=-}qTzTgVtQ!#Y7Gxz}stUIm<1;oBQ^Sh2X{F4ibaOOx;5ZGSNK z0maF^@(UtV$=p6DXLgRURwF95C=|U8?osGhgOED*b z7woJ_PWXBD>V-NjQAm{~T%sjyJ{5tn2f{G%?J!KRSrrGvQ1(^`YLA5B!~eycY(e5_ z*%aa{at13SxC(=7JT7$IQF~R3sy`Nn%EMv!$-8ZEAryB*yB1k&stni)=)8-ODo41g zkJu~roIgAih94tb=YsL%iH5@^b~kU9M-=aqgXIrbtxMpFy5mekFm#edF9z7RQ6V}R zBIhbXs~pMzt0VWy1Fi$^fh+1xxLDoK09&5&MJl(q#THjPm(0=z2H2Yfm^a&E)V+a5 zbi>08u;bJsDRUKR9(INSc7XyuWv(JsD+BB*0hS)FO&l&7MdViuur@-<-EHw>kHRGY zqoT}3fDv2-m{NhBG8X}+rgOEZ;amh*DqN?jEfQdqxdj08`Sr=C-KmT)qU1 z+9Cl)a1mgXxhQiHVB}l`m;-RpmKy?0*|yl?FXvJkFxuu!fKlcmz$kN(a}i*saM3nr z0!;a~_%Xqy24IxA2rz<+08=B-Q|2PT)O4;EaxP^6qixOv7-cRh?*T?zZU`{nIM-at zTKYWr9rJ=tppQ9I#Z#mLgINVB!pO-^FOcvFw6NhV0gztuO?g ztoA*C-52Q-Z-P#xB4HAY3KQVd%dz1S4PA3vHp0aa=zAO?FCt zC_GaTyVBg2F!bBr3U@Zy2iJgIAt>1sf$JWA9kh{;L+P*HfUBX1Zy{4MgNbDfBV_ly z!y#+753arsZUt@366jIC0klaC@ckuk!qu=pAyf7&QmiBUT^L1&tOHzsK)4n|pmrVT zs2($4=?s~VejTFHbFdDOwG;_58LkIj1Fh@{glkO#F1>a==ymJS$z;gdedT1zPx4Kj ztjS`y_C}%af-RtpehdQDt3a<=W5C4$)9W@QAse;WUry$WYmr51ml9lkeunUrE`-3e zmq1SgSOPNEE-Mf+AGJ$g0M;3@w!$Ej;hMh=v=I+Lpz^n%Pg^MgwyqOkNyu2c^of)C z1~ALor3}}+RiF*K4+4{(1%1j3pif1>sv0r^mTZ?5Jd-It!tfPfiG_p$AY*Vfak%FG z4z#;wLtw&E&?}w+eKG^=#jF7HQzr8rV0mY<1YAJ_uGz~$E13p?F^fPSzXSn$8UcI$ z8er9{5w5iv0qf8%70zV71T1IBB1N}R5Kp%NO0=5wJalZt8;xYp;b{1K) zHY>2wW-`Sl{=NpR%iu3(u6l&)rc%%cSA#aV7WCowfbFR4wcc{LQZv~o1u_`}EJA3>ki`?9CKYTA!rhO)if*zRdd}Kn zEPfYbhoVE~!FI_2YbC5qAj1kq;xP6%J8+?2PAs?`V3}nyFVD#sV3+uP`pi}{$l9U^ zSz}_M9f7RgnnRhaoIJgT8us!1aB&4!*vYF07Hp&}L zCRlop0oK4DL@ISz{2_BPlezc;xj2|I z23RlDNpi9LgTG_#(w%cMaS)%N`e>~1&a3<{Xy}>?WbF>OOLuO+j&hc^YohQ$4F&ze z+hwnro1puQjnKm;vFG~o>`kCeUIlkA-2tI?WBKCFLMBY=J{hpSsQ=PDtU$=duS_hq zHpymHt^uuV1q@uc4bFb{MdG*|VoW@15Osrqt2@8ll0qO=j*uOXn{M0UJX#SUztui9FN4)K3{9!y8PC-AHHvpVTU;x|-7P+taAtyglk#rjlH2 z5Gq8ik}BPaGiM{#Woyg;*&N9R2{J0V+WGB69cEtH7F?U~Kbi6ksi*`CFXsi931q7Y zGO82?whBhN%w1iDetv%~wM*Y;E^)@Vl?VDj-f*RX>{;o_=$fU!&KAXbuadYZ46Zbg z&6jMF=49$uL^73y;;N5jaHYv)BTyfh&`qVLYn?`o6BCA_z-0niZz=qPG!vonK3MW_ zo$V96zM!+kJRs{P-5-rQVse0VBH*n6A58)4uc&gfHMa{gIhV2fGf{st>E8sKyP-$8zp~wJX^A*@DI&-;8>gANXZj zU)R+Y)PB?=)a|Kj>8NXEu^S_h^7R`~Q&7*Kn!xyvzVv&^>?^iu;S~R2e-2fJx-oUb cX)(b1KSk$MOV07*qoM6N<$f&6$jw%VRuvdN2+38CZWny1cRtlsl+0_KtW)EU14Ei(F!UtWuj4IK+3{sK@>rh zs1Z;=(DD&U6+tlyL?UnHVN^&g6QhFi2#HS+*qz;(>63G(`|jRtW|nz$Pv7qTovP!^ zP_jES{mr@O-02w%!^a?^1ZP!_KmQiz0L~jZ=W@Qt`8wzOoclQsAS<5YdH;a(4bGLE zk8s}1If(PSIgVi!XE!5kA?~z*sobvNyohr;=Q_@h2@$6Flyej3J)D-6YfheRGl`HEcPk|~huT_2-U?PfL=4BPV)f1o!%rQ!NMt_MYw-5bUSwQ9Z&zC>u zOrl~UJglJNa%f50Ok}?WB{on`Ci`p^Y!xBA?m@rcJXLxtrE0FhRF3d*ir>yzO|BD$ z3V}HpFcCh6bTzY}Nt_(W%QYd3NG)jJ4<`F<1Od) zfQblTdC&h2lCz`>y?>|9o2CdvC8qZeIZt%jN;B7Hdn2l*k4M4MFEtq`q_#5?}c$b$pf_3y{Y!cRDafZBEj-*OD|gz#PBDeu3QoueOesLzB+O zxjf2wvf6Wwz>@AiOo2mO4=TkAV+g~%_n&R;)l#!cBxjuoD$aS-`IIJv7cdX%2{WT7 zOm%5rs(wqyPE^k5SIpUZ!&Lq4<~%{*>_Hu$2|~Xa;iX*tz8~G6O3uFOS?+)tWtdi| zV2b#;zRN!m@H&jd=!$7YY6_}|=!IU@=SjvGDFtL;aCtw06U;-v^0%k0FOyESt z1Wv$={b_H&8FiRV?MrzoHWd>%v6KTRU;-v^Miiz+@q`(BoT!+<37CKhoKb)|8!+RG z6BQFU^@fRW;s8!mOf2QViKQGk0TVER6EG1`#;Nm39Do^PoT!+<37AD!%oJe86(=et zZ~|sLzU>V-qYiU6V8$0GmU7_K8|Fd0B?+9Un1BhKAz#V~Fk^`mJtlCX#{^8^M8!me z8Yg;8-~>!e<-iG;h*0B1kBKm}hItVGY6WnjVpgnTTAC$rqQ^v)4KvOtpY|sIj@WYg zyw##ZZ5AC2IKNC;^hwg9BPk0wLStlmBr;E|$5GoAo$&Ui_;S9WY62n3)i49|T%C#i017z3J=$RF|KyZWnci*@lW4 z=AKhNN6+m`Q!V3Ye68|8y@%=am>YD0nG99M)NWc20%)gwO!96j7muR}Fr&54SxKP2 zP30S~lt=a*qDlbu3+Av57=9v&vr<6g0&`!8E2fq>I|EJGKs}t|{h7+KT@)LfIV-3K zK)r_fr2?}FFyn*MYoLC>oV-J~eavL2ho4a4^r{E-8m2hi>~hA?_vIG4a*KT;2eyl1 zh_hUvUJpNCFwBvRq5BI*srSle>c6%n`#VNsyC|MGa{(P&08p=C9+WUw9Hl<1o9T4M zdD=_C0F7#o8A_bRR?sFNmU0R6tW`ElnF8p53IdHo#S9(JoZCz}fHwJ6F<&?qrpVqE zte|m%89JQD+XwaPU#%#lVs-@-OL);|MdfINd6!XwP2h(eyafTUsoRkA%&@fe?9m@jw-v(yTTiV2(*fthQH9}SqmsRPVnwwbV$1E(_lkmo&S zF-truCU914_$jpqjr(>Ha4HkM4YMT>m~NosUu&UZ>zirfHo%N6PPs9^_o$WqPA0#5 z%tG>qFCL+b*0s?sZ;Sht0nE7Kl>OVXy=gjWxxK;OJ3yGd7-pZf7JYNcZo2*1SF`u6 zHJyRRxGw9mDlOiXqVMsNe#WX`fC`vrtjSQ%KmLcl(lC>ZOQzG^%iql2w-f_K@r?OE zwCICifM#L-HJyc7Gm>Ern?+Sk3&|Khmu4(~3qa$(m6Ub^U0E5RHq49za|XklN#?kP zl;EstdW?(_4D>kwjWy2f!LM)y?F94kyU3`W!6+AyId-89v}sXJpuic^NLL7GJItl~ zsiuB98AI-(#Mnm|=A-R6&2fwJ0JVSY#Q>&3$zFh|@;#%0qeF=j5Ajq@4i0tIIW z&}sk$&fGwoJpe&u-JeGLi^r?dO`m=y(QO{@h zQqAC7$rvz&5+mo3IqE?h=a~6m>%r5Quapvzq;{y~p zJpyXOBgD9VrW7@#p6l7O?o3feml(DtSL>D^R) zZUY%T2b0-vBAFN7VB;M88!~HuOXi4KcI6aRQ&h|XQ0A?m%j2=l1f0cGP}h(oVfJ`N zz#PpmFC*ieab)zJK<4?^k=g%OjPnkANzbAbmGZHoVRk*mTfm75s_cWVa`l*f$B@xu z5E*?&@seIo#*Y~1rBm!7sF9~~u6Wrj5oICUOuz}CS)jdNIznfzCA(stJ(7$c^e5wN z?lt>eYgbA!kvAR7zYSD&*r1$b|(@;9dcZ^67R0 zXAXJKa|5Sdmj!g578Nwt6d$sXuc&MWezA0Whd`94$h{{?1IwXP4)Tx4obDK%xoFZ_Z zjjHJ_P@R_e5blG@yEjnaJb`l;s%Lb2&=8$&Ct-fV`E^4CUs)=jTk!I}2d&n!f@)bm z@ z_4Dc86+3l2*p|~;o-Sb~oXb_RuLmoifDU^&Te$*FevycC0*nE3Xws8gsWp|Rj2>SM zns)qcYj?^2sd8?N!_w~4v+f-HCF|a$TNZDoNl$I1Uq87euoNgKb6&r26TNrfkUa@o zfdiFA@p{K&mH3b8i!lcoz)V{n8Q@g(vR4ns4r6w;K z>1~ecQR0-<^J|Ndg5fvVUM9g;lbu-){#ghGw(fg>L zh)T5Ljb%lWE;V9L!;Cqk>AV1(rULYF07ZBJbGb9qbSoLAd;in9{)95YqX$J43-dY7YU*k~vrM25 zxh5_IqO0LYZW%oxQ5HOzmk4x{atE*vipUk}sh88$b2tn?!ujEHn`tQLe&vo}nMb&{ zio`xzZ&GG6&ZyN3jnaQy#iVqXE9VT(3tWY$n-)uWDQ|tc{`?fq2F`oQ{;d3aWPg4Hp-(iE{ry>MIPWL> iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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_remote_config/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/firebase_remote_config/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_remote_config/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_remote_config/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_remote_config/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_remote_config/example/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index ac1700e202bf..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 297855924061-g2np3o504qtqpuip8ud0f884j8kfp9jf.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.297855924061-g2np3o504qtqpuip8ud0f884j8kfp9jf - API_KEY - AIzaSyBq6mcufFXfyqr79uELCiqM_O_1-G72PVU - GCM_SENDER_ID - 297855924061 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebase.firebaseRemoteConfigExample - PROJECT_ID - flutterfire-cd2f7 - STORAGE_BUCKET - flutterfire-cd2f7.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:297855924061:ios:ea6d07263d05c514 - DATABASE_URL - https://flutterfire-cd2f7.firebaseio.com - - \ No newline at end of file diff --git a/packages/firebase_remote_config/example/ios/Runner/Info.plist b/packages/firebase_remote_config/example/ios/Runner/Info.plist deleted file mode 100644 index 60e6abcf802c..000000000000 --- a/packages/firebase_remote_config/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_remote_config_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_remote_config/example/ios/Runner/main.m b/packages/firebase_remote_config/example/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/packages/firebase_remote_config/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_remote_config/example/lib/main.dart b/packages/firebase_remote_config/example/lib/main.dart deleted file mode 100644 index 8db737372086..000000000000 --- a/packages/firebase_remote_config/example/lib/main.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flutter/material.dart'; - -void main() { - runApp(MaterialApp( - title: 'Remote Config Example', - home: FutureBuilder( - future: setupRemoteConfig(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - return snapshot.hasData - ? WelcomeWidget(remoteConfig: snapshot.data) - : Container(); - }, - ))); -} - -class WelcomeWidget extends AnimatedWidget { - WelcomeWidget({this.remoteConfig}) : super(listenable: remoteConfig); - - final RemoteConfig remoteConfig; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Remote Config Example'), - ), - body: Center(child: Text('Welcome ${remoteConfig.getString('welcome')}')), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.refresh), - onPressed: () async { - try { - // Using default duration to force fetching from remote server. - await remoteConfig.fetch(expiration: const Duration(seconds: 0)); - await remoteConfig.activateFetched(); - } on FetchThrottledException catch (exception) { - // Fetch throttled. - print(exception); - } catch (exception) { - print( - 'Unable to fetch remote config. Cached or default values will be ' - 'used'); - } - }), - ); - } -} - -Future setupRemoteConfig() async { - final RemoteConfig remoteConfig = await RemoteConfig.instance; - // Enable developer mode to relax fetch throttling - remoteConfig.setConfigSettings(RemoteConfigSettings(debugMode: true)); - remoteConfig.setDefaults({ - 'welcome': 'default welcome', - 'hello': 'default hello', - }); - return remoteConfig; -} diff --git a/packages/firebase_remote_config/example/pubspec.yaml b/packages/firebase_remote_config/example/pubspec.yaml deleted file mode 100644 index 06c9b5bea711..000000000000 --- a/packages/firebase_remote_config/example/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: firebase_remote_config_example -description: Demonstrates how to use the firebase_remote_config plugin. - -dependencies: - flutter: - sdk: flutter - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.0 - firebase_remote_config: - path: ../ - firebase_core: ^0.4.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any diff --git a/packages/firebase_remote_config/example/test_driver/firebase_remote_config.dart b/packages/firebase_remote_config/example/test_driver/firebase_remote_config.dart deleted file mode 100644 index 2514b2a08a1d..000000000000 --- a/packages/firebase_remote_config/example/test_driver/firebase_remote_config.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'dart:async'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_remote_config/firebase_remote_config.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$RemoteConfig', () { - RemoteConfig remoteConfig; - - setUp(() async { - remoteConfig = await RemoteConfig.instance; - await remoteConfig - .setConfigSettings(RemoteConfigSettings(debugMode: true)); - await remoteConfig.setDefaults({ - 'welcome': 'default welcome', - 'hello': 'default hello', - }); - }); - - test('fetch', () async { - final DateTime lastFetchTime = remoteConfig.lastFetchTime; - expect(lastFetchTime.isBefore(DateTime.now()), true); - await remoteConfig.fetch(expiration: const Duration(seconds: 0)); - expect(remoteConfig.lastFetchStatus, LastFetchStatus.success); - await remoteConfig.activateFetched(); - - expect(remoteConfig.getString('welcome'), 'Earth, welcome! Hello!'); - expect(remoteConfig.getString('hello'), 'default hello'); - expect(remoteConfig.getInt('nonexisting'), 0); - - expect(remoteConfig.getValue('welcome').source, ValueSource.valueRemote); - expect(remoteConfig.getValue('hello').source, ValueSource.valueDefault); - expect( - remoteConfig.getValue('nonexisting').source, - ValueSource.valueStatic, - ); - }); - }); -} diff --git a/packages/firebase_remote_config/example/test_driver/firebase_remote_config_test.dart b/packages/firebase_remote_config/example/test_driver/firebase_remote_config_test.dart deleted file mode 100644 index 38fe6c447e05..000000000000 --- a/packages/firebase_remote_config/example/test_driver/firebase_remote_config_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_remote_config/firebase_remote_config_android.iml b/packages/firebase_remote_config/firebase_remote_config_android.iml deleted file mode 100644 index 0ebb6c9fe763..000000000000 --- a/packages/firebase_remote_config/firebase_remote_config_android.iml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_remote_config/ios/Assets/.gitkeep b/packages/firebase_remote_config/ios/Assets/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h b/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h deleted file mode 100644 index eb3cd9767481..000000000000 --- a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface FirebaseRemoteConfigPlugin : NSObject -@end diff --git a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m b/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m deleted file mode 100644 index 844e11d811b8..000000000000 --- a/packages/firebase_remote_config/ios/Classes/FirebaseRemoteConfigPlugin.m +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseRemoteConfigPlugin.h" -#import "UserAgent.h" - -#import - -@interface FirebaseRemoteConfigPlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FirebaseRemoteConfigPlugin - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_remote_config" - binaryMessenger:[registrar messenger]]; - FirebaseRemoteConfigPlugin *instance = [[FirebaseRemoteConfigPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"RemoteConfig#instance" isEqualToString:call.method]) { - FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig]; - FIRRemoteConfigSettings *firRemoteConfigSettings = [remoteConfig configSettings]; - NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] init]; - - resultDict[@"lastFetchTime"] = [[NSNumber alloc] - initWithLong:(long)[[remoteConfig lastFetchTime] timeIntervalSince1970] * 1000]; - resultDict[@"lastFetchStatus"] = - [self mapLastFetchStatus:(FIRRemoteConfigFetchStatus)[remoteConfig lastFetchStatus]]; - resultDict[@"inDebugMode"] = - [[NSNumber alloc] initWithBool:[firRemoteConfigSettings isDeveloperModeEnabled]]; - - resultDict[@"parameters"] = [self getConfigParameters]; - - result(resultDict); - } else if ([@"RemoteConfig#setConfigSettings" isEqualToString:call.method]) { - FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig]; - bool debugMode = (bool)call.arguments[@"debugMode"]; - FIRRemoteConfigSettings *remoteConfigSettings = - [[FIRRemoteConfigSettings alloc] initWithDeveloperModeEnabled:debugMode]; - [remoteConfig setConfigSettings:remoteConfigSettings]; - result(nil); - } else if ([@"RemoteConfig#fetch" isEqualToString:call.method]) { - FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig]; - long expiration = (long)call.arguments[@"expiration"]; - - [remoteConfig - fetchWithExpirationDuration:expiration - completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) { - NSNumber *lastFetchTime = [[NSNumber alloc] - initWithLong:(long)[[remoteConfig lastFetchTime] timeIntervalSince1970] * - 1000]; - NSString *lastFetchStatus = - [self mapLastFetchStatus:(FIRRemoteConfigFetchStatus)[remoteConfig - lastFetchStatus]]; - NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] init]; - resultDict[@"lastFetchTime"] = lastFetchTime; - resultDict[@"lastFetchStatus"] = lastFetchStatus; - - if (status != FIRRemoteConfigFetchStatusSuccess) { - FlutterError *flutterError; - if (status == FIRRemoteConfigFetchStatusThrottled) { - int mills = - [[error.userInfo - valueForKey:FIRRemoteConfigThrottledEndTimeInSecondsKey] intValue] * - 1000; - resultDict[@"fetchThrottledEnd"] = [[NSNumber alloc] initWithInt:mills]; - NSString *errorMessage = - @"Fetch has been throttled. See the error's fetchThrottledEnd " - "field for throttle end time."; - flutterError = [FlutterError errorWithCode:@"fetchFailedThrottled" - message:errorMessage - details:resultDict]; - } else { - NSString *errorMessage = @"Unable to complete fetch. Reason is unknown " - "but this could be due to lack of connectivity."; - flutterError = [FlutterError errorWithCode:@"fetchFailed" - message:errorMessage - details:resultDict]; - } - result(flutterError); - } else { - result(resultDict); - } - }]; - } else if ([@"RemoteConfig#activate" isEqualToString:call.method]) { - BOOL newConfig = [[FIRRemoteConfig remoteConfig] activateFetched]; - NSDictionary *parameters = [self getConfigParameters]; - NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] init]; - resultDict[@"newConfig"] = [NSNumber numberWithBool:newConfig]; - resultDict[@"parameters"] = parameters; - result(resultDict); - } else if ([@"RemoteConfig#setDefaults" isEqualToString:call.method]) { - FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig]; - NSDictionary *defaults = call.arguments[@"defaults"]; - [remoteConfig setDefaults:defaults]; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -- (NSMutableDictionary *)createRemoteConfigValueDict:(FIRRemoteConfigValue *)remoteConfigValue { - NSMutableDictionary *valueDict = [[NSMutableDictionary alloc] init]; - valueDict[@"value"] = [FlutterStandardTypedData typedDataWithBytes:[remoteConfigValue dataValue]]; - valueDict[@"source"] = [self mapValueSource:[remoteConfigValue source]]; - return valueDict; -} - -- (NSDictionary *)getConfigParameters { - FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig]; - NSMutableDictionary *parameterDict = [[NSMutableDictionary alloc] init]; - NSSet *keySet = [remoteConfig keysWithPrefix:@""]; - for (NSString *key in keySet) { - parameterDict[key] = [self createRemoteConfigValueDict:[remoteConfig configValueForKey:key]]; - } - // Add default parameters if missing since `keysWithPrefix` does not return default keys. - NSArray *defaultKeys = [remoteConfig allKeysFromSource:FIRRemoteConfigSourceDefault - namespace:FIRNamespaceGoogleMobilePlatform]; - for (NSString *key in defaultKeys) { - if ([parameterDict valueForKey:key] == nil) { - parameterDict[key] = [self createRemoteConfigValueDict:[remoteConfig configValueForKey:key]]; - } - } - return parameterDict; -} - -- (NSString *)mapLastFetchStatus:(FIRRemoteConfigFetchStatus)status { - if (status == FIRRemoteConfigFetchStatusSuccess) { - return @"success"; - } else if (status == FIRRemoteConfigFetchStatusFailure) { - return @"failure"; - } else if (status == FIRRemoteConfigFetchStatusThrottled) { - return @"throttled"; - } else if (status == FIRRemoteConfigFetchStatusNoFetchYet) { - return @"noFetchYet"; - } else { - return @"failure"; - } -} - -- (NSString *)mapValueSource:(FIRRemoteConfigSource)source { - if (source == FIRRemoteConfigSourceStatic) { - return @"static"; - } else if (source == FIRRemoteConfigSourceDefault) { - return @"default"; - } else if (source == FIRRemoteConfigSourceRemote) { - return @"remote"; - } else { - return @"static"; - } -} - -@end diff --git a/packages/firebase_remote_config/ios/firebase_remote_config.podspec b/packages/firebase_remote_config/ios/firebase_remote_config.podspec deleted file mode 100644 index 3e9a83bd0826..000000000000 --- a/packages/firebase_remote_config/ios/firebase_remote_config.podspec +++ /dev/null @@ -1,33 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_remote_config' - s.version = '0.0.1' - s.summary = 'Firebase Remote Config plugin for Flutter' - s.description = <<-DESC -Firebase Remote Config plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_remote_config' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/RemoteConfig' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-rc\\"" >> Classes/UserAgent.h - CMD -end - diff --git a/packages/firebase_remote_config/lib/firebase_remote_config.dart b/packages/firebase_remote_config/lib/firebase_remote_config.dart deleted file mode 100644 index 641e6efbe102..000000000000 --- a/packages/firebase_remote_config/lib/firebase_remote_config.dart +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library firebase_remote_config; - -import 'dart:async'; -import 'dart:convert'; - -import 'package:flutter/services.dart'; -import 'package:flutter/foundation.dart'; - -part 'src/remote_config.dart'; -part 'src/remote_config_settings.dart'; -part 'src/remote_config_value.dart'; -part 'src/remote_config_fetch_throttled_exception.dart'; -part 'src/remote_config_last_fetch_status.dart'; diff --git a/packages/firebase_remote_config/lib/src/remote_config.dart b/packages/firebase_remote_config/lib/src/remote_config.dart deleted file mode 100644 index ea8362eac265..000000000000 --- a/packages/firebase_remote_config/lib/src/remote_config.dart +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_remote_config; - -/// The entry point for accessing Remote Config. -/// -/// You can get an instance by calling [RemoteConfig.instance]. Note -/// [RemoteConfig.instance] is async. -class RemoteConfig extends ChangeNotifier { - @visibleForTesting - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_remote_config'); - - static const String defaultValueForString = ''; - static const int defaultValueForInt = 0; - static const double defaultValueForDouble = 0.0; - static const bool defaultValueForBool = false; - - Map _parameters; - - DateTime _lastFetchTime; - LastFetchStatus _lastFetchStatus; - RemoteConfigSettings _remoteConfigSettings; - - DateTime get lastFetchTime => _lastFetchTime; - LastFetchStatus get lastFetchStatus => _lastFetchStatus; - RemoteConfigSettings get remoteConfigSettings => _remoteConfigSettings; - - static Completer _instanceCompleter = Completer(); - - /// Gets the instance of RemoteConfig for the default Firebase app. - static Future get instance async { - if (!_instanceCompleter.isCompleted) { - _getRemoteConfigInstance(); - } - return _instanceCompleter.future; - } - - static void _getRemoteConfigInstance() async { - final Map properties = - await channel.invokeMapMethod('RemoteConfig#instance'); - - final RemoteConfig instance = RemoteConfig(); - - instance._lastFetchTime = - DateTime.fromMillisecondsSinceEpoch(properties['lastFetchTime']); - instance._lastFetchStatus = - _parseLastFetchStatus(properties['lastFetchStatus']); - final RemoteConfigSettings remoteConfigSettings = - RemoteConfigSettings(debugMode: properties['inDebugMode']); - instance._remoteConfigSettings = remoteConfigSettings; - instance._parameters = - _parseRemoteConfigParameters(parameters: properties['parameters']); - _instanceCompleter.complete(instance); - } - - static Map _parseRemoteConfigParameters( - {Map parameters}) { - final Map parsedParameters = - {}; - parameters.forEach((dynamic key, dynamic value) { - final ValueSource valueSource = _parseValueSource(value['source']); - final RemoteConfigValue remoteConfigValue = - RemoteConfigValue._(value['value']?.cast(), valueSource); - parsedParameters[key] = remoteConfigValue; - }); - return parsedParameters; - } - - static ValueSource _parseValueSource(String sourceStr) { - switch (sourceStr) { - case 'static': - return ValueSource.valueStatic; - case 'default': - return ValueSource.valueDefault; - case 'remote': - return ValueSource.valueRemote; - default: - return null; - } - } - - static LastFetchStatus _parseLastFetchStatus(String statusStr) { - switch (statusStr) { - case 'success': - return LastFetchStatus.success; - case 'failure': - return LastFetchStatus.failure; - case 'throttled': - return LastFetchStatus.throttled; - case 'noFetchYet': - return LastFetchStatus.noFetchYet; - default: - return LastFetchStatus.failure; - } - } - - /// Set the configuration settings for this [RemoteConfig] instance. - /// - /// This can be used for enabling developer mode. - Future setConfigSettings( - RemoteConfigSettings remoteConfigSettings) async { - await channel - .invokeMethod('RemoteConfig#setConfigSettings', { - 'debugMode': remoteConfigSettings.debugMode, - }); - _remoteConfigSettings = remoteConfigSettings; - } - - /// Fetches parameter values for your app. - /// - /// Parameter values may be from Default Config (local cache) or Remote - /// Config if enough time has elapsed since parameter values were last - /// fetched from the server. The default expiration time is 12 hours. - /// Expiration must be defined in seconds. - Future fetch({Duration expiration = const Duration(hours: 12)}) async { - try { - final Map properties = await channel - .invokeMapMethod('RemoteConfig#fetch', - {'expiration': expiration.inSeconds}); - _lastFetchTime = - DateTime.fromMillisecondsSinceEpoch(properties['lastFetchTime']); - _lastFetchStatus = _parseLastFetchStatus(properties['lastFetchStatus']); - } on PlatformException catch (e) { - _lastFetchTime = - DateTime.fromMillisecondsSinceEpoch(e.details['lastFetchTime']); - _lastFetchStatus = _parseLastFetchStatus(e.details['lastFetchStatus']); - if (e.code == 'fetchFailedThrottled') { - final int fetchThrottleEnd = e.details['fetchThrottledEnd']; - throw FetchThrottledException._(endTimeInMills: fetchThrottleEnd); - } else { - throw Exception('Unable to fetch remote config'); - } - } - } - - /// Activates the fetched config, makes fetched key-values take effect. - /// - /// The returned Future completes true if the fetched config is different - /// from the currently activated config, it contains false otherwise. - Future activateFetched() async { - final Map properties = - await channel.invokeMapMethod('RemoteConfig#activate'); - final Map rawParameters = properties['parameters']; - final bool newConfig = properties['newConfig']; - final Map fetchedParameters = - _parseRemoteConfigParameters(parameters: rawParameters); - _parameters = fetchedParameters; - notifyListeners(); - return newConfig; - } - - /// Sets the default config. - /// - /// Default config parameters should be set then when changes are needed the - /// parameters should be updated in the Firebase console. - Future setDefaults(Map defaults) async { - assert(defaults != null); - // Make defaults available even if fetch fails. - defaults.forEach((String key, dynamic value) { - if (!_parameters.containsKey(key)) { - final RemoteConfigValue remoteConfigValue = RemoteConfigValue._( - const Utf8Codec().encode(value.toString()), - ValueSource.valueDefault, - ); - _parameters[key] = remoteConfigValue; - } - }); - await channel.invokeMethod( - 'RemoteConfig#setDefaults', {'defaults': defaults}); - } - - /// Gets the value corresponding to the [key] as a String. - /// - /// If there is no parameter with corresponding [key] then the default - /// String value is returned. - String getString(String key) { - if (_parameters.containsKey(key)) { - return _parameters[key].asString(); - } else { - return defaultValueForString; - } - } - - /// Gets the value corresponding to the [key] as an int. - /// - /// If there is no parameter with corresponding [key] then the default - /// int value is returned. - int getInt(String key) { - if (_parameters.containsKey(key)) { - return _parameters[key].asInt(); - } else { - return defaultValueForInt; - } - } - - /// Gets the value corresponding to the [key] as a double. - /// - /// If there is no parameter with corresponding [key] then the default double - /// value is returned. - double getDouble(String key) { - if (_parameters.containsKey(key)) { - return _parameters[key].asDouble(); - } else { - return defaultValueForDouble; - } - } - - /// Gets the value corresponding to the [key] as a bool. - /// - /// If there is no parameter with corresponding [key] then the default bool - /// value is returned. - bool getBool(String key) { - if (_parameters.containsKey(key)) { - return _parameters[key].asBool(); - } else { - return defaultValueForBool; - } - } - - /// Gets the [RemoteConfigValue] corresponding to the [key]. - /// - /// If there is no parameter with corresponding key then a [RemoteConfigValue] - /// with a null value and static source is returned. - RemoteConfigValue getValue(String key) { - if (_parameters.containsKey(key)) { - return _parameters[key]; - } else { - return RemoteConfigValue._(null, ValueSource.valueStatic); - } - } - - /// Gets all [RemoteConfigValue]. - /// - /// This includes all remote and default values - Map getAll() { - return Map.unmodifiable(_parameters); - } -} diff --git a/packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart b/packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart deleted file mode 100644 index 7e8f28cd1eba..000000000000 --- a/packages/firebase_remote_config/lib/src/remote_config_fetch_throttled_exception.dart +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_remote_config; - -/// Exception thrown when the fetch() operation cannot be completed successfully, due to throttling. -class FetchThrottledException implements Exception { - FetchThrottledException._({int endTimeInMills}) { - _throttleEnd = DateTime.fromMillisecondsSinceEpoch(endTimeInMills); - } - - DateTime _throttleEnd; - - DateTime get throttleEnd => _throttleEnd; - - @override - String toString() { - final Duration duration = _throttleEnd.difference(DateTime.now()); - return '''FetchThrottledException -Fetching throttled, try again in ${duration.inMilliseconds} milliseconds'''; - } -} diff --git a/packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart b/packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart deleted file mode 100644 index ad82f9a3d876..000000000000 --- a/packages/firebase_remote_config/lib/src/remote_config_last_fetch_status.dart +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_remote_config; - -/// LastFetchStatus defines the possible status values of the last fetch. -enum LastFetchStatus { success, failure, throttled, noFetchYet } diff --git a/packages/firebase_remote_config/lib/src/remote_config_settings.dart b/packages/firebase_remote_config/lib/src/remote_config_settings.dart deleted file mode 100644 index 38ace7611ddb..000000000000 --- a/packages/firebase_remote_config/lib/src/remote_config_settings.dart +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_remote_config; - -/// RemoteConfigSettings can be used to configure how Remote Config operates. -class RemoteConfigSettings { - RemoteConfigSettings({this.debugMode = false}); - - /// Enable or disable developer mode for Remote Config. - /// - /// When set to true developer mode is enabled, when set to false developer - /// mode is disabled. When developer mode is enabled fetch throttling is - /// relaxed to allow many more fetch calls per hour to the remote server than - /// the 5 per hour that is enforced when developer mode is disabled. - final bool debugMode; -} diff --git a/packages/firebase_remote_config/lib/src/remote_config_value.dart b/packages/firebase_remote_config/lib/src/remote_config_value.dart deleted file mode 100644 index ddf93a5df189..000000000000 --- a/packages/firebase_remote_config/lib/src/remote_config_value.dart +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_remote_config; - -/// ValueSource defines the possible sources of a config parameter value. -enum ValueSource { valueStatic, valueDefault, valueRemote } - -/// RemoteConfigValue encapsulates the value and source of a Remote Config -/// parameter. -class RemoteConfigValue { - RemoteConfigValue._(this._value, this.source) : assert(source != null); - - List _value; - - /// Indicates at which source this value came from. - final ValueSource source; - - /// Decode value to string. - String asString() { - return _value != null - ? const Utf8Codec().decode(_value) - : RemoteConfig.defaultValueForString; - } - - /// Decode value to int. - int asInt() { - if (_value != null) { - final String strValue = const Utf8Codec().decode(_value); - final int intValue = - int.tryParse(strValue) ?? RemoteConfig.defaultValueForInt; - return intValue; - } else { - return RemoteConfig.defaultValueForInt; - } - } - - /// Decode value to double. - double asDouble() { - if (_value != null) { - final String strValue = const Utf8Codec().decode(_value); - final double doubleValue = - double.tryParse(strValue) ?? RemoteConfig.defaultValueForDouble; - return doubleValue; - } else { - return RemoteConfig.defaultValueForDouble; - } - } - - /// Decode value to bool. - bool asBool() { - if (_value != null) { - final String strValue = const Utf8Codec().decode(_value); - return strValue.toLowerCase() == 'true'; - } else { - return RemoteConfig.defaultValueForBool; - } - } -} diff --git a/packages/firebase_remote_config/pubspec.yaml b/packages/firebase_remote_config/pubspec.yaml deleted file mode 100644 index 5875219ecc3d..000000000000 --- a/packages/firebase_remote_config/pubspec.yaml +++ /dev/null @@ -1,27 +0,0 @@ -name: firebase_remote_config -description: Flutter plugin for Firebase Remote Config. Update your application look and feel and behaviour without - re-releasing. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_remote_config -version: 0.2.0+5 - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - firebase_core: ^0.4.0 - flutter_driver: - sdk: flutter - test: any - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.firebaseremoteconfig - pluginClass: FirebaseRemoteConfigPlugin - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_remote_config/test/firebase_remote_config_test.dart b/packages/firebase_remote_config/test/firebase_remote_config_test.dart deleted file mode 100644 index b86f067a6c1a..000000000000 --- a/packages/firebase_remote_config/test/firebase_remote_config_test.dart +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - final int lastFetchTime = 1520618753782; - Map getDefaultInstance() { - return { - 'lastFetchTime': lastFetchTime, - 'lastFetchStatus': 'success', - 'inDebugMode': true, - 'parameters': { - 'param1': { - 'source': 'static', - 'value': [118, 97, 108, 49], // UTF-8 encoded 'val1' - }, - }, - }; - } - - group('$RemoteConfig', () { - final List log = []; - - setUp(() async { - RemoteConfig.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'RemoteConfig#instance': - return getDefaultInstance(); - default: - return true; - } - }); - }); - - test('instance', () async { - final RemoteConfig remoteConfig = await RemoteConfig.instance; - expect( - log, - [ - isMethodCall('RemoteConfig#instance', arguments: null), - ], - ); - expect(remoteConfig.remoteConfigSettings.debugMode, true); - expect(remoteConfig.lastFetchTime, - DateTime.fromMillisecondsSinceEpoch(lastFetchTime)); - expect(remoteConfig.lastFetchStatus, LastFetchStatus.values[0]); - }); - - test('doubleInstance', () async { - final List> futures = >[ - RemoteConfig.instance, - RemoteConfig.instance, - ]; - Future.wait(futures).then((List remoteConfigs) { - // Check that both returned Remote Config instances are the same. - expect(remoteConfigs[0], remoteConfigs[1]); - }); - }); - }); - - group('$RemoteConfig', () { - final List log = []; - - final int lastFetchTime = 1520618753782; - RemoteConfig remoteConfig; - - setUp(() async { - RemoteConfig.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'RemoteConfig#setDefaults': - return null; - case 'RemoteConfig#fetch': - return { - 'lastFetchTime': lastFetchTime, - 'lastFetchStatus': 'success', - }; - case 'RemoteConfig#instance': - return getDefaultInstance(); - case 'RemoteConfig#activate': - return { - 'parameters': { - 'param1': { - 'source': 'remote', - 'value': [118, 97, 108, 49], // UTF-8 encoded 'val1' - }, - 'param2': { - 'source': 'remote', - 'value': [49, 50, 51, 52, 53], // UTF-8 encoded '12345' - }, - 'param3': { - 'source': 'default', - 'value': [51, 46, 49, 52], // UTF-8 encoded '3.14' - }, - 'param4': { - 'source': 'remote', - 'value': [116, 114, 117, 101], // UTF-8 encoded 'true' - }, - 'param5': { - 'source': 'default', - 'value': [ - 102, - 97, - 108, - 115, - 101 - ], // UTF-8 encoded 'false' - }, - 'param6': {'source': 'default', 'value': null} - }, - 'newConfig': true, - }; - case 'RemoteConfig#setConfigSettings': - return null; - default: - return true; - } - }); - remoteConfig = await RemoteConfig.instance; - log.clear(); - }); - - test('setDefaults', () async { - await remoteConfig.setDefaults({ - 'foo': 'bar', - }); - expect(log, [ - isMethodCall( - 'RemoteConfig#setDefaults', - arguments: { - 'defaults': { - 'foo': 'bar', - }, - }, - ), - ]); - }); - - test('fetch', () async { - await remoteConfig.fetch(expiration: const Duration(hours: 1)); - expect( - log, - [ - isMethodCall( - 'RemoteConfig#fetch', - arguments: { - 'expiration': 3600, - }, - ), - ], - ); - }); - - test('activate', () async { - final bool newConfig = await remoteConfig.activateFetched(); - expect( - log, - [ - isMethodCall( - 'RemoteConfig#activate', - arguments: null, - ), - ], - ); - expect(newConfig, true); - expect(remoteConfig.getString('param1'), 'val1'); - expect(remoteConfig.getInt('param2'), 12345); - expect(remoteConfig.getDouble('param3'), 3.14); - expect(remoteConfig.getBool('param4'), true); - expect(remoteConfig.getBool('param5'), false); - expect(remoteConfig.getInt('param6'), 0); - - remoteConfig.getAll().forEach((String key, RemoteConfigValue value) { - switch (key) { - case 'param1': - expect(value.asString(), 'val1'); - break; - case 'param2': - expect(value.asInt(), 12345); - break; - case 'param3': - expect(value.asDouble(), 3.14); - break; - case 'param4': - expect(value.asBool(), true); - break; - case 'param5': - expect(value.asBool(), false); - break; - case 'param6': - expect(value.asInt(), 0); - break; - default: - } - }); - - final Map resultAllSources = remoteConfig - .getAll() - .map((String key, RemoteConfigValue value) => - MapEntry(key, value.source)); - expect(resultAllSources, { - 'param1': ValueSource.valueRemote, - 'param2': ValueSource.valueRemote, - 'param3': ValueSource.valueDefault, - 'param4': ValueSource.valueRemote, - 'param5': ValueSource.valueDefault, - 'param6': ValueSource.valueDefault, - }); - }); - - test('setConfigSettings', () async { - expect(remoteConfig.remoteConfigSettings.debugMode, true); - final RemoteConfigSettings remoteConfigSettings = - RemoteConfigSettings(debugMode: false); - await remoteConfig.setConfigSettings(remoteConfigSettings); - expect( - log, - [ - isMethodCall( - 'RemoteConfig#setConfigSettings', - arguments: { - 'debugMode': false, - }, - ), - ], - ); - expect(remoteConfig.remoteConfigSettings.debugMode, false); - }); - }); -} diff --git a/packages/firebase_storage/.gitignore b/packages/firebase_storage/.gitignore deleted file mode 100644 index 46385dab97b6..000000000000 --- a/packages/firebase_storage/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ios/Classes/UserAgent.h diff --git a/packages/firebase_storage/CHANGELOG.md b/packages/firebase_storage/CHANGELOG.md deleted file mode 100644 index 86b8003b2fea..000000000000 --- a/packages/firebase_storage/CHANGELOG.md +++ /dev/null @@ -1,244 +0,0 @@ -## 3.0.5 -* Removed automatic print statements for `StorageTaskEvent`'s. - If you want to see the event status in your logs now, you will have to use the following: - `storageReference.put{File/Data}(..).events.listen((event) => print('EVENT ${event.type}'));` -* Updated `README.md` to explain the above. - -## 3.0.4 - -* Update google-services Android gradle plugin to 4.3.0 in documentation and examples. - -## 3.0.3 - -* Fix inconsistency of `getPath`, on Android the path returned started with a `/` but on iOS it did not -* Fix content-type auto-detection on Android - -## 3.0.2 - -* Automatically use version from pubspec.yaml when reporting usage to Firebase. - -## 3.0.1 - -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. -* Replace invokeMethod with invokeMapMethod wherever necessary. - -## 3.0.0 - -* Update Android dependencies to latest. - -## 2.1.1+2 - -* On iOS, use `putFile` instead of `putData` appropriately to detect `Content-Type`. - -## 2.1.1+1 - -* On iOS, gracefully handle the case of uploading a nonexistent file without crashing. - -## 2.1.1 - -* Added integration tests. - -## 2.1.0+1 - -* Reverting error.code casting/formatting to what it was until version 2.0.1. - -## 2.1.0 - -* Added support for getReferenceFromUrl. - -## 2.0.1+2 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 2.0.1+1 - -* Remove categories. - -## 2.0.1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 2.0.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - - This was originally incorrectly pushed in the `1.1.0` update. - -## 1.1.0+1 - -* **Revert the breaking 1.1.0 update**. 1.1.0 was known to be breaking and - should have incremented the major version number instead of the minor. This - revert is in and of itself breaking for anyone that has already migrated - however. Anyone who has already migrated their app to AndroidX should - immediately update to `2.0.0` instead. That's the correctly versioned new push - of `1.1.0`. - -## 1.1.0 - -* **BAD**. This was a breaking change that was incorrectly published on a minor - version upgrade, should never have happened. Reverted by 1.1.0+1. - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 1.0.4 - -* Bump Android dependencies to latest. - -## 1.0.3 - -* Added monitoring of StorageUploadTask via `events` stream. -* Added support for StorageUploadTask functions: `pause`, `resume`, `cancel`. -* Set http version to be compatible with flutter_test. - -## 1.0.2 - -* Added missing http package dependency. - -## 1.0.1 - -* Bump Android and Firebase dependency versions. - -## 1.0.0 - -* **Breaking change**. Make StorageUploadTask implementation classes private. -* Bump to released version - -## 0.3.7 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.3.6 - -* Added support for custom metadata. - -## 0.3.5 - -* Updated iOS implementation to reflect Firebase API changes. - -## 0.3.4 - -* Added timeout properties to FirebaseStorage. - -## 0.3.3 - -* Added support for initialization with a custom Firebase app. - -## 0.3.2 - -* Added support for StorageReference `writeToFile`. - -## 0.3.1 - -* Added support for StorageReference functions: `getParent`, `getRoot`, `getStorage`, `getName`, `getPath`, `getBucket`. - -## 0.3.0 - -* **Breaking change**. Changed StorageUploadTask to abstract, removed the 'file' field, and made 'path' and 'metadata' - private. Added two subclasses: StorageFileUploadTask and StorageDataUploadTask. -* Deprecated the `put` function and added `putFile` and `putData` to upload files and bytes respectively. - -## 0.2.6 - -* Added support for updateMetadata. - -## 0.2.5 - -* Added StorageMetadata class, support for getMetadata, and support for uploading file with metadata. - -## 0.2.4 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.2.3 - -* Updated package channel name and made channel visible for testing - -## 0.2.2 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.2.1 - -* Added support for getDownloadUrl. - -## 0.2.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.1.5 - -* Fix Dart 2 type errors. - -## 0.1.4 - -* Enabled use in Swift projects. - -## 0.1.3 - -* Added StorageReference `path` getter to retrieve the path component for the storage node. - -## 0.1.2 - -* Added StorageReference delete function to remove files from Firebase. - -## 0.1.1 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.1.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.0.8 - -* Added FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.0.7 - -* Change GMS dependency to 11.+ - -## 0.0.6 - -* Added StorageReference getData function to download files into memory. - -## 0.0.5+1 - -* Aligned author name with rest of repo. - -## 0.0.5 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds -* Fix crash when encountering upload failure - -## 0.0.4 - -* Updated to Firebase SDK Version 11.0.1 - -## 0.0.3 - -* Suppress unchecked warnings - -## 0.0.2 - -* Bumped buildToolsVersion to 25.0.3 -* Updated README - -## 0.0.1 - -* Initial Release diff --git a/packages/firebase_storage/LICENSE b/packages/firebase_storage/LICENSE deleted file mode 100755 index 000b4618d2bd..000000000000 --- a/packages/firebase_storage/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 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_storage/README.md b/packages/firebase_storage/README.md deleted file mode 100755 index 70aea955cd52..000000000000 --- a/packages/firebase_storage/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Firebase Cloud Storage for Flutter - -[![pub package](https://img.shields.io/pub/v/firebase_storage.svg)](https://pub.dartlang.org/packages/firebase_storage) - -A Flutter plugin to use the [Firebase Cloud Storage API](https://firebase.google.com/products/storage/). - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -To use this plugin, add `firebase_storage` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -### Logging - -If you wish to see status events for your upload tasks in your logs, you should listen to the `StorageUploadTask.events` stream. -This could look like the following if you are using `StorageReference.putData`: - -```dart -final StorageReference storageReference = FirebaseStorage().ref().child(path); - -final StorageUploadTask uploadTask = storageReference.putData(data); - -final StreamSubscription streamSubscription = uploadTask.events.listen((event) { - // You can use this to notify yourself or your user in any kind of way. - // For example: you could use the uploadTask.events stream in a StreamBuilder instead - // to show your user what the current status is. In that case, you would not need to cancel any - // subscription as StreamBuilder handles this automatically. - - // Here, every StorageTaskEvent concerning the upload is printed to the logs. - print('EVENT ${event.type}'); -}); - -// Cancel your subscription when done. -await uploadTask.onComplete; -streamSubscription.cancel(); -``` - -## Getting Started - -See the `example` directory for a complete sample app using Firebase Cloud Storage. diff --git a/packages/firebase_storage/android/build.gradle b/packages/firebase_storage/android/build.gradle deleted file mode 100755 index 63ff9a1c681a..000000000000 --- a/packages/firebase_storage/android/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -def PLUGIN = "firebase_storage"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebase.storage' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -allprojects { - gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - } - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-storage:17.0.0' - implementation 'com.google.firebase:firebase-common:16.1.0' - implementation 'androidx.annotation:annotation:1.0.0' - } -} - -apply from: file("./user-agent.gradle") diff --git a/packages/firebase_storage/android/gradle.properties b/packages/firebase_storage/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_storage/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_storage/android/settings.gradle b/packages/firebase_storage/android/settings.gradle deleted file mode 100755 index f0aec4453e6d..000000000000 --- a/packages/firebase_storage/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_storage' diff --git a/packages/firebase_storage/android/src/main/AndroidManifest.xml b/packages/firebase_storage/android/src/main/AndroidManifest.xml deleted file mode 100755 index 0e72a41f0472..000000000000 --- a/packages/firebase_storage/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java deleted file mode 100755 index 406956da7608..000000000000 --- a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java +++ /dev/null @@ -1,510 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.storage; - -import android.net.Uri; -import android.util.SparseArray; -import android.webkit.MimeTypeMap; -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApp; -import com.google.firebase.storage.FileDownloadTask; -import com.google.firebase.storage.FirebaseStorage; -import com.google.firebase.storage.OnPausedListener; -import com.google.firebase.storage.OnProgressListener; -import com.google.firebase.storage.StorageException; -import com.google.firebase.storage.StorageMetadata; -import com.google.firebase.storage.StorageReference; -import com.google.firebase.storage.UploadTask; -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.plugin.common.PluginRegistry.Registrar; -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** FirebaseStoragePlugin */ -public class FirebaseStoragePlugin implements MethodCallHandler { - private FirebaseStorage firebaseStorage; - private final MethodChannel channel; - - private int nextUploadHandle = 0; - private final SparseArray uploadTasks = new SparseArray<>(); - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_storage"); - channel.setMethodCallHandler(new FirebaseStoragePlugin(channel, registrar)); - } - - private FirebaseStoragePlugin(MethodChannel channel, Registrar registrar) { - this.channel = channel; - FirebaseApp.initializeApp(registrar.context()); - } - - @Override - public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { - String app = call.argument("app"); - String storageBucket = call.argument("bucket"); - if (app == null && storageBucket == null) { - firebaseStorage = FirebaseStorage.getInstance(); - } else if (storageBucket == null) { - firebaseStorage = FirebaseStorage.getInstance(FirebaseApp.getInstance(app)); - } else if (app == null) { - firebaseStorage = FirebaseStorage.getInstance(storageBucket); - } else { - firebaseStorage = FirebaseStorage.getInstance(FirebaseApp.getInstance(app), storageBucket); - } - - switch (call.method) { - case "FirebaseStorage#getMaxDownloadRetryTime": - result.success(firebaseStorage.getMaxDownloadRetryTimeMillis()); - break; - case "FirebaseStorage#getMaxUploadRetryTime": - result.success(firebaseStorage.getMaxUploadRetryTimeMillis()); - break; - case "FirebaseStorage#getMaxOperationRetryTime": - result.success(firebaseStorage.getMaxOperationRetryTimeMillis()); - break; - case "FirebaseStorage#setMaxDownloadRetryTime": - setMaxDownloadRetryTimeMillis(call, result); - break; - case "FirebaseStorage#setMaxUploadRetryTime": - setMaxUploadRetryTimeMillis(call, result); - break; - case "FirebaseStorage#setMaxOperationRetryTime": - setMaxOperationTimeMillis(call, result); - break; - case "FirebaseStorage#getReferenceFromUrl": - getReferenceFromUrl(call, result); - break; - case "StorageReference#putFile": - putFile(call, result); - break; - case "StorageReference#putData": - putData(call, result); - break; - case "StorageReference#getData": - getData(call, result); - break; - case "StorageReference#delete": - delete(call, result); - break; - case "StorageReference#getBucket": - getBucket(call, result); - break; - case "StorageReference#getName": - getName(call, result); - break; - case "StorageReference#getPath": - getPath(call, result); - break; - case "StorageReference#getDownloadUrl": - getDownloadUrl(call, result); - break; - case "StorageReference#getMetadata": - getMetadata(call, result); - break; - case "StorageReference#updateMetadata": - updateMetadata(call, result); - break; - case "StorageReference#writeToFile": - writeToFile(call, result); - break; - case "UploadTask#pause": - pauseUploadTask(call, result); - break; - case "UploadTask#resume": - resumeUploadTask(call, result); - break; - case "UploadTask#cancel": - cancelUploadTask(call, result); - break; - default: - result.notImplemented(); - break; - } - } - - private void setMaxDownloadRetryTimeMillis(MethodCall call, Result result) { - Number time = call.argument("time"); - firebaseStorage.setMaxDownloadRetryTimeMillis(time.longValue()); - result.success(null); - } - - private void setMaxUploadRetryTimeMillis(MethodCall call, Result result) { - Number time = call.argument("time"); - firebaseStorage.setMaxUploadRetryTimeMillis(time.longValue()); - result.success(null); - } - - private void setMaxOperationTimeMillis(MethodCall call, Result result) { - Number time = call.argument("time"); - firebaseStorage.setMaxOperationRetryTimeMillis(time.longValue()); - result.success(null); - } - - private void getReferenceFromUrl(MethodCall call, Result result) { - String fullUrl = call.argument("fullUrl"); - StorageReference ref = firebaseStorage.getReferenceFromUrl(fullUrl); - result.success(ref != null ? ref.getPath() : null); - } - - private void getMetadata(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - ref.getMetadata() - .addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(StorageMetadata storageMetadata) { - result.success(buildMapFromMetadata(storageMetadata)); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("metadata_error", e.getMessage(), null); - } - }); - } - - private void updateMetadata(MethodCall call, final Result result) { - String path = call.argument("path"); - Map metadata = call.argument("metadata"); - StorageReference ref = firebaseStorage.getReference().child(path); - ref.updateMetadata(buildMetadataFromMap(metadata)) - .addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(StorageMetadata storageMetadata) { - result.success(buildMapFromMetadata(storageMetadata)); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("metadata_error", e.getMessage(), null); - } - }); - } - - private void getBucket(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - result.success(ref.getBucket()); - } - - private void getName(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - result.success(ref.getName()); - } - - private void getPath(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - result.success(ref.getPath()); - } - - private void getDownloadUrl(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - ref.getDownloadUrl() - .addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(Uri uri) { - result.success(uri.toString()); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("download_error", e.getMessage(), null); - } - }); - } - - private void delete(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - final Task deleteTask = ref.delete(); - deleteTask.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(Void aVoid) { - result.success(null); - } - }); - deleteTask.addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("deletion_error", e.getMessage(), null); - } - }); - } - - private void putFile(MethodCall call, Result result) { - String filename = call.argument("filename"); - String path = call.argument("path"); - File file = new File(filename); - final Uri fileUri = Uri.fromFile(file); - Map metadata = call.argument("metadata"); - metadata = ensureMimeType(metadata, fileUri); - - StorageReference ref = firebaseStorage.getReference().child(path); - final UploadTask uploadTask = ref.putFile(fileUri, buildMetadataFromMap(metadata)); - final int handle = addUploadListeners(uploadTask); - result.success(handle); - } - - private void putData(MethodCall call, Result result) { - byte[] bytes = call.argument("data"); - String path = call.argument("path"); - Map metadata = call.argument("metadata"); - StorageReference ref = firebaseStorage.getReference().child(path); - UploadTask uploadTask; - if (metadata == null) { - uploadTask = ref.putBytes(bytes); - } else { - uploadTask = ref.putBytes(bytes, buildMetadataFromMap(metadata)); - } - final int handle = addUploadListeners(uploadTask); - result.success(handle); - } - - private StorageMetadata buildMetadataFromMap(Map map) { - StorageMetadata.Builder builder = new StorageMetadata.Builder(); - builder.setCacheControl((String) map.get("cacheControl")); - builder.setContentEncoding((String) map.get("contentEncoding")); - builder.setContentDisposition((String) map.get("contentDisposition")); - builder.setContentLanguage((String) map.get("contentLanguage")); - builder.setContentType((String) map.get("contentType")); - - @SuppressWarnings("unchecked") - Map customMetadata = (Map) map.get("customMetadata"); - if (customMetadata != null) { - for (String key : customMetadata.keySet()) { - builder.setCustomMetadata(key, customMetadata.get(key)); - } - } - return builder.build(); - } - - private Map buildMapFromMetadata(StorageMetadata storageMetadata) { - Map map = new HashMap<>(); - map.put("name", storageMetadata.getName()); - map.put("bucket", storageMetadata.getBucket()); - map.put("generation", storageMetadata.getGeneration()); - map.put("metadataGeneration", storageMetadata.getMetadataGeneration()); - map.put("path", storageMetadata.getPath()); - map.put("sizeBytes", storageMetadata.getSizeBytes()); - map.put("creationTimeMillis", storageMetadata.getCreationTimeMillis()); - map.put("updatedTimeMillis", storageMetadata.getUpdatedTimeMillis()); - map.put("md5Hash", storageMetadata.getMd5Hash()); - map.put("cacheControl", storageMetadata.getCacheControl()); - map.put("contentDisposition", storageMetadata.getContentDisposition()); - map.put("contentEncoding", storageMetadata.getContentEncoding()); - map.put("contentLanguage", storageMetadata.getContentLanguage()); - map.put("contentType", storageMetadata.getContentType()); - - Map customMetadata = new HashMap<>(); - for (String key : storageMetadata.getCustomMetadataKeys()) { - customMetadata.put(key, storageMetadata.getCustomMetadata(key)); - } - map.put("customMetadata", customMetadata); - return map; - } - - private void getData(MethodCall call, final Result result) { - Integer maxSize = call.argument("maxSize"); - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - Task downloadTask = ref.getBytes(maxSize); - downloadTask.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(byte[] bytes) { - result.success(bytes); - } - }); - downloadTask.addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("download_error", e.getMessage(), null); - } - }); - } - - private void writeToFile(MethodCall call, final Result result) { - String path = call.argument("path"); - String filePath = call.argument("filePath"); - File file = new File(filePath); - StorageReference ref = firebaseStorage.getReference().child(path); - FileDownloadTask downloadTask = ref.getFile(file); - downloadTask.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { - result.success(taskSnapshot.getTotalByteCount()); - } - }); - downloadTask.addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("download_error", e.getMessage(), null); - } - }); - } - - private void pauseUploadTask(MethodCall call, final Result result) { - int handle = call.argument("handle"); - UploadTask task = uploadTasks.get(handle); - if (task != null) { - task.pause(); - result.success(null); - } else { - result.error("pause_error", "task == null", null); - } - } - - private void cancelUploadTask(MethodCall call, final Result result) { - int handle = call.argument("handle"); - UploadTask task = uploadTasks.get(handle); - if (task != null) { - task.cancel(); - result.success(null); - } else { - result.error("cancel_error", "task == null", null); - } - } - - private void resumeUploadTask(MethodCall call, @NonNull final Result result) { - int handle = call.argument("handle"); - UploadTask task = uploadTasks.get(handle); - if (task != null) { - task.resume(); - result.success(null); - } else { - result.error("resume_error", "task == null", null); - } - } - - private int addUploadListeners(final UploadTask uploadTask) { - final int handle = ++nextUploadHandle; - uploadTask - .addOnProgressListener( - new OnProgressListener() { - @Override - public void onProgress(UploadTask.TaskSnapshot snapshot) { - invokeStorageTaskEvent(handle, StorageTaskEventType.progress, snapshot, null); - } - }) - .addOnPausedListener( - new OnPausedListener() { - @Override - public void onPaused(UploadTask.TaskSnapshot snapshot) { - invokeStorageTaskEvent(handle, StorageTaskEventType.pause, snapshot, null); - } - }) - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - invokeStorageTaskEvent( - handle, - StorageTaskEventType.failure, - uploadTask.getSnapshot(), - (StorageException) task.getException()); - } else { - invokeStorageTaskEvent( - handle, StorageTaskEventType.success, task.getResult(), null); - } - uploadTasks.remove(handle); - } - }); - uploadTasks.put(handle, uploadTask); - return handle; - } - - private enum StorageTaskEventType { - resume, - progress, - pause, - success, - failure - } - - private void invokeStorageTaskEvent( - int handle, - StorageTaskEventType type, - UploadTask.TaskSnapshot snapshot, - StorageException error) { - channel.invokeMethod("StorageTaskEvent", buildMapFromTaskEvent(handle, type, snapshot, error)); - } - - private Map buildMapFromTaskEvent( - int handle, - StorageTaskEventType type, - UploadTask.TaskSnapshot snapshot, - StorageException error) { - Map map = new HashMap<>(); - map.put("handle", handle); - map.put("type", type.ordinal()); - map.put("snapshot", buildMapFromTaskSnapshot(snapshot, error)); - return map; - } - - private Map buildMapFromTaskSnapshot( - UploadTask.TaskSnapshot snapshot, StorageException error) { - Map map = new HashMap<>(); - map.put("bytesTransferred", snapshot.getBytesTransferred()); - map.put("totalByteCount", snapshot.getTotalByteCount()); - if (snapshot.getUploadSessionUri() != null) { - map.put("uploadSessionUri", snapshot.getUploadSessionUri().toString()); - } - if (error != null) { - map.put("error", error.getErrorCode()); - } - if (snapshot.getMetadata() != null) { - map.put("storageMetadata", buildMapFromMetadata(snapshot.getMetadata())); - } - return map; - } - - private Map ensureMimeType(Map metadata, Uri file) { - if (metadata == null) { - metadata = new HashMap<>(); - } - - if (metadata.get("contentType") == null) { - metadata.put("contentType", getMimeType(file)); - } - - return metadata; - } - - private static String getMimeType(Uri file) { - String type = null; - String extension = MimeTypeMap.getFileExtensionFromUrl(file.toString()); - if (extension != null) { - type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - } - return type; - } -} diff --git a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java deleted file mode 100644 index a3b58d0fbe2f..000000000000 --- a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseAppRegistrar.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.storage; - -import 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; - -public class FlutterFirebaseAppRegistrar implements ComponentRegistrar { - @Override - public List> getComponents() { - return Collections.>singletonList( - LibraryVersionComponent.create(BuildConfig.LIBRARY_NAME, BuildConfig.LIBRARY_VERSION)); - } -} diff --git a/packages/firebase_storage/android/user-agent.gradle b/packages/firebase_storage/android/user-agent.gradle deleted file mode 100644 index 0311d5695937..000000000000 --- a/packages/firebase_storage/android/user-agent.gradle +++ /dev/null @@ -1,22 +0,0 @@ -import java.util.regex.Matcher -import java.util.regex.Pattern - -String libraryVersionName = "UNKNOWN" -String libraryName = "flutter-fire-gcs" -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_storage/example/README.md b/packages/firebase_storage/example/README.md deleted file mode 100755 index 8ed83b61da22..000000000000 --- a/packages/firebase_storage/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_storage_example - -Demonstrates how to use the firebase_storage plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/packages/firebase_storage/example/android.iml b/packages/firebase_storage/example/android.iml deleted file mode 100755 index 462b903e05b6..000000000000 --- a/packages/firebase_storage/example/android.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/firebase_storage/example/android/app/build.gradle b/packages/firebase_storage/example/android/app/build.gradle deleted file mode 100755 index e40ea979a675..000000000000 --- a/packages/firebase_storage/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId 'io.flutter.plugins.firebasestorageexample' - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/packages/firebase_storage/example/android/app/google-services.json b/packages/firebase_storage/example/android/app/google-services.json deleted file mode 100755 index 52dd25ca3f63..000000000000 --- a/packages/firebase_storage/example/android/app/google-services.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "project_info": { - "project_number": "159623150305", - "firebase_url": "https://flutter-firebase-plugins.firebaseio.com", - "project_id": "flutter-firebase-plugins", - "storage_bucket": "flutter-firebase-plugins.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:159623150305:android:ef48439a0cc0263d", - "android_client_info": { - "package_name": "io.flutter.plugins.firebasestorageexample" - } - }, - "oauth_client": [ - { - "client_id": "159623150305-q05bbbtsutr02abhips3suj7hujfk4bg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} diff --git a/packages/firebase_storage/example/android/app/gradle.properties b/packages/firebase_storage/example/android/app/gradle.properties deleted file mode 100644 index 5465fec0ecad..000000000000 --- a/packages/firebase_storage/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/packages/firebase_storage/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_storage/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/firebase_storage/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/firebase_storage/example/android/app/src/main/AndroidManifest.xml b/packages/firebase_storage/example/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index c2ce4f809e56..000000000000 --- a/packages/firebase_storage/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/packages/firebase_storage/example/android/app/src/main/java/io/flutter/plugins/firebasestorageexample/MainActivity.java b/packages/firebase_storage/example/android/app/src/main/java/io/flutter/plugins/firebasestorageexample/MainActivity.java deleted file mode 100644 index 4fa7818db065..000000000000 --- a/packages/firebase_storage/example/android/app/src/main/java/io/flutter/plugins/firebasestorageexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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.firebasestorageexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/firebase_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/firebase_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100755 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/firebase_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100755 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/packages/firebase_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/firebase_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100755 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/firebase_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100755 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/packages/firebase_storage/example/android/build.gradle b/packages/firebase_storage/example/android/build.gradle deleted file mode 100755 index 695de848ec30..000000000000 --- a/packages/firebase_storage/example/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - mavenLocal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/firebase_storage/example/android/gradle.properties b/packages/firebase_storage/example/android/gradle.properties deleted file mode 100755 index 8bd86f680510..000000000000 --- a/packages/firebase_storage/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/packages/firebase_storage/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/firebase_storage/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/firebase_storage/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/firebase_storage/example/android/settings.gradle b/packages/firebase_storage/example/android/settings.gradle deleted file mode 100755 index 115da6cb4f4d..000000000000 --- a/packages/firebase_storage/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/firebase_storage/example/firebase_storage_example.iml b/packages/firebase_storage/example/firebase_storage_example.iml deleted file mode 100755 index 1ae40a0f7f54..000000000000 --- a/packages/firebase_storage/example/firebase_storage_example.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/firebase_storage/example/ios/Flutter/AppFrameworkInfo.plist b/packages/firebase_storage/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 6c2de8086bcd..000000000000 --- a/packages/firebase_storage/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/packages/firebase_storage/example/ios/Flutter/Debug.xcconfig b/packages/firebase_storage/example/ios/Flutter/Debug.xcconfig deleted file mode 100755 index 9803018ca79d..000000000000 --- a/packages/firebase_storage/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/packages/firebase_storage/example/ios/Flutter/Release.xcconfig b/packages/firebase_storage/example/ios/Flutter/Release.xcconfig deleted file mode 100755 index a4a8c604e13d..000000000000 --- a/packages/firebase_storage/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/packages/firebase_storage/example/ios/Runner.xcodeproj/project.pbxproj b/packages/firebase_storage/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 54e5e34c25f9..000000000000 --- a/packages/firebase_storage/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,481 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C6F5A711EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */; }; - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 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 */; }; - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */, - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */, - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods 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 = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 = ( - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" thin"; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 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"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - 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 */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C6F5A711EC3CCCC008D64B5 /* 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 */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseStorageExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseStorageExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/packages/firebase_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/firebase_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/firebase_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index 1c9580788197..000000000000 --- a/packages/firebase_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/firebase_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc14c74e..000000000000 --- a/packages/firebase_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/packages/firebase_storage/example/ios/Runner/AppDelegate.h b/packages/firebase_storage/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e990f2e..000000000000 --- a/packages/firebase_storage/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/firebase_storage/example/ios/Runner/AppDelegate.m b/packages/firebase_storage/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c88eb60..000000000000 --- a/packages/firebase_storage/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 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. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index d22f10b2ab63..000000000000 --- a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100755 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100755 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100755 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100755 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100755 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100755 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100755 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_storage/example/ios/Runner/Base.lproj/Main.storyboard b/packages/firebase_storage/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index f3c28516fb38..000000000000 --- a/packages/firebase_storage/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/firebase_storage/example/ios/Runner/GoogleService-Info.plist b/packages/firebase_storage/example/ios/Runner/GoogleService-Info.plist deleted file mode 100755 index 7444d8aa0ea0..000000000000 --- a/packages/firebase_storage/example/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 159623150305-onp22gvn556sp5l47l9o7r8em82l7f1e.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.159623150305-onp22gvn556sp5l47l9o7r8em82l7f1e - API_KEY - AIzaSyDyzecVw1zXTpBKwfFHxpl7QyYBhimNhUk - GCM_SENDER_ID - 159623150305 - PLIST_VERSION - 1 - BUNDLE_ID - io.flutter.plugins.firebaseStorageExample - PROJECT_ID - flutter-firebase-plugins - STORAGE_BUCKET - flutter-firebase-plugins.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:159623150305:ios:4a213ef3dbd8997b - DATABASE_URL - https://flutter-firebase-plugins.firebaseio.com - - diff --git a/packages/firebase_storage/example/ios/Runner/Info.plist b/packages/firebase_storage/example/ios/Runner/Info.plist deleted file mode 100755 index 6e4ed61c7cbc..000000000000 --- a/packages/firebase_storage/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_storage_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/packages/firebase_storage/example/ios/Runner/main.m b/packages/firebase_storage/example/ios/Runner/main.m deleted file mode 100644 index bec320c0bee0..000000000000 --- a/packages/firebase_storage/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/firebase_storage/example/lib/main.dart b/packages/firebase_storage/example/lib/main.dart deleted file mode 100755 index f388435938c2..000000000000 --- a/packages/firebase_storage/example/lib/main.dart +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright 2017 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 'dart:io'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_storage/firebase_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart' as http; -import 'package:uuid/uuid.dart'; - -const String kTestString = 'Hello world!'; - -void main() async { - final FirebaseApp app = await FirebaseApp.configure( - name: 'test', - options: FirebaseOptions( - googleAppID: Platform.isIOS - ? '1:159623150305:ios:4a213ef3dbd8997b' - : '1:159623150305:android:ef48439a0cc0263d', - gcmSenderID: '159623150305', - apiKey: 'AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg', - projectID: 'flutter-firebase-plugins', - ), - ); - final FirebaseStorage storage = FirebaseStorage( - app: app, storageBucket: 'gs://flutter-firebase-plugins.appspot.com'); - runApp(MyApp(storage: storage)); -} - -class MyApp extends StatelessWidget { - MyApp({this.storage}); - final FirebaseStorage storage; - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Storage Example', - home: MyHomePage(storage: storage), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({this.storage}); - final FirebaseStorage storage; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - GlobalKey _scaffoldKey = GlobalKey(); - List _tasks = []; - - Future _uploadFile() async { - final String uuid = Uuid().v1(); - final Directory systemTempDir = Directory.systemTemp; - final File file = await File('${systemTempDir.path}/foo$uuid.txt').create(); - await file.writeAsString(kTestString); - assert(await file.readAsString() == kTestString); - final StorageReference ref = - widget.storage.ref().child('text').child('foo$uuid.txt'); - final StorageUploadTask uploadTask = ref.putFile( - file, - StorageMetadata( - contentLanguage: 'en', - customMetadata: {'activity': 'test'}, - ), - ); - - setState(() { - _tasks.add(uploadTask); - }); - } - - Future _downloadFile(StorageReference ref) async { - final String url = await ref.getDownloadURL(); - final String uuid = Uuid().v1(); - final http.Response downloadData = await http.get(url); - final Directory systemTempDir = Directory.systemTemp; - final File tempFile = File('${systemTempDir.path}/tmp$uuid.txt'); - if (tempFile.existsSync()) { - await tempFile.delete(); - } - await tempFile.create(); - assert(await tempFile.readAsString() == ""); - final StorageFileDownloadTask task = ref.writeToFile(tempFile); - final int byteCount = (await task.future).totalByteCount; - final String tempFileContents = await tempFile.readAsString(); - assert(tempFileContents == kTestString); - assert(byteCount == kTestString.length); - - final String fileContents = downloadData.body; - final String name = await ref.getName(); - final String bucket = await ref.getBucket(); - final String path = await ref.getPath(); - _scaffoldKey.currentState.showSnackBar(SnackBar( - content: Text( - 'Success!\n Downloaded $name \n from url: $url @ bucket: $bucket\n ' - 'at path: $path \n\nFile contents: "$fileContents" \n' - 'Wrote "$tempFileContents" to tmp.txt', - style: const TextStyle(color: Color.fromARGB(255, 0, 155, 0)), - ), - )); - } - - @override - Widget build(BuildContext context) { - final List children = []; - _tasks.forEach((StorageUploadTask task) { - final Widget tile = UploadTaskListTile( - task: task, - onDismissed: () => setState(() => _tasks.remove(task)), - onDownload: () => _downloadFile(task.lastSnapshot.ref), - ); - children.add(tile); - }); - return Scaffold( - key: _scaffoldKey, - appBar: AppBar( - title: const Text('Flutter Storage Example'), - actions: [ - IconButton( - icon: const Icon(Icons.clear_all), - onPressed: - _tasks.isNotEmpty ? () => setState(() => _tasks.clear()) : null, - ) - ], - ), - body: ListView( - children: children, - ), - floatingActionButton: FloatingActionButton( - onPressed: _uploadFile, - tooltip: 'Upload', - child: const Icon(Icons.file_upload), - ), - ); - } -} - -class UploadTaskListTile extends StatelessWidget { - const UploadTaskListTile( - {Key key, this.task, this.onDismissed, this.onDownload}) - : super(key: key); - - final StorageUploadTask task; - final VoidCallback onDismissed; - final VoidCallback onDownload; - - String get status { - String result; - if (task.isComplete) { - if (task.isSuccessful) { - result = 'Complete'; - } else if (task.isCanceled) { - result = 'Canceled'; - } else { - result = 'Failed ERROR: ${task.lastSnapshot.error}'; - } - } else if (task.isInProgress) { - result = 'Uploading'; - } else if (task.isPaused) { - result = 'Paused'; - } - return result; - } - - String _bytesTransferred(StorageTaskSnapshot snapshot) { - return '${snapshot.bytesTransferred}/${snapshot.totalByteCount}'; - } - - @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: task.events, - builder: (BuildContext context, - AsyncSnapshot asyncSnapshot) { - Widget subtitle; - if (asyncSnapshot.hasData) { - final StorageTaskEvent event = asyncSnapshot.data; - final StorageTaskSnapshot snapshot = event.snapshot; - subtitle = Text('$status: ${_bytesTransferred(snapshot)} bytes sent'); - } else { - subtitle = const Text('Starting...'); - } - return Dismissible( - key: Key(task.hashCode.toString()), - onDismissed: (_) => onDismissed(), - child: ListTile( - title: Text('Upload Task #${task.hashCode}'), - subtitle: subtitle, - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Offstage( - offstage: !task.isInProgress, - child: IconButton( - icon: const Icon(Icons.pause), - onPressed: () => task.pause(), - ), - ), - Offstage( - offstage: !task.isPaused, - child: IconButton( - icon: const Icon(Icons.file_upload), - onPressed: () => task.resume(), - ), - ), - Offstage( - offstage: task.isComplete, - child: IconButton( - icon: const Icon(Icons.cancel), - onPressed: () => task.cancel(), - ), - ), - Offstage( - offstage: !(task.isComplete && task.isSuccessful), - child: IconButton( - icon: const Icon(Icons.file_download), - onPressed: onDownload, - ), - ), - ], - ), - ), - ); - }, - ); - } -} diff --git a/packages/firebase_storage/example/pubspec.yaml b/packages/firebase_storage/example/pubspec.yaml deleted file mode 100755 index 321265020fde..000000000000 --- a/packages/firebase_storage/example/pubspec.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: firebase_storage_example -description: Demonstrates how to use the firebase_storage plugin. -author: Flutter Team - -dependencies: - flutter: - sdk: flutter - firebase_storage: - path: ../ - firebase_core: ^0.4.0 - uuid: ^1.0.0 - http: ^0.12.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - -flutter: - uses-material-design: true - diff --git a/packages/firebase_storage/example/test_driver/firebase_storage.dart b/packages/firebase_storage/example/test_driver/firebase_storage.dart deleted file mode 100644 index 986439b4c649..000000000000 --- a/packages/firebase_storage/example/test_driver/firebase_storage.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'package:http/http.dart' as http; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_storage/firebase_storage.dart'; -import 'package:uuid/uuid.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$FirebaseStorage', () { - const String kTestString = 'hello world'; - FirebaseStorage firebaseStorage; - - setUp(() async { - firebaseStorage = FirebaseStorage(); - }); - - test('putFile, getDownloadURL, writeToFile', () async { - final String uuid = Uuid().v1(); - final Directory systemTempDir = Directory.systemTemp; - final File file = - await File('${systemTempDir.path}/foo$uuid.txt').create(); - await file.writeAsString(kTestString); - final StorageReference ref = - firebaseStorage.ref().child('text').child('foo$uuid.txt'); - expect(await ref.getName(), 'foo$uuid.txt'); - expect(await ref.getPath(), 'text/foo$uuid.txt'); - final StorageUploadTask uploadTask = ref.putFile( - file, - StorageMetadata( - contentLanguage: 'en', - customMetadata: {'activity': 'test'}, - ), - ); - final StorageTaskSnapshot complete = await uploadTask.onComplete; - expect(complete.storageMetadata.sizeBytes, kTestString.length); - expect(complete.storageMetadata.contentLanguage, 'en'); - expect(complete.storageMetadata.customMetadata['activity'], 'test'); - - final String url = await ref.getDownloadURL(); - final http.Response downloadData = await http.get(url); - expect(downloadData.body, kTestString); - expect(downloadData.headers['content-type'], 'text/plain'); - final File tempFile = File('${systemTempDir.path}/tmp$uuid.txt'); - if (tempFile.existsSync()) { - await tempFile.delete(); - } - await tempFile.create(); - expect(await tempFile.readAsString(), ''); - final StorageFileDownloadTask task = ref.writeToFile(tempFile); - final int byteCount = (await task.future).totalByteCount; - final String tempFileContents = await tempFile.readAsString(); - expect(tempFileContents, kTestString); - expect(byteCount, kTestString.length); - }); - }); -} diff --git a/packages/firebase_storage/example/test_driver/firebase_storage_test.dart b/packages/firebase_storage/example/test_driver/firebase_storage_test.dart deleted file mode 100644 index 38fe6c447e05..000000000000 --- a/packages/firebase_storage/example/test_driver/firebase_storage_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/firebase_storage/ios/Assets/.gitkeep b/packages/firebase_storage/ios/Assets/.gitkeep deleted file mode 100755 index e69de29bb2d1..000000000000 diff --git a/packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.h b/packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.h deleted file mode 100644 index 4c7a7df05b13..000000000000 --- a/packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 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 - -@interface FLTFirebaseStoragePlugin : NSObject -@end diff --git a/packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.m b/packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.m deleted file mode 100644 index 5fd11add6c85..000000000000 --- a/packages/firebase_storage/ios/Classes/FirebaseStoragePlugin.m +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright 2017 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 "FirebaseStoragePlugin.h" -#import "UserAgent.h" - -#import - -static FlutterError *getFlutterError(NSError *error) { - return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %ld", (long)error.code] - message:error.domain - details:error.localizedDescription]; -} - -@interface FLTFirebaseStoragePlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FLTFirebaseStoragePlugin { - NSMutableDictionary *> *_storageMap; - FIRStorage *storage; - int _nextUploadHandle; - NSMutableDictionary *_uploadTasks; -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_storage" - binaryMessenger:[registrar messenger]]; - FLTFirebaseStoragePlugin *instance = [[FLTFirebaseStoragePlugin alloc] init]; - instance.channel = channel; - [registrar addMethodCallDelegate:instance channel:channel]; - - SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:"); - if ([FIRApp respondsToSelector:sel]) { - [FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION]; - } -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - _storageMap = [[NSMutableDictionary alloc] init]; - _uploadTasks = [NSMutableDictionary dictionary]; - _nextUploadHandle = 0; - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - storage = [self getStorage:call result:result]; - if ([@"FirebaseStorage#getMaxDownloadRetryTime" isEqualToString:call.method]) { - result(@((int64_t)(storage.maxDownloadRetryTime * 1000.0))); - } else if ([@"FirebaseStorage#getMaxUploadRetryTime" isEqualToString:call.method]) { - result(@((int64_t)(storage.maxUploadRetryTime * 1000.0))); - } else if ([@"FirebaseStorage#getMaxOperationRetryTime" isEqualToString:call.method]) { - result(@((int64_t)(storage.maxOperationRetryTime * 1000.0))); - } else if ([@"FirebaseStorage#setMaxDownloadRetryTime" isEqualToString:call.method]) { - [self setMaxDownloadRetryTime:call result:result]; - } else if ([@"FirebaseStorage#setMaxUploadRetryTime" isEqualToString:call.method]) { - [self setMaxUploadRetryTime:call result:result]; - } else if ([@"FirebaseStorage#setMaxOperationRetryTime" isEqualToString:call.method]) { - [self setMaxOperationRetryTime:call result:result]; - } else if ([@"FirebaseStorage#getReferenceFromUrl" isEqualToString:call.method]) { - [self getReferenceFromUrl:call result:result]; - } else if ([@"StorageReference#putFile" isEqualToString:call.method]) { - [self putFile:call result:result]; - } else if ([@"StorageReference#putData" isEqualToString:call.method]) { - [self putData:call result:result]; - } else if ([@"StorageReference#getData" isEqualToString:call.method]) { - [self getData:call result:result]; - } else if ([@"StorageReference#getBucket" isEqualToString:call.method]) { - [self getBucket:call result:result]; - } else if ([@"StorageReference#getPath" isEqualToString:call.method]) { - [self getPath:call result:result]; - } else if ([@"StorageReference#getName" isEqualToString:call.method]) { - [self getName:call result:result]; - } else if ([@"StorageReference#getDownloadUrl" isEqualToString:call.method]) { - [self getDownloadUrl:call result:result]; - } else if ([@"StorageReference#delete" isEqualToString:call.method]) { - [self delete:call result:result]; - } else if ([@"StorageReference#getMetadata" isEqualToString:call.method]) { - [self getMetadata:call result:result]; - } else if ([@"StorageReference#updateMetadata" isEqualToString:call.method]) { - [self updateMetadata:call result:result]; - } else if ([@"StorageReference#writeToFile" isEqualToString:call.method]) { - [self writeToFile:call result:result]; - } else if ([@"UploadTask#pause" isEqualToString:call.method]) { - [self pauseUploadTask:call result:result]; - } else if ([@"UploadTask#resume" isEqualToString:call.method]) { - [self resumeUploadTask:call result:result]; - } else if ([@"UploadTask#cancel" isEqualToString:call.method]) { - [self cancelUploadTask:call result:result]; - } else { - result(FlutterMethodNotImplemented); - } -} - -// Returns a [FIRStorage] instance which is a singleton given a fixed app and bucket. -// This is to be consistent with the Android API so that repated calls to getters/setters -// affect the right [FIRStorage] instance. -- (FIRStorage *)getStorage:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *appName = call.arguments[@"app"]; - NSString *bucketUrl = call.arguments[@"bucket"]; - FIRApp *app; - - if ([appName isEqual:[NSNull null]]) { - app = [FIRApp defaultApp]; - } else { - app = [FIRApp appNamed:appName]; - } - - if ([bucketUrl isEqual:[NSNull null]]) { - if (app.options.storageBucket) { - bucketUrl = [app.options.storageBucket isEqualToString:@""] - ? @"" - : [@"gs://" stringByAppendingString:app.options.storageBucket]; - } else { - bucketUrl = nil; - } - } - - NSURL *url = [NSURL URLWithString:bucketUrl]; - if (!url) { - @try { - // Call storage constructor to raise proper exception. - storage = [FIRStorage storageForApp:app URL:bucketUrl]; - } @catch (NSException *exception) { - result([FlutterError errorWithCode:@"storage_error" - message:[exception name] - details:[exception reason]]); - } - } - - NSMutableDictionary *bucketMap = _storageMap[app.name]; - if (!bucketMap) { - bucketMap = [NSMutableDictionary dictionaryWithCapacity:1]; - _storageMap[app.name] = bucketMap; - } - - NSString *bucketName = [url host]; - FIRStorage *storage = bucketMap[bucketName]; - if (!storage) { - // Raises an exception if bucketUrl is invalid. - @try { - storage = [FIRStorage storageForApp:app URL:bucketUrl]; - } @catch (NSException *exception) { - result([FlutterError errorWithCode:@"storage_error" - message:[exception name] - details:[exception reason]]); - } - bucketMap[bucketName] = storage; - } - - return storage; -} - -- (void)setMaxDownloadRetryTime:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *time = call.arguments[@"time"]; - storage.maxDownloadRetryTime = [time longLongValue] / 1000.0; - result(nil); -} - -- (void)setMaxUploadRetryTime:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *time = call.arguments[@"time"]; - storage.maxUploadRetryTime = [time longLongValue] / 1000.0; - result(nil); -} - -- (void)setMaxOperationRetryTime:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *time = call.arguments[@"time"]; - storage.maxOperationRetryTime = [time longLongValue] / 1000.0; - result(nil); -} - -- (void)getReferenceFromUrl:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *fullUrl = call.arguments[@"fullUrl"]; - result([storage referenceForURL:fullUrl].fullPath); -} - -- (void)putFile:(FlutterMethodCall *)call result:(FlutterResult)result { - NSURL *fileUrl = [NSURL fileURLWithPath:call.arguments[@"filename"]]; - [self - putHandler:^(FIRStorageReference *fileRef, FIRStorageMetadata *metadata) { - return [fileRef putFile:fileUrl metadata:metadata]; - } - call:call - result:result]; -} - -- (void)putData:(FlutterMethodCall *)call result:(FlutterResult)result { - NSData *data = [(FlutterStandardTypedData *)call.arguments[@"data"] data]; - if (data == nil) { - result([FlutterError errorWithCode:@"storage_error" - message:@"Failed to read file" - details:nil]); - return; - } - [self - putHandler:^(FIRStorageReference *fileRef, FIRStorageMetadata *metadata) { - return [fileRef putData:data metadata:metadata]; - } - call:call - result:result]; -} - -- (void)putHandler:(FIRStorageUploadTask * (^)(FIRStorageReference *fileRef, - FIRStorageMetadata *metadata))putHandler - call:(FlutterMethodCall *)call - result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - NSDictionary *metadataDictionary = call.arguments[@"metadata"]; - FIRStorageMetadata *metadata; - if (![metadataDictionary isEqual:[NSNull null]]) { - metadata = [self buildMetadataFromDictionary:metadataDictionary]; - } - FIRStorageReference *fileRef = [storage.reference child:path]; - FIRStorageUploadTask *uploadTask = putHandler(fileRef, metadata); - NSNumber *handle = [NSNumber numberWithInt:_nextUploadHandle++]; - [uploadTask observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kSuccess snapshot:snapshot]; - [self->_uploadTasks removeObjectForKey:handle]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusProgress - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kProgress snapshot:snapshot]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusResume - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kResume snapshot:snapshot]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusPause - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kPause snapshot:snapshot]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kFailure snapshot:snapshot]; - [self->_uploadTasks removeObjectForKey:handle]; - }]; - _uploadTasks[handle] = uploadTask; - result(handle); -} - -typedef NS_ENUM(NSUInteger, StorageTaskEventType) { - kResume, - kProgress, - kPause, - kSuccess, - kFailure -}; - -- (void)invokeStorageTaskEvent:(NSNumber *)handle - type:(StorageTaskEventType)type - snapshot:(FIRStorageTaskSnapshot *)snapshot { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - [dictionary setValue:handle forKey:@"handle"]; - [dictionary setValue:@((int)type) forKey:@"type"]; - [dictionary setValue:[self buildDictionaryFromTaskSnapshot:snapshot] forKey:@"snapshot"]; - [self.channel invokeMethod:@"StorageTaskEvent" arguments:dictionary]; -} - -- (NSDictionary *)buildDictionaryFromTaskSnapshot:(FIRStorageTaskSnapshot *)snapshot { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - [dictionary setValue:@((long)([snapshot.progress completedUnitCount])) - forKey:@"bytesTransferred"]; - [dictionary setValue:@((long)([snapshot.progress totalUnitCount])) forKey:@"totalByteCount"]; - if ([snapshot error] != nil) { - [dictionary setValue:@((long)[snapshot.error code]) forKey:@"error"]; - } - if ([snapshot metadata] != nil) { - [dictionary setValue:[self buildDictionaryFromMetadata:snapshot.metadata] - forKey:@"storageMetadata"]; - } - return dictionary; -} - -- (FIRStorageMetadata *)buildMetadataFromDictionary:(NSDictionary *)dictionary { - FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init]; - if (dictionary[@"cacheControl"] != [NSNull null]) - metadata.cacheControl = dictionary[@"cacheControl"]; - if (dictionary[@"contentDisposition"] != [NSNull null]) - metadata.contentDisposition = dictionary[@"contentDisposition"]; - if (dictionary[@"contentEncoding"] != [NSNull null]) - metadata.contentEncoding = dictionary[@"contentEncoding"]; - if (dictionary[@"contentLanguage"] != [NSNull null]) - metadata.contentLanguage = dictionary[@"contentLanguage"]; - if (dictionary[@"contentType"] != [NSNull null]) - metadata.contentType = dictionary[@"contentType"]; - if (dictionary[@"customMetadata"] != [NSNull null]) - metadata.customMetadata = dictionary[@"customMetadata"]; - return metadata; -} - -- (NSDictionary *)buildDictionaryFromMetadata:(FIRStorageMetadata *)metadata { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - [dictionary setValue:[metadata bucket] forKey:@"bucket"]; - [dictionary setValue:[NSString stringWithFormat:@"%lld", [metadata generation]] - forKey:@"generation"]; - [dictionary setValue:[NSString stringWithFormat:@"%lld", [metadata metageneration]] - forKey:@"metadataGeneration"]; - [dictionary setValue:[metadata path] forKey:@"path"]; - [dictionary setValue:@((long)([[metadata timeCreated] timeIntervalSince1970] * 1000.0)) - forKey:@"creationTimeMillis"]; - [dictionary setValue:@((long)([[metadata updated] timeIntervalSince1970] * 1000.0)) - forKey:@"updatedTimeMillis"]; - [dictionary setValue:@([metadata size]) forKey:@"sizeBytes"]; - [dictionary setValue:[metadata md5Hash] forKey:@"md5Hash"]; - [dictionary setValue:[metadata cacheControl] forKey:@"cacheControl"]; - [dictionary setValue:[metadata contentDisposition] forKey:@"contentDisposition"]; - [dictionary setValue:[metadata contentEncoding] forKey:@"contentEncoding"]; - [dictionary setValue:[metadata contentLanguage] forKey:@"contentLanguage"]; - [dictionary setValue:[metadata contentType] forKey:@"contentType"]; - [dictionary setValue:[metadata name] forKey:@"name"]; - [dictionary setValue:[metadata customMetadata] forKey:@"customMetadata"]; - return dictionary; -} - -- (void)getData:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *maxSize = call.arguments[@"maxSize"]; - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref dataWithMaxSize:[maxSize longLongValue] - completion:^(NSData *_Nullable data, NSError *_Nullable error) { - if (error != nil) { - result(getFlutterError(error)); - return; - } - if (data == nil) { - result(nil); - return; - } - - FlutterStandardTypedData *dartData = - [FlutterStandardTypedData typedDataWithBytes:data]; - result(dartData); - }]; -} - -- (void)writeToFile:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - NSString *filePath = call.arguments[@"filePath"]; - NSURL *localURL = [NSURL fileURLWithPath:filePath]; - FIRStorageReference *ref = [storage.reference child:path]; - FIRStorageDownloadTask *task = [ref writeToFile:localURL]; - [task observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - result(@(snapshot.progress.totalUnitCount)); - }]; - [task observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - if (snapshot.error != nil) { - result(getFlutterError(snapshot.error)); - } - }]; -} - -- (void)getMetadata:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref metadataWithCompletion:^(FIRStorageMetadata *metadata, NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result([self buildDictionaryFromMetadata:metadata]); - } - }]; -} - -- (void)updateMetadata:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - NSDictionary *metadataDictionary = call.arguments[@"metadata"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref updateMetadata:[self buildMetadataFromDictionary:metadataDictionary] - completion:^(FIRStorageMetadata *metadata, NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result([self buildDictionaryFromMetadata:metadata]); - } - }]; -} - -- (void)getBucket:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - result([ref bucket]); -} - -- (void)getName:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - result([ref name]); -} - -- (void)getPath:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - result([ref fullPath]); -} - -- (void)getDownloadUrl:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref downloadURLWithCompletion:^(NSURL *URL, NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result(URL.absoluteString); - } - }]; -} - -- (void)delete:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref deleteWithCompletion:^(NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result(nil); - } - }]; -} - -- (void)pauseUploadTask:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *handle = call.arguments[@"handle"]; - FIRStorageUploadTask *task = [_uploadTasks objectForKey:handle]; - if (task != nil) { - [task pause]; - result(nil); - } else { - result([FlutterError errorWithCode:@"pause_error" message:@"task == null" details:nil]); - } -} - -- (void)resumeUploadTask:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *handle = call.arguments[@"handle"]; - FIRStorageUploadTask *task = [_uploadTasks objectForKey:handle]; - if (task != nil) { - [task resume]; - result(nil); - } else { - result([FlutterError errorWithCode:@"resume_error" message:@"task == null" details:nil]); - } -} - -- (void)cancelUploadTask:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *handle = call.arguments[@"handle"]; - FIRStorageUploadTask *task = [_uploadTasks objectForKey:handle]; - if (task != nil) { - [task cancel]; - result(nil); - } else { - result([FlutterError errorWithCode:@"cancel_error" message:@"task == null" details:nil]); - } -} - -@end diff --git a/packages/firebase_storage/ios/firebase_storage.podspec b/packages/firebase_storage/ios/firebase_storage.podspec deleted file mode 100755 index 2fa05a18004a..000000000000 --- a/packages/firebase_storage/ios/firebase_storage.podspec +++ /dev/null @@ -1,32 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - -require 'yaml' -pubspec = YAML.load_file(File.join('..', 'pubspec.yaml')) -libraryVersion = pubspec['version'].gsub('+', '-') - -Pod::Spec.new do |s| - s.name = 'firebase_storage' - s.version = '0.0.1' - s.summary = 'Firebase Storage plugin for Flutter.' - s.description = <<-DESC -Firebase Storage plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_storage' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Storage' - s.static_framework = true - - s.prepare_command = <<-CMD - echo // Generated file, do not edit > Classes/UserAgent.h - echo "#define LIBRARY_VERSION @\\"#{libraryVersion}\\"" >> Classes/UserAgent.h - echo "#define LIBRARY_NAME @\\"flutter-fire-gcs\\"" >> Classes/UserAgent.h - CMD -end diff --git a/packages/firebase_storage/lib/firebase_storage.dart b/packages/firebase_storage/lib/firebase_storage.dart deleted file mode 100755 index d37af7f6a21b..000000000000 --- a/packages/firebase_storage/lib/firebase_storage.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2017 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_storage; - -import 'dart:async'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; - -part 'src/error.dart'; -part 'src/event.dart'; -part 'src/firebase_storage.dart'; -part 'src/storage_metadata.dart'; -part 'src/storage_reference.dart'; -part 'src/upload_task.dart'; diff --git a/packages/firebase_storage/lib/src/error.dart b/packages/firebase_storage/lib/src/error.dart deleted file mode 100644 index 62b66d365fe2..000000000000 --- a/packages/firebase_storage/lib/src/error.dart +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 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_storage; - -class StorageError { - static const int unknown = -13000; - static const int objectNotFound = -13010; - static const int bucketNotFound = -13011; - static const int projectNotFound = -13012; - static const int quotaExceeded = -13013; - static const int notAuthenticated = -13020; - static const int notAuthorized = -13021; - static const int retryLimitExceeded = -13030; - static const int invalidChecksum = -13031; - static const int canceled = -13040; -} diff --git a/packages/firebase_storage/lib/src/event.dart b/packages/firebase_storage/lib/src/event.dart deleted file mode 100644 index 1241e097ce26..000000000000 --- a/packages/firebase_storage/lib/src/event.dart +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 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_storage; - -enum StorageTaskEventType { - resume, - progress, - pause, - success, - failure, -} - -/// `Event` encapsulates a StorageTaskSnapshot -class StorageTaskEvent { - StorageTaskEvent._(int type, StorageReference ref, Map data) - : type = StorageTaskEventType.values[type], - snapshot = StorageTaskSnapshot._(ref, data.cast()); - - final StorageTaskEventType type; - final StorageTaskSnapshot snapshot; -} - -class StorageTaskSnapshot { - StorageTaskSnapshot._(this.ref, Map m) - : error = m['error'], - bytesTransferred = m['bytesTransferred'], - totalByteCount = m['totalByteCount'], - uploadSessionUri = m['uploadSessionUri'] != null - ? Uri.parse(m['uploadSessionUri']) - : null, - storageMetadata = m['storageMetadata'] != null - ? StorageMetadata._fromMap( - m['storageMetadata'].cast()) - : null; - - final StorageReference ref; - final int error; - final int bytesTransferred; - final int totalByteCount; - final Uri uploadSessionUri; - final StorageMetadata storageMetadata; -} diff --git a/packages/firebase_storage/lib/src/firebase_storage.dart b/packages/firebase_storage/lib/src/firebase_storage.dart deleted file mode 100644 index cbd1131d3880..000000000000 --- a/packages/firebase_storage/lib/src/firebase_storage.dart +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2017 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_storage; - -/// FirebaseStorage is a service that supports uploading and downloading large -/// objects to Google Cloud Storage. -class FirebaseStorage { - /// Returns the [FirebaseStorage] instance, initialized with a custom - /// [FirebaseApp] if [app] is specified and a custom Google Cloud Storage - /// bucket if [storageBucket] is specified. Otherwise the instance will be - /// initialized with the default [FirebaseApp]. - /// - /// The [FirebaseStorage] instance is a singleton for fixed [app] and - /// [storageBucket]. - /// - /// The [storageBucket] argument is the gs:// url to the custom Firebase - /// Storage Bucket. - /// - /// The [app] argument is the custom [FirebaseApp]. - FirebaseStorage({this.app, this.storageBucket}) { - if (_initialized) return; - channel.setMethodCallHandler((MethodCall call) async { - _methodStreamController.add(call); - }); - _initialized = true; - } - - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_storage'); - - static bool _initialized = false; - - static FirebaseStorage _instance = FirebaseStorage(); - - /// The [FirebaseApp] instance to which this [FirebaseStorage] belongs. - /// - /// If null, the default [FirebaseApp] is used. - final FirebaseApp app; - - /// The Google Cloud Storage bucket to which this [FirebaseStorage] belongs. - /// - /// If null, the storage bucket of the specified [FirebaseApp] is used. - final String storageBucket; - - /// Returns the [FirebaseStorage] instance, initialized with the default - /// [FirebaseApp]. - static FirebaseStorage get instance => _instance; - - /// Used to dispatch method calls - static final StreamController _methodStreamController = - StreamController.broadcast(); // ignore: close_sinks - Stream get _methodStream => _methodStreamController.stream; - - /// Creates a new [StorageReference] initialized at the root - /// Firebase Storage location. - StorageReference ref() => StorageReference._(const [], this); - - Future getMaxDownloadRetryTimeMillis() async { - return await channel.invokeMethod( - "FirebaseStorage#getMaxDownloadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - }); - } - - Future getMaxUploadRetryTimeMillis() async { - return await channel.invokeMethod( - "FirebaseStorage#getMaxUploadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - }); - } - - Future getMaxOperationRetryTimeMillis() async { - return await channel.invokeMethod( - "FirebaseStorage#getMaxOperationRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - }); - } - - Future setMaxDownloadRetryTimeMillis(int time) { - return channel.invokeMethod( - "FirebaseStorage#setMaxDownloadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - 'time': time, - }); - } - - Future setMaxUploadRetryTimeMillis(int time) { - return channel.invokeMethod( - "FirebaseStorage#setMaxUploadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - 'time': time, - }); - } - - Future setMaxOperationRetryTimeMillis(int time) { - return channel.invokeMethod( - "FirebaseStorage#setMaxOperationRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - 'time': time, - }); - } - - /// Creates a [StorageReference] given a gs:// or // URL pointing to a Firebase - /// Storage location. - Future getReferenceFromUrl(String fullUrl) async { - final String path = await channel.invokeMethod( - "FirebaseStorage#getReferenceFromUrl", { - 'app': app?.name, - 'bucket': storageBucket, - 'fullUrl': fullUrl - }); - if (path != null) { - return ref().child(path); - } else { - return null; - } - } -} - -/// TODO: Move into own file and build out progress functionality -class StorageFileDownloadTask { - StorageFileDownloadTask._(this._firebaseStorage, this._path, this._file); - - final FirebaseStorage _firebaseStorage; - final String _path; - final File _file; - - Future _start() async { - final int totalByteCount = await FirebaseStorage.channel.invokeMethod( - "StorageReference#writeToFile", - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'filePath': _file.absolute.path, - 'path': _path, - }, - ); - _completer - .complete(FileDownloadTaskSnapshot(totalByteCount: totalByteCount)); - } - - Completer _completer = - Completer(); - Future get future => _completer.future; -} - -class FileDownloadTaskSnapshot { - FileDownloadTaskSnapshot({this.totalByteCount}); - final int totalByteCount; -} diff --git a/packages/firebase_storage/lib/src/storage_metadata.dart b/packages/firebase_storage/lib/src/storage_metadata.dart deleted file mode 100644 index e452672d7c64..000000000000 --- a/packages/firebase_storage/lib/src/storage_metadata.dart +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2017 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_storage; - -/// Metadata for a [StorageReference]. Metadata stores default attributes such as -/// size and content type. -class StorageMetadata { - StorageMetadata({ - this.cacheControl, - this.contentDisposition, - this.contentEncoding, - this.contentLanguage, - this.contentType, - Map customMetadata, - }) : bucket = null, - generation = null, - metadataGeneration = null, - path = null, - name = null, - sizeBytes = null, - creationTimeMillis = null, - updatedTimeMillis = null, - md5Hash = null, - customMetadata = customMetadata == null - ? null - : Map.unmodifiable(customMetadata); - - StorageMetadata._fromMap(Map map) - : bucket = map['bucket'], - generation = map['generation'], - metadataGeneration = map['metadataGeneration'], - path = map['path'], - name = map['name'], - sizeBytes = map['sizeBytes'], - creationTimeMillis = map['creationTimeMillis'], - updatedTimeMillis = map['updatedTimeMillis'], - md5Hash = map['md5Hash'], - cacheControl = map['cacheControl'], - contentDisposition = map['contentDisposition'], - contentLanguage = map['contentLanguage'], - contentType = map['contentType'], - contentEncoding = map['contentEncoding'], - customMetadata = map['customMetadata'] == null - ? null - : Map.unmodifiable( - map['customMetadata'].cast()); - - /// The owning Google Cloud Storage bucket for the [StorageReference]. - final String bucket; - - /// A version String indicating what version of the [StorageReference]. - final String generation; - - /// A version String indicating the version of this [StorageMetadata]. - final String metadataGeneration; - - /// The path of the [StorageReference] object. - final String path; - - /// A simple name of the [StorageReference] object. - final String name; - - /// The stored Size in bytes of the [StorageReference] object. - final int sizeBytes; - - /// The time the [StorageReference] was created in milliseconds since the epoch. - final int creationTimeMillis; - - /// The time the [StorageReference] was last updated in milliseconds since the epoch. - final int updatedTimeMillis; - - /// The MD5Hash of the [StorageReference] object. - final String md5Hash; - - /// The Cache Control setting of the [StorageReference]. - final String cacheControl; - - /// The content disposition of the [StorageReference]. - final String contentDisposition; - - /// The content encoding for the [StorageReference]. - final String contentEncoding; - - /// The content language for the StorageReference, specified as a 2-letter - /// lowercase language code defined by ISO 639-1. - final String contentLanguage; - - /// The content type (MIME type) of the [StorageReference]. - final String contentType; - - /// An unmodifiable map with custom metadata for the [StorageReference]. - final Map customMetadata; -} diff --git a/packages/firebase_storage/lib/src/storage_reference.dart b/packages/firebase_storage/lib/src/storage_reference.dart deleted file mode 100644 index 71a31ff98464..000000000000 --- a/packages/firebase_storage/lib/src/storage_reference.dart +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2017 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_storage; - -class StorageReference { - const StorageReference._(this._pathComponents, this._firebaseStorage); - - final FirebaseStorage _firebaseStorage; - final List _pathComponents; - - /// Returns a new instance of [StorageReference] pointing to a child - /// location of the current reference. - StorageReference child(String path) { - final List childPath = List.from(_pathComponents) - ..addAll(path.split("/")); - return StorageReference._(childPath, _firebaseStorage); - } - - /// Returns a new instance of [StorageReference] pointing to the parent - /// location or null if this instance references the root location. - StorageReference getParent() { - if (_pathComponents.isEmpty || - _pathComponents.every((String e) => e.isEmpty)) { - return null; - } - - final List parentPath = List.from(_pathComponents); - // Trim for trailing empty path components that can - // come from trailing slashes in the path. - while (parentPath.last.isEmpty) { - parentPath.removeLast(); - } - parentPath.removeLast(); - - return StorageReference._(parentPath, _firebaseStorage); - } - - /// Returns a new instance of [StorageReference] pointing to the root location. - StorageReference getRoot() { - return StorageReference._([], _firebaseStorage); - } - - /// Returns the [FirebaseStorage] service which created this reference. - FirebaseStorage getStorage() { - return _firebaseStorage; - } - - /// This method is deprecated. Please use [putFile] instead. - /// - /// Asynchronously uploads a file to the currently specified - /// [StorageReference], with an optional [metadata]. - @deprecated - StorageUploadTask put(File file, [StorageMetadata metadata]) { - return putFile(file, metadata); - } - - /// Asynchronously uploads a file to the currently specified - /// [StorageReference], with an optional [metadata]. - StorageUploadTask putFile(File file, [StorageMetadata metadata]) { - assert(file.existsSync()); - final _StorageFileUploadTask task = - _StorageFileUploadTask._(file, _firebaseStorage, this, metadata); - task._start(); - return task; - } - - /// Asynchronously uploads byte data to the currently specified - /// [StorageReference], with an optional [metadata]. - StorageUploadTask putData(Uint8List data, [StorageMetadata metadata]) { - final StorageUploadTask task = - _StorageDataUploadTask._(data, _firebaseStorage, this, metadata); - task._start(); - return task; - } - - /// Returns the Google Cloud Storage bucket that holds this object. - Future getBucket() async { - return await FirebaseStorage.channel - .invokeMethod("StorageReference#getBucket", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - } - - /// Returns the full path to this object, not including the Google Cloud - /// Storage bucket. - Future getPath() async { - final String path = await FirebaseStorage.channel - .invokeMethod("StorageReference#getPath", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - - if (path.startsWith('/')) { - return path.substring(1); - } else { - return path; - } - } - - /// Returns the short name of this object. - Future getName() async { - return await FirebaseStorage.channel - .invokeMethod("StorageReference#getName", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - } - - /// Asynchronously downloads the object at the StorageReference to a list in memory. - /// A list of the provided max size will be allocated. - Future getData(int maxSize) async { - return await FirebaseStorage.channel.invokeMethod( - "StorageReference#getData", - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'maxSize': maxSize, - 'path': _pathComponents.join("/"), - }, - ); - } - - /// Asynchronously downloads the object at this [StorageReference] to a - /// specified system file. - StorageFileDownloadTask writeToFile(File file) { - final StorageFileDownloadTask task = StorageFileDownloadTask._( - _firebaseStorage, _pathComponents.join("/"), file); - task._start(); - return task; - } - - /// Asynchronously retrieves a long lived download URL with a revokable token. - /// This can be used to share the file with others, but can be revoked by a - /// developer in the Firebase Console if desired. - Future getDownloadURL() async { - return await FirebaseStorage.channel.invokeMethod( - "StorageReference#getDownloadUrl", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - } - - Future delete() { - return FirebaseStorage.channel - .invokeMethod("StorageReference#delete", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/") - }); - } - - /// Retrieves metadata associated with an object at this [StorageReference]. - Future getMetadata() async { - return StorageMetadata._fromMap(await FirebaseStorage.channel - .invokeMapMethod( - "StorageReference#getMetadata", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - })); - } - - /// Updates the metadata associated with this [StorageReference]. - /// - /// Returns a [Future] that will complete to the updated [StorageMetadata]. - /// - /// This method ignores fields of [metadata] that cannot be set by the public - /// [StorageMetadata] constructor. Writable metadata properties can be deleted - /// by passing the empty string. - Future updateMetadata(StorageMetadata metadata) async { - return StorageMetadata._fromMap(await FirebaseStorage.channel - .invokeMapMethod( - "StorageReference#updateMetadata", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - 'metadata': metadata == null ? null : _buildMetadataUploadMap(metadata), - })); - } - - String get path => _pathComponents.join('/'); -} diff --git a/packages/firebase_storage/lib/src/upload_task.dart b/packages/firebase_storage/lib/src/upload_task.dart deleted file mode 100644 index 70d4f9ebcc61..000000000000 --- a/packages/firebase_storage/lib/src/upload_task.dart +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2017 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_storage; - -abstract class StorageUploadTask { - StorageUploadTask._(this._firebaseStorage, this._ref, this._metadata); - - final FirebaseStorage _firebaseStorage; - final StorageReference _ref; - final StorageMetadata _metadata; - - Future _platformStart(); - - int _handle; - - bool isCanceled = false; - bool isComplete = false; - bool isInProgress = true; - bool isPaused = false; - bool isSuccessful = false; - - StorageTaskSnapshot lastSnapshot; - - /// Returns a last snapshot when completed - Completer _completer = Completer(); - Future get onComplete => _completer.future; - - StreamController _controller = - StreamController.broadcast(); - Stream get events => _controller.stream; - - Future _start() async { - _handle = await _platformStart(); - final StorageTaskEvent event = await _firebaseStorage._methodStream - .where((MethodCall m) { - return m.method == 'StorageTaskEvent' && m.arguments['handle'] == _handle; - }).map((MethodCall m) { - final Map args = m.arguments; - final StorageTaskEvent e = - StorageTaskEvent._(args['type'], _ref, args['snapshot']); - _changeState(e); - lastSnapshot = e.snapshot; - _controller.add(e); - if (e.type == StorageTaskEventType.success || - e.type == StorageTaskEventType.failure) { - _completer.complete(e.snapshot); - } - return e; - }).firstWhere((StorageTaskEvent e) => - e.type == StorageTaskEventType.success || - e.type == StorageTaskEventType.failure); - return event.snapshot; - } - - void _changeState(StorageTaskEvent event) { - _resetState(); - switch (event.type) { - case StorageTaskEventType.progress: - isInProgress = true; - break; - case StorageTaskEventType.resume: - isInProgress = true; - break; - case StorageTaskEventType.pause: - isPaused = true; - break; - case StorageTaskEventType.success: - isSuccessful = true; - isComplete = true; - break; - case StorageTaskEventType.failure: - isComplete = true; - if (event.snapshot.error == StorageError.canceled) { - isCanceled = true; - } - break; - } - } - - void _resetState() { - isCanceled = false; - isComplete = false; - isInProgress = false; - isPaused = false; - isSuccessful = false; - } - - /// Pause the upload - void pause() => FirebaseStorage.channel.invokeMethod( - 'UploadTask#pause', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'handle': _handle, - }, - ); - - /// Resume the upload - void resume() => FirebaseStorage.channel.invokeMethod( - 'UploadTask#resume', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'handle': _handle, - }, - ); - - /// Cancel the upload - void cancel() => FirebaseStorage.channel.invokeMethod( - 'UploadTask#cancel', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'handle': _handle, - }, - ); -} - -class _StorageFileUploadTask extends StorageUploadTask { - _StorageFileUploadTask._(this._file, FirebaseStorage firebaseStorage, - StorageReference ref, StorageMetadata metadata) - : super._(firebaseStorage, ref, metadata); - - final File _file; - - @override - Future _platformStart() { - return FirebaseStorage.channel.invokeMethod( - 'StorageReference#putFile', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'filename': _file.absolute.path, - 'path': _ref.path, - 'metadata': - _metadata == null ? null : _buildMetadataUploadMap(_metadata), - }, - ); - } -} - -class _StorageDataUploadTask extends StorageUploadTask { - _StorageDataUploadTask._(this._bytes, FirebaseStorage firebaseStorage, - StorageReference ref, StorageMetadata metadata) - : super._(firebaseStorage, ref, metadata); - - final Uint8List _bytes; - - @override - Future _platformStart() { - return FirebaseStorage.channel.invokeMethod( - 'StorageReference#putData', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'data': _bytes, - 'path': _ref.path, - 'metadata': - _metadata == null ? null : _buildMetadataUploadMap(_metadata), - }, - ); - } -} - -Map _buildMetadataUploadMap(StorageMetadata metadata) { - return { - 'cacheControl': metadata.cacheControl, - 'contentDisposition': metadata.contentDisposition, - 'contentLanguage': metadata.contentLanguage, - 'contentType': metadata.contentType, - 'contentEncoding': metadata.contentEncoding, - 'customMetadata': metadata.customMetadata, - }; -} diff --git a/packages/firebase_storage/pubspec.yaml b/packages/firebase_storage/pubspec.yaml deleted file mode 100755 index cffac66c8a1b..000000000000 --- a/packages/firebase_storage/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: firebase_storage -description: Flutter plugin for Firebase Cloud Storage, a powerful, simple, and - cost-effective object storage service for Android and iOS. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_storage -version: 3.0.5 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.storage - iosPrefix: FLT - pluginClass: FirebaseStoragePlugin - -dependencies: - flutter: - sdk: flutter - firebase_core: ^0.4.0 - -dev_dependencies: - http: ^0.12.0 - flutter_test: - sdk: flutter - uuid: "^1.0.0" - flutter_driver: - sdk: flutter - test: any - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" diff --git a/packages/firebase_storage/test/firebase_storage_test.dart b/packages/firebase_storage/test/firebase_storage_test.dart deleted file mode 100644 index c03288dade34..000000000000 --- a/packages/firebase_storage/test/firebase_storage_test.dart +++ /dev/null @@ -1,530 +0,0 @@ -// Copyright 2017 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 'dart:typed_data'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_storage/firebase_storage.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('FirebaseStorage', () { - final FirebaseApp app = const FirebaseApp( - name: 'testApp', - ); - final String storageBucket = 'gs://fake-storage-bucket-url.com'; - final FirebaseStorage storage = - FirebaseStorage(app: app, storageBucket: storageBucket); - - group('getMaxDownloadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 1000; - }); - }); - - test('invokes correct method', () async { - await storage.getMaxDownloadRetryTimeMillis(); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#getMaxDownloadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await storage.getMaxDownloadRetryTimeMillis(), 1000); - }); - }); - - group('getMaxUploadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 2000; - }); - }); - - test('invokes correct method', () async { - await storage.getMaxUploadRetryTimeMillis(); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#getMaxUploadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await storage.getMaxUploadRetryTimeMillis(), 2000); - }); - }); - - group('getMaxOperationRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 3000; - }); - }); - - test('invokes correct method', () async { - await storage.getMaxOperationRetryTimeMillis(); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#getMaxOperationRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await storage.getMaxOperationRetryTimeMillis(), 3000); - }); - }); - - group('setMaxDownloadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - }); - }); - - test('invokes correct method', () async { - await storage.setMaxDownloadRetryTimeMillis(1000); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#setMaxDownloadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'time': 1000, - }, - ), - ]); - }); - }); - - group('setMaxUploadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - }); - }); - - test('invokes correct method', () async { - await storage.setMaxUploadRetryTimeMillis(2000); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#setMaxUploadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'time': 2000, - }, - ), - ]); - }); - }); - - group('setMaxOperationRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - }); - }); - - test('invokes correct method', () async { - await storage.setMaxOperationRetryTimeMillis(3000); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#setMaxOperationRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'time': 3000, - }, - ), - ]); - }); - }); - - group('getReferenceFromUrl', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'foo'; - }); - }); - - test('invokes correct method', () async { - final String url = - 'https://firebasestorage.googleapis.com/v0/b/fake-21c50.appspot.com/o/'; - final StorageReference reference = - await storage.getReferenceFromUrl(url); - expect(reference.path, 'foo'); - expect(log, [ - isMethodCall( - 'FirebaseStorage#getReferenceFromUrl', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'fullUrl': url, - }, - ), - ]); - }); - }); - - group('StorageReference', () { - group('getData', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) { - log.add(methodCall); - return Future.value( - Uint8List.fromList([1, 2, 3, 4])); - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getData(10); - - expect(log, [ - isMethodCall( - 'StorageReference#getData', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'maxSize': 10, - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getData(10), - equals(Uint8List.fromList([1, 2, 3, 4]))); - }); - }); - - group('getMetadata', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return {'name': 'image.jpg'}; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getMetadata(); - - expect(log, [ - isMethodCall( - 'StorageReference#getMetadata', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect((await ref.getMetadata()).name, 'image.jpg'); - }); - }); - - group('updateMetadata', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'StorageReference#getMetadata': - return { - 'name': 'image.jpg', - }; - case 'StorageReference#updateMetadata': - return { - 'name': 'image.jpg', - 'contentLanguage': 'en', - 'customMetadata': {'activity': 'test'}, - }; - default: - return null; - } - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.updateMetadata(StorageMetadata( - contentLanguage: 'en', - customMetadata: {'activity': 'test'}, - )); - - expect(log, [ - isMethodCall( - 'StorageReference#updateMetadata', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - 'metadata': { - 'cacheControl': null, - 'contentDisposition': null, - 'contentLanguage': 'en', - 'contentType': null, - 'contentEncoding': null, - 'customMetadata': {'activity': 'test'}, - }, - }, - ), - ]); - }); - - test('returns correct result', () async { - expect((await ref.getMetadata()).contentLanguage, null); - expect( - (await ref.updateMetadata(StorageMetadata(contentLanguage: 'en'))) - .contentLanguage, - 'en'); - }); - }); - - group('getDownloadUrl', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'https://path/to/file'; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getDownloadURL(); - - expect(log, [ - isMethodCall( - 'StorageReference#getDownloadUrl', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getDownloadURL(), 'https://path/to/file'); - }); - }); - - group('delete', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return null; - }); - ref = storage.ref().child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.delete(); - - expect( - log, - [ - isMethodCall( - 'StorageReference#delete', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'image.jpg', - }, - ), - ], - ); - }); - }); - - group('getBucket', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'foo'; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getBucket(); - - expect(log, [ - isMethodCall( - 'StorageReference#getBucket', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getBucket(), 'foo'); - }); - }); - - group('getName', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'image.jpg'; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getName(); - - expect(log, [ - isMethodCall( - 'StorageReference#getName', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getName(), 'image.jpg'); - }); - }); - }); - - group('getPath', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'avatars/large/image.jpg'; - }); - ref = storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getPath(); - - expect(log, [ - isMethodCall( - 'StorageReference#getPath', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getPath(), 'avatars/large/image.jpg'); - }); - }); - }); -} diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index 9cb4b9656c38..4d30ad73e8a1 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -12,7 +12,7 @@ check_changed_packages > /dev/null cd $REPO_DIR/examples/all_plugins flutter clean > /dev/null -(cd "$REPO_DIR" && pub global run flutter_plugin_tools gen-pubspec --exclude firebase_core,firebase_ml_vision) +(cd "$REPO_DIR" && pub global run flutter_plugin_tools gen-pubspec) function error() { echo "$@" 1>&2 From 18352b29020b6460b9e4f7d2102fb60838d052d0 Mon Sep 17 00:00:00 2001 From: Josh Burton Date: Fri, 23 Aug 2019 18:21:48 +1200 Subject: [PATCH 034/133] [google_maps_flutter] Adds support for displaying the traffic layer (#1767) * [google_maps_flutter] Adds support for displaying the traffic layer * [google_maps_flutter] Adds traffic layer tests --- packages/google_maps_flutter/CHANGELOG.md | 4 +++ .../flutter/plugins/googlemaps/Convert.java | 4 +++ .../plugins/googlemaps/GoogleMapBuilder.java | 7 +++++ .../googlemaps/GoogleMapController.java | 11 +++++++ .../googlemaps/GoogleMapOptionsSink.java | 2 ++ .../test_driver/google_map_inspector.dart | 4 +++ .../example/test_driver/google_maps.dart | 25 ++++++++++++++++ .../ios/Classes/GoogleMapController.h | 1 + .../ios/Classes/GoogleMapController.m | 11 +++++++ .../lib/src/google_map.dart | 9 ++++++ packages/google_maps_flutter/pubspec.yaml | 2 +- .../test/fake_maps_controllers.dart | 5 ++++ .../test/google_map_test.dart | 29 +++++++++++++++++++ 13 files changed, 113 insertions(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 1efbd869633a..2f5983e0cbcf 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.20+6 + +* Adds support for toggling the traffic layer + ## 0.5.20+5 * Allow (de-)serialization of CameraPosition diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java index da737bdc15ac..76e14faaf01e 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java @@ -316,6 +316,10 @@ static void interpretGoogleMapOptions(Object o, GoogleMapOptionsSink sink) { if (indoorEnabled != null) { sink.setIndoorEnabled(toBoolean(indoorEnabled)); } + final Object trafficEnabled = data.get("trafficEnabled"); + if (trafficEnabled != null) { + sink.setTrafficEnabled(toBoolean(trafficEnabled)); + } } /** Returns the dartMarkerId of the interpreted marker. */ diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java index 99d3c87a0ebc..651dd3e17198 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapBuilder.java @@ -18,6 +18,7 @@ class GoogleMapBuilder implements GoogleMapOptionsSink { private boolean myLocationEnabled = false; private boolean myLocationButtonEnabled = false; private boolean indoorEnabled = true; + private boolean trafficEnabled = false; private Object initialMarkers; private Object initialPolygons; private Object initialPolylines; @@ -32,6 +33,7 @@ GoogleMapController build( controller.setMyLocationEnabled(myLocationEnabled); controller.setMyLocationButtonEnabled(myLocationButtonEnabled); controller.setIndoorEnabled(indoorEnabled); + controller.setTrafficEnabled(trafficEnabled); controller.setTrackCameraPosition(trackCameraPosition); controller.setInitialMarkers(initialMarkers); controller.setInitialPolygons(initialPolygons); @@ -110,6 +112,11 @@ public void setIndoorEnabled(boolean indoorEnabled) { this.indoorEnabled = indoorEnabled; } + @Override + public void setTrafficEnabled(boolean trafficEnabled) { + this.trafficEnabled = trafficEnabled; + } + @Override public void setMyLocationEnabled(boolean myLocationEnabled) { this.myLocationEnabled = myLocationEnabled; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index 0ce82b29491f..de6a1158023d 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -74,6 +74,7 @@ final class GoogleMapController private boolean myLocationEnabled = false; private boolean myLocationButtonEnabled = false; private boolean indoorEnabled = true; + private boolean trafficEnabled = false; private boolean disposed = false; private final float density; private MethodChannel.Result mapReadyResult; @@ -169,6 +170,7 @@ private CameraPosition getCameraPosition() { public void onMapReady(GoogleMap googleMap) { this.googleMap = googleMap; this.googleMap.setIndoorEnabled(this.indoorEnabled); + this.googleMap.setTrafficEnabled(this.trafficEnabled); googleMap.setOnInfoWindowClickListener(this); if (mapReadyResult != null) { mapReadyResult.success(null); @@ -327,6 +329,11 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { result.success(googleMap.getUiSettings().isMyLocationButtonEnabled()); break; } + case "map#isTrafficEnabled": + { + result.success(googleMap.isTrafficEnabled()); + break; + } case "map#setStyle": { String mapStyle = (String) call.arguments; @@ -664,4 +671,8 @@ private int checkSelfPermission(String permission) { public void setIndoorEnabled(boolean indoorEnabled) { this.indoorEnabled = indoorEnabled; } + + public void setTrafficEnabled(boolean trafficEnabled) { + this.trafficEnabled = trafficEnabled; + } } diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java index 11db124e2997..1f01298a3ce1 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapOptionsSink.java @@ -36,6 +36,8 @@ interface GoogleMapOptionsSink { void setIndoorEnabled(boolean indoorEnabled); + void setTrafficEnabled(boolean trafficEnabled); + void setInitialMarkers(Object initialMarkers); void setInitialPolygons(Object initialPolygons); diff --git a/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart b/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart index b8758dcf8c22..157076bdcdc0 100644 --- a/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart +++ b/packages/google_maps_flutter/example/test_driver/google_map_inspector.dart @@ -49,4 +49,8 @@ class GoogleMapInspector { Future isMyLocationButtonEnabled() async { return await _channel.invokeMethod('map#isMyLocationButtonEnabled'); } + + Future isTrafficEnabled() async { + return await _channel.invokeMethod('map#isTrafficEnabled'); + } } diff --git a/packages/google_maps_flutter/example/test_driver/google_maps.dart b/packages/google_maps_flutter/example/test_driver/google_maps.dart index 2e037603d7ca..6f2eacd49c00 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -375,6 +375,31 @@ void main() { expect(secondVisibleRegion.contains(newCenter), isTrue); }); + test('testTraffic', () async { + final Key key = GlobalKey(); + final Completer inspectorCompleter = + Completer(); + + await pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + trafficEnabled: true, + onMapCreated: (GoogleMapController controller) { + final GoogleMapInspector inspector = + // ignore: invalid_use_of_visible_for_testing_member + GoogleMapInspector(controller.channel); + inspectorCompleter.complete(inspector); + }, + ), + )); + + final GoogleMapInspector inspector = await inspectorCompleter.future; + final bool isTrafficEnabled = await inspector.isTrafficEnabled(); + expect(isTrafficEnabled, true); + }); + test('testMyLocationButtonToggle', () async { final Key key = GlobalKey(); final Completer inspectorCompleter = diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.h b/packages/google_maps_flutter/ios/Classes/GoogleMapController.h index 96025150c3ce..02f444504a6a 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.h +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.h @@ -14,6 +14,7 @@ - (void)setCameraTargetBounds:(GMSCoordinateBounds *)bounds; - (void)setCompassEnabled:(BOOL)enabled; - (void)setIndoorEnabled:(BOOL)enabled; +- (void)setTrafficEnabled:(BOOL)enabled; - (void)setMapType:(GMSMapViewType)type; - (void)setMinZoom:(float)minZoom maxZoom:(float)maxZoom; - (void)setPaddingTop:(float)top left:(float)left bottom:(float)bottom right:(float)right; diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index 38a95ca8d882..600820e0cc0c 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -229,6 +229,9 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { } else if ([call.method isEqualToString:@"map#isMyLocationButtonEnabled"]) { NSNumber* isMyLocationButtonEnabled = @(_mapView.settings.myLocationButton); result(isMyLocationButtonEnabled); + } else if ([call.method isEqualToString:@"map#isTrafficEnabled"]) { + NSNumber* isTrafficEnabled = @(_mapView.trafficEnabled); + result(isTrafficEnabled); } else if ([call.method isEqualToString:@"map#setStyle"]) { NSString* mapStyle = [call arguments]; NSString* error = [self setMapStyle:mapStyle]; @@ -286,6 +289,10 @@ - (void)setIndoorEnabled:(BOOL)enabled { _mapView.indoorEnabled = enabled; } +- (void)setTrafficEnabled:(BOOL)enabled { + _mapView.trafficEnabled = enabled; +} + - (void)setMapType:(GMSMapViewType)mapType { _mapView.mapType = mapType; } @@ -509,6 +516,10 @@ static void InterpretMapOptions(NSDictionary* data, id if (indoorEnabled) { [sink setIndoorEnabled:ToBool(indoorEnabled)]; } + id trafficEnabled = data[@"trafficEnabled"]; + if (trafficEnabled) { + [sink setTrafficEnabled:ToBool(trafficEnabled)]; + } id mapType = data[@"mapType"]; if (mapType) { [sink setMapType:ToMapViewType(mapType)]; diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart index 5c802a2f052f..fa5c3fdac490 100644 --- a/packages/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/lib/src/google_map.dart @@ -35,6 +35,7 @@ class GoogleMap extends StatefulWidget { /// If no padding is specified default padding will be 0. this.padding = const EdgeInsets.all(0), this.indoorViewEnabled = false, + this.trafficEnabled = false, this.markers, this.polygons, this.polylines, @@ -164,6 +165,9 @@ class GoogleMap extends StatefulWidget { /// Enables or disables the indoor view from the map final bool indoorViewEnabled; + /// Enables or disables the traffic layer of the map + final bool trafficEnabled; + /// Which gestures should be consumed by the map. /// /// It is possible for other gesture recognizers to be competing with the map on pointer @@ -372,6 +376,7 @@ class _GoogleMapOptions { this.myLocationButtonEnabled, this.padding, this.indoorViewEnabled, + this.trafficEnabled, }); static _GoogleMapOptions fromWidget(GoogleMap map) { @@ -390,6 +395,7 @@ class _GoogleMapOptions { myLocationButtonEnabled: map.myLocationButtonEnabled, padding: map.padding, indoorViewEnabled: map.indoorViewEnabled, + trafficEnabled: map.trafficEnabled, ); } @@ -421,6 +427,8 @@ class _GoogleMapOptions { final bool indoorViewEnabled; + final bool trafficEnabled; + Map toMap() { final Map optionsMap = {}; @@ -449,6 +457,7 @@ class _GoogleMapOptions { padding?.right, ]); addIfNonNull('indoorEnabled', indoorViewEnabled); + addIfNonNull('trafficEnabled', trafficEnabled); return optionsMap; } diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index b99203fafbd6..7504c1dd41a6 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+5 +version: 0.5.20+6 dependencies: flutter: diff --git a/packages/google_maps_flutter/test/fake_maps_controllers.dart b/packages/google_maps_flutter/test/fake_maps_controllers.dart index 76dbc9d88bb0..d892ea1a7794 100644 --- a/packages/google_maps_flutter/test/fake_maps_controllers.dart +++ b/packages/google_maps_flutter/test/fake_maps_controllers.dart @@ -47,6 +47,8 @@ class FakePlatformGoogleMap { bool myLocationEnabled; + bool trafficEnabled; + bool myLocationButtonEnabled; List padding; @@ -341,6 +343,9 @@ class FakePlatformGoogleMap { if (options.containsKey('myLocationButtonEnabled')) { myLocationButtonEnabled = options['myLocationButtonEnabled']; } + if (options.containsKey('trafficEnabled')) { + trafficEnabled = options['trafficEnabled']; + } if (options.containsKey('padding')) { padding = options['padding']; } diff --git a/packages/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/test/google_map_test.dart index e745c15ad181..41e1fe114488 100644 --- a/packages/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/test/google_map_test.dart @@ -498,4 +498,33 @@ void main() { expect(platformGoogleMap.padding, [60, 50, 80, 70]); }); + + testWidgets('Can update traffic', (WidgetTester tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + trafficEnabled: false, + ), + ), + ); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + + expect(platformGoogleMap.trafficEnabled, false); + + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(10.0, 15.0)), + trafficEnabled: true, + ), + ), + ); + + expect(platformGoogleMap.trafficEnabled, true); + }); } From 7f37ed55b4617251b49d6f3367c366c7155ab757 Mon Sep 17 00:00:00 2001 From: John McDole Date: Fri, 23 Aug 2019 12:55:33 -0700 Subject: [PATCH 035/133] [video_player] Added `formatHint` to to override video format on Android (#2003) Solve: flutter/flutter#39076 --- packages/video_player/CHANGELOG.md | 4 ++ .../videoplayer/VideoPlayerPlugin.java | 47 ++++++++++++++++--- packages/video_player/lib/video_player.dart | 22 ++++++++- packages/video_player/pubspec.yaml | 2 +- .../video_player/test/video_player_test.dart | 3 ++ 5 files changed, 68 insertions(+), 10 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index 795d97fdb960..abf41afcfbb0 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.2 + +* **Android Only** Adds optional VideoFormat used to signal what format the plugin should try. + ## 0.10.1+7 * Fix tests by ignoring deprecated member use. diff --git a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java index 0be5e770101c..50c26d460fb3 100644 --- a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java +++ b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java @@ -53,6 +53,10 @@ public class VideoPlayerPlugin implements MethodCallHandler { private static class VideoPlayer { + private static final String FORMAT_SS = "ss"; + private static final String FORMAT_DASH = "dash"; + private static final String FORMAT_HLS = "hls"; + private static final String FORMAT_OTHER = "other"; private SimpleExoPlayer exoPlayer; @@ -71,7 +75,8 @@ private static class VideoPlayer { EventChannel eventChannel, TextureRegistry.SurfaceTextureEntry textureEntry, String dataSource, - Result result) { + Result result, + String formatHint) { this.eventChannel = eventChannel; this.textureEntry = textureEntry; @@ -93,7 +98,7 @@ private static class VideoPlayer { true); } - MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, context); + MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); exoPlayer.prepare(mediaSource); setupVideoPlayer(eventChannel, textureEntry, result); @@ -108,8 +113,29 @@ private static boolean isFileOrAsset(Uri uri) { } private MediaSource buildMediaSource( - Uri uri, DataSource.Factory mediaDataSourceFactory, Context context) { - int type = Util.inferContentType(uri.getLastPathSegment()); + Uri uri, DataSource.Factory mediaDataSourceFactory, String formatHint, Context context) { + int type; + if (formatHint == null) { + type = Util.inferContentType(uri.getLastPathSegment()); + } else { + switch (formatHint) { + case FORMAT_SS: + type = C.TYPE_SS; + break; + case FORMAT_DASH: + type = C.TYPE_DASH; + break; + case FORMAT_HLS: + type = C.TYPE_HLS; + break; + case FORMAT_OTHER: + type = C.TYPE_OTHER; + break; + default: + type = -1; + break; + } + } switch (type) { case C.TYPE_SS: return new SsMediaSource.Factory( @@ -303,7 +329,8 @@ private void disposeAllPlayers() { } private void onDestroy() { - // The whole FlutterView is being destroyed. Here we release resources acquired for all instances + // The whole FlutterView is being destroyed. Here we release resources acquired for all + // instances // of VideoPlayer. Once https://github.com/flutter/flutter/issues/19358 is resolved this may // be replaced with just asserting that videoPlayers.isEmpty(). // https://github.com/flutter/flutter/issues/20989 tracks this. @@ -343,12 +370,18 @@ public void onMethodCall(MethodCall call, Result result) { eventChannel, handle, "asset:///" + assetLookupKey, - result); + result, + null); videoPlayers.put(handle.id(), player); } else { player = new VideoPlayer( - registrar.context(), eventChannel, handle, call.argument("uri"), result); + registrar.context(), + eventChannel, + handle, + call.argument("uri"), + result, + call.argument("formatHint")); videoPlayers.put(handle.id(), player); } break; diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index 3990f53f0d1d..059799b017b3 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -32,6 +32,8 @@ class DurationRange { String toString() => '$runtimeType(start: $start, end: $end)'; } +enum VideoFormat { dash, hls, ss, other } + /// The duration, current position, buffering state, error state and settings /// of a [VideoPlayerController]. class VideoPlayerValue { @@ -148,6 +150,7 @@ class VideoPlayerController extends ValueNotifier { /// package and null otherwise. VideoPlayerController.asset(this.dataSource, {this.package}) : dataSourceType = DataSourceType.asset, + formatHint = null, super(VideoPlayerValue(duration: null)); /// Constructs a [VideoPlayerController] playing a video from obtained from @@ -155,7 +158,9 @@ class VideoPlayerController extends ValueNotifier { /// /// The URI for the video is given by the [dataSource] argument and must not be /// null. - VideoPlayerController.network(this.dataSource) + /// **Android only**: The [formatHint] option allows the caller to override + /// the video format detection code. + VideoPlayerController.network(this.dataSource, {this.formatHint}) : dataSourceType = DataSourceType.network, package = null, super(VideoPlayerValue(duration: null)); @@ -168,10 +173,12 @@ class VideoPlayerController extends ValueNotifier { : dataSource = 'file://${file.path}', dataSourceType = DataSourceType.file, package = null, + formatHint = null, super(VideoPlayerValue(duration: null)); int _textureId; final String dataSource; + final VideoFormat formatHint; /// Describes the type of data source this [VideoPlayerController] /// is constructed with. @@ -203,7 +210,10 @@ class VideoPlayerController extends ValueNotifier { dataSourceDescription = {'uri': dataSource}; break; case DataSourceType.file: - dataSourceDescription = {'uri': dataSource}; + dataSourceDescription = { + 'uri': dataSource, + 'formatHint': _videoFormatStringMap[formatHint] + }; } final Map response = await _channel.invokeMapMethod( @@ -397,6 +407,14 @@ class VideoPlayerController extends ValueNotifier { value = value.copyWith(volume: volume.clamp(0.0, 1.0)); await _applyVolume(); } + + static const Map _videoFormatStringMap = + { + VideoFormat.ss: 'ss', + VideoFormat.hls: 'hls', + VideoFormat.dash: 'dash', + VideoFormat.other: 'other', + }; } class _VideoAppLifeCycleObserver extends Object with WidgetsBindingObserver { diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 72ec7fa55b62..3c18e734c964 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.1+7 +version: 0.10.2 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: diff --git a/packages/video_player/test/video_player_test.dart b/packages/video_player/test/video_player_test.dart index 0bdcb756b711..f482f0b63cd3 100644 --- a/packages/video_player/test/video_player_test.dart +++ b/packages/video_player/test/video_player_test.dart @@ -41,6 +41,9 @@ class FakeController extends ValueNotifier Future play() async {} @override Future setLooping(bool looping) async {} + + @override + VideoFormat get formatHint => null; } void main() { From ffe12d45eb5dc8f738e9dda6f24e890918e08ad1 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Fri, 23 Aug 2019 14:28:45 -0700 Subject: [PATCH 036/133] Fix tests after breaking change https://github.com/flutter/flutter/pull/38464 (#2005) --- packages/camera/test/camera_test.dart | 2 ++ packages/camera/test/support_android/support_android_test.dart | 2 ++ packages/connectivity/test/connectivity_test.dart | 2 ++ packages/google_maps_flutter/test/circle_updates_test.dart | 2 ++ packages/google_maps_flutter/test/google_map_test.dart | 2 ++ packages/google_maps_flutter/test/marker_updates_test.dart | 2 ++ packages/google_maps_flutter/test/polygon_updates_test.dart | 2 ++ packages/google_maps_flutter/test/polyline_updates_test.dart | 2 ++ packages/google_sign_in/test/google_sign_in_test.dart | 2 ++ packages/image_picker/test/image_picker_test.dart | 2 ++ .../billing_client_wrappers/billing_client_wrapper_test.dart | 2 ++ .../in_app_purchase_connection/app_store_connection_test.dart | 3 +++ .../google_play_connection_test.dart | 3 +++ .../test/store_kit_wrappers/sk_methodchannel_apis_test.dart | 2 ++ packages/path_provider/test/path_provider_test.dart | 2 ++ packages/quick_actions/test/quick_actions_test.dart | 2 ++ packages/share/test/share_test.dart | 3 +++ packages/shared_preferences/test/shared_preferences_test.dart | 2 ++ packages/url_launcher/test/url_launcher_test.dart | 2 ++ packages/webview_flutter/test/webview_flutter_test.dart | 2 ++ 20 files changed, 43 insertions(+) diff --git a/packages/camera/test/camera_test.dart b/packages/camera/test/camera_test.dart index 39b08ecd8020..fbb955689e48 100644 --- a/packages/camera/test/camera_test.dart +++ b/packages/camera/test/camera_test.dart @@ -9,6 +9,8 @@ import 'package:camera/new/src/camera_testing.dart'; import 'package:camera/new/src/common/native_texture.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + group('Camera', () { final List log = []; diff --git a/packages/camera/test/support_android/support_android_test.dart b/packages/camera/test/support_android/support_android_test.dart index 114f56ab3348..399acd3698ce 100644 --- a/packages/camera/test/support_android/support_android_test.dart +++ b/packages/camera/test/support_android/support_android_test.dart @@ -9,6 +9,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:camera/new/src/camera_testing.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + group('Support Android Camera', () { group('$Camera', () { final List log = []; diff --git a/packages/connectivity/test/connectivity_test.dart b/packages/connectivity/test/connectivity_test.dart index 9bfe0fb89abb..311926b8b963 100644 --- a/packages/connectivity/test/connectivity_test.dart +++ b/packages/connectivity/test/connectivity_test.dart @@ -7,6 +7,8 @@ import 'package:connectivity/connectivity.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + group('$Connectivity', () { final List log = []; diff --git a/packages/google_maps_flutter/test/circle_updates_test.dart b/packages/google_maps_flutter/test/circle_updates_test.dart index fe7620571443..4a3f14134e34 100644 --- a/packages/google_maps_flutter/test/circle_updates_test.dart +++ b/packages/google_maps_flutter/test/circle_updates_test.dart @@ -34,6 +34,8 @@ Widget _mapWithCircles(Set circles) { } void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final FakePlatformViewsController fakePlatformViewsController = FakePlatformViewsController(); diff --git a/packages/google_maps_flutter/test/google_map_test.dart b/packages/google_maps_flutter/test/google_map_test.dart index 41e1fe114488..e14c70cc1ba6 100644 --- a/packages/google_maps_flutter/test/google_map_test.dart +++ b/packages/google_maps_flutter/test/google_map_test.dart @@ -10,6 +10,8 @@ import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'fake_maps_controllers.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final FakePlatformViewsController fakePlatformViewsController = FakePlatformViewsController(); diff --git a/packages/google_maps_flutter/test/marker_updates_test.dart b/packages/google_maps_flutter/test/marker_updates_test.dart index f43fcfa52408..cb5731d72875 100644 --- a/packages/google_maps_flutter/test/marker_updates_test.dart +++ b/packages/google_maps_flutter/test/marker_updates_test.dart @@ -34,6 +34,8 @@ Widget _mapWithMarkers(Set markers) { } void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final FakePlatformViewsController fakePlatformViewsController = FakePlatformViewsController(); diff --git a/packages/google_maps_flutter/test/polygon_updates_test.dart b/packages/google_maps_flutter/test/polygon_updates_test.dart index f7b2c1cb8286..77f096b70484 100644 --- a/packages/google_maps_flutter/test/polygon_updates_test.dart +++ b/packages/google_maps_flutter/test/polygon_updates_test.dart @@ -34,6 +34,8 @@ Widget _mapWithPolygons(Set polygons) { } void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final FakePlatformViewsController fakePlatformViewsController = FakePlatformViewsController(); diff --git a/packages/google_maps_flutter/test/polyline_updates_test.dart b/packages/google_maps_flutter/test/polyline_updates_test.dart index 1d04aef485fb..6946df4c05ee 100644 --- a/packages/google_maps_flutter/test/polyline_updates_test.dart +++ b/packages/google_maps_flutter/test/polyline_updates_test.dart @@ -34,6 +34,8 @@ Widget _mapWithPolylines(Set polylines) { } void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final FakePlatformViewsController fakePlatformViewsController = FakePlatformViewsController(); diff --git a/packages/google_sign_in/test/google_sign_in_test.dart b/packages/google_sign_in/test/google_sign_in_test.dart index b2ae89a0e886..dab480a4cce4 100755 --- a/packages/google_sign_in/test/google_sign_in_test.dart +++ b/packages/google_sign_in/test/google_sign_in_test.dart @@ -10,6 +10,8 @@ import 'package:google_sign_in/google_sign_in.dart'; import 'package:google_sign_in/testing.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + group('GoogleSignIn', () { const MethodChannel channel = MethodChannel( 'plugins.flutter.io/google_sign_in', diff --git a/packages/image_picker/test/image_picker_test.dart b/packages/image_picker/test/image_picker_test.dart index 78e818538c4a..1a40e11d76e1 100644 --- a/packages/image_picker/test/image_picker_test.dart +++ b/packages/image_picker/test/image_picker_test.dart @@ -7,6 +7,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:image_picker/image_picker.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + group('$ImagePicker', () { const MethodChannel channel = MethodChannel('plugins.flutter.io/image_picker'); diff --git a/packages/in_app_purchase/test/billing_client_wrappers/billing_client_wrapper_test.dart b/packages/in_app_purchase/test/billing_client_wrappers/billing_client_wrapper_test.dart index f5c5a5b8a73c..818250607ed7 100644 --- a/packages/in_app_purchase/test/billing_client_wrappers/billing_client_wrapper_test.dart +++ b/packages/in_app_purchase/test/billing_client_wrappers/billing_client_wrapper_test.dart @@ -13,6 +13,8 @@ import 'sku_details_wrapper_test.dart'; import 'purchase_wrapper_test.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final StubInAppPurchasePlatform stubPlatform = StubInAppPurchasePlatform(); BillingClient billingClient; diff --git a/packages/in_app_purchase/test/in_app_purchase_connection/app_store_connection_test.dart b/packages/in_app_purchase/test/in_app_purchase_connection/app_store_connection_test.dart index f54a58fbe176..ae24167b6a7c 100644 --- a/packages/in_app_purchase/test/in_app_purchase_connection/app_store_connection_test.dart +++ b/packages/in_app_purchase/test/in_app_purchase_connection/app_store_connection_test.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart' show TestWidgetsFlutterBinding; import 'package:in_app_purchase/src/in_app_purchase/purchase_details.dart'; import 'package:test/test.dart'; @@ -17,6 +18,8 @@ import 'package:in_app_purchase/store_kit_wrappers.dart'; import '../store_kit_wrappers/sk_test_stub_objects.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final FakeIOSPlatform fakeIOSPlatform = FakeIOSPlatform(); setUpAll(() { diff --git a/packages/in_app_purchase/test/in_app_purchase_connection/google_play_connection_test.dart b/packages/in_app_purchase/test/in_app_purchase_connection/google_play_connection_test.dart index 68a62c51d726..512664a24af0 100644 --- a/packages/in_app_purchase/test/in_app_purchase_connection/google_play_connection_test.dart +++ b/packages/in_app_purchase/test/in_app_purchase_connection/google_play_connection_test.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart' show TestWidgetsFlutterBinding; import 'package:in_app_purchase/src/in_app_purchase/purchase_details.dart'; import 'package:test/test.dart'; @@ -20,6 +21,8 @@ import '../billing_client_wrappers/sku_details_wrapper_test.dart'; import '../billing_client_wrappers/purchase_wrapper_test.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final StubInAppPurchasePlatform stubPlatform = StubInAppPurchasePlatform(); GooglePlayConnection connection; const String startConnectionCall = diff --git a/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart b/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart index f644e6f66ff1..bb40edc0fd15 100644 --- a/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart +++ b/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart @@ -9,6 +9,8 @@ import 'package:in_app_purchase/store_kit_wrappers.dart'; import 'sk_test_stub_objects.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final FakeIOSPlatform fakeIOSPlatform = FakeIOSPlatform(); setUpAll(() { diff --git a/packages/path_provider/test/path_provider_test.dart b/packages/path_provider/test/path_provider_test.dart index 9da5a2568a9a..ec02cf8bbb0e 100644 --- a/packages/path_provider/test/path_provider_test.dart +++ b/packages/path_provider/test/path_provider_test.dart @@ -9,6 +9,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:path_provider/path_provider.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + const MethodChannel channel = MethodChannel('plugins.flutter.io/path_provider'); final List log = []; diff --git a/packages/quick_actions/test/quick_actions_test.dart b/packages/quick_actions/test/quick_actions_test.dart index 115efc5786aa..98a412e3e06d 100644 --- a/packages/quick_actions/test/quick_actions_test.dart +++ b/packages/quick_actions/test/quick_actions_test.dart @@ -6,6 +6,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:quick_actions/quick_actions.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + QuickActions quickActions; final List log = []; diff --git a/packages/share/test/share_test.dart b/packages/share/test/share_test.dart index 48df12cffa1c..697e0925708a 100644 --- a/packages/share/test/share_test.dart +++ b/packages/share/test/share_test.dart @@ -4,6 +4,7 @@ import 'dart:ui'; +import 'package:flutter_test/flutter_test.dart' show TestWidgetsFlutterBinding; import 'package:mockito/mockito.dart'; import 'package:share/share.dart'; import 'package:test/test.dart'; @@ -11,6 +12,8 @@ import 'package:test/test.dart'; import 'package:flutter/services.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + MockMethodChannel mockChannel; setUp(() { diff --git a/packages/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/test/shared_preferences_test.dart index c0d9068204c9..8ebcb96c0ad8 100755 --- a/packages/shared_preferences/test/shared_preferences_test.dart +++ b/packages/shared_preferences/test/shared_preferences_test.dart @@ -7,6 +7,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + group('$SharedPreferences', () { const MethodChannel channel = MethodChannel( 'plugins.flutter.io/shared_preferences', diff --git a/packages/url_launcher/test/url_launcher_test.dart b/packages/url_launcher/test/url_launcher_test.dart index 93f4acf71601..a70392810f86 100644 --- a/packages/url_launcher/test/url_launcher_test.dart +++ b/packages/url_launcher/test/url_launcher_test.dart @@ -7,6 +7,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:url_launcher/url_launcher.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + const MethodChannel channel = MethodChannel('plugins.flutter.io/url_launcher'); final List log = []; diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 6907436b24a2..d3f289018073 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -16,6 +16,8 @@ import 'package:webview_flutter/webview_flutter.dart'; typedef void VoidCallback(); void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final _FakePlatformViewsController fakePlatformViewsController = _FakePlatformViewsController(); From 6b5e01b7857589c2f25f152e6643c3ea56ceb2de Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Sat, 24 Aug 2019 10:04:18 -0700 Subject: [PATCH 037/133] [Image_picker] fix `retrieveImage` breakage, added tests. (#2010) --- packages/image_picker/CHANGELOG.md | 5 + .../plugins/imagepicker/ImagePickerCache.java | 13 +- .../imagepicker/ImagePickerCacheTest.java | 118 ++++++++++++++++++ packages/image_picker/pubspec.yaml | 2 +- 4 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index 40af08bff32b..78d44e594eb5 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.6.1+4 + +* Android: Fix a regression where the `retrieveLostImage` does not work anymore. +* Set up Android unit test to test `ImagePickerCache` and added image quality caching tests. + ## 0.6.1+3 * Bugfix iOS: Fix orientation of the picked image after scaling. diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java index 4d6f452cf444..45ba6de0ee6b 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerCache.java @@ -8,6 +8,7 @@ import android.content.SharedPreferences; import android.net.Uri; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import io.flutter.plugin.common.MethodCall; import java.util.HashMap; import java.util.Map; @@ -27,14 +28,20 @@ class ImagePickerCache { private static final String SHARED_PREFERENCE_ERROR_CODE_KEY = "flutter_image_picker_error_code"; private static final String SHARED_PREFERENCE_ERROR_MESSAGE_KEY = "flutter_image_picker_error_message"; + private static final String SHARED_PREFERENCE_MAX_WIDTH_KEY = "flutter_image_picker_max_width"; + private static final String SHARED_PREFERENCE_MAX_HEIGHT_KEY = "flutter_image_picker_max_height"; + private static final String SHARED_PREFERENCE_IMAGE_QUALITY_KEY = "flutter_image_picker_image_quality"; + private static final String SHARED_PREFERENCE_TYPE_KEY = "flutter_image_picker_type"; private static final String SHARED_PREFERENCE_PENDING_IMAGE_URI_PATH_KEY = "flutter_image_picker_pending_image_uri"; - private static final String SHARED_PREFERENCES_NAME = "flutter_image_picker_shared_preference"; + + @VisibleForTesting + static final String SHARED_PREFERENCES_NAME = "flutter_image_picker_shared_preference"; private SharedPreferences prefs; @@ -147,9 +154,9 @@ Map getCacheMap() { } if (prefs.contains(SHARED_PREFERENCE_IMAGE_QUALITY_KEY)) { final int imageQuality = prefs.getInt(SHARED_PREFERENCE_IMAGE_QUALITY_KEY, 100); - resultMap.put(MAP_KEY_MAX_HEIGHT, imageQuality); + resultMap.put(MAP_KEY_IMAGE_QUALITY, imageQuality); } else { - resultMap.put(MAP_KEY_MAX_HEIGHT, 100); + resultMap.put(MAP_KEY_IMAGE_QUALITY, 100); } } diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java new file mode 100644 index 000000000000..8e89a15abc8e --- /dev/null +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerCacheTest.java @@ -0,0 +1,118 @@ +// Copyright 2019 The Flutter 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.imagepicker; + +import static io.flutter.plugins.imagepicker.ImagePickerCache.MAP_KEY_IMAGE_QUALITY; +import static io.flutter.plugins.imagepicker.ImagePickerCache.SHARED_PREFERENCES_NAME; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import io.flutter.plugin.common.MethodCall; +import java.util.HashMap; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class ImagePickerCacheTest { + private static final double WIDTH = 10.0; + private static final double HEIGHT = 10.0; + private static final int IMAGE_QUALITY = 90; + private static final String PATH = "a_mock_path"; + + @Mock Activity mockActivity; + @Mock SharedPreferences mockPreference; + @Mock SharedPreferences.Editor mockEditor; + @Mock MethodCall mockMethodCall; + + static Map preferenceStorage; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + preferenceStorage = new HashMap(); + when(mockActivity.getPackageName()).thenReturn("com.example.test"); + when(mockActivity.getPackageManager()).thenReturn(mock(PackageManager.class)); + when(mockActivity.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)) + .thenReturn(mockPreference); + when(mockPreference.edit()).thenReturn(mockEditor); + when(mockEditor.putInt(any(String.class), any(int.class))) + .then( + i -> { + preferenceStorage.put(i.getArgument(0), i.getArgument(1)); + return mockEditor; + }); + when(mockEditor.putLong(any(String.class), any(long.class))) + .then( + i -> { + preferenceStorage.put(i.getArgument(0), i.getArgument(1)); + return mockEditor; + }); + when(mockEditor.putString(any(String.class), any(String.class))) + .then( + i -> { + preferenceStorage.put(i.getArgument(0), i.getArgument(1)); + return mockEditor; + }); + + when(mockPreference.getInt(any(String.class), any(int.class))) + .then( + i -> { + int result = + (int) + ((preferenceStorage.get(i.getArgument(0)) != null) + ? preferenceStorage.get(i.getArgument(0)) + : i.getArgument(1)); + return result; + }); + when(mockPreference.getLong(any(String.class), any(long.class))) + .then( + i -> { + long result = + (long) + ((preferenceStorage.get(i.getArgument(0)) != null) + ? preferenceStorage.get(i.getArgument(0)) + : i.getArgument(1)); + return result; + }); + when(mockPreference.getString(any(String.class), any(String.class))) + .then( + i -> { + String result = + (String) + ((preferenceStorage.get(i.getArgument(0)) != null) + ? preferenceStorage.get(i.getArgument(0)) + : i.getArgument(1)); + return result; + }); + + when(mockPreference.contains(any(String.class))).thenReturn(true); + } + + @Test + public void ImageCache_ShouldBeAbleToSetAndGetQuality() { + when(mockMethodCall.argument(MAP_KEY_IMAGE_QUALITY)).thenReturn(IMAGE_QUALITY); + ImagePickerCache cache = new ImagePickerCache(mockActivity); + cache.saveDimensionWithMethodCall(mockMethodCall); + Map resultMap = cache.getCacheMap(); + int imageQuality = (int) resultMap.get(cache.MAP_KEY_IMAGE_QUALITY); + assertThat(imageQuality, equalTo(IMAGE_QUALITY)); + + when(mockMethodCall.argument(MAP_KEY_IMAGE_QUALITY)).thenReturn(null); + cache.saveDimensionWithMethodCall(mockMethodCall); + Map resultMapWithDefaultQuality = cache.getCacheMap(); + int defaultImageQuality = (int) resultMapWithDefaultQuality.get(cache.MAP_KEY_IMAGE_QUALITY); + assertThat(defaultImageQuality, equalTo(100)); + } +} diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index b85cd9039b53..c5d1647bb410 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -5,7 +5,7 @@ authors: - Flutter Team - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.1+3 +version: 0.6.1+4 flutter: plugin: From e168ef575a5b5add8b3619b8b6c1fea09b81d19b Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Sat, 24 Aug 2019 11:25:45 -0700 Subject: [PATCH 038/133] Fix unit test for sensors (#2009) --- packages/sensors/test/sensors_test.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/sensors/test/sensors_test.dart b/packages/sensors/test/sensors_test.dart index d95e788e2106..603f805386fd 100644 --- a/packages/sensors/test/sensors_test.dart +++ b/packages/sensors/test/sensors_test.dart @@ -6,10 +6,13 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart' show TestWidgetsFlutterBinding; import 'package:sensors/sensors.dart'; import 'package:test/test.dart'; void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + test('$accelerometerEvents are streamed', () async { const String channelName = 'plugins.flutter.io/sensors/accelerometer'; const List sensorData = [1.0, 2.0, 3.0]; From 5f60b5a878a86f770f101b3e80dd01d8001de170 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 26 Aug 2019 15:52:11 -0700 Subject: [PATCH 039/133] [google_sign_in] Use implementation rather than api dependencies for plugin third-party dependencies. (#2015) * Use implementation rather than API dependencies for google_sign_in --- packages/google_sign_in/CHANGELOG.md | 5 +++++ packages/google_sign_in/android/build.gradle | 2 +- packages/google_sign_in/pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/google_sign_in/CHANGELOG.md b/packages/google_sign_in/CHANGELOG.md index 13aafeea58af..92bf3230e06c 100644 --- a/packages/google_sign_in/CHANGELOG.md +++ b/packages/google_sign_in/CHANGELOG.md @@ -1,3 +1,8 @@ +## 4.0.7 + +* Switch from using `api` to `implementation` for dependency on `play-services-auth`, + preventing version mismatch build failures in some Android configurations. + ## 4.0.6 * Fixed the `PlatformException` leaking from `catchError()` in debug mode. diff --git a/packages/google_sign_in/android/build.gradle b/packages/google_sign_in/android/build.gradle index 9162c3080e50..cb7227abc3f7 100755 --- a/packages/google_sign_in/android/build.gradle +++ b/packages/google_sign_in/android/build.gradle @@ -47,6 +47,6 @@ android { } dependencies { - api 'com.google.android.gms:play-services-auth:16.0.1' + implementation 'com.google.android.gms:play-services-auth:16.0.1' implementation 'com.google.guava:guava:20.0' } diff --git a/packages/google_sign_in/pubspec.yaml b/packages/google_sign_in/pubspec.yaml index ee5ad7e3f861..6ed758895bf7 100755 --- a/packages/google_sign_in/pubspec.yaml +++ b/packages/google_sign_in/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Google Sign-In, a secure authentication system for signing in with a Google account on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in -version: 4.0.6 +version: 4.0.7 flutter: plugin: From f02aab8103e27a379fa544559a4a05c31b63693c Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 13:47:59 -0700 Subject: [PATCH 040/133] [instrumentation_adapter] enable Firebase Test Lab Android testing (#1866) This pull request adds Firebase Test Lab Android instrumentation test adapter to the first-party plugins repo. Using the plugin requires calling `InstrumentationAdapterFlutterBinding.ensureInitialized` and using `testWidgets` rather than `test`. Furthermore, a Java test file must be added to the androidTest folder. Examples of this will be provided in a subsequent PR. Ultimately I'd like to refactor the common functionality into engine and see the "flutter create" template include the boilerplate files for running instrumentation tests automatically, but first we need to try them out a bit with plugins and iterate on usability. So I've put the functionality into a plugin. Joint work with @digiter --- .ci/Dockerfile | 3 +- .cirrus.yml | 8 --- CONTRIBUTING.md | 9 +++- packages/instrumentation_adapter/.gitignore | 7 +++ packages/instrumentation_adapter/.metadata | 10 ++++ packages/instrumentation_adapter/CHANGELOG.md | 3 ++ packages/instrumentation_adapter/LICENSE | 27 ++++++++++ packages/instrumentation_adapter/README.md | 45 ++++++++++++++++ .../android/.gitignore | 8 +++ .../android/build.gradle | 41 ++++++++++++++ .../android/gradle.properties | 2 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 ++ .../instrumentationadapter/FlutterRunner.java | 53 +++++++++++++++++++ .../instrumentationadapter/FlutterTest.java | 9 ++++ .../InstrumentationAdapterPlugin.java | 38 +++++++++++++ .../lib/instrumentation_adapter.dart | 48 +++++++++++++++++ packages/instrumentation_adapter/pubspec.yaml | 19 +++++++ script/build_all_plugins_app.sh | 2 +- 19 files changed, 324 insertions(+), 12 deletions(-) create mode 100644 packages/instrumentation_adapter/.gitignore create mode 100644 packages/instrumentation_adapter/.metadata create mode 100644 packages/instrumentation_adapter/CHANGELOG.md create mode 100644 packages/instrumentation_adapter/LICENSE create mode 100644 packages/instrumentation_adapter/README.md create mode 100644 packages/instrumentation_adapter/android/.gitignore create mode 100644 packages/instrumentation_adapter/android/build.gradle create mode 100644 packages/instrumentation_adapter/android/gradle.properties create mode 100644 packages/instrumentation_adapter/android/settings.gradle create mode 100644 packages/instrumentation_adapter/android/src/main/AndroidManifest.xml create mode 100644 packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java create mode 100644 packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java create mode 100644 packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java create mode 100644 packages/instrumentation_adapter/lib/instrumentation_adapter.dart create mode 100644 packages/instrumentation_adapter/pubspec.yaml diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 09db02e8967e..324a2b97615f 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -5,7 +5,6 @@ RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ "extras;google;m2repository" \ - "extras;android;m2repository" \ - "system-images;android-21;default;armeabi-v7a" + "extras;android;m2repository" RUN yes | sdkmanager --licenses diff --git a/.cirrus.yml b/.cirrus.yml index 6735d0b62e7d..02c7551b3500 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -30,11 +30,6 @@ task: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] - create_device_script: - echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" - start_emulator_background_script: - - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window - wait_for_emulator_script: adb wait-for-device script: # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. @@ -48,9 +43,6 @@ task: - export CIRRUS_COMMIT_MESSAGE="" - ./script/incremental_build.sh build-examples --apk - ./script/incremental_build.sh java-test # must come after apk build - # TODO(jackson): Re-enable once Android emulators support Firebase - # https://github.com/flutter/flutter/issues/29571 - # - ./script/incremental_build.sh drive-examples - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 936b5b921ebf..e6e3e957af29 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,13 +50,20 @@ To run the unit tests: flutter test test/_test.dart ``` -To run the integration tests: +To run the integration tests using Flutter driver: ``` cd example flutter drive test/.dart ``` +To run integration tests as instrumentation tests on a local Android device: + +``` +cd example +(cd android && ./gradlew -Ptarget=$(pwd)/../test_live/_test.dart connectedAndroidTest) +``` + ## Contributing code We gladly accept contributions via GitHub pull requests. diff --git a/packages/instrumentation_adapter/.gitignore b/packages/instrumentation_adapter/.gitignore new file mode 100644 index 000000000000..e9dc58d3d6e2 --- /dev/null +++ b/packages/instrumentation_adapter/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ diff --git a/packages/instrumentation_adapter/.metadata b/packages/instrumentation_adapter/.metadata new file mode 100644 index 000000000000..2b43f17e4faa --- /dev/null +++ b/packages/instrumentation_adapter/.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: 3374ee380b499d99c50ed6dfdd45510aa8318741 + channel: master + +project_type: plugin diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md new file mode 100644 index 000000000000..29f648fd17f1 --- /dev/null +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* Initial release diff --git a/packages/instrumentation_adapter/LICENSE b/packages/instrumentation_adapter/LICENSE new file mode 100644 index 000000000000..0c382ce171cc --- /dev/null +++ b/packages/instrumentation_adapter/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2019 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. diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md new file mode 100644 index 000000000000..b2a65bd84a46 --- /dev/null +++ b/packages/instrumentation_adapter/README.md @@ -0,0 +1,45 @@ +# instrumentation_adapter + +Adapts flutter_test results as Android instrumentation tests, making them usable for Firebase Test Lab and other Android CI providers. + +iOS support is not available yet, but is planned in the future. + +## Usage + +Add a dependency on the `instrumentation_adapter` package in the `dev_dependencies` section of pubspec.yaml. For plugins, do this in the pubspec.yaml of the example app. + +Invoke `InstrumentationAdapterFlutterBinding.ensureInitialized()` at the start of a test file. + +```dart +import 'package:instrumentation_adapter/instrumentation_adapter.dart'; +import '../test/package_info.dart' as test; + +void main() { + InstrumentationAdapterFlutterBinding.ensureInitialized(); + testWidgets("failing test example", (WidgetTester tester) async { + expect(2 + 2, equals(5)); + }); +} +``` + +Use gradle commands to build an instrumentation test for Android. + +``` +pushd android +./gradlew assembleAndroidTest +./gradlew assembleDebug -Ptarget=.dart +popd +``` + +Upload to Firebase Test Lab, making sure to replace , , , and with your values. + +``` +gcloud auth activate-service-account --key-file= +gcloud --quiet config set project +gcloud firebase test android run --type instrumentation \ + --app build/app/outputs/apk/debug/app-debug.apk \ + --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk\ + --timeout 2m \ + --results-bucket= \ + --results-dir= +``` diff --git a/packages/instrumentation_adapter/android/.gitignore b/packages/instrumentation_adapter/android/.gitignore new file mode 100644 index 000000000000..c6cbe562a427 --- /dev/null +++ b/packages/instrumentation_adapter/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/packages/instrumentation_adapter/android/build.gradle b/packages/instrumentation_adapter/android/build.gradle new file mode 100644 index 000000000000..a117873b3560 --- /dev/null +++ b/packages/instrumentation_adapter/android/build.gradle @@ -0,0 +1,41 @@ +group 'com.example.instrumentation_adapter' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +rootProject.allprojects { + repositories { + google() + jcenter() + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + + defaultConfig { + minSdkVersion 16 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } + dependencies { + api 'junit:junit:4.12' + api 'androidx.test:core:1.0.0' + api 'androidx.test:runner:1.1.1' + api 'androidx.test:rules:1.1.1' + api 'androidx.test.espresso:espresso-core:3.1.1' + } +} diff --git a/packages/instrumentation_adapter/android/gradle.properties b/packages/instrumentation_adapter/android/gradle.properties new file mode 100644 index 000000000000..2bd6f4fda009 --- /dev/null +++ b/packages/instrumentation_adapter/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx1536M + diff --git a/packages/instrumentation_adapter/android/settings.gradle b/packages/instrumentation_adapter/android/settings.gradle new file mode 100644 index 000000000000..ed03d0eb2a5e --- /dev/null +++ b/packages/instrumentation_adapter/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'instrumentation_adapter' diff --git a/packages/instrumentation_adapter/android/src/main/AndroidManifest.xml b/packages/instrumentation_adapter/android/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..3b424b6fad67 --- /dev/null +++ b/packages/instrumentation_adapter/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java new file mode 100644 index 000000000000..bc635ea080de --- /dev/null +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -0,0 +1,53 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package dev.flutter.plugins.instrumentationadapter; + +import java.util.Map; +import java.util.concurrent.ExecutionException; +import org.junit.runner.Description; +import org.junit.runner.Runner; +import org.junit.runner.notification.Failure; +import org.junit.runner.notification.RunNotifier; + +public class FlutterRunner extends Runner { + + final Class testClass; + + public FlutterRunner(Class testClass) { + super(); + this.testClass = testClass; + try { + testClass.newInstance().launchActivity(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalThreadStateException("Unable to launch test"); + } + } + + @Override + public Description getDescription() { + return Description.createTestDescription(testClass, "Flutter Tests"); + } + + @Override + public void run(RunNotifier notifier) { + Map results = null; + try { + results = InstrumentationAdapterPlugin.testResults.get(); + } catch (ExecutionException | InterruptedException e) { + throw new IllegalThreadStateException("Unable to get test results"); + } + + for (String name : results.keySet()) { + Description d = Description.createTestDescription(testClass, name); + notifier.fireTestStarted(d); + String outcome = results.get(name); + if (outcome.equals("failed")) { + Exception dummyException = new Exception(outcome); + notifier.fireTestFailure(new Failure(d, dummyException)); + } + notifier.fireTestFinished(d); + } + } +} diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java new file mode 100644 index 000000000000..df6b398bddd6 --- /dev/null +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java @@ -0,0 +1,9 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package dev.flutter.plugins.instrumentationadapter; + +public abstract class FlutterTest { + public abstract void launchActivity(); +} diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java new file mode 100644 index 000000000000..c77a94e89f91 --- /dev/null +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java @@ -0,0 +1,38 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package dev.flutter.plugins.instrumentationadapter; + +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.plugin.common.PluginRegistry.Registrar; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +/** InstrumentationAdapterPlugin */ +public class InstrumentationAdapterPlugin implements MethodCallHandler { + + public static CompletableFuture> testResults = new CompletableFuture<>(); + + private static final String CHANNEL = "dev.flutter/InstrumentationAdapterFlutterBinding"; + + /** Plugin registration. */ + public static void registerWith(Registrar registrar) { + final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); + channel.setMethodCallHandler(new InstrumentationAdapterPlugin()); + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("allTestsFinished")) { + Map results = call.argument("results"); + testResults.complete(results); + result.success(null); + } else { + result.notImplemented(); + } + } +} diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart new file mode 100644 index 000000000000..81f81872d950 --- /dev/null +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -0,0 +1,48 @@ +// 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:flutter_test/flutter_test.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; + +/// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results +/// on a channel to adapt them to native instrumentation test format. +class InstrumentationAdapterFlutterBinding + extends LiveTestWidgetsFlutterBinding { + InstrumentationAdapterFlutterBinding() { + // TODO(jackson): Report test results as they arrive + tearDownAll(() async { + await _channel.invokeMethod( + 'allTestsFinished', {'results': _results}); + }); + } + + static WidgetsBinding ensureInitialized() { + if (WidgetsBinding.instance == null) { + InstrumentationAdapterFlutterBinding(); + } + assert(WidgetsBinding.instance is InstrumentationAdapterFlutterBinding); + return WidgetsBinding.instance; + } + + static const MethodChannel _channel = + MethodChannel('dev.flutter/InstrumentationAdapterFlutterBinding'); + + static Map _results = {}; + + @override + Future runTest(Future testBody(), VoidCallback invariantTester, + {String description = '', Duration timeout}) async { + // TODO(jackson): Report the results individually instead of all at once + // See https://github.com/flutter/flutter/issues/38985 + reportTestException = + (FlutterErrorDetails details, String testDescription) { + _results[description] = 'failed'; + }; + await super.runTest(testBody, invariantTester, + description: description, timeout: timeout); + _results[description] ??= 'success'; + } +} diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml new file mode 100644 index 000000000000..103a43628024 --- /dev/null +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -0,0 +1,19 @@ +name: instrumentation_adapter +description: Runs tests that use the flutter_test API as platform native instrumentation tests. +version: 0.0.1 +author: Flutter Team +homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + flutter_test: + sdk: flutter + +flutter: + plugin: + androidPackage: dev.flutter.plugins.instrumentationadapter + pluginClass: InstrumentationAdapterPlugin \ No newline at end of file diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index 4d30ad73e8a1..4bf59d2e8a80 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -12,7 +12,7 @@ check_changed_packages > /dev/null cd $REPO_DIR/examples/all_plugins flutter clean > /dev/null -(cd "$REPO_DIR" && pub global run flutter_plugin_tools gen-pubspec) +(cd "$REPO_DIR" && pub global run flutter_plugin_tools gen-pubspec --exclude instrumentation_adapter) function error() { echo "$@" 1>&2 From 9a1a56f727ef184007e03950e4243994c3e41e51 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 14:13:54 -0700 Subject: [PATCH 041/133] [instrumentation_adapter] Update README instructions (#2022) (documentation-only change) --- packages/instrumentation_adapter/CHANGELOG.md | 4 ++++ packages/instrumentation_adapter/README.md | 24 +++++++++++++++++++ packages/instrumentation_adapter/pubspec.yaml | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index 29f648fd17f1..d5326e512537 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.2 + +* Document current usage instructions, which require adding a Java test file. + ## 0.0.1 * Initial release diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index b2a65bd84a46..972790bae5e0 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -22,6 +22,30 @@ void main() { } ``` +Create an instrumentation test file in your application's +android/app/src/androidTest/java/com/example/myapp/ directory +(replacing com, example, and myapp with values from your app's +package name). You can name this test file MainActivityTest.java +or another name of your choice. + +``` +package com.example.myapp; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.instrumentationadapter.FlutterRunner; +import dev.flutter.plugins.instrumentationadapter.FlutterTest; +import java.lang.Override; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class MainActivityTest extends FlutterTest { + @Override + public void launchActivity() { + ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); + rule.launchActivity(null); + } +}``` + Use gradle commands to build an instrumentation test for Android. ``` diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index 103a43628024..693ad090f5e1 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,6 +1,6 @@ name: instrumentation_adapter description: Runs tests that use the flutter_test API as platform native instrumentation tests. -version: 0.0.1 +version: 0.0.2 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter @@ -16,4 +16,4 @@ dependencies: flutter: plugin: androidPackage: dev.flutter.plugins.instrumentationadapter - pluginClass: InstrumentationAdapterPlugin \ No newline at end of file + pluginClass: InstrumentationAdapterPlugin From c5ade10b6ef8e69273ef78e7b4d111fe34e56e8d Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 17:16:24 -0700 Subject: [PATCH 042/133] Add instrumentation_adapter to CODEOWNERS (#2024) --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/CODEOWNERS b/CODEOWNERS index 2cbefae02a3a..ff5bf7b654a3 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -13,6 +13,7 @@ packages/google_maps_flutter/* @iskakaushik packages/google_sign_in/* @cyanglaz @mehmetf packages/image_picker/* @cyanglaz packages/in_app_purchase/* @mklim @cyanglaz +packages/instrumentation_adapter/* @collinjackson @digiter packages/package_info/* @cyanglaz packages/path_provider/* @collinjackson packages/quick_actions/* @collinjackson From d7ad50bcf7bdf2e519729a583a568d858e9e185f Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 17:17:32 -0700 Subject: [PATCH 043/133] [instrumentation_adapter] update boilerplate to use @Rule instead of FlutterTest (#2023) * Updates the boilerplate test to use `@Rule` instead of `FlutterTest`, bringing it more in line with how native Android tests work. --- packages/instrumentation_adapter/CHANGELOG.md | 4 +++ packages/instrumentation_adapter/README.md | 15 +++++------ .../instrumentationadapter/FlutterRunner.java | 25 +++++++++++++++---- .../instrumentationadapter/FlutterTest.java | 9 ------- packages/instrumentation_adapter/pubspec.yaml | 2 +- 5 files changed, 31 insertions(+), 24 deletions(-) delete mode 100644 packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index d5326e512537..ace51df0cc1c 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0 + +* Update boilerplate test to use `@Rule` instead of `FlutterTest`. + ## 0.0.2 * Document current usage instructions, which require adding a Java test file. diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index 972790bae5e0..49a33954cfbe 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -33,18 +33,15 @@ package com.example.myapp; import androidx.test.rule.ActivityTestRule; import dev.flutter.plugins.instrumentationadapter.FlutterRunner; -import dev.flutter.plugins.instrumentationadapter.FlutterTest; -import java.lang.Override; +import org.junit.Rule; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) -public class MainActivityTest extends FlutterTest { - @Override - public void launchActivity() { - ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); - rule.launchActivity(null); - } -}``` +public class MainActivityTest { + @Rule + public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} +``` Use gradle commands to build an instrumentation test for Android. diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index bc635ea080de..c823306e022c 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -4,8 +4,12 @@ package dev.flutter.plugins.instrumentationadapter; +import android.app.Activity; +import androidx.test.rule.ActivityTestRule; +import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.ExecutionException; +import org.junit.Rule; import org.junit.runner.Description; import org.junit.runner.Runner; import org.junit.runner.notification.Failure; @@ -15,13 +19,24 @@ public class FlutterRunner extends Runner { final Class testClass; - public FlutterRunner(Class testClass) { + public FlutterRunner(Class testClass) { super(); this.testClass = testClass; - try { - testClass.newInstance().launchActivity(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalThreadStateException("Unable to launch test"); + + // Look for an `ActivityTestRule` annotated `@Rule` and invoke `launchActivity()` + Field[] fields = testClass.getDeclaredFields(); + for (Field field : fields) { + if (field.isAnnotationPresent(Rule.class)) { + try { + Object instance = testClass.newInstance(); + ActivityTestRule rule = (ActivityTestRule) field.get(instance); + rule.launchActivity(null); + } catch (InstantiationException | IllegalAccessException e) { + // This might occur if the developer did not make the rule public. + // We could call field.setAccessible(true) but it seems better to throw. + throw new RuntimeException("Unable to access activity rule", e); + } + } } } diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java deleted file mode 100644 index df6b398bddd6..000000000000 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package dev.flutter.plugins.instrumentationadapter; - -public abstract class FlutterTest { - public abstract void launchActivity(); -} diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index 693ad090f5e1..0d67157ba80f 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,6 +1,6 @@ name: instrumentation_adapter description: Runs tests that use the flutter_test API as platform native instrumentation tests. -version: 0.0.2 +version: 0.1.0 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter From 94290d9109802999308e34ff336be3b9a85af62e Mon Sep 17 00:00:00 2001 From: Pau Picas Date: Wed, 28 Aug 2019 17:33:56 +0200 Subject: [PATCH 044/133] [google_maps_flutter] Avoid unnecessary redraws (#1933) --- AUTHORS | 1 + packages/google_maps_flutter/CHANGELOG.md | 4 ++ .../google_maps_flutter/lib/src/circle.dart | 11 ++++- .../lib/src/circle_updates.dart | 8 ++++ .../google_maps_flutter/lib/src/marker.dart | 14 +++++- .../lib/src/marker_updates.dart | 8 ++++ .../google_maps_flutter/lib/src/polygon.dart | 11 ++++- .../lib/src/polygon_updates.dart | 8 ++++ .../google_maps_flutter/lib/src/polyline.dart | 14 +++++- .../lib/src/polyline_updates.dart | 8 ++++ packages/google_maps_flutter/pubspec.yaml | 2 +- .../test/circle_updates_test.dart | 47 ++++++++----------- .../test/fake_maps_controllers.dart | 2 + .../test/marker_updates_test.dart | 47 ++++++++----------- .../test/polygon_updates_test.dart | 47 ++++++++----------- .../test/polyline_updates_test.dart | 47 ++++++++----------- 16 files changed, 166 insertions(+), 113 deletions(-) diff --git a/AUTHORS b/AUTHORS index a24dfd196966..ed6942ae1a6e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -43,3 +43,4 @@ Audrius Karosevicius Lukasz Piliszczuk SoundReply Solutions GmbH Rafal Wachol +Pau Picas \ No newline at end of file diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 2f5983e0cbcf..c88a00be904a 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.21 + +* Don't recreate map elements if they didn't change since last widget build. + ## 0.5.20+6 * Adds support for toggling the traffic layer diff --git a/packages/google_maps_flutter/lib/src/circle.dart b/packages/google_maps_flutter/lib/src/circle.dart index d09d3c492a75..eefb8c021fa6 100644 --- a/packages/google_maps_flutter/lib/src/circle.dart +++ b/packages/google_maps_flutter/lib/src/circle.dart @@ -141,7 +141,16 @@ class Circle { if (identical(this, other)) return true; if (other.runtimeType != runtimeType) return false; final Circle typedOther = other; - return circleId == typedOther.circleId; + return circleId == typedOther.circleId && + consumeTapEvents == typedOther.consumeTapEvents && + fillColor == typedOther.fillColor && + center == typedOther.center && + radius == typedOther.radius && + strokeColor == typedOther.strokeColor && + strokeWidth == typedOther.strokeWidth && + visible == typedOther.visible && + zIndex == typedOther.zIndex && + onTap == typedOther.onTap; } @override diff --git a/packages/google_maps_flutter/lib/src/circle_updates.dart b/packages/google_maps_flutter/lib/src/circle_updates.dart index 5dddb3a8ad15..c977c4182c98 100644 --- a/packages/google_maps_flutter/lib/src/circle_updates.dart +++ b/packages/google_maps_flutter/lib/src/circle_updates.dart @@ -36,9 +36,17 @@ class _CircleUpdates { .map(idToCurrentCircle) .toSet(); + /// Returns `true` if [current] is not equals to previous one with the + /// same id. + bool hasChanged(Circle current) { + final Circle previous = previousCircles[current.circleId]; + return current != previous; + } + final Set _circlesToChange = currentCircleIds .intersection(prevCircleIds) .map(idToCurrentCircle) + .where(hasChanged) .toSet(); circlesToAdd = _circlesToAdd; diff --git a/packages/google_maps_flutter/lib/src/marker.dart b/packages/google_maps_flutter/lib/src/marker.dart index 1f64f0ee19ff..4a087f797cdf 100644 --- a/packages/google_maps_flutter/lib/src/marker.dart +++ b/packages/google_maps_flutter/lib/src/marker.dart @@ -283,7 +283,19 @@ class Marker { if (identical(this, other)) return true; if (other.runtimeType != runtimeType) return false; final Marker typedOther = other; - return markerId == typedOther.markerId; + return markerId == typedOther.markerId && + alpha == typedOther.alpha && + anchor == typedOther.anchor && + consumeTapEvents == typedOther.consumeTapEvents && + draggable == typedOther.draggable && + flat == typedOther.flat && + icon == typedOther.icon && + infoWindow == typedOther.infoWindow && + position == typedOther.position && + rotation == typedOther.rotation && + visible == typedOther.visible && + zIndex == typedOther.zIndex && + onTap == typedOther.onTap; } @override diff --git a/packages/google_maps_flutter/lib/src/marker_updates.dart b/packages/google_maps_flutter/lib/src/marker_updates.dart index 6c73b5e6a12d..d4a08255e069 100644 --- a/packages/google_maps_flutter/lib/src/marker_updates.dart +++ b/packages/google_maps_flutter/lib/src/marker_updates.dart @@ -36,9 +36,17 @@ class _MarkerUpdates { .map(idToCurrentMarker) .toSet(); + /// Returns `true` if [current] is not equals to previous one with the + /// same id. + bool hasChanged(Marker current) { + final Marker previous = previousMarkers[current.markerId]; + return current != previous; + } + final Set _markersToChange = currentMarkerIds .intersection(prevMarkerIds) .map(idToCurrentMarker) + .where(hasChanged) .toSet(); markersToAdd = _markersToAdd; diff --git a/packages/google_maps_flutter/lib/src/polygon.dart b/packages/google_maps_flutter/lib/src/polygon.dart index 7592cb78d393..2230ae81afaf 100644 --- a/packages/google_maps_flutter/lib/src/polygon.dart +++ b/packages/google_maps_flutter/lib/src/polygon.dart @@ -150,7 +150,16 @@ class Polygon { if (identical(this, other)) return true; if (other.runtimeType != runtimeType) return false; final Polygon typedOther = other; - return polygonId == typedOther.polygonId; + return polygonId == typedOther.polygonId && + consumeTapEvents == typedOther.consumeTapEvents && + fillColor == typedOther.fillColor && + geodesic == typedOther.geodesic && + listEquals(points, typedOther.points) && + visible == typedOther.visible && + strokeColor == typedOther.strokeColor && + strokeWidth == typedOther.strokeWidth && + zIndex == typedOther.zIndex && + onTap == typedOther.onTap; } @override diff --git a/packages/google_maps_flutter/lib/src/polygon_updates.dart b/packages/google_maps_flutter/lib/src/polygon_updates.dart index c7a04f426074..5a14c6b8ec5c 100644 --- a/packages/google_maps_flutter/lib/src/polygon_updates.dart +++ b/packages/google_maps_flutter/lib/src/polygon_updates.dart @@ -36,9 +36,17 @@ class _PolygonUpdates { .map(idToCurrentPolygon) .toSet(); + /// Returns `true` if [current] is not equals to previous one with the + /// same id. + bool hasChanged(Polygon current) { + final Polygon previous = previousPolygons[current.polygonId]; + return current != previous; + } + final Set _polygonsToChange = currentPolygonIds .intersection(prevPolygonIds) .map(idToCurrentPolygon) + .where(hasChanged) .toSet(); polygonsToAdd = _polygonsToAdd; diff --git a/packages/google_maps_flutter/lib/src/polyline.dart b/packages/google_maps_flutter/lib/src/polyline.dart index 5e93669a596e..7454711dd6b1 100644 --- a/packages/google_maps_flutter/lib/src/polyline.dart +++ b/packages/google_maps_flutter/lib/src/polyline.dart @@ -192,7 +192,19 @@ class Polyline { if (identical(this, other)) return true; if (other.runtimeType != runtimeType) return false; final Polyline typedOther = other; - return polylineId == typedOther.polylineId; + return polylineId == typedOther.polylineId && + consumeTapEvents == typedOther.consumeTapEvents && + color == typedOther.color && + geodesic == typedOther.geodesic && + jointType == typedOther.jointType && + listEquals(patterns, typedOther.patterns) && + listEquals(points, typedOther.points) && + startCap == typedOther.startCap && + endCap == typedOther.endCap && + visible == typedOther.visible && + width == typedOther.width && + zIndex == typedOther.zIndex && + onTap == typedOther.onTap; } @override diff --git a/packages/google_maps_flutter/lib/src/polyline_updates.dart b/packages/google_maps_flutter/lib/src/polyline_updates.dart index 5d82597fd212..ed972a51c8bf 100644 --- a/packages/google_maps_flutter/lib/src/polyline_updates.dart +++ b/packages/google_maps_flutter/lib/src/polyline_updates.dart @@ -38,9 +38,17 @@ class _PolylineUpdates { .map(idToCurrentPolyline) .toSet(); + /// Returns `true` if [current] is not equals to previous one with the + /// same id. + bool hasChanged(Polyline current) { + final Polyline previous = previousPolylines[current.polylineId]; + return current != previous; + } + final Set _polylinesToChange = currentPolylineIds .intersection(prevPolylineIds) .map(idToCurrentPolyline) + .where(hasChanged) .toSet(); polylinesToAdd = _polylinesToAdd; diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 7504c1dd41a6..f8a852998d42 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+6 +version: 0.5.21 dependencies: flutter: diff --git a/packages/google_maps_flutter/test/circle_updates_test.dart b/packages/google_maps_flutter/test/circle_updates_test.dart index 4a3f14134e34..001b4d58a0f1 100644 --- a/packages/google_maps_flutter/test/circle_updates_test.dart +++ b/packages/google_maps_flutter/test/circle_updates_test.dart @@ -75,10 +75,10 @@ void main() { final Circle addedCircle = platformGoogleMap.circlesToAdd.first; expect(addedCircle, equals(c2)); + expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); - expect(platformGoogleMap.circlesToChange.length, 1); - expect(platformGoogleMap.circlesToChange.first, equals(c1)); + expect(platformGoogleMap.circlesToChange.isEmpty, true); }); testWidgets("Removing a circle", (WidgetTester tester) async { @@ -172,29 +172,22 @@ void main() { expect(platformGoogleMap.circleIdsToRemove.first, equals(c3.circleId)); }); - testWidgets( - "Partial Update", - (WidgetTester tester) async { - final Circle c1 = Circle(circleId: CircleId("circle_1")); - Circle c2 = Circle(circleId: CircleId("circle_2")); - final Set prev = _toSet(c1: c1, c2: c2); - c2 = Circle(circleId: CircleId("circle_2"), radius: 10); - final Set cur = _toSet(c1: c1, c2: c2); - - await tester.pumpWidget(_mapWithCircles(prev)); - await tester.pumpWidget(_mapWithCircles(cur)); - - final FakePlatformGoogleMap platformGoogleMap = - fakePlatformViewsController.lastCreatedView; - - expect(platformGoogleMap.circlesToChange, _toSet(c2: c2)); - expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); - expect(platformGoogleMap.circlesToAdd.isEmpty, true); - }, - // The test is currently broken due to a bug (we're updating all circles - // instead of just the ones that were changed): - // https://github.com/flutter/flutter/issues/30764 - // TODO(amirh): enable this test when the issue is fixed. - skip: true, - ); + testWidgets("Partial Update", (WidgetTester tester) async { + final Circle c1 = Circle(circleId: CircleId("circle_1")); + final Circle c2 = Circle(circleId: CircleId("circle_2")); + Circle c3 = Circle(circleId: CircleId("circle_3")); + final Set prev = _toSet(c1: c1, c2: c2, c3: c3); + c3 = Circle(circleId: CircleId("circle_3"), radius: 10); + final Set cur = _toSet(c1: c1, c2: c2, c3: c3); + + await tester.pumpWidget(_mapWithCircles(prev)); + await tester.pumpWidget(_mapWithCircles(cur)); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + + expect(platformGoogleMap.circlesToChange, _toSet(c3: c3)); + expect(platformGoogleMap.circleIdsToRemove.isEmpty, true); + expect(platformGoogleMap.circlesToAdd.isEmpty, true); + }); } diff --git a/packages/google_maps_flutter/test/fake_maps_controllers.dart b/packages/google_maps_flutter/test/fake_maps_controllers.dart index d892ea1a7794..0ae12c815ff3 100644 --- a/packages/google_maps_flutter/test/fake_maps_controllers.dart +++ b/packages/google_maps_flutter/test/fake_maps_controllers.dart @@ -133,6 +133,7 @@ class FakePlatformGoogleMap { final Set result = Set(); for (Map markerData in markersData) { final String markerId = markerData['markerId']; + final double alpha = markerData['alpha']; final bool draggable = markerData['draggable']; final bool visible = markerData['visible']; @@ -151,6 +152,7 @@ class FakePlatformGoogleMap { draggable: draggable, visible: visible, infoWindow: infoWindow, + alpha: alpha, )); } diff --git a/packages/google_maps_flutter/test/marker_updates_test.dart b/packages/google_maps_flutter/test/marker_updates_test.dart index cb5731d72875..e208e82e2a96 100644 --- a/packages/google_maps_flutter/test/marker_updates_test.dart +++ b/packages/google_maps_flutter/test/marker_updates_test.dart @@ -75,10 +75,10 @@ void main() { final Marker addedMarker = platformGoogleMap.markersToAdd.first; expect(addedMarker, equals(m2)); + expect(platformGoogleMap.markerIdsToRemove.isEmpty, true); - expect(platformGoogleMap.markersToChange.length, 1); - expect(platformGoogleMap.markersToChange.first, equals(m1)); + expect(platformGoogleMap.markersToChange.isEmpty, true); }); testWidgets("Removing a marker", (WidgetTester tester) async { @@ -175,29 +175,22 @@ void main() { expect(platformGoogleMap.markerIdsToRemove.first, equals(m3.markerId)); }); - testWidgets( - "Partial Update", - (WidgetTester tester) async { - final Marker m1 = Marker(markerId: MarkerId("marker_1")); - Marker m2 = Marker(markerId: MarkerId("marker_2")); - final Set prev = _toSet(m1: m1, m2: m2); - m2 = Marker(markerId: MarkerId("marker_2"), draggable: true); - final Set cur = _toSet(m1: m1, m2: m2); - - await tester.pumpWidget(_mapWithMarkers(prev)); - await tester.pumpWidget(_mapWithMarkers(cur)); - - final FakePlatformGoogleMap platformGoogleMap = - fakePlatformViewsController.lastCreatedView; - - expect(platformGoogleMap.markersToChange, _toSet(m2: m2)); - expect(platformGoogleMap.markerIdsToRemove.isEmpty, true); - expect(platformGoogleMap.markersToAdd.isEmpty, true); - }, - // The test is currently broken due to a bug (we're updating all markers - // instead of just the ones that were changed): - // https://github.com/flutter/flutter/issues/27823 - // TODO(amirh): enable this test when the issue is fixed. - skip: true, - ); + testWidgets("Partial Update", (WidgetTester tester) async { + final Marker m1 = Marker(markerId: MarkerId("marker_1")); + final Marker m2 = Marker(markerId: MarkerId("marker_2")); + Marker m3 = Marker(markerId: MarkerId("marker_3")); + final Set prev = _toSet(m1: m1, m2: m2, m3: m3); + m3 = Marker(markerId: MarkerId("marker_3"), draggable: true); + final Set cur = _toSet(m1: m1, m2: m2, m3: m3); + + await tester.pumpWidget(_mapWithMarkers(prev)); + await tester.pumpWidget(_mapWithMarkers(cur)); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + + expect(platformGoogleMap.markersToChange, _toSet(m3: m3)); + expect(platformGoogleMap.markerIdsToRemove.isEmpty, true); + expect(platformGoogleMap.markersToAdd.isEmpty, true); + }); } diff --git a/packages/google_maps_flutter/test/polygon_updates_test.dart b/packages/google_maps_flutter/test/polygon_updates_test.dart index 77f096b70484..c666cb687fee 100644 --- a/packages/google_maps_flutter/test/polygon_updates_test.dart +++ b/packages/google_maps_flutter/test/polygon_updates_test.dart @@ -75,10 +75,10 @@ void main() { final Polygon addedPolygon = platformGoogleMap.polygonsToAdd.first; expect(addedPolygon, equals(p2)); + expect(platformGoogleMap.polygonIdsToRemove.isEmpty, true); - expect(platformGoogleMap.polygonsToChange.length, 1); - expect(platformGoogleMap.polygonsToChange.first, equals(p1)); + expect(platformGoogleMap.polygonsToChange.isEmpty, true); }); testWidgets("Removing a polygon", (WidgetTester tester) async { @@ -174,29 +174,22 @@ void main() { expect(platformGoogleMap.polygonIdsToRemove.first, equals(p3.polygonId)); }); - testWidgets( - "Partial Update", - (WidgetTester tester) async { - final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1")); - Polygon p2 = Polygon(polygonId: PolygonId("polygon_2")); - final Set prev = _toSet(p1: p1, p2: p2); - p2 = Polygon(polygonId: PolygonId("polygon_2"), geodesic: true); - final Set cur = _toSet(p1: p1, p2: p2); - - await tester.pumpWidget(_mapWithPolygons(prev)); - await tester.pumpWidget(_mapWithPolygons(cur)); - - final FakePlatformGoogleMap platformGoogleMap = - fakePlatformViewsController.lastCreatedView; - - expect(platformGoogleMap.polygonsToChange, _toSet(p2: p2)); - expect(platformGoogleMap.polygonIdsToRemove.isEmpty, true); - expect(platformGoogleMap.polygonsToAdd.isEmpty, true); - }, - // The test is currently broken due to a bug (we're updating all polygons - // instead of just the ones that were changed): - // https://github.com/flutter/flutter/issues/30764 - // TODO(amirh): enable this test when the issue is fixed. - skip: true, - ); + testWidgets("Partial Update", (WidgetTester tester) async { + final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1")); + final Polygon p2 = Polygon(polygonId: PolygonId("polygon_2")); + Polygon p3 = Polygon(polygonId: PolygonId("polygon_3")); + final Set prev = _toSet(p1: p1, p2: p2, p3: p3); + p3 = Polygon(polygonId: PolygonId("polygon_3"), geodesic: true); + final Set cur = _toSet(p1: p1, p2: p2, p3: p3); + + await tester.pumpWidget(_mapWithPolygons(prev)); + await tester.pumpWidget(_mapWithPolygons(cur)); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + + expect(platformGoogleMap.polygonsToChange, _toSet(p3: p3)); + expect(platformGoogleMap.polygonIdsToRemove.isEmpty, true); + expect(platformGoogleMap.polygonsToAdd.isEmpty, true); + }); } diff --git a/packages/google_maps_flutter/test/polyline_updates_test.dart b/packages/google_maps_flutter/test/polyline_updates_test.dart index 6946df4c05ee..a0f39185d472 100644 --- a/packages/google_maps_flutter/test/polyline_updates_test.dart +++ b/packages/google_maps_flutter/test/polyline_updates_test.dart @@ -75,10 +75,10 @@ void main() { final Polyline addedPolyline = platformGoogleMap.polylinesToAdd.first; expect(addedPolyline, equals(p2)); + expect(platformGoogleMap.polylineIdsToRemove.isEmpty, true); - expect(platformGoogleMap.polylinesToChange.length, 1); - expect(platformGoogleMap.polylinesToChange.first, equals(p1)); + expect(platformGoogleMap.polylinesToChange.isEmpty, true); }); testWidgets("Removing a polyline", (WidgetTester tester) async { @@ -174,29 +174,22 @@ void main() { expect(platformGoogleMap.polylineIdsToRemove.first, equals(p3.polylineId)); }); - testWidgets( - "Partial Update", - (WidgetTester tester) async { - final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1")); - Polyline p2 = Polyline(polylineId: PolylineId("polyline_2")); - final Set prev = _toSet(p1: p1, p2: p2); - p2 = Polyline(polylineId: PolylineId("polyline_2"), geodesic: true); - final Set cur = _toSet(p1: p1, p2: p2); - - await tester.pumpWidget(_mapWithPolylines(prev)); - await tester.pumpWidget(_mapWithPolylines(cur)); - - final FakePlatformGoogleMap platformGoogleMap = - fakePlatformViewsController.lastCreatedView; - - expect(platformGoogleMap.polylinesToChange, _toSet(p2: p2)); - expect(platformGoogleMap.polylineIdsToRemove.isEmpty, true); - expect(platformGoogleMap.polylinesToAdd.isEmpty, true); - }, - // The test is currently broken due to a bug (we're updating all polylines - // instead of just the ones that were changed): - // https://github.com/flutter/flutter/issues/30764 - // TODO(amirh): enable this test when the issue is fixed. - skip: true, - ); + testWidgets("Partial Update", (WidgetTester tester) async { + final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1")); + final Polyline p2 = Polyline(polylineId: PolylineId("polyline_2")); + Polyline p3 = Polyline(polylineId: PolylineId("polyline_3")); + final Set prev = _toSet(p1: p1, p2: p2, p3: p3); + p3 = Polyline(polylineId: PolylineId("polyline_3"), geodesic: true); + final Set cur = _toSet(p1: p1, p2: p2, p3: p3); + + await tester.pumpWidget(_mapWithPolylines(prev)); + await tester.pumpWidget(_mapWithPolylines(cur)); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + + expect(platformGoogleMap.polylinesToChange, _toSet(p3: p3)); + expect(platformGoogleMap.polylineIdsToRemove.isEmpty, true); + expect(platformGoogleMap.polylinesToAdd.isEmpty, true); + }); } From b76fe5d58024f479df4057920289c04277c30632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=B5=20Th=C3=A0nh=20=C4=90=E1=BA=A1t?= Date: Wed, 28 Aug 2019 23:38:56 +0700 Subject: [PATCH 045/133] [android_intent] add flags option (#2000) Added "flags" option to call intent.addFlags(int) in native. --- packages/android_intent/CHANGELOG.md | 4 + .../androidintent/AndroidIntentPlugin.java | 3 + packages/android_intent/example/lib/main.dart | 14 +++ .../android_intent/lib/android_intent.dart | 44 +++++++++- packages/android_intent/lib/flag.dart | 37 ++++++++ packages/android_intent/pubspec.yaml | 8 +- .../test/android_intent_test.dart | 85 +++++++++++++++++++ 7 files changed, 190 insertions(+), 5 deletions(-) create mode 100644 packages/android_intent/lib/flag.dart create mode 100644 packages/android_intent/test/android_intent_test.dart diff --git a/packages/android_intent/CHANGELOG.md b/packages/android_intent/CHANGELOG.md index ea1b8f85c626..7a818f38548a 100644 --- a/packages/android_intent/CHANGELOG.md +++ b/packages/android_intent/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.3 + +* Added "flags" option to call intent.addFlags(int) in native. + ## 0.3.2 * Added "action_location_source_settings" action to start Location Settings Activity. diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java index 9c924d6fa524..a66116cdceeb 100644 --- a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java @@ -126,6 +126,9 @@ public void onMethodCall(MethodCall call, Result result) { if (mRegistrar.activity() == null) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } + if (call.argument("flag") != null) { + intent.addFlags((Integer) call.argument("flags")); + } if (call.argument("category") != null) { intent.addCategory((String) call.argument("category")); } diff --git a/packages/android_intent/example/lib/main.dart b/packages/android_intent/example/lib/main.dart index c94ffe50aef5..becf3d6e1e75 100644 --- a/packages/android_intent/example/lib/main.dart +++ b/packages/android_intent/example/lib/main.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:android_intent/android_intent.dart'; +import 'package:android_intent/flag.dart'; import 'package:flutter/material.dart'; import 'package:platform/platform.dart'; @@ -117,6 +118,15 @@ class ExplicitIntentsWidget extends StatelessWidget { intent.launch(); } + void _startActivityInNewTask() { + final AndroidIntent intent = AndroidIntent( + action: 'action_view', + data: Uri.encodeFull('https://flutter.io'), + flags: [Flag.FLAG_ACTIVITY_NEW_TASK], + ); + intent.launch(); + } + void _testExplicitIntentFallback() { final AndroidIntent intent = AndroidIntent( action: 'action_view', @@ -162,6 +172,10 @@ class ExplicitIntentsWidget extends StatelessWidget { child: const Text('Tap here to open link in Google Chrome.'), onPressed: _openLinkInGoogleChrome, ), + RaisedButton( + child: const Text('Tap here to start activity in new task.'), + onPressed: _startActivityInNewTask, + ), RaisedButton( child: const Text( 'Tap here to test explicit intent fallback to implicit.'), diff --git a/packages/android_intent/lib/android_intent.dart b/packages/android_intent/lib/android_intent.dart index 5e00b30d7d43..9c036cf98e15 100644 --- a/packages/android_intent/lib/android_intent.dart +++ b/packages/android_intent/lib/android_intent.dart @@ -14,6 +14,7 @@ const String kChannelName = 'plugins.flutter.io/android_intent'; class AndroidIntent { /// Builds an Android intent with the following parameters /// [action] refers to the action parameter of the intent. + /// [flags] is the list of int that will be converted to native flags. /// [category] refers to the category of the intent, can be null. /// [data] refers to the string format of the URI that will be passed to /// intent. @@ -24,6 +25,7 @@ class AndroidIntent { /// If not null, then [package] but also be provided. const AndroidIntent({ @required this.action, + this.flags, this.category, this.data, this.arguments, @@ -34,7 +36,22 @@ class AndroidIntent { _channel = const MethodChannel(kChannelName), _platform = platform ?? const LocalPlatform(); + @visibleForTesting + AndroidIntent.private({ + @required this.action, + @required Platform platform, + @required MethodChannel channel, + this.flags, + this.category, + this.data, + this.arguments, + this.package, + this.componentName, + }) : _channel = channel, + _platform = platform; + final String action; + final List flags; final String category; final String data; final Map arguments; @@ -43,13 +60,34 @@ class AndroidIntent { final MethodChannel _channel; final Platform _platform; + bool _isPowerOfTwo(int x) { + /* First x in the below expression is for the case when x is 0 */ + return x != 0 && ((x & (x - 1)) == 0); + } + + @visibleForTesting + int convertFlags(List flags) { + int finalValue = 0; + for (int i = 0; i < flags.length; i++) { + if (!_isPowerOfTwo(flags[i])) { + throw ArgumentError.value(flags[i], 'flag\'s value must be power of 2'); + } + finalValue |= flags[i]; + } + return finalValue; + } + /// Launch the intent. /// - /// This works only on Android platforms. Please guard the call so that your - /// iOS app does not crash. Checked mode will throw an assert exception. + /// This works only on Android platforms. Future launch() async { - assert(_platform.isAndroid); + if (!_platform.isAndroid) { + return; + } final Map args = {'action': action}; + if (flags != null) { + args['flags'] = convertFlags(flags); + } if (category != null) { args['category'] = category; } diff --git a/packages/android_intent/lib/flag.dart b/packages/android_intent/lib/flag.dart new file mode 100644 index 000000000000..b4e6ed100146 --- /dev/null +++ b/packages/android_intent/lib/flag.dart @@ -0,0 +1,37 @@ +// flag values from https://developer.android.com/reference/android/content/Intent.html +class Flag { + static const int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 4194304; + static const int FLAG_ACTIVITY_CLEAR_TASK = 32768; + static const int FLAG_ACTIVITY_CLEAR_TOP = 67108864; + static const int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; + static const int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 8388608; + static const int FLAG_ACTIVITY_FORWARD_RESULT = 33554432; + static const int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 1048576; + static const int FLAG_ACTIVITY_LAUNCH_ADJACENT = 4096; + static const int FLAG_ACTIVITY_MATCH_EXTERNAL = 2048; + static const int FLAG_ACTIVITY_MULTIPLE_TASK = 134217728; + static const int FLAG_ACTIVITY_NEW_DOCUMENT = 524288; + static const int FLAG_ACTIVITY_NEW_TASK = 268435456; + static const int FLAG_ACTIVITY_NO_ANIMATION = 65536; + static const int FLAG_ACTIVITY_NO_HISTORY = 1073741824; + static const int FLAG_ACTIVITY_NO_USER_ACTION = 262144; + static const int FLAG_ACTIVITY_PREVIOUS_IS_TOP = 16777216; + static const int FLAG_ACTIVITY_REORDER_TO_FRONT = 131072; + static const int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 2097152; + static const int FLAG_ACTIVITY_RETAIN_IN_RECENTS = 8192; + static const int FLAG_ACTIVITY_SINGLE_TOP = 536870912; + static const int FLAG_ACTIVITY_TASK_ON_HOME = 16384; + static const int FLAG_DEBUG_LOG_RESOLUTION = 8; + static const int FLAG_EXCLUDE_STOPPED_PACKAGES = 16; + static const int FLAG_FROM_BACKGROUND = 4; + static const int FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 64; + static const int FLAG_GRANT_PREFIX_URI_PERMISSION = 128; + static const int FLAG_GRANT_READ_URI_PERMISSION = 1; + static const int FLAG_GRANT_WRITE_URI_PERMISSION = 2; + static const int FLAG_INCLUDE_STOPPED_PACKAGES = 32; + static const int FLAG_RECEIVER_FOREGROUND = 268435456; + static const int FLAG_RECEIVER_NO_ABORT = 134217728; + static const int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; + static const int FLAG_RECEIVER_REPLACE_PENDING = 536870912; + static const int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 2097152; +} diff --git a/packages/android_intent/pubspec.yaml b/packages/android_intent/pubspec.yaml index cf205a693daf..11cbc319bbf0 100644 --- a/packages/android_intent/pubspec.yaml +++ b/packages/android_intent/pubspec.yaml @@ -2,7 +2,7 @@ name: android_intent description: Flutter plugin for launching Android Intents. Not supported on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_intent -version: 0.3.2 +version: 0.3.3 flutter: plugin: @@ -15,7 +15,11 @@ dependencies: sdk: flutter platform: ^2.0.0 meta: ^1.0.5 - +dev_dependencies: + test: ^1.3.0 + mockito: ^3.0.0 + flutter_test: + sdk: flutter environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" flutter: ">=1.2.0 <2.0.0" diff --git a/packages/android_intent/test/android_intent_test.dart b/packages/android_intent/test/android_intent_test.dart new file mode 100644 index 000000000000..b13438bf7469 --- /dev/null +++ b/packages/android_intent/test/android_intent_test.dart @@ -0,0 +1,85 @@ +// Copyright 2019 The Flutter 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:android_intent/flag.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:android_intent/android_intent.dart'; +import 'package:mockito/mockito.dart'; +import 'package:platform/platform.dart'; + +void main() { + AndroidIntent androidIntent; + MockMethodChannel mockChannel; + setUp(() { + mockChannel = MockMethodChannel(); + }); + group('AndroidIntent', () { + test('pass right params', () async { + androidIntent = AndroidIntent.private( + action: 'action_view', + data: Uri.encodeFull('https://flutter.io'), + flags: [Flag.FLAG_ACTIVITY_NEW_TASK], + channel: mockChannel, + platform: FakePlatform(operatingSystem: 'android')); + androidIntent.launch(); + verify(mockChannel.invokeMethod('launch', { + 'action': 'action_view', + 'data': Uri.encodeFull('https://flutter.io'), + 'flags': androidIntent.convertFlags([Flag.FLAG_ACTIVITY_NEW_TASK]), + })); + }); + test('pass null value to action param', () async { + androidIntent = AndroidIntent.private( + action: null, + channel: mockChannel, + platform: FakePlatform(operatingSystem: 'android')); + androidIntent.launch(); + verify(mockChannel.invokeMethod('launch', { + 'action': null, + })); + }); + + test('call in ios platform', () async { + androidIntent = AndroidIntent.private( + action: null, + channel: mockChannel, + platform: FakePlatform(operatingSystem: 'ios')); + androidIntent.launch(); + verifyZeroInteractions(mockChannel); + }); + }); + group('convertFlags ', () { + androidIntent = const AndroidIntent( + action: 'action_view', + ); + test('add filled flag list', () async { + final List flags = []; + flags.add(Flag.FLAG_ACTIVITY_NEW_TASK); + flags.add(Flag.FLAG_ACTIVITY_NEW_DOCUMENT); + expect( + androidIntent.convertFlags(flags), + 268959744, + ); + }); + test('add flags whose values are not power of 2', () async { + final List flags = []; + flags.add(100); + flags.add(10); + expect( + () => androidIntent.convertFlags(flags), + throwsArgumentError, + ); + }); + test('add empty flag list', () async { + final List flags = []; + expect( + androidIntent.convertFlags(flags), + 0, + ); + }); + }); +} + +class MockMethodChannel extends Mock implements MethodChannel {} From 406ec35d52711f3be0009cb857301e68ba848455 Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Wed, 28 Aug 2019 15:45:27 -0700 Subject: [PATCH 046/133] [in_app_purchase] Remove skipped driver test (#2027) This test was never providing much value since it needed to be run manually and only verified one of the API calls. Manually opening the configured example app took just as much time and verified much more. CI is failing based on it being skipped right now. Remove it completely to unbreak CI. --- packages/in_app_purchase/CHANGELOG.md | 4 +++ .../example/test_driver/app.dart | 11 ------- .../example/test_driver/app_test.dart | 30 ------------------- packages/in_app_purchase/pubspec.yaml | 2 +- 4 files changed, 5 insertions(+), 42 deletions(-) delete mode 100644 packages/in_app_purchase/example/test_driver/app.dart delete mode 100644 packages/in_app_purchase/example/test_driver/app_test.dart diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index 891818199c1a..e7eb3a4faebc 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.1+1 + +* Remove skipped driver test. + ## 0.2.1 * iOS: Add currencyCode to priceLocale on productDetails. diff --git a/packages/in_app_purchase/example/test_driver/app.dart b/packages/in_app_purchase/example/test_driver/app.dart deleted file mode 100644 index 051f7a128cf5..000000000000 --- a/packages/in_app_purchase/example/test_driver/app.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter_driver/driver_extension.dart'; -import 'package:in_app_purchase_example/main.dart' as app; - -void main() { - enableFlutterDriverExtension(); - app.main(); -} diff --git a/packages/in_app_purchase/example/test_driver/app_test.dart b/packages/in_app_purchase/example/test_driver/app_test.dart deleted file mode 100644 index 90fd6db027f7..000000000000 --- a/packages/in_app_purchase/example/test_driver/app_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:test/test.dart'; -import 'package:flutter_driver/flutter_driver.dart'; - -void main() { - group('Store connection tests', () { - FlutterDriver driver; - final SerializableFinder connectedFinder = - find.text('The store is available.'); - - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - tearDownAll(() async { - if (driver != null) { - driver.close(); - } - }); - - test('can connect', () async { - await driver.waitFor(connectedFinder); - }, - skip: - "run this test manually https://github.com/flutter/flutter/issues/29462"); - }); -} diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index a398d945fa03..1bd07cda704b 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.2.1 +version: 0.2.1+1 dependencies: From b47754c80e0d72ee7a0d09cd816ec8abb4063b02 Mon Sep 17 00:00:00 2001 From: Tong Wu Date: Wed, 28 Aug 2019 21:02:04 -0700 Subject: [PATCH 047/133] [instrumentation_adapter] Update documentation about using androidx (#2028) * Update documentation about how to use androidx. * Increase patch version. * Fix change log. --- packages/instrumentation_adapter/CHANGELOG.md | 4 ++ packages/instrumentation_adapter/README.md | 42 +++++++++++++++---- .../android/build.gradle | 11 ++--- packages/instrumentation_adapter/pubspec.yaml | 2 +- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index ace51df0cc1c..73557c5c704a 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.1 + +* Updates about using *androidx* library. + ## 0.1.0 * Update boilerplate test to use `@Rule` instead of `FlutterTest`. diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index 49a33954cfbe..81f515569ac5 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -1,14 +1,18 @@ # instrumentation_adapter -Adapts flutter_test results as Android instrumentation tests, making them usable for Firebase Test Lab and other Android CI providers. +Adapts flutter_test results as Android instrumentation tests, making them usable +for Firebase Test Lab and other Android CI providers. iOS support is not available yet, but is planned in the future. ## Usage -Add a dependency on the `instrumentation_adapter` package in the `dev_dependencies` section of pubspec.yaml. For plugins, do this in the pubspec.yaml of the example app. +Add a dependency on the `instrumentation_adapter` package in the +`dev_dependencies` section of pubspec.yaml. For plugins, do this in the +pubspec.yaml of the example app. -Invoke `InstrumentationAdapterFlutterBinding.ensureInitialized()` at the start of a test file. +Invoke `InstrumentationAdapterFlutterBinding.ensureInitialized()` at the start +of a test file. ```dart import 'package:instrumentation_adapter/instrumentation_adapter.dart'; @@ -23,10 +27,9 @@ void main() { ``` Create an instrumentation test file in your application's -android/app/src/androidTest/java/com/example/myapp/ directory -(replacing com, example, and myapp with values from your app's -package name). You can name this test file MainActivityTest.java -or another name of your choice. +**android/app/src/androidTest/java/com/example/myapp/** directory (replacing +com, example, and myapp with values from your app's package name). You can name +this test file MainActivityTest.java or another name of your choice. ``` package com.example.myapp; @@ -43,6 +46,28 @@ public class MainActivityTest { } ``` +Update your application's **myapp/android/app/build.gradle** to make sure it +uses androidx's version of AndroidJUnitRunner and has androidx libraries as a +dependency. + +``` +android { + ... + defaultConfig { + ... + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } +} + +dependencies { + testImplementation 'junit:junit:4.12' + + // https://developer.android.com/jetpack/androidx/releases/test/#1.2.0 + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} +``` + Use gradle commands to build an instrumentation test for Android. ``` @@ -52,7 +77,8 @@ pushd android popd ``` -Upload to Firebase Test Lab, making sure to replace , , , and with your values. +Upload to Firebase Test Lab, making sure to replace , +, , and with your values. ``` gcloud auth activate-service-account --key-file= diff --git a/packages/instrumentation_adapter/android/build.gradle b/packages/instrumentation_adapter/android/build.gradle index a117873b3560..21c421337428 100644 --- a/packages/instrumentation_adapter/android/build.gradle +++ b/packages/instrumentation_adapter/android/build.gradle @@ -26,16 +26,17 @@ android { defaultConfig { minSdkVersion 16 - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } lintOptions { disable 'InvalidPackage' } dependencies { api 'junit:junit:4.12' - api 'androidx.test:core:1.0.0' - api 'androidx.test:runner:1.1.1' - api 'androidx.test:rules:1.1.1' - api 'androidx.test.espresso:espresso-core:3.1.1' + + // https://developer.android.com/jetpack/androidx/releases/test/#1.2.0 + api 'androidx.test:runner:1.2.0' + api 'androidx.test:rules:1.2.0' + api 'androidx.test.espresso:espresso-core:3.2.0' } } diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index 0d67157ba80f..b73c7499aa81 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,6 +1,6 @@ name: instrumentation_adapter description: Runs tests that use the flutter_test API as platform native instrumentation tests. -version: 0.1.0 +version: 0.1.1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter From a94112735dc10439b2e80eab75aefa0a8bb007fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20Cesar=20Bueno=20Cotta?= Date: Thu, 29 Aug 2019 14:10:46 -0300 Subject: [PATCH 048/133] [In_App_Purchase] Avoids possible NullPointerException with background registrations. (#2014) This PR delays the get of a reference of a Activity instance and raises an error in case of a invalid access to the method that uses it. --- packages/in_app_purchase/CHANGELOG.md | 4 +++ .../inapppurchase/InAppPurchasePlugin.java | 33 ++++++++++++------- .../InAppPurchasePluginTest.java | 31 ++++++++++++++++- packages/in_app_purchase/pubspec.yaml | 3 +- 4 files changed, 57 insertions(+), 14 deletions(-) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index e7eb3a4faebc..fbbb870dcbe0 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.1+2 + +* Android: Require a non-null Activity to use the `launchBillingFlow` method. + ## 0.2.1+1 * Remove skipped driver test. diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java index 16ab5916c908..e914d2a455de 100644 --- a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java @@ -37,8 +37,8 @@ public class InAppPurchasePlugin implements MethodCallHandler { private static final String TAG = "InAppPurchasePlugin"; private @Nullable BillingClient billingClient; - private final Activity activity; - private final Context context; + private final Registrar registrar; + private final Context applicationContext; private final MethodChannel channel; @VisibleForTesting @@ -69,13 +69,12 @@ static final class MethodNames { public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/in_app_purchase"); - channel.setMethodCallHandler( - new InAppPurchasePlugin(registrar.context(), registrar.activity(), channel)); + channel.setMethodCallHandler(new InAppPurchasePlugin(registrar, channel)); } - public InAppPurchasePlugin(Context context, Activity activity, MethodChannel channel) { - this.context = context; - this.activity = activity; + public InAppPurchasePlugin(Registrar registrar, MethodChannel channel) { + this.applicationContext = registrar.context(); + this.registrar = registrar; this.channel = channel; } @@ -114,16 +113,17 @@ public void onMethodCall(MethodCall call, Result result) { } @VisibleForTesting - /*package*/ InAppPurchasePlugin(@Nullable BillingClient billingClient, MethodChannel channel) { + /*package*/ InAppPurchasePlugin( + Registrar registrar, @Nullable BillingClient billingClient, MethodChannel channel) { this.billingClient = billingClient; this.channel = channel; - this.context = null; - this.activity = null; + this.applicationContext = registrar.context(); + this.registrar = registrar; } private void startConnection(final int handle, final Result result) { if (billingClient == null) { - billingClient = buildBillingClient(context, channel); + billingClient = buildBillingClient(applicationContext, channel); } billingClient.startConnection( @@ -201,6 +201,17 @@ private void launchBillingFlow(String sku, @Nullable String accountId, Result re null); return; } + final Activity activity = registrar.activity(); + + if (activity == null) { + result.error( + "ACTIVITY_UNAVAILABLE", + "Details for sku " + + sku + + " are not available. This method must be run with the app in foreground.", + null); + return; + } BillingFlowParams.Builder paramsBuilder = BillingFlowParams.newBuilder().setSkuDetails(skuDetails); diff --git a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java index 4792505b4476..41a60788691f 100644 --- a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java +++ b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java @@ -28,6 +28,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Activity; +import android.content.Context; import androidx.annotation.Nullable; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClient.BillingResponse; @@ -41,9 +43,11 @@ import com.android.billingclient.api.SkuDetails; import com.android.billingclient.api.SkuDetailsParams; import com.android.billingclient.api.SkuDetailsResponseListener; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugins.inapppurchase.InAppPurchasePlugin.PluginPurchaseListener; import java.util.HashMap; import java.util.List; @@ -60,11 +64,16 @@ public class InAppPurchasePluginTest { @Mock BillingClient mockBillingClient; @Mock MethodChannel mockMethodChannel; @Spy Result result; + @Mock PluginRegistry.Registrar registrar; + @Mock Activity activity; + @Mock BinaryMessenger messenger; + @Mock Context context; @Before public void setUp() { MockitoAnnotations.initMocks(this); - plugin = new InAppPurchasePlugin(mockBillingClient, mockMethodChannel); + when(registrar.context()).thenReturn(context); + plugin = new InAppPurchasePlugin(registrar, mockBillingClient, mockMethodChannel); } @Test @@ -219,6 +228,7 @@ public void querySkuDetailsAsync_clientDisconnected() { @Test public void launchBillingFlow_ok_nullAccountId() { + when(registrar.activity()).thenReturn(activity); // Fetch the sku details first and then prepare the launch billing flow call String skuId = "foo"; queryForSkus(singletonList(skuId)); @@ -245,8 +255,27 @@ public void launchBillingFlow_ok_nullAccountId() { verify(result, times(1)).success(responseCode); } + @Test + public void launchBillingFlow_ok_null_Activity() { + // Fetch the sku details first and then prepare the launch billing flow call + String skuId = "foo"; + String accountId = "account"; + queryForSkus(singletonList(skuId)); + HashMap arguments = new HashMap<>(); + arguments.put("sku", skuId); + arguments.put("accountId", accountId); + MethodCall launchCall = new MethodCall(LAUNCH_BILLING_FLOW, arguments); + + plugin.onMethodCall(launchCall, result); + + // Verify we pass the response code to result + verify(result).error(contains("ACTIVITY_UNAVAILABLE"), contains("foreground"), any()); + verify(result, never()).success(any()); + } + @Test public void launchBillingFlow_ok_AccountId() { + when(registrar.activity()).thenReturn(activity); // Fetch the sku details first and query the method call String skuId = "foo"; String accountId = "account"; diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index 1bd07cda704b..d3a8cf0fa230 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.2.1+1 +version: 0.2.1+2 dependencies: @@ -33,4 +33,3 @@ flutter: environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" flutter: ">=1.5.0 <2.0.0" - From cd401694e6dc07390924033dbb995ed18cf07fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20Cesar=20Bueno=20Cotta?= Date: Thu, 29 Aug 2019 14:29:29 -0300 Subject: [PATCH 049/133] fix android crash when pausing or resuming video on APIs lower than 24. (#2029) This PR fixes a crash when pause/resume methods are called in APIs lower than 24 on Android. --- packages/camera/CHANGELOG.md | 4 ++++ .../java/io/flutter/plugins/camera/Camera.java | 16 ++++++++++++++-- packages/camera/example/lib/main.dart | 5 +++-- packages/camera/pubspec.yaml | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 49535b74e79d..9ed7a78f1bb1 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.4+1 + +* Fix Android pause and resume video crash when executing in APIs below 24. + ## 0.5.4 * Add feature to pause and resume video recording. diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 110c5b690b09..80da644a146a 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -21,6 +21,7 @@ import android.media.Image; import android.media.ImageReader; import android.media.MediaRecorder; +import android.os.Build; import android.util.Size; import android.view.OrientationEventListener; import android.view.Surface; @@ -395,7 +396,12 @@ public void pauseVideoRecording(@NonNull final Result result) { } try { - mediaRecorder.pause(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + mediaRecorder.pause(); + } else { + result.error("videoRecordingFailed", "pauseVideoRecording requires Android API +24.", null); + return; + } } catch (IllegalStateException e) { result.error("videoRecordingFailed", e.getMessage(), null); return; @@ -411,7 +417,13 @@ public void resumeVideoRecording(@NonNull final Result result) { } try { - mediaRecorder.resume(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + mediaRecorder.resume(); + } else { + result.error( + "videoRecordingFailed", "resumeVideoRecording requires Android API +24.", null); + return; + } } catch (IllegalStateException e) { result.error("videoRecordingFailed", e.getMessage(), null); return; diff --git a/packages/camera/example/lib/main.dart b/packages/camera/example/lib/main.dart index cfdcd1d30bc6..1c4b11672530 100644 --- a/packages/camera/example/lib/main.dart +++ b/packages/camera/example/lib/main.dart @@ -393,7 +393,7 @@ class _CameraExampleHomeState extends State await controller.pauseVideoRecording(); } on CameraException catch (e) { _showCameraException(e); - return null; + rethrow; } } @@ -406,7 +406,7 @@ class _CameraExampleHomeState extends State await controller.resumeVideoRecording(); } on CameraException catch (e) { _showCameraException(e); - return null; + rethrow; } } @@ -477,6 +477,7 @@ List cameras; Future main() async { // Fetch the available cameras before initializing the app. try { + WidgetsFlutterBinding.ensureInitialized(); cameras = await availableCameras(); } on CameraException catch (e) { logError(e.code, e.description); diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index e94d4bd979f0..c9e715225d59 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.4 +version: 0.5.4+1 authors: - Flutter Team From 90aaca84a697fb1cf714e8570cdde0c38c2fda11 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 29 Aug 2019 14:24:53 -0700 Subject: [PATCH 050/133] [Connectivity] add a method to request location on iOS (for iOS 13) (#1999) --- packages/connectivity/CHANGELOG.md | 6 + packages/connectivity/README.md | 38 ++++- .../example/ios/Runner/Info.plist | 4 + .../example/ios/Runner/Runner.entitlements | 8 + packages/connectivity/example/lib/main.dart | 35 ++++- .../example/test_driver/connectivity.dart | 9 ++ .../ios/Classes/ConnectivityPlugin.m | 47 +++++- .../Classes/FLTConnectivityLocationHandler.h | 22 +++ .../Classes/FLTConnectivityLocationHandler.m | 58 +++++++ packages/connectivity/lib/connectivity.dart | 141 ++++++++++++++++++ packages/connectivity/pubspec.yaml | 2 +- .../connectivity/test/connectivity_test.dart | 34 +++++ 12 files changed, 392 insertions(+), 12 deletions(-) create mode 100644 packages/connectivity/example/ios/Runner/Runner.entitlements create mode 100644 packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.h create mode 100644 packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.m diff --git a/packages/connectivity/CHANGELOG.md b/packages/connectivity/CHANGELOG.md index 4115a1be4aae..e88bc2b2d4df 100644 --- a/packages/connectivity/CHANGELOG.md +++ b/packages/connectivity/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.4.4 + +* Add `requestLocationServiceAuthorization` to request location authorization on iOS. +* Add `getLocationServiceAuthorization` to get location authorization status on iOS. +* Update README: add more information on iOS 13 updates with CNCopyCurrentNetworkInfo. + ## 0.4.3+7 * Update README with the updated information about CNCopyCurrentNetworkInfo on iOS 13. diff --git a/packages/connectivity/README.md b/packages/connectivity/README.md index 215f8991a756..c26def4e8ea4 100644 --- a/packages/connectivity/README.md +++ b/packages/connectivity/README.md @@ -50,7 +50,7 @@ dispose() { } ``` -You can get WIFI related information using: +You can get wi-fi related information using: ```dart import 'package:connectivity/connectivity.dart'; @@ -60,17 +60,39 @@ var wifiIP = await (Connectivity().getWifiIP());network var wifiName = await (Connectivity().getWifiName());wifi network ``` -### Known Issues +### iOS 12 -#### iOS 13 +To use `.getWifiBSSID()` and `.getWifiName()` on iOS >= 12, the `Access WiFi information capability` in XCode must be enabled. Otherwise, both methods will return null. -The methods `.getWifiBSSID()` and `.getWifiName()` utilize the [CNCopyCurrentNetworkInfo](https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo) function on iOS. +### iOS 13 -As of iOS 13, Apple announced that these APIs will no longer return valid information by default and will instead return the following: -> SSID: "Wi-Fi" or "WLAN" ("WLAN" will be returned for the China SKU) -> BSSID: "00:00:00:00:00:00" +The methods `.getWifiBSSID()` and `.getWifiName()` utilize the [`CNCopyCurrentNetworkInfo`](https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo) function on iOS. -You can follow issue [#37804](https://github.com/flutter/flutter/issues/37804) for the changes required to return valid SSID and BSSID values with iOS 13. +As of iOS 13, Apple announced that these APIs will no longer return valid information. +An app linked against iOS 12 or earlier receives pseudo-values such as: + + * SSID: "Wi-Fi" or "WLAN" ("WLAN" will be returned for the China SKU). + + * BSSID: "00:00:00:00:00:00" + +An app linked against iOS 13 or later receives `null`. + +The `CNCopyCurrentNetworkInfo` will work for Apps that: + + * The app uses Core Location, and has the user’s authorization to use location information. + + * The app uses the NEHotspotConfiguration API to configure the current Wi-Fi network. + + * The app has active VPN configurations installed. + +If your app falls into the last two categories, it will work as it is. If your app doesn't fall into the last two categories, +and you still need to access the wifi information, you should request user's authorization to use location information. + +There is a helper method provided in this plugin to request the location authorization: `requestLocationServiceAuthorization`. +To request location authorization, make sure to add the following keys to your _Info.plist_ file, located in `/ios/Runner/Info.plist`: + +* `NSLocationAlwaysAndWhenInUseUsageDescription` - describe why the app needs access to the user’s location information all the time (foreground and background). This is called _Privacy - Location Always and When In Use Usage Description_ in the visual editor. +* `NSLocationWhenInUseUsageDescription` - describe why the app needs access to the user’s location information when the app is running in the foreground. This is called _Privacy - Location When In Use Usage Description_ in the visual editor. ## Getting Started diff --git a/packages/connectivity/example/ios/Runner/Info.plist b/packages/connectivity/example/ios/Runner/Info.plist index d76382b40acf..babbd80f1619 100644 --- a/packages/connectivity/example/ios/Runner/Info.plist +++ b/packages/connectivity/example/ios/Runner/Info.plist @@ -22,6 +22,10 @@ 1 LSRequiresIPhoneOS + NSLocationAlwaysAndWhenInUseUsageDescription + This app requires accessing your location information all the time to get wi-fi information. + NSLocationWhenInUseUsageDescription + This app requires accessing your location information when the app is in foreground to get wi-fi information. UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/packages/connectivity/example/ios/Runner/Runner.entitlements b/packages/connectivity/example/ios/Runner/Runner.entitlements new file mode 100644 index 000000000000..ba21fbdaf290 --- /dev/null +++ b/packages/connectivity/example/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.developer.networking.wifi-info + + + diff --git a/packages/connectivity/example/lib/main.dart b/packages/connectivity/example/lib/main.dart index 3784a22fc241..c01a110efb60 100644 --- a/packages/connectivity/example/lib/main.dart +++ b/packages/connectivity/example/lib/main.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -90,14 +91,44 @@ class _MyHomePageState extends State { String wifiName, wifiBSSID, wifiIP; try { - wifiName = await _connectivity.getWifiName(); + if (Platform.isIOS) { + LocationAuthorizationStatus status = + await _connectivity.getLocationServiceAuthorization(); + if (status == LocationAuthorizationStatus.notDetermined) { + status = + await _connectivity.requestLocationServiceAuthorization(); + } + if (status == LocationAuthorizationStatus.authorizedAlways || + status == LocationAuthorizationStatus.authorizedWhenInUse) { + wifiName = await _connectivity.getWifiName(); + } else { + wifiName = await _connectivity.getWifiName(); + } + } else { + wifiName = await _connectivity.getWifiName(); + } } on PlatformException catch (e) { print(e.toString()); wifiName = "Failed to get Wifi Name"; } try { - wifiBSSID = await _connectivity.getWifiBSSID(); + if (Platform.isIOS) { + LocationAuthorizationStatus status = + await _connectivity.getLocationServiceAuthorization(); + if (status == LocationAuthorizationStatus.notDetermined) { + status = + await _connectivity.requestLocationServiceAuthorization(); + } + if (status == LocationAuthorizationStatus.authorizedAlways || + status == LocationAuthorizationStatus.authorizedWhenInUse) { + wifiBSSID = await _connectivity.getWifiBSSID(); + } else { + wifiBSSID = await _connectivity.getWifiBSSID(); + } + } else { + wifiBSSID = await _connectivity.getWifiBSSID(); + } } on PlatformException catch (e) { print(e.toString()); wifiBSSID = "Failed to get Wifi BSSID"; diff --git a/packages/connectivity/example/test_driver/connectivity.dart b/packages/connectivity/example/test_driver/connectivity.dart index 7efba5e4ab50..685f69efb1c8 100644 --- a/packages/connectivity/example/test_driver/connectivity.dart +++ b/packages/connectivity/example/test_driver/connectivity.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:connectivity/connectivity.dart'; @@ -28,5 +29,13 @@ void main() { break; } }); + + test('test location methods, iOS only', () async { + print(Platform.isIOS); + if (Platform.isIOS) { + expect((await _connectivity.getLocationServiceAuthorization()), + LocationAuthorizationStatus.notDetermined); + } + }); }); } diff --git a/packages/connectivity/ios/Classes/ConnectivityPlugin.m b/packages/connectivity/ios/Classes/ConnectivityPlugin.m index e92fff220a2e..c69871175b01 100644 --- a/packages/connectivity/ios/Classes/ConnectivityPlugin.m +++ b/packages/connectivity/ios/Classes/ConnectivityPlugin.m @@ -6,13 +6,18 @@ #import "Reachability/Reachability.h" +#import +#import "FLTConnectivityLocationHandler.h" #import "SystemConfiguration/CaptiveNetwork.h" #include #include -@interface FLTConnectivityPlugin () +@interface FLTConnectivityPlugin () + +@property(strong, nonatomic) FLTConnectivityLocationHandler* locationHandler; + @end @implementation FLTConnectivityPlugin { @@ -111,6 +116,18 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { result([self getBSSID]); } else if ([call.method isEqualToString:@"wifiIPAddress"]) { result([self getWifiIP]); + } else if ([call.method isEqualToString:@"getLocationServiceAuthorization"]) { + result([self convertCLAuthorizationStatusToString:[FLTConnectivityLocationHandler + locationAuthorizationStatus]]); + } else if ([call.method isEqualToString:@"requestLocationServiceAuthorization"]) { + NSArray* arguments = call.arguments; + BOOL always = [arguments.firstObject boolValue]; + __weak typeof(self) weakSelf = self; + [self.locationHandler + requestLocationAuthorization:always + completion:^(CLAuthorizationStatus status) { + result([weakSelf convertCLAuthorizationStatusToString:status]); + }]; } else { result(FlutterMethodNotImplemented); } @@ -121,6 +138,34 @@ - (void)onReachabilityDidChange:(NSNotification*)notification { _eventSink([self statusFromReachability:curReach]); } +- (NSString*)convertCLAuthorizationStatusToString:(CLAuthorizationStatus)status { + switch (status) { + case kCLAuthorizationStatusNotDetermined: { + return @"notDetermined"; + } + case kCLAuthorizationStatusRestricted: { + return @"restricted"; + } + case kCLAuthorizationStatusDenied: { + return @"denied"; + } + case kCLAuthorizationStatusAuthorizedAlways: { + return @"authorizedAlways"; + } + case kCLAuthorizationStatusAuthorizedWhenInUse: { + return @"authorizedWhenInUse"; + } + default: { return @"unknown"; } + } +} + +- (FLTConnectivityLocationHandler*)locationHandler { + if (!_locationHandler) { + _locationHandler = [FLTConnectivityLocationHandler new]; + } + return _locationHandler; +} + #pragma mark FlutterStreamHandler impl - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { diff --git a/packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.h b/packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.h new file mode 100644 index 000000000000..1731d56fe782 --- /dev/null +++ b/packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.h @@ -0,0 +1,22 @@ +// 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 +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FLTConnectivityLocationDelegate; + +typedef void (^FLTConnectivityLocationCompletion)(CLAuthorizationStatus); + +@interface FLTConnectivityLocationHandler : NSObject + ++ (CLAuthorizationStatus)locationAuthorizationStatus; + +- (void)requestLocationAuthorization:(BOOL)always + completion:(_Nonnull FLTConnectivityLocationCompletion)completionHnadler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.m b/packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.m new file mode 100644 index 000000000000..bbb93aea6a5b --- /dev/null +++ b/packages/connectivity/ios/Classes/FLTConnectivityLocationHandler.m @@ -0,0 +1,58 @@ +// 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 "FLTConnectivityLocationHandler.h" + +@interface FLTConnectivityLocationHandler () + +@property(copy, nonatomic) FLTConnectivityLocationCompletion completion; +@property(strong, nonatomic) CLLocationManager *locationManager; + +@end + +@implementation FLTConnectivityLocationHandler + ++ (CLAuthorizationStatus)locationAuthorizationStatus { + return CLLocationManager.authorizationStatus; +} + +- (void)requestLocationAuthorization:(BOOL)always + completion:(FLTConnectivityLocationCompletion)completionHandler { + CLAuthorizationStatus status = CLLocationManager.authorizationStatus; + if (status != kCLAuthorizationStatusAuthorizedWhenInUse && always) { + completionHandler(kCLAuthorizationStatusDenied); + return; + } else if (status != kCLAuthorizationStatusNotDetermined) { + completionHandler(status); + return; + } + + if (self.completion) { + // If a request is still in process, immediately return. + completionHandler(kCLAuthorizationStatusNotDetermined); + return; + } + + self.completion = completionHandler; + self.locationManager = [CLLocationManager new]; + self.locationManager.delegate = self; + if (always) { + [self.locationManager requestAlwaysAuthorization]; + } else { + [self.locationManager requestWhenInUseAuthorization]; + } +} + +- (void)locationManager:(CLLocationManager *)manager + didChangeAuthorizationStatus:(CLAuthorizationStatus)status { + if (status == kCLAuthorizationStatusNotDetermined) { + return; + } + if (self.completion) { + self.completion(status); + self.completion = nil; + } +} + +@end diff --git a/packages/connectivity/lib/connectivity.dart b/packages/connectivity/lib/connectivity.dart index a1fd21cb1668..03659f5455a9 100644 --- a/packages/connectivity/lib/connectivity.dart +++ b/packages/connectivity/lib/connectivity.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; @@ -93,6 +94,125 @@ class Connectivity { Future getWifiIP() async { return await methodChannel.invokeMethod('wifiIPAddress'); } + + /// Request to authorize the location service (Only on iOS). + /// + /// This method will throw a [PlatformException] on Android. + /// + /// Returns a [LocationAuthorizationStatus] after user authorized or denied the location on this request. + /// + /// If the location information needs to be accessible all the time, set `requestAlwaysLocationUsage` to true. If user has + /// already granted a [LocationAuthorizationStatus.authorizedWhenInUse] prior to requesting an "always" access, it will return [LocationAuthorizationStatus.denied]. + /// + /// If the location service authorization is not determined prior to making this call, a platform standard UI of requesting a location service will pop up. + /// This UI will only show once unless the user re-install the app to their phone which resets the location service authorization to not determined. + /// + /// This method is a helper to get the location authorization that is necessary for certain functionality of this plugin. + /// It can be replaced with other permission handling code/plugin if preferred. + /// To request location authorization, make sure to add the following keys to your _Info.plist_ file, located in `/ios/Runner/Info.plist`: + /// * `NSLocationAlwaysAndWhenInUseUsageDescription` - describe why the app needs access to the user’s location information + /// all the time (foreground and background). This is called _Privacy - Location Always and When In Use Usage Description_ in the visual editor. + /// * `NSLocationWhenInUseUsageDescription` - describe why the app needs access to the user’s location information when the app is + /// running in the foreground. This is called _Privacy - Location When In Use Usage Description_ in the visual editor. + /// + /// Starting from iOS 13, `getWifiBSSID` and `getWifiIP` will only work properly if: + /// + /// * The app uses Core Location, and has the user’s authorization to use location information. + /// * The app uses the NEHotspotConfiguration API to configure the current Wi-Fi network. + /// * The app has active VPN configurations installed. + /// + /// If the app falls into the first category, call this method before calling `getWifiBSSID` or `getWifiIP`. + /// For example, + /// ```dart + /// if (Platform.isIOS) { + /// LocationAuthorizationStatus status = await _connectivity.getLocationServiceAuthorization(); + /// if (status == LocationAuthorizationStatus.notDetermined) { + /// status = await _connectivity.requestLocationServiceAuthorization(); + /// } + /// if (status == LocationAuthorizationStatus.authorizedAlways || status == LocationAuthorizationStatus.authorizedWhenInUse) { + /// wifiBSSID = await _connectivity.getWifiName(); + /// } else { + /// print('location service is not authorized, the data might not be correct'); + /// wifiBSSID = await _connectivity.getWifiName(); + /// } + /// } else { + /// wifiBSSID = await _connectivity.getWifiName(); + /// } + /// ``` + /// + /// Ideally, a location service authorization should only be requested if the current authorization status is not determined. + /// + /// See also [getLocationServiceAuthorization] to obtain current location service status. + Future requestLocationServiceAuthorization( + {bool requestAlwaysLocationUsage = false}) async { + //Just `assert(Platform.isIOS)` will prevent us from doing dart side unit testing. + assert(!Platform.isAndroid); + final String result = await methodChannel.invokeMethod( + 'requestLocationServiceAuthorization', + [requestAlwaysLocationUsage]); + return _convertLocationStatusString(result); + } + + /// Get the current location service authorization (Only on iOS). + /// + /// This method will throw a [PlatformException] on Android. + /// + /// Returns a [LocationAuthorizationStatus]. + /// If the returned value is [LocationAuthorizationStatus.notDetermined], a subsequent [requestLocationServiceAuthorization] call + /// can request the authorization. + /// If the returned value is not [LocationAuthorizationStatus.notDetermined], a subsequent [requestLocationServiceAuthorization] + /// will not initiate another request. It will instead return the "determined" status. + /// + /// This method is a helper to get the location authorization that is necessary for certain functionality of this plugin. + /// It can be replaced with other permission handling code/plugin if preferred. + /// + /// Starting from iOS 13, `getWifiBSSID` and `getWifiIP` will only work properly if: + /// + /// * The app uses Core Location, and has the user’s authorization to use location information. + /// * The app uses the NEHotspotConfiguration API to configure the current Wi-Fi network. + /// * The app has active VPN configurations installed. + /// + /// If the app falls into the first category, call this method before calling `getWifiBSSID` or `getWifiIP`. + /// For example, + /// ```dart + /// if (Platform.isIOS) { + /// LocationAuthorizationStatus status = await _connectivity.getLocationServiceAuthorization(); + /// if (status == LocationAuthorizationStatus.authorizedAlways || status == LocationAuthorizationStatus.authorizedWhenInUse) { + /// wifiBSSID = await _connectivity.getWifiName(); + /// } else { + /// print('location service is not authorized, the data might not be correct'); + /// wifiBSSID = await _connectivity.getWifiName(); + /// } + /// } else { + /// wifiBSSID = await _connectivity.getWifiName(); + /// } + /// ``` + /// + /// See also [requestLocationServiceAuthorization] for requesting a location service authorization. + Future getLocationServiceAuthorization() async { + //Just `assert(Platform.isIOS)` will prevent us from doing dart side unit testing. + assert(!Platform.isAndroid); + final String result = await methodChannel + .invokeMethod('getLocationServiceAuthorization'); + return _convertLocationStatusString(result); + } + + LocationAuthorizationStatus _convertLocationStatusString(String result) { + switch (result) { + case 'notDetermined': + return LocationAuthorizationStatus.notDetermined; + case 'restricted': + return LocationAuthorizationStatus.restricted; + case 'denied': + return LocationAuthorizationStatus.denied; + case 'authorizedAlways': + return LocationAuthorizationStatus.authorizedAlways; + case 'authorizedWhenInUse': + return LocationAuthorizationStatus.authorizedWhenInUse; + default: + return LocationAuthorizationStatus.unknown; + } + } } ConnectivityResult _parseConnectivityResult(String state) { @@ -106,3 +226,24 @@ ConnectivityResult _parseConnectivityResult(String state) { return ConnectivityResult.none; } } + +/// The status of the location service authorization. +enum LocationAuthorizationStatus { + /// The authorization of the location service is not determined. + notDetermined, + + /// This app is not authorized to use location. + restricted, + + /// User explicitly denied the location service. + denied, + + /// User authorized the app to access the location at any time. + authorizedAlways, + + /// User authorized the app to access the location when the app is visible to them. + authorizedWhenInUse, + + /// Status unknown. + unknown +} diff --git a/packages/connectivity/pubspec.yaml b/packages/connectivity/pubspec.yaml index b91741f2f916..7ec5d31bcc42 100644 --- a/packages/connectivity/pubspec.yaml +++ b/packages/connectivity/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity -version: 0.4.3+7 +version: 0.4.4 flutter: plugin: diff --git a/packages/connectivity/test/connectivity_test.dart b/packages/connectivity/test/connectivity_test.dart index 311926b8b963..892e7d0085c5 100644 --- a/packages/connectivity/test/connectivity_test.dart +++ b/packages/connectivity/test/connectivity_test.dart @@ -25,6 +25,10 @@ void main() { return 'c0:ff:33:c0:d3:55'; case 'wifiIPAddress': return '127.0.0.1'; + case 'requestLocationServiceAuthorization': + return 'authorizedAlways'; + case 'getLocationServiceAuthorization': + return 'authorizedAlways'; default: return null; } @@ -98,6 +102,36 @@ void main() { ); }); + test('requestLocationServiceAuthorization', () async { + final LocationAuthorizationStatus result = + await Connectivity().requestLocationServiceAuthorization(); + expect(result, LocationAuthorizationStatus.authorizedAlways); + expect( + log, + [ + isMethodCall( + 'requestLocationServiceAuthorization', + arguments: [false], + ), + ], + ); + }); + + test('getLocationServiceAuthorization', () async { + final LocationAuthorizationStatus result = + await Connectivity().getLocationServiceAuthorization(); + expect(result, LocationAuthorizationStatus.authorizedAlways); + expect( + log, + [ + isMethodCall( + 'getLocationServiceAuthorization', + arguments: null, + ), + ], + ); + }); + test('checkConnectivity', () async { final ConnectivityResult result = await Connectivity().checkConnectivity(); From 8236a737362db04e040adde61f7b88c088e2b06c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20Cesar=20Bueno=20Cotta?= Date: Tue, 3 Sep 2019 17:44:18 -0300 Subject: [PATCH 051/133] [In_App_Purchase] Improve testability (#2016) This PR creates a factory for BillingClient, with that was possible to remove a secondary constructor that was used just for test. With the introduction of the factory there was the need to update some tests as it was testing states that would never be reached in the normal plugin flow (due the usage of the constructor for testing). Basically, the test cases depended on the state of BillingClient that would be null if no previous setup was executed. --- packages/in_app_purchase/CHANGELOG.md | 4 ++ .../inapppurchase/BillingClientFactory.java | 19 ++++++++ .../inapppurchase/InAppPurchasePlugin.java | 45 ++++--------------- .../inapppurchase/PluginPurchaseListener.java | 27 +++++++++++ .../InAppPurchasePluginTest.java | 35 ++++++++------- packages/in_app_purchase/pubspec.yaml | 2 +- 6 files changed, 79 insertions(+), 53 deletions(-) create mode 100644 packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactory.java create mode 100644 packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index fbbb870dcbe0..2f0e89e1cdec 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.1+3 + +* Android : Improved testability. + ## 0.2.1+2 * Android: Require a non-null Activity to use the `launchBillingFlow` method. diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactory.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactory.java new file mode 100644 index 000000000000..078986c04c86 --- /dev/null +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactory.java @@ -0,0 +1,19 @@ +package io.flutter.plugins.inapppurchase; + +import android.content.Context; +import com.android.billingclient.api.BillingClient; +import io.flutter.plugin.common.MethodChannel; + +interface BillingClientFactory { + BillingClient createBillingClient(Context context, MethodChannel channel); +} + +final class BillingClientFactoryImpl implements BillingClientFactory { + + @Override + public BillingClient createBillingClient(Context context, MethodChannel channel) { + return BillingClient.newBuilder(context) + .setListener(new PluginPurchaseListener(channel)) + .build(); + } +} diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java index e914d2a455de..99f68842d1c0 100644 --- a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java @@ -19,7 +19,6 @@ import com.android.billingclient.api.ConsumeResponseListener; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.PurchaseHistoryResponseListener; -import com.android.billingclient.api.PurchasesUpdatedListener; import com.android.billingclient.api.SkuDetails; import com.android.billingclient.api.SkuDetailsParams; import com.android.billingclient.api.SkuDetailsResponseListener; @@ -37,6 +36,7 @@ public class InAppPurchasePlugin implements MethodCallHandler { private static final String TAG = "InAppPurchasePlugin"; private @Nullable BillingClient billingClient; + private final BillingClientFactory factory; private final Registrar registrar; private final Context applicationContext; private final MethodChannel channel; @@ -69,12 +69,17 @@ static final class MethodNames { public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/in_app_purchase"); - channel.setMethodCallHandler(new InAppPurchasePlugin(registrar, channel)); + + final BillingClientFactory factory = new BillingClientFactoryImpl(); + final InAppPurchasePlugin plugin = new InAppPurchasePlugin(factory, registrar, channel); + channel.setMethodCallHandler(plugin); } - public InAppPurchasePlugin(Registrar registrar, MethodChannel channel) { + public InAppPurchasePlugin( + BillingClientFactory factory, Registrar registrar, MethodChannel channel) { this.applicationContext = registrar.context(); this.registrar = registrar; + this.factory = factory; this.channel = channel; } @@ -112,18 +117,9 @@ public void onMethodCall(MethodCall call, Result result) { } } - @VisibleForTesting - /*package*/ InAppPurchasePlugin( - Registrar registrar, @Nullable BillingClient billingClient, MethodChannel channel) { - this.billingClient = billingClient; - this.channel = channel; - this.applicationContext = registrar.context(); - this.registrar = registrar; - } - private void startConnection(final int handle, final Result result) { if (billingClient == null) { - billingClient = buildBillingClient(applicationContext, channel); + billingClient = factory.createBillingClient(applicationContext, channel); } billingClient.startConnection( @@ -282,27 +278,4 @@ private boolean billingClientError(Result result) { result.error("UNAVAILABLE", "BillingClient is unset. Try reconnecting.", null); return true; } - - private static BillingClient buildBillingClient(Context context, MethodChannel channel) { - return BillingClient.newBuilder(context) - .setListener(new PluginPurchaseListener(channel)) - .build(); - } - - @VisibleForTesting - /*package*/ static class PluginPurchaseListener implements PurchasesUpdatedListener { - private final MethodChannel channel; - - PluginPurchaseListener(MethodChannel channel) { - this.channel = channel; - } - - @Override - public void onPurchasesUpdated(int responseCode, @Nullable List purchases) { - final Map callbackArgs = new HashMap<>(); - callbackArgs.put("responseCode", responseCode); - callbackArgs.put("purchasesList", fromPurchasesList(purchases)); - channel.invokeMethod(MethodNames.ON_PURCHASES_UPDATED, callbackArgs); - } - } } diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java new file mode 100644 index 000000000000..f1de27eaacc8 --- /dev/null +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java @@ -0,0 +1,27 @@ +package io.flutter.plugins.inapppurchase; + +import static io.flutter.plugins.inapppurchase.Translator.fromPurchasesList; + +import androidx.annotation.Nullable; +import com.android.billingclient.api.Purchase; +import com.android.billingclient.api.PurchasesUpdatedListener; +import io.flutter.plugin.common.MethodChannel; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class PluginPurchaseListener implements PurchasesUpdatedListener { + private final MethodChannel channel; + + PluginPurchaseListener(MethodChannel channel) { + this.channel = channel; + } + + @Override + public void onPurchasesUpdated(int responseCode, @Nullable List purchases) { + final Map callbackArgs = new HashMap<>(); + callbackArgs.put("responseCode", responseCode); + callbackArgs.put("purchasesList", fromPurchasesList(purchases)); + channel.invokeMethod(InAppPurchasePlugin.MethodNames.ON_PURCHASES_UPDATED, callbackArgs); + } +} diff --git a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java index 41a60788691f..31118be8226a 100644 --- a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java +++ b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java @@ -29,7 +29,6 @@ import static org.mockito.Mockito.when; import android.app.Activity; -import android.content.Context; import androidx.annotation.Nullable; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClient.BillingResponse; @@ -43,12 +42,10 @@ import com.android.billingclient.api.SkuDetails; import com.android.billingclient.api.SkuDetailsParams; import com.android.billingclient.api.SkuDetailsResponseListener; -import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry; -import io.flutter.plugins.inapppurchase.InAppPurchasePlugin.PluginPurchaseListener; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -60,20 +57,19 @@ import org.mockito.Spy; public class InAppPurchasePluginTest { - InAppPurchasePlugin plugin; + private InAppPurchasePlugin plugin; @Mock BillingClient mockBillingClient; @Mock MethodChannel mockMethodChannel; @Spy Result result; @Mock PluginRegistry.Registrar registrar; @Mock Activity activity; - @Mock BinaryMessenger messenger; - @Mock Context context; @Before public void setUp() { MockitoAnnotations.initMocks(this); - when(registrar.context()).thenReturn(context); - plugin = new InAppPurchasePlugin(registrar, mockBillingClient, mockMethodChannel); + + BillingClientFactory factory = (context, channel) -> mockBillingClient; + plugin = new InAppPurchasePlugin(factory, registrar, mockMethodChannel); } @Test @@ -85,6 +81,7 @@ public void invalidMethod() { @Test public void isReady_true() { + mockStartConnection(); MethodCall call = new MethodCall(IS_READY, null); when(mockBillingClient.isReady()).thenReturn(true); plugin.onMethodCall(call, result); @@ -93,6 +90,7 @@ public void isReady_true() { @Test public void isReady_false() { + mockStartConnection(); MethodCall call = new MethodCall(IS_READY, null); when(mockBillingClient.isReady()).thenReturn(false); plugin.onMethodCall(call, result); @@ -113,14 +111,7 @@ public void isReady_clientDisconnected() { @Test public void startConnection() { - Map arguments = new HashMap<>(); - arguments.put("handle", 1); - MethodCall call = new MethodCall(START_CONNECTION, arguments); - ArgumentCaptor captor = - ArgumentCaptor.forClass(BillingClientStateListener.class); - doNothing().when(mockBillingClient).startConnection(captor.capture()); - - plugin.onMethodCall(call, result); + ArgumentCaptor captor = mockStartConnection(); verify(result, never()).success(any()); captor.getValue().onBillingSetupFinished(100); @@ -452,6 +443,18 @@ public void consumeAsync() { verify(result, times(1)).success(responseCode); } + private ArgumentCaptor mockStartConnection() { + Map arguments = new HashMap<>(); + arguments.put("handle", 1); + MethodCall call = new MethodCall(START_CONNECTION, arguments); + ArgumentCaptor captor = + ArgumentCaptor.forClass(BillingClientStateListener.class); + doNothing().when(mockBillingClient).startConnection(captor.capture()); + + plugin.onMethodCall(call, result); + return captor; + } + private void establishConnectedBillingClient( @Nullable Map arguments, @Nullable Result result) { if (arguments == null) { diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index d3a8cf0fa230..e8e9ceea8fc9 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.2.1+2 +version: 0.2.1+3 dependencies: From 163bbec94f2d0103e182c5256a444a8f5085dd51 Mon Sep 17 00:00:00 2001 From: Pasindu Perera Date: Tue, 3 Sep 2019 17:04:00 -0700 Subject: [PATCH 052/133] [video-player] add support for content uris as urls (#1813) content:// uris will be routed from DefaultDataSourceFactory in Android --- packages/video_player/CHANGELOG.md | 5 +++++ .../flutter/plugins/videoplayer/VideoPlayerPlugin.java | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index abf41afcfbb0..4b1ce43d1465 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.10.2+1 + +* Use DefaultHttpDataSourceFactory only when network schemas and use +DefaultHttpDataSourceFactory by default. + ## 0.10.2 * **Android Only** Adds optional VideoFormat used to signal what format the plugin should try. diff --git a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java index 50c26d460fb3..5b1f55fe14d6 100644 --- a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java +++ b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java @@ -86,9 +86,7 @@ private static class VideoPlayer { Uri uri = Uri.parse(dataSource); DataSource.Factory dataSourceFactory; - if (isFileOrAsset(uri)) { - dataSourceFactory = new DefaultDataSourceFactory(context, "ExoPlayer"); - } else { + if (isHTTP(uri)) { dataSourceFactory = new DefaultHttpDataSourceFactory( "ExoPlayer", @@ -96,6 +94,8 @@ private static class VideoPlayer { DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, true); + } else { + dataSourceFactory = new DefaultDataSourceFactory(context, "ExoPlayer"); } MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context); @@ -104,12 +104,12 @@ private static class VideoPlayer { setupVideoPlayer(eventChannel, textureEntry, result); } - private static boolean isFileOrAsset(Uri uri) { + private static boolean isHTTP(Uri uri) { if (uri == null || uri.getScheme() == null) { return false; } String scheme = uri.getScheme(); - return scheme.equals("file") || scheme.equals("asset"); + return scheme.equals("http") || scheme.equals("https"); } private MediaSource buildMediaSource( From 0a7535d1cd7119767d8d2506b2c9e3742f585fa8 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 3 Sep 2019 17:15:25 -0700 Subject: [PATCH 053/133] video player version fix (#2036) --- packages/video_player/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 3c18e734c964..96374a133405 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.2 +version: 0.10.2+1 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: From 1bb42f5cf8e47738be271bbae8d8af399b71e326 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Thu, 5 Sep 2019 00:27:14 +0100 Subject: [PATCH 054/133] [path_provider] Add missing tests (#1990) * Fix getApplicationSupportDirectory integration test * Add missing unit tests * setMockPathProviderPlatform --- packages/path_provider/CHANGELOG.md | 6 +++ .../example/test_driver/path_provider.dart | 19 +++---- packages/path_provider/lib/path_provider.dart | 13 ++++- packages/path_provider/pubspec.yaml | 4 +- .../test/path_provider_test.dart | 53 +++++++++++++++++++ 5 files changed, 80 insertions(+), 15 deletions(-) diff --git a/packages/path_provider/CHANGELOG.md b/packages/path_provider/CHANGELOG.md index 7546844b3549..498127adefe6 100644 --- a/packages/path_provider/CHANGELOG.md +++ b/packages/path_provider/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.2.2 + +* Correct the integration test for Android's `getApplicationSupportDirectory` call. +* Introduce `setMockPathProviderPlatform` for API for tests. +* Adds missing unit and integration tests. + ## 1.2.1 * Fix fall through bug. diff --git a/packages/path_provider/example/test_driver/path_provider.dart b/packages/path_provider/example/test_driver/path_provider.dart index 219d6660df7e..ca9ae8cf642a 100644 --- a/packages/path_provider/example/test_driver/path_provider.dart +++ b/packages/path_provider/example/test_driver/path_provider.dart @@ -36,18 +36,13 @@ void main() { }); test('getApplicationSupportDirectory', () async { - if (Platform.isIOS) { - final Directory result = await getApplicationSupportDirectory(); - final String uuid = Uuid().v1(); - final File file = File('${result.path}/$uuid.txt'); - file.writeAsStringSync('Hello world!'); - expect(file.readAsStringSync(), 'Hello world!'); - expect(result.listSync(), isNotEmpty); - file.deleteSync(); - } else if (Platform.isAndroid) { - final Future result = getApplicationSupportDirectory(); - expect(result, throwsA(isInstanceOf())); - } + final Directory result = await getApplicationSupportDirectory(); + final String uuid = Uuid().v1(); + final File file = File('${result.path}/$uuid.txt'); + file.writeAsStringSync('Hello world!'); + expect(file.readAsStringSync(), 'Hello world!'); + expect(result.listSync(), isNotEmpty); + file.deleteSync(); }); test('getExternalStorageDirectory', () async { diff --git a/packages/path_provider/lib/path_provider.dart b/packages/path_provider/lib/path_provider.dart index c53468ae05ca..069973a5aca7 100644 --- a/packages/path_provider/lib/path_provider.dart +++ b/packages/path_provider/lib/path_provider.dart @@ -3,13 +3,22 @@ // found in the LICENSE file. import 'dart:async'; -import 'dart:io'; +import 'dart:io' show Directory; import 'package:flutter/services.dart'; +import 'package:meta/meta.dart'; +import 'package:platform/platform.dart'; const MethodChannel _channel = MethodChannel('plugins.flutter.io/path_provider'); +Platform _platform = const LocalPlatform(); + +@visibleForTesting +void setMockPathProviderPlatform(Platform platform) { + _platform = platform; +} + /// Path to the temporary directory on the device that is not backed up and is /// suitable for storing caches of downloaded files. /// @@ -77,7 +86,7 @@ Future getApplicationDocumentsDirectory() async { /// /// On Android this uses the `getExternalFilesDir(null)`. Future getExternalStorageDirectory() async { - if (Platform.isIOS) + if (_platform.isIOS) throw UnsupportedError("Functionality not available on iOS"); final String path = await _channel.invokeMethod('getStorageDirectory'); diff --git a/packages/path_provider/pubspec.yaml b/packages/path_provider/pubspec.yaml index 634ba1ce834b..e7e7555d93cc 100644 --- a/packages/path_provider/pubspec.yaml +++ b/packages/path_provider/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for getting commonly used locations on the Android & iOS file systems, such as the temp and app data directories. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider -version: 1.2.1 +version: 1.2.2 flutter: plugin: @@ -14,6 +14,8 @@ flutter: dependencies: flutter: sdk: flutter + platform: ^2.0.0 + meta: ^1.0.5 dev_dependencies: flutter_test: diff --git a/packages/path_provider/test/path_provider_test.dart b/packages/path_provider/test/path_provider_test.dart index ec02cf8bbb0e..1e8afecab1cd 100644 --- a/packages/path_provider/test/path_provider_test.dart +++ b/packages/path_provider/test/path_provider_test.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:platform/platform.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -21,6 +22,10 @@ void main() { return response; }); + setUp(() { + setMockPathProviderPlatform(FakePlatform(operatingSystem: 'android')); + }); + tearDown(() { log.clear(); }); @@ -35,6 +40,18 @@ void main() { expect(directory, isNull); }); + test('getApplicationSupportDirectory test', () async { + response = null; + final Directory directory = await getApplicationSupportDirectory(); + expect( + log, + [ + isMethodCall('getApplicationSupportDirectory', arguments: null) + ], + ); + expect(directory, isNull); + }); + test('getApplicationDocumentsDirectory test', () async { response = null; final Directory directory = await getApplicationDocumentsDirectory(); @@ -47,6 +64,28 @@ void main() { expect(directory, isNull); }); + test('getExternalStorageDirectory test', () async { + response = null; + final Directory directory = await getExternalStorageDirectory(); + expect( + log, + [isMethodCall('getStorageDirectory', arguments: null)], + ); + expect(directory, isNull); + }); + + test('getExternalStorageDirectory iOS test', () async { + setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); + + response = null; + try { + await getExternalStorageDirectory(); + fail('should throw UnsupportedError'); + } catch (e) { + expect(e, isUnsupportedError); + } + }); + test('TemporaryDirectory path test', () async { final String fakePath = "/foo/bar/baz"; response = fakePath; @@ -54,10 +93,24 @@ void main() { expect(directory.path, equals(fakePath)); }); + test('ApplicationSupportDirectory path test', () async { + final String fakePath = "/foo/bar/baz"; + response = fakePath; + final Directory directory = await getApplicationSupportDirectory(); + expect(directory.path, equals(fakePath)); + }); + test('ApplicationDocumentsDirectory path test', () async { final String fakePath = "/foo/bar/baz"; response = fakePath; final Directory directory = await getApplicationDocumentsDirectory(); expect(directory.path, equals(fakePath)); }); + + test('ExternalStorageDirectory path test', () async { + final String fakePath = "/foo/bar/baz"; + response = fakePath; + final Directory directory = await getExternalStorageDirectory(); + expect(directory.path, equals(fakePath)); + }); } From eaf6bc70265b5aed033606e8c9456afa0cd90234 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Thu, 5 Sep 2019 23:07:02 +0530 Subject: [PATCH 055/133] [android_intent] Add action_application_details_settings (#2045) This PR includes addition of "action_application_details_settings" action to open App info settings. I was working on Handling denied permissions in one of my projects where i wanted to redirect user to app info settings to enable permissions in case the permissions were denied permanently (that is clicked 'Do not ask again checkbox') --- packages/android_intent/CHANGELOG.md | 4 ++++ packages/android_intent/README.md | 13 +++++++++++++ .../plugins/androidintent/AndroidIntentPlugin.java | 2 ++ packages/android_intent/example/lib/main.dart | 14 ++++++++++++++ packages/android_intent/pubspec.yaml | 2 +- 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/android_intent/CHANGELOG.md b/packages/android_intent/CHANGELOG.md index 7a818f38548a..82b4774ee29d 100644 --- a/packages/android_intent/CHANGELOG.md +++ b/packages/android_intent/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.3+1 + +* Added "action_application_details_settings" action to open application info settings . + ## 0.3.3 * Added "flags" option to call intent.addFlags(int) in native. diff --git a/packages/android_intent/README.md b/packages/android_intent/README.md index 5a9243e6914b..a6e4a4206a6e 100644 --- a/packages/android_intent/README.md +++ b/packages/android_intent/README.md @@ -29,6 +29,19 @@ for it in the plugin and use an action constant to refer to it. For instance: `'action_location_source_settings'` translates to `android.settings.LOCATION_SOURCE_SETTINGS` +`'action_application_details_settings'` translates to `android.settings.ACTION_APPLICATION_DETAILS_SETTINGS` + +```dart +if (platform.isAndroid) { + final AndroidIntent intent = AndroidIntent( + action: 'action_application_details_settings', + data: 'package:com.example.app', // replace com.example.app with your applicationId + ); + await intent.launch(); +} + +``` + Feel free to add support for additional Android intents. The Dart values supported for the arguments parameter, and their corresponding diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java index a66116cdceeb..b6d3c81b1a8c 100644 --- a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java @@ -46,6 +46,8 @@ private String convertAction(String action) { return Settings.ACTION_SETTINGS; case "action_location_source_settings": return Settings.ACTION_LOCATION_SOURCE_SETTINGS; + case "action_application_details_settings": + return Settings.ACTION_APPLICATION_DETAILS_SETTINGS; default: return action; } diff --git a/packages/android_intent/example/lib/main.dart b/packages/android_intent/example/lib/main.dart index becf3d6e1e75..f56cffd2bd20 100644 --- a/packages/android_intent/example/lib/main.dart +++ b/packages/android_intent/example/lib/main.dart @@ -142,6 +142,14 @@ class ExplicitIntentsWidget extends StatelessWidget { intent.launch(); } + void _openApplicationDetails() { + final AndroidIntent intent = const AndroidIntent( + action: 'action_application_details_settings', + data: 'package:io.flutter.plugins.androidintentexample', + ); + intent.launch(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -186,6 +194,12 @@ class ExplicitIntentsWidget extends StatelessWidget { 'Tap here to open Location Settings Configuration', ), onPressed: _openLocationSettingsConfiguration, + ), + RaisedButton( + child: const Text( + 'Tap here to open Application Details', + ), + onPressed: _openApplicationDetails, ) ], ), diff --git a/packages/android_intent/pubspec.yaml b/packages/android_intent/pubspec.yaml index 11cbc319bbf0..3da7690f2c0d 100644 --- a/packages/android_intent/pubspec.yaml +++ b/packages/android_intent/pubspec.yaml @@ -2,7 +2,7 @@ name: android_intent description: Flutter plugin for launching Android Intents. Not supported on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_intent -version: 0.3.3 +version: 0.3.3+1 flutter: plugin: From 518d3424e58b05262726c55d856cebd82ca6aa3c Mon Sep 17 00:00:00 2001 From: Jerry Zhou Date: Fri, 6 Sep 2019 04:53:16 +0800 Subject: [PATCH 056/133] [path_provider] add getApplicationLibraryDirectory (#1953) * [path_provider] add getLibraryDirectory --- .gitignore | 1 + packages/path_provider/CHANGELOG.md | 7 ++ packages/path_provider/example/lib/main.dart | 106 ++++++++---------- .../example/test_driver/path_provider.dart | 15 +++ .../ios/Classes/PathProviderPlugin.m | 6 + packages/path_provider/lib/path_provider.dart | 11 ++ packages/path_provider/pubspec.yaml | 2 +- .../test/path_provider_test.dart | 36 ++++++ 8 files changed, 126 insertions(+), 58 deletions(-) diff --git a/.gitignore b/.gitignore index ccb0eeb34605..734169649fd3 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ Pods/ ServiceDefinitions.json xcuserdata/ *.xcworkspace +**/DerivedData/ local.properties keystore.properties diff --git a/packages/path_provider/CHANGELOG.md b/packages/path_provider/CHANGELOG.md index 498127adefe6..6ded47745ddc 100644 --- a/packages/path_provider/CHANGELOG.md +++ b/packages/path_provider/CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.3.0 + +* Added iOS-only support for `getLibraryDirectory`. +* Update integration tests and example test. +* Update example app UI to use a `ListView` show the list of content. +* Update .gitignore to include Xcode build output folder `**/DerivedData/` + ## 1.2.2 * Correct the integration test for Android's `getApplicationSupportDirectory` call. diff --git a/packages/path_provider/example/lib/main.dart b/packages/path_provider/example/lib/main.dart index bea99bc4b671..2e9e9513f787 100644 --- a/packages/path_provider/example/lib/main.dart +++ b/packages/path_provider/example/lib/main.dart @@ -36,6 +36,7 @@ class MyHomePage extends StatefulWidget { class _MyHomePageState extends State { Future _tempDirectory; Future _appSupportDirectory; + Future _appLibraryDirectory; Future _appDocumentsDirectory; Future _externalDocumentsDirectory; @@ -72,6 +73,12 @@ class _MyHomePageState extends State { }); } + void _requestAppLibraryDirectory() { + setState(() { + _appLibraryDirectory = getLibraryDirectory(); + }); + } + void _requestExternalStorageDirectory() { setState(() { _externalDocumentsDirectory = getExternalStorageDirectory(); @@ -85,70 +92,55 @@ class _MyHomePageState extends State { title: Text(widget.title), ), body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + child: ListView( children: [ - Column( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: RaisedButton( - child: const Text('Get Temporary Directory'), - onPressed: _requestTempDirectory, - ), - ), - ], - ), - Expanded( - child: FutureBuilder( - future: _tempDirectory, builder: _buildDirectory), - ), - Column( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: RaisedButton( - child: const Text('Get Application Documents Directory'), - onPressed: _requestAppDocumentsDirectory, - ), - ), - ], + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Temporary Directory'), + onPressed: _requestTempDirectory, + ), ), - Expanded( - child: FutureBuilder( - future: _appDocumentsDirectory, builder: _buildDirectory), + FutureBuilder( + future: _tempDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Application Documents Directory'), + onPressed: _requestAppDocumentsDirectory, + ), ), - Column( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: RaisedButton( - child: const Text('Get Application Support Directory'), - onPressed: _requestAppSupportDirectory, - ), - ), - ], + FutureBuilder( + future: _appDocumentsDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Application Support Directory'), + onPressed: _requestAppSupportDirectory, + ), ), - Expanded( - child: FutureBuilder( - future: _appSupportDirectory, builder: _buildDirectory), + FutureBuilder( + future: _appSupportDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: const Text('Get Application Library Directory'), + onPressed: _requestAppLibraryDirectory, + ), ), - Column(children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: RaisedButton( - child: Text( - '${Platform.isIOS ? "External directories are unavailable " "on iOS" : "Get External Storage Directory"}'), - onPressed: - Platform.isIOS ? null : _requestExternalStorageDirectory, - ), + FutureBuilder( + future: _appLibraryDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: RaisedButton( + child: Text( + '${Platform.isIOS ? "External directories are unavailable " "on iOS" : "Get External Storage Directory"}'), + onPressed: + Platform.isIOS ? null : _requestExternalStorageDirectory, ), - ]), - Expanded( - child: FutureBuilder( - future: _externalDocumentsDirectory, - builder: _buildDirectory), ), + FutureBuilder( + future: _externalDocumentsDirectory, builder: _buildDirectory) ], ), ), diff --git a/packages/path_provider/example/test_driver/path_provider.dart b/packages/path_provider/example/test_driver/path_provider.dart index ca9ae8cf642a..8438965f9646 100644 --- a/packages/path_provider/example/test_driver/path_provider.dart +++ b/packages/path_provider/example/test_driver/path_provider.dart @@ -45,6 +45,21 @@ void main() { file.deleteSync(); }); + test('getLibraryDirectory', () async { + if (Platform.isIOS) { + final Directory result = await getLibraryDirectory(); + final String uuid = Uuid().v1(); + final File file = File('${result.path}/$uuid.txt'); + file.writeAsStringSync('Hello world!'); + expect(file.readAsStringSync(), 'Hello world!'); + expect(result.listSync(), isNotEmpty); + file.deleteSync(); + } else if (Platform.isAndroid) { + final Future result = getLibraryDirectory(); + expect(result, throwsA(isInstanceOf())); + } + }); + test('getExternalStorageDirectory', () async { if (Platform.isIOS) { final Future result = getExternalStorageDirectory(); diff --git a/packages/path_provider/ios/Classes/PathProviderPlugin.m b/packages/path_provider/ios/Classes/PathProviderPlugin.m index a8dc4a7b5bfe..1bf0e7af1ff8 100644 --- a/packages/path_provider/ios/Classes/PathProviderPlugin.m +++ b/packages/path_provider/ios/Classes/PathProviderPlugin.m @@ -42,6 +42,8 @@ + (void)registerWithRegistrar:(NSObject*)registrar { } else { result(path); } + } else if ([@"getLibraryDirectory" isEqualToString:call.method]) { + result([self getLibraryDirectory]); } else { result(FlutterMethodNotImplemented); } @@ -60,4 +62,8 @@ + (NSString*)getApplicationSupportDirectory { return GetDirectoryOfType(NSApplicationSupportDirectory); } ++ (NSString*)getLibraryDirectory { + return GetDirectoryOfType(NSLibraryDirectory); +} + @end diff --git a/packages/path_provider/lib/path_provider.dart b/packages/path_provider/lib/path_provider.dart index 069973a5aca7..f0587225c498 100644 --- a/packages/path_provider/lib/path_provider.dart +++ b/packages/path_provider/lib/path_provider.dart @@ -59,6 +59,17 @@ Future getApplicationSupportDirectory() async { return Directory(path); } +/// Path to the directory where application can store files that are persistent, +/// backed up, and not visible to the user, such as sqlite.db. +Future getLibraryDirectory() async { + final String path = + await _channel.invokeMethod('getLibraryDirectory'); + if (path == null) { + return null; + } + return Directory(path); +} + /// Path to a directory where the application may place data that is /// user-generated, or that cannot otherwise be recreated by your application. /// diff --git a/packages/path_provider/pubspec.yaml b/packages/path_provider/pubspec.yaml index e7e7555d93cc..80c6bde28379 100644 --- a/packages/path_provider/pubspec.yaml +++ b/packages/path_provider/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for getting commonly used locations on the Android & iOS file systems, such as the temp and app data directories. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider -version: 1.2.2 +version: 1.3.0 flutter: plugin: diff --git a/packages/path_provider/test/path_provider_test.dart b/packages/path_provider/test/path_provider_test.dart index 1e8afecab1cd..24368c04cb8c 100644 --- a/packages/path_provider/test/path_provider_test.dart +++ b/packages/path_provider/test/path_provider_test.dart @@ -64,6 +64,18 @@ void main() { expect(directory, isNull); }); + test('getApplicationSupportDirectory test', () async { + response = null; + final Directory directory = await getApplicationSupportDirectory(); + expect( + log, + [ + isMethodCall('getApplicationSupportDirectory', arguments: null) + ], + ); + expect(directory, isNull); + }); + test('getExternalStorageDirectory test', () async { response = null; final Directory directory = await getExternalStorageDirectory(); @@ -74,6 +86,16 @@ void main() { expect(directory, isNull); }); + test('getLibraryDirectory test', () async { + response = null; + final Directory directory = await getLibraryDirectory(); + expect( + log, + [isMethodCall('getLibraryDirectory', arguments: null)], + ); + expect(directory, isNull); + }); + test('getExternalStorageDirectory iOS test', () async { setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); @@ -107,6 +129,20 @@ void main() { expect(directory.path, equals(fakePath)); }); + test('ApplicationSupportDirectory path test', () async { + final String fakePath = "/foo/bar/baz"; + response = fakePath; + final Directory directory = await getApplicationSupportDirectory(); + expect(directory.path, equals(fakePath)); + }); + + test('ApplicationLibraryDirectory path test', () async { + final String fakePath = "/foo/bar/baz"; + response = fakePath; + final Directory directory = await getLibraryDirectory(); + expect(directory.path, equals(fakePath)); + }); + test('ExternalStorageDirectory path test', () async { final String fakePath = "/foo/bar/baz"; response = fakePath; From ba95b87e1c35adacbd3b411e8f6a3ffe832f3bbe Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 6 Sep 2019 14:11:32 -0700 Subject: [PATCH 057/133] [cirrus] Use flutter create for all_plugins test (#2004) --- examples/all_plugins/.metadata | 10 - examples/all_plugins/README.md | 16 - examples/all_plugins/android/app/build.gradle | 66 --- .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 36 -- .../io/plugins/all_plugins/MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../app/src/profile/AndroidManifest.xml | 7 - examples/all_plugins/android/build.gradle | 31 -- .../all_plugins/android/gradle.properties | 4 - .../gradle/wrapper/gradle-wrapper.properties | 6 - examples/all_plugins/android/settings.gradle | 15 - .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../all_plugins/ios/Flutter/Debug.xcconfig | 1 - .../all_plugins/ios/Flutter/Release.xcconfig | 1 - .../ios/Runner.xcodeproj/project.pbxproj | 506 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 93 ---- .../contents.xcworkspacedata | 7 - examples/all_plugins/ios/Runner/AppDelegate.h | 6 - examples/all_plugins/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 122 ----- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 -- .../ios/Runner/Base.lproj/Main.storyboard | 26 - examples/all_plugins/ios/Runner/Info.plist | 47 -- examples/all_plugins/ios/Runner/main.m | 9 - examples/all_plugins/lib/main.dart | 111 ---- examples/all_plugins/pubspec.yaml | 1 - examples/all_plugins/test/widget_test.dart | 30 -- script/build_all_plugins_app.sh | 7 +- 56 files changed, 3 insertions(+), 1306 deletions(-) delete mode 100644 examples/all_plugins/.metadata delete mode 100644 examples/all_plugins/README.md delete mode 100644 examples/all_plugins/android/app/build.gradle delete mode 100644 examples/all_plugins/android/app/src/debug/AndroidManifest.xml delete mode 100644 examples/all_plugins/android/app/src/main/AndroidManifest.xml delete mode 100644 examples/all_plugins/android/app/src/main/java/io/plugins/all_plugins/MainActivity.java delete mode 100644 examples/all_plugins/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 examples/all_plugins/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 examples/all_plugins/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 examples/all_plugins/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 examples/all_plugins/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 examples/all_plugins/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 examples/all_plugins/android/app/src/main/res/values/styles.xml delete mode 100644 examples/all_plugins/android/app/src/profile/AndroidManifest.xml delete mode 100644 examples/all_plugins/android/build.gradle delete mode 100644 examples/all_plugins/android/gradle.properties delete mode 100644 examples/all_plugins/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 examples/all_plugins/android/settings.gradle delete mode 100644 examples/all_plugins/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 examples/all_plugins/ios/Flutter/Debug.xcconfig delete mode 100644 examples/all_plugins/ios/Flutter/Release.xcconfig delete mode 100644 examples/all_plugins/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 examples/all_plugins/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/all_plugins/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 examples/all_plugins/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/all_plugins/ios/Runner/AppDelegate.h delete mode 100644 examples/all_plugins/ios/Runner/AppDelegate.m delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 examples/all_plugins/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 examples/all_plugins/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 examples/all_plugins/ios/Runner/Info.plist delete mode 100644 examples/all_plugins/ios/Runner/main.m delete mode 100644 examples/all_plugins/lib/main.dart delete mode 100644 examples/all_plugins/pubspec.yaml delete mode 100644 examples/all_plugins/test/widget_test.dart diff --git a/examples/all_plugins/.metadata b/examples/all_plugins/.metadata deleted file mode 100644 index c36997db797b..000000000000 --- a/examples/all_plugins/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# 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: 9114f4456cb8fd49e51bef9253e357225f209048 - channel: master - -project_type: app diff --git a/examples/all_plugins/README.md b/examples/all_plugins/README.md deleted file mode 100644 index fbf90fd034b9..000000000000 --- a/examples/all_plugins/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# all_plugins - -Flutter app containing all 1st party plugins. - -## 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/examples/all_plugins/android/app/build.gradle b/examples/all_plugins/android/app/build.gradle deleted file mode 100644 index 9fbd496f70df..000000000000 --- a/examples/all_plugins/android/app/build.gradle +++ /dev/null @@ -1,66 +0,0 @@ -gradle.startParameter.showStacktrace = org.gradle.api.logging.configuration.ShowStacktrace.ALWAYS - -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 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "io.plugins.all_plugins" - minSdkVersion 16 - multiDexEnabled true - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - 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 '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - implementation 'com.google.guava:guava:27.0.1-android' - androidTestImplementation 'androidx.test:runner:1.1.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' - api 'androidx.exifinterface:exifinterface:1.0.0' -} diff --git a/examples/all_plugins/android/app/src/debug/AndroidManifest.xml b/examples/all_plugins/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 278e553fdf19..000000000000 --- a/examples/all_plugins/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/examples/all_plugins/android/app/src/main/AndroidManifest.xml b/examples/all_plugins/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index fc8cb90afaa3..000000000000 --- a/examples/all_plugins/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/examples/all_plugins/android/app/src/main/java/io/plugins/all_plugins/MainActivity.java b/examples/all_plugins/android/app/src/main/java/io/plugins/all_plugins/MainActivity.java deleted file mode 100644 index 492fd7e07b17..000000000000 --- a/examples/all_plugins/android/app/src/main/java/io/plugins/all_plugins/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.plugins.all_plugins; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/examples/all_plugins/android/app/src/main/res/drawable/launch_background.xml b/examples/all_plugins/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/examples/all_plugins/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/examples/all_plugins/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/all_plugins/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/examples/all_plugins/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/all_plugins/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/examples/all_plugins/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/all_plugins/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/examples/all_plugins/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/all_plugins/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/examples/all_plugins/android/app/src/main/res/values/styles.xml b/examples/all_plugins/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/examples/all_plugins/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/examples/all_plugins/android/app/src/profile/AndroidManifest.xml b/examples/all_plugins/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 278e553fdf19..000000000000 --- a/examples/all_plugins/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/examples/all_plugins/android/build.gradle b/examples/all_plugins/android/build.gradle deleted file mode 100644 index ad6301ce2ad9..000000000000 --- a/examples/all_plugins/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -gradle.startParameter.showStacktrace = org.gradle.api.logging.configuration.ShowStacktrace.ALWAYS - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/examples/all_plugins/android/gradle.properties b/examples/all_plugins/android/gradle.properties deleted file mode 100644 index bb0411185aea..000000000000 --- a/examples/all_plugins/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true -org.gradle.jvmargs=-Xmx1536M - diff --git a/examples/all_plugins/android/gradle/wrapper/gradle-wrapper.properties b/examples/all_plugins/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f1fd..000000000000 --- a/examples/all_plugins/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#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-4.10.2-all.zip diff --git a/examples/all_plugins/android/settings.gradle b/examples/all_plugins/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/examples/all_plugins/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/examples/all_plugins/ios/Flutter/AppFrameworkInfo.plist b/examples/all_plugins/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 9367d483e44e..000000000000 --- a/examples/all_plugins/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/examples/all_plugins/ios/Flutter/Debug.xcconfig b/examples/all_plugins/ios/Flutter/Debug.xcconfig deleted file mode 100644 index 592ceee85b89..000000000000 --- a/examples/all_plugins/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/examples/all_plugins/ios/Flutter/Release.xcconfig b/examples/all_plugins/ios/Flutter/Release.xcconfig deleted file mode 100644 index 592ceee85b89..000000000000 --- a/examples/all_plugins/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/examples/all_plugins/ios/Runner.xcodeproj/project.pbxproj b/examples/all_plugins/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index df9cc66441db..000000000000 --- a/examples/all_plugins/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,506 +0,0 @@ -// !$*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 */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - 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 = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 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 = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - 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 */, - 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" 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; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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)"; - DEVELOPMENT_TEAM = S8QB4VV633; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.plugins.allPlugins; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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_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_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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = 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; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.plugins.allPlugins; - 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; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.plugins.allPlugins; - 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/examples/all_plugins/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/all_plugins/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/examples/all_plugins/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/all_plugins/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/all_plugins/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 786d6aad5457..000000000000 --- a/examples/all_plugins/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/all_plugins/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/all_plugins/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed0f..000000000000 --- a/examples/all_plugins/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/all_plugins/ios/Runner/AppDelegate.h b/examples/all_plugins/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9cf4..000000000000 --- a/examples/all_plugins/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/examples/all_plugins/ios/Runner/AppDelegate.m b/examples/all_plugins/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90be12..000000000000 --- a/examples/all_plugins/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "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/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2d9d..000000000000 --- a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b70f1..000000000000 --- a/examples/all_plugins/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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/examples/all_plugins/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/all_plugins/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c939..000000000000 --- a/examples/all_plugins/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/all_plugins/ios/Runner/Base.lproj/Main.storyboard b/examples/all_plugins/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb38..000000000000 --- a/examples/all_plugins/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/all_plugins/ios/Runner/Info.plist b/examples/all_plugins/ios/Runner/Info.plist deleted file mode 100644 index 127a08b03f39..000000000000 --- a/examples/all_plugins/ios/Runner/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - all_plugins - 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 - - io.flutter.embedded_views_preview - - - diff --git a/examples/all_plugins/ios/Runner/main.m b/examples/all_plugins/ios/Runner/main.m deleted file mode 100644 index dff6597e4513..000000000000 --- a/examples/all_plugins/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/examples/all_plugins/lib/main.dart b/examples/all_plugins/lib/main.dart deleted file mode 100644 index f4ebf1dd00e1..000000000000 --- a/examples/all_plugins/lib/main.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'package:flutter/material.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatelessWidget { - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // Try running your application with "flutter run". You'll see the - // application has a blue toolbar. Then, without quitting the app, try - // changing the primarySwatch below to Colors.green and then invoke - // "hot reload" (press "r" in the console where you ran "flutter run", - // or simply save your changes to "hot reload" in a Flutter IDE). - // Notice that the counter didn't reset back to zero; the application - // is not restarted. - primarySwatch: Colors.blue, - ), - home: MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Invoke "debug painting" (press "p" in the console, choose the - // "Toggle Debug Paint" action from the Flutter Inspector in Android - // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) - // to see the wireframe for each widget. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.display1, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} diff --git a/examples/all_plugins/pubspec.yaml b/examples/all_plugins/pubspec.yaml deleted file mode 100644 index 75fa414088ac..000000000000 --- a/examples/all_plugins/pubspec.yaml +++ /dev/null @@ -1 +0,0 @@ -### Generated file. Run `pub global run flutter_plugin_tools gen-pubspec`. diff --git a/examples/all_plugins/test/widget_test.dart b/examples/all_plugins/test/widget_test.dart deleted file mode 100644 index 809cad928ec8..000000000000 --- a/examples/all_plugins/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:all_plugins/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index 4bf59d2e8a80..dcf3bcdfd2a3 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -10,9 +10,7 @@ REPO_DIR="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/common.sh" check_changed_packages > /dev/null -cd $REPO_DIR/examples/all_plugins -flutter clean > /dev/null -(cd "$REPO_DIR" && pub global run flutter_plugin_tools gen-pubspec --exclude instrumentation_adapter) +(cd "$REPO_DIR" && pub global run flutter_plugin_tools all-plugins-app --exclude instrumentation_adapter) function error() { echo "$@" 1>&2 @@ -21,7 +19,7 @@ function error() { failures=0 for version in "debug" "release"; do - (flutter build $@ --$version > /dev/null) + (cd $REPO_DIR/all_plugins && flutter build $@ --$version) if [ $? -eq 0 ]; then echo "Successfully built $version all_plugins app." @@ -41,4 +39,5 @@ for version in "debug" "release"; do fi done +rm -rf $REPO_DIR/all_plugins/ exit $failures From 4bda246b8100878a6a7ba0a2c1762c3270b722a4 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 9 Sep 2019 08:58:58 -0700 Subject: [PATCH 058/133] [instrumentation_adapter] Add support for running tests with Flutter driver (#2050) --- packages/instrumentation_adapter/CHANGELOG.md | 4 +++ packages/instrumentation_adapter/README.md | 12 +++++++ .../lib/instrumentation_adapter.dart | 36 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index 73557c5c704a..e3e890b30c23 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.2 + +* Added support for running tests using Flutter driver. + ## 0.1.1 * Updates about using *androidx* library. diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index 81f515569ac5..b2dad9798593 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -90,3 +90,15 @@ gcloud firebase test android run --type instrumentation \ --results-bucket= \ --results-dir= ``` + +## Flutter driver support + +`InstrumentationAdapterFlutterBinding` also reports test results to `FlutterDriver` +when run on the command line via `flutter drive`. + +```dart + final FlutterDriver driver = await FlutterDriver.connect(); + final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); + exit(result == 'pass' ? 0 : 1); +``` diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index 81f81872d950..2ec16c4ebe56 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -2,6 +2,7 @@ // 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:flutter_test/flutter_test.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -16,9 +17,12 @@ class InstrumentationAdapterFlutterBinding tearDownAll(() async { await _channel.invokeMethod( 'allTestsFinished', {'results': _results}); + if (!_allTestsPassed.isCompleted) _allTestsPassed.complete(true); }); } + final Completer _allTestsPassed = Completer(); + static WidgetsBinding ensureInitialized() { if (WidgetsBinding.instance == null) { InstrumentationAdapterFlutterBinding(); @@ -32,14 +36,46 @@ class InstrumentationAdapterFlutterBinding static Map _results = {}; + // Emulates the Flutter driver extension, returning 'pass' or 'fail'. + @override + void initServiceExtensions() { + super.initServiceExtensions(); + Future> callback(Map params) async { + final String command = params['command']; + Map response; + switch (command) { + case 'request_data': + final bool allTestsPassed = await _allTestsPassed.future; + response = { + 'message': allTestsPassed ? 'pass' : 'fail', + }; + break; + case 'get_health': + response = {'status': 'ok'}; + break; + default: + throw UnimplementedError('$command is not implemented'); + } + return { + 'isError': false, + 'response': response, + }; + } + + registerServiceExtension(name: 'driver', callback: callback); + } + @override Future runTest(Future testBody(), VoidCallback invariantTester, {String description = '', Duration timeout}) async { // TODO(jackson): Report the results individually instead of all at once // See https://github.com/flutter/flutter/issues/38985 + final TestExceptionReporter valueBeforeTest = reportTestException; reportTestException = (FlutterErrorDetails details, String testDescription) { _results[description] = 'failed'; + _allTestsPassed.complete(false); + valueBeforeTest(details, testDescription); }; await super.runTest(testBody, invariantTester, description: description, timeout: timeout); From 27f5464862d94bc17c6cb54584f8e3051c2f9fae Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 9 Sep 2019 10:28:33 -0700 Subject: [PATCH 059/133] [instrumentation_adapter] update for release (#2051) --- packages/instrumentation_adapter/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index b73c7499aa81..443d32f7f300 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,6 +1,6 @@ name: instrumentation_adapter description: Runs tests that use the flutter_test API as platform native instrumentation tests. -version: 0.1.1 +version: 0.1.2 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter From cd38eb39c8ea9376dc0327fef2e715e0b5bf708b Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 9 Sep 2019 15:40:10 -0700 Subject: [PATCH 060/133] [instrumentation_adapter] Add stub iOS implementation and example app (#2052) * Add stub iOS implementation and example app * Gracefully handle running tests on the host --- packages/instrumentation_adapter/CHANGELOG.md | 7 + packages/instrumentation_adapter/README.md | 3 +- .../example/.gitignore | 73 +++ .../instrumentation_adapter/example/.metadata | 10 + .../instrumentation_adapter/example/README.md | 16 + .../example/android/app/build.gradle | 61 ++ .../MainActivityTest.java | 11 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 + .../MainActivity.java | 13 + .../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/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 15 + .../instrumentation_adapter/widget_test.dart | 5 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../ios/Runner.xcodeproj/project.pbxproj | 576 ++++++++++++++++++ .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../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 | 25 + .../example/pubspec.yaml | 26 + .../example/test_driver/widget.dart | 31 + .../example/test_driver/widget_test.dart | 9 + .../instrumentation_adapter/ios/.gitignore | 37 ++ .../ios/Assets/.gitkeep | 0 .../Classes/InstrumentationAdapterPlugin.h | 4 + .../Classes/InstrumentationAdapterPlugin.m | 20 + .../ios/instrumentation_adapter.podspec | 21 + .../lib/instrumentation_adapter.dart | 8 +- packages/instrumentation_adapter/pubspec.yaml | 4 +- 66 files changed, 1480 insertions(+), 6 deletions(-) create mode 100644 packages/instrumentation_adapter/example/.gitignore create mode 100644 packages/instrumentation_adapter/example/.metadata create mode 100644 packages/instrumentation_adapter/example/README.md create mode 100644 packages/instrumentation_adapter/example/android/app/build.gradle create mode 100644 packages/instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example/MainActivityTest.java create mode 100644 packages/instrumentation_adapter/example/android/app/src/debug/AndroidManifest.xml create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/AndroidManifest.xml create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/java/com/example/instrumentation_adapter_example/MainActivity.java create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/instrumentation_adapter/example/android/app/src/main/res/values/styles.xml create mode 100644 packages/instrumentation_adapter/example/android/app/src/profile/AndroidManifest.xml create mode 100644 packages/instrumentation_adapter/example/android/build.gradle create mode 100644 packages/instrumentation_adapter/example/android/gradle.properties create mode 100644 packages/instrumentation_adapter/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 packages/instrumentation_adapter/example/android/settings.gradle create mode 100644 packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart create mode 100644 packages/instrumentation_adapter/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/instrumentation_adapter/example/ios/Flutter/Debug.xcconfig create mode 100644 packages/instrumentation_adapter/example/ios/Flutter/Release.xcconfig create mode 100644 packages/instrumentation_adapter/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/instrumentation_adapter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/instrumentation_adapter/example/ios/Runner/AppDelegate.h create mode 100644 packages/instrumentation_adapter/example/ios/Runner/AppDelegate.m create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/instrumentation_adapter/example/ios/Runner/Info.plist create mode 100644 packages/instrumentation_adapter/example/ios/Runner/main.m create mode 100644 packages/instrumentation_adapter/example/lib/main.dart create mode 100644 packages/instrumentation_adapter/example/pubspec.yaml create mode 100644 packages/instrumentation_adapter/example/test_driver/widget.dart create mode 100644 packages/instrumentation_adapter/example/test_driver/widget_test.dart create mode 100644 packages/instrumentation_adapter/ios/.gitignore create mode 100644 packages/instrumentation_adapter/ios/Assets/.gitkeep create mode 100644 packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h create mode 100644 packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m create mode 100644 packages/instrumentation_adapter/ios/instrumentation_adapter.podspec diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index e3e890b30c23..f4cd692a1916 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.1.3 + +* Added example app. +* Added stub iOS implementation. +* Updated README. +* No longer throws errors when running tests on the host. + ## 0.1.2 * Added support for running tests using Flutter driver. diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index b2dad9798593..1063589c615b 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -12,11 +12,10 @@ Add a dependency on the `instrumentation_adapter` package in the pubspec.yaml of the example app. Invoke `InstrumentationAdapterFlutterBinding.ensureInitialized()` at the start -of a test file. +of a test file, e.g. ```dart import 'package:instrumentation_adapter/instrumentation_adapter.dart'; -import '../test/package_info.dart' as test; void main() { InstrumentationAdapterFlutterBinding.ensureInitialized(); diff --git a/packages/instrumentation_adapter/example/.gitignore b/packages/instrumentation_adapter/example/.gitignore new file mode 100644 index 000000000000..2ddde2a5e36f --- /dev/null +++ b/packages/instrumentation_adapter/example/.gitignore @@ -0,0 +1,73 @@ +# 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 +.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/Generated.xcconfig +**/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 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/packages/instrumentation_adapter/example/.metadata b/packages/instrumentation_adapter/example/.metadata new file mode 100644 index 000000000000..76f3d14cd0f9 --- /dev/null +++ b/packages/instrumentation_adapter/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: 4fc11db5cc50345b7d64cb4015eb9a92229f6384 + channel: master + +project_type: app diff --git a/packages/instrumentation_adapter/example/README.md b/packages/instrumentation_adapter/example/README.md new file mode 100644 index 000000000000..f6030a4080b2 --- /dev/null +++ b/packages/instrumentation_adapter/example/README.md @@ -0,0 +1,16 @@ +# instrumentation_adapter_example + +Demonstrates how to use the instrumentation_adapter 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/instrumentation_adapter/example/android/app/build.gradle b/packages/instrumentation_adapter/example/android/app/build.gradle new file mode 100644 index 000000000000..500e9ea951c6 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/build.gradle @@ -0,0 +1,61 @@ +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 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.instrumentation_adapter_example" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + 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 '../..' +} + +dependencies { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} diff --git a/packages/instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example/MainActivityTest.java b/packages/instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example/MainActivityTest.java new file mode 100644 index 000000000000..bb489bf57942 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example/MainActivityTest.java @@ -0,0 +1,11 @@ +package com.example.instrumentation_adapter_example; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.instrumentationadapter.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class MainActivityTest { + @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} diff --git a/packages/instrumentation_adapter/example/android/app/src/debug/AndroidManifest.xml b/packages/instrumentation_adapter/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000000..87cc33d27c03 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/instrumentation_adapter/example/android/app/src/main/AndroidManifest.xml b/packages/instrumentation_adapter/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..653fa39a669d --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/packages/instrumentation_adapter/example/android/app/src/main/java/com/example/instrumentation_adapter_example/MainActivity.java b/packages/instrumentation_adapter/example/android/app/src/main/java/com/example/instrumentation_adapter_example/MainActivity.java new file mode 100644 index 000000000000..21cb8e80d9c9 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/src/main/java/com/example/instrumentation_adapter_example/MainActivity.java @@ -0,0 +1,13 @@ +package com.example.instrumentation_adapter_example; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/instrumentation_adapter/example/android/app/src/main/res/drawable/launch_background.xml b/packages/instrumentation_adapter/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000000..304732f88420 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/instrumentation_adapter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/android/app/src/main/res/values/styles.xml b/packages/instrumentation_adapter/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000000..00fa4417cfbe --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/packages/instrumentation_adapter/example/android/app/src/profile/AndroidManifest.xml b/packages/instrumentation_adapter/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000000..87cc33d27c03 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/instrumentation_adapter/example/android/build.gradle b/packages/instrumentation_adapter/example/android/build.gradle new file mode 100644 index 000000000000..bb8a303898ca --- /dev/null +++ b/packages/instrumentation_adapter/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/packages/instrumentation_adapter/example/android/gradle.properties b/packages/instrumentation_adapter/example/android/gradle.properties new file mode 100644 index 000000000000..2bd6f4fda009 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx1536M + diff --git a/packages/instrumentation_adapter/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/instrumentation_adapter/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..2819f022f1fd --- /dev/null +++ b/packages/instrumentation_adapter/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-4.10.2-all.zip diff --git a/packages/instrumentation_adapter/example/android/settings.gradle b/packages/instrumentation_adapter/example/android/settings.gradle new file mode 100644 index 000000000000..5a2f14fb18f6 --- /dev/null +++ b/packages/instrumentation_adapter/example/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart b/packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart new file mode 100644 index 000000000000..9829553c6522 --- /dev/null +++ b/packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart @@ -0,0 +1,5 @@ +import '../test_driver/widget.dart' as test; + +void main() { + test.main(); +} diff --git a/packages/instrumentation_adapter/example/ios/Flutter/AppFrameworkInfo.plist b/packages/instrumentation_adapter/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000000..6b4c0f78a785 --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/packages/instrumentation_adapter/example/ios/Flutter/Debug.xcconfig b/packages/instrumentation_adapter/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000000..e8efba114687 --- /dev/null +++ b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Flutter/Release.xcconfig b/packages/instrumentation_adapter/example/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000000..399e9340e6f6 --- /dev/null +++ b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/instrumentation_adapter/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..88aca9f4d27e --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,576 @@ +// !$*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 */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 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 */; }; + F81AEF02CE63DA0020B29F57 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 241E53603CE376E3BCB194D3 /* libPods-Runner.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0D6F1CB5DBBEBCC75AFAD041 /* 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 = ""; }; + 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 = ""; }; + 241E53603CE376E3BCB194D3 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; + D69CCAD5F82E76E2E22BFA96 /* 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 = ""; }; + E23EF4D45DAE46B9DDB9B445 /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + F81AEF02CE63DA0020B29F57 /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 42D734D13B733A64B01A24A9 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 241E53603CE376E3BCB194D3 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + BAB55133DD7BD81A2557E916 /* Pods */, + 42D734D13B733A64B01A24A9 /* 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 = ""; + }; + BAB55133DD7BD81A2557E916 /* Pods */ = { + isa = PBXGroup; + children = ( + D69CCAD5F82E76E2E22BFA96 /* Pods-Runner.debug.xcconfig */, + 0D6F1CB5DBBEBCC75AFAD041 /* Pods-Runner.release.xcconfig */, + E23EF4D45DAE46B9DDB9B445 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 2882CCC16181B61F1ABC876C /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 0D321280D358770769172C49 /* [CP] Embed Pods Frameworks */, + ); + 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 = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + 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 */ + 0D321280D358770769172C49 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 2882CCC16181B61F1ABC876C /* [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; + }; + 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\" 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; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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 = 8.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; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.instrumentationAdapterExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + 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 = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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 = 8.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; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.instrumentationAdapterExample; + 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; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.instrumentationAdapterExample; + 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/instrumentation_adapter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/instrumentation_adapter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000000..a28140cfdb3f --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.h b/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.h new file mode 100644 index 000000000000..36e21bbf9cf4 --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.m b/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.m new file mode 100644 index 000000000000..59a72e90be12 --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#include "AppDelegate.h" +#include "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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000000..d36b1fab2d9d --- /dev/null +++ b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000000..89c2725b70f1 --- /dev/null +++ b/packages/instrumentation_adapter/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/instrumentation_adapter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/instrumentation_adapter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000000..f2e259c7c939 --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/instrumentation_adapter/example/ios/Runner/Base.lproj/Main.storyboard b/packages/instrumentation_adapter/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000000..f3c28516fb38 --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/instrumentation_adapter/example/ios/Runner/Info.plist b/packages/instrumentation_adapter/example/ios/Runner/Info.plist new file mode 100644 index 000000000000..613203aaeb06 --- /dev/null +++ b/packages/instrumentation_adapter/example/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + instrumentation_adapter_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/instrumentation_adapter/example/ios/Runner/main.m b/packages/instrumentation_adapter/example/ios/Runner/main.m new file mode 100644 index 000000000000..dff6597e4513 --- /dev/null +++ b/packages/instrumentation_adapter/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/instrumentation_adapter/example/lib/main.dart b/packages/instrumentation_adapter/example/lib/main.dart new file mode 100644 index 000000000000..c1206d562f88 --- /dev/null +++ b/packages/instrumentation_adapter/example/lib/main.dart @@ -0,0 +1,25 @@ +import 'dart:io' show Platform; +import 'package:flutter/material.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + child: Text('Platform: ${Platform.operatingSystem}\n'), + ), + ), + ); + } +} diff --git a/packages/instrumentation_adapter/example/pubspec.yaml b/packages/instrumentation_adapter/example/pubspec.yaml new file mode 100644 index 000000000000..55d547736b24 --- /dev/null +++ b/packages/instrumentation_adapter/example/pubspec.yaml @@ -0,0 +1,26 @@ +name: instrumentation_adapter_example +description: Demonstrates how to use the instrumentation_adapter plugin. +publish_to: 'none' + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + cupertino_icons: ^0.1.2 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_driver: + sdk: flutter + instrumentation_adapter: + path: ../ + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +flutter: + uses-material-design: true diff --git a/packages/instrumentation_adapter/example/test_driver/widget.dart b/packages/instrumentation_adapter/example/test_driver/widget.dart new file mode 100644 index 000000000000..109002c86790 --- /dev/null +++ b/packages/instrumentation_adapter/example/test_driver/widget.dart @@ -0,0 +1,31 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'dart:io' show Platform; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:instrumentation_adapter/instrumentation_adapter.dart'; + +import 'package:instrumentation_adapter_example/main.dart'; + +void main() { + InstrumentationAdapterFlutterBinding.ensureInitialized(); + testWidgets('verify text', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => + widget is Text && + widget.data.startsWith('Platform: ${Platform.operatingSystem}'), + ), + findsOneWidget, + ); + }); +} diff --git a/packages/instrumentation_adapter/example/test_driver/widget_test.dart b/packages/instrumentation_adapter/example/test_driver/widget_test.dart new file mode 100644 index 000000000000..88e53d1c1f05 --- /dev/null +++ b/packages/instrumentation_adapter/example/test_driver/widget_test.dart @@ -0,0 +1,9 @@ +import 'dart:async'; + +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); +} diff --git a/packages/instrumentation_adapter/ios/.gitignore b/packages/instrumentation_adapter/ios/.gitignore new file mode 100644 index 000000000000..aa479fd3ce8a --- /dev/null +++ b/packages/instrumentation_adapter/ios/.gitignore @@ -0,0 +1,37 @@ +.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/flutter_export_environment.sh \ No newline at end of file diff --git a/packages/instrumentation_adapter/ios/Assets/.gitkeep b/packages/instrumentation_adapter/ios/Assets/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h b/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h new file mode 100644 index 000000000000..3d92ba91bf34 --- /dev/null +++ b/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface InstrumentationAdapterPlugin : NSObject +@end diff --git a/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m b/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m new file mode 100644 index 000000000000..704a5b05e031 --- /dev/null +++ b/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m @@ -0,0 +1,20 @@ +#import "InstrumentationAdapterPlugin.h" + +@implementation InstrumentationAdapterPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"dev.flutter/InstrumentationAdapterFlutterBinding" + binaryMessenger:[registrar messenger]]; + InstrumentationAdapterPlugin* instance = [[InstrumentationAdapterPlugin alloc] init]; + [registrar addMethodCallDelegate:instance channel:channel]; +} + +- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { + if ([@"allTestsFinished" isEqualToString:call.method]) { + result(nil); + } else { + result(FlutterMethodNotImplemented); + } +} + +@end diff --git a/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec b/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec new file mode 100644 index 000000000000..c18e58535998 --- /dev/null +++ b/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec @@ -0,0 +1,21 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'instrumentation_adapter' + s.version = '0.0.1' + s.summary = 'Instrumentation adapter.' + s.description = <<-DESC +Runs tests that use the flutter_test API as integration tests. + DESC + s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter' + s.license = { :file => '../LICENSE' } + s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' +end + diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index 2ec16c4ebe56..9999452234cd 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -15,8 +15,12 @@ class InstrumentationAdapterFlutterBinding InstrumentationAdapterFlutterBinding() { // TODO(jackson): Report test results as they arrive tearDownAll(() async { - await _channel.invokeMethod( - 'allTestsFinished', {'results': _results}); + try { + await _channel.invokeMethod( + 'allTestsFinished', {'results': _results}); + } on MissingPluginException { + // Tests were run on the host rather than a device. + } if (!_allTestsPassed.isCompleted) _allTestsPassed.complete(true); }); } diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index 443d32f7f300..1ac0aed7b05e 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,6 +1,6 @@ name: instrumentation_adapter -description: Runs tests that use the flutter_test API as platform native instrumentation tests. -version: 0.1.2 +description: Runs tests that use the flutter_test API as integration tests. +version: 0.1.3 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter From 2f3f21b31c1be0d04fc6345d0f83d3a1cb368491 Mon Sep 17 00:00:00 2001 From: Sam Stern Date: Tue, 10 Sep 2019 10:02:42 -0700 Subject: [PATCH 061/133] Point opensource site at new location (#2055) --- .opensource/project.json | 21 ++++----------------- FlutterFire.md | 6 ++++++ 2 files changed, 10 insertions(+), 17 deletions(-) create mode 100644 FlutterFire.md diff --git a/.opensource/project.json b/.opensource/project.json index 19da74a6cafd..b00f3a46f6ea 100644 --- a/.opensource/project.json +++ b/.opensource/project.json @@ -1,24 +1,11 @@ { - "name": "FlutterFire", + "name": "FlutterFire - MOVED", "platforms": [ "Android", "iOS" ], "content": "FlutterFire.md", - "pages": { - "packages/cloud_firestore/README.md": "Cloud Firestore", - "packages/cloud_functions/README.md": "Cloud Functions", - "packages/firebase_admob/README.md": "Admob", - "packages/firebase_analytics/README.md": "Analytics", - "packages/firebase_auth/README.md": "Authentication", - "packages/firebase_core/README.md": "Core", - "packages/firebase_crashlytics/README.md": "Crashlytics", - "packages/firebase_database/README.md": "Realtime Database", - "packages/firebase_dynamic_links/README.md": "Dynamic Links", - "packages/firebase_messaging/README.md": "Cloud Messaging", - "packages/firebase_ml_vision/README.md": "ML Kit: Vision", - "packages/firebase_performance/README.md": "Performance Monitoring", - "packages/firebase_remote_config/README.md": "Remote Config", - "packages/firebase_storage/README.md": "Cloud Storage" - } + "related": [ + "FirebaseExtended/flutterfire" + ] } diff --git a/FlutterFire.md b/FlutterFire.md new file mode 100644 index 000000000000..00326167e7ab --- /dev/null +++ b/FlutterFire.md @@ -0,0 +1,6 @@ +# FlutterFire - MOVED + +The FlutterFire family of plugins has moved to the FirebaseExtended organization on GitHub. This makes it easier for us to collaborate with the Firebase team. We want to build the best integration we can! + +Visit FlutterFire at its new home: +https://github.com/FirebaseExtended/flutterfire \ No newline at end of file From 00d230be5b210266eeaa144e0094fbac0ed3fe28 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 10 Sep 2019 10:38:39 -0700 Subject: [PATCH 062/133] [google_maps_flutter] Fix analyzer failures relating to prefer_const_constructors (#2053) --- packages/google_maps_flutter/CHANGELOG.md | 4 ++++ packages/google_maps_flutter/example/lib/padding.dart | 8 ++++---- packages/google_maps_flutter/pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index c88a00be904a..addc8831efe3 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.21+1 + +* Fix `prefer_const_constructors` analyzer warnings in example app. + ## 0.5.21 * Don't recreate map elements if they didn't change since last widget build. diff --git a/packages/google_maps_flutter/example/lib/padding.dart b/packages/google_maps_flutter/example/lib/padding.dart index be45cb38d0c1..599f8a564b6e 100644 --- a/packages/google_maps_flutter/example/lib/padding.dart +++ b/packages/google_maps_flutter/example/lib/padding.dart @@ -93,7 +93,7 @@ class MarkerIconsBodyState extends State { controller: _topController, keyboardType: TextInputType.number, textAlign: TextAlign.center, - decoration: InputDecoration( + decoration: const InputDecoration( hintText: "Top", ), ), @@ -105,7 +105,7 @@ class MarkerIconsBodyState extends State { controller: _bottomController, keyboardType: TextInputType.number, textAlign: TextAlign.center, - decoration: InputDecoration( + decoration: const InputDecoration( hintText: "Bottom", ), ), @@ -117,7 +117,7 @@ class MarkerIconsBodyState extends State { controller: _leftController, keyboardType: TextInputType.number, textAlign: TextAlign.center, - decoration: InputDecoration( + decoration: const InputDecoration( hintText: "Left", ), ), @@ -129,7 +129,7 @@ class MarkerIconsBodyState extends State { controller: _rightController, keyboardType: TextInputType.number, textAlign: TextAlign.center, - decoration: InputDecoration( + decoration: const InputDecoration( hintText: "Right", ), ), diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index f8a852998d42..a72cb71fdd78 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.21 +version: 0.5.21+1 dependencies: flutter: From 186cec7b0b9ab15c631ef0daa560e602f74a0ab6 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Tue, 10 Sep 2019 11:45:11 -0600 Subject: [PATCH 063/133] Reland "[webview_flutter] Add a getTitle method to WebViewController" (#1981)" (#2056) This reverts commit e4feab651ad6aec18d8fc2b71633fee9f41164b7. --- packages/webview_flutter/CHANGELOG.md | 4 ++ .../webviewflutter/FlutterWebView.java | 7 ++++ .../example/test_driver/webview.dart | 37 +++++++++++++++++++ .../ios/Classes/FlutterWebView.m | 7 ++++ .../lib/platform_interface.dart | 6 +++ .../lib/src/webview_method_channel.dart | 3 ++ .../webview_flutter/lib/webview_flutter.dart | 5 +++ packages/webview_flutter/pubspec.yaml | 2 +- 8 files changed, 70 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 75b2bf4997fc..4419c2f2f03a 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.14 + +* Added a getTitle getter to WebViewController. + ## 0.3.13 * Add an optional `userAgent` property to set a custom User Agent. diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 2288b8f52d5a..a7f2db308e15 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -134,6 +134,9 @@ public void onMethodCall(MethodCall methodCall, Result result) { case "clearCache": clearCache(result); break; + case "getTitle": + getTitle(result); + break; default: result.notImplemented(); } @@ -226,6 +229,10 @@ private void clearCache(Result result) { result.success(null); } + private void getTitle(Result result) { + result.success(webView.getTitle()); + } + private void applySettings(Map settings) { for (String key : settings.keySet()) { switch (key) { diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview.dart index be7e859df27c..e24afd73f557 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview.dart @@ -457,6 +457,43 @@ void main() { expect(isPaused, _webviewBool(false)); }); }); + + test('getTitle', () async { + final String getTitleTest = ''' + + Some title + + + + + '''; + final String getTitleTestBase64 = + base64Encode(const Utf8Encoder().convert(getTitleTest)); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); + + await pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: 'data:text/html;charset=utf-8;base64,$getTitleTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), + ), + ); + + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + + final String title = await controller.getTitle(); + expect(title, 'Some title'); + }); } Future pumpWidget(Widget widget) { diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index fed73d8a7d2c..36f4e8cb5cfe 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -118,6 +118,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self onRemoveJavaScriptChannels:call result:result]; } else if ([[call method] isEqualToString:@"clearCache"]) { [self clearCache:result]; + } else if ([[call method] isEqualToString:@"getTitle"]) { + [self onGetTitle:result]; } else { result(FlutterMethodNotImplemented); } @@ -238,6 +240,11 @@ - (void)clearCache:(FlutterResult)result { } } +- (void)onGetTitle:(FlutterResult)result { + NSString* title = _webView.title; + result(title); +} + // Returns nil when successful, or an error message when one or more keys are unknown. - (NSString*)applySettings:(NSDictionary*)settings { NSMutableArray* unknownKeys = [[NSMutableArray alloc] init]; diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 972cb25da54b..7e82bae91138 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -158,6 +158,12 @@ abstract class WebViewPlatformController { throw UnimplementedError( "WebView removeJavascriptChannels is not implemented on the current platform"); } + + /// Returns the title of the currently loaded page. + Future getTitle() { + throw UnimplementedError( + "WebView getTitle is not implemented on the current platform"); + } } /// A single setting for configuring a WebViewPlatform which may be absent. diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index f34000569551..c2949cc77a2a 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -103,6 +103,9 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'removeJavascriptChannels', javascriptChannelNames.toList()); } + @override + Future getTitle() => _channel.invokeMethod("getTitle"); + /// Method channel implementation for [WebViewPlatform.clearCookies]. static Future clearCookies() { return _cookieManagerChannel diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 97b7786de9a6..dec62b700122 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -625,6 +625,11 @@ class WebViewController { // ignore: strong_mode_implicit_dynamic_method return _webViewPlatformController.evaluateJavascript(javascriptString); } + + /// Returns the title of the currently loaded page. + Future getTitle() { + return _webViewPlatformController.getTitle(); + } } /// Manages cookies pertaining to all [WebView]s. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 23c09e81444f..69f45118de0a 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.13 +version: 0.3.14 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 94483425ae2e2dadb262cf313474b2ad209bebe8 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Tue, 10 Sep 2019 14:03:30 -0700 Subject: [PATCH 064/133] [local_auth] Avoid user confirmation on face unlock (#2047) * Define a new parameter for signaling that the transaction is sensitive. * Up the biometric version to beta01. * Handle no device credential error. --- packages/local_auth/CHANGELOG.md | 6 ++ packages/local_auth/android/build.gradle | 2 +- .../localauth/AuthenticationHelper.java | 13 ++- packages/local_auth/lib/local_auth.dart | 22 ++++- packages/local_auth/pubspec.yaml | 7 +- packages/local_auth/test/local_auth_test.dart | 90 +++++++++++++++++++ 6 files changed, 127 insertions(+), 13 deletions(-) create mode 100644 packages/local_auth/test/local_auth_test.dart diff --git a/packages/local_auth/CHANGELOG.md b/packages/local_auth/CHANGELOG.md index 1988028a1f9d..832efc795a95 100644 --- a/packages/local_auth/CHANGELOG.md +++ b/packages/local_auth/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.0 + +* Define a new parameter for signaling that the transaction is sensitive. +* Up the biometric version to beta01. +* Handle no device credential error. + ## 0.5.3 * Add face id detection as well by not relying on FingerprintCompat. diff --git a/packages/local_auth/android/build.gradle b/packages/local_auth/android/build.gradle index 142b606405c4..74fe6c550517 100644 --- a/packages/local_auth/android/build.gradle +++ b/packages/local_auth/android/build.gradle @@ -48,6 +48,6 @@ android { dependencies { api "androidx.core:core:1.1.0-beta01" - api "androidx.biometric:biometric:1.0.0-alpha04" + api "androidx.biometric:biometric:1.0.0-beta01" api "androidx.fragment:fragment:1.1.0-alpha06" } diff --git a/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java b/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java index 46d7bf3dec9a..a4ef01bfa504 100644 --- a/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java +++ b/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java @@ -77,6 +77,7 @@ public AuthenticationHelper( .setTitle((String) call.argument("signInTitle")) .setSubtitle((String) call.argument("fingerprintHint")) .setNegativeButtonText((String) call.argument("cancelButton")) + .setConfirmationRequired((Boolean) call.argument("sensitiveTransaction")) .build(); } @@ -95,13 +96,11 @@ private void stop() { @Override public void onAuthenticationError(int errorCode, CharSequence errString) { switch (errorCode) { - // TODO(mehmetf): Re-enable when biometric alpha05 is released. - // https://developer.android.com/jetpack/androidx/releases/biometric - // case BiometricPrompt.ERROR_NO_DEVICE_CREDENTIAL: - // completionHandler.onError( - // "PasscodeNotSet", - // "Phone not secured by PIN, pattern or password, or SIM is currently locked."); - // break; + case BiometricPrompt.ERROR_NO_DEVICE_CREDENTIAL: + completionHandler.onError( + "PasscodeNotSet", + "Phone not secured by PIN, pattern or password, or SIM is currently locked."); + break; case BiometricPrompt.ERROR_NO_SPACE: case BiometricPrompt.ERROR_NO_BIOMETRICS: if (call.argument("useErrorDialogs")) { diff --git a/packages/local_auth/lib/local_auth.dart b/packages/local_auth/lib/local_auth.dart index d5f2ac7c4bae..df69a120aa39 100644 --- a/packages/local_auth/lib/local_auth.dart +++ b/packages/local_auth/lib/local_auth.dart @@ -3,10 +3,10 @@ // found in the LICENSE file. import 'dart:async'; -import 'dart:io'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; +import 'package:platform/platform.dart'; import 'auth_strings.dart'; import 'error_codes.dart'; @@ -15,6 +15,13 @@ enum BiometricType { face, fingerprint, iris } const MethodChannel _channel = MethodChannel('plugins.flutter.io/local_auth'); +Platform _platform = const LocalPlatform(); + +@visibleForTesting +void setMockPathProviderPlatform(Platform platform) { + _platform = platform; +} + /// A Flutter plugin for authenticating the user identity locally. class LocalAuthentication { /// Authenticates the user with biometrics available on the device. @@ -44,6 +51,11 @@ class LocalAuthentication { /// Construct [AndroidAuthStrings] and [IOSAuthStrings] if you want to /// customize messages in the dialogs. /// + /// Setting [sensitiveTransaction] to true enables platform specific + /// precautions. For instance, on face unlock, Android opens a confirmation + /// dialog after the face is recognized to make sure the user meant to unlock + /// their phone. + /// /// Throws an [PlatformException] if there were technical problems with local /// authentication (e.g. lack of relevant hardware). This might throw /// [PlatformException] with error code [otherOperatingSystem] on the iOS @@ -54,23 +66,25 @@ class LocalAuthentication { bool stickyAuth = false, AndroidAuthMessages androidAuthStrings = const AndroidAuthMessages(), IOSAuthMessages iOSAuthStrings = const IOSAuthMessages(), + bool sensitiveTransaction = true, }) async { assert(localizedReason != null); final Map args = { 'localizedReason': localizedReason, 'useErrorDialogs': useErrorDialogs, 'stickyAuth': stickyAuth, + 'sensitiveTransaction': sensitiveTransaction, }; - if (Platform.isIOS) { + if (_platform.isIOS) { args.addAll(iOSAuthStrings.args); - } else if (Platform.isAndroid) { + } else if (_platform.isAndroid) { args.addAll(androidAuthStrings.args); } else { throw PlatformException( code: otherOperatingSystem, message: 'Local authentication does not support non-Android/iOS ' 'operating systems.', - details: 'Your operating system is ${Platform.operatingSystem}'); + details: 'Your operating system is ${_platform.operatingSystem}'); } return await _channel.invokeMethod( 'authenticateWithBiometrics', args); diff --git a/packages/local_auth/pubspec.yaml b/packages/local_auth/pubspec.yaml index 286d7aa73871..a78f6287128e 100644 --- a/packages/local_auth/pubspec.yaml +++ b/packages/local_auth/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Android and iOS device authentication sensors such as Fingerprint Reader and Touch ID. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/local_auth -version: 0.5.3 +version: 0.6.0 flutter: plugin: @@ -16,6 +16,11 @@ dependencies: sdk: flutter meta: ^1.0.5 intl: ^0.15.1 + platform: ^2.0.0 + +dev_dependencies: + flutter_test: + sdk: flutter environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" diff --git a/packages/local_auth/test/local_auth_test.dart b/packages/local_auth/test/local_auth_test.dart new file mode 100644 index 000000000000..205c5f785708 --- /dev/null +++ b/packages/local_auth/test/local_auth_test.dart @@ -0,0 +1,90 @@ +// Copyright 2019 The Flutter 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:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:local_auth/auth_strings.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:platform/platform.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('LocalAuth', () { + const MethodChannel channel = MethodChannel( + 'plugins.flutter.io/local_auth', + ); + + final List log = []; + LocalAuthentication localAuthentication; + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) { + log.add(methodCall); + return Future.value(true); + }); + localAuthentication = LocalAuthentication(); + log.clear(); + }); + + test('authenticate with no args on Android.', () async { + setMockPathProviderPlatform(FakePlatform(operatingSystem: 'android')); + await localAuthentication.authenticateWithBiometrics( + localizedReason: 'Needs secure'); + expect( + log, + [ + isMethodCall('authenticateWithBiometrics', + arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + }..addAll(const AndroidAuthMessages().args)), + ], + ); + }); + + test('authenticate with no args on iOS.', () async { + setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); + await localAuthentication.authenticateWithBiometrics( + localizedReason: 'Needs secure'); + expect( + log, + [ + isMethodCall('authenticateWithBiometrics', + arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + }..addAll(const IOSAuthMessages().args)), + ], + ); + }); + + test('authenticate with no sensitive transaction.', () async { + setMockPathProviderPlatform(FakePlatform(operatingSystem: 'android')); + await localAuthentication.authenticateWithBiometrics( + localizedReason: 'Insecure', + sensitiveTransaction: false, + useErrorDialogs: false, + ); + expect( + log, + [ + isMethodCall('authenticateWithBiometrics', + arguments: { + 'localizedReason': 'Insecure', + 'useErrorDialogs': false, + 'stickyAuth': false, + 'sensitiveTransaction': false, + }..addAll(const AndroidAuthMessages().args)), + ], + ); + }); + }); +} From 283284fcfe59af8ef96c5c336416e0c9f29bcb23 Mon Sep 17 00:00:00 2001 From: Wu Zhong Date: Fri, 13 Sep 2019 02:28:19 +0800 Subject: [PATCH 065/133] [webview_flutter] Allow underscores anywhere for Javascript Channel name (#1996) * [webview_flutter] Allow underscores anywhere for Javascript Channel name --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/lib/webview_flutter.dart | 2 +- packages/webview_flutter/pubspec.yaml | 2 +- packages/webview_flutter/test/webview_flutter_test.dart | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 4419c2f2f03a..98e312afd3a3 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.14+1 + +* Allow underscores anywhere for Javascript Channel name. + ## 0.3.14 * Added a getTitle getter to WebViewController. diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index dec62b700122..cd5ca46701d7 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -91,7 +91,7 @@ enum AutoMediaPlaybackPolicy { always_allow, } -final RegExp _validChannelNames = RegExp('^[a-zA-Z_][a-zA-Z0-9]*\$'); +final RegExp _validChannelNames = RegExp('^[a-zA-Z_][a-zA-Z0-9_]*\$'); /// A named channel for receiving messaged from JavaScript code running inside a web view. class JavascriptChannel { diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 69f45118de0a..e5f39f14da87 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.14 +version: 0.3.14+1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index d3f289018073..5184ddd13de3 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -454,6 +454,7 @@ void main() { final JavascriptMessageHandler noOp = (JavascriptMessage msg) {}; JavascriptChannel(name: 'Tts1', onMessageReceived: noOp); JavascriptChannel(name: '_Alarm', onMessageReceived: noOp); + JavascriptChannel(name: 'foo_bar_', onMessageReceived: noOp); VoidCallback createChannel(String name) { return () { From f7193bc3eef4166865821222414b1b1ecf466699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vitor=20Magalh=C3=A3es?= <45602144+vitor-gyant@users.noreply.github.com> Date: Thu, 12 Sep 2019 19:36:36 +0100 Subject: [PATCH 066/133] [url_launcher] Removed reference to rootViewController during initialization (#2038) The current plugin implementation stores a reference to the rootViewController during the initialisation which breaks scenarios like app2app. This PR does not store any variable to rootViewController but search through the VC hierarchy to get the top most VC in order to present the new vc. --- packages/url_launcher/CHANGELOG.md | 5 ++ .../ios/Classes/UrlLauncherPlugin.m | 57 ++++++++++++------- packages/url_launcher/pubspec.yaml | 2 +- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/packages/url_launcher/CHANGELOG.md b/packages/url_launcher/CHANGELOG.md index db2ace15b1e9..0ffbf290a5f7 100644 --- a/packages/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/CHANGELOG.md @@ -1,3 +1,8 @@ + +## 5.1.3 + +* Always launch url from the top most UIViewController in iOS. + ## 5.1.2 * Update AGP and gradle. diff --git a/packages/url_launcher/ios/Classes/UrlLauncherPlugin.m b/packages/url_launcher/ios/Classes/UrlLauncherPlugin.m index 56681dcd1ee3..b21829867a7e 100644 --- a/packages/url_launcher/ios/Classes/UrlLauncherPlugin.m +++ b/packages/url_launcher/ios/Classes/UrlLauncherPlugin.m @@ -61,33 +61,16 @@ @interface FLTUrlLauncherPlugin () @end -@interface FLTUrlLauncherPlugin () - -@property(strong, nonatomic) UIViewController *viewController; - -@end - @implementation FLTUrlLauncherPlugin + (void)registerWithRegistrar:(NSObject *)registrar { FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/url_launcher" binaryMessenger:registrar.messenger]; - UIViewController *viewController = - [UIApplication sharedApplication].delegate.window.rootViewController; - FLTUrlLauncherPlugin *plugin = - [[FLTUrlLauncherPlugin alloc] initWithViewController:viewController]; + FLTUrlLauncherPlugin *plugin = [[FLTUrlLauncherPlugin alloc] init]; [registrar addMethodCallDelegate:plugin channel:channel]; } -- (instancetype)initWithViewController:(UIViewController *)viewController { - self = [super init]; - if (self) { - self.viewController = viewController; - } - return self; -} - - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { NSString *url = call.arguments[@"url"]; if ([@"canLaunch" isEqualToString:call.method]) { @@ -153,9 +136,9 @@ - (void)launchURLInVC:(NSString *)urlString result:(FlutterResult)result API_AVA self.currentSession.didFinish = ^(void) { weakSelf.currentSession = nil; }; - [self.viewController presentViewController:self.currentSession.safari - animated:YES - completion:nil]; + [self.topViewController presentViewController:self.currentSession.safari + animated:YES + completion:nil]; } - (void)closeWebViewWithResult:(FlutterResult)result API_AVAILABLE(ios(9.0)) { @@ -165,4 +148,36 @@ - (void)closeWebViewWithResult:(FlutterResult)result API_AVAILABLE(ios(9.0)) { result(nil); } +- (UIViewController *)topViewController { + return [self topViewControllerFromViewController:[UIApplication sharedApplication] + .keyWindow.rootViewController]; +} + +/** + * This method recursively iterate through the view hierarchy + * to return the top most view controller. + * + * It supports the following scenarios: + * + * - The view controller is presenting another view. + * - The view controller is a UINavigationController. + * - The view controller is a UITabBarController. + * + * @return The top most view controller. + */ +- (UIViewController *)topViewControllerFromViewController:(UIViewController *)viewController { + if ([viewController isKindOfClass:[UINavigationController class]]) { + UINavigationController *navigationController = (UINavigationController *)viewController; + return [self + topViewControllerFromViewController:[navigationController.viewControllers lastObject]]; + } + if ([viewController isKindOfClass:[UITabBarController class]]) { + UITabBarController *tabController = (UITabBarController *)viewController; + return [self topViewControllerFromViewController:tabController.selectedViewController]; + } + if (viewController.presentedViewController) { + return [self topViewControllerFromViewController:viewController.presentedViewController]; + } + return viewController; +} @end diff --git a/packages/url_launcher/pubspec.yaml b/packages/url_launcher/pubspec.yaml index f7b77db58818..34343639e9f2 100644 --- a/packages/url_launcher/pubspec.yaml +++ b/packages/url_launcher/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher -version: 5.1.2 +version: 5.1.3 flutter: plugin: From 4eeb744bfce3cbacd64dcce32b52295c3299fe89 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Thu, 12 Sep 2019 15:12:36 -0700 Subject: [PATCH 067/133] [google_sign_in] Fix chained async methods in error handling zones (#2059) --- packages/google_sign_in/CHANGELOG.md | 5 + .../google_sign_in/lib/google_sign_in.dart | 117 ++++++++---------- packages/google_sign_in/pubspec.yaml | 2 +- .../test/google_sign_in_test.dart | 29 ++++- 4 files changed, 86 insertions(+), 67 deletions(-) mode change 100755 => 100644 packages/google_sign_in/lib/google_sign_in.dart mode change 100755 => 100644 packages/google_sign_in/pubspec.yaml diff --git a/packages/google_sign_in/CHANGELOG.md b/packages/google_sign_in/CHANGELOG.md index 92bf3230e06c..188167e53cae 100644 --- a/packages/google_sign_in/CHANGELOG.md +++ b/packages/google_sign_in/CHANGELOG.md @@ -1,3 +1,8 @@ +## 4.0.8 + +* Get rid of `MethodCompleter` and serialize async actions using chained futures. + This prevents a bug when sign in methods are being used in error handling zones. + ## 4.0.7 * Switch from using `api` to `implementation` for dependency on `play-services-auth`, diff --git a/packages/google_sign_in/lib/google_sign_in.dart b/packages/google_sign_in/lib/google_sign_in.dart old mode 100755 new mode 100644 index ca6e6bbaf705..f1e1db21801e --- a/packages/google_sign_in/lib/google_sign_in.dart +++ b/packages/google_sign_in/lib/google_sign_in.dart @@ -230,50 +230,57 @@ class GoogleSignIn { } Future _ensureInitialized() { - if (_initialization == null) { - _initialization = channel.invokeMethod('init', { - 'signInOption': (signInOption ?? SignInOption.standard).toString(), - 'scopes': scopes ?? [], - 'hostedDomain': hostedDomain, - }) - ..catchError((dynamic _) { - // Invalidate initialization if it errored out. - _initialization = null; - }); - } - return _initialization; + return _initialization ??= + channel.invokeMethod('init', { + 'signInOption': (signInOption ?? SignInOption.standard).toString(), + 'scopes': scopes ?? [], + 'hostedDomain': hostedDomain, + }) + ..catchError((dynamic _) { + // Invalidate initialization if it errored out. + _initialization = null; + }); } - /// Keeps track of the most recently scheduled method call. - _MethodCompleter _lastMethodCompleter; + /// The most recently scheduled method call. + Future _lastMethodCall; + + /// Returns a [Future] that completes with a success after [future], whether + /// it completed with a value or an error. + static Future _waitFor(Future future) { + final Completer completer = Completer(); + future.whenComplete(completer.complete).catchError((dynamic _) { + // Ignore if previous call completed with an error. + }); + return completer.future; + } /// Adds call to [method] in a queue for execution. /// /// At most one in flight call is allowed to prevent concurrent (out of order) /// updates to [currentUser] and [onCurrentUserChanged]. - Future _addMethodCall(String method) { - if (_lastMethodCompleter == null) { - _lastMethodCompleter = _MethodCompleter(method) - ..complete(_callMethod(method)); - return _lastMethodCompleter.future; + Future _addMethodCall(String method) async { + Future response; + if (_lastMethodCall == null) { + response = _callMethod(method); + } else { + response = _lastMethodCall.then((_) { + // If after the last completed call `currentUser` is not `null` and requested + // method is a sign in method, re-use the same authenticated user + // instead of making extra call to the native side. + const List kSignInMethods = [ + 'signIn', + 'signInSilently' + ]; + if (kSignInMethods.contains(method) && _currentUser != null) { + return _currentUser; + } else { + return _callMethod(method); + } + }); } - - final _MethodCompleter completer = _MethodCompleter(method); - _lastMethodCompleter.future.whenComplete(() { - // If after the last completed call currentUser is not null and requested - // method is a sign in method, re-use the same authenticated user - // instead of making extra call to the native side. - const List kSignInMethods = ['signIn', 'signInSilently']; - if (kSignInMethods.contains(method) && _currentUser != null) { - completer.complete(_currentUser); - } else { - completer.complete(_callMethod(method)); - } - }).catchError((dynamic _) { - // Ignore if previous call completed with an error. - }); - _lastMethodCompleter = completer; - return _lastMethodCompleter.future; + _lastMethodCall = _waitFor(response); + return response; } /// The currently signed in account, or null if the user is signed out. @@ -296,12 +303,17 @@ class GoogleSignIn { /// returned Future completes with [PlatformException] whose `code` can be /// either [kSignInRequiredError] (when there is no authenticated user) or /// [kSignInFailedError] (when an unknown error occurred). - Future signInSilently({bool suppressErrors = true}) { - final Future result = _addMethodCall('signInSilently'); - if (suppressErrors) { - return result.catchError((dynamic _) => null); + Future signInSilently( + {bool suppressErrors = true}) async { + try { + return await _addMethodCall('signInSilently'); + } catch (_) { + if (suppressErrors) { + return null; + } else { + rethrow; + } } - return result; } /// Returns a future that resolves to whether a user is currently signed in. @@ -334,26 +346,3 @@ class GoogleSignIn { /// authentication. Future disconnect() => _addMethodCall('disconnect'); } - -class _MethodCompleter { - _MethodCompleter(this.method); - - final String method; - final Completer _completer = - Completer(); - - Future complete(FutureOr value) async { - if (value is Future) { - try { - _completer.complete(await value); - } catch (e, stacktrace) { - _completer.completeError(e, stacktrace); - } - } else { - _completer.complete(value); - } - } - - bool get isCompleted => _completer.isCompleted; - Future get future => _completer.future; -} diff --git a/packages/google_sign_in/pubspec.yaml b/packages/google_sign_in/pubspec.yaml old mode 100755 new mode 100644 index 6ed758895bf7..246a6389e39c --- a/packages/google_sign_in/pubspec.yaml +++ b/packages/google_sign_in/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Google Sign-In, a secure authentication system for signing in with a Google account on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in -version: 4.0.7 +version: 4.0.8 flutter: plugin: diff --git a/packages/google_sign_in/test/google_sign_in_test.dart b/packages/google_sign_in/test/google_sign_in_test.dart index dab480a4cce4..108edf9c892b 100755 --- a/packages/google_sign_in/test/google_sign_in_test.dart +++ b/packages/google_sign_in/test/google_sign_in_test.dart @@ -45,7 +45,11 @@ void main() { responses = Map.from(kDefaultResponses); channel.setMockMethodCallHandler((MethodCall methodCall) { log.add(methodCall); - return Future.value(responses[methodCall.method]); + final dynamic response = responses[methodCall.method]; + if (response != null && response is Exception) { + return Future.error('$response'); + } + return Future.value(response); }); googleSignIn = GoogleSignIn(); log.clear(); @@ -142,6 +146,27 @@ void main() { ]); }); + test('signIn works even if a previous call throws error in other zone', + () async { + responses['signInSilently'] = Exception('Not a user'); + await runZoned(() async { + expect(await googleSignIn.signInSilently(), isNull); + }, onError: (dynamic e, dynamic st) {}); + expect(await googleSignIn.signIn(), isNotNull); + expect( + log, + [ + isMethodCall('init', arguments: { + 'signInOption': 'SignInOption.standard', + 'scopes': [], + 'hostedDomain': null, + }), + isMethodCall('signInSilently', arguments: null), + isMethodCall('signIn', arguments: null), + ], + ); + }); + test('concurrent calls of the same method trigger sign in once', () async { final List> futures = >[ @@ -170,7 +195,7 @@ void main() { }); test('can sign in after previously failed attempt', () async { - responses['signInSilently'] = {'error': 'Not a user'}; + responses['signInSilently'] = Exception('Not a user'); expect(await googleSignIn.signInSilently(), isNull); expect(await googleSignIn.signIn(), isNotNull); expect( From c0cba54228dc974fe404f36b5463e96824a5ae98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20Cesar=20Bueno=20Cotta?= Date: Mon, 16 Sep 2019 13:59:54 -0300 Subject: [PATCH 068/133] [Camera] Fixes NullPointerException (#2057) This PR fixes a possible NullPointerException when the device has only front-facing cameras. There are two versions of CamcorderProfile.get, the one currently in use will return null in case there is no back-facing camera. The second version uses the cameraId to avoid returning null. More: https://developer.android.com/reference/android/media/CamcorderProfile.html#get(int,%20int) --- packages/camera/CHANGELOG.md | 4 ++++ .../io/flutter/plugins/camera/CameraUtils.java | 17 ++++++++--------- packages/camera/pubspec.yaml | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 9ed7a78f1bb1..45a2235043e6 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.4+2 + +* Fix Android NullPointerException on devices with only front-facing camera. + ## 0.5.4+1 * Fix Android pause and resume video crash when executing in APIs below 24. diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java index e4613fb237c1..a7bb3b7d4914 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java @@ -77,32 +77,31 @@ static CamcorderProfile getBestAvailableCamcorderProfileForResolutionPreset( // All of these cases deliberately fall through to get the best available profile. case max: if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_HIGH)) { - return CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); + return CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH); } case ultraHigh: if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_2160P)) { - return CamcorderProfile.get(CamcorderProfile.QUALITY_2160P); + return CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_2160P); } case veryHigh: if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_1080P)) { - return CamcorderProfile.get(CamcorderProfile.QUALITY_1080P); + return CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_1080P); } case high: if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_720P)) { - return CamcorderProfile.get(CamcorderProfile.QUALITY_720P); + return CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_720P); } case medium: if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_480P)) { - return CamcorderProfile.get(CamcorderProfile.QUALITY_480P); + return CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_480P); } case low: if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_QVGA)) { - return CamcorderProfile.get(CamcorderProfile.QUALITY_QVGA); + return CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_QVGA); } default: - if (CamcorderProfile.hasProfile( - Integer.parseInt(cameraName), CamcorderProfile.QUALITY_LOW)) { - return CamcorderProfile.get(CamcorderProfile.QUALITY_LOW); + if (CamcorderProfile.hasProfile(cameraId, CamcorderProfile.QUALITY_LOW)) { + return CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_LOW); } else { throw new IllegalArgumentException( "No capture session available for current capture session."); diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index c9e715225d59..e7c8632b042f 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.4+1 +version: 0.5.4+2 authors: - Flutter Team From 6c341f8599caa41065062daa9ec28c829fa0c449 Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Mon, 16 Sep 2019 11:01:49 -0700 Subject: [PATCH 069/133] [google_maps_flutter] Prefer const constructors. (#2065) --- packages/google_maps_flutter/CHANGELOG.md | 4 ++++ packages/google_maps_flutter/example/lib/padding.dart | 6 +++--- packages/google_maps_flutter/pubspec.yaml | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index addc8831efe3..e6f2ff00d02f 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.21+2 + +* Fix more `prefer_const_constructors` analyzer warnings in example app. + ## 0.5.21+1 * Fix `prefer_const_constructors` analyzer warnings in example app. diff --git a/packages/google_maps_flutter/example/lib/padding.dart b/packages/google_maps_flutter/example/lib/padding.dart index 599f8a564b6e..6c1fe38dbf3a 100644 --- a/packages/google_maps_flutter/example/lib/padding.dart +++ b/packages/google_maps_flutter/example/lib/padding.dart @@ -98,7 +98,7 @@ class MarkerIconsBodyState extends State { ), ), ), - Spacer(), + const Spacer(), Flexible( flex: 2, child: TextField( @@ -110,7 +110,7 @@ class MarkerIconsBodyState extends State { ), ), ), - Spacer(), + const Spacer(), Flexible( flex: 2, child: TextField( @@ -122,7 +122,7 @@ class MarkerIconsBodyState extends State { ), ), ), - Spacer(), + const Spacer(), Flexible( flex: 2, child: TextField( diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index a72cb71fdd78..7de1fd6bca7d 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.21+1 +version: 0.5.21+2 dependencies: flutter: From 3972c5d004d81a73d186fca443b76807452d8cb6 Mon Sep 17 00:00:00 2001 From: Felix Angelov Date: Thu, 19 Sep 2019 16:22:32 -0500 Subject: [PATCH 070/133] Fix iOS MyLocationButton on iOS (#2068) --- packages/google_maps_flutter/CHANGELOG.md | 4 ++++ .../google_maps_flutter/ios/Classes/GoogleMapController.m | 1 - packages/google_maps_flutter/pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index e6f2ff00d02f..3c569ed01a79 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.21+3 + +* Fix `myLocationButton` bug in `google_maps_flutter` iOS. + ## 0.5.21+2 * Fix more `prefer_const_constructors` analyzer warnings in example app. diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index 600820e0cc0c..04a9f415e6fc 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -327,7 +327,6 @@ - (void)setZoomGesturesEnabled:(BOOL)enabled { - (void)setMyLocationEnabled:(BOOL)enabled { _mapView.myLocationEnabled = enabled; - _mapView.settings.myLocationButton = enabled; } - (void)setMyLocationButtonEnabled:(BOOL)enabled { diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 7de1fd6bca7d..bdc41c873909 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.21+2 +version: 0.5.21+3 dependencies: flutter: From a2b5a777beaf54df591303c8e7c545c8950dcf9b Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 20 Sep 2019 08:36:21 -0700 Subject: [PATCH 071/133] [instrumentation_adapter] Migrate example to AndroidX (#2075) --- packages/instrumentation_adapter/CHANGELOG.md | 4 ++++ .../instrumentation_adapter/example/android/gradle.properties | 2 ++ packages/instrumentation_adapter/pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index f4cd692a1916..9a07ba0c1cbf 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.4 + +* Migrate example to AndroidX. + ## 0.1.3 * Added example app. diff --git a/packages/instrumentation_adapter/example/android/gradle.properties b/packages/instrumentation_adapter/example/android/gradle.properties index 2bd6f4fda009..755300e3a0b5 100644 --- a/packages/instrumentation_adapter/example/android/gradle.properties +++ b/packages/instrumentation_adapter/example/android/gradle.properties @@ -1,2 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index 1ac0aed7b05e..1d8c258d8097 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,6 +1,6 @@ name: instrumentation_adapter description: Runs tests that use the flutter_test API as integration tests. -version: 0.1.3 +version: 0.1.4 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter From 6887acf21f6d53038470aa4ecd991563b3bdf964 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Wed, 25 Sep 2019 13:00:19 -0700 Subject: [PATCH 072/133] [google_maps_flutter] Add Projection methods to google_maps (#2108) [google_maps_flutter] Add Projection methods to google_maps This doesn't yet expose the full projection functionality but addresses the most common use-cases to translate screen coordinates to latlngs. Issue: https://github.com/flutter/flutter/issues/37959 --- packages/google_maps_flutter/CHANGELOG.md | 4 + .../flutter/plugins/googlemaps/Convert.java | 14 +++- .../googlemaps/GoogleMapController.java | 27 +++++++ .../example/test_driver/google_maps.dart | 74 +++++++++++++++++++ .../ios/Classes/GoogleMapController.m | 35 +++++++++ .../lib/google_maps_flutter.dart | 7 +- .../lib/src/controller.dart | 21 ++++++ .../lib/src/screen_coordinate.dart | 39 ++++++++++ packages/google_maps_flutter/pubspec.yaml | 2 +- 9 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 packages/google_maps_flutter/lib/src/screen_coordinate.dart diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 3c569ed01a79..76b3e23c693c 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.21+4 + +* Support projection methods to translate between screen and latlng coordinates. + ## 0.5.21+3 * Fix `myLocationButton` bug in `google_maps_flutter` iOS. diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java index 76e14faaf01e..6ca3f1ffbd73 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java @@ -201,11 +201,23 @@ static Object latLngToJson(LatLng latLng) { return Arrays.asList(latLng.latitude, latLng.longitude); } - private static LatLng toLatLng(Object o) { + static LatLng toLatLng(Object o) { final List data = toList(o); return new LatLng(toDouble(data.get(0)), toDouble(data.get(1))); } + static Point toPoint(Object o) { + Map screenCoordinate = (Map) o; + return new Point(screenCoordinate.get("x"), screenCoordinate.get("y")); + } + + static Map pointToJson(Point point) { + final Map data = new HashMap<>(2); + data.put("x", point.x); + data.put("y", point.y); + return data; + } + private static LatLngBounds toLatLngBounds(Object o) { if (o == null) { return null; diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index de6a1158023d..f2ea28e32412 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -17,6 +17,7 @@ import android.app.Application; import android.content.Context; import android.content.pm.PackageManager; +import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -226,6 +227,32 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { } break; } + case "map#getScreenCoordinate": + { + if (googleMap != null) { + LatLng latLng = Convert.toLatLng(call.arguments); + Point screenLocation = googleMap.getProjection().toScreenLocation(latLng); + result.success(Convert.pointToJson(screenLocation)); + } else { + result.error( + "GoogleMap uninitialized", + "getScreenCoordinate called prior to map initialization", + null); + } + break; + } + case "map#getLatLng": + { + if (googleMap != null) { + Point point = Convert.toPoint(call.arguments); + LatLng latLng = googleMap.getProjection().fromScreenLocation(point); + result.success(Convert.latLngToJson(latLng)); + } else { + result.error( + "GoogleMap uninitialized", "getLatLng called prior to map initialization", null); + } + break; + } case "camera#move": { final CameraUpdate cameraUpdate = diff --git a/packages/google_maps_flutter/example/test_driver/google_maps.dart b/packages/google_maps_flutter/example/test_driver/google_maps.dart index 6f2eacd49c00..8bcf2e3f2f5d 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -564,4 +564,78 @@ void main() { final GoogleMapController controller = await controllerCompleter.future; await controller.setMapStyle(null); }); + + test('testGetLatLng', () async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (GoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final GoogleMapController controller = await controllerCompleter.future; + + // We suspected a bug in the iOS Google Maps SDK caused the camera is not properly positioned at + // initialization. https://github.com/flutter/flutter/issues/24806 + // This temporary workaround fix is provided while the actual fix in the Google Maps SDK is + // still being investigated. + // TODO(cyanglaz): Remove this temporary fix once the Maps SDK issue is resolved. + // https://github.com/flutter/flutter/issues/27550 + await Future.delayed(const Duration(seconds: 3)); + + final LatLngBounds visibleRegion = await controller.getVisibleRegion(); + final LatLng topLeft = + await controller.getLatLng(const ScreenCoordinate(x: 0, y: 0)); + final LatLng northWest = LatLng( + visibleRegion.northeast.latitude, + visibleRegion.southwest.longitude, + ); + + expect(topLeft, northWest); + }); + + test('testScreenCoordinate', () async { + final Key key = GlobalKey(); + final Completer controllerCompleter = + Completer(); + + await pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: GoogleMap( + key: key, + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (GoogleMapController controller) { + controllerCompleter.complete(controller); + }, + ), + )); + + final GoogleMapController controller = await controllerCompleter.future; + + // We suspected a bug in the iOS Google Maps SDK caused the camera is not properly positioned at + // initialization. https://github.com/flutter/flutter/issues/24806 + // This temporary workaround fix is provided while the actual fix in the Google Maps SDK is + // still being investigated. + // TODO(cyanglaz): Remove this temporary fix once the Maps SDK issue is resolved. + // https://github.com/flutter/flutter/issues/27550 + await Future.delayed(const Duration(seconds: 3)); + + final LatLngBounds visibleRegion = await controller.getVisibleRegion(); + final LatLng northWest = LatLng( + visibleRegion.northeast.latitude, + visibleRegion.southwest.longitude, + ); + final ScreenCoordinate topLeft = + await controller.getScreenCoordinate(northWest); + + expect(topLeft, const ScreenCoordinate(x: 0, y: 0)); + }); } diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index 04a9f415e6fc..70a278af45de 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -8,7 +8,9 @@ #pragma mark - Conversion of JSON-like values sent via platform channels. Forward declarations. static NSDictionary* PositionToJson(GMSCameraPosition* position); +static NSDictionary* PointToJson(CGPoint point); static NSArray* LocationToJson(CLLocationCoordinate2D position); +static CGPoint ToCGPoint(NSDictionary* json); static GMSCameraPosition* ToOptionalCameraPosition(NSDictionary* json); static GMSCoordinateBounds* ToOptionalBounds(NSArray* json); static GMSCameraUpdate* ToCameraUpdate(NSArray* data); @@ -147,6 +149,26 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { message:@"getVisibleRegion called prior to map initialization" details:nil]); } + } else if ([call.method isEqualToString:@"map#getScreenCoordinate"]) { + if (_mapView != nil) { + CLLocationCoordinate2D location = [FLTGoogleMapJsonConversions toLocation:call.arguments]; + CGPoint point = [_mapView.projection pointForCoordinate:location]; + result(PointToJson(point)); + } else { + result([FlutterError errorWithCode:@"GoogleMap uninitialized" + message:@"getScreenCoordinate called prior to map initialization" + details:nil]); + } + } else if ([call.method isEqualToString:@"map#getLatLng"]) { + if (_mapView != nil && call.arguments) { + CGPoint point = ToCGPoint(call.arguments); + CLLocationCoordinate2D latlng = [_mapView.projection coordinateForPoint:point]; + result(LocationToJson(latlng)); + } else { + result([FlutterError errorWithCode:@"GoogleMap uninitialized" + message:@"getLatLng called prior to map initialization" + details:nil]); + } } else if ([call.method isEqualToString:@"map#waitForMap"]) { result(nil); } else if ([call.method isEqualToString:@"markers#update"]) { @@ -427,6 +449,13 @@ - (void)mapView:(GMSMapView*)mapView didLongPressAtCoordinate:(CLLocationCoordin }; } +static NSDictionary* PointToJson(CGPoint point) { + return @{ + @"x" : @((int)point.x), + @"y" : @((int)point.y), + }; +} + static NSDictionary* GMSCoordinateBoundsToJson(GMSCoordinateBounds* bounds) { if (!bounds) { return nil; @@ -460,6 +489,12 @@ static CLLocationCoordinate2D ToLocation(NSArray* data) { return json ? ToCameraPosition(json) : nil; } +static CGPoint ToCGPoint(NSDictionary* json) { + double x = ToDouble(json[@"x"]); + double y = ToDouble(json[@"y"]); + return CGPointMake(x, y); +} + static GMSCoordinateBounds* ToBounds(NSArray* data) { return [[GMSCoordinateBounds alloc] initWithCoordinate:ToLocation(data[0]) coordinate:ToLocation(data[1])]; diff --git a/packages/google_maps_flutter/lib/google_maps_flutter.dart b/packages/google_maps_flutter/lib/google_maps_flutter.dart index 91f037192255..5f3889f7b2f1 100644 --- a/packages/google_maps_flutter/lib/google_maps_flutter.dart +++ b/packages/google_maps_flutter/lib/google_maps_flutter.dart @@ -17,17 +17,18 @@ part 'src/bitmap.dart'; part 'src/callbacks.dart'; part 'src/camera.dart'; part 'src/cap.dart'; +part 'src/circle.dart'; +part 'src/circle_updates.dart'; part 'src/controller.dart'; part 'src/google_map.dart'; part 'src/joint_type.dart'; +part 'src/location.dart'; part 'src/marker.dart'; part 'src/marker_updates.dart'; -part 'src/location.dart'; part 'src/pattern_item.dart'; part 'src/polygon.dart'; part 'src/polygon_updates.dart'; part 'src/polyline.dart'; part 'src/polyline_updates.dart'; -part 'src/circle.dart'; -part 'src/circle_updates.dart'; +part 'src/screen_coordinate.dart'; part 'src/ui.dart'; diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart index ec77111bae9d..4ef8956c581a 100644 --- a/packages/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/lib/src/controller.dart @@ -208,4 +208,25 @@ class GoogleMapController { return LatLngBounds(northeast: northeast, southwest: southwest); } + + /// Return [ScreenCoordinate] of the [LatLng] in the current map view. + /// + /// A projection is used to translate between on screen location and geographic coordinates. + /// Screen location is in screen pixels (not display pixels) with respect to the top left corner + /// of the map, not necessarily of the whole screen. + Future getScreenCoordinate(LatLng latLng) async { + final Map point = await channel.invokeMapMethod( + 'map#getScreenCoordinate', latLng._toJson()); + return ScreenCoordinate(x: point['x'], y: point['y']); + } + + /// Returns [LatLng] corresponding to the [ScreenCoordinate] in the current map view. + /// + /// Returned [LatLng] corresponds to a screen location. The screen location is specified in screen + /// pixels (not display pixels) relative to the top left of the map, not top left of the whole screen. + Future getLatLng(ScreenCoordinate screenCoordinate) async { + final List latLng = await channel.invokeMethod>( + 'map#getLatLng', screenCoordinate._toJson()); + return LatLng(latLng[0], latLng[1]); + } } diff --git a/packages/google_maps_flutter/lib/src/screen_coordinate.dart b/packages/google_maps_flutter/lib/src/screen_coordinate.dart new file mode 100644 index 000000000000..83e57514c2a0 --- /dev/null +++ b/packages/google_maps_flutter/lib/src/screen_coordinate.dart @@ -0,0 +1,39 @@ +// 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. + +part of google_maps_flutter; + +/// Represents a point coordinate in the [GoogleMap]'s view. +/// +/// The screen location is specified in screen pixels (not display pixels) relative +/// to the top left of the map, not top left of the whole screen. (x, y) = (0, 0) +/// corresponds to top-left of the [GoogleMap] not the whole screen. +@immutable +class ScreenCoordinate { + const ScreenCoordinate({ + @required this.x, + @required this.y, + }); + + final int x; + final int y; + + dynamic _toJson() { + return { + "x": x, + "y": y, + }; + } + + @override + String toString() => '$runtimeType($x, $y)'; + + @override + bool operator ==(Object o) { + return o is ScreenCoordinate && o.x == x && o.y == y; + } + + @override + int get hashCode => hashValues(x, y); +} diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index bdc41c873909..908fb5b250e6 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.21+3 +version: 0.5.21+4 dependencies: flutter: From 0f2fa175ad6f66c7035b68f2969675775ff02e51 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 25 Sep 2019 14:47:34 -0700 Subject: [PATCH 073/133] [android_alarm_manager] Update and migrate iOS example project (#2087) --- packages/android_alarm_manager/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 59 +++++++++---------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/android_alarm_manager/pubspec.yaml | 2 +- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/packages/android_alarm_manager/CHANGELOG.md b/packages/android_alarm_manager/CHANGELOG.md index 2bb200dcc2fc..a58759b2db83 100644 --- a/packages/android_alarm_manager/CHANGELOG.md +++ b/packages/android_alarm_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.4+1 + +* Update and migrate iOS example project. + ## 0.4.4 * Add `id` to `callback` if it is of type `Function(int)` diff --git a/packages/android_alarm_manager/example/ios/Runner.xcodeproj/project.pbxproj b/packages/android_alarm_manager/example/ios/Runner.xcodeproj/project.pbxproj index 37519f8e8adc..10f77b41d130 100644 --- a/packages/android_alarm_manager/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/android_alarm_manager/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,10 @@ /* 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 */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -42,13 +39,14 @@ /* 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 = ""; }; + 192BD17BD81C291EF9467E75 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 365DE79D3A08F3F6322AB7B4 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; + 842A7CA20B55950D87F2A01A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; 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 = ""; }; 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; @@ -77,6 +75,8 @@ 1B44A04DB1D7DBDE7E239095 /* Pods */ = { isa = PBXGroup; children = ( + 192BD17BD81C291EF9467E75 /* Pods-Runner.debug.xcconfig */, + 842A7CA20B55950D87F2A01A /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -86,7 +86,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, E95CF7E4BD7CAFC3E0F4E1E2 /* [CP] Embed Pods Frameworks */, - EF304A2ADD09768DC84F5DD6 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -256,13 +251,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; 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"; + 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; }; E95CF7E4BD7CAFC3E0F4E1E2 /* [CP] Embed Pods Frameworks */ = { @@ -277,22 +275,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - EF304A2ADD09768DC84F5DD6 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -335,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -383,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -424,7 +425,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -446,7 +446,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/android_alarm_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/android_alarm_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/android_alarm_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/android_alarm_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager From e2466bc07e1980db44f87900b7499d24acd4224d Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 25 Sep 2019 15:26:53 -0700 Subject: [PATCH 074/133] [android_intent] Update and migrate iOS example project (#2088) 1. Let https://github.com/flutter/flutter/pull/26630 flutter_assets migrator run 2. Run `pod install` so flutter_assets is removed from the asset copy build phase 3. Migrate deprecated "English" to "en" language 4. Allow Xcode to remove extraneous xcconfigs, see https://github.com/flutter/flutter/pull/38724 5. Let Xcode 11 update build settings 6. Remove ARCHS, which was causing a compilation error --- packages/android_intent/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 59 +++++++++---------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/android_intent/pubspec.yaml | 2 +- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/packages/android_intent/CHANGELOG.md b/packages/android_intent/CHANGELOG.md index 82b4774ee29d..5f74d0444a9d 100644 --- a/packages/android_intent/CHANGELOG.md +++ b/packages/android_intent/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.3+2 + +* Update and migrate iOS example project. + ## 0.3.3+1 * Added "action_application_details_settings" action to open application info settings . diff --git a/packages/android_intent/example/ios/Runner.xcodeproj/project.pbxproj b/packages/android_intent/example/ios/Runner.xcodeproj/project.pbxproj index 57d70edda3b5..430cec7ef2b5 100644 --- a/packages/android_intent/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/android_intent/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,14 +9,11 @@ /* 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 */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3FC5CBD67A867C34C8CFD7E1 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ABB9ACA70E30025F77BB759 /* libPods-Runner.a */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -43,7 +40,6 @@ 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7ABB9ACA70E30025F77BB759 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -58,6 +54,8 @@ 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 = ""; }; + 9B21C620C27B8C2AF08BFA21 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + EFC3461395B2546568135556 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -77,6 +75,8 @@ 2C36A917BF8B34817D5A406D /* Pods */ = { isa = PBXGroup; children = ( + EFC3461395B2546568135556 /* Pods-Runner.debug.xcconfig */, + 9B21C620C27B8C2AF08BFA21 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -94,7 +94,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 4B2738B48C3E53795176CD79 /* [CP] Embed Pods Frameworks */, - B23D1C01D32617384EBE7F0E /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -248,7 +243,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -265,34 +260,22 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - B23D1C01D32617384EBE7F0E /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; ECD6A6833016AB689F7B8471 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; 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"; + 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 */ @@ -335,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -383,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -424,7 +425,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -446,7 +446,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/android_intent/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/android_intent/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/android_intent/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/android_intent/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/android_intent -version: 0.3.3+1 +version: 0.3.3+2 flutter: plugin: From 86d245f7efdf0a9043dc975f039bc94a28b26529 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 25 Sep 2019 15:49:12 -0700 Subject: [PATCH 075/133] [camera] Update and migrate iOS example project (#2090) 1. Let https://github.com/flutter/flutter/pull/26630 flutter_assets migrator run 2. Run `pod install` so flutter_assets is removed from the asset copy build phase 3. Migrate deprecated "English" to "en" language 4. Allow Xcode to remove extraneous xcconfigs, see https://github.com/flutter/flutter/pull/38724 5. Let Xcode 11 update build settings 6. Remove DEVELOPMENT_TEAM references since having those provisioning profiles should not be required to run the examples (most examples don't have one) 7. Looks like this was last run with `use_frameworks!`? Let CocoaPods build as libraries instead of frameworks. 8. Remove ARCHS, which was causing a compilation error --- packages/camera/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 60 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/camera/pubspec.yaml | 2 +- 4 files changed, 33 insertions(+), 43 deletions(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 45a2235043e6..b6c68aa7cf9f 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.4+3 + +* Update and migrate iOS example project. + ## 0.5.4+2 * Fix Android NullPointerException on devices with only front-facing camera. diff --git a/packages/camera/example/ios/Runner.xcodeproj/project.pbxproj b/packages/camera/example/ios/Runner.xcodeproj/project.pbxproj index 5a54057fee45..862ee64fb666 100644 --- a/packages/camera/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/camera/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,15 +8,12 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 75201D617916C49BDEDF852A /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 620DDA07C00B5FF2F937CB5B /* libPods-Runner.a */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -42,9 +39,9 @@ /* 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 483D985F075B951ADBAD218E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 620DDA07C00B5FF2F937CB5B /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; @@ -58,6 +55,7 @@ 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 = ""; }; + 9AC7510327AD6A32B7CBD9A5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -87,7 +85,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -142,6 +139,8 @@ C52D9D4A70956403860EBEB5 /* Pods */ = { isa = PBXGroup; children = ( + 9AC7510327AD6A32B7CBD9A5 /* Pods-Runner.debug.xcconfig */, + 483D985F075B951ADBAD218E /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, FE224661708E6DA2A0F8B952 /* [CP] Embed Pods Frameworks */, - EACF0929FF12B6CC70C2D6BE /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,18 +176,17 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = EQHXZ8M8AV; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -211,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -269,37 +263,19 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - EACF0929FF12B6CC70C2D6BE /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; FE224661708E6DA2A0F8B952 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../../../../../../flutter/bin/cache/artifacts/engine/ios-release/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -342,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -390,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -431,9 +425,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = EQHXZ8M8AV; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -454,9 +446,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = EQHXZ8M8AV; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/camera/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/camera/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6abd7ff724f7..44b873626ab3 100644 --- a/packages/camera/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/camera/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + From 00e1936abe6f28d0549b797ab68ae134f736446d Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 25 Sep 2019 15:50:18 -0700 Subject: [PATCH 076/133] [in_app_purchase] Update and migrate iOS example project (#2096) 1. Let https://github.com/flutter/flutter/pull/26630 flutter_assets migrator run 2. Run `pod install` so flutter_assets is removed from the asset copy build phase 3. Migrate deprecated "English" to "en" language 4. Allow Xcode to remove extraneous xcconfigs, see https://github.com/flutter/flutter/pull/38724 5. Let Xcode 11 update build settings 6. Remove extraneous framework outputs https://github.com/flutter/flutter/issues/20685 --- packages/in_app_purchase/CHANGELOG.md | 4 ++++ .../ios/Runner.xcodeproj/project.pbxproj | 19 +++++++-------- .../xcshareddata/xcschemes/Runner.xcscheme | 24 ++++++++----------- packages/in_app_purchase/pubspec.yaml | 2 +- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index 2f0e89e1cdec..2a4d6a9e0960 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.1+4 + +* Update and migrate iOS example project. + ## 0.2.1+3 * Android : Improved testability. diff --git a/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj b/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj index 86949446bb87..8ab33048c9a3 100644 --- a/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -55,7 +54,6 @@ /* 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 688DE35021F2A5A100EA2684 /* TranslatorTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TranslatorTest.m; sourceTree = ""; }; @@ -79,6 +77,8 @@ A59001A621E69658004A3E5E /* InAppPurchasePluginTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InAppPurchasePluginTest.m; sourceTree = ""; }; A59001A821E69658004A3E5E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B2AB6BE1D4E2232AB5D4A002 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + BE95F46E12942F78BF67E55B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + DE7EEEE26E27ACC04BA9951D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -106,6 +106,8 @@ 2D4BBB2E0E7B18550E80D50C /* Pods */ = { isa = PBXGroup; children = ( + DE7EEEE26E27ACC04BA9951D /* Pods-Runner.debug.xcconfig */, + BE95F46E12942F78BF67E55B /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -113,7 +115,6 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, @@ -241,7 +242,7 @@ isa = PBXProject; attributes = { DefaultBuildSystemTypeForWorkspace = Original; - LastUpgradeCheck = 0940; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -261,7 +262,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -286,7 +287,6 @@ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -353,16 +353,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -424,6 +421,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -480,6 +478,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; diff --git a/packages/in_app_purchase/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/in_app_purchase/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3352cfc3831f..e1fad2d518ae 100644 --- a/packages/in_app_purchase/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/in_app_purchase/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + + + @@ -39,17 +48,6 @@ - - - - - - - - homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.2.1+3 +version: 0.2.1+4 dependencies: From a394c1318af55edc57ab93fc27c19894566bfb6b Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 25 Sep 2019 15:51:37 -0700 Subject: [PATCH 077/133] [url_launcher] Update and migrate iOS example project (#2109) 1. Let https://github.com/flutter/flutter/pull/26630 flutter_assets migrator run 2. Run `pod install` so flutter_assets is removed from the asset copy build phase 3. Migrate deprecated "English" to "en" language 4. Allow Xcode to remove extraneous xcconfigs, see https://github.com/flutter/flutter/pull/38724 5. Let Xcode 11 update build settings 6. Remove extraneous framework outputs https://github.com/flutter/flutter/issues/20685 --- packages/url_launcher/CHANGELOG.md | 3 + .../ios/Runner.xcodeproj/project.pbxproj | 57 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/url_launcher/pubspec.yaml | 2 +- 4 files changed, 32 insertions(+), 40 deletions(-) diff --git a/packages/url_launcher/CHANGELOG.md b/packages/url_launcher/CHANGELOG.md index 0ffbf290a5f7..22e75263c7e7 100644 --- a/packages/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/CHANGELOG.md @@ -1,3 +1,6 @@ +## 5.1.4 + +* Update and migrate iOS example project. ## 5.1.3 diff --git a/packages/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj b/packages/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj index 283269a3d72a..db72809a6169 100644 --- a/packages/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 2D92223F1EC1DA93007564B0 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D92223E1EC1DA93007564B0 /* GeneratedPluginRegistrant.m */; }; 2E37D9A274B2EACB147AC51B /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 856D0913184F79C678A42603 /* libPods-Runner.a */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; @@ -15,8 +14,6 @@ 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -40,7 +37,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 2D92223D1EC1DA93007564B0 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GeneratedPluginRegistrant.h; path = Runner/GeneratedPluginRegistrant.h; sourceTree = ""; }; 2D92223E1EC1DA93007564B0 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GeneratedPluginRegistrant.m; path = Runner/GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; @@ -48,6 +44,7 @@ 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 = ""; }; + 836316F9AEA584411312E29F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 856D0913184F79C678A42603 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; @@ -58,6 +55,7 @@ 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 = ""; }; + A84BFEE343F54B983D1B67EB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -77,6 +75,8 @@ 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { isa = PBXGroup; children = ( + 836316F9AEA584411312E29F /* Pods-Runner.debug.xcconfig */, + A84BFEE343F54B983D1B67EB /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -86,7 +86,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -160,7 +159,6 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */, - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, ); buildRules = ( @@ -178,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -236,37 +231,19 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -341,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -389,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -430,7 +425,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -452,7 +446,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher -version: 5.1.3 +version: 5.1.4 flutter: plugin: From 9fa4e021957d4ff0baaba3a68f49904e0798376c Mon Sep 17 00:00:00 2001 From: Rody Davis <31253215+AppleEducate@users.noreply.github.com> Date: Thu, 26 Sep 2019 13:20:43 -0400 Subject: [PATCH 078/133] [update] local_auth - intl version (#2084) --- packages/local_auth/CHANGELOG.md | 4 ++++ packages/local_auth/pubspec.yaml | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/local_auth/CHANGELOG.md b/packages/local_auth/CHANGELOG.md index 832efc795a95..837dc1539c3b 100644 --- a/packages/local_auth/CHANGELOG.md +++ b/packages/local_auth/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.0+1 + +* Update the `intl` constraint to ">=0.15.1 <0.17.0" (0.16.0 isn't really a breaking change). + ## 0.6.0 * Define a new parameter for signaling that the transaction is sensitive. diff --git a/packages/local_auth/pubspec.yaml b/packages/local_auth/pubspec.yaml index a78f6287128e..f3fa41efac42 100644 --- a/packages/local_auth/pubspec.yaml +++ b/packages/local_auth/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Android and iOS device authentication sensors such as Fingerprint Reader and Touch ID. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/local_auth -version: 0.6.0 +version: 0.6.0+1 flutter: plugin: @@ -15,7 +15,7 @@ dependencies: flutter: sdk: flutter meta: ^1.0.5 - intl: ^0.15.1 + intl: ">=0.15.1 <0.17.0" platform: ^2.0.0 dev_dependencies: From 4fe02adc8cdf9ee7ee406d11715956bea53c008f Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 26 Sep 2019 10:58:19 -0700 Subject: [PATCH 079/133] [video_player] Update and migrate iOS example project (#2110) --- packages/video_player/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 57 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/video_player/pubspec.yaml | 2 +- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index 4b1ce43d1465..ca3a82880b10 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.2+2 + +* Update and migrate iOS example project. + ## 0.10.2+1 * Use DefaultHttpDataSourceFactory only when network schemas and use diff --git a/packages/video_player/example/ios/Runner.xcodeproj/project.pbxproj b/packages/video_player/example/ios/Runner.xcodeproj/project.pbxproj index 02fdf1f44277..9f0a7ef189b9 100644 --- a/packages/video_player/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/video_player/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,11 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -43,7 +40,6 @@ 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 = ""; }; 20721C28387E1F78689EC502 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -58,6 +54,8 @@ 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 = ""; }; + B15EC39F4617FE1082B18834 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + C18C242FF01156F58C0DAF1C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -77,6 +75,8 @@ 05E898481BC29A7FA83AA441 /* Pods */ = { isa = PBXGroup; children = ( + C18C242FF01156F58C0DAF1C /* Pods-Runner.debug.xcconfig */, + B15EC39F4617FE1082B18834 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -94,7 +94,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 929A04F81CC936396BFCB39E /* [CP] Embed Pods Frameworks */, - F9EA30D8C9F7B021C29C3000 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -242,16 +237,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/.symlinks/flutter/ios_debug_unopt/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -286,21 +278,6 @@ 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; }; - F9EA30D8C9F7B021C29C3000 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -341,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -389,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -430,7 +425,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -452,7 +446,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - -version: 0.10.2+1 +version: 0.10.2+2 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: From 52f16d65d0dcfb603e2c2049a55cd1b41b60cd31 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 26 Sep 2019 10:58:47 -0700 Subject: [PATCH 080/133] [connectivity] Update and migrate iOS example project (#2091) --- packages/connectivity/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 40 ++++++++++++------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 ++--- packages/connectivity/pubspec.yaml | 2 +- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/packages/connectivity/CHANGELOG.md b/packages/connectivity/CHANGELOG.md index e88bc2b2d4df..e28fcd744805 100644 --- a/packages/connectivity/CHANGELOG.md +++ b/packages/connectivity/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.4+1 + +* Update and migrate iOS example project. + ## 0.4.4 * Add `requestLocationServiceAuthorization` to request location authorization on iOS. diff --git a/packages/connectivity/example/ios/Runner.xcodeproj/project.pbxproj b/packages/connectivity/example/ios/Runner.xcodeproj/project.pbxproj index 78c4f7c8f116..e497d093be56 100644 --- a/packages/connectivity/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/connectivity/example/ios/Runner.xcodeproj/project.pbxproj @@ -13,8 +13,6 @@ 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -41,8 +39,10 @@ /* 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 = ""; }; + 3173C764DD180BE02EB51E47 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 69D903F0A9A7C636EE803AF8 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; 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 = ""; }; @@ -83,6 +83,8 @@ 8ECC1C323F60D5498EEC2315 /* Pods */ = { isa = PBXGroup; children = ( + 69D903F0A9A7C636EE803AF8 /* Pods-Runner.debug.xcconfig */, + 3173C764DD180BE02EB51E47 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -174,18 +176,17 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = JSJA5AH6K6; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -207,9 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -256,16 +255,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -322,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -370,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -411,9 +425,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = JSJA5AH6K6; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -434,9 +446,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = JSJA5AH6K6; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/connectivity/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/connectivity/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/connectivity/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/connectivity/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity -version: 0.4.4 +version: 0.4.4+1 flutter: plugin: From ef167baba97f87165c5df74dfceac73998584e7b Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 26 Sep 2019 10:59:14 -0700 Subject: [PATCH 081/133] [google_sign_in] Update and migrate iOS example project (#2094) --- packages/google_sign_in/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 48 ++++++++++--------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 ++-- packages/google_sign_in/pubspec.yaml | 2 +- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/packages/google_sign_in/CHANGELOG.md b/packages/google_sign_in/CHANGELOG.md index 188167e53cae..b46be247f317 100644 --- a/packages/google_sign_in/CHANGELOG.md +++ b/packages/google_sign_in/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.0.9 + +* Update and migrate iOS example project. + ## 4.0.8 * Get rid of `MethodCompleter` and serialize async actions using chained futures. diff --git a/packages/google_sign_in/example/ios/Runner.xcodeproj/project.pbxproj b/packages/google_sign_in/example/ios/Runner.xcodeproj/project.pbxproj index 74314c2eacc2..6c238480a00f 100644 --- a/packages/google_sign_in/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/google_sign_in/example/ios/Runner.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 5C6F5A6E1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6F5A6D1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.m */; }; 7A303C2E1E89D76400B1F19E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */; }; 7ACDFB091E89442200BE2D00 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ACDFB081E89442200BE2D00 /* App.framework */; }; @@ -15,8 +14,6 @@ 7ACDFB0E1E8944C400BE2D00 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7ACDFB0D1E8944C400BE2D00 /* AppFrameworkInfo.plist */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -42,7 +39,7 @@ /* Begin PBXFileReference section */ 0263E28FA425D1CE928BDE15 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; + 5A76713E622F06379AEDEBFA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 5C6F5A6C1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 5C6F5A6D1EC3B4CB008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 7A303C2D1E89D76400B1F19E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; @@ -60,6 +57,7 @@ 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 = ""; }; + F582639B44581540871D9BB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -79,6 +77,8 @@ 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { isa = PBXGroup; children = ( + 5A76713E622F06379AEDEBFA /* Pods-Runner.debug.xcconfig */, + F582639B44581540871D9BB0 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -86,7 +86,6 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 7ACDFB0D1E8944C400BE2D00 /* AppFrameworkInfo.plist */, 7ACDFB081E89442200BE2D00 /* App.framework */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, @@ -181,7 +180,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -191,7 +190,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -212,12 +211,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 7A303C2E1E89D76400B1F19E /* GoogleService-Info.plist in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 7ACDFB0E1E8944C400BE2D00 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -246,18 +242,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", - "${PODS_ROOT}/GTMOAuth2/Source/Touch/GTMOAuth2ViewTouch.xib", - "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GTMOAuth2ViewTouch.nib", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { @@ -266,16 +257,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -350,19 +338,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -398,19 +395,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -439,7 +445,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -461,7 +466,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/google_sign_in/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_sign_in/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100755 --- a/packages/google_sign_in/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/google_sign_in/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in -version: 4.0.8 +version: 4.0.9 flutter: plugin: From f790d24d97eb7bc91b58fc1f4fb29893c545c148 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 26 Sep 2019 10:59:47 -0700 Subject: [PATCH 082/133] [package_info] Update and migrate iOS example project (#2098) --- packages/package_info/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 62 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +-- packages/package_info/pubspec.yaml | 2 +- 4 files changed, 33 insertions(+), 45 deletions(-) diff --git a/packages/package_info/CHANGELOG.md b/packages/package_info/CHANGELOG.md index c2deb475c2f3..a041f9115004 100644 --- a/packages/package_info/CHANGELOG.md +++ b/packages/package_info/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.0+7 + +* Update and migrate iOS example project. + ## 0.4.0+6 * Fix Android compiler warnings. diff --git a/packages/package_info/example/ios/Runner.xcodeproj/project.pbxproj b/packages/package_info/example/ios/Runner.xcodeproj/project.pbxproj index e3ae59a3385d..a3c977a0bf14 100644 --- a/packages/package_info/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/package_info/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,15 +8,11 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -41,16 +37,16 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0B4CD678E84FD9C2C80D895C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; 7D007BB586407934FC28AF83 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F88DBCB0DD2793F05ADE394 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; 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 = ""; }; 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; @@ -79,6 +75,8 @@ 1B8D0C5C4E228D9E0271D922 /* Pods */ = { isa = PBXGroup; children = ( + 0B4CD678E84FD9C2C80D895C /* Pods-Runner.debug.xcconfig */, + 8F88DBCB0DD2793F05ADE394 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -88,7 +86,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -163,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 1B10719E4FA771B320770278 /* [CP] Embed Pods Frameworks */, - 8BC53FB967E57DED6A71F196 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -180,18 +176,17 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = JSJA5AH6K6; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -213,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -231,16 +223,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../../../../../../flutter/bin/cache/artifacts/engine/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -257,21 +246,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; - 8BC53FB967E57DED6A71F196 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -344,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -392,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -433,9 +425,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = JSJA5AH6K6; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -456,9 +446,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = JSJA5AH6K6; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/package_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/package_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/package_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/package_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/package_info -version: 0.4.0+6 +version: 0.4.0+7 flutter: plugin: From a3c8e3622dab9aa6990d0d0614d79f8ab237b64c Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 26 Sep 2019 12:39:50 -0700 Subject: [PATCH 083/133] Run flutter_plugin_tools format (#2112) --- .../billing_client_wrappers/billing_client_wrapper.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/in_app_purchase/lib/src/billing_client_wrappers/billing_client_wrapper.dart b/packages/in_app_purchase/lib/src/billing_client_wrappers/billing_client_wrapper.dart index c6af2c0f29cf..6d7cd83eb0ad 100644 --- a/packages/in_app_purchase/lib/src/billing_client_wrappers/billing_client_wrapper.dart +++ b/packages/in_app_purchase/lib/src/billing_client_wrappers/billing_client_wrapper.dart @@ -192,10 +192,10 @@ class BillingClient { /// listener)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querypurchasehistoryasync). Future queryPurchaseHistory(SkuType skuType) async { assert(skuType != null); - return PurchasesResultWrapper.fromJson(await channel - .invokeMapMethod( - 'BillingClient#queryPurchaseHistoryAsync(String, PurchaseHistoryResponseListener)', - {'skuType': SkuTypeConverter().toJson(skuType)})); + return PurchasesResultWrapper.fromJson(await channel.invokeMapMethod( + 'BillingClient#queryPurchaseHistoryAsync(String, PurchaseHistoryResponseListener)', + {'skuType': SkuTypeConverter().toJson(skuType)})); } /// Consumes a given in-app product. From 4e12eb210d7607c72cea47c3999fc792a1d8d310 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 26 Sep 2019 14:05:06 -0700 Subject: [PATCH 084/133] [google_maps_flutter] Update and migrate iOS example project (#2093) --- packages/google_maps_flutter/CHANGELOG.md | 4 +++ .../ios/Runner.xcodeproj/project.pbxproj | 34 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 12 ++----- packages/google_maps_flutter/pubspec.yaml | 2 +- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 76b3e23c693c..926a5867494a 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.21+5 + +* Update and migrate iOS example project. + ## 0.5.21+4 * Support projection methods to translate between screen and latlng coordinates. diff --git a/packages/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj index 48bb1b31e9c7..f6a2d6ec291a 100644 --- a/packages/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/google_maps_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,15 +8,12 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4510D964F3B1259FEDD3ABA6 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -42,7 +39,6 @@ /* 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7755F8F4BABC3D6A0BD4048B /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -58,6 +54,8 @@ 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 = ""; }; + B7AFC65E3DD5AC60D834D83D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA0E91726245EDC22B97E8B9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -85,7 +83,6 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, @@ -142,6 +139,8 @@ A189CFE5474BF8A07908B2E0 /* Pods */ = { isa = PBXGroup; children = ( + B7AFC65E3DD5AC60D834D83D /* Pods-Runner.debug.xcconfig */, + EA0E91726245EDC22B97E8B9 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -178,7 +177,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0910; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +187,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,11 +209,8 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -274,16 +270,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", - "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; FE7DE34E225BB9A5F4DB58C6 /* [CP] Embed Pods Frameworks */ = { @@ -292,16 +285,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -344,6 +334,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -353,12 +344,14 @@ 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; @@ -398,6 +391,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -407,12 +401,14 @@ 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; @@ -445,7 +441,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -467,7 +462,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/google_maps_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/google_maps_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1263ac84b105..3bb3697ef41c 100644 --- a/packages/google_maps_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/google_maps_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.21+4 +version: 0.5.21+5 dependencies: flutter: From a00be1ff8c25ff775db4f91229505e796da211a5 Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Thu, 26 Sep 2019 17:27:14 -0700 Subject: [PATCH 085/133] [google_maps_flutter] Avoid AbstractMethod crash (#2113) Override a default method to work around flutter/flutter#40126. The root cause of the issue has already been fixed in master and there is a potential workaround available to apps already, but this is an extra low-risk change that should prevent the crash for any affected users while the fix is still rolling out to stable. --- packages/google_maps_flutter/CHANGELOG.md | 4 ++ .../googlemaps/GoogleMapController.java | 14 +++++++ .../example/android/build.gradle | 2 +- .../example/android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../example/test_driver/google_maps.dart | 37 +++++++++++++++++++ packages/google_maps_flutter/pubspec.yaml | 2 +- 7 files changed, 59 insertions(+), 3 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 926a5867494a..56fbf0ee4a6e 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.21+6 + +* Override a default method to work around flutter/flutter#40126. + ## 0.5.21+5 * Update and migrate iOS example project. diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index f2ea28e32412..1c70909b0500 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -468,6 +468,20 @@ public void dispose() { registrar.activity().getApplication().unregisterActivityLifecycleCallbacks(this); } + // @Override + // The minimum supported version of Flutter doesn't have this method on the PlatformView interface, but the maximum + // does. This will override it when available even with the annotation commented out. + public void onInputConnectionLocked() { + // TODO(mklim): Remove this empty override once https://github.com/flutter/flutter/issues/40126 is fixed in stable. + }; + + // @Override + // The minimum supported version of Flutter doesn't have this method on the PlatformView interface, but the maximum + // does. This will override it when available even with the annotation commented out. + public void onInputConnectionUnlocked() { + // TODO(mklim): Remove this empty override once https://github.com/flutter/flutter/issues/40126 is fixed in stable. + }; + @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { if (disposed || activity.hashCode() != registrarActivityHashCode) { diff --git a/packages/google_maps_flutter/example/android/build.gradle b/packages/google_maps_flutter/example/android/build.gradle index 6e12e86d782e..e0d7ae2c11af 100644 --- a/packages/google_maps_flutter/example/android/build.gradle +++ b/packages/google_maps_flutter/example/android/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:3.5.0' } } diff --git a/packages/google_maps_flutter/example/android/gradle.properties b/packages/google_maps_flutter/example/android/gradle.properties index 8bd86f680510..7be3d8b46841 100644 --- a/packages/google_maps_flutter/example/android/gradle.properties +++ b/packages/google_maps_flutter/example/android/gradle.properties @@ -1 +1,2 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true diff --git a/packages/google_maps_flutter/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/google_maps_flutter/example/android/gradle/wrapper/gradle-wrapper.properties index 2819f022f1fd..9ec7236c631e 100644 --- a/packages/google_maps_flutter/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/google_maps_flutter/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-all.zip diff --git a/packages/google_maps_flutter/example/test_driver/google_maps.dart b/packages/google_maps_flutter/example/test_driver/google_maps.dart index 8bcf2e3f2f5d..90d065fbeb5b 100644 --- a/packages/google_maps_flutter/example/test_driver/google_maps.dart +++ b/packages/google_maps_flutter/example/test_driver/google_maps.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'dart:io'; +import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -638,4 +639,40 @@ void main() { expect(topLeft, const ScreenCoordinate(x: 0, y: 0)); }); + + test('testResizeWidget', () async { + final Completer controllerCompleter = + Completer(); + final GoogleMap map = GoogleMap( + initialCameraPosition: _kInitialCameraPosition, + onMapCreated: (GoogleMapController controller) async { + controllerCompleter.complete(controller); + }, + ); + await pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: MaterialApp( + home: Scaffold( + body: SizedBox(height: 100, width: 100, child: map))))); + final GoogleMapController controller = await controllerCompleter.future; + + await pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: MaterialApp( + home: Scaffold( + body: SizedBox(height: 400, width: 400, child: map))))); + + // We suspected a bug in the iOS Google Maps SDK caused the camera is not properly positioned at + // initialization. https://github.com/flutter/flutter/issues/24806 + // This temporary workaround fix is provided while the actual fix in the Google Maps SDK is + // still being investigated. + // TODO(cyanglaz): Remove this temporary fix once the Maps SDK issue is resolved. + // https://github.com/flutter/flutter/issues/27550 + await Future.delayed(const Duration(seconds: 3)); + + // Simple call to make sure that the app hasn't crashed. + final LatLngBounds bounds1 = await controller.getVisibleRegion(); + final LatLngBounds bounds2 = await controller.getVisibleRegion(); + expect(bounds1, bounds2); + }); } diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index d4ef98ccedd4..71d870f619a2 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.21+5 +version: 0.5.21+6 dependencies: flutter: From 7fe693404e90d5820f5116f760e3c9fc4a3f8736 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 27 Sep 2019 12:17:36 -0700 Subject: [PATCH 086/133] [device_info] Update and migrate iOS example project (#2092) 1. Let https://github.com/flutter/flutter/pull/26630 flutter_assets migrator run 2. Run `pod install` so flutter_assets is removed from the asset copy build phase 3. Migrate deprecated "English" to "en" language 4. Allow Xcode to remove extraneous xcconfigs, see https://github.com/flutter/flutter/pull/38724 5. Let Xcode 11 update build settings 6. Remove ARCHS, which was causing a compilation error --- packages/device_info/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 59 +++++++++---------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/device_info/pubspec.yaml | 2 +- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/packages/device_info/CHANGELOG.md b/packages/device_info/CHANGELOG.md index c9469d7bd2f1..a3e78c5e1d5d 100644 --- a/packages/device_info/CHANGELOG.md +++ b/packages/device_info/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.0+3 + +* Update and migrate iOS example project. + ## 0.4.0+2 * Bump minimum Flutter version to 1.5.0. diff --git a/packages/device_info/example/ios/Runner.xcodeproj/project.pbxproj b/packages/device_info/example/ios/Runner.xcodeproj/project.pbxproj index 65a45fa7d641..8f80e80abb09 100644 --- a/packages/device_info/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/device_info/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,14 +9,11 @@ /* 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 */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4C26954642C9965233939F98 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 17470FCDF9FA37CB94B63753 /* libPods-Runner.a */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -44,7 +41,6 @@ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 17470FCDF9FA37CB94B63753 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; @@ -58,6 +54,8 @@ 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 = ""; }; + C8043F3EE7ED1716F368CC90 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E96AF818D5456D130681C78B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -77,6 +75,8 @@ 20A0DD43C00A880430740858 /* Pods */ = { isa = PBXGroup; children = ( + C8043F3EE7ED1716F368CC90 /* Pods-Runner.debug.xcconfig */, + E96AF818D5456D130681C78B /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -86,7 +86,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 2C129809545EBEEB9253436A /* [CP] Embed Pods Frameworks */, - 8DEEC9B36E9848A5BA5F2BFA /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -234,7 +229,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -251,21 +246,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; - 8DEEC9B36E9848A5BA5F2BFA /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -286,13 +266,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../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"; + 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 */ @@ -335,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -383,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -424,7 +425,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -446,7 +446,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/device_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/device_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/device_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/device_info/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/device_info -version: 0.4.0+2 +version: 0.4.0+3 flutter: plugin: From 2d1c16e5c8b510f1a80ad98f71cb6f7e491f4b87 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 27 Sep 2019 12:32:54 -0700 Subject: [PATCH 087/133] [image_picker] Update and migrate iOS example project (#2095) --- packages/image_picker/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 37 +++++++++++-------- .../xcshareddata/xcschemes/Runner.xcscheme | 24 +++++------- packages/image_picker/pubspec.yaml | 2 +- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index 78d44e594eb5..e6cbc13a621f 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1+5 + +* Update and migrate iOS example project. + ## 0.6.1+4 * Android: Fix a regression where the `retrieveLostImage` does not work anymore. diff --git a/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj b/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj index bb359ccfca5c..0780599c7be2 100644 --- a/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj @@ -18,8 +18,6 @@ 68F4B464228B3AB500C25614 /* PhotoAssetUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 68F4B463228B3AB500C25614 /* PhotoAssetUtilTests.m */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -253,12 +251,11 @@ isa = PBXProject; attributes = { DefaultBuildSystemTypeForWorkspace = Original; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 680049162280D368006DD6AB = { CreatedOnToolsVersion = 10.2.1; - DevelopmentTeam = S8QB4VV633; ProvisioningStyle = Automatic; TestTargetID = 97C146ED1CF9000F007C117D; }; @@ -274,10 +271,9 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, Base, ); @@ -310,9 +306,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 9FC8F0E9229FA49E00C8D58F /* gifImage.gif in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -340,16 +334,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -456,7 +447,6 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = S8QB4VV633; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = image_picker_exampleTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.2; @@ -489,7 +479,6 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = S8QB4VV633; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = image_picker_exampleTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.2; @@ -507,19 +496,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -555,19 +553,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -596,7 +603,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; @@ -619,7 +625,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; diff --git a/packages/image_picker/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/image_picker/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 22773927cfd2..7a9aea57bd9d 100755 --- a/packages/image_picker/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/image_picker/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + + + @@ -39,17 +48,6 @@ - - - - - - - - - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.1+4 +version: 0.6.1+5 flutter: plugin: From 2351720bbeb8ef0e71e81788c30c810852a59067 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 30 Sep 2019 10:46:13 -0700 Subject: [PATCH 088/133] [local_auth] Update and migrate iOS example project (#2097) --- packages/local_auth/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 62 +++++++++---------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +-- packages/local_auth/pubspec.yaml | 2 +- 4 files changed, 37 insertions(+), 41 deletions(-) diff --git a/packages/local_auth/CHANGELOG.md b/packages/local_auth/CHANGELOG.md index 837dc1539c3b..ef4518813ec2 100644 --- a/packages/local_auth/CHANGELOG.md +++ b/packages/local_auth/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.0+2 + +* Update and migrate iOS example project. + ## 0.6.0+1 * Update the `intl` constraint to ">=0.15.1 <0.17.0" (0.16.0 isn't really a breaking change). diff --git a/packages/local_auth/example/ios/Runner.xcodeproj/project.pbxproj b/packages/local_auth/example/ios/Runner.xcodeproj/project.pbxproj index 7742d7e72211..63730d4eb2e3 100644 --- a/packages/local_auth/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/local_auth/example/ios/Runner.xcodeproj/project.pbxproj @@ -10,13 +10,10 @@ 0CCCD07A2CE24E13C9C1EEA4 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D274A3F79473B1549B2BBD5 /* libPods-Runner.a */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -43,8 +40,8 @@ 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 658CDD04B21E4EA92F8EF229 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; 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 = ""; }; @@ -58,6 +55,7 @@ 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 = ""; }; 9D274A3F79473B1549B2BBD5 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + EB36DF6C3F25E00DF4175422 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -79,7 +77,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -142,6 +139,8 @@ F8CC53B854B121315C7319D2 /* Pods */ = { isa = PBXGroup; children = ( + EB36DF6C3F25E00DF4175422 /* Pods-Runner.debug.xcconfig */, + 658CDD04B21E4EA92F8EF229 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 16CF73924D0A9C13B2100A83 /* [CP] Embed Pods Frameworks */, - A87A71C8D647A16C94C64B4D /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,18 +176,17 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = JSJA5AH6K6; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -211,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -235,7 +229,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -272,28 +266,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; 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"; - showEnvVarsInLog = 0; - }; - A87A71C8D647A16C94C64B4D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + 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 */ @@ -336,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -384,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -425,9 +425,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = JSJA5AH6K6; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -448,9 +446,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = JSJA5AH6K6; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/local_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/local_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/local_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/local_auth/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/local_auth -version: 0.6.0+1 +version: 0.6.0+2 flutter: plugin: From 15b8029d02e50b9572c293c197266d23cbdd3c35 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 30 Sep 2019 11:22:52 -0700 Subject: [PATCH 089/133] [camera] Define clang modules in for iOS (#2115) - Limit the supported podspec platform to iOS so tests don't run (and fail) for macOS. - Define the module by setting `DEFINES_MODULE` in the podspec. See [CocoaPod modular headers docs](http://blog.cocoapods.org/CocoaPods-1.5.0/). - Explicitly set `VALID_ARCHS` to architectures included in the Flutter universal binary. This is the CocoaPods-suggested workaround to prevent tests from running on the i386 simulator. See https://github.com/CocoaPods/CocoaPods/pull/8159. --- .cirrus.yml | 2 + packages/camera/CHANGELOG.md | 4 + packages/camera/ios/Tests/CameraPluginTests.m | 16 ++++ packages/camera/ios/camera.podspec | 9 +- packages/camera/pubspec.yaml | 2 +- script/build_all_plugins_app.sh | 4 +- script/check_publish.sh | 4 +- script/incremental_build.sh | 4 +- script/lint_darwin_plugins.sh | 87 +++++++++++++++++++ 9 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 packages/camera/ios/Tests/CameraPluginTests.m create mode 100755 script/lint_darwin_plugins.sh diff --git a/.cirrus.yml b/.cirrus.yml index 02c7551b3500..0caa1a226807 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -64,6 +64,8 @@ task: matrix: - name: build_all_plugins_ipa script: ./script/build_all_plugins_app.sh ios --no-codesign + - name: lint_darwin_plugins + script: ./script/lint_darwin_plugins.sh - name: build-ipas+drive-examples env: PATH: $PATH:/usr/local/bin diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index b6c68aa7cf9f..c32ef103ae1c 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.5 + +* Define clang modules for iOS. + ## 0.5.4+3 * Update and migrate iOS example project. diff --git a/packages/camera/ios/Tests/CameraPluginTests.m b/packages/camera/ios/Tests/CameraPluginTests.m new file mode 100644 index 000000000000..e5be3980bad0 --- /dev/null +++ b/packages/camera/ios/Tests/CameraPluginTests.m @@ -0,0 +1,16 @@ +@import camera; +@import XCTest; + +@interface CameraPluginTests : XCTestCase +@end + +@implementation CameraPluginTests + +- (void)testModuleImport { + // This test will fail to compile if the module cannot be imported. + // Make sure this plugin supports modules. See https://github.com/flutter/flutter/issues/41007. + // If not already present, add this line to the podspec: + // s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } +} + +@end diff --git a/packages/camera/ios/camera.podspec b/packages/camera/ios/camera.podspec index 0db7485005ed..dfe566ca79cc 100644 --- a/packages/camera/ios/camera.podspec +++ b/packages/camera/ios/camera.podspec @@ -15,7 +15,10 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' -end + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS' => 'armv7 arm64 x86_64' } + s.test_spec 'Tests' do |test_spec| + test_spec.source_files = 'Tests/**/*' + end +end diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 9640da5ff166..9ed9b55203f0 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.4+3 +version: 0.5.5 authors: - Flutter Team diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index dcf3bcdfd2a3..6b70ee00e9b1 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -4,8 +4,8 @@ # sure all first party plugins can be compiled together. # So that users can run this script from anywhere and it will work as expected. -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null && pwd)" -REPO_DIR="$(dirname "$SCRIPT_DIR")" +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null && pwd)" +readonly REPO_DIR="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/common.sh" check_changed_packages > /dev/null diff --git a/script/check_publish.sh b/script/check_publish.sh index 39a6894cf5fa..05a237ee97ee 100755 --- a/script/check_publish.sh +++ b/script/check_publish.sh @@ -5,8 +5,8 @@ set -e # It doesn't actually publish anything. # So that users can run this script from anywhere and it will work as expected. -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -REPO_DIR="$(dirname "$SCRIPT_DIR")" +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +readonly REPO_DIR="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/common.sh" diff --git a/script/incremental_build.sh b/script/incremental_build.sh index adb0acc72b97..0e0fb051e70c 100755 --- a/script/incremental_build.sh +++ b/script/incremental_build.sh @@ -1,8 +1,8 @@ #!/bin/bash set -e -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -REPO_DIR="$(dirname "$SCRIPT_DIR")" +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +readonly REPO_DIR="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/common.sh" diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh new file mode 100755 index 000000000000..5e5d018c391c --- /dev/null +++ b/script/lint_darwin_plugins.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# This script lints and tests iOS and macOS platform code. + +# So that users can run this script from anywhere and it will work as expected. +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +readonly REPO_DIR="$(dirname "$SCRIPT_DIR")" + +source "$SCRIPT_DIR/common.sh" + +function lint_package() { + local package_name="$1" + local package_dir="${REPO_DIR}/packages/$package_name/" + local failure_count=0 + + for podspec in "$(find "${package_dir}" -name '*\.podspec')"; do + echo "Linting $package_name.podspec" + + # Build as frameworks. + # This will also run any tests set up as a test_spec. See https://blog.cocoapods.org/CocoaPods-1.3.0. + # TODO: Add --analyze flag https://github.com/flutter/flutter/issues/41443 + # TODO: Remove --allow-warnings flag https://github.com/flutter/flutter/issues/41444 + pod lib lint "${podspec}" --allow-warnings --fail-fast --silent + if [[ "$?" -ne 0 ]]; then + error "Package ${package_name} has framework issues. Run \"pod lib lint $podspec\" to inspect." + failure_count+=1 + fi + + # Build as libraries. + pod lib lint "${podspec}" --allow-warnings --use-libraries --fail-fast --silent + if [[ "$?" -ne 0 ]]; then + error "Package ${package_name} has library issues. Run \"pod lib lint $podspec --use-libraries\" to inspect." + failure_count+=1 + fi + done + + return "${failure_count}" +} + +function lint_packages() { + if [[ ! "$(which pod)" ]]; then + echo "pod not installed. Skipping." + return + fi + + # TODO: These packages have linter errors. Remove plugins from this list as linter issues are fixed. + local skipped_packages=( + 'android_alarm_manager' + 'android_intent' + 'battery' + 'connectivity' + 'device_info' + 'google_maps_flutter' + 'google_sign_in' + 'image_picker' + 'in_app_purchase' + 'instrumentation_adapter' + 'local_auth' + 'package_info' + 'path_provider' + 'quick_actions' + 'sensors' + 'share' + 'shared_preferences' + 'url_launcher' + 'video_player' + 'webview_flutter' + ) + + local failure_count=0 + for package_name in "$@"; do + if [[ "${skipped_packages[*]}" =~ "${package_name}" ]]; then + continue + fi + lint_package "${package_name}" + failure_count+="$?" + done + + return "${failure_count}" +} + +# Sets CHANGED_PACKAGE_LIST +check_changed_packages + +if [[ "${#CHANGED_PACKAGE_LIST[@]}" != 0 ]]; then + lint_packages "${CHANGED_PACKAGE_LIST[@]}" +fi From 6070d19a0fc14f1eaa416f2770a26f48702e9b6e Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 30 Sep 2019 18:25:06 -0700 Subject: [PATCH 090/133] [in_app_purchase] Define clang module for iOS (#2125) --- packages/in_app_purchase/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 24 ++++------ .../ios/Classes/FIAPReceiptManager.h | 2 +- .../ios/Classes/InAppPurchasePlugin.m | 2 +- .../Tests}/InAppPurchasePluginTest.m | 3 +- .../Tests}/PaymentQueueTest.m | 8 +--- .../Tests}/ProductRequestHandlerTest.m | 3 +- .../Tests}/Stubs.h | 7 +-- .../Tests}/Stubs.m | 18 +++---- .../Tests}/TranslatorTest.m | 48 ++++++++++++------- .../ios/in_app_purchase.podspec | 9 ++-- packages/in_app_purchase/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 13 files changed, 73 insertions(+), 58 deletions(-) rename packages/in_app_purchase/{example/ios/in_app_purchase_pluginTests => ios/Tests}/InAppPurchasePluginTest.m (99%) rename packages/in_app_purchase/{example/ios/in_app_purchase_pluginTests => ios/Tests}/PaymentQueueTest.m (97%) rename packages/in_app_purchase/{example/ios/in_app_purchase_pluginTests => ios/Tests}/ProductRequestHandlerTest.m (99%) rename packages/in_app_purchase/{example/ios/in_app_purchase_pluginTests => ios/Tests}/Stubs.h (93%) rename packages/in_app_purchase/{example/ios/in_app_purchase_pluginTests => ios/Tests}/Stubs.m (92%) rename packages/in_app_purchase/{example/ios/in_app_purchase_pluginTests => ios/Tests}/TranslatorTest.m (77%) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index 2a4d6a9e0960..940909b10d0d 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.1+5 + +* Define clang module for iOS. + ## 0.2.1+4 * Update and migrate iOS example project. diff --git a/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj b/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj index 8ab33048c9a3..65c38e4c31b4 100644 --- a/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/in_app_purchase/example/ios/Runner.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; A5279298219369C600FF69E6 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5279297219369C600FF69E6 /* StoreKit.framework */; }; A59001A721E69658004A3E5E /* InAppPurchasePluginTest.m in Sources */ = {isa = PBXBuildFile; fileRef = A59001A621E69658004A3E5E /* InAppPurchasePluginTest.m */; }; + F78AF3142342BC89008449C7 /* PaymentQueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = F78AF3132342BC89008449C7 /* PaymentQueueTest.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -56,10 +57,10 @@ 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 = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 688DE35021F2A5A100EA2684 /* TranslatorTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TranslatorTest.m; sourceTree = ""; }; - 6896B34521E9363700D37AEF /* ProductRequestHandlerTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ProductRequestHandlerTest.m; sourceTree = ""; }; - 6896B34A21EEB4B800D37AEF /* Stubs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Stubs.h; sourceTree = ""; }; - 6896B34B21EEB4B800D37AEF /* Stubs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Stubs.m; sourceTree = ""; }; + 688DE35021F2A5A100EA2684 /* TranslatorTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TranslatorTest.m; path = ../../../ios/Tests/TranslatorTest.m; sourceTree = ""; }; + 6896B34521E9363700D37AEF /* ProductRequestHandlerTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ProductRequestHandlerTest.m; path = ../../../ios/Tests/ProductRequestHandlerTest.m; sourceTree = ""; }; + 6896B34A21EEB4B800D37AEF /* Stubs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Stubs.h; path = ../../../ios/Tests/Stubs.h; sourceTree = ""; }; + 6896B34B21EEB4B800D37AEF /* Stubs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Stubs.m; path = ../../../ios/Tests/Stubs.m; 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 = ""; }; @@ -74,11 +75,12 @@ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A5279297219369C600FF69E6 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; A59001A421E69658004A3E5E /* in_app_purchase_pluginTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = in_app_purchase_pluginTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - A59001A621E69658004A3E5E /* InAppPurchasePluginTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InAppPurchasePluginTest.m; sourceTree = ""; }; + A59001A621E69658004A3E5E /* InAppPurchasePluginTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InAppPurchasePluginTest.m; path = ../../../ios/Tests/InAppPurchasePluginTest.m; sourceTree = ""; }; A59001A821E69658004A3E5E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B2AB6BE1D4E2232AB5D4A002 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; BE95F46E12942F78BF67E55B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; DE7EEEE26E27ACC04BA9951D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + F78AF3132342BC89008449C7 /* PaymentQueueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PaymentQueueTest.m; path = ../../../ios/Tests/PaymentQueueTest.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -175,6 +177,7 @@ children = ( A59001A621E69658004A3E5E /* InAppPurchasePluginTest.m */, 6896B34521E9363700D37AEF /* ProductRequestHandlerTest.m */, + F78AF3132342BC89008449C7 /* PaymentQueueTest.m */, A59001A821E69658004A3E5E /* Info.plist */, 6896B34A21EEB4B800D37AEF /* Stubs.h */, 6896B34B21EEB4B800D37AEF /* Stubs.m */, @@ -379,6 +382,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F78AF3142342BC89008449C7 /* PaymentQueueTest.m in Sources */, 6896B34621E9363700D37AEF /* ProductRequestHandlerTest.m in Sources */, 688DE35121F2A5A100EA2684 /* TranslatorTest.m in Sources */, A59001A721E69658004A3E5E /* InAppPurchasePluginTest.m in Sources */, @@ -575,23 +579,18 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = in_app_purchase_pluginTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "sample.changme.in-app-purchase-pluginTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; name = Debug; @@ -601,22 +600,17 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = in_app_purchase_pluginTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "sample.changme.in-app-purchase-pluginTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; name = Release; diff --git a/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.h b/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.h index 19ab4f105bab..c5b67756bad0 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.h +++ b/packages/in_app_purchase/ios/Classes/FIAPReceiptManager.h @@ -10,7 +10,7 @@ NS_ASSUME_NONNULL_BEGIN @interface FIAPReceiptManager : NSObject -- (NSString *)retrieveReceiptWithError:(FlutterError *_Nullable *_Nullable)error; +- (nullable NSString *)retrieveReceiptWithError:(FlutterError *_Nullable *_Nullable)error; @end diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index 9934cf8ef1be..eb158338a752 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -154,7 +154,7 @@ - (void)addPayment:(FlutterMethodCall *)call result:(FlutterResult)result { SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product]; payment.applicationUsername = [paymentMap objectForKey:@"applicationUsername"]; NSNumber *quantity = [paymentMap objectForKey:@"quantity"]; - payment.quantity = quantity ? quantity.integerValue : 1; + payment.quantity = (quantity != nil) ? quantity.integerValue : 1; if (@available(iOS 8.3, *)) { payment.simulatesAskToBuyInSandbox = [[paymentMap objectForKey:@"simulatesAskToBuyInSandBox"] boolValue]; diff --git a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/InAppPurchasePluginTest.m b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m similarity index 99% rename from packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/InAppPurchasePluginTest.m rename to packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m index db7c1a88a4c8..e8a8885fdb84 100644 --- a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/InAppPurchasePluginTest.m +++ b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m @@ -4,9 +4,10 @@ #import #import "FIAPaymentQueueHandler.h" -#import "InAppPurchasePlugin.h" #import "Stubs.h" +@import in_app_purchase; + @interface InAppPurchasePluginTest : XCTestCase @property(strong, nonatomic) InAppPurchasePlugin* plugin; diff --git a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/PaymentQueueTest.m b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m similarity index 97% rename from packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/PaymentQueueTest.m rename to packages/in_app_purchase/ios/Tests/PaymentQueueTest.m index d3935a19a43c..7c8f4fce9af9 100644 --- a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/PaymentQueueTest.m +++ b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m @@ -3,9 +3,10 @@ // found in the LICENSE file. #import -#import "FIAPaymentQueueHandler.h" #import "Stubs.h" +@import in_app_purchase; + @interface PaymentQueueTest : XCTestCase @property(strong, nonatomic) NSDictionary *periodMap; @@ -59,7 +60,6 @@ - (void)testTransactionPurchased { return YES; } updatedDownloads:nil]; - handler.testing = YES; [queue addTransactionObserver:handler]; SKPayment *payment = [SKPayment paymentWithProduct:[[SKProductStub alloc] initWithMap:self.productResponseMap]]; @@ -87,7 +87,6 @@ - (void)testTransactionFailed { return YES; } updatedDownloads:nil]; - handler.testing = YES; [queue addTransactionObserver:handler]; SKPayment *payment = [SKPayment paymentWithProduct:[[SKProductStub alloc] initWithMap:self.productResponseMap]]; @@ -115,7 +114,6 @@ - (void)testTransactionRestored { return YES; } updatedDownloads:nil]; - handler.testing = YES; [queue addTransactionObserver:handler]; SKPayment *payment = [SKPayment paymentWithProduct:[[SKProductStub alloc] initWithMap:self.productResponseMap]]; @@ -143,7 +141,6 @@ - (void)testTransactionPurchasing { return YES; } updatedDownloads:nil]; - handler.testing = YES; [queue addTransactionObserver:handler]; SKPayment *payment = [SKPayment paymentWithProduct:[[SKProductStub alloc] initWithMap:self.productResponseMap]]; @@ -171,7 +168,6 @@ - (void)testTransactionDeferred { return YES; } updatedDownloads:nil]; - handler.testing = YES; [queue addTransactionObserver:handler]; SKPayment *payment = [SKPayment paymentWithProduct:[[SKProductStub alloc] initWithMap:self.productResponseMap]]; diff --git a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/ProductRequestHandlerTest.m b/packages/in_app_purchase/ios/Tests/ProductRequestHandlerTest.m similarity index 99% rename from packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/ProductRequestHandlerTest.m rename to packages/in_app_purchase/ios/Tests/ProductRequestHandlerTest.m index 09228a3cd4e3..5e214e8c795e 100644 --- a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/ProductRequestHandlerTest.m +++ b/packages/in_app_purchase/ios/Tests/ProductRequestHandlerTest.m @@ -3,9 +3,10 @@ // found in the LICENSE file. #import -#import "FIAPRequestHandler.h" #import "Stubs.h" +@import in_app_purchase; + #pragma tests start here @interface RequestHandlerTest : XCTestCase diff --git a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/Stubs.h b/packages/in_app_purchase/ios/Tests/Stubs.h similarity index 93% rename from packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/Stubs.h rename to packages/in_app_purchase/ios/Tests/Stubs.h index 61d5fa36fa2f..a7d13958b347 100644 --- a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/Stubs.h +++ b/packages/in_app_purchase/ios/Tests/Stubs.h @@ -4,15 +4,16 @@ #import #import -#import "FIAPReceiptManager.h" -#import "FIAPRequestHandler.h" -#import "InAppPurchasePlugin.h" + +@import in_app_purchase; NS_ASSUME_NONNULL_BEGIN +API_AVAILABLE(ios(11.2), macos(10.13.2)) @interface SKProductSubscriptionPeriodStub : SKProductSubscriptionPeriod - (instancetype)initWithMap:(NSDictionary *)map; @end +API_AVAILABLE(ios(11.2), macos(10.13.2)) @interface SKProductDiscountStub : SKProductDiscount - (instancetype)initWithMap:(NSDictionary *)map; @end diff --git a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/Stubs.m b/packages/in_app_purchase/ios/Tests/Stubs.m similarity index 92% rename from packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/Stubs.m rename to packages/in_app_purchase/ios/Tests/Stubs.m index dc4998831441..a2c65b88adbe 100644 --- a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/Stubs.m +++ b/packages/in_app_purchase/ios/Tests/Stubs.m @@ -51,14 +51,16 @@ - (instancetype)initWithMap:(NSDictionary *)map { NSLocale *locale = NSLocale.systemLocale; [self setValue:locale ?: [NSNull null] forKey:@"priceLocale"]; [self setValue:map[@"downloadContentLengths"] ?: @(0) forKey:@"downloadContentLengths"]; - SKProductSubscriptionPeriodStub *period = - [[SKProductSubscriptionPeriodStub alloc] initWithMap:map[@"subscriptionPeriod"]]; - [self setValue:period ?: [NSNull null] forKey:@"subscriptionPeriod"]; - SKProductDiscountStub *discount = - [[SKProductDiscountStub alloc] initWithMap:map[@"introductoryPrice"]]; - [self setValue:discount ?: [NSNull null] forKey:@"introductoryPrice"]; - [self setValue:map[@"subscriptionGroupIdentifier"] ?: [NSNull null] - forKey:@"subscriptionGroupIdentifier"]; + if (@available(iOS 11.2, *)) { + SKProductSubscriptionPeriodStub *period = + [[SKProductSubscriptionPeriodStub alloc] initWithMap:map[@"subscriptionPeriod"]]; + [self setValue:period ?: [NSNull null] forKey:@"subscriptionPeriod"]; + SKProductDiscountStub *discount = + [[SKProductDiscountStub alloc] initWithMap:map[@"introductoryPrice"]]; + [self setValue:discount ?: [NSNull null] forKey:@"introductoryPrice"]; + [self setValue:map[@"subscriptionGroupIdentifier"] ?: [NSNull null] + forKey:@"subscriptionGroupIdentifier"]; + } } return self; } diff --git a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/TranslatorTest.m b/packages/in_app_purchase/ios/Tests/TranslatorTest.m similarity index 77% rename from packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/TranslatorTest.m rename to packages/in_app_purchase/ios/Tests/TranslatorTest.m index 7d7fad5c2ce4..135c7f3616f4 100644 --- a/packages/in_app_purchase/example/ios/in_app_purchase_pluginTests/TranslatorTest.m +++ b/packages/in_app_purchase/ios/Tests/TranslatorTest.m @@ -3,14 +3,15 @@ // found in the LICENSE file. #import -#import "FIAObjectTranslator.h" #import "Stubs.h" +@import in_app_purchase; + @interface TranslatorTest : XCTestCase @property(strong, nonatomic) NSDictionary *periodMap; @property(strong, nonatomic) NSDictionary *discountMap; -@property(strong, nonatomic) NSDictionary *productMap; +@property(strong, nonatomic) NSMutableDictionary *productMap; @property(strong, nonatomic) NSDictionary *productResponseMap; @property(strong, nonatomic) NSDictionary *paymentMap; @property(strong, nonatomic) NSDictionary *transactionMap; @@ -30,16 +31,23 @@ - (void)setUp { @"subscriptionPeriod" : self.periodMap, @"paymentMode" : @1 }; - self.productMap = @{ + + self.productMap = [[NSMutableDictionary alloc] initWithDictionary:@{ @"price" : @"1", @"priceLocale" : [FIAObjectTranslator getMapFromNSLocale:NSLocale.systemLocale], @"productIdentifier" : @"123", @"localizedTitle" : @"title", @"localizedDescription" : @"des", - @"subscriptionPeriod" : self.periodMap, - @"introductoryPrice" : self.discountMap, - @"subscriptionGroupIdentifier" : @"com.group" - }; + }]; + if (@available(iOS 11.2, *)) { + self.productMap[@"subscriptionPeriod"] = self.periodMap; + self.productMap[@"introductoryPrice"] = self.discountMap; + } + + if (@available(iOS 12.0, *)) { + self.productMap[@"subscriptionGroupIdentifier"] = @"com.group"; + } + self.productResponseMap = @{@"products" : @[ self.productMap ], @"invalidProductIdentifiers" : @[]}; self.paymentMap = @{ @@ -79,16 +87,20 @@ - (void)setUp { } - (void)testSKProductSubscriptionPeriodStubToMap { - SKProductSubscriptionPeriodStub *period = - [[SKProductSubscriptionPeriodStub alloc] initWithMap:self.periodMap]; - NSDictionary *map = [FIAObjectTranslator getMapFromSKProductSubscriptionPeriod:period]; - XCTAssertEqualObjects(map, self.periodMap); + if (@available(iOS 11.2, *)) { + SKProductSubscriptionPeriodStub *period = + [[SKProductSubscriptionPeriodStub alloc] initWithMap:self.periodMap]; + NSDictionary *map = [FIAObjectTranslator getMapFromSKProductSubscriptionPeriod:period]; + XCTAssertEqualObjects(map, self.periodMap); + } } - (void)testSKProductDiscountStubToMap { - SKProductDiscountStub *discount = [[SKProductDiscountStub alloc] initWithMap:self.discountMap]; - NSDictionary *map = [FIAObjectTranslator getMapFromSKProductDiscount:discount]; - XCTAssertEqualObjects(map, self.discountMap); + if (@available(iOS 11.2, *)) { + SKProductDiscountStub *discount = [[SKProductDiscountStub alloc] initWithMap:self.discountMap]; + NSDictionary *map = [FIAObjectTranslator getMapFromSKProductDiscount:discount]; + XCTAssertEqualObjects(map, self.discountMap); + } } - (void)testProductToMap { @@ -125,9 +137,11 @@ - (void)testError { } - (void)testLocaleToMap { - NSLocale *system = NSLocale.systemLocale; - NSDictionary *map = [FIAObjectTranslator getMapFromNSLocale:system]; - XCTAssertEqualObjects(map[@"currencySymbol"], system.currencySymbol); + if (@available(iOS 10.0, *)) { + NSLocale *system = NSLocale.systemLocale; + NSDictionary *map = [FIAObjectTranslator getMapFromNSLocale:system]; + XCTAssertEqualObjects(map[@"currencySymbol"], system.currencySymbol); + } } @end diff --git a/packages/in_app_purchase/ios/in_app_purchase.podspec b/packages/in_app_purchase/ios/in_app_purchase.podspec index 1f30bb16949a..8b393d71a771 100644 --- a/packages/in_app_purchase/ios/in_app_purchase.podspec +++ b/packages/in_app_purchase/ios/in_app_purchase.podspec @@ -15,7 +15,10 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' -end + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS' => 'armv7 arm64 x86_64' } + s.test_spec 'Tests' do |test_spec| + test_spec.source_files = 'Tests/**/*' + end +end diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index a53d74c0f2b9..cf59c4b4ef71 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.2.1+4 +version: 0.2.1+5 dependencies: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 5e5d018c391c..39794882ef4a 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -53,7 +53,6 @@ function lint_packages() { 'google_maps_flutter' 'google_sign_in' 'image_picker' - 'in_app_purchase' 'instrumentation_adapter' 'local_auth' 'package_info' From c458aa8094743c105bf31065d0dafb342a109a36 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Tue, 1 Oct 2019 10:28:39 -0700 Subject: [PATCH 091/133] [image_picker] Define clang module for iOS (#2128) --- packages/image_picker/CHANGELOG.md | 4 + .../ios/Runner.xcodeproj/project.pbxproj | 26 ++-- .../ios/Classes/FLTImagePickerImageUtil.m | 2 +- .../ios/Classes/FLTImagePickerMetaDataUtil.h | 2 +- .../ios/Classes/FLTImagePickerMetaDataUtil.m | 4 +- .../ios/Tests/ImagePickerTestImages.h | 17 +++ .../ios/Tests/ImagePickerTestImages.m | 122 ++++++++++++++++++ .../Tests}/ImageUtilTests.m | 23 ++-- .../Tests}/MetaDataUtilTests.m | 51 +++----- .../Tests}/PhotoAssetUtilTests.m | 34 ++--- .../image_picker/ios/image_picker.podspec | 7 +- packages/image_picker/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 13 files changed, 201 insertions(+), 94 deletions(-) create mode 100644 packages/image_picker/ios/Tests/ImagePickerTestImages.h create mode 100644 packages/image_picker/ios/Tests/ImagePickerTestImages.m rename packages/image_picker/{example/ios/image_picker_exampleTests => ios/Tests}/ImageUtilTests.m (55%) rename packages/image_picker/{example/ios/image_picker_exampleTests => ios/Tests}/MetaDataUtilTests.m (55%) rename packages/image_picker/{example/ios/image_picker_exampleTests => ios/Tests}/PhotoAssetUtilTests.m (81%) mode change 100755 => 100644 packages/image_picker/ios/image_picker.podspec diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index e6cbc13a621f..6a8a75a4b65f 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1+6 + +* Define clang module for iOS + ## 0.6.1+5 * Update and migrate iOS example project. diff --git a/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj b/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj index 0780599c7be2..4ebf1def19ca 100644 --- a/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/image_picker/example/ios/Runner.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 9FC8F0EC229FA68500C8D58F /* gifImage.gif in Resources */ = {isa = PBXBuildFile; fileRef = 9FC8F0E8229FA49E00C8D58F /* gifImage.gif */; }; 9FC8F0EE229FB90B00C8D58F /* ImageUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FC8F0ED229FB90B00C8D58F /* ImageUtilTests.m */; }; F4F7A436CCA4BF276270A3AE /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EC32F6993F4529982D9519F1 /* libPods-Runner.a */; }; + F78AF3192342D9D7008449C7 /* ImagePickerTestImages.m in Sources */ = {isa = PBXBuildFile; fileRef = F78AF3182342D9D7008449C7 /* ImagePickerTestImages.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -61,11 +62,11 @@ 5C9513001EC38BD300040975 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 680049172280D368006DD6AB /* image_picker_exampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = image_picker_exampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6800491B2280D368006DD6AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 680049252280D736006DD6AB /* MetaDataUtilTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MetaDataUtilTests.m; sourceTree = ""; }; + 680049252280D736006DD6AB /* MetaDataUtilTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MetaDataUtilTests.m; path = ../../../ios/Tests/MetaDataUtilTests.m; sourceTree = ""; }; 680049352280F2B8006DD6AB /* pngImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pngImage.png; sourceTree = ""; }; 680049362280F2B8006DD6AB /* jpgImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = jpgImage.jpg; sourceTree = ""; }; 6801632E632668F4349764C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 68F4B463228B3AB500C25614 /* PhotoAssetUtilTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PhotoAssetUtilTests.m; sourceTree = ""; }; + 68F4B463228B3AB500C25614 /* PhotoAssetUtilTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PhotoAssetUtilTests.m; path = ../../../ios/Tests/PhotoAssetUtilTests.m; 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 = ""; }; @@ -79,8 +80,10 @@ 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 = ""; }; 9FC8F0E8229FA49E00C8D58F /* gifImage.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = gifImage.gif; sourceTree = ""; }; - 9FC8F0ED229FB90B00C8D58F /* ImageUtilTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ImageUtilTests.m; sourceTree = ""; }; + 9FC8F0ED229FB90B00C8D58F /* ImageUtilTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ImageUtilTests.m; path = ../../../ios/Tests/ImageUtilTests.m; sourceTree = ""; }; EC32F6993F4529982D9519F1 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + F78AF3172342D9D7008449C7 /* ImagePickerTestImages.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ImagePickerTestImages.h; path = ../../../ios/Tests/ImagePickerTestImages.h; sourceTree = ""; }; + F78AF3182342D9D7008449C7 /* ImagePickerTestImages.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ImagePickerTestImages.m; path = ../../../ios/Tests/ImagePickerTestImages.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -111,6 +114,8 @@ 9FC8F0ED229FB90B00C8D58F /* ImageUtilTests.m */, 680049252280D736006DD6AB /* MetaDataUtilTests.m */, 68F4B463228B3AB500C25614 /* PhotoAssetUtilTests.m */, + F78AF3172342D9D7008449C7 /* ImagePickerTestImages.h */, + F78AF3182342D9D7008449C7 /* ImagePickerTestImages.m */, ); path = image_picker_exampleTests; sourceTree = ""; @@ -383,6 +388,7 @@ buildActionMask = 2147483647; files = ( 9FC8F0EE229FB90B00C8D58F /* ImageUtilTests.m in Sources */, + F78AF3192342D9D7008449C7 /* ImagePickerTestImages.m in Sources */, 680049262280D736006DD6AB /* MetaDataUtilTests.m in Sources */, 68F4B464228B3AB500C25614 /* PhotoAssetUtilTests.m in Sources */, ); @@ -433,7 +439,6 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -445,17 +450,12 @@ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = image_picker_exampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.google.transformTest.image-picker-exampleTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; name = Debug; @@ -465,7 +465,6 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -477,16 +476,11 @@ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = image_picker_exampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.2; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.google.transformTest.image-picker-exampleTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; name = Release; @@ -604,7 +598,6 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -626,7 +619,6 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m index 000bd4bf9c66..241db72a68cf 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerImageUtil.m @@ -107,7 +107,7 @@ + (GIFInfo *)scaledGIFImage:(NSData *)data NSDictionary *gifProperties = properties[(NSString *)kCGImagePropertyGIFDictionary]; NSNumber *delay = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; - if (!delay) { + if (delay == nil) { delay = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; } diff --git a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h index a82dbbff93f7..9f7c19aae1b4 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h +++ b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.h @@ -23,7 +23,7 @@ extern const FLTImagePickerMIMEType kFLTImagePickerMIMETypeDefault; + (FLTImagePickerMIMEType)getImageMIMETypeFromImageData:(NSData *)imageData; // Get corresponding surfix from type. -+ (NSString *)imageTypeSuffixFromType:(FLTImagePickerMIMEType)type; ++ (nullable NSString *)imageTypeSuffixFromType:(FLTImagePickerMIMEType)type; + (NSDictionary *)getMetaDataFromImageData:(NSData *)imageData; diff --git a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m index c15f7079ad0c..67b6efa8a8a8 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m @@ -71,14 +71,14 @@ + (NSData *)convertImage:(UIImage *)image switch (type) { case FLTImagePickerMIMETypeJPEG: { - CGFloat qualityFloat = quality ? quality.floatValue : 1; + CGFloat qualityFloat = (quality != nil) ? quality.floatValue : 1; return UIImageJPEGRepresentation(image, qualityFloat); } case FLTImagePickerMIMETypePNG: return UIImagePNGRepresentation(image); default: { // converts to JPEG by default. - CGFloat qualityFloat = quality ? quality.floatValue : 1; + CGFloat qualityFloat = (quality != nil) ? quality.floatValue : 1; return UIImageJPEGRepresentation(image, qualityFloat); } } diff --git a/packages/image_picker/ios/Tests/ImagePickerTestImages.h b/packages/image_picker/ios/Tests/ImagePickerTestImages.h new file mode 100644 index 000000000000..7173e1c455ba --- /dev/null +++ b/packages/image_picker/ios/Tests/ImagePickerTestImages.h @@ -0,0 +1,17 @@ +// 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 Foundation; + +NS_ASSUME_NONNULL_BEGIN + +@interface ImagePickerTestImages : NSObject + +@property(class, copy, readonly) NSData *JPGTestData; +@property(class, copy, readonly) NSData *PNGTestData; +@property(class, copy, readonly) NSData *GIFTestData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/image_picker/ios/Tests/ImagePickerTestImages.m b/packages/image_picker/ios/Tests/ImagePickerTestImages.m new file mode 100644 index 000000000000..53559f0b637b --- /dev/null +++ b/packages/image_picker/ios/Tests/ImagePickerTestImages.m @@ -0,0 +1,122 @@ +// 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 "ImagePickerTestImages.h" + +@implementation ImagePickerTestImages + ++ (NSData*)JPGTestData { + NSBundle* bundle = [NSBundle bundleForClass:self]; + NSURL* url = [bundle URLForResource:@"jpgImage" withExtension:@"jpg"]; + NSData* data = [NSData dataWithContentsOfURL:url]; + if (!data.length) { + // When the tests are run outside the example project (podspec lint) the image may not be + // embedded in the test bundle. Fall back to the base64 string representation of the jpg. + data = [[NSData alloc] + initWithBase64EncodedString: + @"/9j/4AAQSkZJRgABAQAALgAuAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABA" + "AAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAAAuAAAAAQAAAC4AAAABAAOg" + "AQADAAAAAQABAACgAgAEAAAAAQAAAAygAwAEAAAAAQAAAAcAAAAA/+EJc2h0dHA6Ly9ucy5hZG9iZS5jb20" + "veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz" + "4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiP" + "iA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucy" + "MiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZ" + "G9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHBob3Rvc2hvcDpDcmVkaXQ9IsKpIEdvb2dsZSIvPiA8L3JkZjpSR" + "EY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI" + "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9In" + "ciPz4A/+0AVlBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAdHAFaAAMbJUccAgAAAgACHAJuAAnCqSBHb29nbG" + "UAOEJJTQQlAAAAAAAQmkt2IF3PgNJVMGnV2zijEf/AABEIAAcADAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQA" + "AAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQ" + "gjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h" + "5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp" + "6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAAB" + "AncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0R" + "FRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tr" + "e4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2wBDAAQDAwMDAgQDAwMEBAQFBgoGBg" + "UFBgwICQcKDgwPDg4MDQ0PERYTDxAVEQ0NExoTFRcYGRkZDxIbHRsYHRYYGRj/2wBDAQQEBAYFBgsGBgsYEA0" + "QGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBj/3QAEAAH/2gAMAwEA" + "AhEDEQA/AMWiiivzk/qo/9k=" + options:0]; + } + return data; +} + ++ (NSData*)PNGTestData { + NSBundle* bundle = [NSBundle bundleForClass:self]; + NSURL* url = [bundle URLForResource:@"pngImage" withExtension:@"png"]; + NSData* data = [NSData dataWithContentsOfURL:url]; + if (!data.length) { + // When the tests are run outside the example project (podspec lint) the image may not be + // embedded in the test bundle. Fall back to the base64 string representation of the png. + data = [[NSData alloc] + initWithBase64EncodedString: + @"iVBORw0KGgoAAAAEQ2dCSVAAIAYsuHdmAAAADUlIRFIAAAAMAAAABwgGAAAAPLKsJAAAAARnQU1BAACxjwv8Y" + "QUAAAABc1JHQgCuzhzpAAAAIGNIUk0AAHomAACAhAAA+" + "gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAJcEh" + "ZcwAABxMAAAcTAc4gDwgAAAAOSURBVGMwdX71nxTMMKqBCAwAsfuEYQAAAABJRU5ErkJggg==" + options:0]; + } + return data; +} + ++ (NSData*)GIFTestData { + NSBundle* bundle = [NSBundle bundleForClass:self]; + NSURL* url = [bundle URLForResource:@"gifImage" withExtension:@"gif"]; + NSData* data = [NSData dataWithContentsOfURL:url]; + if (!data.length) { + // When the tests are run outside the example project (podspec lint) the image may not be + // embedded in the test bundle. Fall back to the base64 string representation of the gif. + data = [[NSData alloc] + initWithBase64EncodedString: + @"R0lGODlhDAAHAPAAAOpCNQAAACH5BABkAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAADAAHAAACCISP" + "qcvtD1UBACH5BABkAAAALAAAAAAMAAcAhuc/JPA/K+49Ne4+PvA7MrhYHoB+A4N9BYh+BYZ+E4xyG496HZJ" + "8F5J4GaRtE6tsH7tWIr9SK7xVKJl3IKpvI7lrKc1FLc5PLNJILsdTJMFVJsZWJshWIM9XIshWJNBWLd1SK9" + "BUMNFRNOlAI+9CMuNJMetHPnuCAF66F1u8FVu7GV27HGytG3utGH6rHGK1G3WxFWeuIHqlIG60IGi4JTnTDz" + "jZDy/VEy/eFTnVEDzXFxflABfjBRPmBRbnBxPrABvpARntAxLuCBXuCQTyAAb1BgvwACnmDSPpDSLjECPpED" + "HhFFDLGIeAFoiBFoqCF4uCHYWnHJGVJqSNJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdWgAIXCjE3PTtAPDUuByQfCzQ4Qj9BPjktBgAcC" + "StJRURGQzYwJyMdDDM6SkhHS0xRCAEgD1IsKikoLzJTDgQlEBQNT05NUBMVBQMmGCEZHhsaEhEiFoEAIfkEAG" + "QAAAAsAAAAAAwABwCFB+8ACewACu0ACe4ACO8AC+4ACu8ADOwAD+wAEOYAEekAA/EABfAAB/IAAfUAA/UAAP" + "cAAfcAAvYAA/cBBPQABfUABvQAB/UBBvYBCfAACPEAC/AACvIACvMBAPgAAPkAAPgBAPkBAvgBAPoAAPoBA" + "PsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAABkfAAadjeUxEEYnk8QBoLhUHCASJJCWLyiTiIZFG3lAoO4F4SiUwScywYCQQ8" + "ScEEokCG06D8pA4mBUWCQoIBwIGGQQGBgUFQQA7" + options:0]; + } + return data; +} + +@end diff --git a/packages/image_picker/example/ios/image_picker_exampleTests/ImageUtilTests.m b/packages/image_picker/ios/Tests/ImageUtilTests.m similarity index 55% rename from packages/image_picker/example/ios/image_picker_exampleTests/ImageUtilTests.m rename to packages/image_picker/ios/Tests/ImageUtilTests.m index f59c942ea7cb..126795f8bdc9 100644 --- a/packages/image_picker/example/ios/image_picker_exampleTests/ImageUtilTests.m +++ b/packages/image_picker/ios/Tests/ImageUtilTests.m @@ -2,25 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import -#import "FLTImagePickerImageUtil.h" +#import "ImagePickerTestImages.h" -@interface ImageUtilTests : XCTestCase - -@property(strong, nonatomic) NSBundle *testBundle; +@import image_picker; +@import XCTest; +@interface ImageUtilTests : XCTestCase @end @implementation ImageUtilTests -- (void)setUp { - self.testBundle = [NSBundle bundleForClass:self.class]; -} - - (void)testScaledImage_ShouldBeScaled { - NSData *data = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; - UIImage *image = [UIImage imageWithData:data]; + UIImage *image = [UIImage imageWithData:ImagePickerTestImages.JPGTestData]; UIImage *newImage = [FLTImagePickerImageUtil scaledImage:image maxWidth:@3 maxHeight:@2]; XCTAssertEqual(newImage.size.width, 3); @@ -29,9 +22,9 @@ - (void)testScaledImage_ShouldBeScaled { - (void)testScaledGIFImage_ShouldBeScaled { // gif image that frame size is 3 and the duration is 1 second. - NSData *data = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"gifImage" - ofType:@"gif"]]; - GIFInfo *info = [FLTImagePickerImageUtil scaledGIFImage:data maxWidth:@3 maxHeight:@2]; + GIFInfo *info = [FLTImagePickerImageUtil scaledGIFImage:ImagePickerTestImages.GIFTestData + maxWidth:@3 + maxHeight:@2]; NSArray *images = info.images; NSTimeInterval duration = info.interval; diff --git a/packages/image_picker/example/ios/image_picker_exampleTests/MetaDataUtilTests.m b/packages/image_picker/ios/Tests/MetaDataUtilTests.m similarity index 55% rename from packages/image_picker/example/ios/image_picker_exampleTests/MetaDataUtilTests.m rename to packages/image_picker/ios/Tests/MetaDataUtilTests.m index e625105d3196..120ba3890a0e 100644 --- a/packages/image_picker/example/ios/image_picker_exampleTests/MetaDataUtilTests.m +++ b/packages/image_picker/ios/Tests/MetaDataUtilTests.m @@ -2,39 +2,31 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import -#import "FLTImagePickerMetaDataUtil.h" +#import "ImagePickerTestImages.h" -@interface MetaDataUtilTests : XCTestCase - -@property(strong, nonatomic) NSBundle *testBundle; +@import image_picker; +@import XCTest; +@interface MetaDataUtilTests : XCTestCase @end @implementation MetaDataUtilTests -- (void)setUp { - self.testBundle = [NSBundle bundleForClass:self.class]; -} - - (void)testGetImageMIMETypeFromImageData { // test jpeg - NSData *dataJPG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; - XCTAssertEqual([FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:dataJPG], - FLTImagePickerMIMETypeJPEG); + XCTAssertEqual( + [FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:ImagePickerTestImages.JPGTestData], + FLTImagePickerMIMETypeJPEG); // test png - NSData *dataPNG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"pngImage" - ofType:@"png"]]; - XCTAssertEqual([FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:dataPNG], - FLTImagePickerMIMETypePNG); + XCTAssertEqual( + [FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:ImagePickerTestImages.PNGTestData], + FLTImagePickerMIMETypePNG); // test gif - NSData *dataGIF = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"gifImage" - ofType:@"gif"]]; - XCTAssertEqual([FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:dataGIF], - FLTImagePickerMIMETypeGIF); + XCTAssertEqual( + [FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:ImagePickerTestImages.GIFTestData], + FLTImagePickerMIMETypeGIF); } - (void)testSuffixFromType { @@ -55,16 +47,15 @@ - (void)testSuffixFromType { } - (void)testGetMetaData { - NSData *dataJPG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; - NSDictionary *metaData = [FLTImagePickerMetaDataUtil getMetaDataFromImageData:dataJPG]; - NSDictionary *exif = [metaData objectForKey:(NSString *)kCGImagePropertyExifDictionary]; - XCTAssertEqual([exif[(NSString *)kCGImagePropertyExifPixelXDimension] integerValue], 12); + NSDictionary *metaData = + [FLTImagePickerMetaDataUtil getMetaDataFromImageData:ImagePickerTestImages.JPGTestData]; + NSDictionary *exif = [metaData objectForKey:(__bridge NSString *)kCGImagePropertyExifDictionary]; + XCTAssertEqual([exif[(__bridge NSString *)kCGImagePropertyExifPixelXDimension] integerValue], 12); } - (void)testWriteMetaData { - NSData *dataJPG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; + NSData *dataJPG = ImagePickerTestImages.JPGTestData; + NSDictionary *metaData = [FLTImagePickerMetaDataUtil getMetaDataFromImageData:dataJPG]; NSString *tmpFile = [NSString stringWithFormat:@"image_picker_test.jpg"]; NSString *tmpDirectory = NSTemporaryDirectory(); @@ -81,9 +72,7 @@ - (void)testWriteMetaData { } - (void)testConvertImageToData { - NSData *dataJPG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; - UIImage *imageJPG = [UIImage imageWithData:dataJPG]; + UIImage *imageJPG = [UIImage imageWithData:ImagePickerTestImages.JPGTestData]; NSData *convertedDataJPG = [FLTImagePickerMetaDataUtil convertImage:imageJPG usingType:FLTImagePickerMIMETypeJPEG quality:@(0.5)]; diff --git a/packages/image_picker/example/ios/image_picker_exampleTests/PhotoAssetUtilTests.m b/packages/image_picker/ios/Tests/PhotoAssetUtilTests.m similarity index 81% rename from packages/image_picker/example/ios/image_picker_exampleTests/PhotoAssetUtilTests.m rename to packages/image_picker/ios/Tests/PhotoAssetUtilTests.m index 118707564ac4..7491c907724c 100644 --- a/packages/image_picker/example/ios/image_picker_exampleTests/PhotoAssetUtilTests.m +++ b/packages/image_picker/ios/Tests/PhotoAssetUtilTests.m @@ -2,22 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import -#import "FLTImagePickerMetaDataUtil.h" -#import "FLTImagePickerPhotoAssetUtil.h" +#import "ImagePickerTestImages.h" -@interface PhotoAssetUtilTests : XCTestCase - -@property(strong, nonatomic) NSBundle *testBundle; +@import image_picker; +@import XCTest; +@interface PhotoAssetUtilTests : XCTestCase @end @implementation PhotoAssetUtilTests -- (void)setUp { - self.testBundle = [NSBundle bundleForClass:self.class]; -} - - (void)getAssetFromImagePickerInfoShouldReturnNilIfNotAvailable { NSDictionary *mockData = @{}; XCTAssertNil([FLTImagePickerPhotoAssetUtil getAssetFromImagePickerInfo:mockData]); @@ -25,8 +19,7 @@ - (void)getAssetFromImagePickerInfoShouldReturnNilIfNotAvailable { - (void)testSaveImageWithOriginalImageData_ShouldSaveWithTheCorrectExtentionAndMetaData { // test jpg - NSData *dataJPG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; + NSData *dataJPG = ImagePickerTestImages.JPGTestData; UIImage *imageJPG = [UIImage imageWithData:dataJPG]; NSString *savedPathJPG = [FLTImagePickerPhotoAssetUtil saveImageWithOriginalImageData:dataJPG image:imageJPG @@ -42,8 +35,7 @@ - (void)testSaveImageWithOriginalImageData_ShouldSaveWithTheCorrectExtentionAndM XCTAssertEqualObjects(originalMetaDataJPG[@"ProfileName"], newMetaDataJPG[@"ProfileName"]); // test png - NSData *dataPNG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"pngImage" - ofType:@"png"]]; + NSData *dataPNG = ImagePickerTestImages.PNGTestData; UIImage *imagePNG = [UIImage imageWithData:dataPNG]; NSString *savedPathPNG = [FLTImagePickerPhotoAssetUtil saveImageWithOriginalImageData:dataPNG image:imagePNG @@ -60,9 +52,7 @@ - (void)testSaveImageWithOriginalImageData_ShouldSaveWithTheCorrectExtentionAndM } - (void)testSaveImageWithPickerInfo_ShouldSaveWithDefaultExtention { - NSData *dataJPG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; - UIImage *imageJPG = [UIImage imageWithData:dataJPG]; + UIImage *imageJPG = [UIImage imageWithData:ImagePickerTestImages.JPGTestData]; NSString *savedPathJPG = [FLTImagePickerPhotoAssetUtil saveImageWithPickerInfo:nil image:imageJPG imageQuality:nil]; @@ -80,9 +70,7 @@ - (void)testSaveImageWithPickerInfo_ShouldSaveWithTheCorrectExtentionAndMetaData @{(__bridge NSString *)kCGImagePropertyExifMakerNote : @"aNote"} } }; - NSData *dataJPG = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"jpgImage" - ofType:@"jpg"]]; - UIImage *imageJPG = [UIImage imageWithData:dataJPG]; + UIImage *imageJPG = [UIImage imageWithData:ImagePickerTestImages.JPGTestData]; NSString *savedPathJPG = [FLTImagePickerPhotoAssetUtil saveImageWithPickerInfo:dummyInfo image:imageJPG imageQuality:nil]; @@ -95,8 +83,7 @@ - (void)testSaveImageWithPickerInfo_ShouldSaveWithTheCorrectExtentionAndMetaData - (void)testSaveImageWithOriginalImageData_ShouldSaveAsGifAnimation { // test gif - NSData *dataGIF = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"gifImage" - ofType:@"gif"]]; + NSData *dataGIF = ImagePickerTestImages.GIFTestData; UIImage *imageGIF = [UIImage imageWithData:dataGIF]; CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)dataGIF, nil); @@ -122,8 +109,7 @@ - (void)testSaveImageWithOriginalImageData_ShouldSaveAsGifAnimation { - (void)testSaveImageWithOriginalImageData_ShouldSaveAsScalledGifAnimation { // test gif - NSData *dataGIF = [NSData dataWithContentsOfFile:[self.testBundle pathForResource:@"gifImage" - ofType:@"gif"]]; + NSData *dataGIF = ImagePickerTestImages.GIFTestData; UIImage *imageGIF = [UIImage imageWithData:dataGIF]; CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)dataGIF, nil); diff --git a/packages/image_picker/ios/image_picker.podspec b/packages/image_picker/ios/image_picker.podspec old mode 100755 new mode 100644 index c11cb1cf92a0..3a351a2649f7 --- a/packages/image_picker/ios/image_picker.podspec +++ b/packages/image_picker/ios/image_picker.podspec @@ -14,6 +14,11 @@ Flutter plugin that shows an image picker. s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' s.dependency 'Flutter' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS' => 'armv7 arm64 x86_64' } + + s.test_spec 'Tests' do |test_spec| + test_spec.source_files = 'Tests/**/*' + end end diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index ad09895d9445..1779edcad0fc 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -5,7 +5,7 @@ authors: - Flutter Team - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.1+5 +version: 0.6.1+6 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 39794882ef4a..30c601191978 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -52,7 +52,6 @@ function lint_packages() { 'device_info' 'google_maps_flutter' 'google_sign_in' - 'image_picker' 'instrumentation_adapter' 'local_auth' 'package_info' From 7b8203af33e214666c3f0809789ae1c7d4c83ae8 Mon Sep 17 00:00:00 2001 From: Pau Picas Date: Tue, 1 Oct 2019 19:36:15 +0200 Subject: [PATCH 092/133] [google_maps_flutter] Clone cached elements in GoogleMap (#2076) Create a clone of cached elements in GoogleMap (Polyline, Polygon, etc.) to detect modifications if these objects are mutated instead of modified by copy. --- packages/google_maps_flutter/CHANGELOG.md | 5 +++++ .../google_maps_flutter/lib/src/circle.dart | 7 +++++-- .../google_maps_flutter/lib/src/marker.dart | 7 +++++-- .../google_maps_flutter/lib/src/polygon.dart | 7 ++++++- .../google_maps_flutter/lib/src/polyline.dart | 13 +++++++++++-- packages/google_maps_flutter/pubspec.yaml | 2 +- .../test/fake_maps_controllers.dart | 10 ++++++++++ .../test/polygon_updates_test.dart | 19 +++++++++++++++++++ .../test/polyline_updates_test.dart | 19 +++++++++++++++++++ 9 files changed, 81 insertions(+), 8 deletions(-) diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 56fbf0ee4a6e..45ecfbeb3e3d 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.5.21+7 + +* Create a clone of cached elements in GoogleMap (Polyline, Polygon, etc.) to detect modifications + if these objects are mutated instead of modified by copy. + ## 0.5.21+6 * Override a default method to work around flutter/flutter#40126. diff --git a/packages/google_maps_flutter/lib/src/circle.dart b/packages/google_maps_flutter/lib/src/circle.dart index eefb8c021fa6..1ab966cc6957 100644 --- a/packages/google_maps_flutter/lib/src/circle.dart +++ b/packages/google_maps_flutter/lib/src/circle.dart @@ -114,6 +114,9 @@ class Circle { ); } + /// Creates a new [Circle] object whose values are the same as this instance. + Circle clone() => copyWith(); + dynamic _toJson() { final Map json = {}; @@ -161,8 +164,8 @@ Map _keyByCircleId(Iterable circles) { if (circles == null) { return {}; } - return Map.fromEntries(circles.map( - (Circle circle) => MapEntry(circle.circleId, circle))); + return Map.fromEntries(circles.map((Circle circle) => + MapEntry(circle.circleId, circle.clone()))); } List> _serializeCircleSet(Set circles) { diff --git a/packages/google_maps_flutter/lib/src/marker.dart b/packages/google_maps_flutter/lib/src/marker.dart index 4a087f797cdf..5d4d4f393c33 100644 --- a/packages/google_maps_flutter/lib/src/marker.dart +++ b/packages/google_maps_flutter/lib/src/marker.dart @@ -254,6 +254,9 @@ class Marker { ); } + /// Creates a new [Marker] object whose values are the same as this instance. + Marker clone() => copyWith(); + Map _toJson() { final Map json = {}; @@ -314,8 +317,8 @@ Map _keyByMarkerId(Iterable markers) { if (markers == null) { return {}; } - return Map.fromEntries(markers.map( - (Marker marker) => MapEntry(marker.markerId, marker))); + return Map.fromEntries(markers.map((Marker marker) => + MapEntry(marker.markerId, marker.clone()))); } List> _serializeMarkerSet(Set markers) { diff --git a/packages/google_maps_flutter/lib/src/polygon.dart b/packages/google_maps_flutter/lib/src/polygon.dart index 2230ae81afaf..4aed3bd74bdd 100644 --- a/packages/google_maps_flutter/lib/src/polygon.dart +++ b/packages/google_maps_flutter/lib/src/polygon.dart @@ -120,6 +120,11 @@ class Polygon { ); } + /// Creates a new [Polygon] object whose values are the same as this instance. + Polygon clone() { + return copyWith(pointsParam: List.of(points)); + } + dynamic _toJson() { final Map json = {}; @@ -179,7 +184,7 @@ Map _keyByPolygonId(Iterable polygons) { return {}; } return Map.fromEntries(polygons.map((Polygon polygon) => - MapEntry(polygon.polygonId, polygon))); + MapEntry(polygon.polygonId, polygon.clone()))); } List> _serializePolygonSet(Set polygons) { diff --git a/packages/google_maps_flutter/lib/src/polyline.dart b/packages/google_maps_flutter/lib/src/polyline.dart index 7454711dd6b1..1eac1458fa7b 100644 --- a/packages/google_maps_flutter/lib/src/polyline.dart +++ b/packages/google_maps_flutter/lib/src/polyline.dart @@ -156,6 +156,15 @@ class Polyline { ); } + /// Creates a new [Polyline] object whose values are the same as this + /// instance. + Polyline clone() { + return copyWith( + patternsParam: List.of(patterns), + pointsParam: List.of(points), + ); + } + dynamic _toJson() { final Map json = {}; @@ -234,8 +243,8 @@ Map _keyByPolylineId(Iterable polylines) { return {}; } return Map.fromEntries(polylines.map( - (Polyline polyline) => - MapEntry(polyline.polylineId, polyline))); + (Polyline polyline) => MapEntry( + polyline.polylineId, polyline.clone()))); } List> _serializePolylineSet(Set polylines) { diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 71d870f619a2..5e8e92eb6740 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.21+6 +version: 0.5.21+7 dependencies: flutter: diff --git a/packages/google_maps_flutter/test/fake_maps_controllers.dart b/packages/google_maps_flutter/test/fake_maps_controllers.dart index 0ae12c815ff3..b92b841497aa 100644 --- a/packages/google_maps_flutter/test/fake_maps_controllers.dart +++ b/packages/google_maps_flutter/test/fake_maps_controllers.dart @@ -195,17 +195,25 @@ class FakePlatformGoogleMap { final String polygonId = polygonData['polygonId']; final bool visible = polygonData['visible']; final bool geodesic = polygonData['geodesic']; + final List points = _deserializePoints(polygonData['points']); result.add(Polygon( polygonId: PolygonId(polygonId), visible: visible, geodesic: geodesic, + points: points, )); } return result; } + List _deserializePoints(List points) { + return points.map((dynamic list) { + return LatLng(list[0], list[1]); + }).toList(); + } + void updatePolylines(Map polylineUpdates) { if (polylineUpdates == null) { return; @@ -245,11 +253,13 @@ class FakePlatformGoogleMap { final String polylineId = polylineData['polylineId']; final bool visible = polylineData['visible']; final bool geodesic = polylineData['geodesic']; + final List points = _deserializePoints(polylineData['points']); result.add(Polyline( polylineId: PolylineId(polylineId), visible: visible, geodesic: geodesic, + points: points, )); } diff --git a/packages/google_maps_flutter/test/polygon_updates_test.dart b/packages/google_maps_flutter/test/polygon_updates_test.dart index c666cb687fee..a884254f0587 100644 --- a/packages/google_maps_flutter/test/polygon_updates_test.dart +++ b/packages/google_maps_flutter/test/polygon_updates_test.dart @@ -130,6 +130,25 @@ void main() { expect(update.geodesic, true); }); + testWidgets("Mutate a polygon", (WidgetTester tester) async { + final Polygon p1 = Polygon( + polygonId: PolygonId("polygon_1"), + points: [const LatLng(0.0, 0.0)], + ); + await tester.pumpWidget(_mapWithPolygons(_toSet(p1: p1))); + + p1.points.add(const LatLng(1.0, 1.0)); + await tester.pumpWidget(_mapWithPolygons(_toSet(p1: p1))); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + expect(platformGoogleMap.polygonsToChange.length, 1); + expect(platformGoogleMap.polygonsToChange.first, equals(p1)); + + expect(platformGoogleMap.polygonIdsToRemove.isEmpty, true); + expect(platformGoogleMap.polygonsToAdd.isEmpty, true); + }); + testWidgets("Multi Update", (WidgetTester tester) async { Polygon p1 = Polygon(polygonId: PolygonId("polygon_1")); Polygon p2 = Polygon(polygonId: PolygonId("polygon_2")); diff --git a/packages/google_maps_flutter/test/polyline_updates_test.dart b/packages/google_maps_flutter/test/polyline_updates_test.dart index a0f39185d472..ddc64bf6158b 100644 --- a/packages/google_maps_flutter/test/polyline_updates_test.dart +++ b/packages/google_maps_flutter/test/polyline_updates_test.dart @@ -130,6 +130,25 @@ void main() { expect(update.geodesic, true); }); + testWidgets("Mutate a polyline", (WidgetTester tester) async { + final Polyline p1 = Polyline( + polylineId: PolylineId("polyline_1"), + points: [const LatLng(0.0, 0.0)], + ); + await tester.pumpWidget(_mapWithPolylines(_toSet(p1: p1))); + + p1.points.add(const LatLng(1.0, 1.0)); + await tester.pumpWidget(_mapWithPolylines(_toSet(p1: p1))); + + final FakePlatformGoogleMap platformGoogleMap = + fakePlatformViewsController.lastCreatedView; + expect(platformGoogleMap.polylinesToChange.length, 1); + expect(platformGoogleMap.polylinesToChange.first, equals(p1)); + + expect(platformGoogleMap.polylineIdsToRemove.isEmpty, true); + expect(platformGoogleMap.polylinesToAdd.isEmpty, true); + }); + testWidgets("Multi Update", (WidgetTester tester) async { Polyline p1 = Polyline(polylineId: PolylineId("polyline_1")); Polyline p2 = Polyline(polylineId: PolylineId("polyline_2")); From c3f07e7abba62201b4fee76978d4c29a9a6c4b52 Mon Sep 17 00:00:00 2001 From: Cristian Zazo Date: Wed, 2 Oct 2019 18:31:48 +0200 Subject: [PATCH 093/133] [camera] Fix event type check (#2123) Trivial change to properly check if the type of an event is an error, so a description can be added. --- packages/camera/CHANGELOG.md | 4 + packages/camera/android/build.gradle | 7 ++ .../io/flutter/plugins/camera/Camera.java | 59 +++------- .../flutter/plugins/camera/CameraPlugin.java | 19 ++-- .../flutter/plugins/camera/DartMessenger.java | 51 +++++++++ .../plugins/camera/DartMessengerTest.java | 107 ++++++++++++++++++ packages/camera/pubspec.yaml | 2 +- 7 files changed, 195 insertions(+), 54 deletions(-) create mode 100644 packages/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java create mode 100644 packages/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index c32ef103ae1c..2fe0e44fa6c2 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.5+1 + +* Fix event type check + ## 0.5.5 * Define clang modules for iOS. diff --git a/packages/camera/android/build.gradle b/packages/camera/android/build.gradle index dd544c084ba7..ab2fc8fd89f0 100644 --- a/packages/camera/android/build.gradle +++ b/packages/camera/android/build.gradle @@ -52,4 +52,11 @@ android { implementation 'androidx.annotation:annotation:1.0.0' implementation 'androidx.core:core:1.0.0' } + testOptions { + unitTests.returnDefaultValues = true + } +} + +dependencies { + testImplementation 'junit:junit:4.12' } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java index 80da644a146a..754a157a8b71 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -28,7 +28,6 @@ import androidx.annotation.NonNull; import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.view.FlutterView; import io.flutter.view.TextureRegistry.SurfaceTextureEntry; import java.io.File; import java.io.FileOutputStream; @@ -55,7 +54,7 @@ public class Camera { private CameraCaptureSession cameraCaptureSession; private ImageReader pictureImageReader; private ImageReader imageStreamReader; - private EventChannel.EventSink eventSink; + private DartMessenger dartMessenger; private CaptureRequest.Builder captureRequestBuilder; private MediaRecorder mediaRecorder; private boolean recordingVideo; @@ -74,7 +73,8 @@ public enum ResolutionPreset { public Camera( final Activity activity, - final FlutterView flutterView, + final SurfaceTextureEntry flutterTexture, + final DartMessenger dartMessenger, final String cameraName, final String resolutionPreset, final boolean enableAudio) @@ -85,7 +85,8 @@ public Camera( this.cameraName = cameraName; this.enableAudio = enableAudio; - this.flutterTexture = flutterView.createSurfaceTexture(); + this.flutterTexture = flutterTexture; + this.dartMessenger = dartMessenger; this.cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); orientationEventListener = new OrientationEventListener(activity.getApplicationContext()) { @@ -115,21 +116,6 @@ public void onOrientationChanged(int i) { previewSize = computeBestPreviewSize(cameraName, preset); } - public void setupCameraEventChannel(EventChannel cameraEventChannel) { - cameraEventChannel.setStreamHandler( - new EventChannel.StreamHandler() { - @Override - public void onListen(Object arguments, EventChannel.EventSink sink) { - eventSink = sink; - } - - @Override - public void onCancel(Object arguments) { - eventSink = null; - } - }); - } - private void prepareMediaRecorder(String outputFilePath) throws IOException { if (mediaRecorder != null) { mediaRecorder.release(); @@ -186,14 +172,14 @@ public void onOpened(@NonNull CameraDevice device) { @Override public void onClosed(@NonNull CameraDevice camera) { - sendEvent(EventType.CAMERA_CLOSING); + dartMessenger.sendCameraClosingEvent(); super.onClosed(camera); } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { close(); - sendEvent(EventType.ERROR, "The camera was disconnected."); + dartMessenger.send(DartMessenger.EventType.ERROR, "The camera was disconnected."); } @Override @@ -219,7 +205,7 @@ public void onError(@NonNull CameraDevice cameraDevice, int errorCode) { default: errorDescription = "Unknown camera error"; } - sendEvent(EventType.ERROR, errorDescription); + dartMessenger.send(DartMessenger.EventType.ERROR, errorDescription); } }, null); @@ -327,7 +313,8 @@ private void createCaptureSession( public void onConfigured(@NonNull CameraCaptureSession session) { try { if (cameraDevice == null) { - sendEvent(EventType.ERROR, "The camera was closed during configuration."); + dartMessenger.send( + DartMessenger.EventType.ERROR, "The camera was closed during configuration."); return; } cameraCaptureSession = session; @@ -338,13 +325,14 @@ public void onConfigured(@NonNull CameraCaptureSession session) { onSuccessCallback.run(); } } catch (CameraAccessException | IllegalStateException | IllegalArgumentException e) { - sendEvent(EventType.ERROR, e.getMessage()); + dartMessenger.send(DartMessenger.EventType.ERROR, e.getMessage()); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { - sendEvent(EventType.ERROR, "Failed to configure camera session."); + dartMessenger.send( + DartMessenger.EventType.ERROR, "Failed to configure camera session."); } }; @@ -487,22 +475,6 @@ private void setImageStreamImageAvailableListener(final EventChannel.EventSink i null); } - private void sendEvent(EventType eventType) { - sendEvent(eventType, null); - } - - private void sendEvent(EventType eventType, String description) { - if (eventSink != null) { - Map event = new HashMap<>(); - event.put("eventType", eventType.toString().toLowerCase()); - // Only errors have description - if (eventType != EventType.ERROR) { - event.put("errorDescription", description); - } - eventSink.success(event); - } - } - private void closeCaptureSession() { if (cameraCaptureSession != null) { cameraCaptureSession.close(); @@ -545,9 +517,4 @@ private int getMediaOrientation() { : (isFrontFacing) ? -currentOrientation : currentOrientation; return (sensorOrientationOffset + sensorOrientation + 360) % 360; } - - private enum EventType { - ERROR, - CAMERA_CLOSING, - } } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java index b3a1da8b1b09..b504f039e326 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java @@ -14,6 +14,7 @@ import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; import io.flutter.view.FlutterView; +import io.flutter.view.TextureRegistry; public class CameraPlugin implements MethodCallHandler { @@ -48,13 +49,17 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce String cameraName = call.argument("cameraName"); String resolutionPreset = call.argument("resolutionPreset"); boolean enableAudio = call.argument("enableAudio"); - camera = new Camera(registrar.activity(), view, cameraName, resolutionPreset, enableAudio); - - EventChannel cameraEventChannel = - new EventChannel( - registrar.messenger(), - "flutter.io/cameraPlugin/cameraEvents" + camera.getFlutterTexture().id()); - camera.setupCameraEventChannel(cameraEventChannel); + TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture = view.createSurfaceTexture(); + DartMessenger dartMessenger = + new DartMessenger(registrar.messenger(), flutterSurfaceTexture.id()); + camera = + new Camera( + registrar.activity(), + flutterSurfaceTexture, + dartMessenger, + cameraName, + resolutionPreset, + enableAudio); camera.open(result); } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java new file mode 100644 index 000000000000..fe385bef7818 --- /dev/null +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java @@ -0,0 +1,51 @@ +package io.flutter.plugins.camera; + +import android.text.TextUtils; +import androidx.annotation.Nullable; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.EventChannel; +import java.util.HashMap; +import java.util.Map; + +class DartMessenger { + @Nullable private EventChannel.EventSink eventSink; + + enum EventType { + ERROR, + CAMERA_CLOSING, + } + + DartMessenger(BinaryMessenger messenger, long eventChannelId) { + new EventChannel(messenger, "flutter.io/cameraPlugin/cameraEvents" + eventChannelId) + .setStreamHandler( + new EventChannel.StreamHandler() { + @Override + public void onListen(Object arguments, EventChannel.EventSink sink) { + eventSink = sink; + } + + @Override + public void onCancel(Object arguments) { + eventSink = null; + } + }); + } + + void sendCameraClosingEvent() { + send(EventType.CAMERA_CLOSING, null); + } + + void send(EventType eventType, @Nullable String description) { + if (eventSink == null) { + return; + } + + Map event = new HashMap<>(); + event.put("eventType", eventType.toString().toLowerCase()); + // Only errors have a description. + if (eventType == EventType.ERROR && !TextUtils.isEmpty(description)) { + event.put("errorDescription", description); + } + eventSink.success(event); + } +} diff --git a/packages/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java b/packages/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java new file mode 100644 index 000000000000..db89eb279f41 --- /dev/null +++ b/packages/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java @@ -0,0 +1,107 @@ +package io.flutter.plugins.camera; + +import static junit.framework.TestCase.assertNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.StandardMethodCodec; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; + +public class DartMessengerTest { + /** A {@link BinaryMessenger} implementation that does nothing but save its messages. */ + private static class FakeBinaryMessenger implements BinaryMessenger { + private BinaryMessageHandler handler; + private final List sentMessages = new ArrayList<>(); + + @Override + public void send(String channel, ByteBuffer message) { + sentMessages.add(message); + } + + @Override + public void send(String channel, ByteBuffer message, BinaryReply callback) { + send(channel, message); + } + + @Override + public void setMessageHandler(String channel, BinaryMessageHandler handler) { + this.handler = handler; + } + + BinaryMessageHandler getMessageHandler() { + return handler; + } + + List getMessages() { + return new ArrayList<>(sentMessages); + } + } + + private DartMessenger dartMessenger; + private FakeBinaryMessenger fakeBinaryMessenger; + + @Before + public void setUp() { + fakeBinaryMessenger = new FakeBinaryMessenger(); + dartMessenger = new DartMessenger(fakeBinaryMessenger, 0); + } + + @Test + public void setsStreamHandler() { + assertNotNull(fakeBinaryMessenger.getMessageHandler()); + } + + @Test + public void send_handlesNullEventSinks() { + dartMessenger.send(DartMessenger.EventType.ERROR, "error description"); + + List sentMessages = fakeBinaryMessenger.getMessages(); + assertEquals(0, sentMessages.size()); + } + + @Test + public void send_includesErrorDescriptions() { + initializeEventSink(); + + dartMessenger.send(DartMessenger.EventType.ERROR, "error description"); + + List sentMessages = fakeBinaryMessenger.getMessages(); + assertEquals(1, sentMessages.size()); + Map event = decodeSentMessage(sentMessages.get(0)); + assertEquals(DartMessenger.EventType.ERROR.toString().toLowerCase(), event.get("eventType")); + assertEquals("error description", event.get("errorDescription")); + } + + @Test + public void sendCameraClosingEvent() { + initializeEventSink(); + + dartMessenger.sendCameraClosingEvent(); + + List sentMessages = fakeBinaryMessenger.getMessages(); + assertEquals(1, sentMessages.size()); + Map event = decodeSentMessage(sentMessages.get(0)); + assertEquals( + DartMessenger.EventType.CAMERA_CLOSING.toString().toLowerCase(), event.get("eventType")); + assertNull(event.get("errorDescription")); + } + + private Map decodeSentMessage(ByteBuffer sentMessage) { + sentMessage.position(0); + return (Map) StandardMethodCodec.INSTANCE.decodeEnvelope(sentMessage); + } + + private void initializeEventSink() { + MethodCall call = new MethodCall("listen", null); + ByteBuffer encodedCall = StandardMethodCodec.INSTANCE.encodeMethodCall(call); + encodedCall.position(0); + fakeBinaryMessenger.getMessageHandler().onMessage(encodedCall, reply -> {}); + } +} diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 9ed9b55203f0..0906f175fb8d 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.5 +version: 0.5.5+1 authors: - Flutter Team From 1d5301d5da622870962011677695ebdc9873888b Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Wed, 2 Oct 2019 12:56:12 -0700 Subject: [PATCH 094/133] Add web url launcher (#2119) * Move url_launcher to url_launcher/url_launcher Add url_launcher_web package Test plugins even if they don't have a pubspec in the top-level folder Bump up the pubspec version for new homepage URL Add dummy podspec file for iOS Remove unused import Format test Update check_publish.sh script * UPdate check_publish for federated plugins. * Follow correct semver when bumping version * Add some tests for `launch` * Check if directory exists for CI --- .../{ => url_launcher}/CHANGELOG.md | 4 ++ .../url_launcher/{ => url_launcher}/LICENSE | 0 .../url_launcher/{ => url_launcher}/README.md | 0 .../{ => url_launcher}/android/build.gradle | 0 .../android/gradle.properties | 0 .../android/settings.gradle | 0 .../android/src/main/AndroidManifest.xml | 0 .../urllauncher/UrlLauncherPlugin.java | 0 .../plugins/urllauncher/WebViewActivity.java | 0 .../{ => url_launcher}/example/README.md | 0 .../example/android/app/build.gradle | 0 .../example/android/app/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../android/app/src/main/AndroidManifest.xml | 0 .../urllauncherexample/MainActivity.java | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../example/android/build.gradle | 0 .../example/android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../example/android/settings.gradle | 0 .../ios/Flutter/AppFrameworkInfo.plist | 0 .../example/ios/Flutter/Debug.xcconfig | 0 .../example/ios/Flutter/Release.xcconfig | 0 .../ios/Runner.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../example/ios/Runner/AppDelegate.h | 0 .../example/ios/Runner/AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../example/ios/Runner/Info.plist | 0 .../example/ios/Runner/main.m | 0 .../{ => url_launcher}/example/lib/main.dart | 0 .../{ => url_launcher}/example/pubspec.yaml | 0 .../example/url_launcher_example.iml | 0 .../{ => url_launcher}/ios/Assets/.gitkeep | 0 .../ios/Classes/UrlLauncherPlugin.h | 0 .../ios/Classes/UrlLauncherPlugin.m | 0 .../ios/url_launcher.podspec | 0 .../{ => url_launcher}/lib/url_launcher.dart | 0 .../{ => url_launcher}/pubspec.yaml | 4 +- .../test/url_launcher_test.dart | 0 .../url_launcher_web/CHANGELOG.md | 3 ++ .../url_launcher/url_launcher_web/LICENSE | 27 ++++++++++ .../url_launcher/url_launcher_web/README.md | 24 +++++++++ .../ios/url_launcher_web.podspec | 20 +++++++ .../lib/url_launcher_web.dart | 49 ++++++++++++++++++ .../url_launcher_web/pubspec.yaml | 29 +++++++++++ .../test/url_launcher_web_test.dart | 49 ++++++++++++++++++ script/check_publish.sh | 10 ++-- script/common.sh | 7 ++- 71 files changed, 215 insertions(+), 11 deletions(-) rename packages/url_launcher/{ => url_launcher}/CHANGELOG.md (98%) rename packages/url_launcher/{ => url_launcher}/LICENSE (100%) rename packages/url_launcher/{ => url_launcher}/README.md (100%) rename packages/url_launcher/{ => url_launcher}/android/build.gradle (100%) rename packages/url_launcher/{ => url_launcher}/android/gradle.properties (100%) rename packages/url_launcher/{ => url_launcher}/android/settings.gradle (100%) rename packages/url_launcher/{ => url_launcher}/android/src/main/AndroidManifest.xml (100%) rename packages/url_launcher/{ => url_launcher}/android/src/main/java/io/flutter/plugins/urllauncher/UrlLauncherPlugin.java (100%) rename packages/url_launcher/{ => url_launcher}/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java (100%) rename packages/url_launcher/{ => url_launcher}/example/README.md (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/build.gradle (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/gradle.properties (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/src/main/AndroidManifest.xml (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/MainActivity.java (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename packages/url_launcher/{ => url_launcher}/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename packages/url_launcher/{ => url_launcher}/example/android/build.gradle (100%) rename packages/url_launcher/{ => url_launcher}/example/android/gradle.properties (100%) rename packages/url_launcher/{ => url_launcher}/example/android/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/url_launcher/{ => url_launcher}/example/android/settings.gradle (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Flutter/AppFrameworkInfo.plist (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Flutter/Debug.xcconfig (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Flutter/Release.xcconfig (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner.xcodeproj/project.pbxproj (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/AppDelegate.h (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/AppDelegate.m (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Base.lproj/Main.storyboard (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/Info.plist (100%) rename packages/url_launcher/{ => url_launcher}/example/ios/Runner/main.m (100%) rename packages/url_launcher/{ => url_launcher}/example/lib/main.dart (100%) rename packages/url_launcher/{ => url_launcher}/example/pubspec.yaml (100%) rename packages/url_launcher/{ => url_launcher}/example/url_launcher_example.iml (100%) rename packages/url_launcher/{ => url_launcher}/ios/Assets/.gitkeep (100%) rename packages/url_launcher/{ => url_launcher}/ios/Classes/UrlLauncherPlugin.h (100%) rename packages/url_launcher/{ => url_launcher}/ios/Classes/UrlLauncherPlugin.m (100%) rename packages/url_launcher/{ => url_launcher}/ios/url_launcher.podspec (100%) rename packages/url_launcher/{ => url_launcher}/lib/url_launcher.dart (100%) rename packages/url_launcher/{ => url_launcher}/pubspec.yaml (92%) rename packages/url_launcher/{ => url_launcher}/test/url_launcher_test.dart (100%) create mode 100644 packages/url_launcher/url_launcher_web/CHANGELOG.md create mode 100644 packages/url_launcher/url_launcher_web/LICENSE create mode 100644 packages/url_launcher/url_launcher_web/README.md create mode 100644 packages/url_launcher/url_launcher_web/ios/url_launcher_web.podspec create mode 100644 packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart create mode 100644 packages/url_launcher/url_launcher_web/pubspec.yaml create mode 100644 packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart diff --git a/packages/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md similarity index 98% rename from packages/url_launcher/CHANGELOG.md rename to packages/url_launcher/url_launcher/CHANGELOG.md index 22e75263c7e7..e660b5c46e3e 100644 --- a/packages/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.1.5 + +* Update homepage url after moving to federated directory. + ## 5.1.4 * Update and migrate iOS example project. diff --git a/packages/url_launcher/LICENSE b/packages/url_launcher/url_launcher/LICENSE similarity index 100% rename from packages/url_launcher/LICENSE rename to packages/url_launcher/url_launcher/LICENSE diff --git a/packages/url_launcher/README.md b/packages/url_launcher/url_launcher/README.md similarity index 100% rename from packages/url_launcher/README.md rename to packages/url_launcher/url_launcher/README.md diff --git a/packages/url_launcher/android/build.gradle b/packages/url_launcher/url_launcher/android/build.gradle similarity index 100% rename from packages/url_launcher/android/build.gradle rename to packages/url_launcher/url_launcher/android/build.gradle diff --git a/packages/url_launcher/android/gradle.properties b/packages/url_launcher/url_launcher/android/gradle.properties similarity index 100% rename from packages/url_launcher/android/gradle.properties rename to packages/url_launcher/url_launcher/android/gradle.properties diff --git a/packages/url_launcher/android/settings.gradle b/packages/url_launcher/url_launcher/android/settings.gradle similarity index 100% rename from packages/url_launcher/android/settings.gradle rename to packages/url_launcher/url_launcher/android/settings.gradle diff --git a/packages/url_launcher/android/src/main/AndroidManifest.xml b/packages/url_launcher/url_launcher/android/src/main/AndroidManifest.xml similarity index 100% rename from packages/url_launcher/android/src/main/AndroidManifest.xml rename to packages/url_launcher/url_launcher/android/src/main/AndroidManifest.xml diff --git a/packages/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/UrlLauncherPlugin.java b/packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/UrlLauncherPlugin.java similarity index 100% rename from packages/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/UrlLauncherPlugin.java rename to packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/UrlLauncherPlugin.java diff --git a/packages/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java b/packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java similarity index 100% rename from packages/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java rename to packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java diff --git a/packages/url_launcher/example/README.md b/packages/url_launcher/url_launcher/example/README.md similarity index 100% rename from packages/url_launcher/example/README.md rename to packages/url_launcher/url_launcher/example/README.md diff --git a/packages/url_launcher/example/android/app/build.gradle b/packages/url_launcher/url_launcher/example/android/app/build.gradle similarity index 100% rename from packages/url_launcher/example/android/app/build.gradle rename to packages/url_launcher/url_launcher/example/android/app/build.gradle diff --git a/packages/url_launcher/example/android/app/gradle.properties b/packages/url_launcher/url_launcher/example/android/app/gradle.properties similarity index 100% rename from packages/url_launcher/example/android/app/gradle.properties rename to packages/url_launcher/url_launcher/example/android/app/gradle.properties diff --git a/packages/url_launcher/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/url_launcher/url_launcher/example/android/app/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/url_launcher/example/android/app/gradle/wrapper/gradle-wrapper.properties rename to packages/url_launcher/url_launcher/example/android/app/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/url_launcher/example/android/app/src/main/AndroidManifest.xml b/packages/url_launcher/url_launcher/example/android/app/src/main/AndroidManifest.xml similarity index 100% rename from packages/url_launcher/example/android/app/src/main/AndroidManifest.xml rename to packages/url_launcher/url_launcher/example/android/app/src/main/AndroidManifest.xml diff --git a/packages/url_launcher/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/MainActivity.java b/packages/url_launcher/url_launcher/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/MainActivity.java similarity index 100% rename from packages/url_launcher/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/MainActivity.java rename to packages/url_launcher/url_launcher/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/MainActivity.java diff --git a/packages/url_launcher/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from packages/url_launcher/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/packages/url_launcher/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from packages/url_launcher/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/packages/url_launcher/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from packages/url_launcher/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/packages/url_launcher/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from packages/url_launcher/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/packages/url_launcher/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from packages/url_launcher/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/url_launcher/url_launcher/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/packages/url_launcher/example/android/build.gradle b/packages/url_launcher/url_launcher/example/android/build.gradle similarity index 100% rename from packages/url_launcher/example/android/build.gradle rename to packages/url_launcher/url_launcher/example/android/build.gradle diff --git a/packages/url_launcher/example/android/gradle.properties b/packages/url_launcher/url_launcher/example/android/gradle.properties similarity index 100% rename from packages/url_launcher/example/android/gradle.properties rename to packages/url_launcher/url_launcher/example/android/gradle.properties diff --git a/packages/url_launcher/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/url_launcher/url_launcher/example/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/url_launcher/example/android/gradle/wrapper/gradle-wrapper.properties rename to packages/url_launcher/url_launcher/example/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/url_launcher/example/android/settings.gradle b/packages/url_launcher/url_launcher/example/android/settings.gradle similarity index 100% rename from packages/url_launcher/example/android/settings.gradle rename to packages/url_launcher/url_launcher/example/android/settings.gradle diff --git a/packages/url_launcher/example/ios/Flutter/AppFrameworkInfo.plist b/packages/url_launcher/url_launcher/example/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/url_launcher/example/ios/Flutter/AppFrameworkInfo.plist rename to packages/url_launcher/url_launcher/example/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/url_launcher/example/ios/Flutter/Debug.xcconfig b/packages/url_launcher/url_launcher/example/ios/Flutter/Debug.xcconfig similarity index 100% rename from packages/url_launcher/example/ios/Flutter/Debug.xcconfig rename to packages/url_launcher/url_launcher/example/ios/Flutter/Debug.xcconfig diff --git a/packages/url_launcher/example/ios/Flutter/Release.xcconfig b/packages/url_launcher/url_launcher/example/ios/Flutter/Release.xcconfig similarity index 100% rename from packages/url_launcher/example/ios/Flutter/Release.xcconfig rename to packages/url_launcher/url_launcher/example/ios/Flutter/Release.xcconfig diff --git a/packages/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj b/packages/url_launcher/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from packages/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj rename to packages/url_launcher/url_launcher/example/ios/Runner.xcodeproj/project.pbxproj diff --git a/packages/url_launcher/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/url_launcher/url_launcher/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/url_launcher/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/url_launcher/url_launcher/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/url_launcher/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/url_launcher/url_launcher/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/url_launcher/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/url_launcher/url_launcher/example/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/url_launcher/example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to packages/url_launcher/url_launcher/example/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/url_launcher/example/ios/Runner/AppDelegate.h b/packages/url_launcher/url_launcher/example/ios/Runner/AppDelegate.h similarity index 100% rename from packages/url_launcher/example/ios/Runner/AppDelegate.h rename to packages/url_launcher/url_launcher/example/ios/Runner/AppDelegate.h diff --git a/packages/url_launcher/example/ios/Runner/AppDelegate.m b/packages/url_launcher/url_launcher/example/ios/Runner/AppDelegate.m similarity index 100% rename from packages/url_launcher/example/ios/Runner/AppDelegate.m rename to packages/url_launcher/url_launcher/example/ios/Runner/AppDelegate.m diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/url_launcher/url_launcher/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/url_launcher/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/url_launcher/url_launcher/example/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/url_launcher/example/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/url_launcher/url_launcher/example/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/packages/url_launcher/example/ios/Runner/Base.lproj/Main.storyboard b/packages/url_launcher/url_launcher/example/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from packages/url_launcher/example/ios/Runner/Base.lproj/Main.storyboard rename to packages/url_launcher/url_launcher/example/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/url_launcher/example/ios/Runner/Info.plist b/packages/url_launcher/url_launcher/example/ios/Runner/Info.plist similarity index 100% rename from packages/url_launcher/example/ios/Runner/Info.plist rename to packages/url_launcher/url_launcher/example/ios/Runner/Info.plist diff --git a/packages/url_launcher/example/ios/Runner/main.m b/packages/url_launcher/url_launcher/example/ios/Runner/main.m similarity index 100% rename from packages/url_launcher/example/ios/Runner/main.m rename to packages/url_launcher/url_launcher/example/ios/Runner/main.m diff --git a/packages/url_launcher/example/lib/main.dart b/packages/url_launcher/url_launcher/example/lib/main.dart similarity index 100% rename from packages/url_launcher/example/lib/main.dart rename to packages/url_launcher/url_launcher/example/lib/main.dart diff --git a/packages/url_launcher/example/pubspec.yaml b/packages/url_launcher/url_launcher/example/pubspec.yaml similarity index 100% rename from packages/url_launcher/example/pubspec.yaml rename to packages/url_launcher/url_launcher/example/pubspec.yaml diff --git a/packages/url_launcher/example/url_launcher_example.iml b/packages/url_launcher/url_launcher/example/url_launcher_example.iml similarity index 100% rename from packages/url_launcher/example/url_launcher_example.iml rename to packages/url_launcher/url_launcher/example/url_launcher_example.iml diff --git a/packages/url_launcher/ios/Assets/.gitkeep b/packages/url_launcher/url_launcher/ios/Assets/.gitkeep similarity index 100% rename from packages/url_launcher/ios/Assets/.gitkeep rename to packages/url_launcher/url_launcher/ios/Assets/.gitkeep diff --git a/packages/url_launcher/ios/Classes/UrlLauncherPlugin.h b/packages/url_launcher/url_launcher/ios/Classes/UrlLauncherPlugin.h similarity index 100% rename from packages/url_launcher/ios/Classes/UrlLauncherPlugin.h rename to packages/url_launcher/url_launcher/ios/Classes/UrlLauncherPlugin.h diff --git a/packages/url_launcher/ios/Classes/UrlLauncherPlugin.m b/packages/url_launcher/url_launcher/ios/Classes/UrlLauncherPlugin.m similarity index 100% rename from packages/url_launcher/ios/Classes/UrlLauncherPlugin.m rename to packages/url_launcher/url_launcher/ios/Classes/UrlLauncherPlugin.m diff --git a/packages/url_launcher/ios/url_launcher.podspec b/packages/url_launcher/url_launcher/ios/url_launcher.podspec similarity index 100% rename from packages/url_launcher/ios/url_launcher.podspec rename to packages/url_launcher/url_launcher/ios/url_launcher.podspec diff --git a/packages/url_launcher/lib/url_launcher.dart b/packages/url_launcher/url_launcher/lib/url_launcher.dart similarity index 100% rename from packages/url_launcher/lib/url_launcher.dart rename to packages/url_launcher/url_launcher/lib/url_launcher.dart diff --git a/packages/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml similarity index 92% rename from packages/url_launcher/pubspec.yaml rename to packages/url_launcher/url_launcher/pubspec.yaml index c887649292e9..a48f90b6eacb 100644 --- a/packages/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -2,8 +2,8 @@ name: url_launcher description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher -version: 5.1.4 +homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher +version: 5.1.5 flutter: plugin: diff --git a/packages/url_launcher/test/url_launcher_test.dart b/packages/url_launcher/url_launcher/test/url_launcher_test.dart similarity index 100% rename from packages/url_launcher/test/url_launcher_test.dart rename to packages/url_launcher/url_launcher/test/url_launcher_test.dart diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md new file mode 100644 index 000000000000..a6ea2c9a5d5a --- /dev/null +++ b/packages/url_launcher/url_launcher_web/CHANGELOG.md @@ -0,0 +1,3 @@ +# 0.0.1 + +- Initial open-source release. diff --git a/packages/url_launcher/url_launcher_web/LICENSE b/packages/url_launcher/url_launcher_web/LICENSE new file mode 100644 index 000000000000..0c382ce171cc --- /dev/null +++ b/packages/url_launcher/url_launcher_web/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2019 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. diff --git a/packages/url_launcher/url_launcher_web/README.md b/packages/url_launcher/url_launcher_web/README.md new file mode 100644 index 000000000000..35b3fa7e17d7 --- /dev/null +++ b/packages/url_launcher/url_launcher_web/README.md @@ -0,0 +1,24 @@ +# url_launcher_web + +The web implementation of [`url_launcher`][1]. + +## Usage + +To use this plugin in your Flutter Web app, simply add it as a dependency in +your pubspec using a `git` dependency. This is only temporary: in the future +we hope to make this package an "endorsed" implementation of `url_launcher`, +so that it is automatically included in your Flutter Web app when you depend +on `package:url_launcher`. + +```yaml +dependencies: + url_launcher: ^5.1.4 + url_launcher_web: + git: git@github.com:flutter/plugins.git + path: packages/url_launcher/url_launcher_web +``` + +Once you have the `url_launcher_web` dependency in your pubspec, you should +be able to use `package:url_launcher` as normal. + +[1]: ../url_launcher diff --git a/packages/url_launcher/url_launcher_web/ios/url_launcher_web.podspec b/packages/url_launcher/url_launcher_web/ios/url_launcher_web.podspec new file mode 100644 index 000000000000..161156ef020d --- /dev/null +++ b/packages/url_launcher/url_launcher_web/ios/url_launcher_web.podspec @@ -0,0 +1,20 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'url_launcher_web' + s.version = '0.0.1' + s.summary = 'No-op implementation of url_launcher_web web plugin to avoid build issues on iOS' + s.description = <<-DESC +temp fake url_launcher_web plugin + DESC + s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_web' + s.license = { :file => '../LICENSE' } + s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' +end diff --git a/packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart b/packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart new file mode 100644 index 000000000000..e000c1fc9bea --- /dev/null +++ b/packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart @@ -0,0 +1,49 @@ +import 'dart:async'; +import 'dart:html' as html; + +import 'package:flutter/services.dart'; +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +import 'package:meta/meta.dart'; + +class UrlLauncherPlugin { + static void registerWith(Registrar registrar) { + final MethodChannel channel = MethodChannel( + 'plugins.flutter.io/url_launcher', + const StandardMethodCodec(), + registrar.messenger); + final UrlLauncherPlugin instance = UrlLauncherPlugin(); + channel.setMethodCallHandler(instance.handleMethodCall); + } + + Future handleMethodCall(MethodCall call) async { + switch (call.method) { + case 'canLaunch': + final String url = call.arguments['url']; + return _canLaunch(url); + case 'launch': + final String url = call.arguments['url']; + return _launch(url); + default: + throw PlatformException( + code: 'Unimplemented', + details: "The url_launcher plugin for web doesn't implement " + "the method '${call.method}'"); + } + } + + bool _canLaunch(String url) { + final Uri parsedUrl = Uri.tryParse(url); + if (parsedUrl == null) return false; + + return parsedUrl.isScheme('http') || parsedUrl.isScheme('https'); + } + + bool _launch(String url) { + return openNewWindow(url) != null; + } + + @visibleForTesting + html.WindowBase openNewWindow(String url) { + return html.window.open(url, ''); + } +} diff --git a/packages/url_launcher/url_launcher_web/pubspec.yaml b/packages/url_launcher/url_launcher_web/pubspec.yaml new file mode 100644 index 000000000000..b76aea1da6ab --- /dev/null +++ b/packages/url_launcher/url_launcher_web/pubspec.yaml @@ -0,0 +1,29 @@ +name: url_launcher_web +description: Web platform implementation of url_launcher +author: Flutter Team +homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_web +version: 0.0.1 + +flutter: + plugin: + platforms: + web: + pluginClass: UrlLauncherPlugin + fileName: url_launcher_web.dart + +dependencies: + flutter: + sdk: flutter + flutter_web_plugins: + sdk: flutter + meta: ^1.1.7 + +dev_dependencies: + flutter_test: + sdk: flutter + url_launcher: + path: ../url_launcher + +environment: + sdk: ">=2.0.0-dev.28.0 <3.0.0" + flutter: ">=1.5.0 <2.0.0" diff --git a/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart b/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart new file mode 100644 index 000000000000..0bf9678cfe16 --- /dev/null +++ b/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart @@ -0,0 +1,49 @@ +// 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. + +@TestOn('chrome') // Uses web-only Flutter SDK + +import 'dart:html' as html; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:url_launcher_web/url_launcher_web.dart'; + +void main() { + group('URL Launcher for Web', () { + setUp(() { + TestWidgetsFlutterBinding.ensureInitialized(); + webPluginRegistry.registerMessageHandler(); + final Registrar registrar = + webPluginRegistry.registrarFor(UrlLauncherPlugin); + UrlLauncherPlugin.registerWith(registrar); + }); + + test('can launch "http" URLs', () { + expect(canLaunch('http://google.com'), completion(isTrue)); + }); + + test('can launch "https" URLs', () { + expect(canLaunch('https://google.com'), completion(isTrue)); + }); + + test('cannot launch "tel" URLs', () { + expect(canLaunch('tel:5551234567'), completion(isFalse)); + }); + + test('launching a URL returns true', () { + expect(launch('https://www.google.com'), completion(isTrue)); + }); + + test('the window that is launched is a new window', () { + final UrlLauncherPlugin urlLauncherPlugin = UrlLauncherPlugin(); + final html.WindowBase newWindow = + urlLauncherPlugin.openNewWindow('https://www.google.com'); + expect(newWindow, isNotNull); + expect(newWindow, isNot(equals(html.window))); + expect(newWindow.opener, equals(html.window)); + }); + }); +} diff --git a/script/check_publish.sh b/script/check_publish.sh index 05a237ee97ee..72739410f17c 100755 --- a/script/check_publish.sh +++ b/script/check_publish.sh @@ -12,8 +12,8 @@ source "$SCRIPT_DIR/common.sh" function check_publish() { local failures=() - for package_name in "$@"; do - local dir="$REPO_DIR/packages/$package_name" + for dir in $(pub global run flutter_plugin_tools list --plugins="$1"); do + local package_name=$(basename "$dir") echo "Checking that $package_name can be published." if [[ $(cd "$dir" && cat pubspec.yaml | grep -E "^publish_to: none") ]]; then echo "Package $package_name is marked as unpublishable. Skipping." @@ -33,9 +33,9 @@ function check_publish() { return "${#failures[@]}" } -# Sets CHANGED_PACKAGE_LIST +# Sets CHANGED_PACKAGE_LIST and CHANGED_PACKAGES check_changed_packages if [[ "${#CHANGED_PACKAGE_LIST[@]}" != 0 ]]; then - check_publish "${CHANGED_PACKAGE_LIST[@]}" -fi \ No newline at end of file + check_publish "${CHANGED_PACKAGES}" +fi diff --git a/script/common.sh b/script/common.sh index 749561c94381..7950a3ea71cd 100644 --- a/script/common.sh +++ b/script/common.sh @@ -23,13 +23,12 @@ function check_changed_packages() { return 1 fi - # Filter out any packages that don't have a pubspec.yaml: they have probably - # been deleted in this PR. Also filter out `location_background` since it - # should be removed soon. CHANGED_PACKAGES="" CHANGED_PACKAGE_LIST=() + + # Filter out packages that have been deleted. for package in "${packages[@]}"; do - if [ -f "$REPO_DIR/packages/$package/pubspec.yaml" ] && [ $package != "location_background" ]; then + if [ -d "$REPO_DIR/packages/$package" ]; then CHANGED_PACKAGES="${CHANGED_PACKAGES},$package" CHANGED_PACKAGE_LIST=("${CHANGED_PACKAGE_LIST[@]}" "$package") fi From 816168065f45a4888c59917dd853786611b09674 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 3 Oct 2019 14:40:39 -0700 Subject: [PATCH 095/133] [device_info] Define clang module for iOS (#2138) --- packages/device_info/CHANGELOG.md | 4 ++++ packages/device_info/ios/device_info.podspec | 4 ++-- packages/device_info/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/device_info/CHANGELOG.md b/packages/device_info/CHANGELOG.md index a3e78c5e1d5d..62d4960dc73b 100644 --- a/packages/device_info/CHANGELOG.md +++ b/packages/device_info/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.0+4 + +* Define clang module for iOS. + ## 0.4.0+3 * Update and migrate iOS example project. diff --git a/packages/device_info/ios/device_info.podspec b/packages/device_info/ios/device_info.podspec index 21098c4e548f..47597e0d1870 100644 --- a/packages/device_info/ios/device_info.podspec +++ b/packages/device_info/ios/device_info.podspec @@ -15,7 +15,7 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/device_info/pubspec.yaml b/packages/device_info/pubspec.yaml index 566ca1da4c52..bc192a87c96e 100644 --- a/packages/device_info/pubspec.yaml +++ b/packages/device_info/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/device_info -version: 0.4.0+3 +version: 0.4.0+4 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 30c601191978..c3771bb744ab 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -49,7 +49,6 @@ function lint_packages() { 'android_intent' 'battery' 'connectivity' - 'device_info' 'google_maps_flutter' 'google_sign_in' 'instrumentation_adapter' From 8b093a95804a6154de5b9eb28c2bd5abbbeee86f Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 3 Oct 2019 14:44:14 -0700 Subject: [PATCH 096/133] [sensors] Update and migrate iOS example project (#2101) --- packages/sensors/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 57 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/sensors/pubspec.yaml | 2 +- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/packages/sensors/CHANGELOG.md b/packages/sensors/CHANGELOG.md index 904c425b6b43..89e4f9830527 100644 --- a/packages/sensors/CHANGELOG.md +++ b/packages/sensors/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.0+3 + +* Update and migrate iOS example project. + ## 0.4.0+2 * Suppress deprecation warning for BinaryMessages. See: https://github.com/flutter/flutter/issues/33446 diff --git a/packages/sensors/example/ios/Runner.xcodeproj/project.pbxproj b/packages/sensors/example/ios/Runner.xcodeproj/project.pbxproj index 3d98d090bf15..8bde68c84719 100644 --- a/packages/sensors/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/sensors/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,11 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -42,9 +39,10 @@ /* 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 = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 518BFCF6A33590E963FE1FA9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 65D7779632A59CFED1723B85 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; 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 = ""; }; @@ -77,6 +75,8 @@ 5B101E38E51195F91ACE826E /* Pods */ = { isa = PBXGroup; children = ( + 65D7779632A59CFED1723B85 /* Pods-Runner.debug.xcconfig */, + 518BFCF6A33590E963FE1FA9 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -86,7 +86,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 2EB2E4FB0B576731DB30F0C4 /* [CP] Embed Pods Frameworks */, - 4DB1640737E72FB24502F35F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -228,16 +223,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -254,21 +246,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; - 4DB1640737E72FB24502F35F /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 7B77DB2BA78582CC43C8E79F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -341,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -389,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -430,7 +425,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; @@ -453,7 +447,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; diff --git a/packages/sensors/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/sensors/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/sensors/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/sensors/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/sensors -version: 0.4.0+2 +version: 0.4.0+3 flutter: plugin: From ee3bc9e4122be56d4ec5986230bea36405cdc714 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 3 Oct 2019 14:44:33 -0700 Subject: [PATCH 097/133] [share] Update and migrate iOS example project (#2102) --- packages/share/CHANGELOG.md | 4 ++ .../ios/Runner.xcodeproj/project.pbxproj | 57 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +--- packages/share/pubspec.yaml | 2 +- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index b2567e4e096c..7ac36c080c33 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.2+2 + +* Update and migrate iOS example project. + ## 0.6.2+1 * Specify explicit type for `invokeMethod`. diff --git a/packages/share/example/ios/Runner.xcodeproj/project.pbxproj b/packages/share/example/ios/Runner.xcodeproj/project.pbxproj index 886e59def086..730c0d437d27 100644 --- a/packages/share/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/share/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,15 +8,12 @@ /* Begin PBXBuildFile section */ 28918A213BCB94C5470742D8 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 85392794417D70A970945C83 /* libPods-Runner.a */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 2D9222511EC45DE6007564B0 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D9222501EC45DE6007564B0 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; 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 */; }; @@ -40,7 +37,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; + 002F2AAB9479773692FEF066 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1BCE6CBBA2E91FD0397A29C8 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 2D92224F1EC45DE6007564B0 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 2D9222501EC45DE6007564B0 /* 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 = ""; }; @@ -77,6 +75,8 @@ 16DDF472245BCC3E62219493 /* Pods */ = { isa = PBXGroup; children = ( + 1BCE6CBBA2E91FD0397A29C8 /* Pods-Runner.debug.xcconfig */, + 002F2AAB9479773692FEF066 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -94,7 +94,6 @@ children = ( 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -161,7 +160,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 12A149CFB1B2610A83692801 /* [CP] Embed Pods Frameworks */, - 51BF93FA4709A7E622DF9066 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -178,7 +176,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -188,7 +186,7 @@ }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -210,10 +208,7 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -228,16 +223,13 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -254,21 +246,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; - 51BF93FA4709A7E622DF9066 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 5F8AC0B5B699C537B657C107 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -341,19 +318,28 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -389,19 +375,28 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 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; @@ -430,7 +425,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -452,7 +446,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/packages/share/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/share/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c9580788197..3bb3697ef41c 100644 --- a/packages/share/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/share/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.2+1 +version: 0.6.2+2 flutter: plugin: From dd0d66d788b2d956922145e640c34e73b221dd1f Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 3 Oct 2019 15:35:11 -0700 Subject: [PATCH 098/133] [connectivity] Define clang module for iOS (#2137) --- packages/connectivity/CHANGELOG.md | 1 + packages/connectivity/ios/connectivity.podspec | 4 ++-- script/lint_darwin_plugins.sh | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/connectivity/CHANGELOG.md b/packages/connectivity/CHANGELOG.md index e28fcd744805..b52e629fd516 100644 --- a/packages/connectivity/CHANGELOG.md +++ b/packages/connectivity/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.4.4+1 * Update and migrate iOS example project. +* Define clang module for iOS. ## 0.4.4 diff --git a/packages/connectivity/ios/connectivity.podspec b/packages/connectivity/ios/connectivity.podspec index e973c94f7a1e..b3d299c18de6 100644 --- a/packages/connectivity/ios/connectivity.podspec +++ b/packages/connectivity/ios/connectivity.podspec @@ -16,6 +16,6 @@ A new flutter plugin project. s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' s.dependency 'Reachability' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index c3771bb744ab..619cd15a1f14 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -48,7 +48,6 @@ function lint_packages() { 'android_alarm_manager' 'android_intent' 'battery' - 'connectivity' 'google_maps_flutter' 'google_sign_in' 'instrumentation_adapter' From 813a8b7de14c2d109e6463205bb0134ffd183b39 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 3 Oct 2019 15:39:08 -0700 Subject: [PATCH 099/133] [android_alarm_manager] Define clang module for iOS (#2135) --- packages/android_alarm_manager/CHANGELOG.md | 1 + .../ios/Classes/AndroidAlarmManagerPlugin.m | 2 +- .../android_alarm_manager/ios/android_alarm_manager.podspec | 5 ++--- script/lint_darwin_plugins.sh | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/android_alarm_manager/CHANGELOG.md b/packages/android_alarm_manager/CHANGELOG.md index a58759b2db83..cf70ea752d8c 100644 --- a/packages/android_alarm_manager/CHANGELOG.md +++ b/packages/android_alarm_manager/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.4.4+1 * Update and migrate iOS example project. +* Define clang module for iOS. ## 0.4.4 diff --git a/packages/android_alarm_manager/ios/Classes/AndroidAlarmManagerPlugin.m b/packages/android_alarm_manager/ios/Classes/AndroidAlarmManagerPlugin.m index dcf3f2754232..0aa4f2b2122d 100644 --- a/packages/android_alarm_manager/ios/Classes/AndroidAlarmManagerPlugin.m +++ b/packages/android_alarm_manager/ios/Classes/AndroidAlarmManagerPlugin.m @@ -9,7 +9,7 @@ + (void)registerWithRegistrar:(NSObject*)registrar { FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/android_alarm_manager" binaryMessenger:[registrar messenger] - codec:[FlutterJSONMessageCodec sharedInstance]]; + codec:[FlutterJSONMethodCodec sharedInstance]]; FLTAndroidAlarmManagerPlugin* instance = [[FLTAndroidAlarmManagerPlugin alloc] init]; [registrar addMethodCallDelegate:instance channel:channel]; } diff --git a/packages/android_alarm_manager/ios/android_alarm_manager.podspec b/packages/android_alarm_manager/ios/android_alarm_manager.podspec index 04bafbcc226e..7fcec332a3c8 100644 --- a/packages/android_alarm_manager/ios/android_alarm_manager.podspec +++ b/packages/android_alarm_manager/ios/android_alarm_manager.podspec @@ -15,7 +15,6 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end - diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 619cd15a1f14..236d7b66712f 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -45,7 +45,6 @@ function lint_packages() { # TODO: These packages have linter errors. Remove plugins from this list as linter issues are fixed. local skipped_packages=( - 'android_alarm_manager' 'android_intent' 'battery' 'google_maps_flutter' From 938b8afad3d4ae690fe9597de8e47cf7fa91b0e6 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 3 Oct 2019 16:57:45 -0700 Subject: [PATCH 100/133] [instrumentation_adapter] Define clang module for iOS (#2145) --- packages/instrumentation_adapter/CHANGELOG.md | 1 + .../ios/instrumentation_adapter.podspec | 4 ++-- script/lint_darwin_plugins.sh | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index 9a07ba0c1cbf..8b9b8a725a77 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.1.4 * Migrate example to AndroidX. +* Define clang module for iOS. ## 0.1.3 diff --git a/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec b/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec index c18e58535998..45edadad4cab 100644 --- a/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec +++ b/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec @@ -15,7 +15,7 @@ Runs tests that use the flutter_test API as integration tests. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 236d7b66712f..b71dc92e50d2 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -49,7 +49,6 @@ function lint_packages() { 'battery' 'google_maps_flutter' 'google_sign_in' - 'instrumentation_adapter' 'local_auth' 'package_info' 'path_provider' From 31c44203f1a0cf3664de7151f0d73e8afe93a950 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 3 Oct 2019 17:24:41 -0700 Subject: [PATCH 101/133] [android_intent] Define clang module for iOS (#2144) - Limit the supported podspec platform to iOS so tests don't run (and fail) for macOS. - Define the module by setting `DEFINES_MODULE` in the podspec. See [CocoaPod modular headers docs](http://blog.cocoapods.org/CocoaPods-1.5.0/). - Explicitly set `VALID_ARCHS` to x86_64 for the simulator. See https://github.com/CocoaPods/CocoaPods/issues/9210. --- packages/android_intent/CHANGELOG.md | 4 ++++ packages/android_intent/ios/android_intent.podspec | 4 ++-- packages/android_intent/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/android_intent/CHANGELOG.md b/packages/android_intent/CHANGELOG.md index 5f74d0444a9d..26090115d466 100644 --- a/packages/android_intent/CHANGELOG.md +++ b/packages/android_intent/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.3+3 + +* Define clang module for iOS. + ## 0.3.3+2 * Update and migrate iOS example project. diff --git a/packages/android_intent/ios/android_intent.podspec b/packages/android_intent/ios/android_intent.podspec index c58104806020..336ab31bb228 100644 --- a/packages/android_intent/ios/android_intent.podspec +++ b/packages/android_intent/ios/android_intent.podspec @@ -15,7 +15,7 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/android_intent/pubspec.yaml b/packages/android_intent/pubspec.yaml index b73b1f4a3c70..2bdf002f3ea8 100644 --- a/packages/android_intent/pubspec.yaml +++ b/packages/android_intent/pubspec.yaml @@ -2,7 +2,7 @@ name: android_intent description: Flutter plugin for launching Android Intents. Not supported on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_intent -version: 0.3.3+2 +version: 0.3.3+3 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index b71dc92e50d2..b99bc8ce2751 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -45,7 +45,6 @@ function lint_packages() { # TODO: These packages have linter errors. Remove plugins from this list as linter issues are fixed. local skipped_packages=( - 'android_intent' 'battery' 'google_maps_flutter' 'google_sign_in' From 43620e275fdff9559acc2b23e392236b5091664a Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Sat, 5 Oct 2019 01:03:42 +0800 Subject: [PATCH 102/133] [share]fix iOS crash when setting the subject to null (#2131) When subject is set to null, iOS will set the subject to NSNull which results a crash. This PR defaults NSNull to nil before setting the subject. It also avoid the undocumented KVC implementation in the legacy code and instead, use the UIActivityItemSource. Also fixed a compiler warning with giving originRect an initial value. --- packages/share/CHANGELOG.md | 4 ++ packages/share/ios/Classes/SharePlugin.m | 52 +++++++++++++++++++++--- packages/share/pubspec.yaml | 2 +- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index 7ac36c080c33..f3159bbfbdc1 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.2+3 + +* Fix iOS crash when setting subject to null. + ## 0.6.2+2 * Update and migrate iOS example project. diff --git a/packages/share/ios/Classes/SharePlugin.m b/packages/share/ios/Classes/SharePlugin.m index cfd8eac6876d..79903f8a1e5b 100644 --- a/packages/share/ios/Classes/SharePlugin.m +++ b/packages/share/ios/Classes/SharePlugin.m @@ -6,6 +6,49 @@ static NSString *const PLATFORM_CHANNEL = @"plugins.flutter.io/share"; +@interface ShareData : NSObject + +@property(readonly, nonatomic, copy) NSString *subject; +@property(readonly, nonatomic, copy) NSString *text; + +- (instancetype)initWithSubject:(NSString *)subject text:(NSString *)text NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __attribute__((unavailable("Use initWithSubject:text: instead"))); + +@end + +@implementation ShareData + +- (instancetype)init { + [super doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (instancetype)initWithSubject:(NSString *)subject text:(NSString *)text { + self = [super init]; + if (self) { + _subject = subject; + _text = text; + } + return self; +} + +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { + return @""; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController + itemForActivityType:(UIActivityType)activityType { + return _text; +} + +- (NSString *)activityViewController:(UIActivityViewController *)activityViewController + subjectForActivityType:(UIActivityType)activityType { + return [_subject isKindOfClass:NSNull.class] ? nil : _subject; +} + +@end + @implementation FLTSharePlugin + (void)registerWithRegistrar:(NSObject *)registrar { @@ -31,7 +74,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; - CGRect originRect; + CGRect originRect = CGRectZero; if (originX != nil && originY != nil && originWidth != nil && originHeight != nil) { originRect = CGRectMake([originX doubleValue], [originY doubleValue], [originWidth doubleValue], [originHeight doubleValue]); @@ -48,14 +91,13 @@ + (void)registerWithRegistrar:(NSObject *)registrar { }]; } -+ (void)share:(id)sharedItems ++ (void)share:(NSString *)shareText subject:(NSString *)subject withController:(UIViewController *)controller atSource:(CGRect)origin { + ShareData *data = [[ShareData alloc] initWithSubject:subject text:shareText]; UIActivityViewController *activityViewController = - [[UIActivityViewController alloc] initWithActivityItems:@[ sharedItems ] - applicationActivities:nil]; - [activityViewController setValue:subject forKey:@"subject"]; + [[UIActivityViewController alloc] initWithActivityItems:@[ data ] applicationActivities:nil]; activityViewController.popoverPresentationController.sourceView = controller.view; if (!CGRectIsEmpty(origin)) { activityViewController.popoverPresentationController.sourceRect = origin; diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index d140fab114c5..78d094ee487b 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.2+2 +version: 0.6.2+3 flutter: plugin: From d7c909c2bf2ec57410d2586d3e108cf75241424f Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Fri, 4 Oct 2019 13:55:12 -0700 Subject: [PATCH 103/133] Use stable Flutter image as base (#2154) Plus force rebuilding of the image --- .ci/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 324a2b97615f..a69f9cb67526 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,5 +1,4 @@ - -FROM cirrusci/flutter:latest +FROM cirrusci/flutter:stable RUN yes | sdkmanager \ "platforms;android-27" \ From 62e74ea93fd470d451fba48e9ba65f18fc40f8af Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Mon, 7 Oct 2019 09:14:35 -0700 Subject: [PATCH 104/133] Fix README.md for url_launcher_web (#2136) --- packages/url_launcher/url_launcher_web/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/url_launcher/url_launcher_web/README.md b/packages/url_launcher/url_launcher_web/README.md index 35b3fa7e17d7..66a586c57872 100644 --- a/packages/url_launcher/url_launcher_web/README.md +++ b/packages/url_launcher/url_launcher_web/README.md @@ -14,8 +14,9 @@ on `package:url_launcher`. dependencies: url_launcher: ^5.1.4 url_launcher_web: - git: git@github.com:flutter/plugins.git - path: packages/url_launcher/url_launcher_web + git: + url: git://github.com/flutter/plugins.git + path: packages/url_launcher/url_launcher_web ``` Once you have the `url_launcher_web` dependency in your pubspec, you should From a5a1b365934aead5510eaeb01acaba16b5323b45 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Mon, 7 Oct 2019 10:15:18 -0700 Subject: [PATCH 105/133] [video_player] Basic test for VideoPlayerController initialization (#2158) --- .../video_player/test/video_player_test.dart | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/packages/video_player/test/video_player_test.dart b/packages/video_player/test/video_player_test.dart index f482f0b63cd3..41fb897b9196 100644 --- a/packages/video_player/test/video_player_test.dart +++ b/packages/video_player/test/video_player_test.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:video_player/video_player.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -80,4 +82,139 @@ void main() { ), findsOneWidget); }); + + group('VideoPlayerController', () { + FakeVideoPlayerPlatform fakeVideoPlayerPlatform; + + setUp(() { + fakeVideoPlayerPlatform = FakeVideoPlayerPlatform(); + }); + + test('initialize asset', () async { + final VideoPlayerController controller = VideoPlayerController.asset( + 'a.avi', + ); + await controller.initialize(); + + expect( + fakeVideoPlayerPlatform.dataSourceDescriptions[0], { + 'asset': 'a.avi', + 'package': null, + }); + }); + + test('initialize network', () async { + final VideoPlayerController controller = VideoPlayerController.network( + 'https://127.0.0.1', + ); + await controller.initialize(); + + expect( + fakeVideoPlayerPlatform.dataSourceDescriptions[0], { + 'uri': 'https://127.0.0.1', + }); + }); + + test('initialize file', () async { + final VideoPlayerController controller = + VideoPlayerController.file(File('a.avi')); + await controller.initialize(); + + expect( + fakeVideoPlayerPlatform.dataSourceDescriptions[0], { + 'uri': 'file://a.avi', + 'formatHint': null, + }); + }); + }); +} + +class FakeVideoPlayerPlatform { + FakeVideoPlayerPlatform() { + _channel.setMockMethodCallHandler(onMethodCall); + } + + final MethodChannel _channel = const MethodChannel('flutter.io/videoPlayer'); + + Completer initialized = Completer(); + List> dataSourceDescriptions = >[]; + int nextTextureId = 0; + + Future onMethodCall(MethodCall call) { + switch (call.method) { + case 'init': + initialized.complete(true); + break; + case 'create': + FakeVideoEventStream( + nextTextureId, 100, 100, const Duration(seconds: 1)); + final Map dataSource = call.arguments; + dataSourceDescriptions.add(dataSource.cast()); + return Future>.sync(() { + return { + 'textureId': nextTextureId++, + }; + }); + break; + case 'setLooping': + break; + case 'setVolume': + break; + case 'pause': + break; + default: + throw UnimplementedError( + '${call.method} is not implemented by the FakeVideoPlayerPlatform'); + } + return Future.sync(() {}); + } +} + +class FakeVideoEventStream { + FakeVideoEventStream(this.textureId, this.width, this.height, this.duration) { + eventsChannel = FakeEventsChannel( + 'flutter.io/videoPlayer/videoEvents$textureId', onListen); + } + + int textureId; + int width; + int height; + Duration duration; + FakeEventsChannel eventsChannel; + + void onListen() { + final Map initializedEvent = { + 'event': 'initialized', + 'duration': duration.inMilliseconds, + 'width': width, + 'height': height, + }; + eventsChannel.sendEvent(initializedEvent); + } +} + +class FakeEventsChannel { + FakeEventsChannel(String name, this.onListen) { + eventsMethodChannel = MethodChannel(name); + eventsMethodChannel.setMockMethodCallHandler(onMethodCall); + } + + MethodChannel eventsMethodChannel; + VoidCallback onListen; + + Future onMethodCall(MethodCall call) { + switch (call.method) { + case 'listen': + onListen(); + break; + } + return Future.sync(() {}); + } + + void sendEvent(dynamic event) { + ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage( + eventsMethodChannel.name, + const StandardMethodCodec().encodeSuccessEnvelope(event), + (ByteData data) {}); + } } From a9153ef9dc3c0517e3decab6bf0a5d4858ad6f03 Mon Sep 17 00:00:00 2001 From: John McDole Date: Mon, 7 Oct 2019 13:27:28 -0700 Subject: [PATCH 106/133] BugFix: `formatHint` was meant for network streams. (#2141) This hint is only valid in the network path. --- packages/video_player/CHANGELOG.md | 4 ++++ packages/video_player/lib/video_player.dart | 7 ++++--- packages/video_player/pubspec.yaml | 2 +- packages/video_player/test/video_player_test.dart | 15 ++++++++++++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index ca3a82880b10..a4d1dbeff35d 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.2+3 + +* Fix bug where formatHint was not being pass down to network sources. + ## 0.10.2+2 * Update and migrate iOS example project. diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index 059799b017b3..f1b0e7c9791d 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -207,13 +207,14 @@ class VideoPlayerController extends ValueNotifier { }; break; case DataSourceType.network: - dataSourceDescription = {'uri': dataSource}; - break; - case DataSourceType.file: dataSourceDescription = { 'uri': dataSource, 'formatHint': _videoFormatStringMap[formatHint] }; + break; + case DataSourceType.file: + dataSourceDescription = {'uri': dataSource}; + break; } final Map response = await _channel.invokeMapMethod( diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index ee47cd813add..4c32a11a851a 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.2+2 +version: 0.10.2+3 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: diff --git a/packages/video_player/test/video_player_test.dart b/packages/video_player/test/video_player_test.dart index 41fb897b9196..a0280e2f4df8 100644 --- a/packages/video_player/test/video_player_test.dart +++ b/packages/video_player/test/video_player_test.dart @@ -112,6 +112,20 @@ void main() { expect( fakeVideoPlayerPlatform.dataSourceDescriptions[0], { 'uri': 'https://127.0.0.1', + 'formatHint': null, + }); + }); + + test('initialize network with hint', () async { + final VideoPlayerController controller = VideoPlayerController.network( + 'https://127.0.0.1', + formatHint: VideoFormat.dash); + await controller.initialize(); + + expect( + fakeVideoPlayerPlatform.dataSourceDescriptions[0], { + 'uri': 'https://127.0.0.1', + 'formatHint': 'dash', }); }); @@ -123,7 +137,6 @@ void main() { expect( fakeVideoPlayerPlatform.dataSourceDescriptions[0], { 'uri': 'file://a.avi', - 'formatHint': null, }); }); }); From bf17b0aebb01b1785a8d0b64ff0e4f9b61264752 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 7 Oct 2019 17:07:32 -0700 Subject: [PATCH 107/133] Rename instrumentation_adapter plugin to e2e plugin (#2161) * Rename instrumentation_adapter plugin to e2e plugin * Refactored test, demonstrate reading the exit code * Updated README --- .../.gitignore | 0 .../.metadata | 0 .../CHANGELOG.md | 8 +++ .../{instrumentation_adapter => e2e}/LICENSE | 0 .../README.md | 66 +++++++++++++----- .../android/.gitignore | 0 .../android/build.gradle | 2 +- .../android/gradle.properties | 0 packages/e2e/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 2 +- .../dev/flutter/plugins/e2e/E2EPlugin.java} | 10 +-- .../flutter/plugins/e2e}/FlutterRunner.java | 4 +- .../example/.gitignore | 0 .../example/.metadata | 0 .../example/README.md | 4 +- .../example/android/app/build.gradle | 2 +- .../e2e_example}/MainActivityTest.java | 2 +- .../android/app/src/debug/AndroidManifest.xml | 2 +- .../android/app/src/main/AndroidManifest.xml | 4 +- .../example/e2e_example}/MainActivity.java | 2 +- .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values/styles.xml | 0 .../app/src/profile/AndroidManifest.xml | 2 +- .../example/android/build.gradle | 0 .../example/android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 0 .../example/android/settings.gradle | 0 .../ios/Flutter/AppFrameworkInfo.plist | 0 .../example/ios/Flutter/Debug.xcconfig | 0 .../example/ios/Flutter/Release.xcconfig | 0 .../ios/Runner.xcodeproj/project.pbxproj | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../example/ios/Runner/AppDelegate.h | 0 .../example/ios/Runner/AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../example/ios/Runner/Info.plist | 2 +- .../example/ios/Runner/main.m | 0 .../example/lib/main.dart | 0 .../example/pubspec.yaml | 6 +- .../example/test_driver/example_e2e.dart} | 6 +- .../test_driver/example_e2e_test.dart} | 5 +- .../ios/.gitignore | 0 .../ios/Assets/.gitkeep | 0 packages/e2e/ios/Classes/E2EPlugin.h | 4 ++ .../ios/Classes/E2EPlugin.m} | 12 ++-- .../ios/e2e.podspec} | 6 +- .../lib/e2e.dart} | 11 ++- .../pubspec.yaml | 10 +-- .../android/settings.gradle | 1 - .../instrumentation_adapter/widget_test.dart | 5 -- .../Classes/InstrumentationAdapterPlugin.h | 4 -- 78 files changed, 112 insertions(+), 72 deletions(-) rename packages/{instrumentation_adapter => e2e}/.gitignore (100%) rename packages/{instrumentation_adapter => e2e}/.metadata (100%) rename packages/{instrumentation_adapter => e2e}/CHANGELOG.md (70%) rename packages/{instrumentation_adapter => e2e}/LICENSE (100%) rename packages/{instrumentation_adapter => e2e}/README.md (66%) rename packages/{instrumentation_adapter => e2e}/android/.gitignore (100%) rename packages/{instrumentation_adapter => e2e}/android/build.gradle (94%) rename packages/{instrumentation_adapter => e2e}/android/gradle.properties (100%) create mode 100644 packages/e2e/android/settings.gradle rename packages/{instrumentation_adapter => e2e}/android/src/main/AndroidManifest.xml (62%) rename packages/{instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java => e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java} (77%) rename packages/{instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter => e2e/android/src/main/java/dev/flutter/plugins/e2e}/FlutterRunner.java (95%) rename packages/{instrumentation_adapter => e2e}/example/.gitignore (100%) rename packages/{instrumentation_adapter => e2e}/example/.metadata (100%) rename packages/{instrumentation_adapter => e2e}/example/README.md (84%) rename packages/{instrumentation_adapter => e2e}/example/android/app/build.gradle (96%) rename packages/{instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example => e2e/example/android/app/src/androidTest/java/com/example/e2e_example}/MainActivityTest.java (86%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/debug/AndroidManifest.xml (83%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/AndroidManifest.xml (93%) rename packages/{instrumentation_adapter/example/android/app/src/main/java/com/example/instrumentation_adapter_example => e2e/example/android/app/src/main/java/com/example/e2e_example}/MainActivity.java (86%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/res/drawable/launch_background.xml (100%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/main/res/values/styles.xml (100%) rename packages/{instrumentation_adapter => e2e}/example/android/app/src/profile/AndroidManifest.xml (83%) rename packages/{instrumentation_adapter => e2e}/example/android/build.gradle (100%) rename packages/{instrumentation_adapter => e2e}/example/android/gradle.properties (79%) rename packages/{instrumentation_adapter => e2e}/example/android/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/{instrumentation_adapter => e2e}/example/android/settings.gradle (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Flutter/AppFrameworkInfo.plist (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Flutter/Debug.xcconfig (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Flutter/Release.xcconfig (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner.xcodeproj/project.pbxproj (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/AppDelegate.h (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/AppDelegate.m (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Base.lproj/Main.storyboard (100%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/Info.plist (96%) rename packages/{instrumentation_adapter => e2e}/example/ios/Runner/main.m (100%) rename packages/{instrumentation_adapter => e2e}/example/lib/main.dart (100%) rename packages/{instrumentation_adapter => e2e}/example/pubspec.yaml (73%) rename packages/{instrumentation_adapter/example/test_driver/widget.dart => e2e/example/test_driver/example_e2e.dart} (82%) rename packages/{instrumentation_adapter/example/test_driver/widget_test.dart => e2e/example/test_driver/example_e2e_test.dart} (55%) rename packages/{instrumentation_adapter => e2e}/ios/.gitignore (100%) rename packages/{instrumentation_adapter => e2e}/ios/Assets/.gitkeep (100%) create mode 100644 packages/e2e/ios/Classes/E2EPlugin.h rename packages/{instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m => e2e/ios/Classes/E2EPlugin.m} (50%) rename packages/{instrumentation_adapter/ios/instrumentation_adapter.podspec => e2e/ios/e2e.podspec} (83%) rename packages/{instrumentation_adapter/lib/instrumentation_adapter.dart => e2e/lib/e2e.dart} (89%) rename packages/{instrumentation_adapter => e2e}/pubspec.yaml (64%) delete mode 100644 packages/instrumentation_adapter/android/settings.gradle delete mode 100644 packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart delete mode 100644 packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h diff --git a/packages/instrumentation_adapter/.gitignore b/packages/e2e/.gitignore similarity index 100% rename from packages/instrumentation_adapter/.gitignore rename to packages/e2e/.gitignore diff --git a/packages/instrumentation_adapter/.metadata b/packages/e2e/.metadata similarity index 100% rename from packages/instrumentation_adapter/.metadata rename to packages/e2e/.metadata diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/e2e/CHANGELOG.md similarity index 70% rename from packages/instrumentation_adapter/CHANGELOG.md rename to packages/e2e/CHANGELOG.md index 8b9b8a725a77..44ec042e8066 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.2.0 + +* Renamed package from instrumentation_adapter to e2e. +* Refactored example app test. +* **Breaking change**. Renamed `InstrumentationAdapterFlutterBinding` to + `E2EWidgetsFlutterBinding`. +* Updated README. + ## 0.1.4 * Migrate example to AndroidX. diff --git a/packages/instrumentation_adapter/LICENSE b/packages/e2e/LICENSE similarity index 100% rename from packages/instrumentation_adapter/LICENSE rename to packages/e2e/LICENSE diff --git a/packages/instrumentation_adapter/README.md b/packages/e2e/README.md similarity index 66% rename from packages/instrumentation_adapter/README.md rename to packages/e2e/README.md index 1063589c615b..9b1dab18a2d5 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/e2e/README.md @@ -1,4 +1,4 @@ -# instrumentation_adapter +# e2e Adapts flutter_test results as Android instrumentation tests, making them usable for Firebase Test Lab and other Android CI providers. @@ -7,7 +7,7 @@ iOS support is not available yet, but is planned in the future. ## Usage -Add a dependency on the `instrumentation_adapter` package in the +Add a dependency on the `e2e` package in the `dev_dependencies` section of pubspec.yaml. For plugins, do this in the pubspec.yaml of the example app. @@ -15,16 +15,51 @@ Invoke `InstrumentationAdapterFlutterBinding.ensureInitialized()` at the start of a test file, e.g. ```dart -import 'package:instrumentation_adapter/instrumentation_adapter.dart'; +import 'package:e2e/e2e.dart'; void main() { InstrumentationAdapterFlutterBinding.ensureInitialized(); testWidgets("failing test example", (WidgetTester tester) async { expect(2 + 2, equals(5)); }); + exit(result == 'pass' ? 0 : 1); +} +``` + +## Using Flutter driver to run tests + +`E2EWidgetsTestBinding` supports launching the on-device tests with `flutter drive`. +Note that the tests don't use the `FlutterDriver` API, they use `testWidgets` instead. + +Put the a file named `_test.dart` in the app' `test_driver` directory: + +``` +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); + exit(result == 'pass' ? 0 : 1); } ``` +To run a example app test with Flutter driver: + +``` +cd example +flutter drive test/_e2e.dart +``` + +To test plugin APIs using Flutter driver: + +``` +cd example +flutter drive --driver=test_driver/_test.dart test/_e2e.dart +``` + +## Android device testing + Create an instrumentation test file in your application's **android/app/src/androidTest/java/com/example/myapp/** directory (replacing com, example, and myapp with values from your app's package name). You can name @@ -34,7 +69,7 @@ this test file MainActivityTest.java or another name of your choice. package com.example.myapp; import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.instrumentationadapter.FlutterRunner; +import dev.flutter.plugins.e2e.FlutterRunner; import org.junit.Rule; import org.junit.runner.RunWith; @@ -67,7 +102,16 @@ dependencies { } ``` -Use gradle commands to build an instrumentation test for Android. +To e2e test on a local Android device (emulated or physical): + +``` +./gradlew connectedAndroidTest -Ptarget=`pwd`/../test_driver/_e2e.dart +``` + +## Firebase Test Lab + +To run an e2e test on Android devices using Firebase Test Lab, use gradle commands to build an +instrumentation test for Android. ``` pushd android @@ -90,14 +134,4 @@ gcloud firebase test android run --type instrumentation \ --results-dir= ``` -## Flutter driver support - -`InstrumentationAdapterFlutterBinding` also reports test results to `FlutterDriver` -when run on the command line via `flutter drive`. - -```dart - final FlutterDriver driver = await FlutterDriver.connect(); - final String result = await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); - exit(result == 'pass' ? 0 : 1); -``` +iOS support for Firebase Test Lab is not yet available, but is planned. diff --git a/packages/instrumentation_adapter/android/.gitignore b/packages/e2e/android/.gitignore similarity index 100% rename from packages/instrumentation_adapter/android/.gitignore rename to packages/e2e/android/.gitignore diff --git a/packages/instrumentation_adapter/android/build.gradle b/packages/e2e/android/build.gradle similarity index 94% rename from packages/instrumentation_adapter/android/build.gradle rename to packages/e2e/android/build.gradle index 21c421337428..c91d4721d3ac 100644 --- a/packages/instrumentation_adapter/android/build.gradle +++ b/packages/e2e/android/build.gradle @@ -1,4 +1,4 @@ -group 'com.example.instrumentation_adapter' +group 'com.example.e2e' version '1.0-SNAPSHOT' buildscript { diff --git a/packages/instrumentation_adapter/android/gradle.properties b/packages/e2e/android/gradle.properties similarity index 100% rename from packages/instrumentation_adapter/android/gradle.properties rename to packages/e2e/android/gradle.properties diff --git a/packages/e2e/android/settings.gradle b/packages/e2e/android/settings.gradle new file mode 100644 index 000000000000..e5d17d080b60 --- /dev/null +++ b/packages/e2e/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'e2e' diff --git a/packages/instrumentation_adapter/android/src/main/AndroidManifest.xml b/packages/e2e/android/src/main/AndroidManifest.xml similarity index 62% rename from packages/instrumentation_adapter/android/src/main/AndroidManifest.xml rename to packages/e2e/android/src/main/AndroidManifest.xml index 3b424b6fad67..33fdf86052ab 100644 --- a/packages/instrumentation_adapter/android/src/main/AndroidManifest.xml +++ b/packages/e2e/android/src/main/AndroidManifest.xml @@ -1,3 +1,3 @@ + package="dev.flutter.e2e"> diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java similarity index 77% rename from packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java rename to packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java index c77a94e89f91..bbb8d8bb4479 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java +++ b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package dev.flutter.plugins.instrumentationadapter; +package dev.flutter.plugins.e2e; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; @@ -12,17 +12,17 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; -/** InstrumentationAdapterPlugin */ -public class InstrumentationAdapterPlugin implements MethodCallHandler { +/** E2EPlugin */ +public class E2EPlugin implements MethodCallHandler { public static CompletableFuture> testResults = new CompletableFuture<>(); - private static final String CHANNEL = "dev.flutter/InstrumentationAdapterFlutterBinding"; + private static final String CHANNEL = "plugins.flutter.dev/e2e"; /** Plugin registration. */ public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - channel.setMethodCallHandler(new InstrumentationAdapterPlugin()); + channel.setMethodCallHandler(new E2EPlugin()); } @Override diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java similarity index 95% rename from packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java rename to packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java index c823306e022c..31f3e8431cad 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package dev.flutter.plugins.instrumentationadapter; +package dev.flutter.plugins.e2e; import android.app.Activity; import androidx.test.rule.ActivityTestRule; @@ -49,7 +49,7 @@ public Description getDescription() { public void run(RunNotifier notifier) { Map results = null; try { - results = InstrumentationAdapterPlugin.testResults.get(); + results = E2EPlugin.testResults.get(); } catch (ExecutionException | InterruptedException e) { throw new IllegalThreadStateException("Unable to get test results"); } diff --git a/packages/instrumentation_adapter/example/.gitignore b/packages/e2e/example/.gitignore similarity index 100% rename from packages/instrumentation_adapter/example/.gitignore rename to packages/e2e/example/.gitignore diff --git a/packages/instrumentation_adapter/example/.metadata b/packages/e2e/example/.metadata similarity index 100% rename from packages/instrumentation_adapter/example/.metadata rename to packages/e2e/example/.metadata diff --git a/packages/instrumentation_adapter/example/README.md b/packages/e2e/example/README.md similarity index 84% rename from packages/instrumentation_adapter/example/README.md rename to packages/e2e/example/README.md index f6030a4080b2..64a5e8780bc2 100644 --- a/packages/instrumentation_adapter/example/README.md +++ b/packages/e2e/example/README.md @@ -1,6 +1,6 @@ -# instrumentation_adapter_example +# e2e_example -Demonstrates how to use the instrumentation_adapter plugin. +Demonstrates how to use the e2e plugin. ## Getting Started diff --git a/packages/instrumentation_adapter/example/android/app/build.gradle b/packages/e2e/example/android/app/build.gradle similarity index 96% rename from packages/instrumentation_adapter/example/android/app/build.gradle rename to packages/e2e/example/android/app/build.gradle index 500e9ea951c6..527ed2dd38e0 100644 --- a/packages/instrumentation_adapter/example/android/app/build.gradle +++ b/packages/e2e/example/android/app/build.gradle @@ -33,7 +33,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.instrumentation_adapter_example" + applicationId "com.example.e2e_example" minSdkVersion 16 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() diff --git a/packages/instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example/MainActivityTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java similarity index 86% rename from packages/instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example/MainActivityTest.java rename to packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java index bb489bf57942..11a6c6afb2fa 100644 --- a/packages/instrumentation_adapter/example/android/app/src/androidTest/java/com/example/instrumentation_adapter_example/MainActivityTest.java +++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java @@ -1,4 +1,4 @@ -package com.example.instrumentation_adapter_example; +package com.example.e2e_example; import androidx.test.rule.ActivityTestRule; import dev.flutter.plugins.instrumentationadapter.FlutterRunner; diff --git a/packages/instrumentation_adapter/example/android/app/src/debug/AndroidManifest.xml b/packages/e2e/example/android/app/src/debug/AndroidManifest.xml similarity index 83% rename from packages/instrumentation_adapter/example/android/app/src/debug/AndroidManifest.xml rename to packages/e2e/example/android/app/src/debug/AndroidManifest.xml index 87cc33d27c03..5d4aea26b1dd 100644 --- a/packages/instrumentation_adapter/example/android/app/src/debug/AndroidManifest.xml +++ b/packages/e2e/example/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.example.e2e_example"> diff --git a/packages/instrumentation_adapter/example/android/app/src/main/AndroidManifest.xml b/packages/e2e/example/android/app/src/main/AndroidManifest.xml similarity index 93% rename from packages/instrumentation_adapter/example/android/app/src/main/AndroidManifest.xml rename to packages/e2e/example/android/app/src/main/AndroidManifest.xml index 653fa39a669d..d2477d5977f5 100644 --- a/packages/instrumentation_adapter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/e2e/example/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.example.e2e_example"> + package="com.example.e2e_example"> diff --git a/packages/instrumentation_adapter/example/android/build.gradle b/packages/e2e/example/android/build.gradle similarity index 100% rename from packages/instrumentation_adapter/example/android/build.gradle rename to packages/e2e/example/android/build.gradle diff --git a/packages/instrumentation_adapter/example/android/gradle.properties b/packages/e2e/example/android/gradle.properties similarity index 79% rename from packages/instrumentation_adapter/example/android/gradle.properties rename to packages/e2e/example/android/gradle.properties index 755300e3a0b5..1515360c4bce 100644 --- a/packages/instrumentation_adapter/example/android/gradle.properties +++ b/packages/e2e/example/android/gradle.properties @@ -2,3 +2,4 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true +android.enableR8=true diff --git a/packages/instrumentation_adapter/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/e2e/example/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/instrumentation_adapter/example/android/gradle/wrapper/gradle-wrapper.properties rename to packages/e2e/example/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/instrumentation_adapter/example/android/settings.gradle b/packages/e2e/example/android/settings.gradle similarity index 100% rename from packages/instrumentation_adapter/example/android/settings.gradle rename to packages/e2e/example/android/settings.gradle diff --git a/packages/instrumentation_adapter/example/ios/Flutter/AppFrameworkInfo.plist b/packages/e2e/example/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/instrumentation_adapter/example/ios/Flutter/AppFrameworkInfo.plist rename to packages/e2e/example/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/instrumentation_adapter/example/ios/Flutter/Debug.xcconfig b/packages/e2e/example/ios/Flutter/Debug.xcconfig similarity index 100% rename from packages/instrumentation_adapter/example/ios/Flutter/Debug.xcconfig rename to packages/e2e/example/ios/Flutter/Debug.xcconfig diff --git a/packages/instrumentation_adapter/example/ios/Flutter/Release.xcconfig b/packages/e2e/example/ios/Flutter/Release.xcconfig similarity index 100% rename from packages/instrumentation_adapter/example/ios/Flutter/Release.xcconfig rename to packages/e2e/example/ios/Flutter/Release.xcconfig diff --git a/packages/instrumentation_adapter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/e2e/example/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner.xcodeproj/project.pbxproj rename to packages/e2e/example/ios/Runner.xcodeproj/project.pbxproj diff --git a/packages/instrumentation_adapter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/e2e/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/e2e/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.h b/packages/e2e/example/ios/Runner/AppDelegate.h similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/AppDelegate.h rename to packages/e2e/example/ios/Runner/AppDelegate.h diff --git a/packages/instrumentation_adapter/example/ios/Runner/AppDelegate.m b/packages/e2e/example/ios/Runner/AppDelegate.m similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/AppDelegate.m rename to packages/e2e/example/ios/Runner/AppDelegate.m diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/e2e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/packages/instrumentation_adapter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/e2e/example/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/e2e/example/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/packages/instrumentation_adapter/example/ios/Runner/Base.lproj/Main.storyboard b/packages/e2e/example/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/Base.lproj/Main.storyboard rename to packages/e2e/example/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/instrumentation_adapter/example/ios/Runner/Info.plist b/packages/e2e/example/ios/Runner/Info.plist similarity index 96% rename from packages/instrumentation_adapter/example/ios/Runner/Info.plist rename to packages/e2e/example/ios/Runner/Info.plist index 613203aaeb06..62f6fbb5c02c 100644 --- a/packages/instrumentation_adapter/example/ios/Runner/Info.plist +++ b/packages/e2e/example/ios/Runner/Info.plist @@ -11,7 +11,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - instrumentation_adapter_example + e2e_example CFBundlePackageType APPL CFBundleShortVersionString diff --git a/packages/instrumentation_adapter/example/ios/Runner/main.m b/packages/e2e/example/ios/Runner/main.m similarity index 100% rename from packages/instrumentation_adapter/example/ios/Runner/main.m rename to packages/e2e/example/ios/Runner/main.m diff --git a/packages/instrumentation_adapter/example/lib/main.dart b/packages/e2e/example/lib/main.dart similarity index 100% rename from packages/instrumentation_adapter/example/lib/main.dart rename to packages/e2e/example/lib/main.dart diff --git a/packages/instrumentation_adapter/example/pubspec.yaml b/packages/e2e/example/pubspec.yaml similarity index 73% rename from packages/instrumentation_adapter/example/pubspec.yaml rename to packages/e2e/example/pubspec.yaml index 55d547736b24..3538bb65db0f 100644 --- a/packages/instrumentation_adapter/example/pubspec.yaml +++ b/packages/e2e/example/pubspec.yaml @@ -1,5 +1,5 @@ -name: instrumentation_adapter_example -description: Demonstrates how to use the instrumentation_adapter plugin. +name: e2e_example +description: Demonstrates how to use the e2e plugin. publish_to: 'none' environment: @@ -16,7 +16,7 @@ dev_dependencies: sdk: flutter flutter_driver: sdk: flutter - instrumentation_adapter: + e2e: path: ../ # For information on the generic Dart part of this file, see the diff --git a/packages/instrumentation_adapter/example/test_driver/widget.dart b/packages/e2e/example/test_driver/example_e2e.dart similarity index 82% rename from packages/instrumentation_adapter/example/test_driver/widget.dart rename to packages/e2e/example/test_driver/example_e2e.dart index 109002c86790..e91dd4d0ce9f 100644 --- a/packages/instrumentation_adapter/example/test_driver/widget.dart +++ b/packages/e2e/example/test_driver/example_e2e.dart @@ -8,12 +8,12 @@ import 'dart:io' show Platform; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:instrumentation_adapter/instrumentation_adapter.dart'; +import 'package:e2e/e2e.dart'; -import 'package:instrumentation_adapter_example/main.dart'; +import 'package:e2e_example/main.dart'; void main() { - InstrumentationAdapterFlutterBinding.ensureInitialized(); + E2EWidgetsFlutterBinding.ensureInitialized(); testWidgets('verify text', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(MyApp()); diff --git a/packages/instrumentation_adapter/example/test_driver/widget_test.dart b/packages/e2e/example/test_driver/example_e2e_test.dart similarity index 55% rename from packages/instrumentation_adapter/example/test_driver/widget_test.dart rename to packages/e2e/example/test_driver/example_e2e_test.dart index 88e53d1c1f05..4f38746ce76c 100644 --- a/packages/instrumentation_adapter/example/test_driver/widget_test.dart +++ b/packages/e2e/example/test_driver/example_e2e_test.dart @@ -1,9 +1,12 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter_driver/flutter_driver.dart'; Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); driver.close(); + exit(result == 'pass' ? 0 : 1); } diff --git a/packages/instrumentation_adapter/ios/.gitignore b/packages/e2e/ios/.gitignore similarity index 100% rename from packages/instrumentation_adapter/ios/.gitignore rename to packages/e2e/ios/.gitignore diff --git a/packages/instrumentation_adapter/ios/Assets/.gitkeep b/packages/e2e/ios/Assets/.gitkeep similarity index 100% rename from packages/instrumentation_adapter/ios/Assets/.gitkeep rename to packages/e2e/ios/Assets/.gitkeep diff --git a/packages/e2e/ios/Classes/E2EPlugin.h b/packages/e2e/ios/Classes/E2EPlugin.h new file mode 100644 index 000000000000..1411dce3f1da --- /dev/null +++ b/packages/e2e/ios/Classes/E2EPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface E2EPlugin : NSObject +@end diff --git a/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m b/packages/e2e/ios/Classes/E2EPlugin.m similarity index 50% rename from packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m rename to packages/e2e/ios/Classes/E2EPlugin.m index 704a5b05e031..4f19f3a2f961 100644 --- a/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.m +++ b/packages/e2e/ios/Classes/E2EPlugin.m @@ -1,11 +1,11 @@ -#import "InstrumentationAdapterPlugin.h" +#import "E2EPlugin.h" -@implementation InstrumentationAdapterPlugin +@implementation E2EPlugin + (void)registerWithRegistrar:(NSObject*)registrar { - FlutterMethodChannel* channel = [FlutterMethodChannel - methodChannelWithName:@"dev.flutter/InstrumentationAdapterFlutterBinding" - binaryMessenger:[registrar messenger]]; - InstrumentationAdapterPlugin* instance = [[InstrumentationAdapterPlugin alloc] init]; + FlutterMethodChannel* channel = + [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.dev/e2e" + binaryMessenger:[registrar messenger]]; + E2EPlugin* instance = [[E2EPlugin alloc] init]; [registrar addMethodCallDelegate:instance channel:channel]; } diff --git a/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec b/packages/e2e/ios/e2e.podspec similarity index 83% rename from packages/instrumentation_adapter/ios/instrumentation_adapter.podspec rename to packages/e2e/ios/e2e.podspec index 45edadad4cab..cb0f3bcc4088 100644 --- a/packages/instrumentation_adapter/ios/instrumentation_adapter.podspec +++ b/packages/e2e/ios/e2e.podspec @@ -2,13 +2,13 @@ # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html # Pod::Spec.new do |s| - s.name = 'instrumentation_adapter' + s.name = 'e2e' s.version = '0.0.1' - s.summary = 'Instrumentation adapter.' + s.summary = 'Adapter for e2e tests.' s.description = <<-DESC Runs tests that use the flutter_test API as integration tests. DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter' + s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/e2e' s.license = { :file => '../LICENSE' } s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } s.source = { :path => '.' } diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/e2e/lib/e2e.dart similarity index 89% rename from packages/instrumentation_adapter/lib/instrumentation_adapter.dart rename to packages/e2e/lib/e2e.dart index 9999452234cd..00d29633d045 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/e2e/lib/e2e.dart @@ -10,9 +10,8 @@ import 'package:flutter/widgets.dart'; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. -class InstrumentationAdapterFlutterBinding - extends LiveTestWidgetsFlutterBinding { - InstrumentationAdapterFlutterBinding() { +class E2EWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding { + E2EWidgetsFlutterBinding() { // TODO(jackson): Report test results as they arrive tearDownAll(() async { try { @@ -29,14 +28,14 @@ class InstrumentationAdapterFlutterBinding static WidgetsBinding ensureInitialized() { if (WidgetsBinding.instance == null) { - InstrumentationAdapterFlutterBinding(); + E2EWidgetsFlutterBinding(); } - assert(WidgetsBinding.instance is InstrumentationAdapterFlutterBinding); + assert(WidgetsBinding.instance is E2EWidgetsFlutterBinding); return WidgetsBinding.instance; } static const MethodChannel _channel = - MethodChannel('dev.flutter/InstrumentationAdapterFlutterBinding'); + MethodChannel('plugins.flutter.dev/e2e'); static Map _results = {}; diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/e2e/pubspec.yaml similarity index 64% rename from packages/instrumentation_adapter/pubspec.yaml rename to packages/e2e/pubspec.yaml index 1d8c258d8097..6e8bab883d91 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/e2e/pubspec.yaml @@ -1,8 +1,8 @@ -name: instrumentation_adapter +name: e2e description: Runs tests that use the flutter_test API as integration tests. -version: 0.1.4 +version: 0.2.0 author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter +homepage: https://github.com/flutter/plugins/tree/master/packages/e2e environment: sdk: ">=2.1.0 <3.0.0" @@ -15,5 +15,5 @@ dependencies: flutter: plugin: - androidPackage: dev.flutter.plugins.instrumentationadapter - pluginClass: InstrumentationAdapterPlugin + androidPackage: dev.flutter.plugins.e2e + pluginClass: E2EPlugin diff --git a/packages/instrumentation_adapter/android/settings.gradle b/packages/instrumentation_adapter/android/settings.gradle deleted file mode 100644 index ed03d0eb2a5e..000000000000 --- a/packages/instrumentation_adapter/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'instrumentation_adapter' diff --git a/packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart b/packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart deleted file mode 100644 index 9829553c6522..000000000000 --- a/packages/instrumentation_adapter/example/instrumentation_adapter/widget_test.dart +++ /dev/null @@ -1,5 +0,0 @@ -import '../test_driver/widget.dart' as test; - -void main() { - test.main(); -} diff --git a/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h b/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h deleted file mode 100644 index 3d92ba91bf34..000000000000 --- a/packages/instrumentation_adapter/ios/Classes/InstrumentationAdapterPlugin.h +++ /dev/null @@ -1,4 +0,0 @@ -#import - -@interface InstrumentationAdapterPlugin : NSObject -@end From 9f9e5f726ae91727cd34e6c17283ae84c7d49432 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Tue, 8 Oct 2019 11:08:46 -0700 Subject: [PATCH 108/133] [local_auth] Define clang module for iOS (#2146) --- packages/local_auth/CHANGELOG.md | 1 + packages/local_auth/ios/local_auth.podspec | 4 ++-- script/lint_darwin_plugins.sh | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/local_auth/CHANGELOG.md b/packages/local_auth/CHANGELOG.md index ef4518813ec2..e593c496a2de 100644 --- a/packages/local_auth/CHANGELOG.md +++ b/packages/local_auth/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.6.0+2 * Update and migrate iOS example project. +* Define clang module for iOS. ## 0.6.0+1 diff --git a/packages/local_auth/ios/local_auth.podspec b/packages/local_auth/ios/local_auth.podspec index 727da452f352..b84b7d26c3e0 100644 --- a/packages/local_auth/ios/local_auth.podspec +++ b/packages/local_auth/ios/local_auth.podspec @@ -15,7 +15,7 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index b99bc8ce2751..602eb976dda6 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -48,7 +48,6 @@ function lint_packages() { 'battery' 'google_maps_flutter' 'google_sign_in' - 'local_auth' 'package_info' 'path_provider' 'quick_actions' From 2fcff58eb248cf345305dd87f12632b21a3a860b Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Thu, 10 Oct 2019 15:54:56 -0700 Subject: [PATCH 109/133] [url_launcher] Enable androidx and jetifier in android gradle properties (#2174) --- packages/url_launcher/url_launcher/CHANGELOG.md | 4 ++++ packages/url_launcher/url_launcher/android/gradle.properties | 2 ++ .../url_launcher/example/android/gradle.properties | 1 + packages/url_launcher/url_launcher/pubspec.yaml | 2 +- 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index e660b5c46e3e..aefe0dd8cfaf 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.1.6 + +* Fixes bug where androidx app won't build with this plugin by enabling androidx and jetifier in the android `gradle.properties`. + ## 5.1.5 * Update homepage url after moving to federated directory. diff --git a/packages/url_launcher/url_launcher/android/gradle.properties b/packages/url_launcher/url_launcher/android/gradle.properties index 8bd86f680510..94adc3a3f97a 100644 --- a/packages/url_launcher/url_launcher/android/gradle.properties +++ b/packages/url_launcher/url_launcher/android/gradle.properties @@ -1 +1,3 @@ org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/url_launcher/url_launcher/example/android/gradle.properties b/packages/url_launcher/url_launcher/example/android/gradle.properties index 8bd86f680510..7be3d8b46841 100644 --- a/packages/url_launcher/url_launcher/example/android/gradle.properties +++ b/packages/url_launcher/url_launcher/example/android/gradle.properties @@ -1 +1,2 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index a48f90b6eacb..d3e5830981a2 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher -version: 5.1.5 +version: 5.1.6 flutter: plugin: From 1dae5b7f3f194672470a4808a2095643f55e9099 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 11 Oct 2019 09:52:26 -0700 Subject: [PATCH 110/133] [url_launcher] Define clang module for iOS (#2177) - Limit the supported podspec platform to iOS so tests don't run (and fail) for macOS. - Define the module by setting `DEFINES_MODULE` in the podspec. See [CocoaPod modular headers docs](http://blog.cocoapods.org/CocoaPods-1.5.0/). - Explicitly set `VALID_ARCHS` to x86_64 for the simulator. See https://github.com/CocoaPods/CocoaPods/issues/9210. - Add mechanism to skip dummy multi-platform podspecs so url_launcher_web could be skipped during lint script. --- packages/url_launcher/url_launcher/CHANGELOG.md | 4 ++++ .../url_launcher/ios/url_launcher.podspec | 3 ++- packages/url_launcher/url_launcher/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 13 ++++++++++--- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index aefe0dd8cfaf..fcb79409060d 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.1.7 + +* Define clang module for iOS. + ## 5.1.6 * Fixes bug where androidx app won't build with this plugin by enabling androidx and jetifier in the android `gradle.properties`. diff --git a/packages/url_launcher/url_launcher/ios/url_launcher.podspec b/packages/url_launcher/url_launcher/ios/url_launcher.podspec index d8436c1c1e93..d3be4d12f778 100644 --- a/packages/url_launcher/url_launcher/ios/url_launcher.podspec +++ b/packages/url_launcher/url_launcher/ios/url_launcher.podspec @@ -16,6 +16,7 @@ A Flutter plugin for making the underlying platform (Android or iOS) launch a UR s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index d3e5830981a2..6e6924686bc8 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher -version: 5.1.6 +version: 5.1.7 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 602eb976dda6..58f94fe651a0 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -13,8 +13,16 @@ function lint_package() { local package_dir="${REPO_DIR}/packages/$package_name/" local failure_count=0 - for podspec in "$(find "${package_dir}" -name '*\.podspec')"; do - echo "Linting $package_name.podspec" + local skipped_podspecs=( + 'url_launcher_web.podspec' + ) + find "${package_dir}" -type f -name '*\.podspec' | while read podspec; do + # These podspecs are temporary multi-platform adoption dummy files. + if [[ "${skipped_podspecs[*]}" =~ "$(basename ${podspec})" ]]; then + continue + fi + + echo "Linting $(basename ${podspec})" # Build as frameworks. # This will also run any tests set up as a test_spec. See https://blog.cocoapods.org/CocoaPods-1.3.0. @@ -54,7 +62,6 @@ function lint_packages() { 'sensors' 'share' 'shared_preferences' - 'url_launcher' 'video_player' 'webview_flutter' ) From 39007007a111ab483928057691a8fe6ad53f1c09 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 11 Oct 2019 10:45:16 -0700 Subject: [PATCH 111/133] [shared_preferences] Define clang module for iOS --- packages/shared_preferences/CHANGELOG.md | 4 ++++ packages/shared_preferences/ios/shared_preferences.podspec | 3 ++- packages/shared_preferences/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/shared_preferences/CHANGELOG.md b/packages/shared_preferences/CHANGELOG.md index 00d5adfce0a3..d56eb9b5f185 100644 --- a/packages/shared_preferences/CHANGELOG.md +++ b/packages/shared_preferences/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.3+5 + +* Define clang module for iOS. + ## 0.5.3+4 * Copy `List` instances when reading and writing values to prevent mutations from propagating. diff --git a/packages/shared_preferences/ios/shared_preferences.podspec b/packages/shared_preferences/ios/shared_preferences.podspec index e8c940924140..b057508c0116 100644 --- a/packages/shared_preferences/ios/shared_preferences.podspec +++ b/packages/shared_preferences/ios/shared_preferences.podspec @@ -16,6 +16,7 @@ A Flutter plugin for reading and writing simple key-value pairs. s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/shared_preferences/pubspec.yaml b/packages/shared_preferences/pubspec.yaml index 1b1feb2d73a6..be61e14ea2d9 100644 --- a/packages/shared_preferences/pubspec.yaml +++ b/packages/shared_preferences/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/shared_preferences -version: 0.5.3+4 +version: 0.5.3+5 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 58f94fe651a0..8b2e7fa4e984 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -61,7 +61,6 @@ function lint_packages() { 'quick_actions' 'sensors' 'share' - 'shared_preferences' 'video_player' 'webview_flutter' ) From 369a87988d0895a1c4d82a5405a2c8b8040f96c1 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 11 Oct 2019 10:45:52 -0700 Subject: [PATCH 112/133] [sensors] Define clang module for iOS (#2175) --- packages/sensors/CHANGELOG.md | 1 + packages/sensors/ios/sensors.podspec | 3 ++- script/lint_darwin_plugins.sh | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/sensors/CHANGELOG.md b/packages/sensors/CHANGELOG.md index 89e4f9830527..d90ea5aeb6df 100644 --- a/packages/sensors/CHANGELOG.md +++ b/packages/sensors/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.4.0+3 * Update and migrate iOS example project. +* Define clang module for iOS. ## 0.4.0+2 diff --git a/packages/sensors/ios/sensors.podspec b/packages/sensors/ios/sensors.podspec index 68abfcba1478..bb4ecb0dd064 100644 --- a/packages/sensors/ios/sensors.podspec +++ b/packages/sensors/ios/sensors.podspec @@ -16,6 +16,7 @@ A new flutter plugin project. s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 8b2e7fa4e984..6180cdfe3822 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -59,7 +59,6 @@ function lint_packages() { 'package_info' 'path_provider' 'quick_actions' - 'sensors' 'share' 'video_player' 'webview_flutter' From b182da81687141573d4a8cf55ebb324e7e6cc30d Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 11 Oct 2019 13:24:24 -0700 Subject: [PATCH 113/133] [package_info] Define clang module for iOS (#2148) --- packages/package_info/CHANGELOG.md | 1 + packages/package_info/ios/package_info.podspec | 5 ++--- script/lint_darwin_plugins.sh | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/package_info/CHANGELOG.md b/packages/package_info/CHANGELOG.md index a041f9115004..fbb076fd181f 100644 --- a/packages/package_info/CHANGELOG.md +++ b/packages/package_info/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.4.0+7 * Update and migrate iOS example project. +* Define clang module for iOS. ## 0.4.0+6 diff --git a/packages/package_info/ios/package_info.podspec b/packages/package_info/ios/package_info.podspec index 2e39eba10090..f99ee2d19e16 100644 --- a/packages/package_info/ios/package_info.podspec +++ b/packages/package_info/ios/package_info.podspec @@ -15,7 +15,6 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end - diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 6180cdfe3822..bc352b0500b4 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -56,7 +56,6 @@ function lint_packages() { 'battery' 'google_maps_flutter' 'google_sign_in' - 'package_info' 'path_provider' 'quick_actions' 'share' From 178263d967d3a5d830bcc7dad76810231ada2b4c Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 11 Oct 2019 14:03:14 -0700 Subject: [PATCH 114/133] [quick_actions] Define clang module for iOS (#2149) --- packages/quick_actions/CHANGELOG.md | 4 ++++ packages/quick_actions/ios/quick_actions.podspec | 5 ++--- packages/quick_actions/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/quick_actions/CHANGELOG.md b/packages/quick_actions/CHANGELOG.md index d1e6d8db07f3..3b7937e8aefc 100644 --- a/packages/quick_actions/CHANGELOG.md +++ b/packages/quick_actions/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.2+3 + +* Define clang module for iOS. + ## 0.3.2+2 * Fix bug that would make the shortcut not open on Android. * Report shortcut used on Android. diff --git a/packages/quick_actions/ios/quick_actions.podspec b/packages/quick_actions/ios/quick_actions.podspec index 205570cc7f00..3304d83412ae 100644 --- a/packages/quick_actions/ios/quick_actions.podspec +++ b/packages/quick_actions/ios/quick_actions.podspec @@ -15,7 +15,6 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end - diff --git a/packages/quick_actions/pubspec.yaml b/packages/quick_actions/pubspec.yaml index bc818e7c80ac..41cb1d12b292 100644 --- a/packages/quick_actions/pubspec.yaml +++ b/packages/quick_actions/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for creating shortcuts on home screen, also known as Quick Actions on iOS and App Shortcuts on Android. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/quick_actions -version: 0.3.2+2 +version: 0.3.2+3 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index bc352b0500b4..a4c81bd6354d 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -57,7 +57,6 @@ function lint_packages() { 'google_maps_flutter' 'google_sign_in' 'path_provider' - 'quick_actions' 'share' 'video_player' 'webview_flutter' From ff8a4d7e43912856769d807cfbf048eb4f3856e1 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 11 Oct 2019 14:05:41 -0700 Subject: [PATCH 115/133] [path_provider] Define clang module for iOS (#2147) --- packages/path_provider/CHANGELOG.md | 4 ++++ packages/path_provider/ios/path_provider.podspec | 4 ++-- packages/path_provider/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/path_provider/CHANGELOG.md b/packages/path_provider/CHANGELOG.md index 6ded47745ddc..3bab2b1b53bf 100644 --- a/packages/path_provider/CHANGELOG.md +++ b/packages/path_provider/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.1 + +* Define clang module for iOS. + ## 1.3.0 * Added iOS-only support for `getLibraryDirectory`. diff --git a/packages/path_provider/ios/path_provider.podspec b/packages/path_provider/ios/path_provider.podspec index 7ca6fe3ce218..9b94c100b394 100644 --- a/packages/path_provider/ios/path_provider.podspec +++ b/packages/path_provider/ios/path_provider.podspec @@ -15,7 +15,7 @@ A Flutter plugin for getting commonly used locations on the filesystem. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/path_provider/pubspec.yaml b/packages/path_provider/pubspec.yaml index 80c6bde28379..16245929b85e 100644 --- a/packages/path_provider/pubspec.yaml +++ b/packages/path_provider/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for getting commonly used locations on the Android & iOS file systems, such as the temp and app data directories. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider -version: 1.3.0 +version: 1.3.1 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index a4c81bd6354d..212ed0bddcde 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -56,7 +56,6 @@ function lint_packages() { 'battery' 'google_maps_flutter' 'google_sign_in' - 'path_provider' 'share' 'video_player' 'webview_flutter' From decb6b6f0081f44b25c05630f67a05921435d438 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 11 Oct 2019 15:22:09 -0700 Subject: [PATCH 116/133] [e2e] update README (#2178) --- packages/e2e/CHANGELOG.md | 4 ++++ packages/e2e/README.md | 9 +++++---- packages/e2e/pubspec.yaml | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index 44ec042e8066..ee813dc1c88f 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.0+1 + +* Updated README. + ## 0.2.0 * Renamed package from instrumentation_adapter to e2e. diff --git a/packages/e2e/README.md b/packages/e2e/README.md index 9b1dab18a2d5..04a701ae0784 100644 --- a/packages/e2e/README.md +++ b/packages/e2e/README.md @@ -1,7 +1,8 @@ # e2e -Adapts flutter_test results as Android instrumentation tests, making them usable -for Firebase Test Lab and other Android CI providers. +This package enables self-driving testing of Flutter code on devices and emulators. +It can adapt the test results in a format that is compatible with `flutter drive` +and native Android instrumentation testing. iOS support is not available yet, but is planned in the future. @@ -11,14 +12,14 @@ Add a dependency on the `e2e` package in the `dev_dependencies` section of pubspec.yaml. For plugins, do this in the pubspec.yaml of the example app. -Invoke `InstrumentationAdapterFlutterBinding.ensureInitialized()` at the start +Invoke `E2EWidgetsFlutterBinding.ensureInitialized()` at the start of a test file, e.g. ```dart import 'package:e2e/e2e.dart'; void main() { - InstrumentationAdapterFlutterBinding.ensureInitialized(); + E2EWidgetsFlutterBinding.ensureInitialized(); testWidgets("failing test example", (WidgetTester tester) async { expect(2 + 2, equals(5)); }); diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml index 6e8bab883d91..2515a51f07fd 100644 --- a/packages/e2e/pubspec.yaml +++ b/packages/e2e/pubspec.yaml @@ -1,6 +1,6 @@ name: e2e description: Runs tests that use the flutter_test API as integration tests. -version: 0.2.0 +version: 0.2.0+1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/e2e From 03592956c73f0de601c19f5cc6f813374d348c50 Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Mon, 14 Oct 2019 10:24:20 -0700 Subject: [PATCH 117/133] [android_intent] Migrate to the new embedding (#2143) Migrate android intent to the new embedding. - Refactors the existing plugin logic into two new classes. - Adds an implementation of the plugin for the new embedding. - Adds a unit test. --- packages/android_intent/CHANGELOG.md | 11 +- packages/android_intent/android/build.gradle | 36 ++++ .../androidintent/AndroidIntentPlugin.java | 191 +++++------------ .../plugins/androidintent/IntentSender.java | 110 ++++++++++ .../androidintent/MethodCallHandlerImpl.java | 171 +++++++++++++++ .../MethodCallHandlerImplTest.java | 197 ++++++++++++++++++ .../android/app/src/main/AndroidManifest.xml | 62 +++--- .../EmbeddingV1Activity.java | 17 ++ .../androidintentexample/MainActivity.java | 15 +- .../example/android/gradle.properties | 1 + packages/android_intent/pubspec.yaml | 2 +- 11 files changed, 636 insertions(+), 177 deletions(-) create mode 100644 packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java create mode 100644 packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java create mode 100644 packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java create mode 100644 packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java diff --git a/packages/android_intent/CHANGELOG.md b/packages/android_intent/CHANGELOG.md index 26090115d466..9b614940823b 100644 --- a/packages/android_intent/CHANGELOG.md +++ b/packages/android_intent/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.3.4 + +* Migrate the plugin to use the V2 Android engine embedding. This shouldn't + affect existing functionality. Plugin authors who use the V2 embedding can now + instantiate the plugin and expect that it correctly responds to app lifecycle + changes. + ## 0.3.3+3 * Define clang module for iOS. @@ -8,11 +15,11 @@ ## 0.3.3+1 -* Added "action_application_details_settings" action to open application info settings . +* Added "action_application_details_settings" action to open application info settings . ## 0.3.3 -* Added "flags" option to call intent.addFlags(int) in native. +* Added "flags" option to call intent.addFlags(int) in native. ## 0.3.2 diff --git a/packages/android_intent/android/build.gradle b/packages/android_intent/android/build.gradle index 8b21464f4b19..ceece7ff6a00 100644 --- a/packages/android_intent/android/build.gradle +++ b/packages/android_intent/android/build.gradle @@ -44,4 +44,40 @@ android { lintOptions { disable 'InvalidPackage' } + testOptions { + unitTests.includeAndroidResources = true + } +} + +dependencies { + compileOnly 'androidx.annotation:annotation:1.0.0' + testImplementation 'junit:junit:4.12' + testImplementation 'org.mockito:mockito-core:1.10.19' + testImplementation 'androidx.test:core:1.0.0' + testImplementation 'org.robolectric:robolectric:4.3' +} + +// TODO(mklim): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 +afterEvaluate { + def containsEmbeddingDependencies = false + for (def configuration : configurations.all) { + for (def dependency : configuration.dependencies) { + if (dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + dependency.isTransitive()) + { + containsEmbeddingDependencies = true + break + } + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "2.1.0" + api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + api "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" + } + } + } } diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java index b6d3c81b1a8c..d2b58814dcf7 100644 --- a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/AndroidIntentPlugin.java @@ -1,161 +1,74 @@ -// Copyright 2017 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.androidintent; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.provider.Settings; -import android.util.Log; -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 androidx.annotation.NonNull; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.util.ArrayList; -import java.util.Map; -/** AndroidIntentPlugin */ -@SuppressWarnings("unchecked") -public class AndroidIntentPlugin implements MethodCallHandler { - private static final String TAG = AndroidIntentPlugin.class.getCanonicalName(); - private final Registrar mRegistrar; +/** + * Plugin implementation that uses the new {@code io.flutter.embedding} package. + * + *

Instantiate this in an add to app scenario to gracefully handle activity and context changes. + */ +public final class AndroidIntentPlugin implements FlutterPlugin, ActivityAware { + private final IntentSender sender; + private final MethodCallHandlerImpl impl; - /** Plugin registration. */ - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/android_intent"); - channel.setMethodCallHandler(new AndroidIntentPlugin(registrar)); + /** + * Initialize this within the {@code #configureFlutterEngine} of a Flutter activity or fragment. + * + *

See {@code io.flutter.plugins.androidintentexample.MainActivity} for an example. + */ + public AndroidIntentPlugin() { + sender = new IntentSender(/*activity=*/ null, /*context=*/ null); + impl = new MethodCallHandlerImpl(sender); } - private AndroidIntentPlugin(Registrar registrar) { - this.mRegistrar = registrar; + /** + * Registers a plugin implementation that uses the stable {@code io.flutter.plugin.common} + * package. + * + *

Calling this automatically initializes the plugin. However plugins initialized this way + * won't react to changes in activity or context, unlike {@link AndroidIntentPlugin}. + */ + public static void registerWith(Registrar registrar) { + IntentSender sender = new IntentSender(registrar.activity(), registrar.context()); + MethodCallHandlerImpl impl = new MethodCallHandlerImpl(sender); + impl.startListening(registrar.messenger()); } - private String convertAction(String action) { - switch (action) { - case "action_view": - return Intent.ACTION_VIEW; - case "action_voice": - return Intent.ACTION_VOICE_COMMAND; - case "settings": - return Settings.ACTION_SETTINGS; - case "action_location_source_settings": - return Settings.ACTION_LOCATION_SOURCE_SETTINGS; - case "action_application_details_settings": - return Settings.ACTION_APPLICATION_DETAILS_SETTINGS; - default: - return action; - } + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + sender.setApplicationContext(binding.getApplicationContext()); + sender.setActivity(null); + impl.startListening(binding.getFlutterEngine().getDartExecutor()); } - private Bundle convertArguments(Map arguments) { - Bundle bundle = new Bundle(); - for (String key : arguments.keySet()) { - Object value = arguments.get(key); - if (value instanceof Integer) { - bundle.putInt(key, (Integer) value); - } else if (value instanceof String) { - bundle.putString(key, (String) value); - } else if (value instanceof Boolean) { - bundle.putBoolean(key, (Boolean) value); - } else if (value instanceof Double) { - bundle.putDouble(key, (Double) value); - } else if (value instanceof Long) { - bundle.putLong(key, (Long) value); - } else if (value instanceof byte[]) { - bundle.putByteArray(key, (byte[]) value); - } else if (value instanceof int[]) { - bundle.putIntArray(key, (int[]) value); - } else if (value instanceof long[]) { - bundle.putLongArray(key, (long[]) value); - } else if (value instanceof double[]) { - bundle.putDoubleArray(key, (double[]) value); - } else if (isTypedArrayList(value, Integer.class)) { - bundle.putIntegerArrayList(key, (ArrayList) value); - } else if (isTypedArrayList(value, String.class)) { - bundle.putStringArrayList(key, (ArrayList) value); - } else if (isStringKeyedMap(value)) { - bundle.putBundle(key, convertArguments((Map) value)); - } else { - throw new UnsupportedOperationException("Unsupported type " + value); - } - } - return bundle; + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + sender.setApplicationContext(null); + sender.setActivity(null); + impl.stopListening(); } - private boolean isTypedArrayList(Object value, Class type) { - if (!(value instanceof ArrayList)) { - return false; - } - ArrayList list = (ArrayList) value; - for (Object o : list) { - if (!(o == null || type.isInstance(o))) { - return false; - } - } - return true; + @Override + public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { + sender.setActivity(binding.getActivity()); } - private boolean isStringKeyedMap(Object value) { - if (!(value instanceof Map)) { - return false; - } - Map map = (Map) value; - for (Object key : map.keySet()) { - if (!(key == null || key instanceof String)) { - return false; - } - } - return true; + @Override + public void onDetachedFromActivity() { + sender.setActivity(null); } - private Context getActiveContext() { - return (mRegistrar.activity() != null) ? mRegistrar.activity() : mRegistrar.context(); + @Override + public void onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity(); } @Override - public void onMethodCall(MethodCall call, Result result) { - Context context = getActiveContext(); - String action = convertAction((String) call.argument("action")); - - // Build intent - Intent intent = new Intent(action); - if (mRegistrar.activity() == null) { - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - } - if (call.argument("flag") != null) { - intent.addFlags((Integer) call.argument("flags")); - } - if (call.argument("category") != null) { - intent.addCategory((String) call.argument("category")); - } - if (call.argument("data") != null) { - intent.setData(Uri.parse((String) call.argument("data"))); - } - if (call.argument("arguments") != null) { - intent.putExtras(convertArguments((Map) call.argument("arguments"))); - } - if (call.argument("package") != null) { - String packageName = (String) call.argument("package"); - intent.setPackage(packageName); - if (call.argument("componentName") != null) { - intent.setComponent( - new ComponentName(packageName, (String) call.argument("componentName"))); - } - if (intent.resolveActivity(context.getPackageManager()) == null) { - Log.i(TAG, "Cannot resolve explicit intent - ignoring package"); - intent.setPackage(null); - } - } - - Log.i(TAG, "Sending intent " + intent); - context.startActivity(intent); - - result.success(null); + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + onAttachedToActivity(binding); } } diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java new file mode 100644 index 000000000000..13e56ed487e5 --- /dev/null +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/IntentSender.java @@ -0,0 +1,110 @@ +package io.flutter.plugins.androidintent; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import androidx.annotation.Nullable; + +/** Forms and launches intents. */ +public final class IntentSender { + private static final String TAG = "IntentSender"; + + private @Nullable Activity activity; + private @Nullable Context applicationContext; + + /** + * Caches the given {@code activity} and {@code applicationContext} to use for sending intents + * later. + * + *

Either may be null initially, but at least {@code applicationContext} should be set before + * calling {@link #send}. + * + *

See also {@link #setActivity}, {@link #setApplicationContext}, and {@link #send}. + */ + public IntentSender(@Nullable Activity activity, @Nullable Context applicationContext) { + this.activity = activity; + this.applicationContext = applicationContext; + } + + /** + * Creates and launches an intent with the given params using the cached {@link Activity} and + * {@link Context}. + * + *

This will fail to create and send the intent if {@code applicationContext} hasn't been set + * at the time of calling. + * + *

This uses {@code activity} to start the intent whenever it's not null. Otherwise it falls + * back to {@code applicationContext} and adds {@link Intent#FLAG_ACTIVITY_NEW_TASK} to the intent + * before launching it. + * + * @param action the Intent action, such as {@code ACTION_VIEW}. + * @param flags forwarded to {@link Intent#addFlags(int)} if non-null. + * @param category forwarded to {@link Intent#addCategory(String)} if non-null. + * @param data forwarded to {@link Intent#setData(Uri)} if non-null. + * @param arguments forwarded to {@link Intent#putExtras(Bundle)} if non-null. + * @param packageName forwarded to {@link Intent#setPackage(String)} if non-null. This is forced + * to null if it can't be resolved. + * @param componentName forwarded to {@link Intent#setComponent(ComponentName)} if non-null. + */ + void send( + String action, + @Nullable Integer flags, + @Nullable String category, + @Nullable Uri data, + @Nullable Bundle arguments, + @Nullable String packageName, + @Nullable ComponentName componentName) { + if (applicationContext == null) { + Log.wtf(TAG, "Trying to send an intent before the applicationContext was initialized."); + return; + } + + Intent intent = new Intent(action); + + if (flags != null) { + intent.addFlags(flags); + } + if (!TextUtils.isEmpty(category)) { + intent.addCategory(category); + } + if (data != null) { + intent.setData(data); + } + if (arguments != null) { + intent.putExtras(arguments); + } + if (!TextUtils.isEmpty(packageName)) { + intent.setPackage(packageName); + if (intent.resolveActivity(applicationContext.getPackageManager()) == null) { + Log.i(TAG, "Cannot resolve explicit intent - ignoring package"); + intent.setPackage(null); + } + } + if (componentName != null) { + intent.setComponent(componentName); + } + + Log.v(TAG, "Sending intent " + intent); + if (activity != null) { + activity.startActivity(intent); + } else { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + applicationContext.startActivity(intent); + } + } + + /** Caches the given {@code activity} to use for {@link #send}. */ + void setActivity(@Nullable Activity activity) { + this.activity = activity; + } + + /** Caches the given {@code applicationContext} to use for {@link #send}. */ + void setApplicationContext(@Nullable Context applicationContext) { + this.applicationContext = applicationContext; + } +} diff --git a/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java new file mode 100644 index 000000000000..abbefc89f930 --- /dev/null +++ b/packages/android_intent/android/src/main/java/io/flutter/plugins/androidintent/MethodCallHandlerImpl.java @@ -0,0 +1,171 @@ +package io.flutter.plugins.androidintent; + +import android.content.ComponentName; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.common.BinaryMessenger; +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 java.util.ArrayList; +import java.util.Map; + +/** Forwards incoming {@link MethodCall}s to {@link IntentSender#send}. */ +public final class MethodCallHandlerImpl implements MethodCallHandler { + private static final String TAG = "MethodCallHandlerImpl"; + private final IntentSender sender; + private @Nullable MethodChannel methodChannel; + + /** + * Uses the given {@code sender} for all incoming calls. + * + *

This assumes that the sender's context and activity state are managed elsewhere and + * correctly initialized before being sent here. + */ + MethodCallHandlerImpl(IntentSender sender) { + this.sender = sender; + } + + /** + * Registers this instance as a method call handler on the given {@code messenger}. + * + *

Stops any previously started and unstopped calls. + * + *

This should be cleaned with {@link #stopListening} once the messenger is disposed of. + */ + void startListening(BinaryMessenger messenger) { + if (methodChannel != null) { + Log.wtf(TAG, "Setting a method call handler before the last was disposed."); + stopListening(); + } + + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/android_intent"); + methodChannel.setMethodCallHandler(this); + } + + /** + * Clears this instance from listening to method calls. + * + *

Does nothing is {@link #startListening} hasn't been called, or if we're already stopped. + */ + void stopListening() { + if (methodChannel == null) { + Log.d(TAG, "Tried to stop listening when no methodChannel had been initialized."); + return; + } + + methodChannel.setMethodCallHandler(null); + methodChannel = null; + } + + /** + * Parses the incoming call and forwards it to the cached {@link IntentSender}. + * + *

Always calls {@code result#success}. + */ + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + String action = convertAction((String) call.argument("action")); + Integer flags = call.argument("flags"); + String category = call.argument("category"); + Uri data = call.argument("data") != null ? Uri.parse((String) call.argument("data")) : null; + Bundle arguments = convertArguments((Map) call.argument("arguments")); + String packageName = call.argument("package"); + ComponentName componentName = + (!TextUtils.isEmpty(packageName) && !TextUtils.isEmpty((String) call.argument("component"))) + ? new ComponentName(packageName, (String) call.argument("component")) + : null; + + sender.send(action, flags, category, data, arguments, packageName, componentName); + + result.success(null); + } + + private static String convertAction(String action) { + switch (action) { + case "action_view": + return Intent.ACTION_VIEW; + case "action_voice": + return Intent.ACTION_VOICE_COMMAND; + case "settings": + return Settings.ACTION_SETTINGS; + case "action_location_source_settings": + return Settings.ACTION_LOCATION_SOURCE_SETTINGS; + case "action_application_details_settings": + return Settings.ACTION_APPLICATION_DETAILS_SETTINGS; + default: + return action; + } + } + + private static Bundle convertArguments(Map arguments) { + Bundle bundle = new Bundle(); + if (arguments == null) { + return bundle; + } + for (String key : arguments.keySet()) { + Object value = arguments.get(key); + if (value instanceof Integer) { + bundle.putInt(key, (Integer) value); + } else if (value instanceof String) { + bundle.putString(key, (String) value); + } else if (value instanceof Boolean) { + bundle.putBoolean(key, (Boolean) value); + } else if (value instanceof Double) { + bundle.putDouble(key, (Double) value); + } else if (value instanceof Long) { + bundle.putLong(key, (Long) value); + } else if (value instanceof byte[]) { + bundle.putByteArray(key, (byte[]) value); + } else if (value instanceof int[]) { + bundle.putIntArray(key, (int[]) value); + } else if (value instanceof long[]) { + bundle.putLongArray(key, (long[]) value); + } else if (value instanceof double[]) { + bundle.putDoubleArray(key, (double[]) value); + } else if (isTypedArrayList(value, Integer.class)) { + bundle.putIntegerArrayList(key, (ArrayList) value); + } else if (isTypedArrayList(value, String.class)) { + bundle.putStringArrayList(key, (ArrayList) value); + } else if (isStringKeyedMap(value)) { + bundle.putBundle(key, convertArguments((Map) value)); + } else { + throw new UnsupportedOperationException("Unsupported type " + value); + } + } + return bundle; + } + + private static boolean isTypedArrayList(Object value, Class type) { + if (!(value instanceof ArrayList)) { + return false; + } + ArrayList list = (ArrayList) value; + for (Object o : list) { + if (!(o == null || type.isInstance(o))) { + return false; + } + } + return true; + } + + private static boolean isStringKeyedMap(Object value) { + if (!(value instanceof Map)) { + return false; + } + Map map = (Map) value; + for (Object key : map.keySet()) { + if (!(key == null || key instanceof String)) { + return false; + } + } + return true; + } +} diff --git a/packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java b/packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java new file mode 100644 index 000000000000..19392b04084f --- /dev/null +++ b/packages/android_intent/android/src/test/java/io/flutter/plugins/androidintent/MethodCallHandlerImplTest.java @@ -0,0 +1,197 @@ +package io.flutter.plugins.androidintent; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.robolectric.Shadows.shadowOf; + +import android.app.Application; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import androidx.test.core.app.ApplicationProvider; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.BinaryMessenger.BinaryMessageHandler; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel.Result; +import java.util.HashMap; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class MethodCallHandlerImplTest { + private static final String CHANNEL_NAME = "plugins.flutter.io/android_intent"; + private Context context; + private IntentSender sender; + private MethodCallHandlerImpl methodCallHandler; + + @Before + public void setUp() { + context = ApplicationProvider.getApplicationContext(); + sender = new IntentSender(null, null); + methodCallHandler = new MethodCallHandlerImpl(sender); + } + + @Test + public void startListening_registersChannel() { + BinaryMessenger messenger = mock(BinaryMessenger.class); + + methodCallHandler.startListening(messenger); + + verify(messenger, times(1)) + .setMessageHandler(eq(CHANNEL_NAME), any(BinaryMessageHandler.class)); + } + + @Test + public void startListening_unregistersExistingChannel() { + BinaryMessenger firstMessenger = mock(BinaryMessenger.class); + BinaryMessenger secondMessenger = mock(BinaryMessenger.class); + methodCallHandler.startListening(firstMessenger); + + methodCallHandler.startListening(secondMessenger); + + // Unregisters the first and then registers the second. + verify(firstMessenger, times(1)).setMessageHandler(CHANNEL_NAME, null); + verify(secondMessenger, times(1)) + .setMessageHandler(eq(CHANNEL_NAME), any(BinaryMessageHandler.class)); + } + + @Test + public void stopListening_unregistersExistingChannel() { + BinaryMessenger messenger = mock(BinaryMessenger.class); + methodCallHandler.startListening(messenger); + + methodCallHandler.stopListening(); + + verify(messenger, times(1)).setMessageHandler(CHANNEL_NAME, null); + } + + @Test + public void stopListening_doesNothingWhenUnset() { + BinaryMessenger messenger = mock(BinaryMessenger.class); + + methodCallHandler.stopListening(); + + verify(messenger, never()).setMessageHandler(CHANNEL_NAME, null); + } + + @Test + public void onMethodCall_doesNothingWhenContextIsNull() { + Result result = mock(Result.class); + Map args = new HashMap<>(); + args.put("action", "foo"); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + // No matter what, should always succeed. + verify(result, times(1)).success(null); + assertNull(shadowOf((Application) context).getNextStartedActivity()); + } + + @Test + public void onMethodCall_setsAction() { + sender.setApplicationContext(context); + Map args = new HashMap<>(); + args.put("action", "foo"); + Result result = mock(Result.class); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + verify(result, times(1)).success(null); + Intent intent = shadowOf((Application) context).getNextStartedActivity(); + assertNotNull(intent); + assertEquals("foo", intent.getAction()); + } + + @Test + public void onMethodCall_setsNewTaskFlagWithApplicationContext() { + sender.setApplicationContext(context); + Map args = new HashMap<>(); + args.put("action", "foo"); + Result result = mock(Result.class); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + verify(result, times(1)).success(null); + Intent intent = shadowOf((Application) context).getNextStartedActivity(); + assertNotNull(intent); + assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, intent.getFlags()); + } + + @Test + public void onMethodCall_addsFlags() { + sender.setApplicationContext(context); + Map args = new HashMap<>(); + args.put("action", "foo"); + Integer requestFlags = Intent.FLAG_FROM_BACKGROUND; + args.put("flags", requestFlags); + Result result = mock(Result.class); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + verify(result, times(1)).success(null); + Intent intent = shadowOf((Application) context).getNextStartedActivity(); + assertNotNull(intent); + assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK | requestFlags, intent.getFlags()); + } + + @Test + public void onMethodCall_addsCategory() { + sender.setApplicationContext(context); + Map args = new HashMap<>(); + args.put("action", "foo"); + String category = "bar"; + args.put("category", category); + Result result = mock(Result.class); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + verify(result, times(1)).success(null); + Intent intent = shadowOf((Application) context).getNextStartedActivity(); + assertNotNull(intent); + assertTrue(intent.getCategories().contains(category)); + } + + @Test + public void onMethodCall_setsData() { + sender.setApplicationContext(context); + Map args = new HashMap<>(); + args.put("action", "foo"); + Uri data = Uri.parse("http://flutter.dev"); + args.put("data", data.toString()); + Result result = mock(Result.class); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + verify(result, times(1)).success(null); + Intent intent = shadowOf((Application) context).getNextStartedActivity(); + assertNotNull(intent); + assertEquals(data, intent.getData()); + } + + @Test + public void onMethodCall_clearsInvalidPackageNames() { + sender.setApplicationContext(context); + Map args = new HashMap<>(); + args.put("action", "foo"); + args.put("packageName", "invalid"); + Result result = mock(Result.class); + + methodCallHandler.onMethodCall(new MethodCall("launch", args), result); + + verify(result, times(1)).success(null); + Intent intent = shadowOf((Application) context).getNextStartedActivity(); + assertNotNull(intent); + assertNull(intent.getPackage()); + } +} diff --git a/packages/android_intent/example/android/app/src/main/AndroidManifest.xml b/packages/android_intent/example/android/app/src/main/AndroidManifest.xml index ce2fbe4a64a8..7d6fcd44834f 100644 --- a/packages/android_intent/example/android/app/src/main/AndroidManifest.xml +++ b/packages/android_intent/example/android/app/src/main/AndroidManifest.xml @@ -1,29 +1,41 @@ + package="io.flutter.plugins.androidintentexample"> - - - + + + + + + + + + + + - - - - - - - - - + + diff --git a/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java b/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java new file mode 100644 index 000000000000..95dc41a02ef7 --- /dev/null +++ b/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/EmbeddingV1Activity.java @@ -0,0 +1,17 @@ +// Copyright 2017 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.androidintentexample; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class EmbeddingV1Activity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/MainActivity.java b/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/MainActivity.java index 4af83acdf1cb..56e0bab207d4 100644 --- a/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/MainActivity.java +++ b/packages/android_intent/example/android/app/src/main/java/io/flutter/plugins/androidintentexample/MainActivity.java @@ -1,17 +1,12 @@ -// Copyright 2017 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.androidintentexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.androidintent.AndroidIntentPlugin; public class MainActivity extends FlutterActivity { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + public void configureFlutterEngine(FlutterEngine flutterEngine) { + flutterEngine.getPlugins().add(new AndroidIntentPlugin()); } } diff --git a/packages/android_intent/example/android/gradle.properties b/packages/android_intent/example/android/gradle.properties index 8bd86f680510..7be3d8b46841 100644 --- a/packages/android_intent/example/android/gradle.properties +++ b/packages/android_intent/example/android/gradle.properties @@ -1 +1,2 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true diff --git a/packages/android_intent/pubspec.yaml b/packages/android_intent/pubspec.yaml index 2bdf002f3ea8..bcb73cf76636 100644 --- a/packages/android_intent/pubspec.yaml +++ b/packages/android_intent/pubspec.yaml @@ -2,7 +2,7 @@ name: android_intent description: Flutter plugin for launching Android Intents. Not supported on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/android_intent -version: 0.3.3+3 +version: 0.3.4 flutter: plugin: From 026043ee3a4aa8d1227ec2d11cfd72121db4502d Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 14 Oct 2019 10:41:19 -0700 Subject: [PATCH 118/133] [video_player] Define clang module for iOS (#2183) --- packages/video_player/CHANGELOG.md | 4 ++++ packages/video_player/ios/video_player.podspec | 3 ++- packages/video_player/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index a4d1dbeff35d..9a12d5279e19 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.2+4 + +* Define clang module for iOS. + ## 0.10.2+3 * Fix bug where formatHint was not being pass down to network sources. diff --git a/packages/video_player/ios/video_player.podspec b/packages/video_player/ios/video_player.podspec index 0c817478f39f..c3268377f1d4 100644 --- a/packages/video_player/ios/video_player.podspec +++ b/packages/video_player/ios/video_player.podspec @@ -16,6 +16,7 @@ A new flutter plugin project. s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 4c32a11a851a..9388e7443c46 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.2+3 +version: 0.10.2+4 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 212ed0bddcde..8167ecdca2ea 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -57,7 +57,6 @@ function lint_packages() { 'google_maps_flutter' 'google_sign_in' 'share' - 'video_player' 'webview_flutter' ) From 878daa920ab9d2a4fd917d1db97a23c55db487a9 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 14 Oct 2019 10:41:48 -0700 Subject: [PATCH 119/133] [google_sign_in] Define clang module for iOS (#2184) --- packages/google_sign_in/CHANGELOG.md | 1 + packages/google_sign_in/ios/google_sign_in.podspec | 3 +++ script/lint_darwin_plugins.sh | 1 - 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/google_sign_in/CHANGELOG.md b/packages/google_sign_in/CHANGELOG.md index b46be247f317..fde4f781d649 100644 --- a/packages/google_sign_in/CHANGELOG.md +++ b/packages/google_sign_in/CHANGELOG.md @@ -1,6 +1,7 @@ ## 4.0.9 * Update and migrate iOS example project. +* Define clang module for iOS. ## 4.0.8 diff --git a/packages/google_sign_in/ios/google_sign_in.podspec b/packages/google_sign_in/ios/google_sign_in.podspec index 673341edfcf9..fb51173b9276 100755 --- a/packages/google_sign_in/ios/google_sign_in.podspec +++ b/packages/google_sign_in/ios/google_sign_in.podspec @@ -17,4 +17,7 @@ Enables Google Sign-In in Flutter apps. s.dependency 'Flutter' s.dependency 'GoogleSignIn', '~> 4.0' s.static_framework = true + + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 8167ecdca2ea..0ba7f65bd257 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -55,7 +55,6 @@ function lint_packages() { local skipped_packages=( 'battery' 'google_maps_flutter' - 'google_sign_in' 'share' 'webview_flutter' ) From 3f8502ed7790657b1dbfa29712156b5eff7eec2b Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 14 Oct 2019 10:47:07 -0700 Subject: [PATCH 120/133] [webview_flutter] Define clang module for iOS (#2185) --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/ios/Classes/FlutterWebView.m | 2 +- packages/webview_flutter/ios/webview_flutter.podspec | 6 +++--- packages/webview_flutter/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 98e312afd3a3..9822ad511f0e 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.14+2 + +* Define clang module for iOS. + ## 0.3.14+1 * Allow underscores anywhere for Javascript Channel name. diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index 36f4e8cb5cfe..60fa24052038 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -48,7 +48,7 @@ - (instancetype)initWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args binaryMessenger:(NSObject*)messenger { - if ([super init]) { + if (self = [super init]) { _viewId = viewId; NSString* channelName = [NSString stringWithFormat:@"plugins.flutter.io/webview_%lld", viewId]; diff --git a/packages/webview_flutter/ios/webview_flutter.podspec b/packages/webview_flutter/ios/webview_flutter.podspec index 1436eb1569d8..b10d7414b20a 100644 --- a/packages/webview_flutter/ios/webview_flutter.podspec +++ b/packages/webview_flutter/ios/webview_flutter.podspec @@ -15,7 +15,7 @@ A WebView Plugin for Flutter. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' -end + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } +end diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index e5f39f14da87..13ccef744009 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.14+1 +version: 0.3.14+2 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 0ba7f65bd257..33e8607aa8e1 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -56,7 +56,6 @@ function lint_packages() { 'battery' 'google_maps_flutter' 'share' - 'webview_flutter' ) local failure_count=0 From 37cb4139e56bc0e7aa05c88d2beafbe46433083a Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 14 Oct 2019 10:47:50 -0700 Subject: [PATCH 121/133] [battery] Define clang module for iOS (#2179) --- packages/battery/CHANGELOG.md | 4 ++++ packages/battery/ios/battery.podspec | 5 +++-- packages/battery/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/battery/CHANGELOG.md b/packages/battery/CHANGELOG.md index 6777b98c4ab5..5c9073652913 100644 --- a/packages/battery/CHANGELOG.md +++ b/packages/battery/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.0+6 + +* Define clang module for iOS. + ## 0.3.0+5 * Fix Gradle version. diff --git a/packages/battery/ios/battery.podspec b/packages/battery/ios/battery.podspec index fc58888b7bf8..86db7c2b9dec 100644 --- a/packages/battery/ios/battery.podspec +++ b/packages/battery/ios/battery.podspec @@ -15,6 +15,7 @@ Flutter plugin for accessing information about the battery. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - - s.ios.deployment_target = '8.0' + + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/battery/pubspec.yaml b/packages/battery/pubspec.yaml index 56a70b18f552..c6a3f8837a41 100644 --- a/packages/battery/pubspec.yaml +++ b/packages/battery/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for accessing information about the battery state (full, charging, discharging) on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/battery -version: 0.3.0+5 +version: 0.3.0+6 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 33e8607aa8e1..d10dbab79501 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -53,7 +53,6 @@ function lint_packages() { # TODO: These packages have linter errors. Remove plugins from this list as linter issues are fixed. local skipped_packages=( - 'battery' 'google_maps_flutter' 'share' ) From f54320b2e664575d266e4a63223a7814504b0e8b Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 14 Oct 2019 10:52:33 -0700 Subject: [PATCH 122/133] [share] Define clang module for iOS (#2180) --- packages/share/CHANGELOG.md | 4 ++++ packages/share/ios/Classes/SharePlugin.m | 2 +- packages/share/ios/share.podspec | 3 ++- packages/share/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index f3159bbfbdc1..087c66b7008d 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.2+4 + +* Define clang module for iOS. + ## 0.6.2+3 * Fix iOS crash when setting subject to null. diff --git a/packages/share/ios/Classes/SharePlugin.m b/packages/share/ios/Classes/SharePlugin.m index 79903f8a1e5b..b501b36623e3 100644 --- a/packages/share/ios/Classes/SharePlugin.m +++ b/packages/share/ios/Classes/SharePlugin.m @@ -44,7 +44,7 @@ - (id)activityViewController:(UIActivityViewController *)activityViewController - (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType { - return [_subject isKindOfClass:NSNull.class] ? nil : _subject; + return [_subject isKindOfClass:NSNull.class] ? @"" : _subject; } @end diff --git a/packages/share/ios/share.podspec b/packages/share/ios/share.podspec index 02affe2b1ca7..9c3684c58607 100644 --- a/packages/share/ios/share.podspec +++ b/packages/share/ios/share.podspec @@ -16,6 +16,7 @@ A Flutter plugin for sharing content from the Flutter app via the platform share s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.ios.deployment_target = '8.0' + s.platform = :ios, '8.0' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index 78d094ee487b..800f1b482eed 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.2+3 +version: 0.6.2+4 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index d10dbab79501..6bcf93f336a9 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -54,7 +54,6 @@ function lint_packages() { # TODO: These packages have linter errors. Remove plugins from this list as linter issues are fixed. local skipped_packages=( 'google_maps_flutter' - 'share' ) local failure_count=0 From 63d0571fc3a85d027c1df4c01f97017814ddfc16 Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Mon, 14 Oct 2019 13:58:24 -0700 Subject: [PATCH 123/133] [android_intent] Bump the Flutter SDK min version (#2188) The previous minimum was too low to support the V2 embedding at compile time. The latest stable appears to be the oldest version that works with the plugin. --- packages/android_intent/example/pubspec.yaml | 3 +++ packages/android_intent/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/android_intent/example/pubspec.yaml b/packages/android_intent/example/pubspec.yaml index 79c1cea0a8cd..179eb7d4d157 100644 --- a/packages/android_intent/example/pubspec.yaml +++ b/packages/android_intent/example/pubspec.yaml @@ -10,3 +10,6 @@ dependencies: # The following section is specific to Flutter. flutter: uses-material-design: true + +environment: + flutter: ">=1.9.1+hotfix.2 <2.0.0" \ No newline at end of file diff --git a/packages/android_intent/pubspec.yaml b/packages/android_intent/pubspec.yaml index bcb73cf76636..7be5ec023f7c 100644 --- a/packages/android_intent/pubspec.yaml +++ b/packages/android_intent/pubspec.yaml @@ -22,4 +22,4 @@ dev_dependencies: sdk: flutter environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.2.0 <2.0.0" + flutter: ">=1.6.7 <2.0.0" From 8697a039d3cc8942f6ba340f05d4da3d728bb696 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 14 Oct 2019 14:38:10 -0700 Subject: [PATCH 124/133] Run clang analyzer on iOS and macOS code in CI test when packages change (#2186) --- script/lint_darwin_plugins.sh | 43 ++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 6bcf93f336a9..0ae55c957f69 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -13,31 +13,52 @@ function lint_package() { local package_dir="${REPO_DIR}/packages/$package_name/" local failure_count=0 + # These podspecs are temporary multi-platform adoption dummy files. local skipped_podspecs=( - 'url_launcher_web.podspec' + "url_launcher_web.podspec" ) - find "${package_dir}" -type f -name '*\.podspec' | while read podspec; do - # These podspecs are temporary multi-platform adoption dummy files. - if [[ "${skipped_podspecs[*]}" =~ "$(basename ${podspec})" ]]; then + + # TODO: These packages have analyzer warnings. Remove plugins from this list as issues are fixed. + local skip_analysis_packages=( + "camera.podspec" # https://github.com/flutter/flutter/issues/42673 + "image_picker.podspec" # https://github.com/flutter/flutter/issues/42678 + "in_app_purchase.podspec" # https://github.com/flutter/flutter/issues/42679 + ) + find "${package_dir}" -type f -name "*\.podspec" | while read podspec; do + local podspecBasename=$(basename "${podspec}") + if [[ "${skipped_podspecs[*]}" =~ "${podspecBasename}" ]]; then continue fi - echo "Linting $(basename ${podspec})" + # TODO: Remove --allow-warnings flag https://github.com/flutter/flutter/issues/41444 + local lint_args=( + lib + lint + "${podspec}" + --allow-warnings + --fail-fast + --silent + ) + if [[ ! "${skip_analysis_packages[*]}" =~ "${podspecBasename}" ]]; then + lint_args+=(--analyze) + echo "Linting and analyzing ${podspecBasename}" + else + echo "Linting ${podspecBasename}" + fi # Build as frameworks. # This will also run any tests set up as a test_spec. See https://blog.cocoapods.org/CocoaPods-1.3.0. - # TODO: Add --analyze flag https://github.com/flutter/flutter/issues/41443 - # TODO: Remove --allow-warnings flag https://github.com/flutter/flutter/issues/41444 - pod lib lint "${podspec}" --allow-warnings --fail-fast --silent + pod "${lint_args[@]}" if [[ "$?" -ne 0 ]]; then - error "Package ${package_name} has framework issues. Run \"pod lib lint $podspec\" to inspect." + error "Package ${package_name} has framework issues. Run \"pod lib lint ${podspec} --analyze\" to inspect." failure_count+=1 fi # Build as libraries. - pod lib lint "${podspec}" --allow-warnings --use-libraries --fail-fast --silent + lint_args+=(--use-libraries) + pod "${lint_args[@]}" if [[ "$?" -ne 0 ]]; then - error "Package ${package_name} has library issues. Run \"pod lib lint $podspec --use-libraries\" to inspect." + error "Package ${package_name} has library issues. Run \"pod lib lint ${podspec} --use-libraries --analyze\" to inspect." failure_count+=1 fi done From 326b21b6ab5f5e6bf9c19046e01f3e32380c26a2 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Mon, 14 Oct 2019 15:01:30 -0700 Subject: [PATCH 125/133] [battery] Support the v2 Android embedder (#2152) --- packages/battery/CHANGELOG.md | 4 ++ packages/battery/android/build.gradle | 25 +++++++++ .../plugins/battery/BatteryPlugin.java | 55 ++++++++++++------- .../battery/EmbedderV1ActivityTest.java | 17 ++++++ .../plugins/battery/MainActivityTest.java | 15 +++++ .../android/app/src/main/AndroidManifest.xml | 7 +++ .../batteryexample/EmbedderV1Activity.java | 17 ++++++ .../plugins/batteryexample/MainActivity.java | 13 ++--- .../battery/example/android/gradle.properties | 3 + packages/battery/example/pubspec.yaml | 7 +++ packages/battery/pubspec.yaml | 5 +- packages/battery/test/battery_e2e.dart | 17 ++++++ 12 files changed, 156 insertions(+), 29 deletions(-) create mode 100644 packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/EmbedderV1ActivityTest.java create mode 100644 packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/MainActivityTest.java create mode 100644 packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/EmbedderV1Activity.java create mode 100644 packages/battery/test/battery_e2e.dart diff --git a/packages/battery/CHANGELOG.md b/packages/battery/CHANGELOG.md index 5c9073652913..172550e01c4c 100644 --- a/packages/battery/CHANGELOG.md +++ b/packages/battery/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.1 + +* Support the v2 Android embedder. + ## 0.3.0+6 * Define clang module for iOS. diff --git a/packages/battery/android/build.gradle b/packages/battery/android/build.gradle index ed302d2969e2..e4c24492bb4a 100644 --- a/packages/battery/android/build.gradle +++ b/packages/battery/android/build.gradle @@ -45,3 +45,28 @@ android { disable 'InvalidPackage' } } + +// TODO(amirh): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 +afterEvaluate { + def containsEmbeddingDependencies = false + for (def configuration : configurations.all) { + for (def dependency : configuration.dependencies) { + if (dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + dependency.isTransitive()) + { + containsEmbeddingDependencies = true + break + } + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "2.1.0" + api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + api "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" + } + } + } +} diff --git a/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java b/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java index b6d3e799e5c7..1bf3c249552d 100644 --- a/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java +++ b/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java @@ -12,6 +12,8 @@ import android.os.BatteryManager; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.EventChannel.EventSink; import io.flutter.plugin.common.EventChannel.StreamHandler; @@ -22,25 +24,41 @@ import io.flutter.plugin.common.PluginRegistry; /** BatteryPlugin */ -public class BatteryPlugin implements MethodCallHandler, StreamHandler { +public class BatteryPlugin implements MethodCallHandler, StreamHandler, FlutterPlugin { + + private Context applicationContext; + private BroadcastReceiver chargingStateChangeReceiver; + private MethodChannel methodChannel; + private EventChannel eventChannel; /** Plugin registration. */ public static void registerWith(PluginRegistry.Registrar registrar) { - final MethodChannel methodChannel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/battery"); - final EventChannel eventChannel = - new EventChannel(registrar.messenger(), "plugins.flutter.io/charging"); - final BatteryPlugin instance = new BatteryPlugin(registrar); - eventChannel.setStreamHandler(instance); - methodChannel.setMethodCallHandler(instance); + final BatteryPlugin instance = new BatteryPlugin(); + instance.onAttachedToEngine(registrar.context(), registrar.messenger()); } - BatteryPlugin(PluginRegistry.Registrar registrar) { - this.registrar = registrar; + @Override + public void onAttachedToEngine(FlutterPluginBinding binding) { + onAttachedToEngine( + binding.getApplicationContext(), binding.getFlutterEngine().getDartExecutor()); } - private final PluginRegistry.Registrar registrar; - private BroadcastReceiver chargingStateChangeReceiver; + private void onAttachedToEngine(Context applicationContext, BinaryMessenger messenger) { + this.applicationContext = applicationContext; + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/battery"); + eventChannel = new EventChannel(messenger, "plugins.flutter.io/charging"); + eventChannel.setStreamHandler(this); + methodChannel.setMethodCallHandler(this); + } + + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) { + applicationContext = null; + methodChannel.setMethodCallHandler(null); + methodChannel = null; + eventChannel.setStreamHandler(null); + eventChannel = null; + } @Override public void onMethodCall(MethodCall call, Result result) { @@ -60,28 +78,25 @@ public void onMethodCall(MethodCall call, Result result) { @Override public void onListen(Object arguments, EventSink events) { chargingStateChangeReceiver = createChargingStateChangeReceiver(events); - registrar - .context() - .registerReceiver( - chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + applicationContext.registerReceiver( + chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); } @Override public void onCancel(Object arguments) { - registrar.context().unregisterReceiver(chargingStateChangeReceiver); + applicationContext.unregisterReceiver(chargingStateChangeReceiver); chargingStateChangeReceiver = null; } private int getBatteryLevel() { int batteryLevel = -1; - Context context = registrar.context(); if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) { BatteryManager batteryManager = - (BatteryManager) context.getSystemService(context.BATTERY_SERVICE); + (BatteryManager) applicationContext.getSystemService(applicationContext.BATTERY_SERVICE); batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); } else { Intent intent = - new ContextWrapper(context) + new ContextWrapper(applicationContext) .registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); batteryLevel = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) diff --git a/packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/EmbedderV1ActivityTest.java b/packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/EmbedderV1ActivityTest.java new file mode 100644 index 000000000000..ef6e5d9fe246 --- /dev/null +++ b/packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/EmbedderV1ActivityTest.java @@ -0,0 +1,17 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.batteryexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class EmbedderV1ActivityTest { + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbedderV1Activity.class); +} diff --git a/packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/MainActivityTest.java b/packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/MainActivityTest.java new file mode 100644 index 000000000000..16165ad2e66f --- /dev/null +++ b/packages/battery/example/android/app/src/androidTest/java/io/flutter/plugins/battery/MainActivityTest.java @@ -0,0 +1,15 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.batteryexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class MainActivityTest { + @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} diff --git a/packages/battery/example/android/app/src/main/AndroidManifest.xml b/packages/battery/example/android/app/src/main/AndroidManifest.xml index 6b07de4e5d3d..e76af9c8dbfe 100644 --- a/packages/battery/example/android/app/src/main/AndroidManifest.xml +++ b/packages/battery/example/android/app/src/main/AndroidManifest.xml @@ -15,5 +15,12 @@ + + diff --git a/packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/EmbedderV1Activity.java b/packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/EmbedderV1Activity.java new file mode 100644 index 000000000000..f04a2e2ca2f9 --- /dev/null +++ b/packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/EmbedderV1Activity.java @@ -0,0 +1,17 @@ +// Copyright 2017 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.batteryexample; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class EmbedderV1Activity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/MainActivity.java b/packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/MainActivity.java index 320226f9b6d8..26ae8ecc2091 100644 --- a/packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/MainActivity.java +++ b/packages/battery/example/android/app/src/main/java/io/flutter/plugins/batteryexample/MainActivity.java @@ -1,17 +1,16 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package io.flutter.plugins.batteryexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.battery.BatteryPlugin; public class MainActivity extends FlutterActivity { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + public void configureFlutterEngine(FlutterEngine flutterEngine) { + flutterEngine.getPlugins().add(new BatteryPlugin()); } } diff --git a/packages/battery/example/android/gradle.properties b/packages/battery/example/android/gradle.properties index 8bd86f680510..38c8d4544ff1 100644 --- a/packages/battery/example/android/gradle.properties +++ b/packages/battery/example/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/battery/example/pubspec.yaml b/packages/battery/example/pubspec.yaml index 1fde3d25dd2d..0c57142ca3d5 100644 --- a/packages/battery/example/pubspec.yaml +++ b/packages/battery/example/pubspec.yaml @@ -7,5 +7,12 @@ dependencies: battery: path: ../ +dev_dependencies: + flutter_driver: + sdk: flutter + flutter: uses-material-design: true + +environment: + flutter: ">=1.9.1+hotfix.4 <2.0.0" diff --git a/packages/battery/pubspec.yaml b/packages/battery/pubspec.yaml index c6a3f8837a41..7314d2725328 100644 --- a/packages/battery/pubspec.yaml +++ b/packages/battery/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for accessing information about the battery state (full, charging, discharging) on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/battery -version: 0.3.0+6 +version: 0.3.1 flutter: plugin: @@ -22,7 +22,8 @@ dev_dependencies: mockito: 3.0.0 flutter_test: sdk: flutter + e2e: ^0.2.0 environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.2.0 <2.0.0" + flutter: ">=1.6.7 <2.0.0" diff --git a/packages/battery/test/battery_e2e.dart b/packages/battery/test/battery_e2e.dart new file mode 100644 index 000000000000..6ffc7e6541fb --- /dev/null +++ b/packages/battery/test/battery_e2e.dart @@ -0,0 +1,17 @@ +// Copyright 2019, 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:flutter_test/flutter_test.dart'; +import 'package:battery/battery.dart'; +import 'package:e2e/e2e.dart'; + +void main() { + E2EWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('Can get battery level', (WidgetTester tester) async { + final Battery battery = Battery(); + final int batteryLevel = await battery.batteryLevel; + expect(batteryLevel, isNotNull); + }); +} From 3a77d3804ddd4e03e7c460a8d482c23af0aba54b Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Mon, 14 Oct 2019 16:23:45 -0700 Subject: [PATCH 126/133] [battery] relax the example app minimal required Flutter version (#2189) --- packages/battery/example/pubspec.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/battery/example/pubspec.yaml b/packages/battery/example/pubspec.yaml index 0c57142ca3d5..88f600be23d2 100644 --- a/packages/battery/example/pubspec.yaml +++ b/packages/battery/example/pubspec.yaml @@ -13,6 +13,3 @@ dev_dependencies: flutter: uses-material-design: true - -environment: - flutter: ">=1.9.1+hotfix.4 <2.0.0" From 09920776718884ab38ad72be0634643e2cf5ecf7 Mon Sep 17 00:00:00 2001 From: liujing Date: Tue, 15 Oct 2019 07:29:51 +0800 Subject: [PATCH 127/133] [image_picker] fix crash when aar from 'flutter build aar' (#2120) --- packages/image_picker/CHANGELOG.md | 4 ++++ .../plugins/imagepicker/ImagePickerPlugin.java | 17 ++++++++++++----- .../imagepicker/ImagePickerPluginTest.java | 8 ++++++++ packages/image_picker/pubspec.yaml | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index 6a8a75a4b65f..bfc368b308af 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1+7 + +* Android: Fix ImagePickerPlugin#onCreate casting context which causes exception. + ## 0.6.1+6 * Define clang module for iOS diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java index 05e3d883e5e2..b495a8e1a33f 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java @@ -81,8 +81,11 @@ public void onActivitySaveInstanceState(Activity activity, Bundle outState) { @Override public void onActivityDestroyed(Activity activity) { - if (activity == registrar.activity()) { - ((Application) registrar.context()).unregisterActivityLifecycleCallbacks(this); + if (activity == registrar.activity() + && registrar.activity().getApplicationContext() != null) { + ((Application) registrar.activity().getApplicationContext()) + .unregisterActivityLifecycleCallbacks( + this); // Use getApplicationContext() to avoid casting failures } } @@ -90,9 +93,13 @@ public void onActivityDestroyed(Activity activity) { public void onActivityStopped(Activity activity) {} }; - if (this.registrar != null) { - ((Application) this.registrar.context()) - .registerActivityLifecycleCallbacks(this.activityLifecycleCallbacks); + if (this.registrar != null + && this.registrar.context() != null + && this.registrar.context().getApplicationContext() != null) { + ((Application) this.registrar.context().getApplicationContext()) + .registerActivityLifecycleCallbacks( + this + .activityLifecycleCallbacks); // Use getApplicationContext() to avoid casting failures. } } diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java index e37fceb7fdea..94a81d3d3eac 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerPluginTest.java @@ -109,6 +109,14 @@ public void onResiter_WhenAcitivityIsNull_ShouldNotCrash() { "No exception thrown when ImagePickerPlugin.registerWith ran with activity = null", true); } + @Test + public void onConstructor_WhenContextTypeIsActivity_ShouldNotCrash() { + when(mockRegistrar.context()).thenReturn(mockActivity); + new ImagePickerPlugin(mockRegistrar, mockImagePickerDelegate); + assertTrue( + "No exception thrown when ImagePickerPlugin() ran with context instanceof Activity", true); + } + private MethodCall buildMethodCall(final int source) { final Map arguments = new HashMap<>(); arguments.put("source", source); diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index 1779edcad0fc..ce1b46c63366 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -5,7 +5,7 @@ authors: - Flutter Team - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.1+6 +version: 0.6.1+7 flutter: plugin: From 573c9ffea288f9129062e55c3bcf5834b218348d Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Mon, 14 Oct 2019 17:13:32 -0700 Subject: [PATCH 128/133] [flutter_webview] Migrate to the new embedding (#2169) This depends on a new bugfix on the engine for text input to work with the new embedding (flutter/engine#13015). --- packages/webview_flutter/CHANGELOG.md | 8 +- packages/webview_flutter/android/build.gradle | 25 ++++++ .../webview_flutter/android/gradle.properties | 2 + .../webviewflutter/FlutterCookieManager.java | 18 ++--- .../webviewflutter/FlutterWebView.java | 14 +++- .../webviewflutter/InputAwareWebView.java | 38 ++++++++- .../webviewflutter/WebViewFactory.java | 5 +- .../webviewflutter/WebViewFlutterPlugin.java | 59 +++++++++++++- .../example/android/app/build.gradle | 5 +- .../EmbeddingV1ActivityTest.java | 13 +++ .../MainActivityTest.java | 11 +++ .../android/app/src/main/AndroidManifest.xml | 79 +++++++++++-------- .../EmbeddingV1Activity.java | 17 ++++ .../webviewflutterexample/MainActivity.java | 12 +-- .../example/android/gradle.properties | 4 +- packages/webview_flutter/example/pubspec.yaml | 4 +- ...{webview.dart => webview_flutter_e2e.dart} | 65 +++++++-------- ...est.dart => webview_flutter_e2e_test.dart} | 5 +- packages/webview_flutter/pubspec.yaml | 4 +- 19 files changed, 284 insertions(+), 104 deletions(-) create mode 100644 packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1ActivityTest.java create mode 100644 packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/MainActivityTest.java create mode 100644 packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1Activity.java rename packages/webview_flutter/example/test_driver/{webview.dart => webview_flutter_e2e.dart} (92%) rename packages/webview_flutter/example/test_driver/{webview_test.dart => webview_flutter_e2e_test.dart} (72%) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 9822ad511f0e..7710f748fca5 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.3.15 + +* Add support for the v2 Android embedding. This shouldn't affect existing + functionality. Plugin authors who use the V2 embedding can now register the + plugin and expect that it correctly responds to app lifecycle changes. + ## 0.3.14+2 * Define clang module for iOS. @@ -13,7 +19,7 @@ ## 0.3.13 * Add an optional `userAgent` property to set a custom User Agent. - + ## 0.3.12+1 * Temporarily revert getTitle (doing this as a patch bump shortly after publishing). diff --git a/packages/webview_flutter/android/build.gradle b/packages/webview_flutter/android/build.gradle index 4fe7629b5f76..0104ede0a418 100644 --- a/packages/webview_flutter/android/build.gradle +++ b/packages/webview_flutter/android/build.gradle @@ -50,3 +50,28 @@ android { implementation 'androidx.webkit:webkit:1.0.0' } } + +// TODO(mklim): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 +afterEvaluate { + def containsEmbeddingDependencies = false + for (def configuration : configurations.all) { + for (def dependency : configuration.dependencies) { + if (dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + dependency.isTransitive()) + { + containsEmbeddingDependencies = true + break + } + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "2.1.0" + api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + api "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" + } + } + } +} \ No newline at end of file diff --git a/packages/webview_flutter/android/gradle.properties b/packages/webview_flutter/android/gradle.properties index 8bd86f680510..08f2b5f91bff 100644 --- a/packages/webview_flutter/android/gradle.properties +++ b/packages/webview_flutter/android/gradle.properties @@ -1 +1,3 @@ org.gradle.jvmargs=-Xmx1536M +android.enableJetifier=true +android.useAndroidX=true diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterCookieManager.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterCookieManager.java index 908f877fb922..86b4fd412a29 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterCookieManager.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterCookieManager.java @@ -15,17 +15,11 @@ import io.flutter.plugin.common.MethodChannel.Result; class FlutterCookieManager implements MethodCallHandler { + private final MethodChannel methodChannel; - private FlutterCookieManager() { - // Do not instantiate. - // This class should only be used in context of a BinaryMessenger. - // Use FlutterCookieManager#registerWith instead. - } - - static void registerWith(BinaryMessenger messenger) { - MethodChannel methodChannel = new MethodChannel(messenger, "plugins.flutter.io/cookie_manager"); - FlutterCookieManager cookieManager = new FlutterCookieManager(); - methodChannel.setMethodCallHandler(cookieManager); + FlutterCookieManager(BinaryMessenger messenger) { + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/cookie_manager"); + methodChannel.setMethodCallHandler(this); } @Override @@ -39,6 +33,10 @@ public void onMethodCall(MethodCall methodCall, Result result) { } } + void dispose() { + methodChannel.setMethodCallHandler(null); + } + private static void clearCookies(final Result result) { CookieManager cookieManager = CookieManager.getInstance(); final boolean hasCookies = cookieManager.hasCookies(); diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index a7f2db308e15..ac326ed7f27b 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -12,6 +12,8 @@ import android.view.View; import android.webkit.WebStorage; import android.webkit.WebViewClient; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; @@ -36,7 +38,7 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { BinaryMessenger messenger, int id, Map params, - final View containerView) { + @Nullable View containerView) { DisplayListenerProxy displayListenerProxy = new DisplayListenerProxy(); DisplayManager displayManager = @@ -95,6 +97,16 @@ public void onInputConnectionLocked() { webView.lockInputConnection(); } + @Override + public void onFlutterViewAttached(@NonNull View flutterView) { + webView.setContainerView(flutterView); + } + + @Override + public void onFlutterViewDetached() { + webView.setContainerView(null); + } + @Override public void onMethodCall(MethodCall methodCall, Result result) { switch (methodCall.method) { diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java index 9275c380fb56..e04d566bdc92 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/InputAwareWebView.java @@ -7,9 +7,11 @@ import static android.content.Context.INPUT_METHOD_SERVICE; import android.content.Context; +import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.webkit.WebView; +import androidx.annotation.Nullable; /** * A WebView subclass that mirrors the same implementation hacks that the system WebView does in @@ -22,16 +24,29 @@ *

See also {@link ThreadedInputConnectionProxyAdapterView}. */ final class InputAwareWebView extends WebView { - private final View containerView; - + private static final String TAG = "InputAwareWebView"; private View threadedInputConnectionProxyView; private ThreadedInputConnectionProxyAdapterView proxyAdapterView; + private @Nullable View containerView; - InputAwareWebView(Context context, View containerView) { + InputAwareWebView(Context context, @Nullable View containerView) { super(context); this.containerView = containerView; } + void setContainerView(@Nullable View containerView) { + this.containerView = containerView; + + if (proxyAdapterView == null) { + return; + } + + Log.w(TAG, "The containerView has changed while the proxyAdapterView exists."); + if (containerView != null) { + setInputConnectionTarget(proxyAdapterView); + } + } + /** * Set our proxy adapter view to use its cached input connection instead of creating new ones. * @@ -81,6 +96,12 @@ public boolean checkInputConnectionProxy(final View view) { // This isn't a new ThreadedInputConnectionProxyView. Ignore it. return super.checkInputConnectionProxy(view); } + if (containerView == null) { + Log.e( + TAG, + "Can't create a proxy view because there's no container view. Text input may not work."); + return super.checkInputConnectionProxy(view); + } // We've never seen this before, so we make the assumption that this is WebView's // ThreadedInputConnectionProxyView. We are making the assumption that the only view that could @@ -120,6 +141,10 @@ private void resetInputConnection() { // No need to reset the InputConnection to the default thread if we've never changed it. return; } + if (containerView == null) { + Log.e(TAG, "Can't reset the input connection to the container view because there is none."); + return; + } setInputConnectionTarget(/*targetView=*/ containerView); } @@ -132,6 +157,13 @@ private void resetInputConnection() { * InputConnections should be created on. */ private void setInputConnectionTarget(final View targetView) { + if (containerView == null) { + Log.e( + TAG, + "Can't set the input connection target because there is no containerView to use as a handler."); + return; + } + targetView.requestFocus(); containerView.post( new Runnable() { diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFactory.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFactory.java index 6fdc36fbe545..fe62e3a35540 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFactory.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFactory.java @@ -6,6 +6,7 @@ import android.content.Context; import android.view.View; +import androidx.annotation.Nullable; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.StandardMessageCodec; import io.flutter.plugin.platform.PlatformView; @@ -14,9 +15,9 @@ public final class WebViewFactory extends PlatformViewFactory { private final BinaryMessenger messenger; - private final View containerView; + private @Nullable final View containerView; - WebViewFactory(BinaryMessenger messenger, View containerView) { + WebViewFactory(BinaryMessenger messenger, @Nullable View containerView) { super(StandardMessageCodec.INSTANCE); this.messenger = messenger; this.containerView = containerView; diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java index 17177541222c..dcce7962aed5 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java @@ -4,17 +4,68 @@ package io.flutter.plugins.webviewflutter; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.PluginRegistry.Registrar; -/** WebViewFlutterPlugin */ -public class WebViewFlutterPlugin { - /** Plugin registration. */ +/** + * Java platform implementation of the webview_flutter plugin. + * + *

Register this in an add to app scenario to gracefully handle activity and context changes. + * + *

Call {@link #registerWith(Registrar)} to use the stable {@code io.flutter.plugin.common} + * package instead. + */ +public class WebViewFlutterPlugin implements FlutterPlugin { + + private @Nullable FlutterCookieManager flutterCookieManager; + + /** + * Add an instance of this to {@link io.flutter.embedding.engine.plugins.PluginRegistry} to + * register it. + * + *

Registration should eventually be handled automatically by v2 of the + * GeneratedPluginRegistrant. https://github.com/flutter/flutter/issues/42694 + */ + public WebViewFlutterPlugin() {} + + /** + * Registers a plugin implementation that uses the stable {@code io.flutter.plugin.common} + * package. + * + *

Calling this automatically initializes the plugin. However plugins initialized this way + * won't react to changes in activity or context, unlike {@link CameraPlugin}. + */ public static void registerWith(Registrar registrar) { registrar .platformViewRegistry() .registerViewFactory( "plugins.flutter.io/webview", new WebViewFactory(registrar.messenger(), registrar.view())); - FlutterCookieManager.registerWith(registrar.messenger()); + new FlutterCookieManager(registrar.messenger()); + } + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + BinaryMessenger messenger = binding.getFlutterEngine().getDartExecutor(); + binding + .getFlutterEngine() + .getPlatformViewsController() + .getRegistry() + .registerViewFactory( + "plugins.flutter.io/webview", new WebViewFactory(messenger, /*containerView=*/ null)); + flutterCookieManager = new FlutterCookieManager(messenger); + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + if (flutterCookieManager == null) { + return; + } + + flutterCookieManager.dispose(); + flutterCookieManager = null; } } diff --git a/packages/webview_flutter/example/android/app/build.gradle b/packages/webview_flutter/example/android/app/build.gradle index 79a69ac3e4d7..706d501c4060 100644 --- a/packages/webview_flutter/example/android/app/build.gradle +++ b/packages/webview_flutter/example/android/app/build.gradle @@ -56,6 +56,7 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } diff --git a/packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1ActivityTest.java b/packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1ActivityTest.java new file mode 100644 index 000000000000..fe10c6155e5a --- /dev/null +++ b/packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1ActivityTest.java @@ -0,0 +1,13 @@ +package io.flutter.plugins.webviewflutterexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class EmbeddingV1ActivityTest { + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbeddingV1Activity.class); +} diff --git a/packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/MainActivityTest.java b/packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/MainActivityTest.java new file mode 100644 index 000000000000..a0bd4fe1a7f5 --- /dev/null +++ b/packages/webview_flutter/example/android/app/src/androidTestDebug/java/io/flutter/plugins/webviewflutterexample/MainActivityTest.java @@ -0,0 +1,11 @@ +package io.flutter.plugins.webviewflutterexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class MainActivityTest { + @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} diff --git a/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml index 8fcbcd3908ba..fd570acc8959 100644 --- a/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/webview_flutter/example/android/app/src/main/AndroidManifest.xml @@ -1,39 +1,48 @@ + package="io.flutter.plugins.webviewflutterexample"> - - + + + + + + + + + + + + + - - - - - - - - - - - + + diff --git a/packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1Activity.java b/packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1Activity.java new file mode 100644 index 000000000000..9b868934cc10 --- /dev/null +++ b/packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/EmbeddingV1Activity.java @@ -0,0 +1,17 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.webviewflutterexample; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class EmbeddingV1Activity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/MainActivity.java b/packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/MainActivity.java index f935d0030483..1596844948e7 100644 --- a/packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/MainActivity.java +++ b/packages/webview_flutter/example/android/app/src/main/java/io/flutter/plugins/webviewflutterexample/MainActivity.java @@ -4,14 +4,14 @@ package io.flutter.plugins.webviewflutterexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.webviewflutter.WebViewFlutterPlugin; public class MainActivity extends FlutterActivity { + // TODO(mklim): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. https://github.com/flutter/flutter/issues/42694 @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + public void configureFlutterEngine(FlutterEngine flutterEngine) { + flutterEngine.getPlugins().add(new WebViewFlutterPlugin()); } } diff --git a/packages/webview_flutter/example/android/gradle.properties b/packages/webview_flutter/example/android/gradle.properties index ad8917e962e5..a6738207fd15 100644 --- a/packages/webview_flutter/example/android/gradle.properties +++ b/packages/webview_flutter/example/android/gradle.properties @@ -1,2 +1,4 @@ org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true \ No newline at end of file +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true diff --git a/packages/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/example/pubspec.yaml index 8657cfde0f8b..0e24333cfc0b 100644 --- a/packages/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/example/pubspec.yaml @@ -1,10 +1,11 @@ name: webview_flutter_example description: Demonstrates how to use the webview_flutter plugin. -version: 1.0.1 +version: 1.0.2 environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" + flutter: ">=1.9.1+hotfix.4 <2.0.0" dependencies: flutter: @@ -17,6 +18,7 @@ dev_dependencies: sdk: flutter flutter_driver: sdk: flutter + e2e: "^0.2.0" flutter: uses-material-design: true diff --git a/packages/webview_flutter/example/test_driver/webview.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart similarity index 92% rename from packages/webview_flutter/example/test_driver/webview.dart rename to packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart index e24afd73f557..a5d4d7de66fe 100644 --- a/packages/webview_flutter/example/test_driver/webview.dart +++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart @@ -9,19 +9,17 @@ import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:webview_flutter/webview_flutter.dart'; +import 'package:e2e/e2e.dart'; void main() { - final Completer allTestsCompleter = Completer(); - enableFlutterDriverExtension(handler: (_) => allTestsCompleter.future); - tearDownAll(() => allTestsCompleter.complete(null)); + E2EWidgetsFlutterBinding.ensureInitialized(); - test('initalUrl', () async { + testWidgets('initalUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -38,10 +36,10 @@ void main() { expect(currentUrl, 'https://flutter.dev/'); }); - test('loadUrl', () async { + testWidgets('loadUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -61,11 +59,11 @@ void main() { // enable this once https://github.com/flutter/flutter/issues/31510 // is resolved. - test('loadUrl with headers', () async { + testWidgets('loadUrl with headers', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); final StreamController pageLoads = StreamController(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -96,12 +94,12 @@ void main() { expect(content.contains('flutter_test_header'), isTrue); }); - test('JavaScriptChannel', () async { + testWidgets('JavaScriptChannel', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); final Completer pageLoaded = Completer(); final List messagesReceived = []; - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -137,7 +135,7 @@ void main() { expect(messagesReceived, equals(['hello'])); }); - test('resize webview', () async { + testWidgets('resize webview', (WidgetTester tester) async { final String resizeTest = ''' Resize test @@ -184,7 +182,7 @@ void main() { javascriptMode: JavascriptMode.unrestricted, ); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Column( @@ -204,7 +202,7 @@ void main() { expect(resizeCompleter.isCompleted, false); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Column( @@ -222,11 +220,11 @@ void main() { await resizeCompleter.future; }); - test('set custom userAgent', () async { + testWidgets('set custom userAgent', (WidgetTester tester) async { final Completer controllerCompleter1 = Completer(); final GlobalKey _globalKey = GlobalKey(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -244,7 +242,7 @@ void main() { final String customUserAgent1 = await _getUserAgent(controller1); expect(customUserAgent1, 'Custom_User_Agent1'); // rebuild the WebView with a different user agent. - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -260,12 +258,13 @@ void main() { expect(customUserAgent2, 'Custom_User_Agent2'); }); - test('use default platform userAgent after webView is rebuilt', () async { + testWidgets('use default platform userAgent after webView is rebuilt', + (WidgetTester tester) async { final Completer controllerCompleter = Completer(); final GlobalKey _globalKey = GlobalKey(); // Build the webView with no user agent to get the default platform user agent. - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -281,7 +280,7 @@ void main() { final WebViewController controller = await controllerCompleter.future; final String defaultPlatformUserAgent = await _getUserAgent(controller); // rebuild the WebView with a custom user agent. - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -295,7 +294,7 @@ void main() { final String customUserAgent = await _getUserAgent(controller); expect(customUserAgent, 'Custom_User_Agent'); // rebuilds the WebView with no user agent. - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -341,12 +340,12 @@ void main() { audioTestBase64 = base64Encode(const Utf8Encoder().convert(audioTest)); }); - test('Auto media playback', () async { + testWidgets('Auto media playback', (WidgetTester tester) async { Completer controllerCompleter = Completer(); Completer pageLoaded = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -373,7 +372,7 @@ void main() { pageLoaded = Completer(); // We change the key to re-create a new webview as we change the initialMediaPlaybackPolicy - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -399,13 +398,14 @@ void main() { expect(isPaused, _webviewBool(true)); }); - test('Changes to initialMediaPlaybackPolocy are ignored', () async { + testWidgets('Changes to initialMediaPlaybackPolocy are ignored', + (WidgetTester tester) async { final Completer controllerCompleter = Completer(); Completer pageLoaded = Completer(); final GlobalKey key = GlobalKey(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -430,7 +430,7 @@ void main() { pageLoaded = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -458,7 +458,7 @@ void main() { }); }); - test('getTitle', () async { + testWidgets('getTitle', (WidgetTester tester) async { final String getTitleTest = ''' Some title @@ -473,7 +473,7 @@ void main() { final Completer controllerCompleter = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -496,11 +496,6 @@ void main() { }); } -Future pumpWidget(Widget widget) { - runApp(widget); - return WidgetsBinding.instance.endOfFrame; -} - // JavaScript booleans evaluate to different string values on Android and iOS. // This utility method returns the string boolean value of the current platform. String _webviewBool(bool value) { diff --git a/packages/webview_flutter/example/test_driver/webview_test.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e_test.dart similarity index 72% rename from packages/webview_flutter/example/test_driver/webview_test.dart rename to packages/webview_flutter/example/test_driver/webview_flutter_e2e_test.dart index b0d3305cd652..2e5c27fd402e 100644 --- a/packages/webview_flutter/example/test_driver/webview_test.dart +++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e_test.dart @@ -3,11 +3,14 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import 'package:flutter_driver/flutter_driver.dart'; Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); driver.close(); + exit(result == 'pass' ? 0 : 1); } diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 13ccef744009..efddfd3b7aec 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,12 +1,12 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.14+2 +version: 0.3.15 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" + flutter: ">=1.6.7 <2.0.0" dependencies: flutter: From f7297f5ef64f6a64298dc5f6fc2e3df5f3424321 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 14 Oct 2019 18:42:24 -0700 Subject: [PATCH 129/133] [e2e] Update to support new embedder (#2190) * Support the v2 Android embedder. * Print a warning if the plugin is not registered. * Updated method channel name. * Set a Flutter minimum SDK version. --- packages/e2e/CHANGELOG.md | 7 +++++ packages/e2e/android/build.gradle | 25 ++++++++++++++++ .../dev/flutter/plugins/e2e/E2EPlugin.java | 29 ++++++++++++++++--- .../e2e_example/EmbedderV1ActivityTest.java | 13 +++++++++ .../example/e2e_example/MainActivityTest.java | 2 +- .../android/app/src/main/AndroidManifest.xml | 14 ++++----- .../e2e_example/EmbedderV1Activity.java | 17 +++++++++++ .../com/example/e2e_example/MainActivity.java | 15 ++++++---- .../e2e/example/android/gradle.properties | 1 - packages/e2e/example/pubspec.yaml | 1 + packages/e2e/lib/e2e.dart | 5 ++-- packages/e2e/pubspec.yaml | 3 +- 12 files changed, 108 insertions(+), 24 deletions(-) create mode 100644 packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java create mode 100644 packages/e2e/example/android/app/src/main/java/com/example/e2e_example/EmbedderV1Activity.java diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index ee813dc1c88f..4fcb28efcf75 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.2.1 + +* Support the v2 Android embedder. +* Print a warning if the plugin is not registered. +* Updated method channel name. +* Set a Flutter minimum SDK version. + ## 0.2.0+1 * Updated README. diff --git a/packages/e2e/android/build.gradle b/packages/e2e/android/build.gradle index c91d4721d3ac..08486c8c800c 100644 --- a/packages/e2e/android/build.gradle +++ b/packages/e2e/android/build.gradle @@ -40,3 +40,28 @@ android { api 'androidx.test.espresso:espresso-core:3.2.0' } } + +// TODO(amirh): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 +afterEvaluate { + def containsEmbeddingDependencies = false + for (def configuration : configurations.all) { + for (def dependency : configuration.dependencies) { + if (dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + dependency.isTransitive()) + { + containsEmbeddingDependencies = true + break + } + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "2.1.0" + api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + api "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" + } + } + } +} \ No newline at end of file diff --git a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java index bbb8d8bb4479..ec536408c3fa 100644 --- a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java +++ b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/E2EPlugin.java @@ -4,6 +4,9 @@ package dev.flutter.plugins.e2e; +import android.content.Context; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; @@ -13,16 +16,34 @@ import java.util.concurrent.CompletableFuture; /** E2EPlugin */ -public class E2EPlugin implements MethodCallHandler { +public class E2EPlugin implements MethodCallHandler, FlutterPlugin { + private MethodChannel methodChannel; public static CompletableFuture> testResults = new CompletableFuture<>(); - private static final String CHANNEL = "plugins.flutter.dev/e2e"; + private static final String CHANNEL = "plugins.flutter.io/e2e"; /** Plugin registration. */ public static void registerWith(Registrar registrar) { - final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - channel.setMethodCallHandler(new E2EPlugin()); + final E2EPlugin instance = new E2EPlugin(); + instance.onAttachedToEngine(registrar.context(), registrar.messenger()); + } + + @Override + public void onAttachedToEngine(FlutterPluginBinding binding) { + onAttachedToEngine( + binding.getApplicationContext(), binding.getFlutterEngine().getDartExecutor()); + } + + private void onAttachedToEngine(Context applicationContext, BinaryMessenger messenger) { + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/e2e"); + methodChannel.setMethodCallHandler(this); + } + + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) { + methodChannel.setMethodCallHandler(null); + methodChannel = null; } @Override diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java new file mode 100644 index 000000000000..a526c1c8422e --- /dev/null +++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java @@ -0,0 +1,13 @@ +package com.example.e2e_example; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class EmbedderV1ActivityTest { + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbedderV1Activity.class); +} diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java index 11a6c6afb2fa..b61c056e176d 100644 --- a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java +++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java @@ -1,7 +1,7 @@ package com.example.e2e_example; import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.instrumentationadapter.FlutterRunner; +import dev.flutter.plugins.e2e.FlutterRunner; import org.junit.Rule; import org.junit.runner.RunWith; diff --git a/packages/e2e/example/android/app/src/main/AndroidManifest.xml b/packages/e2e/example/android/app/src/main/AndroidManifest.xml index d2477d5977f5..ae1a11dbcb34 100644 --- a/packages/e2e/example/android/app/src/main/AndroidManifest.xml +++ b/packages/e2e/example/android/app/src/main/AndroidManifest.xml @@ -10,20 +10,18 @@ android:name="io.flutter.app.FlutterApplication" android:label="e2e_example" android:icon="@mipmap/ic_launcher"> + + - - diff --git a/packages/e2e/example/android/app/src/main/java/com/example/e2e_example/EmbedderV1Activity.java b/packages/e2e/example/android/app/src/main/java/com/example/e2e_example/EmbedderV1Activity.java new file mode 100644 index 000000000000..4056569eed8c --- /dev/null +++ b/packages/e2e/example/android/app/src/main/java/com/example/e2e_example/EmbedderV1Activity.java @@ -0,0 +1,17 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package com.example.e2e_example; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class EmbedderV1Activity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/e2e/example/android/app/src/main/java/com/example/e2e_example/MainActivity.java b/packages/e2e/example/android/app/src/main/java/com/example/e2e_example/MainActivity.java index 3a58e4e64863..a868db8d9d1c 100644 --- a/packages/e2e/example/android/app/src/main/java/com/example/e2e_example/MainActivity.java +++ b/packages/e2e/example/android/app/src/main/java/com/example/e2e_example/MainActivity.java @@ -1,13 +1,16 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package com.example.e2e_example; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import dev.flutter.plugins.e2e.E2EPlugin; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; public class MainActivity extends FlutterActivity { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + public void configureFlutterEngine(FlutterEngine flutterEngine) { + flutterEngine.getPlugins().add(new E2EPlugin()); } } diff --git a/packages/e2e/example/android/gradle.properties b/packages/e2e/example/android/gradle.properties index 1515360c4bce..755300e3a0b5 100644 --- a/packages/e2e/example/android/gradle.properties +++ b/packages/e2e/example/android/gradle.properties @@ -2,4 +2,3 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -android.enableR8=true diff --git a/packages/e2e/example/pubspec.yaml b/packages/e2e/example/pubspec.yaml index 3538bb65db0f..456a62f2b36a 100644 --- a/packages/e2e/example/pubspec.yaml +++ b/packages/e2e/example/pubspec.yaml @@ -4,6 +4,7 @@ publish_to: 'none' environment: sdk: ">=2.1.0 <3.0.0" + flutter: ">=1.6.7 <2.0.0" dependencies: flutter: diff --git a/packages/e2e/lib/e2e.dart b/packages/e2e/lib/e2e.dart index 00d29633d045..2f8dc0ebac90 100644 --- a/packages/e2e/lib/e2e.dart +++ b/packages/e2e/lib/e2e.dart @@ -18,7 +18,7 @@ class E2EWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding { await _channel.invokeMethod( 'allTestsFinished', {'results': _results}); } on MissingPluginException { - // Tests were run on the host rather than a device. + print('Warning: E2E test plugin was not detected.'); } if (!_allTestsPassed.isCompleted) _allTestsPassed.complete(true); }); @@ -34,8 +34,7 @@ class E2EWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding { return WidgetsBinding.instance; } - static const MethodChannel _channel = - MethodChannel('plugins.flutter.dev/e2e'); + static const MethodChannel _channel = MethodChannel('plugins.flutter.io/e2e'); static Map _results = {}; diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml index 2515a51f07fd..bee996db5656 100644 --- a/packages/e2e/pubspec.yaml +++ b/packages/e2e/pubspec.yaml @@ -1,11 +1,12 @@ name: e2e description: Runs tests that use the flutter_test API as integration tests. -version: 0.2.0+1 +version: 0.2.1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/e2e environment: sdk: ">=2.1.0 <3.0.0" + flutter: ">=1.6.7 <2.0.0" dependencies: flutter: From fb37cfc54f6a342a2ad4afdb399918a8ef427201 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Tue, 15 Oct 2019 10:53:51 -0700 Subject: [PATCH 130/133] [image_picker] Fix iOS build and analyzer warnings (#2191) --- packages/image_picker/CHANGELOG.md | 4 ++++ .../image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m | 1 + .../image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h | 2 +- packages/image_picker/pubspec.yaml | 2 +- script/lint_darwin_plugins.sh | 1 - 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index bfc368b308af..bdaa9638ab59 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.1+8 + +* Fix iOS build and analyzer warnings. + ## 0.6.1+7 * Android: Fix ImagePickerPlugin#onCreate casting context which causes exception. diff --git a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m index 67b6efa8a8a8..9786f61e1e67 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m +++ b/packages/image_picker/ios/Classes/FLTImagePickerMetaDataUtil.m @@ -45,6 +45,7 @@ + (NSDictionary *)getMetaDataFromImageData:(NSData *)imageData { CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL); NSDictionary *metadata = (NSDictionary *)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, 0, NULL)); + CFRelease(source); return metadata; } diff --git a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h index 709b6ca65143..1e6fda2cf786 100644 --- a/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h +++ b/packages/image_picker/ios/Classes/FLTImagePickerPhotoAssetUtil.h @@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN // Save image with correct meta data and extention copied from image picker result info. + (NSString *)saveImageWithPickerInfo:(nullable NSDictionary *)info image:(UIImage *)image - imageQuality:(NSNumber *)imageQuality; + imageQuality:(nullable NSNumber *)imageQuality; @end diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index ce1b46c63366..6ad8153e66da 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -5,7 +5,7 @@ authors: - Flutter Team - Rhodes Davis Jr. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.1+7 +version: 0.6.1+8 flutter: plugin: diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 0ae55c957f69..3ca9af8b892a 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -21,7 +21,6 @@ function lint_package() { # TODO: These packages have analyzer warnings. Remove plugins from this list as issues are fixed. local skip_analysis_packages=( "camera.podspec" # https://github.com/flutter/flutter/issues/42673 - "image_picker.podspec" # https://github.com/flutter/flutter/issues/42678 "in_app_purchase.podspec" # https://github.com/flutter/flutter/issues/42679 ) find "${package_dir}" -type f -name "*\.podspec" | while read podspec; do From ba5c774a944d14707e540f3e6c06ca3449644c9d Mon Sep 17 00:00:00 2001 From: Michael Klimushyn Date: Tue, 15 Oct 2019 11:21:31 -0700 Subject: [PATCH 131/133] [camera] Migrate to the new embedding (#2165) Migrates the camera plugin to the new embedding and adds an example activity exercising it. Unlike some of the previous PRs on this, this is the minimal migration that would land this without adding any tech debt. From previous offline discussions we'd like to scope these migrations to the bare minimum required to keep the patches small. See #2114 for a migration combined with a refactoring. That said there are still some minor changes to prevent this from adding additional tech debt, going a little beyond #2118: - `#onMethodCall` has been split up into its own `MethodCallHandlerImpl` class to try and keep `CameraPlugin` from mixing concerns. Before the migration, _all_ it was doing was responding to method calls. Now there's a significant amount of logic just based around responding to lifecycle events. It still seemed better to split that into a separate file than to try and manage that logic all in one place. Other than the above refactor, the original logic is untouched. --- packages/camera/CHANGELOG.md | 5 + packages/camera/android/build.gradle | 25 ++ packages/camera/android/gradle.properties | 2 + .../plugins/camera/CameraPermissions.java | 27 ++- .../flutter/plugins/camera/CameraPlugin.java | 226 +++++++----------- .../plugins/camera/MethodCallHandlerImpl.java | 174 ++++++++++++++ .../camera/example/android/app/build.gradle | 5 +- .../EmbeddingV1ActivityTest.java | 13 + .../cameraexample/MainActivityTest.java | 11 + .../android/app/src/main/AndroidManifest.xml | 59 +++-- .../cameraexample/EmbeddingV1Activity.java | 13 + .../plugins/cameraexample/MainActivity.java | 21 +- .../camera/example/android/gradle.properties | 3 + packages/camera/example/pubspec.yaml | 5 + .../{camera.dart => camera_e2e.dart} | 21 +- .../example/test_driver/camera_e2e_test.dart | 55 +++++ .../example/test_driver/camera_test.dart | 7 - packages/camera/pubspec.yaml | 4 +- 18 files changed, 469 insertions(+), 207 deletions(-) create mode 100644 packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java create mode 100644 packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/EmbeddingV1ActivityTest.java create mode 100644 packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/MainActivityTest.java create mode 100644 packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/EmbeddingV1Activity.java rename packages/camera/example/test_driver/{camera.dart => camera_e2e.dart} (94%) create mode 100644 packages/camera/example/test_driver/camera_e2e_test.dart delete mode 100644 packages/camera/example/test_driver/camera_test.dart diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 2fe0e44fa6c2..14d2289d99b1 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.5.6 + +* Add support for the v2 Android embedding. This shouldn't affect existing + functionality. + ## 0.5.5+1 * Fix event type check diff --git a/packages/camera/android/build.gradle b/packages/camera/android/build.gradle index ab2fc8fd89f0..ebd355385c1c 100644 --- a/packages/camera/android/build.gradle +++ b/packages/camera/android/build.gradle @@ -60,3 +60,28 @@ android { dependencies { testImplementation 'junit:junit:4.12' } + +// TODO(mklim): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 +afterEvaluate { + def containsEmbeddingDependencies = false + for (def configuration : configurations.all) { + for (def dependency : configuration.dependencies) { + if (dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + dependency.isTransitive()) + { + containsEmbeddingDependencies = true + break + } + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "2.1.0" + api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + api "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" + } + } + } +} diff --git a/packages/camera/android/gradle.properties b/packages/camera/android/gradle.properties index 8bd86f680510..94adc3a3f97a 100644 --- a/packages/camera/android/gradle.properties +++ b/packages/camera/android/gradle.properties @@ -1 +1,3 @@ org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java index e45fb1e5a594..3c86ce0d9816 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPermissions.java @@ -7,20 +7,30 @@ import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import io.flutter.plugin.common.PluginRegistry; -import io.flutter.plugin.common.PluginRegistry.Registrar; +import io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener; + +final class CameraPermissions { + interface PermissionsRegistry { + void addListener(RequestPermissionsResultListener handler); + } + + interface ResultCallback { + void onResult(String errorCode, String errorDescription); + } -public class CameraPermissions { private static final int CAMERA_REQUEST_ID = 9796; private boolean ongoing = false; - public void requestPermissions( - Registrar registrar, boolean enableAudio, ResultCallback callback) { + void requestPermissions( + Activity activity, + PermissionsRegistry permissionsRegistry, + boolean enableAudio, + ResultCallback callback) { if (ongoing) { callback.onResult("cameraPermission", "Camera permission request ongoing"); } - Activity activity = registrar.activity(); if (!hasCameraPermission(activity) || (enableAudio && !hasAudioPermission(activity))) { - registrar.addRequestPermissionsResultListener( + permissionsRegistry.addListener( new CameraRequestPermissionsListener( (String errorCode, String errorDescription) -> { ongoing = false; @@ -51,6 +61,7 @@ private boolean hasAudioPermission(Activity activity) { private static class CameraRequestPermissionsListener implements PluginRegistry.RequestPermissionsResultListener { + final ResultCallback callback; private CameraRequestPermissionsListener(ResultCallback callback) { @@ -73,8 +84,4 @@ public boolean onRequestPermissionsResult(int id, String[] permissions, int[] gr return false; } } - - interface ResultCallback { - void onResult(String errorCode, String errorDescription); - } } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java index b504f039e326..9bd34e17aa02 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java @@ -4,172 +4,108 @@ package io.flutter.plugins.camera; -import android.hardware.camera2.CameraAccessException; +import android.app.Activity; import android.os.Build; import androidx.annotation.NonNull; -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 androidx.annotation.Nullable; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.PluginRegistry.Registrar; -import io.flutter.view.FlutterView; +import io.flutter.plugins.camera.CameraPermissions.PermissionsRegistry; import io.flutter.view.TextureRegistry; -public class CameraPlugin implements MethodCallHandler { +/** + * Platform implementation of the camera_plugin. + * + *

Instantiate this in an add to app scenario to gracefully handle activity and context changes. + * See {@code io.flutter.plugins.camera.MainActivity} for an example. + * + *

Call {@link #registerWith(Registrar)} to register an implementation of this that uses the + * stable {@code io.flutter.plugin.common} package. + */ +public final class CameraPlugin implements FlutterPlugin, ActivityAware { - private final CameraPermissions cameraPermissions = new CameraPermissions(); - private final FlutterView view; - private final Registrar registrar; - private final EventChannel imageStreamChannel; - private Camera camera; + private static final String TAG = "CameraPlugin"; + private @Nullable FlutterPluginBinding flutterPluginBinding; + private @Nullable MethodCallHandlerImpl methodCallHandler; - private CameraPlugin(Registrar registrar) { - this.registrar = registrar; - this.view = registrar.view(); - this.imageStreamChannel = - new EventChannel(registrar.messenger(), "plugins.flutter.io/camera/imageStream"); - } + /** + * Initialize this within the {@code #configureFlutterEngine} of a Flutter activity or fragment. + * + *

See {@code io.flutter.plugins.camera.MainActivity} for an example. + */ + public CameraPlugin() {} + /** + * Registers a plugin implementation that uses the stable {@code io.flutter.plugin.common} + * package. + * + *

Calling this automatically initializes the plugin. However plugins initialized this way + * won't react to changes in activity or context, unlike {@link CameraPlugin}. + */ public static void registerWith(Registrar registrar) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - // When a background flutter view tries to register the plugin, the registrar has no activity. - // We stop the registration process as this plugin is foreground only. Also, if the sdk is - // less than 21 (min sdk for Camera2) we don't register the plugin. - return; - } + CameraPlugin plugin = new CameraPlugin(); + plugin.maybeStartListening( + registrar.activity(), + registrar.messenger(), + registrar::addRequestPermissionsResultListener, + registrar.view()); + } - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/camera"); + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + this.flutterPluginBinding = binding; + } - channel.setMethodCallHandler(new CameraPlugin(registrar)); + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + this.flutterPluginBinding = null; } - private void instantiateCamera(MethodCall call, Result result) throws CameraAccessException { - String cameraName = call.argument("cameraName"); - String resolutionPreset = call.argument("resolutionPreset"); - boolean enableAudio = call.argument("enableAudio"); - TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture = view.createSurfaceTexture(); - DartMessenger dartMessenger = - new DartMessenger(registrar.messenger(), flutterSurfaceTexture.id()); - camera = - new Camera( - registrar.activity(), - flutterSurfaceTexture, - dartMessenger, - cameraName, - resolutionPreset, - enableAudio); + @Override + public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { + maybeStartListening( + binding.getActivity(), + flutterPluginBinding.getFlutterEngine().getDartExecutor(), + binding::addRequestPermissionsResultListener, + flutterPluginBinding.getFlutterEngine().getRenderer()); + } - camera.open(result); + @Override + public void onDetachedFromActivity() { + if (methodCallHandler == null) { + // Could be on too low of an SDK to have started listening originally. + return; + } + + methodCallHandler.stopListening(); + methodCallHandler = null; } @Override - public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { - switch (call.method) { - case "availableCameras": - try { - result.success(CameraUtils.getAvailableCameras(registrar.activity())); - } catch (Exception e) { - handleException(e, result); - } - break; - case "initialize": - { - if (camera != null) { - camera.close(); - } - cameraPermissions.requestPermissions( - registrar, - call.argument("enableAudio"), - (String errCode, String errDesc) -> { - if (errCode == null) { - try { - instantiateCamera(call, result); - } catch (Exception e) { - handleException(e, result); - } - } else { - result.error(errCode, errDesc, null); - } - }); + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + onAttachedToActivity(binding); + } - break; - } - case "takePicture": - { - camera.takePicture(call.argument("path"), result); - break; - } - case "prepareForVideoRecording": - { - // This optimization is not required for Android. - result.success(null); - break; - } - case "startVideoRecording": - { - camera.startVideoRecording(call.argument("filePath"), result); - break; - } - case "stopVideoRecording": - { - camera.stopVideoRecording(result); - break; - } - case "pauseVideoRecording": - { - camera.pauseVideoRecording(result); - break; - } - case "resumeVideoRecording": - { - camera.resumeVideoRecording(result); - break; - } - case "startImageStream": - { - try { - camera.startPreviewWithImageStream(imageStreamChannel); - result.success(null); - } catch (Exception e) { - handleException(e, result); - } - break; - } - case "stopImageStream": - { - try { - camera.startPreview(); - result.success(null); - } catch (Exception e) { - handleException(e, result); - } - break; - } - case "dispose": - { - if (camera != null) { - camera.dispose(); - } - result.success(null); - break; - } - default: - result.notImplemented(); - break; - } + @Override + public void onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity(); } - // We move catching CameraAccessException out of onMethodCall because it causes a crash - // on plugin registration for sdks incompatible with Camera2 (< 21). We want this plugin to - // to be able to compile with <21 sdks for apps that want the camera and support earlier version. - @SuppressWarnings("ConstantConditions") - private void handleException(Exception exception, Result result) { - if (exception instanceof CameraAccessException) { - result.error("CameraAccess", exception.getMessage(), null); + private void maybeStartListening( + Activity activity, + BinaryMessenger messenger, + PermissionsRegistry permissionsRegistry, + TextureRegistry textureRegistry) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + // If the sdk is less than 21 (min sdk for Camera2) we don't register the plugin. + return; } - throw (RuntimeException) exception; + methodCallHandler = + new MethodCallHandlerImpl( + activity, messenger, new CameraPermissions(), permissionsRegistry, textureRegistry); } } diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java new file mode 100644 index 000000000000..cb58d19a9a02 --- /dev/null +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -0,0 +1,174 @@ +package io.flutter.plugins.camera; + +import android.app.Activity; +import android.hardware.camera2.CameraAccessException; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +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.Result; +import io.flutter.plugins.camera.CameraPermissions.PermissionsRegistry; +import io.flutter.view.TextureRegistry; + +final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { + private final Activity activity; + private final BinaryMessenger messenger; + private final CameraPermissions cameraPermissions; + private final PermissionsRegistry permissionsRegistry; + private final TextureRegistry textureRegistry; + private final MethodChannel methodChannel; + private final EventChannel imageStreamChannel; + private @Nullable Camera camera; + + MethodCallHandlerImpl( + Activity activity, + BinaryMessenger messenger, + CameraPermissions cameraPermissions, + PermissionsRegistry permissionsAdder, + TextureRegistry textureRegistry) { + this.activity = activity; + this.messenger = messenger; + this.cameraPermissions = cameraPermissions; + this.permissionsRegistry = permissionsAdder; + this.textureRegistry = textureRegistry; + + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/camera"); + imageStreamChannel = new EventChannel(messenger, "plugins.flutter.io/camera/imageStream"); + methodChannel.setMethodCallHandler(this); + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { + switch (call.method) { + case "availableCameras": + try { + result.success(CameraUtils.getAvailableCameras(activity)); + } catch (Exception e) { + handleException(e, result); + } + break; + case "initialize": + { + if (camera != null) { + camera.close(); + } + cameraPermissions.requestPermissions( + activity, + permissionsRegistry, + call.argument("enableAudio"), + (String errCode, String errDesc) -> { + if (errCode == null) { + try { + instantiateCamera(call, result); + } catch (Exception e) { + handleException(e, result); + } + } else { + result.error(errCode, errDesc, null); + } + }); + + break; + } + case "takePicture": + { + camera.takePicture(call.argument("path"), result); + break; + } + case "prepareForVideoRecording": + { + // This optimization is not required for Android. + result.success(null); + break; + } + case "startVideoRecording": + { + camera.startVideoRecording(call.argument("filePath"), result); + break; + } + case "stopVideoRecording": + { + camera.stopVideoRecording(result); + break; + } + case "pauseVideoRecording": + { + camera.pauseVideoRecording(result); + break; + } + case "resumeVideoRecording": + { + camera.resumeVideoRecording(result); + break; + } + case "startImageStream": + { + try { + camera.startPreviewWithImageStream(imageStreamChannel); + result.success(null); + } catch (Exception e) { + handleException(e, result); + } + break; + } + case "stopImageStream": + { + try { + camera.startPreview(); + result.success(null); + } catch (Exception e) { + handleException(e, result); + } + break; + } + case "dispose": + { + if (camera != null) { + camera.dispose(); + } + result.success(null); + break; + } + default: + result.notImplemented(); + break; + } + } + + void stopListening() { + methodChannel.setMethodCallHandler(null); + } + + private void instantiateCamera(MethodCall call, Result result) throws CameraAccessException { + String cameraName = call.argument("cameraName"); + String resolutionPreset = call.argument("resolutionPreset"); + boolean enableAudio = call.argument("enableAudio"); + TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture = + textureRegistry.createSurfaceTexture(); + DartMessenger dartMessenger = new DartMessenger(messenger, flutterSurfaceTexture.id()); + camera = + new Camera( + activity, + flutterSurfaceTexture, + dartMessenger, + cameraName, + resolutionPreset, + enableAudio); + + camera.open(result); + } + + // We move catching CameraAccessException out of onMethodCall because it causes a crash + // on plugin registration for sdks incompatible with Camera2 (< 21). We want this plugin to + // to be able to compile with <21 sdks for apps that want the camera and support earlier version. + @SuppressWarnings("ConstantConditions") + private void handleException(Exception exception, Result result) { + if (exception instanceof CameraAccessException) { + result.error("CameraAccess", exception.getMessage(), null); + } + + throw (RuntimeException) exception; + } +} diff --git a/packages/camera/example/android/app/build.gradle b/packages/camera/example/android/app/build.gradle index 39003759e4a3..e47b6db5e21e 100644 --- a/packages/camera/example/android/app/build.gradle +++ b/packages/camera/example/android/app/build.gradle @@ -58,6 +58,7 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } diff --git a/packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/EmbeddingV1ActivityTest.java b/packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/EmbeddingV1ActivityTest.java new file mode 100644 index 000000000000..95b5f4373b62 --- /dev/null +++ b/packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/EmbeddingV1ActivityTest.java @@ -0,0 +1,13 @@ +package io.flutter.plugins.cameraexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class EmbeddingV1ActivityTest { + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbeddingV1Activity.class); +} diff --git a/packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/MainActivityTest.java b/packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/MainActivityTest.java new file mode 100644 index 000000000000..5d1b95578dc0 --- /dev/null +++ b/packages/camera/example/android/app/src/androidTestDebug/java/io/flutter/plugins/cameraexample/MainActivityTest.java @@ -0,0 +1,11 @@ +package io.flutter.plugins.cameraexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class MainActivityTest { + @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} diff --git a/packages/camera/example/android/app/src/main/AndroidManifest.xml b/packages/camera/example/android/app/src/main/AndroidManifest.xml index 15f6087e4ebe..aad8d98bfa27 100644 --- a/packages/camera/example/android/app/src/main/AndroidManifest.xml +++ b/packages/camera/example/android/app/src/main/AndroidManifest.xml @@ -1,30 +1,39 @@ + package="io.flutter.plugins.cameraexample"> - + + + + + + + + + + + - + - - - - - - - - - + diff --git a/packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/EmbeddingV1Activity.java b/packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/EmbeddingV1Activity.java new file mode 100644 index 000000000000..9e86560d3ff4 --- /dev/null +++ b/packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/EmbeddingV1Activity.java @@ -0,0 +1,13 @@ +package io.flutter.plugins.cameraexample; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class EmbeddingV1Activity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/MainActivity.java b/packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/MainActivity.java index 8692b845f947..bbe9e45be2db 100644 --- a/packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/MainActivity.java +++ b/packages/camera/example/android/app/src/main/java/io/flutter/plugins/cameraexample/MainActivity.java @@ -1,13 +1,22 @@ package io.flutter.plugins.cameraexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import androidx.annotation.NonNull; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry; +import io.flutter.plugins.camera.CameraPlugin; +import io.flutter.plugins.pathprovider.PathProviderPlugin; +import io.flutter.plugins.videoplayer.VideoPlayerPlugin; public class MainActivity extends FlutterActivity { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { + flutterEngine.getPlugins().add(new CameraPlugin()); + + ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine); + PathProviderPlugin.registerWith( + shimPluginRegistry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin")); + VideoPlayerPlugin.registerWith( + shimPluginRegistry.registrarFor("io.flutter.plugins.videoplayer.VideoPlayerPlugin")); } } diff --git a/packages/camera/example/android/gradle.properties b/packages/camera/example/android/gradle.properties index 8bd86f680510..a6738207fd15 100644 --- a/packages/camera/example/android/gradle.properties +++ b/packages/camera/example/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true diff --git a/packages/camera/example/pubspec.yaml b/packages/camera/example/pubspec.yaml index 59f3821abe21..0f76a09fed3b 100644 --- a/packages/camera/example/pubspec.yaml +++ b/packages/camera/example/pubspec.yaml @@ -9,6 +9,7 @@ dependencies: flutter: sdk: flutter video_player: ^0.10.0 + e2e: "^0.2.0" dev_dependencies: flutter_test: @@ -18,3 +19,7 @@ dev_dependencies: flutter: uses-material-design: true + +environment: + sdk: ">=2.0.0-dev.28.0 <3.0.0" + flutter: ">=1.9.1+hotfix.4 <2.0.0" diff --git a/packages/camera/example/test_driver/camera.dart b/packages/camera/example/test_driver/camera_e2e.dart similarity index 94% rename from packages/camera/example/test_driver/camera.dart rename to packages/camera/example/test_driver/camera_e2e.dart index d68b8c5ba1fc..2e6a344c7d04 100644 --- a/packages/camera/example/test_driver/camera.dart +++ b/packages/camera/example/test_driver/camera_e2e.dart @@ -3,16 +3,16 @@ import 'dart:io'; import 'dart:ui'; import 'package:flutter/painting.dart'; -import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:camera/camera.dart'; import 'package:path_provider/path_provider.dart'; import 'package:video_player/video_player.dart'; +import 'package:e2e/e2e.dart'; void main() { - final Completer completer = Completer(); Directory testDir; - enableFlutterDriverExtension(handler: (_) => completer.future); + + E2EWidgetsFlutterBinding.ensureInitialized(); setUpAll(() async { final Directory extDir = await getTemporaryDirectory(); @@ -21,7 +21,6 @@ void main() { tearDownAll(() async { await testDir.delete(recursive: true); - completer.complete(null); }); final Map presetExpectedSizes = @@ -70,7 +69,8 @@ void main() { expectedSize, Size(image.height.toDouble(), image.width.toDouble())); } - test('Capture specific image resolutions', () async { + testWidgets('Capture specific image resolutions', + (WidgetTester tester) async { final List cameras = await availableCameras(); if (cameras.isEmpty) { return; @@ -90,7 +90,7 @@ void main() { await controller.dispose(); } } - }); + }, skip: !Platform.isAndroid); // This tests that the capture is no bigger than the preset, since we have // automatic code to fall back to smaller sizes when we need to. Returns @@ -121,7 +121,8 @@ void main() { expectedSize, Size(video.height, video.width)); } - test('Capture specific video resolutions', () async { + testWidgets('Capture specific video resolutions', + (WidgetTester tester) async { final List cameras = await availableCameras(); if (cameras.isEmpty) { return; @@ -142,9 +143,9 @@ void main() { await controller.dispose(); } } - }); + }, skip: !Platform.isAndroid); - test('Pause and resume video recording', () async { + testWidgets('Pause and resume video recording', (WidgetTester tester) async { final List cameras = await availableCameras(); if (cameras.isEmpty) { return; @@ -198,5 +199,5 @@ void main() { await videoController.dispose(); expect(duration, lessThan(recordingTime - timePaused)); - }); + }, skip: !Platform.isAndroid); } diff --git a/packages/camera/example/test_driver/camera_e2e_test.dart b/packages/camera/example/test_driver/camera_e2e_test.dart new file mode 100644 index 000000000000..e3e089a81fc9 --- /dev/null +++ b/packages/camera/example/test_driver/camera_e2e_test.dart @@ -0,0 +1,55 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter_driver/flutter_driver.dart'; + +const String _examplePackage = 'io.flutter.plugins.cameraexample'; + +Future main() async { + if (!(Platform.isLinux || Platform.isMacOS)) { + print('This test must be run on a POSIX host. Skipping...'); + exit(0); + } + final bool adbExists = + Process.runSync('which', ['adb']).exitCode == 0; + if (!adbExists) { + print('This test needs ADB to exist on the \$PATH. Skipping...'); + exit(0); + } + print('Granting camera permissions...'); + Process.runSync('adb', [ + 'shell', + 'pm', + 'grant', + _examplePackage, + 'android.permission.CAMERA' + ]); + Process.runSync('adb', [ + 'shell', + 'pm', + 'grant', + _examplePackage, + 'android.permission.RECORD_AUDIO' + ]); + print('Starting test.'); + final FlutterDriver driver = await FlutterDriver.connect(); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); + print('Test finished. Revoking camera permissions...'); + Process.runSync('adb', [ + 'shell', + 'pm', + 'revoke', + _examplePackage, + 'android.permission.CAMERA' + ]); + Process.runSync('adb', [ + 'shell', + 'pm', + 'revoke', + _examplePackage, + 'android.permission.RECORD_AUDIO' + ]); + exit(result == 'pass' ? 0 : 1); +} diff --git a/packages/camera/example/test_driver/camera_test.dart b/packages/camera/example/test_driver/camera_test.dart deleted file mode 100644 index 38fe6c447e05..000000000000 --- a/packages/camera/example/test_driver/camera_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 0906f175fb8d..82facbc94e5d 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.5+1 +version: 0.5.6 authors: - Flutter Team @@ -32,4 +32,4 @@ flutter: environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.2.0 <2.0.0" + flutter: ">=1.6.7 <2.0.0" From 67697abaf9ccdf0b09cf571c4cf9cf4ea3633a7c Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 15 Oct 2019 12:33:36 -0700 Subject: [PATCH 132/133] [Connectivity] migrate to the new android embedding (#2142) --- packages/connectivity/CHANGELOG.md | 4 + packages/connectivity/android/build.gradle | 25 +++ .../plugins/connectivity/Connectivity.java | 110 +++++++++++ .../ConnectivityBroadcastReceiver.java | 51 +++++ .../ConnectivityMethodChannelHandler.java | 49 +++++ .../connectivity/ConnectivityPlugin.java | 186 +++--------------- .../android/app/src/main/AndroidManifest.xml | 18 +- .../EmbeddingV1Activity.java} | 2 +- .../EmbeddingV1ActivityTest.java | 17 ++ .../connectivityexample/MainActivity.java | 18 ++ .../connectivityexample/MainActivityTest.java | 15 ++ .../example/android/gradle.properties | 3 + packages/connectivity/example/pubspec.yaml | 1 + .../test_driver/connectivity_test.dart | 10 - .../test/connectivity_e2e_test.dart | 14 ++ packages/connectivity/pubspec.yaml | 5 +- .../connectivity_e2e.dart} | 16 +- 17 files changed, 362 insertions(+), 182 deletions(-) create mode 100644 packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java create mode 100644 packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java create mode 100644 packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityMethodChannelHandler.java rename packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/{connectivity_example/MainActivity.java => connectivityexample/EmbeddingV1Activity.java} (89%) create mode 100644 packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java create mode 100644 packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivity.java create mode 100644 packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivityTest.java delete mode 100644 packages/connectivity/example/test_driver/connectivity_test.dart create mode 100644 packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart rename packages/connectivity/{example/test_driver/connectivity.dart => test/connectivity_e2e.dart} (68%) diff --git a/packages/connectivity/CHANGELOG.md b/packages/connectivity/CHANGELOG.md index b52e629fd516..6b1b3780c4c2 100644 --- a/packages/connectivity/CHANGELOG.md +++ b/packages/connectivity/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.5 + +* Support the v2 Android embedder. + ## 0.4.4+1 * Update and migrate iOS example project. diff --git a/packages/connectivity/android/build.gradle b/packages/connectivity/android/build.gradle index 681eb0438b75..3012844d8778 100644 --- a/packages/connectivity/android/build.gradle +++ b/packages/connectivity/android/build.gradle @@ -45,3 +45,28 @@ android { disable 'InvalidPackage' } } + +// TODO(amirh): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 +afterEvaluate { + def containsEmbeddingDependencies = false + for (def configuration : configurations.all) { + for (def dependency : configuration.dependencies) { + if (dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + dependency.isTransitive()) + { + containsEmbeddingDependencies = true + break + } + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "2.1.0" + api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + api "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" + } + } + } +} diff --git a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java new file mode 100644 index 000000000000..605acdb73948 --- /dev/null +++ b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java @@ -0,0 +1,110 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.connectivity; + +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Build; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +/** Reports connectivity related information such as connectivity type and wifi information. */ +class Connectivity { + private ConnectivityManager connectivityManager; + private WifiManager wifiManager; + + Connectivity(ConnectivityManager connectivityManager, WifiManager wifiManager) { + this.connectivityManager = connectivityManager; + this.wifiManager = wifiManager; + } + + @NonNull + String getNetworkType() { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Network network = connectivityManager.getActiveNetwork(); + NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network); + if (capabilities == null) { + return "none"; + } + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) + || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) { + return "wifi"; + } + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + return "mobile"; + } + } + + return getNetworkTypeLegacy(); + } + + @Nullable + String getWifiName() { + WifiInfo wifiInfo = getWifiInfo(); + String ssid = null; + if (wifiInfo != null) ssid = wifiInfo.getSSID(); + if (ssid != null) ssid = ssid.replaceAll("\"", ""); // Android returns "SSID" + return ssid; + } + + @Nullable + String getWifiBSSID() { + WifiInfo wifiInfo = getWifiInfo(); + String bssid = null; + if (wifiInfo != null) { + bssid = wifiInfo.getBSSID(); + } + return bssid; + } + + @Nullable + String getWifiIPAddress() { + WifiInfo wifiInfo = null; + if (wifiManager != null) wifiInfo = wifiManager.getConnectionInfo(); + + String ip = null; + int i_ip = 0; + if (wifiInfo != null) i_ip = wifiInfo.getIpAddress(); + + if (i_ip != 0) + ip = + String.format( + "%d.%d.%d.%d", + (i_ip & 0xff), (i_ip >> 8 & 0xff), (i_ip >> 16 & 0xff), (i_ip >> 24 & 0xff)); + + return ip; + } + + @Nullable + private WifiInfo getWifiInfo() { + return wifiManager == null ? null : wifiManager.getConnectionInfo(); + } + + @SuppressWarnings("deprecation") + private String getNetworkTypeLegacy() { + // handle type for Android versions less than Android 9 + NetworkInfo info = connectivityManager.getActiveNetworkInfo(); + if (info == null || !info.isConnected()) { + return "none"; + } + int type = info.getType(); + switch (type) { + case ConnectivityManager.TYPE_ETHERNET: + case ConnectivityManager.TYPE_WIFI: + case ConnectivityManager.TYPE_WIMAX: + return "wifi"; + case ConnectivityManager.TYPE_MOBILE: + case ConnectivityManager.TYPE_MOBILE_DUN: + case ConnectivityManager.TYPE_MOBILE_HIPRI: + return "mobile"; + default: + return "none"; + } + } +} diff --git a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java new file mode 100644 index 000000000000..d046eceb0fa6 --- /dev/null +++ b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java @@ -0,0 +1,51 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.connectivity; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import androidx.annotation.NonNull; +import io.flutter.plugin.common.EventChannel; + +/** + * The ConnectivityBroadcastReceiver receives the connectivity updates and send them to the UIThread + * through an {@link EventChannel.EventSink} + * + *

Use {@link + * io.flutter.plugin.common.EventChannel#setStreamHandler(io.flutter.plugin.common.EventChannel.StreamHandler)} + * to set up the receiver. + */ +class ConnectivityBroadcastReceiver extends BroadcastReceiver + implements EventChannel.StreamHandler { + private Context context; + private Connectivity connectivity; + private EventChannel.EventSink events; + + ConnectivityBroadcastReceiver(@NonNull Context context, @NonNull Connectivity connectivity) { + this.context = context; + this.connectivity = connectivity; + } + + @Override + public void onListen(Object arguments, EventChannel.EventSink events) { + this.events = events; + context.registerReceiver(this, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + } + + @Override + public void onCancel(Object arguments) { + context.unregisterReceiver(this); + } + + @Override + public void onReceive(Context context, Intent intent) { + if (events != null) { + events.success(connectivity.getNetworkType()); + } + } +} diff --git a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityMethodChannelHandler.java b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityMethodChannelHandler.java new file mode 100644 index 000000000000..488c8efdd15f --- /dev/null +++ b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityMethodChannelHandler.java @@ -0,0 +1,49 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.connectivity; + +import androidx.annotation.NonNull; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + +/** + * The handler receives {@link MethodCall}s from the UIThread, gets the related information from + * a @{@link Connectivity}, and then send the result back to the UIThread through the {@link + * MethodChannel.Result}. + */ +class ConnectivityMethodChannelHandler implements MethodChannel.MethodCallHandler { + + private Connectivity connectivity; + + /** + * Construct the ConnectivityMethodChannelHandler with a {@code connectivity}. The {@code + * connectivity} must not be null. + */ + ConnectivityMethodChannelHandler(@NonNull Connectivity connectivity) { + assert (connectivity != null); + this.connectivity = connectivity; + } + + @Override + public void onMethodCall(MethodCall call, MethodChannel.Result result) { + switch (call.method) { + case "check": + result.success(connectivity.getNetworkType()); + break; + case "wifiName": + result.success(connectivity.getWifiName()); + break; + case "wifiBSSID": + result.success(connectivity.getWifiBSSID()); + break; + case "wifiIPAddress": + result.success(connectivity.getWifiIPAddress()); + break; + default: + result.notImplemented(); + break; + } + } +} diff --git a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java index dac720b0450c..ef8f7861d8e0 100644 --- a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java +++ b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java @@ -4,186 +4,60 @@ package io.flutter.plugins.connectivity; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.net.ConnectivityManager; -import android.net.Network; -import android.net.NetworkCapabilities; -import android.net.NetworkInfo; -import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import android.os.Build; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.EventChannel; -import io.flutter.plugin.common.EventChannel.EventSink; -import io.flutter.plugin.common.EventChannel.StreamHandler; -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.plugin.common.PluginRegistry.Registrar; /** ConnectivityPlugin */ -public class ConnectivityPlugin implements MethodCallHandler, StreamHandler { - private final Registrar registrar; - private final ConnectivityManager manager; - private BroadcastReceiver receiver; +public class ConnectivityPlugin implements FlutterPlugin { + + private MethodChannel methodChannel; + private EventChannel eventChannel; /** Plugin registration. */ public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/connectivity"); - final EventChannel eventChannel = - new EventChannel(registrar.messenger(), "plugins.flutter.io/connectivity_status"); - ConnectivityPlugin instance = new ConnectivityPlugin(registrar); - channel.setMethodCallHandler(instance); - eventChannel.setStreamHandler(instance); - } - private ConnectivityPlugin(Registrar registrar) { - this.registrar = registrar; - this.manager = - (ConnectivityManager) - registrar - .context() - .getApplicationContext() - .getSystemService(Context.CONNECTIVITY_SERVICE); + ConnectivityPlugin plugin = new ConnectivityPlugin(); + plugin.setupChannels(registrar.messenger(), registrar.context()); } @Override - public void onListen(Object arguments, EventSink events) { - receiver = createReceiver(events); - registrar - .context() - .registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + public void onAttachedToEngine(FlutterPluginBinding binding) { + setupChannels(binding.getFlutterEngine().getDartExecutor(), binding.getApplicationContext()); } @Override - public void onCancel(Object arguments) { - registrar.context().unregisterReceiver(receiver); - receiver = null; - } - - private String getNetworkType(ConnectivityManager manager) { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - Network network = manager.getActiveNetwork(); - NetworkCapabilities capabilities = manager.getNetworkCapabilities(network); - if (capabilities == null) { - return "none"; - } - if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) - || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) { - return "wifi"; - } - if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { - return "mobile"; - } - } - - return getNetworkTypeLegacy(manager); + public void onDetachedFromEngine(FlutterPluginBinding binding) { + teardownChannels(); } - @SuppressWarnings("deprecation") - private String getNetworkTypeLegacy(ConnectivityManager manager) { - // handle type for Android versions less than Android 9 - NetworkInfo info = manager.getActiveNetworkInfo(); - if (info == null || !info.isConnected()) { - return "none"; - } - int type = info.getType(); - switch (type) { - case ConnectivityManager.TYPE_ETHERNET: - case ConnectivityManager.TYPE_WIFI: - case ConnectivityManager.TYPE_WIMAX: - return "wifi"; - case ConnectivityManager.TYPE_MOBILE: - case ConnectivityManager.TYPE_MOBILE_DUN: - case ConnectivityManager.TYPE_MOBILE_HIPRI: - return "mobile"; - default: - return "none"; - } - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "check": - handleCheck(call, result); - break; - case "wifiName": - handleWifiName(call, result); - break; - case "wifiBSSID": - handleBSSID(call, result); - break; - case "wifiIPAddress": - handleWifiIPAddress(call, result); - break; - default: - result.notImplemented(); - break; - } - } - - private void handleCheck(MethodCall call, final Result result) { - result.success(checkNetworkType()); - } - - private String checkNetworkType() { - return getNetworkType(manager); - } - - private WifiInfo getWifiInfo() { - WifiManager wifiManager = - (WifiManager) - registrar.context().getApplicationContext().getSystemService(Context.WIFI_SERVICE); - return wifiManager == null ? null : wifiManager.getConnectionInfo(); - } - - private void handleWifiName(MethodCall call, final Result result) { - WifiInfo wifiInfo = getWifiInfo(); - String ssid = null; - if (wifiInfo != null) ssid = wifiInfo.getSSID(); - if (ssid != null) ssid = ssid.replaceAll("\"", ""); // Android returns "SSID" - result.success(ssid); - } - - private void handleBSSID(MethodCall call, MethodChannel.Result result) { - WifiInfo wifiInfo = getWifiInfo(); - String bssid = null; - if (wifiInfo != null) bssid = wifiInfo.getBSSID(); - result.success(bssid); - } - - private void handleWifiIPAddress(MethodCall call, final Result result) { - WifiManager wifiManager = - (WifiManager) - registrar.context().getApplicationContext().getSystemService(Context.WIFI_SERVICE); - - WifiInfo wifiInfo = null; - if (wifiManager != null) wifiInfo = wifiManager.getConnectionInfo(); + private void setupChannels(BinaryMessenger messenger, Context context) { + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/connectivity"); + eventChannel = new EventChannel(messenger, "plugins.flutter.io/connectivity_status"); + ConnectivityManager connectivityManager = + (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - String ip = null; - int i_ip = 0; - if (wifiInfo != null) i_ip = wifiInfo.getIpAddress(); + Connectivity connectivity = new Connectivity(connectivityManager, wifiManager); - if (i_ip != 0) - ip = - String.format( - "%d.%d.%d.%d", - (i_ip & 0xff), (i_ip >> 8 & 0xff), (i_ip >> 16 & 0xff), (i_ip >> 24 & 0xff)); + ConnectivityMethodChannelHandler methodChannelHandler = + new ConnectivityMethodChannelHandler(connectivity); + ConnectivityBroadcastReceiver receiver = + new ConnectivityBroadcastReceiver(context, connectivity); - result.success(ip); + methodChannel.setMethodCallHandler(methodChannelHandler); + eventChannel.setStreamHandler(receiver); } - private BroadcastReceiver createReceiver(final EventSink events) { - return new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - events.success(checkNetworkType()); - } - }; + private void teardownChannels() { + methodChannel.setMethodCallHandler(null); + eventChannel.setStreamHandler(null); + methodChannel = null; + eventChannel = null; } } diff --git a/packages/connectivity/example/android/app/src/main/AndroidManifest.xml b/packages/connectivity/example/android/app/src/main/AndroidManifest.xml index bf36efe1a689..3bf2ca03bc33 100644 --- a/packages/connectivity/example/android/app/src/main/AndroidManifest.xml +++ b/packages/connectivity/example/android/app/src/main/AndroidManifest.xml @@ -4,12 +4,20 @@ + + + android:theme="@android:style/Theme.Black.NoTitleBar" + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection" + android:hardwareAccelerated="true" + android:windowSoftInputMode="adjustResize"> + diff --git a/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivity_example/MainActivity.java b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1Activity.java similarity index 89% rename from packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivity_example/MainActivity.java rename to packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1Activity.java index 6d76bcc24ac5..587b623c049d 100644 --- a/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivity_example/MainActivity.java +++ b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1Activity.java @@ -8,7 +8,7 @@ import io.flutter.app.FlutterActivity; import io.flutter.plugins.GeneratedPluginRegistrant; -public class MainActivity extends FlutterActivity { +public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java new file mode 100644 index 000000000000..a34755399117 --- /dev/null +++ b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java @@ -0,0 +1,17 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.connectivityexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class EmbeddingV1ActivityTest { + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbeddingV1Activity.class); +} diff --git a/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivity.java b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivity.java new file mode 100644 index 000000000000..b0deb61bfd28 --- /dev/null +++ b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivity.java @@ -0,0 +1,18 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.connectivityexample; + +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.connectivity.ConnectivityPlugin; + +public class MainActivity extends FlutterActivity { + + @Override + public void configureFlutterEngine(FlutterEngine flutterEngine) { + super.configureFlutterEngine(flutterEngine); + flutterEngine.getPlugins().add(new ConnectivityPlugin()); + } +} diff --git a/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivityTest.java b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivityTest.java new file mode 100644 index 000000000000..0c33d6a92f46 --- /dev/null +++ b/packages/connectivity/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/MainActivityTest.java @@ -0,0 +1,15 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.connectivityexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class MainActivityTest { + @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} diff --git a/packages/connectivity/example/android/gradle.properties b/packages/connectivity/example/android/gradle.properties index 8bd86f680510..a6738207fd15 100644 --- a/packages/connectivity/example/android/gradle.properties +++ b/packages/connectivity/example/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true diff --git a/packages/connectivity/example/pubspec.yaml b/packages/connectivity/example/pubspec.yaml index c364782e786c..2f2b6eb68fca 100644 --- a/packages/connectivity/example/pubspec.yaml +++ b/packages/connectivity/example/pubspec.yaml @@ -11,6 +11,7 @@ dev_dependencies: flutter_driver: sdk: flutter test: any + e2e: ^0.2.0 flutter: uses-material-design: true diff --git a/packages/connectivity/example/test_driver/connectivity_test.dart b/packages/connectivity/example/test_driver/connectivity_test.dart deleted file mode 100644 index 2b89c8f2f7bb..000000000000 --- a/packages/connectivity/example/test_driver/connectivity_test.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:test/test.dart'; - -void main() { - test('connectivity', () async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); - }); -} diff --git a/packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart b/packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart new file mode 100644 index 000000000000..d4586bdc7127 --- /dev/null +++ b/packages/connectivity/example/test_driver/test/connectivity_e2e_test.dart @@ -0,0 +1,14 @@ +// 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 'dart:io'; +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); + exit(result == 'pass' ? 0 : 1); +} diff --git a/packages/connectivity/pubspec.yaml b/packages/connectivity/pubspec.yaml index 10a01988db5c..636c43af2fae 100644 --- a/packages/connectivity/pubspec.yaml +++ b/packages/connectivity/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity -version: 0.4.4+1 +version: 0.4.5 flutter: plugin: @@ -22,7 +22,8 @@ dev_dependencies: flutter_driver: sdk: flutter test: any + e2e: ^0.2.0 environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.2.0 <2.0.0" + flutter: ">=1.6.7 <2.0.0" diff --git a/packages/connectivity/example/test_driver/connectivity.dart b/packages/connectivity/test/connectivity_e2e.dart similarity index 68% rename from packages/connectivity/example/test_driver/connectivity.dart rename to packages/connectivity/test/connectivity_e2e.dart index 685f69efb1c8..10c4bda34e0d 100644 --- a/packages/connectivity/example/test_driver/connectivity.dart +++ b/packages/connectivity/test/connectivity_e2e.dart @@ -1,13 +1,14 @@ -import 'dart:async'; +// 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 'dart:io'; -import 'package:flutter_driver/driver_extension.dart'; +import 'package:e2e/e2e.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:connectivity/connectivity.dart'; void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); + E2EWidgetsFlutterBinding.ensureInitialized(); group('Connectivity test driver', () { Connectivity _connectivity; @@ -16,7 +17,7 @@ void main() { _connectivity = Connectivity(); }); - test('test connectivity result', () async { + testWidgets('test connectivity result', (WidgetTester tester) async { final ConnectivityResult result = await _connectivity.checkConnectivity(); expect(result, isNotNull); switch (result) { @@ -30,8 +31,7 @@ void main() { } }); - test('test location methods, iOS only', () async { - print(Platform.isIOS); + testWidgets('test location methods, iOS only', (WidgetTester tester) async { if (Platform.isIOS) { expect((await _connectivity.getLocationServiceAuthorization()), LocationAuthorizationStatus.notDetermined); From 93fe8f78046359e1e5633283e6df809306a3ac2e Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Tue, 15 Oct 2019 12:48:05 -0700 Subject: [PATCH 133/133] [in_app_purchase] Fix iOS build warning (#2192) --- packages/in_app_purchase/CHANGELOG.md | 1 + .../ios/Classes/InAppPurchasePlugin.h | 4 +- .../ios/Classes/InAppPurchasePlugin.m | 83 ++++++++----------- script/lint_darwin_plugins.sh | 1 - 4 files changed, 38 insertions(+), 51 deletions(-) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index 940909b10d0d..1a64a43b314c 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.2.1+5 * Define clang module for iOS. +* Fix iOS build warning. ## 0.2.1+4 diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.h b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.h index 67a381d31283..a7c00f18bc37 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.h +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.h @@ -10,6 +10,8 @@ @property(strong, nonatomic) FIAPaymentQueueHandler *paymentQueueHandler; -- (instancetype)initWithReceiptManager:(FIAPReceiptManager *)receiptManager; +- (instancetype)initWithReceiptManager:(FIAPReceiptManager *)receiptManager + NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; @end diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index eb158338a752..84dd457e7d35 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -13,19 +13,19 @@ @interface InAppPurchasePlugin () // Holding strong references to FIAPRequestHandlers. Remove the handlers from the set after // the request is finished. -@property(strong, nonatomic) NSMutableSet *requestHandlers; +@property(strong, nonatomic, readonly) NSMutableSet *requestHandlers; // After querying the product, the available products will be saved in the map to be used // for purchase. -@property(copy, nonatomic) NSMutableDictionary *productsCache; +@property(strong, nonatomic, readonly) NSMutableDictionary *productsCache; // Call back channel to dart used for when a listener function is triggered. -@property(strong, nonatomic) FlutterMethodChannel *callbackChannel; -@property(strong, nonatomic) NSObject *registry; -@property(strong, nonatomic) NSObject *messenger; -@property(strong, nonatomic) NSObject *registrar; +@property(strong, nonatomic, readonly) FlutterMethodChannel *callbackChannel; +@property(strong, nonatomic, readonly) NSObject *registry; +@property(strong, nonatomic, readonly) NSObject *messenger; +@property(strong, nonatomic, readonly) NSObject *registrar; -@property(strong, nonatomic) FIAPReceiptManager *receiptManager; +@property(strong, nonatomic, readonly) FIAPReceiptManager *receiptManager; @end @@ -40,39 +40,40 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } - (instancetype)initWithReceiptManager:(FIAPReceiptManager *)receiptManager { - self = [self init]; - self.receiptManager = receiptManager; + self = [super init]; + _receiptManager = receiptManager; + _requestHandlers = [NSMutableSet new]; + _productsCache = [NSMutableDictionary new]; return self; } - (instancetype)initWithRegistrar:(NSObject *)registrar { self = [self initWithReceiptManager:[FIAPReceiptManager new]]; - self.registrar = registrar; - self.registry = [registrar textures]; - self.messenger = [registrar messenger]; + _registrar = registrar; + _registry = [registrar textures]; + _messenger = [registrar messenger]; __weak typeof(self) weakSelf = self; - self.paymentQueueHandler = - [[FIAPaymentQueueHandler alloc] initWithQueue:[SKPaymentQueue defaultQueue] - transactionsUpdated:^(NSArray *_Nonnull transactions) { - [weakSelf handleTransactionsUpdated:transactions]; - } - transactionRemoved:^(NSArray *_Nonnull transactions) { - [weakSelf handleTransactionsRemoved:transactions]; - } - restoreTransactionFailed:^(NSError *_Nonnull error) { - [weakSelf handleTransactionRestoreFailed:error]; - } - restoreCompletedTransactionsFinished:^{ - [weakSelf restoreCompletedTransactionsFinished]; - } - shouldAddStorePayment:^BOOL(SKPayment *payment, SKProduct *product) { - return [weakSelf shouldAddStorePayment:payment product:product]; - } - updatedDownloads:^void(NSArray *_Nonnull downloads) { - [weakSelf updatedDownloads:downloads]; - }]; - self.callbackChannel = + _paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:[SKPaymentQueue defaultQueue] + transactionsUpdated:^(NSArray *_Nonnull transactions) { + [weakSelf handleTransactionsUpdated:transactions]; + } + transactionRemoved:^(NSArray *_Nonnull transactions) { + [weakSelf handleTransactionsRemoved:transactions]; + } + restoreTransactionFailed:^(NSError *_Nonnull error) { + [weakSelf handleTransactionRestoreFailed:error]; + } + restoreCompletedTransactionsFinished:^{ + [weakSelf restoreCompletedTransactionsFinished]; + } + shouldAddStorePayment:^BOOL(SKPayment *payment, SKProduct *product) { + return [weakSelf shouldAddStorePayment:payment product:product]; + } + updatedDownloads:^void(NSArray *_Nonnull downloads) { + [weakSelf updatedDownloads:downloads]; + }]; + _callbackChannel = [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/in_app_purchase_callback" binaryMessenger:[registrar messenger]]; return self; @@ -320,20 +321,4 @@ - (SKReceiptRefreshRequest *)getRefreshReceiptRequest:(NSDictionary *)properties return [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:properties]; } -#pragma mark - getter - -- (NSSet *)requestHandlers { - if (!_requestHandlers) { - _requestHandlers = [NSMutableSet new]; - } - return _requestHandlers; -} - -- (NSMutableDictionary *)productsCache { - if (!_productsCache) { - _productsCache = [NSMutableDictionary new]; - } - return _productsCache; -} - @end diff --git a/script/lint_darwin_plugins.sh b/script/lint_darwin_plugins.sh index 3ca9af8b892a..94041c728191 100755 --- a/script/lint_darwin_plugins.sh +++ b/script/lint_darwin_plugins.sh @@ -21,7 +21,6 @@ function lint_package() { # TODO: These packages have analyzer warnings. Remove plugins from this list as issues are fixed. local skip_analysis_packages=( "camera.podspec" # https://github.com/flutter/flutter/issues/42673 - "in_app_purchase.podspec" # https://github.com/flutter/flutter/issues/42679 ) find "${package_dir}" -type f -name "*\.podspec" | while read podspec; do local podspecBasename=$(basename "${podspec}")