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 @@
 
 [![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 @@
 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