Adapt the FlutterLifecycleAdapter to the new embedding API (#2243)
diff --git a/packages/flutter_plugin_android_lifecycle/CHANGELOG.md b/packages/flutter_plugin_android_lifecycle/CHANGELOG.md
index 19b9d99..fb3d8d8 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 25fff1c..25f4d9e 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 @@
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 59281cf..c55c35c 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 @@
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.
*
* <p>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 @@
}
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.
+ *
+ * <p>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 35b2d01..2ea3349 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 @@
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 @@
}
@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 563c28e..b934e8a 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 <flutter-dev@googlegroups.com>
homepage: https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle