Revert "FlutterFragment predictive back (#52302)"
This reverts commit c364b294c1f3df4e32ca15972bd06228b056fbb4.
diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java b/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java
index e26d13e..376142b 100644
--- a/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java
+++ b/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java
@@ -1056,14 +1056,6 @@
delegate.onAttach(context);
if (getArguments().getBoolean(ARG_SHOULD_AUTOMATICALLY_HANDLE_ON_BACK_PRESSED, false)) {
requireActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
- // When Android handles a back gesture, it pops an Activity or goes back
- // to the home screen. When Flutter handles a back gesture, it pops a
- // route inside of the Flutter part of the app. By default, Android
- // handles back gestures, so this callback is disabled. If, for example,
- // the Flutter app has routes for which it wants to handle the back
- // gesture, then it will enable this callback using
- // setFrameworkHandlesBack.
- onBackPressedCallback.setEnabled(false);
}
context.registerComponentCallbacks(this);
}
@@ -1671,14 +1663,9 @@
// Unless we disable the callback, the dispatcher call will trigger it. This will then
// trigger the fragment's onBackPressed() implementation, which will call through to the
// dart side and likely call back through to this method, creating an infinite call loop.
- boolean enabledAtStart = onBackPressedCallback.isEnabled();
- if (enabledAtStart) {
- onBackPressedCallback.setEnabled(false);
- }
+ onBackPressedCallback.setEnabled(false);
activity.getOnBackPressedDispatcher().onBackPressed();
- if (enabledAtStart) {
- onBackPressedCallback.setEnabled(true);
- }
+ onBackPressedCallback.setEnabled(true);
return true;
}
}
@@ -1686,14 +1673,6 @@
return false;
}
- @Override
- public void setFrameworkHandlesBack(boolean frameworkHandlesBack) {
- if (!getArguments().getBoolean(ARG_SHOULD_AUTOMATICALLY_HANDLE_ON_BACK_PRESSED, false)) {
- return;
- }
- onBackPressedCallback.setEnabled(frameworkHandlesBack);
- }
-
@VisibleForTesting
@NonNull
boolean shouldDelayFirstAndroidViewDraw() {
diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java b/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java
index fda8a7c..65fb752 100644
--- a/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java
+++ b/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java
@@ -518,7 +518,6 @@
? TransparencyMode.opaque
: TransparencyMode.transparent;
final boolean shouldDelayFirstAndroidViewDraw = renderMode == RenderMode.surface;
- final boolean shouldAutomaticallyHandleOnBackPressed = true;
if (getCachedEngineId() != null) {
Log.v(
@@ -543,7 +542,6 @@
.shouldAttachEngineToActivity(shouldAttachEngineToActivity())
.destroyEngineWithFragment(shouldDestroyEngineWithHost())
.shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw)
- .shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed)
.build();
} else {
Log.v(
@@ -579,7 +577,6 @@
.transparencyMode(transparencyMode)
.shouldAttachEngineToActivity(shouldAttachEngineToActivity())
.shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw)
- .shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed)
.build();
}
@@ -595,7 +592,6 @@
.transparencyMode(transparencyMode)
.shouldAttachEngineToActivity(shouldAttachEngineToActivity())
.shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw)
- .shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed)
.build();
}
}
@@ -621,6 +617,12 @@
}
@Override
+ @SuppressWarnings("MissingSuperCall")
+ public void onBackPressed() {
+ flutterFragment.onBackPressed();
+ }
+
+ @Override
public void onRequestPermissionsResult(
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
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 24d7c6e..6cfc9e1 100644
--- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java
+++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java
@@ -290,7 +290,7 @@
}
@Test
- public void itDelegatesOnBackPressedWithSetFrameworkHandlesBack() {
+ public void itDelegatesOnBackPressedAutomaticallyWhenEnabled() {
// We need to mock FlutterJNI to avoid triggering native code.
FlutterJNI flutterJNI = mock(FlutterJNI.class);
when(flutterJNI.isAttached()).thenReturn(true);
@@ -301,8 +301,6 @@
FlutterFragment fragment =
FlutterFragment.withCachedEngine("my_cached_engine")
- // This enables the use of onBackPressedCallback, which is what
- // sends backs to the framework if setFrameworkHandlesBack is true.
.shouldAutomaticallyHandleOnBackPressed(true)
.build();
FragmentActivity activity = getMockFragmentActivity();
@@ -320,15 +318,8 @@
TestDelegateFactory delegateFactory = new TestDelegateFactory(mockDelegate);
fragment.setDelegateFactory(delegateFactory);
- // Calling onBackPressed now will still be handled by Android (the default),
- // until setFrameworkHandlesBack is set to true.
activity.getOnBackPressedDispatcher().onBackPressed();
- verify(mockDelegate, times(0)).onBackPressed();
- // Setting setFrameworkHandlesBack to true means the delegate will receive
- // the back and Android won't handle it.
- fragment.setFrameworkHandlesBack(true);
- activity.getOnBackPressedDispatcher().onBackPressed();
verify(mockDelegate, times(1)).onBackPressed();
}
@@ -370,20 +361,10 @@
TestDelegateFactory delegateFactory = new TestDelegateFactory(mockDelegate);
fragment.setDelegateFactory(delegateFactory);
- assertTrue(callback.isEnabled());
-
assertTrue(fragment.popSystemNavigator());
verify(mockDelegate, never()).onBackPressed();
assertTrue(onBackPressedCalled.get());
- assertTrue(callback.isEnabled());
-
- callback.setEnabled(false);
- assertFalse(callback.isEnabled());
- assertTrue(fragment.popSystemNavigator());
-
- verify(mockDelegate, never()).onBackPressed();
- assertFalse(callback.isEnabled());
}
@Test