From 85dcdd10489330dfc38f3b197dbce062d11f7065 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 17 Dec 2019 21:08:57 -0800 Subject: [PATCH 01/14] refactor --- .../imagepicker/ImagePickerPlugin.java | 233 +++++++++++++----- .../imagepicker/ImagePickerPluginTest.java | 24 +- packages/image_picker/example/pubspec.yaml | 1 + packages/image_picker/pubspec.yaml | 1 + 4 files changed, 182 insertions(+), 77 deletions(-) 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 b495a8e1a33f..e8ae232a297c 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 @@ -10,13 +10,86 @@ import android.os.Environment; import android.os.Handler; import android.os.Looper; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleOwner; +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.embedding.engine.plugins.lifecycle.FlutterLifecycleAdapter; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.PluginRegistry; import java.io.File; -public class ImagePickerPlugin implements MethodChannel.MethodCallHandler { +@SuppressWarnings("deprecation") +public class ImagePickerPlugin + implements MethodChannel.MethodCallHandler, FlutterPlugin, ActivityAware { + + private class LifeCycleObserver + implements Application.ActivityLifecycleCallbacks, DefaultLifecycleObserver { + private final Activity thisActivity; + + LifeCycleObserver(Activity activity) { + this.thisActivity = activity; + } + + @Override + public void onCreate(@NonNull LifecycleOwner owner) {} + + @Override + public void onStart(@NonNull LifecycleOwner owner) {} + + @Override + public void onResume(@NonNull LifecycleOwner owner) {} + + @Override + public void onPause(@NonNull LifecycleOwner owner) {} + + @Override + public void onStop(@NonNull LifecycleOwner owner) { + onActivityStopped(thisActivity); + } + + @Override + public void onDestroy(@NonNull LifecycleOwner owner) { + onActivityDestroyed(thisActivity); + } + + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} + + @Override + public void onActivityStarted(Activity activity) {} + + @Override + public void onActivityResumed(Activity activity) {} + + @Override + public void onActivityPaused(Activity activity) {} + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} + + @Override + public void onActivityDestroyed(Activity activity) { + if (thisActivity == activity && activity.getApplicationContext() != null) { + ((Application) activity.getApplicationContext()) + .unregisterActivityLifecycleCallbacks( + this); // Use getApplicationContext() to avoid casting failures + } + } + + @Override + public void onActivityStopped(Activity activity) { + if (thisActivity == activity) { + delegate.saveStateBeforeResult(); + } + } + } static final String METHOD_CALL_IMAGE = "pickImage"; static final String METHOD_CALL_VIDEO = "pickVideo"; @@ -27,9 +100,15 @@ public class ImagePickerPlugin implements MethodChannel.MethodCallHandler { private static final int SOURCE_CAMERA = 0; private static final int SOURCE_GALLERY = 1; - private final PluginRegistry.Registrar registrar; + private MethodChannel channel; private ImagePickerDelegate delegate; - private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks; + private FlutterPluginBinding pluginBinding; + private ActivityPluginBinding activityBinding; + private Application applicationContext; + private Activity activity; + // This is null when not using v2 embedding; + private Lifecycle lifecycle; + private LifeCycleObserver observer; public static void registerWith(PluginRegistry.Registrar registrar) { if (registrar.activity() == null) { @@ -37,72 +116,110 @@ public static void registerWith(PluginRegistry.Registrar registrar) { // we stop the registering process immediately because the ImagePicker requires an activity. return; } - final ImagePickerCache cache = new ImagePickerCache(registrar.activity()); + Activity activity = registrar.activity(); + Application applicationContext = null; + if (registrar.context() != null) { + applicationContext = (Application) (registrar.context().getApplicationContext()); + } + ImagePickerPlugin plugin = new ImagePickerPlugin(); + plugin.setup(registrar.messenger(), applicationContext, activity, registrar, null); + } - final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); + ImagePickerPlugin() {} - final File externalFilesDirectory = - registrar.activity().getExternalFilesDir(Environment.DIRECTORY_PICTURES); - final ExifDataCopier exifDataCopier = new ExifDataCopier(); - final ImageResizer imageResizer = new ImageResizer(externalFilesDirectory, exifDataCopier); - final ImagePickerDelegate delegate = - new ImagePickerDelegate(registrar.activity(), externalFilesDirectory, imageResizer, cache); + @VisibleForTesting + ImagePickerPlugin(final ImagePickerDelegate delegate, final Activity activity) { + this.delegate = delegate; + this.activity = activity; + } - registrar.addActivityResultListener(delegate); - registrar.addRequestPermissionsResultListener(delegate); - final ImagePickerPlugin instance = new ImagePickerPlugin(registrar, delegate); - channel.setMethodCallHandler(instance); + @Override + public void onAttachedToEngine(FlutterPluginBinding binding) { + pluginBinding = binding; } - @VisibleForTesting - ImagePickerPlugin(final PluginRegistry.Registrar registrar, final ImagePickerDelegate delegate) { - this.registrar = registrar; - this.delegate = delegate; - this.activityLifecycleCallbacks = - new Application.ActivityLifecycleCallbacks() { - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) { + pluginBinding = null; + } - @Override - public void onActivityStarted(Activity activity) {} + @Override + public void onAttachedToActivity(ActivityPluginBinding binding) { + activityBinding = binding; + setup( + pluginBinding.getBinaryMessenger(), + (Application) pluginBinding.getApplicationContext(), + activityBinding.getActivity(), + null, + activityBinding); + } - @Override - public void onActivityResumed(Activity activity) {} + @Override + public void onDetachedFromActivity() { + tearDown(); + } - @Override - public void onActivityPaused(Activity activity) {} + @Override + public void onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity(); + } - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - if (activity == registrar.activity()) { - delegate.saveStateBeforeResult(); - } - } - - @Override - public void onActivityDestroyed(Activity activity) { - if (activity == registrar.activity() - && registrar.activity().getApplicationContext() != null) { - ((Application) registrar.activity().getApplicationContext()) - .unregisterActivityLifecycleCallbacks( - this); // Use getApplicationContext() to avoid casting failures - } - } - - @Override - public void onActivityStopped(Activity activity) {} - }; - - 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. + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) { + onAttachedToActivity(binding); + } + + private void setup( + final BinaryMessenger messenger, + final Application applicationContext, + final Activity activity, + final PluginRegistry.Registrar registrar, + final ActivityPluginBinding activityBinding) { + this.activity = activity; + this.applicationContext = applicationContext; + this.delegate = constructDelegate(activity); + channel = new MethodChannel(messenger, CHANNEL); + channel.setMethodCallHandler(this); + if (registrar != null) { + // V1 embedding setup for activity listeners. + observer = new LifeCycleObserver(activity); + applicationContext.registerActivityLifecycleCallbacks( + observer); // Use getApplicationContext() to avoid casting failures. + registrar.addActivityResultListener(delegate); + registrar.addRequestPermissionsResultListener(delegate); + } else { + // V2 embedding setup for activity listeners. + activityBinding.addActivityResultListener(delegate); + activityBinding.addRequestPermissionsResultListener(delegate); + lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(activityBinding); + observer = new LifeCycleObserver(activity); + lifecycle.addObserver(observer); } } + private void tearDown() { + activityBinding.removeActivityResultListener(delegate); + activityBinding.removeRequestPermissionsResultListener(delegate); + activityBinding = null; + lifecycle.removeObserver(observer); + lifecycle = null; + delegate = null; + channel.setMethodCallHandler(null); + channel = null; + applicationContext.unregisterActivityLifecycleCallbacks(observer); + applicationContext = null; + } + + private final ImagePickerDelegate constructDelegate(final Activity setupActivity) { + final ImagePickerCache cache = new ImagePickerCache(setupActivity); + + final File externalFilesDirectory = + setupActivity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); + final ExifDataCopier exifDataCopier = new ExifDataCopier(); + final ImageResizer imageResizer = new ImageResizer(externalFilesDirectory, exifDataCopier); + return new ImagePickerDelegate(setupActivity, externalFilesDirectory, imageResizer, cache); + } + // MethodChannel.Result wrapper that responds on the platform thread. private static class MethodResultWrapper implements MethodChannel.Result { private MethodChannel.Result methodResult; @@ -150,7 +267,7 @@ public void run() { @Override public void onMethodCall(MethodCall call, MethodChannel.Result rawResult) { - if (registrar.activity() == null) { + if (activity == null) { rawResult.error("no_activity", "image_picker plugin requires a foreground activity.", null); return; } 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 94a81d3d3eac..acfd0648e763 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 @@ -40,16 +40,15 @@ public void setUp() { MockitoAnnotations.initMocks(this); when(mockRegistrar.context()).thenReturn(mockApplication); - plugin = new ImagePickerPlugin(mockRegistrar, mockImagePickerDelegate); + plugin = new ImagePickerPlugin(mockImagePickerDelegate, mockActivity); } @Test public void onMethodCall_WhenActivityIsNull_FinishesWithForegroundActivityRequiredError() { - when(mockRegistrar.activity()).thenReturn(null); MethodCall call = buildMethodCall(SOURCE_GALLERY); - - plugin.onMethodCall(call, mockResult); - + ImagePickerPlugin imagePickerPluginWithNullActivity = + new ImagePickerPlugin(mockImagePickerDelegate, null); + imagePickerPluginWithNullActivity.onMethodCall(call, mockResult); verify(mockResult) .error("no_activity", "image_picker plugin requires a foreground activity.", null); verifyZeroInteractions(mockImagePickerDelegate); @@ -57,46 +56,34 @@ public void onMethodCall_WhenActivityIsNull_FinishesWithForegroundActivityRequir @Test public void onMethodCall_WhenCalledWithUnknownMethod_ThrowsException() { - when(mockRegistrar.activity()).thenReturn(mockActivity); exception.expect(IllegalArgumentException.class); exception.expectMessage("Unknown method test"); - plugin.onMethodCall(new MethodCall("test", null), mockResult); - verifyZeroInteractions(mockImagePickerDelegate); verifyZeroInteractions(mockResult); } @Test public void onMethodCall_WhenCalledWithUnknownImageSource_ThrowsException() { - when(mockRegistrar.activity()).thenReturn(mockActivity); exception.expect(IllegalArgumentException.class); exception.expectMessage("Invalid image source: -1"); - plugin.onMethodCall(buildMethodCall(-1), mockResult); - verifyZeroInteractions(mockImagePickerDelegate); verifyZeroInteractions(mockResult); } @Test public void onMethodCall_WhenSourceIsGallery_InvokesChooseImageFromGallery() { - when(mockRegistrar.activity()).thenReturn(mockActivity); MethodCall call = buildMethodCall(SOURCE_GALLERY); - plugin.onMethodCall(call, mockResult); - verify(mockImagePickerDelegate).chooseImageFromGallery(eq(call), any()); verifyZeroInteractions(mockResult); } @Test public void onMethodCall_WhenSourceIsCamera_InvokesTakeImageWithCamera() { - when(mockRegistrar.activity()).thenReturn(mockActivity); MethodCall call = buildMethodCall(SOURCE_CAMERA); - plugin.onMethodCall(call, mockResult); - verify(mockImagePickerDelegate).takeImageWithCamera(eq(call), any()); verifyZeroInteractions(mockResult); } @@ -111,8 +98,7 @@ public void onResiter_WhenAcitivityIsNull_ShouldNotCrash() { @Test public void onConstructor_WhenContextTypeIsActivity_ShouldNotCrash() { - when(mockRegistrar.context()).thenReturn(mockActivity); - new ImagePickerPlugin(mockRegistrar, mockImagePickerDelegate); + new ImagePickerPlugin(mockImagePickerDelegate, mockActivity); assertTrue( "No exception thrown when ImagePickerPlugin() ran with context instanceof Activity", true); } diff --git a/packages/image_picker/example/pubspec.yaml b/packages/image_picker/example/pubspec.yaml index 1f793d7aa91f..900479375a94 100755 --- a/packages/image_picker/example/pubspec.yaml +++ b/packages/image_picker/example/pubspec.yaml @@ -8,6 +8,7 @@ dependencies: sdk: flutter image_picker: path: ../ + flutter_plugin_android_lifecycle: ^1.0.2 flutter: uses-material-design: true diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index 217764c0f21a..48179acf6b21 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -16,6 +16,7 @@ flutter: dependencies: flutter: sdk: flutter + flutter_plugin_android_lifecycle: ^1.0.2 dev_dependencies: video_player: 0.10.1+5 From 096f20bf70ca7990215c5764cdaa67adac1579cf Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 17 Dec 2019 21:37:08 -0800 Subject: [PATCH 02/14] update version --- packages/image_picker/CHANGELOG.md | 4 ++++ packages/image_picker/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index 6592c9ee4c1a..3fb9c6714254 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.3 + +* place holder + ## 0.6.2+3 * Remove the deprecated `author:` field from pubspec.yaml * Migrate the plugin to the pubspec platforms manifest. diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index 48179acf6b21..d37dad475faa 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker -version: 0.6.2+3 +version: 0.6.3 flutter: plugin: From 183115df3bd4105c3205476e510525ae9b833f5e Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 19 Dec 2019 10:55:55 -0800 Subject: [PATCH 03/14] add e2e test --- packages/image_picker/android/build.gradle | 26 +++++++++++++++++++ .../imagepicker/ImagePickerPlugin.java | 2 +- .../android/app/src/main/AndroidManifest.xml | 8 +++++- .../EmbeddingV1Activity.java | 17 ++++++++++++ .../EmbeddingV1ActivityTest.java | 17 ++++++++++++ .../imagepickerexample/MainActivity.java | 21 +++++++++------ .../imagepickerexample/MainActivityTest.java | 15 +++++++++++ packages/image_picker/example/pubspec.yaml | 10 ++++++- .../test_driver/image_picker_e2e_test.dart | 15 +++++++++++ packages/image_picker/pubspec.yaml | 3 ++- .../image_picker/test/image_picker_e2e.dart | 5 ++++ 11 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1Activity.java create mode 100644 packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1ActivityTest.java create mode 100644 packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java create mode 100644 packages/image_picker/example/test_driver/image_picker_e2e_test.dart create mode 100644 packages/image_picker/test/image_picker_e2e.dart diff --git a/packages/image_picker/android/build.gradle b/packages/image_picker/android/build.gradle index 19f14a286a61..eb13fa7fdf8b 100755 --- a/packages/image_picker/android/build.gradle +++ b/packages/image_picker/android/build.gradle @@ -39,3 +39,29 @@ android { implementation 'androidx.annotation:annotation:1.0.0' } } + +// TODO(cyanglaz): 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 = "1.1.1" + compileOnly "android.arch.lifecycle:runtime:$lifecycle_version" + compileOnly "android.arch.lifecycle:common:$lifecycle_version" + compileOnly "android.arch.lifecycle:common-java8:$lifecycle_version" + } + } + } +} \ No newline at end of file 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 e8ae232a297c..779405b1b5a1 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 @@ -125,7 +125,7 @@ public static void registerWith(PluginRegistry.Registrar registrar) { plugin.setup(registrar.messenger(), applicationContext, activity, registrar, null); } - ImagePickerPlugin() {} + public ImagePickerPlugin() {} @VisibleForTesting ImagePickerPlugin(final ImagePickerDelegate delegate, final Activity activity) { diff --git a/packages/image_picker/example/android/app/src/main/AndroidManifest.xml b/packages/image_picker/example/android/app/src/main/AndroidManifest.xml index fa2b500d6904..5a46f5ca9575 100755 --- a/packages/image_picker/example/android/app/src/main/AndroidManifest.xml +++ b/packages/image_picker/example/android/app/src/main/AndroidManifest.xml @@ -5,7 +5,6 @@ + + diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1Activity.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1Activity.java new file mode 100644 index 000000000000..3e78492f703f --- /dev/null +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/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.imagepickerexample; + +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); + } +} \ No newline at end of file diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1ActivityTest.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1ActivityTest.java new file mode 100644 index 000000000000..c3aa01ecc06e --- /dev/null +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/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.imagepickerexample; + +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); +} \ No newline at end of file diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java index 4690ebce064a..aa5ec1345ceb 100644 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java @@ -1,18 +1,23 @@ -// 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.imagepickerexample; -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.imagepicker.ImagePickerPlugin; +import io.flutter.plugins.videoplayer.VideoPlayerPlugin; public class MainActivity extends FlutterActivity { + // TODO(cyanglaz): 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) { + super.configureFlutterEngine(flutterEngine); + flutterEngine.getPlugins().add(new ImagePickerPlugin()); + flutterEngine.getPlugins().add(new VideoPlayerPlugin()); } -} +} \ No newline at end of file diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java new file mode 100644 index 000000000000..8677ff9edaf9 --- /dev/null +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/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.imagepickerexample; + +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); +} \ No newline at end of file diff --git a/packages/image_picker/example/pubspec.yaml b/packages/image_picker/example/pubspec.yaml index 900479375a94..278775ce47c6 100755 --- a/packages/image_picker/example/pubspec.yaml +++ b/packages/image_picker/example/pubspec.yaml @@ -3,13 +3,21 @@ description: Demonstrates how to use the image_picker plugin. author: Flutter Team dependencies: - video_player: 0.10.1+5 + video_player: ^0.10.3 flutter: sdk: flutter image_picker: path: ../ flutter_plugin_android_lifecycle: ^1.0.2 +dev_dependencies: + flutter_driver: + sdk: flutter + e2e: ^0.2.1 + flutter: uses-material-design: true +environment: + sdk: ">=2.0.0-dev.28.0 <3.0.0" + flutter: ">=1.10.0 <2.0.0" \ No newline at end of file diff --git a/packages/image_picker/example/test_driver/image_picker_e2e_test.dart b/packages/image_picker/example/test_driver/image_picker_e2e_test.dart new file mode 100644 index 000000000000..8934b450a178 --- /dev/null +++ b/packages/image_picker/example/test_driver/image_picker_e2e_test.dart @@ -0,0 +1,15 @@ +// 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/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); + await driver.close(); + exit(result == 'pass' ? 0 : 1); +} \ No newline at end of file diff --git a/packages/image_picker/pubspec.yaml b/packages/image_picker/pubspec.yaml index d37dad475faa..5b88c7187bb8 100755 --- a/packages/image_picker/pubspec.yaml +++ b/packages/image_picker/pubspec.yaml @@ -19,9 +19,10 @@ dependencies: flutter_plugin_android_lifecycle: ^1.0.2 dev_dependencies: - video_player: 0.10.1+5 + video_player: ^0.10.3 flutter_test: sdk: flutter + e2e: ^0.2.1 environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" diff --git a/packages/image_picker/test/image_picker_e2e.dart b/packages/image_picker/test/image_picker_e2e.dart new file mode 100644 index 000000000000..636297fdc686 --- /dev/null +++ b/packages/image_picker/test/image_picker_e2e.dart @@ -0,0 +1,5 @@ +import 'package:e2e/e2e.dart'; + +void main() { + E2EWidgetsFlutterBinding.ensureInitialized(); +} \ No newline at end of file From 21be6dfb5db4f49b24bbf3d97367d74493e09c02 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 19 Dec 2019 10:56:21 -0800 Subject: [PATCH 04/14] formatting --- .../imagepickerexample/EmbeddingV1Activity.java | 12 ++++++------ .../imagepickerexample/EmbeddingV1ActivityTest.java | 8 ++++---- .../plugins/imagepickerexample/MainActivity.java | 2 +- .../plugins/imagepickerexample/MainActivityTest.java | 4 ++-- .../example/test_driver/image_picker_e2e_test.dart | 2 +- packages/image_picker/test/image_picker_e2e.dart | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1Activity.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1Activity.java index 3e78492f703f..79c1ca6590cc 100644 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1Activity.java +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1Activity.java @@ -9,9 +9,9 @@ import io.flutter.plugins.GeneratedPluginRegistrant; public class EmbeddingV1Activity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} \ No newline at end of file + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1ActivityTest.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1ActivityTest.java index c3aa01ecc06e..924cf2fdb93c 100644 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1ActivityTest.java +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/EmbeddingV1ActivityTest.java @@ -11,7 +11,7 @@ @RunWith(FlutterRunner.class) public class EmbeddingV1ActivityTest { - @Rule - public ActivityTestRule rule = - new ActivityTestRule<>(EmbeddingV1Activity.class); -} \ No newline at end of file + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbeddingV1Activity.class); +} diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java index aa5ec1345ceb..c394a65c22e1 100644 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java @@ -20,4 +20,4 @@ public void configureFlutterEngine(FlutterEngine flutterEngine) { flutterEngine.getPlugins().add(new ImagePickerPlugin()); flutterEngine.getPlugins().add(new VideoPlayerPlugin()); } -} \ No newline at end of file +} diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java index 8677ff9edaf9..3475329aedf7 100644 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java @@ -11,5 +11,5 @@ @RunWith(FlutterRunner.class) public class MainActivityTest { - @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); -} \ No newline at end of file + @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} diff --git a/packages/image_picker/example/test_driver/image_picker_e2e_test.dart b/packages/image_picker/example/test_driver/image_picker_e2e_test.dart index 8934b450a178..f3aa9e218d82 100644 --- a/packages/image_picker/example/test_driver/image_picker_e2e_test.dart +++ b/packages/image_picker/example/test_driver/image_picker_e2e_test.dart @@ -12,4 +12,4 @@ Future main() async { await driver.requestData(null, timeout: const Duration(minutes: 1)); await driver.close(); exit(result == 'pass' ? 0 : 1); -} \ No newline at end of file +} diff --git a/packages/image_picker/test/image_picker_e2e.dart b/packages/image_picker/test/image_picker_e2e.dart index 636297fdc686..b19e37dd6541 100644 --- a/packages/image_picker/test/image_picker_e2e.dart +++ b/packages/image_picker/test/image_picker_e2e.dart @@ -2,4 +2,4 @@ import 'package:e2e/e2e.dart'; void main() { E2EWidgetsFlutterBinding.ensureInitialized(); -} \ No newline at end of file +} From 20b27e415dfa309ee97f4a37d15c64b950ada6d6 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 19 Dec 2019 11:18:37 -0800 Subject: [PATCH 05/14] add e2e_test --- .../example/test_driver/{ => test}/image_picker_e2e_test.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/image_picker/example/test_driver/{ => test}/image_picker_e2e_test.dart (100%) diff --git a/packages/image_picker/example/test_driver/image_picker_e2e_test.dart b/packages/image_picker/example/test_driver/test/image_picker_e2e_test.dart similarity index 100% rename from packages/image_picker/example/test_driver/image_picker_e2e_test.dart rename to packages/image_picker/example/test_driver/test/image_picker_e2e_test.dart From 4bed27b36b90faa2761c2b09ddf05e25ab54262e Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 19 Dec 2019 11:23:40 -0800 Subject: [PATCH 06/14] fix analyze error --- packages/image_picker/example/lib/main.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/example/lib/main.dart b/packages/image_picker/example/lib/main.dart index 3ece64b13d65..919c8388266f 100755 --- a/packages/image_picker/example/lib/main.dart +++ b/packages/image_picker/example/lib/main.dart @@ -305,13 +305,13 @@ class _MyHomePageState extends State { FlatButton( child: const Text('PICK'), onPressed: () { - double width = maxWidthController.text.length > 0 + double width = maxWidthController.text.isNotEmpty ? double.parse(maxWidthController.text) : null; - double height = maxHeightController.text.length > 0 + double height = maxHeightController.text.isNotEmpty ? double.parse(maxHeightController.text) : null; - int quality = qualityController.text.length > 0 + int quality = qualityController.text.isNotEmpty ? int.parse(qualityController.text) : null; onPick(width, height, quality); From 388c6947cb40ca72aa584bff4457e8b0f7a11ebe Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 19 Dec 2019 11:46:14 -0800 Subject: [PATCH 07/14] update CHANGELOG --- packages/image_picker/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/CHANGELOG.md b/packages/image_picker/CHANGELOG.md index 3fb9c6714254..bd0c28971a1b 100644 --- a/packages/image_picker/CHANGELOG.md +++ b/packages/image_picker/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.6.3 -* place holder +* Support Android V2 embedding. +* Migrate to using the new e2e test binding. ## 0.6.2+3 * Remove the deprecated `author:` field from pubspec.yaml From e3bbcffa2b7db326c21ddddaef30257058a287c4 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 23 Dec 2019 09:09:33 -0800 Subject: [PATCH 08/14] javadocs --- .../io/flutter/plugins/imagepicker/ImagePickerDelegate.java | 1 + .../io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 6 ++++++ 2 files changed, 7 insertions(+) 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 e34a3b5632c0..f2a0b02c821d 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 @@ -199,6 +199,7 @@ public void onScanCompleted(String path, Uri uri) { this.cache = cache; } + // Save the state of the image picker so it can be retrieved with `retrieveLostImage`. void saveStateBeforeResult() { if (methodCall == null) { return; 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 779405b1b5a1..2089a12fc03e 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 @@ -125,6 +125,12 @@ public static void registerWith(PluginRegistry.Registrar registrar) { plugin.setup(registrar.messenger(), applicationContext, activity, registrar, null); } + /** + * Default constructor for the plugin. + * + * Use this constructor for production code. + */ + // See also: * {@link #ImagePickerPlugin(ImagePickerDelegate, Activity)} for testing. public ImagePickerPlugin() {} @VisibleForTesting From 3d53b8a41a6cdf3dc3708695941d6828722f4643 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 23 Dec 2019 09:10:10 -0800 Subject: [PATCH 09/14] formatting --- .../java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2089a12fc03e..2db8052b5946 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 @@ -128,7 +128,7 @@ public static void registerWith(PluginRegistry.Registrar registrar) { /** * Default constructor for the plugin. * - * Use this constructor for production code. + *

Use this constructor for production code. */ // See also: * {@link #ImagePickerPlugin(ImagePickerDelegate, Activity)} for testing. public ImagePickerPlugin() {} From 87d5ad2d0e24c614943faf2ed6625ab318e96b38 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 6 Jan 2020 11:10:10 -0800 Subject: [PATCH 10/14] Update pubspec.yaml --- packages/image_picker/example/pubspec.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/example/pubspec.yaml b/packages/image_picker/example/pubspec.yaml index 278775ce47c6..b84ee9fc08a4 100755 --- a/packages/image_picker/example/pubspec.yaml +++ b/packages/image_picker/example/pubspec.yaml @@ -20,4 +20,5 @@ flutter: environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.10.0 <2.0.0" \ No newline at end of file + flutter: ">=1.10.0 <2.0.0" + From d7598652bc2817a00e01ece0419fddc56259752e Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 7 Jan 2020 10:08:25 -0800 Subject: [PATCH 11/14] Update build.gradle --- packages/image_picker/android/build.gradle | 26 ---------------------- 1 file changed, 26 deletions(-) diff --git a/packages/image_picker/android/build.gradle b/packages/image_picker/android/build.gradle index eb13fa7fdf8b..19f14a286a61 100755 --- a/packages/image_picker/android/build.gradle +++ b/packages/image_picker/android/build.gradle @@ -39,29 +39,3 @@ android { implementation 'androidx.annotation:annotation:1.0.0' } } - -// TODO(cyanglaz): 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 = "1.1.1" - compileOnly "android.arch.lifecycle:runtime:$lifecycle_version" - compileOnly "android.arch.lifecycle:common:$lifecycle_version" - compileOnly "android.arch.lifecycle:common-java8:$lifecycle_version" - } - } - } -} \ No newline at end of file From aea3acdea4f879ec54519e7bd556e5c0e0172a88 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 7 Jan 2020 11:19:34 -0800 Subject: [PATCH 12/14] review fixes 1 --- .../imagepicker/ImagePickerPlugin.java | 29 +++++++------------ .../android/app/src/main/AndroidManifest.xml | 2 +- .../FlutterActivityTest.java | 13 +++++++++ .../imagepickerexample/MainActivity.java | 23 --------------- .../imagepickerexample/MainActivityTest.java | 15 ---------- 5 files changed, 25 insertions(+), 57 deletions(-) create mode 100644 packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/FlutterActivityTest.java delete mode 100644 packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java delete mode 100644 packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java 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 2db8052b5946..5e7334dc5ab6 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 @@ -37,12 +37,6 @@ private class LifeCycleObserver this.thisActivity = activity; } - @Override - public void onCreate(@NonNull LifecycleOwner owner) {} - - @Override - public void onStart(@NonNull LifecycleOwner owner) {} - @Override public void onResume(@NonNull LifecycleOwner owner) {} @@ -104,7 +98,7 @@ public void onActivityStopped(Activity activity) { private ImagePickerDelegate delegate; private FlutterPluginBinding pluginBinding; private ActivityPluginBinding activityBinding; - private Application applicationContext; + private Application application; private Activity activity; // This is null when not using v2 embedding; private Lifecycle lifecycle; @@ -117,12 +111,12 @@ public static void registerWith(PluginRegistry.Registrar registrar) { return; } Activity activity = registrar.activity(); - Application applicationContext = null; + Application application = null; if (registrar.context() != null) { - applicationContext = (Application) (registrar.context().getApplicationContext()); + application = (Application) (registrar.context().getApplicationContext()); } ImagePickerPlugin plugin = new ImagePickerPlugin(); - plugin.setup(registrar.messenger(), applicationContext, activity, registrar, null); + plugin.setup(registrar.messenger(), application, activity, registrar, null); } /** @@ -177,20 +171,20 @@ public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding private void setup( final BinaryMessenger messenger, - final Application applicationContext, + final Application application, final Activity activity, final PluginRegistry.Registrar registrar, final ActivityPluginBinding activityBinding) { this.activity = activity; - this.applicationContext = applicationContext; + this.application = application; this.delegate = constructDelegate(activity); channel = new MethodChannel(messenger, CHANNEL); channel.setMethodCallHandler(this); + observer = new LifeCycleObserver(activity); if (registrar != null) { // V1 embedding setup for activity listeners. - observer = new LifeCycleObserver(activity); - applicationContext.registerActivityLifecycleCallbacks( - observer); // Use getApplicationContext() to avoid casting failures. + application.registerActivityLifecycleCallbacks( + observer); registrar.addActivityResultListener(delegate); registrar.addRequestPermissionsResultListener(delegate); } else { @@ -198,7 +192,6 @@ private void setup( activityBinding.addActivityResultListener(delegate); activityBinding.addRequestPermissionsResultListener(delegate); lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(activityBinding); - observer = new LifeCycleObserver(activity); lifecycle.addObserver(observer); } } @@ -212,8 +205,8 @@ private void tearDown() { delegate = null; channel.setMethodCallHandler(null); channel = null; - applicationContext.unregisterActivityLifecycleCallbacks(observer); - applicationContext = null; + application.unregisterActivityLifecycleCallbacks(observer); + application = null; } private final ImagePickerDelegate constructDelegate(final Activity setupActivity) { diff --git a/packages/image_picker/example/android/app/src/main/AndroidManifest.xml b/packages/image_picker/example/android/app/src/main/AndroidManifest.xml index 5a46f5ca9575..5de9f044dd84 100755 --- a/packages/image_picker/example/android/app/src/main/AndroidManifest.xml +++ b/packages/image_picker/example/android/app/src/main/AndroidManifest.xml @@ -4,7 +4,7 @@ - rule = new ActivityTestRule<>(FlutterActivity.class); +} \ No newline at end of file diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java deleted file mode 100644 index c394a65c22e1..000000000000 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivity.java +++ /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. - -package io.flutter.plugins.imagepickerexample; - -import io.flutter.embedding.android.FlutterActivity; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.plugins.imagepicker.ImagePickerPlugin; -import io.flutter.plugins.videoplayer.VideoPlayerPlugin; - -public class MainActivity extends FlutterActivity { - - // TODO(cyanglaz): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. - // https://github.com/flutter/flutter/issues/42694 - @Override - public void configureFlutterEngine(FlutterEngine flutterEngine) { - super.configureFlutterEngine(flutterEngine); - flutterEngine.getPlugins().add(new ImagePickerPlugin()); - flutterEngine.getPlugins().add(new VideoPlayerPlugin()); - } -} diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.java deleted file mode 100644 index 3475329aedf7..000000000000 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/MainActivityTest.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.imagepickerexample; - -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); -} From 51c63c1dbf477ca36ec36b13b86b43571357dc30 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 7 Jan 2020 13:04:33 -0800 Subject: [PATCH 13/14] put back removed methods --- .../io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 5e7334dc5ab6..3a9bce92af1e 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 @@ -37,6 +37,12 @@ private class LifeCycleObserver this.thisActivity = activity; } + @Override + public void onCreate(@NonNull LifecycleOwner owner) {} + + @Override + public void onStart(@NonNull LifecycleOwner owner) {} + @Override public void onResume(@NonNull LifecycleOwner owner) {} From e5ce26fd4974ccd07f6c25646502e2121bd1a425 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 7 Jan 2020 13:11:02 -0800 Subject: [PATCH 14/14] formatting --- .../io/flutter/plugins/imagepicker/ImagePickerPlugin.java | 3 +-- .../plugins/imagepickerexample/FlutterActivityTest.java | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) 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 3a9bce92af1e..950304c9c9e7 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 @@ -189,8 +189,7 @@ private void setup( observer = new LifeCycleObserver(activity); if (registrar != null) { // V1 embedding setup for activity listeners. - application.registerActivityLifecycleCallbacks( - observer); + application.registerActivityLifecycleCallbacks(observer); registrar.addActivityResultListener(delegate); registrar.addRequestPermissionsResultListener(delegate); } else { diff --git a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/FlutterActivityTest.java b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/FlutterActivityTest.java index d550d7c6334a..df9794c8748f 100644 --- a/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/FlutterActivityTest.java +++ b/packages/image_picker/example/android/app/src/main/java/io/flutter/plugins/imagepickerexample/FlutterActivityTest.java @@ -8,6 +8,6 @@ @RunWith(FlutterRunner.class) public class FlutterActivityTest { - @Rule - public ActivityTestRule rule = new ActivityTestRule<>(FlutterActivity.class); -} \ No newline at end of file + @Rule + public ActivityTestRule rule = new ActivityTestRule<>(FlutterActivity.class); +}