From 205398943b81529bc216ac3c47cf32cf0aa427db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rulong=20Chen=EF=BC=88=E9=99=88=E6=B1=9D=E9=BE=99=EF=BC=89?= Date: Thu, 20 Jan 2022 08:00:11 +0800 Subject: [PATCH] Export |ExclusiveAppComponent| from FlutterActivity/FlutterFragment class (flutter/engine#30864) --- .../flutter/embedding/android/FlutterActivity.java | 9 +++++++++ .../FlutterActivityAndFragmentDelegate.java | 14 ++++++++++++++ .../flutter/embedding/android/FlutterFragment.java | 9 +++++++++ .../embedding/android/FlutterActivityTest.java | 13 +++++++++++++ .../android/FlutterAndroidComponentTest.java | 5 +++++ .../embedding/android/FlutterFragmentTest.java | 9 +++++++++ 6 files changed, 59 insertions(+) diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java index cee5b20b46..2b915cc04c 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java @@ -450,6 +450,15 @@ public class FlutterActivity extends Activity this.delegate = delegate; } + /** + * Returns the Android App Component exclusively attached to {@link + * io.flutter.embedding.engine.FlutterEngine}. + */ + @Override + public ExclusiveAppComponent getExclusiveAppComponent() { + return delegate; + } + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { switchLaunchThemeForNormalTheme(); diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityAndFragmentDelegate.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityAndFragmentDelegate.java index 8665af6185..2f45b33cf1 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityAndFragmentDelegate.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityAndFragmentDelegate.java @@ -953,6 +953,20 @@ import java.util.Arrays; @NonNull TransparencyMode getTransparencyMode(); + /** + * Returns the {@link ExclusiveAppComponent} that is associated with {@link + * io.flutter.embedding.engine.FlutterEngine}. + * + *

In the scenario where multiple {@link FlutterActivity} or {@link FlutterFragment} share + * the same {@link FlutterEngine}, to attach/re-attache a {@link FlutterActivity} or {@link + * FlutterFragment} to the shared {@link FlutterEngine}, we MUST manually invoke {@link + * ActivityControlSurface#attachToActivity(ExclusiveAppComponent, Lifecycle)}. + * + *

The {@link ExclusiveAppComponent} is exposed here so that subclasses of {@link + * FlutterActivity} or {@link FlutterFragment} can access it. + */ + ExclusiveAppComponent getExclusiveAppComponent(); + @Nullable SplashScreen provideSplashScreen(); diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java index 910826c960..83609e5c23 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java @@ -746,6 +746,15 @@ public class FlutterFragment extends Fragment this.delegate = delegate; } + /** + * Returns the Android App Component exclusively attached to {@link + * io.flutter.embedding.engine.FlutterEngine}. + */ + @Override + public ExclusiveAppComponent getExclusiveAppComponent() { + return delegate; + } + @Override public void onAttach(@NonNull Context context) { super.onAttach(context); diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java index 265cdc17a2..9f8b1e7aec 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java @@ -304,6 +304,19 @@ public class FlutterActivityTest { verify(mockDelegate, times(1)).release(); } + @Test + public void itReturnsExclusiveAppComponent() { + Intent intent = FlutterActivity.createDefaultIntent(RuntimeEnvironment.application); + ActivityController activityController = + Robolectric.buildActivity(FlutterActivity.class, intent); + FlutterActivity flutterActivity = activityController.get(); + FlutterActivityAndFragmentDelegate delegate = + new FlutterActivityAndFragmentDelegate(flutterActivity); + flutterActivity.setDelegate(delegate); + + assertEquals(flutterActivity.getExclusiveAppComponent(), delegate); + } + @Test public void itDelaysDrawing() { Intent intent = FlutterActivity.createDefaultIntent(RuntimeEnvironment.application); diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterAndroidComponentTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterAndroidComponentTest.java index 3586339d8b..0796975dd4 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterAndroidComponentTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterAndroidComponentTest.java @@ -335,6 +335,11 @@ public class FlutterAndroidComponentTest { return TransparencyMode.transparent; } + @Override + public ExclusiveAppComponent getExclusiveAppComponent() { + return null; + } + @Nullable @Override public SplashScreen provideSplashScreen() { diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java index ea8b9d0acb..483f19a63c 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java @@ -213,6 +213,15 @@ public class FlutterFragmentTest { assertFalse(mockDelegate.isAttached()); } + @Test + public void itReturnsExclusiveAppComponent() { + FlutterFragment fragment = FlutterFragment.createDefault(); + FlutterActivityAndFragmentDelegate delegate = new FlutterActivityAndFragmentDelegate(fragment); + fragment.setDelegate(delegate); + + assertEquals(fragment.getExclusiveAppComponent(), delegate); + } + @Test public void itDelegatesOnBackPressedAutomaticallyWhenEnabled() { // We need to mock FlutterJNI to avoid triggering native code.