diff --git a/packages/flutter_plugin_android_lifecycle/CHANGELOG.md b/packages/flutter_plugin_android_lifecycle/CHANGELOG.md index 19b9d99e7783..fb3d8d83cb62 100644 --- a/packages/flutter_plugin_android_lifecycle/CHANGELOG.md +++ b/packages/flutter_plugin_android_lifecycle/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.2 + +* Adapt to the embedding API changes in https://github.com/flutter/engine/pull/13280 (only supports Activity Lifecycle). + ## 1.0.1 * Register the E2E plugin in the example app. diff --git a/packages/flutter_plugin_android_lifecycle/README.md b/packages/flutter_plugin_android_lifecycle/README.md index 25fff1cbc15f..25f4d9efd056 100644 --- a/packages/flutter_plugin_android_lifecycle/README.md +++ b/packages/flutter_plugin_android_lifecycle/README.md @@ -2,7 +2,7 @@ [![pub package](https://img.shields.io/pub/v/flutter_plugin_android_lifecycle.svg)](https://pub.dartlang.org/packages/flutter_plugin_android_lifecycle) -A Flutter plugin for Android to allow other Flutter plugins to access an Android `Lifecycle` object +A Flutter plugin for Android to allow other Flutter plugins to access Android `Lifecycle` objects in the plugin's binding. The purpose of having this plugin instead of exposing an Android `Lifecycle` object in the engine's @@ -22,14 +22,14 @@ below: import androidx.lifecycle.Lifecycle; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding; import io.flutter.embedding.engine.plugins.lifecycle.FlutterLifecycleAdapter; -public class MyPlugin implements FlutterPlugin { +public class MyPlugin implements FlutterPlugin, ActivityAware { @Override - public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { - Lifecycle lifecycle = new FlutterLifecycleAdapter.getLifecycle(binding); - + public void onAttachedToActivity(ActivityPluginBinding binding) { + Lifecycle lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(binding); // Use lifecycle as desired. } diff --git a/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/embedding/engine/plugins/lifecycle/FlutterLifecycleAdapter.java b/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/embedding/engine/plugins/lifecycle/FlutterLifecycleAdapter.java index 59281cfaf7c3..c55c35c6fa0c 100644 --- a/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/embedding/engine/plugins/lifecycle/FlutterLifecycleAdapter.java +++ b/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/embedding/engine/plugins/lifecycle/FlutterLifecycleAdapter.java @@ -4,12 +4,11 @@ package io.flutter.embedding.engine.plugins.lifecycle; -import static io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.Lifecycle; import io.flutter.Log; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -18,26 +17,18 @@ public class FlutterLifecycleAdapter { private static final String TAG = "FlutterLifecycleAdapter"; /** - * Returns the lifecycle object for the given Flutter plugin binding. + * Returns the lifecycle object for the activity a plugin is bound to. * *

Returns null if the Flutter engine version does not include the lifecycle extraction code. * (this probably means the Flutter engine version is too old). */ @Nullable - public static Lifecycle getLifecycle(@NonNull FlutterPluginBinding pluginBinding) { + public static Lifecycle getActivityLifecycle( + @NonNull ActivityPluginBinding activityPluginBinding) { try { - Object reference = pluginBinding.getLifecycle(); - Class hiddenLifecycleClass = - Class.forName("io.flutter.embedding.engine.plugins.lifecycle.HiddenLifecycleReference"); - - if (!reference.getClass().equals(hiddenLifecycleClass)) { - throw new IllegalArgumentException( - "The reference argument must be of type HiddenLifecycleReference. Was actually " - + reference); - } - - Method getLifecycle = reference.getClass().getMethod("getLifecycle"); - return (Lifecycle) getLifecycle.invoke(reference); + Method getLifecycle = ActivityPluginBinding.class.getMethod("getLifecycle"); + Object hiddenLifecycle = getLifecycle.invoke(activityPluginBinding); + return getHiddenLifecycle(hiddenLifecycle); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException @@ -49,4 +40,30 @@ public static Lifecycle getLifecycle(@NonNull FlutterPluginBinding pluginBinding } return null; } + + // TODO(amirh): add a getter for a Service lifecycle. + // https://github.com/flutter/flutter/issues/43741 + + /** + * Returns the lifecycle object for the given Flutter plugin binding. + * + *

Returns null if the Flutter engine version does not include the lifecycle extraction code. + * (this probably means the Flutter engine version is too old). + */ + @NonNull + private static Lifecycle getHiddenLifecycle(@NonNull Object reference) + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, + ClassNotFoundException { + Class hiddenLifecycleClass = + Class.forName("io.flutter.embedding.engine.plugins.lifecycle.HiddenLifecycleReference"); + + if (!reference.getClass().equals(hiddenLifecycleClass)) { + throw new IllegalArgumentException( + "The reference argument must be of type HiddenLifecycleReference. Was actually " + + reference); + } + + Method getLifecycle = reference.getClass().getMethod("getLifecycle"); + return (Lifecycle) getLifecycle.invoke(reference); + } } diff --git a/packages/flutter_plugin_android_lifecycle/example/android/app/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle_example/MainActivity.java b/packages/flutter_plugin_android_lifecycle/example/android/app/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle_example/MainActivity.java index 35b2d01b6258..2ea33493eb3c 100644 --- a/packages/flutter_plugin_android_lifecycle/example/android/app/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle_example/MainActivity.java +++ b/packages/flutter_plugin_android_lifecycle/example/android/app/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle_example/MainActivity.java @@ -10,6 +10,8 @@ import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; 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; public class MainActivity extends FlutterActivity { @@ -21,11 +23,17 @@ public void configureFlutterEngine(FlutterEngine flutterEngine) { flutterEngine.getPlugins().add(new E2EPlugin()); } - private static class TestPlugin implements FlutterPlugin { + private static class TestPlugin implements FlutterPlugin, ActivityAware { @Override - public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { - Lifecycle lifecycle = FlutterLifecycleAdapter.getLifecycle(flutterPluginBinding); + public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) {} + + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) {} + + @Override + public void onAttachedToActivity(ActivityPluginBinding binding) { + Lifecycle lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(binding); if (lifecycle == null) { Log.d(TAG, "Couldn't obtained Lifecycle!"); @@ -40,6 +48,12 @@ public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { } @Override - public void onDetachedFromEngine(FlutterPluginBinding flutterPluginBinding) {} + public void onDetachedFromActivity() {} + + @Override + public void onDetachedFromActivityForConfigChanges() {} + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {} } } diff --git a/packages/flutter_plugin_android_lifecycle/pubspec.yaml b/packages/flutter_plugin_android_lifecycle/pubspec.yaml index 563c28ee3b77..b934e8af3113 100644 --- a/packages/flutter_plugin_android_lifecycle/pubspec.yaml +++ b/packages/flutter_plugin_android_lifecycle/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_plugin_android_lifecycle description: Flutter plugin for accessing an Android Lifecycle within other plugins. -version: 1.0.1 +version: 1.0.2 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle