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 @@ [](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