From 1c2daa23499f0a82ae83e9ad6c9d7d2c6a17889d Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Mon, 30 Sep 2019 19:51:15 -0700 Subject: [PATCH 1/5] Rework lifecycle reference provided to plugins to force plugins to use another plugin to dereference a Lifecycle object. --- shell/platform/android/BUILD.gn | 12 ++++++---- .../engine/plugins/FlutterPlugin.java | 13 ++++++----- .../lifecycle/ConcreteLifecycleReference.java | 22 +++++++++++++++++++ .../plugins/lifecycle/LifecycleReference.java | 15 +++++++++++++ 4 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java create mode 100644 shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index c2f3d1f41e32f..8c5a48681e885 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -149,10 +149,6 @@ android_java_sources = [ "io/flutter/embedding/engine/dart/DartExecutor.java", "io/flutter/embedding/engine/dart/DartMessenger.java", "io/flutter/embedding/engine/dart/PlatformMessageHandler.java", - "io/flutter/embedding/engine/loader/FlutterLoader.java", - "io/flutter/embedding/engine/loader/ResourceCleaner.java", - "io/flutter/embedding/engine/loader/ResourceExtractor.java", - "io/flutter/embedding/engine/loader/ResourcePaths.java", "io/flutter/embedding/engine/plugins/FlutterPlugin.java", "io/flutter/embedding/engine/plugins/PluginRegistry.java", "io/flutter/embedding/engine/plugins/activity/ActivityAware.java", @@ -164,6 +160,8 @@ android_java_sources = [ "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderAware.java", "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderControlSurface.java", "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderPluginBinding.java", + "io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java", + "io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java", "io/flutter/embedding/engine/plugins/service/ServiceAware.java", "io/flutter/embedding/engine/plugins/service/ServiceControlSurface.java", "io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java", @@ -222,6 +220,12 @@ android_java_sources = [ "io/flutter/view/FlutterNativeView.java", "io/flutter/view/FlutterRunArguments.java", "io/flutter/view/FlutterView.java", + "io/flutter/view/ResourceCleaner.java", + "io/flutter/view/ResourceExtractor.java", + "io/flutter/view/ResourcePaths.java", + "io/flutter/view/ResourceCleaner.java", + "io/flutter/view/ResourceExtractor.java", + "io/flutter/view/ResourcePaths.java", "io/flutter/view/TextureRegistry.java", "io/flutter/view/VsyncWaiter.java", ] diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java b/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java index 3202d15dd45c8..566db15a50dd6 100644 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java @@ -10,6 +10,8 @@ import android.support.annotation.NonNull; import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.plugins.lifecycle.ConcreteLifecycleReference; +import io.flutter.embedding.engine.plugins.lifecycle.LifecycleReference; /** * Interface to be implemented by all Flutter plugins. @@ -93,10 +95,10 @@ public interface FlutterPlugin { * concerned about which Android Component is currently holding the {@link FlutterEngine}. * TODO(mattcarroll): add info about ActivityAware and ServiceAware for plugins that care. */ - class FlutterPluginBinding implements LifecycleOwner { + class FlutterPluginBinding { private final Context applicationContext; private final FlutterEngine flutterEngine; - private final Lifecycle lifecycle; + private final ConcreteLifecycleReference concreteLifecycleReference; public FlutterPluginBinding( @NonNull Context applicationContext, @@ -105,7 +107,7 @@ public FlutterPluginBinding( ) { this.applicationContext = applicationContext; this.flutterEngine = flutterEngine; - this.lifecycle = lifecycle; + this.concreteLifecycleReference = new ConcreteLifecycleReference(lifecycle); } @NonNull @@ -118,10 +120,9 @@ public FlutterEngine getFlutterEngine() { return flutterEngine; } - @Override @NonNull - public Lifecycle getLifecycle() { - return lifecycle; + public LifecycleReference getLifecycle() { + return concreteLifecycleReference; } } } diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java new file mode 100644 index 0000000000000..3722e78d034b8 --- /dev/null +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java @@ -0,0 +1,22 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.embedding.engine.plugins.lifecycle; + +import android.arch.lifecycle.Lifecycle; +import android.support.annotation.NonNull; + +public class ConcreteLifecycleReference implements LifecycleReference { + @NonNull + private final Lifecycle lifecycle; + + public ConcreteLifecycleReference(@NonNull Lifecycle lifecycle) { + this.lifecycle = lifecycle; + } + + @NonNull + public Lifecycle getLifecycle() { + return lifecycle; + } +} diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java new file mode 100644 index 0000000000000..91d84cb2564ba --- /dev/null +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java @@ -0,0 +1,15 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.embedding.engine.plugins.lifecycle; + +/** + * Marker interface used to denote a Flutter object that provides access to an Android lifecycle. + *

+ * To make use of an instance of {@code LifecycleReference}, include flutter_android_lifecycle + * as a project dependency and then pass your {@code LifecycleReference} to a new instance of a + * {@code FlutterLifecycleAdapter}. + */ +public interface LifecycleReference { +} From 6c046b95069c9515d6936ebca05d168c1f8263cf Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Tue, 1 Oct 2019 16:16:54 -0700 Subject: [PATCH 2/5] PR Updates. --- ci/licenses_golden/licenses_flutter | 1 + shell/platform/android/BUILD.gn | 6 +--- .../engine/plugins/FlutterPlugin.java | 12 +++---- .../lifecycle/ConcreteLifecycleReference.java | 22 ------------- .../lifecycle/HiddenLifecycleReference.java | 31 +++++++++++++++++++ .../plugins/lifecycle/LifecycleReference.java | 15 --------- 6 files changed, 38 insertions(+), 49 deletions(-) delete mode 100644 shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java create mode 100644 shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java delete mode 100644 shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 12d3b72cb894b..d4da90cfefd7c 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -612,6 +612,7 @@ FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugin FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugins/contentprovider/ContentProviderAware.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugins/contentprovider/ContentProviderControlSurface.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugins/contentprovider/ContentProviderPluginBinding.java +FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugins/service/ServiceAware.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugins/service/ServiceControlSurface.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index 8c5a48681e885..57467bfe6581f 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -160,8 +160,7 @@ android_java_sources = [ "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderAware.java", "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderControlSurface.java", "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderPluginBinding.java", - "io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java", - "io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java", + "io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java", "io/flutter/embedding/engine/plugins/service/ServiceAware.java", "io/flutter/embedding/engine/plugins/service/ServiceControlSurface.java", "io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java", @@ -223,9 +222,6 @@ android_java_sources = [ "io/flutter/view/ResourceCleaner.java", "io/flutter/view/ResourceExtractor.java", "io/flutter/view/ResourcePaths.java", - "io/flutter/view/ResourceCleaner.java", - "io/flutter/view/ResourceExtractor.java", - "io/flutter/view/ResourcePaths.java", "io/flutter/view/TextureRegistry.java", "io/flutter/view/VsyncWaiter.java", ] diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java b/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java index 566db15a50dd6..356ec9be406b6 100644 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/FlutterPlugin.java @@ -5,13 +5,11 @@ package io.flutter.embedding.engine.plugins; import android.arch.lifecycle.Lifecycle; -import android.arch.lifecycle.LifecycleOwner; import android.content.Context; import android.support.annotation.NonNull; import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.embedding.engine.plugins.lifecycle.ConcreteLifecycleReference; -import io.flutter.embedding.engine.plugins.lifecycle.LifecycleReference; +import io.flutter.embedding.engine.plugins.lifecycle.HiddenLifecycleReference; /** * Interface to be implemented by all Flutter plugins. @@ -98,7 +96,7 @@ public interface FlutterPlugin { class FlutterPluginBinding { private final Context applicationContext; private final FlutterEngine flutterEngine; - private final ConcreteLifecycleReference concreteLifecycleReference; + private final HiddenLifecycleReference hiddenLifecycleReference; public FlutterPluginBinding( @NonNull Context applicationContext, @@ -107,7 +105,7 @@ public FlutterPluginBinding( ) { this.applicationContext = applicationContext; this.flutterEngine = flutterEngine; - this.concreteLifecycleReference = new ConcreteLifecycleReference(lifecycle); + this.hiddenLifecycleReference = new HiddenLifecycleReference(lifecycle); } @NonNull @@ -121,8 +119,8 @@ public FlutterEngine getFlutterEngine() { } @NonNull - public LifecycleReference getLifecycle() { - return concreteLifecycleReference; + public Object getLifecycle() { + return hiddenLifecycleReference; } } } diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java deleted file mode 100644 index 3722e78d034b8..0000000000000 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/ConcreteLifecycleReference.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.embedding.engine.plugins.lifecycle; - -import android.arch.lifecycle.Lifecycle; -import android.support.annotation.NonNull; - -public class ConcreteLifecycleReference implements LifecycleReference { - @NonNull - private final Lifecycle lifecycle; - - public ConcreteLifecycleReference(@NonNull Lifecycle lifecycle) { - this.lifecycle = lifecycle; - } - - @NonNull - public Lifecycle getLifecycle() { - return lifecycle; - } -} diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java new file mode 100644 index 0000000000000..e0ab4685b2bb0 --- /dev/null +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java @@ -0,0 +1,31 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.embedding.engine.plugins.lifecycle; + +import android.arch.lifecycle.Lifecycle; +import android.support.annotation.NonNull; + +/** + * An {@code Object} that can be used to obtain a {@link Lifecycle} reference. + *

+ * DO NOT INSTANTIATE THIS CLASS IN AN APP. + *

+ * This class is used by the flutter_android_lifecycle package to provide access to a + * {@link Lifecycle} in a way that makes it easier for Flutter and the Flutter plugin ecosystem to + * handle breaking changes in Lifecycle libraries. + */ +public class HiddenLifecycleReference { + @NonNull + private final Lifecycle lifecycle; + + public HiddenLifecycleReference(@NonNull Lifecycle lifecycle) { + this.lifecycle = lifecycle; + } + + @NonNull + public Lifecycle getLifecycle() { + return lifecycle; + } +} diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java deleted file mode 100644 index 91d84cb2564ba..0000000000000 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/LifecycleReference.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.embedding.engine.plugins.lifecycle; - -/** - * Marker interface used to denote a Flutter object that provides access to an Android lifecycle. - *

- * To make use of an instance of {@code LifecycleReference}, include flutter_android_lifecycle - * as a project dependency and then pass your {@code LifecycleReference} to a new instance of a - * {@code FlutterLifecycleAdapter}. - */ -public interface LifecycleReference { -} From a47fc8be6bf352ec529a215e77532a76bcaf4904 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Tue, 1 Oct 2019 17:18:26 -0700 Subject: [PATCH 3/5] PR Updates. --- .../engine/plugins/lifecycle/HiddenLifecycleReference.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java index e0ab4685b2bb0..a769189e6bdcb 100644 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java @@ -10,7 +10,7 @@ /** * An {@code Object} that can be used to obtain a {@link Lifecycle} reference. *

- * DO NOT INSTANTIATE THIS CLASS IN AN APP. + * DO NOT USE THIS CLASS IN AN APP OR A PLUGIN. *

* This class is used by the flutter_android_lifecycle package to provide access to a * {@link Lifecycle} in a way that makes it easier for Flutter and the Flutter plugin ecosystem to From 2cfc39a33ce966aaa143504c9f7aa1eab0594bef Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Mon, 7 Oct 2019 14:30:00 -0700 Subject: [PATCH 4/5] Add @Keep to HiddenLifecycleReference so that the flutter_android_lifecycle package can access via reflection instead of compile-time references. --- .../engine/plugins/lifecycle/HiddenLifecycleReference.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java index a769189e6bdcb..34b4cb90ceaaf 100644 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java @@ -5,6 +5,7 @@ package io.flutter.embedding.engine.plugins.lifecycle; import android.arch.lifecycle.Lifecycle; +import android.support.annotation.Keep; import android.support.annotation.NonNull; /** @@ -16,6 +17,7 @@ * {@link Lifecycle} in a way that makes it easier for Flutter and the Flutter plugin ecosystem to * handle breaking changes in Lifecycle libraries. */ +@Keep public class HiddenLifecycleReference { @NonNull private final Lifecycle lifecycle; From 90e5353390f3ec61fdbd4584d7f09c676407d763 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Fri, 11 Oct 2019 16:24:27 -0700 Subject: [PATCH 5/5] Fixed rebase merge mistake. --- shell/platform/android/BUILD.gn | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index 57467bfe6581f..1939249a7411a 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -149,6 +149,10 @@ android_java_sources = [ "io/flutter/embedding/engine/dart/DartExecutor.java", "io/flutter/embedding/engine/dart/DartMessenger.java", "io/flutter/embedding/engine/dart/PlatformMessageHandler.java", + "io/flutter/embedding/engine/loader/FlutterLoader.java", + "io/flutter/embedding/engine/loader/ResourceCleaner.java", + "io/flutter/embedding/engine/loader/ResourceExtractor.java", + "io/flutter/embedding/engine/loader/ResourcePaths.java", "io/flutter/embedding/engine/plugins/FlutterPlugin.java", "io/flutter/embedding/engine/plugins/PluginRegistry.java", "io/flutter/embedding/engine/plugins/activity/ActivityAware.java", @@ -219,9 +223,6 @@ android_java_sources = [ "io/flutter/view/FlutterNativeView.java", "io/flutter/view/FlutterRunArguments.java", "io/flutter/view/FlutterView.java", - "io/flutter/view/ResourceCleaner.java", - "io/flutter/view/ResourceExtractor.java", - "io/flutter/view/ResourcePaths.java", "io/flutter/view/TextureRegistry.java", "io/flutter/view/VsyncWaiter.java", ]