From 7242bfcb62f2b1690b4637ee00593423aeac36eb 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: Sat, 4 Dec 2021 00:24:40 +0800 Subject: [PATCH 1/4] Make ExclusiveAppComponent accessible to FlutterActivity/FlutterFragment subclasses. --- .../io/flutter/embedding/android/FlutterFragment.java | 2 +- .../io/flutter/embedding/android/FlutterActivityTest.java | 8 ++++++++ .../io/flutter/embedding/android/FlutterFragmentTest.java | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java b/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java index 365e6984f0b07..e7fd64ab91bc5 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java @@ -705,7 +705,7 @@ public T build() { // Delegate that runs all lifecycle and OS hook logic that is common between // FlutterActivity and FlutterFragment. See the FlutterActivityAndFragmentDelegate // implementation for details about why it exists. - @VisibleForTesting @Nullable /* package */ FlutterActivityAndFragmentDelegate delegate; + @VisibleForTesting @Nullable protected FlutterActivityAndFragmentDelegate delegate; private final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) { diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java index c0fccca8ddae7..9463b01e5a121 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java @@ -499,6 +499,14 @@ public static CachedEngineIntentBuilder withCachedEngine(@NonNull String cachedE } } + // It‘s a compile-time check to ensure that FlutterActivity subclasses can access + // FlutterActivityAndFragmentDelegate. + static class FlutterActivitySubclass extends FlutterActivity { + public void performAttach() { + getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle()); + } + } + private static class FlutterActivityWithTextureRendering extends FlutterActivity { @Override public RenderMode getRenderMode() { diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java index 1a901b7e40a8a..f74dd912287d5 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java @@ -222,3 +222,11 @@ public void handleOnBackPressed() { assertTrue(onBackPressedCalled.get()); } } + +// It‘s a compile-time check to ensure that FlutterFragment subclasses can access +// FlutterActivityAndFragmentDelegate. +static class FlutterFragmentSubclass extends FlutterFragment { + public void performAttach() { + getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle()); + } +} From 93875bf5b23229989396c3c4a9d4e742ea8836f6 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: Sat, 4 Dec 2021 10:50:51 +0800 Subject: [PATCH 2/4] Add comments --- .../io/flutter/embedding/android/FlutterActivityTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java index 9463b01e5a121..b298ab12b8f50 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java @@ -499,8 +499,8 @@ public static CachedEngineIntentBuilder withCachedEngine(@NonNull String cachedE } } - // It‘s a compile-time check to ensure that FlutterActivity subclasses can access - // FlutterActivityAndFragmentDelegate. + // It‘s a compile-time check to ensure that FlutterActivityAndFragmentDelegate is + // accessible to FlutterActivity subclasses. static class FlutterActivitySubclass extends FlutterActivity { public void performAttach() { getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle()); From 40eaace60ceb8270ae622f3d60165398fe8127be 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: Sat, 4 Dec 2021 10:52:09 +0800 Subject: [PATCH 3/4] Add comments --- .../io/flutter/embedding/android/FlutterFragmentTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java index f74dd912287d5..68af940440d0c 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java @@ -223,8 +223,8 @@ public void handleOnBackPressed() { } } -// It‘s a compile-time check to ensure that FlutterFragment subclasses can access -// FlutterActivityAndFragmentDelegate. +// It‘s a compile-time check to ensure that FlutterActivityAndFragmentDelegate is +// accessible to FlutterFragment subclasses. static class FlutterFragmentSubclass extends FlutterFragment { public void performAttach() { getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle()); From 2bf7aa36ee33e20430d85b1b17f0eaba309daba4 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: Mon, 6 Dec 2021 14:14:15 +0800 Subject: [PATCH 4/4] add test. --- .../android/FlutterActivityTest.java | 23 ++++++++++++------- .../android/FlutterFragmentTest.java | 19 ++++++++++----- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java index b298ab12b8f50..a242f531070e7 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java @@ -39,6 +39,8 @@ import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding.OnSaveInstanceStateListener; import io.flutter.plugins.GeneratedPluginRegistrant; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.List; import org.junit.After; import org.junit.Before; @@ -466,6 +468,19 @@ public void fullyDrawn() { } } + @Test + public void itCanBeAccessibleFromSubclass() { + // To ensure that FlutterActivityAndFragmentDelegate is + // accessible to FlutterActivity subclasses. + try { + Field field = FlutterActivity.class.getDeclaredField("delegate"); + field.setAccessible(true); + assertTrue(Modifier.isProtected(field.getModifiers())); + } catch (Exception e) { + assertTrue(false); + } + } + static class FlutterActivityWithProvidedEngine extends FlutterActivity { @Override @SuppressLint("MissingSuperCall") @@ -499,14 +514,6 @@ public static CachedEngineIntentBuilder withCachedEngine(@NonNull String cachedE } } - // It‘s a compile-time check to ensure that FlutterActivityAndFragmentDelegate is - // accessible to FlutterActivity subclasses. - static class FlutterActivitySubclass extends FlutterActivity { - public void performAttach() { - getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle()); - } - } - private static class FlutterActivityWithTextureRendering extends FlutterActivity { @Override public RenderMode getRenderMode() { diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java index 68af940440d0c..e814e9ab17d5d 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java @@ -18,6 +18,8 @@ import io.flutter.embedding.engine.FlutterEngineCache; import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.loader.FlutterLoader; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.Test; import org.junit.runner.RunWith; @@ -221,12 +223,17 @@ public void handleOnBackPressed() { verify(mockDelegate, never()).onBackPressed(); assertTrue(onBackPressedCalled.get()); } -} -// It‘s a compile-time check to ensure that FlutterActivityAndFragmentDelegate is -// accessible to FlutterFragment subclasses. -static class FlutterFragmentSubclass extends FlutterFragment { - public void performAttach() { - getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle()); + @Test + public void itCanBeAccessibleFromSubclass() { + // To ensure that FlutterActivityAndFragmentDelegate is + // accessible to FlutterFragment subclasses. + try { + Field field = FlutterFragment.class.getDeclaredField("delegate"); + field.setAccessible(true); + assertTrue(Modifier.isProtected(field.getModifiers())); + } catch (Exception e) { + assertTrue(false); + } } }