diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index b1f00b23a7ee9..449cb7cc0fcba 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -615,6 +615,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 ac7ffaed19a77..b0c97c5b837c6 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -163,6 +163,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/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", diff --git a/shell/platform/android/io/flutter/embedding/engine/FlutterEnginePluginRegistry.java b/shell/platform/android/io/flutter/embedding/engine/FlutterEnginePluginRegistry.java index eb77bf417763e..29692195cad4c 100644 --- a/shell/platform/android/io/flutter/embedding/engine/FlutterEnginePluginRegistry.java +++ b/shell/platform/android/io/flutter/embedding/engine/FlutterEnginePluginRegistry.java @@ -32,6 +32,7 @@ import io.flutter.embedding.engine.plugins.contentprovider.ContentProviderAware; import io.flutter.embedding.engine.plugins.contentprovider.ContentProviderControlSurface; import io.flutter.embedding.engine.plugins.contentprovider.ContentProviderPluginBinding; +import io.flutter.embedding.engine.plugins.lifecycle.HiddenLifecycleReference; import io.flutter.embedding.engine.plugins.service.ServiceAware; import io.flutter.embedding.engine.plugins.service.ServiceControlSurface; import io.flutter.embedding.engine.plugins.service.ServicePluginBinding; @@ -535,7 +536,7 @@ private static class FlutterEngineActivityPluginBinding implements ActivityPlugi @NonNull private final Activity activity; @NonNull - private final Lifecycle lifecycle; + private final HiddenLifecycleReference hiddenLifecycleReference; @NonNull private final Set onRequestPermissionsResultListeners = new HashSet<>(); @NonNull @@ -549,7 +550,7 @@ private static class FlutterEngineActivityPluginBinding implements ActivityPlugi public FlutterEngineActivityPluginBinding(@NonNull Activity activity, @NonNull Lifecycle lifecycle) { this.activity = activity; - this.lifecycle = lifecycle; + this.hiddenLifecycleReference = new HiddenLifecycleReference(lifecycle); } @Override @@ -560,8 +561,8 @@ public Activity getActivity() { @NonNull @Override - public Lifecycle getLifecycle() { - return lifecycle; + public Object getLifecycle() { + return hiddenLifecycleReference; } @Override @@ -685,13 +686,13 @@ private static class FlutterEngineServicePluginBinding implements ServicePluginB @NonNull private final Service service; @Nullable - private final Lifecycle lifecycle; + private final HiddenLifecycleReference hiddenLifecycleReference; @NonNull private final Set onModeChangeListeners = new HashSet<>(); FlutterEngineServicePluginBinding(@NonNull Service service, @Nullable Lifecycle lifecycle) { this.service = service; - this.lifecycle = lifecycle; + hiddenLifecycleReference = lifecycle != null ? new HiddenLifecycleReference(lifecycle) : null; } @Override @@ -702,8 +703,8 @@ public Service getService() { @Nullable @Override - public Lifecycle getLifecycle() { - return lifecycle; + public Object getLifecycle() { + return hiddenLifecycleReference; } @Override diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/activity/ActivityPluginBinding.java b/shell/platform/android/io/flutter/embedding/engine/plugins/activity/ActivityPluginBinding.java index 7bd8647842e6c..028287e06d09e 100644 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/activity/ActivityPluginBinding.java +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/activity/ActivityPluginBinding.java @@ -5,7 +5,6 @@ package io.flutter.embedding.engine.plugins.activity; import android.app.Activity; -import android.arch.lifecycle.Lifecycle; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -26,10 +25,17 @@ public interface ActivityPluginBinding { Activity getActivity(); /** - * Returns the {@link Lifecycle} associated with the attached {@code Activity}. + * Returns the {@code Lifecycle} associated with the attached {@code Activity}. + *

+ * Use the flutter_plugin_android_lifecycle plugin to turn the returned {@code Object} + * into a {@code Lifecycle} object. See + * (https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle). + * Flutter plugins that rely on {@code Lifecycle} are forced to use the + * flutter_plugin_android_lifecycle plugin so that the version of the Android Lifecycle library is + * exposed to pub, which allows Flutter to manage different versions library over time. */ @NonNull - Lifecycle getLifecycle(); + Object getLifecycle(); /** * Adds a listener that is invoked whenever the associated {@link Activity}'s 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..490c9def38844 --- /dev/null +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/lifecycle/HiddenLifecycleReference.java @@ -0,0 +1,33 @@ +// 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.Keep; +import android.support.annotation.NonNull; + +/** + * An {@code Object} that can be used to obtain a {@link Lifecycle} reference. + *

+ * 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 + * handle breaking changes in Lifecycle libraries. + */ +@Keep +public class HiddenLifecycleReference { + @NonNull + private final Lifecycle lifecycle; + + public HiddenLifecycleReference(@NonNull Lifecycle lifecycle) { + this.lifecycle = lifecycle; + } + + @NonNull + public Lifecycle getLifecycle() { + return lifecycle; + } +} \ No newline at end of file diff --git a/shell/platform/android/io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java b/shell/platform/android/io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java index 45a2dbf2f5d58..b35c096ea6ed8 100644 --- a/shell/platform/android/io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java +++ b/shell/platform/android/io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java @@ -5,7 +5,6 @@ package io.flutter.embedding.engine.plugins.service; import android.app.Service; -import android.arch.lifecycle.Lifecycle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -22,10 +21,17 @@ public interface ServicePluginBinding { Service getService(); /** - * Returns the {@link Lifecycle} associated with the attached {@code Service}. + * Returns the {@code Lifecycle} associated with the attached {@code Service}. + *

+ * Use the flutter_plugin_android_lifecycle plugin to turn the returned {@code Object} + * into a {@code Lifecycle} object. See + * (https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle). + * Flutter plugins that rely on {@code Lifecycle} are forced to use the + * flutter_plugin_android_lifecycle plugin so that the version of the Android Lifecycle library is + * exposed to pub, which allows Flutter to manage different versions library over time. */ @Nullable - Lifecycle getLifecycle(); + Object getLifecycle(); /** * Adds the given {@code listener} to be notified when the associated {@link Service} goes