Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/flutter_plugin_android_lifecycle/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
10 changes: 5 additions & 5 deletions packages/flutter_plugin_android_lifecycle/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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.
*
* <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
Expand All @@ -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.
*
* <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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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!");
Expand All @@ -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) {}
}
}
2 changes: 1 addition & 1 deletion packages/flutter_plugin_android_lifecycle/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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 <[email protected]>
homepage: https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle

Expand Down