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..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") 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..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,4 +223,17 @@ public void handleOnBackPressed() { verify(mockDelegate, never()).onBackPressed(); assertTrue(onBackPressedCalled.get()); } + + @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); + } + } }