Skip to content

Commit ac5133b

Browse files
Revert "FlutterFragment predictive back (flutter#52302)"
This reverts commit c364b29.
1 parent f4b7854 commit ac5133b

File tree

3 files changed

+9
-47
lines changed

3 files changed

+9
-47
lines changed

shell/platform/android/io/flutter/embedding/android/FlutterFragment.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,14 +1056,6 @@ public void onAttach(@NonNull Context context) {
10561056
delegate.onAttach(context);
10571057
if (getArguments().getBoolean(ARG_SHOULD_AUTOMATICALLY_HANDLE_ON_BACK_PRESSED, false)) {
10581058
requireActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
1059-
// When Android handles a back gesture, it pops an Activity or goes back
1060-
// to the home screen. When Flutter handles a back gesture, it pops a
1061-
// route inside of the Flutter part of the app. By default, Android
1062-
// handles back gestures, so this callback is disabled. If, for example,
1063-
// the Flutter app has routes for which it wants to handle the back
1064-
// gesture, then it will enable this callback using
1065-
// setFrameworkHandlesBack.
1066-
onBackPressedCallback.setEnabled(false);
10671059
}
10681060
context.registerComponentCallbacks(this);
10691061
}
@@ -1671,29 +1663,16 @@ public boolean popSystemNavigator() {
16711663
// Unless we disable the callback, the dispatcher call will trigger it. This will then
16721664
// trigger the fragment's onBackPressed() implementation, which will call through to the
16731665
// dart side and likely call back through to this method, creating an infinite call loop.
1674-
boolean enabledAtStart = onBackPressedCallback.isEnabled();
1675-
if (enabledAtStart) {
1676-
onBackPressedCallback.setEnabled(false);
1677-
}
1666+
onBackPressedCallback.setEnabled(false);
16781667
activity.getOnBackPressedDispatcher().onBackPressed();
1679-
if (enabledAtStart) {
1680-
onBackPressedCallback.setEnabled(true);
1681-
}
1668+
onBackPressedCallback.setEnabled(true);
16821669
return true;
16831670
}
16841671
}
16851672
// Hook for subclass. No-op if returns false.
16861673
return false;
16871674
}
16881675

1689-
@Override
1690-
public void setFrameworkHandlesBack(boolean frameworkHandlesBack) {
1691-
if (!getArguments().getBoolean(ARG_SHOULD_AUTOMATICALLY_HANDLE_ON_BACK_PRESSED, false)) {
1692-
return;
1693-
}
1694-
onBackPressedCallback.setEnabled(frameworkHandlesBack);
1695-
}
1696-
16971676
@VisibleForTesting
16981677
@NonNull
16991678
boolean shouldDelayFirstAndroidViewDraw() {

shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,6 @@ protected FlutterFragment createFlutterFragment() {
518518
? TransparencyMode.opaque
519519
: TransparencyMode.transparent;
520520
final boolean shouldDelayFirstAndroidViewDraw = renderMode == RenderMode.surface;
521-
final boolean shouldAutomaticallyHandleOnBackPressed = true;
522521

523522
if (getCachedEngineId() != null) {
524523
Log.v(
@@ -543,7 +542,6 @@ protected FlutterFragment createFlutterFragment() {
543542
.shouldAttachEngineToActivity(shouldAttachEngineToActivity())
544543
.destroyEngineWithFragment(shouldDestroyEngineWithHost())
545544
.shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw)
546-
.shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed)
547545
.build();
548546
} else {
549547
Log.v(
@@ -579,7 +577,6 @@ protected FlutterFragment createFlutterFragment() {
579577
.transparencyMode(transparencyMode)
580578
.shouldAttachEngineToActivity(shouldAttachEngineToActivity())
581579
.shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw)
582-
.shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed)
583580
.build();
584581
}
585582

@@ -595,7 +592,6 @@ protected FlutterFragment createFlutterFragment() {
595592
.transparencyMode(transparencyMode)
596593
.shouldAttachEngineToActivity(shouldAttachEngineToActivity())
597594
.shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw)
598-
.shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed)
599595
.build();
600596
}
601597
}
@@ -620,6 +616,12 @@ protected void onNewIntent(@NonNull Intent intent) {
620616
super.onNewIntent(intent);
621617
}
622618

619+
@Override
620+
@SuppressWarnings("MissingSuperCall")
621+
public void onBackPressed() {
622+
flutterFragment.onBackPressed();
623+
}
624+
623625
@Override
624626
public void onRequestPermissionsResult(
625627
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentTest.java

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ private FragmentActivity getMockFragmentActivity() {
290290
}
291291

292292
@Test
293-
public void itDelegatesOnBackPressedWithSetFrameworkHandlesBack() {
293+
public void itDelegatesOnBackPressedAutomaticallyWhenEnabled() {
294294
// We need to mock FlutterJNI to avoid triggering native code.
295295
FlutterJNI flutterJNI = mock(FlutterJNI.class);
296296
when(flutterJNI.isAttached()).thenReturn(true);
@@ -301,8 +301,6 @@ public void itDelegatesOnBackPressedWithSetFrameworkHandlesBack() {
301301

302302
FlutterFragment fragment =
303303
FlutterFragment.withCachedEngine("my_cached_engine")
304-
// This enables the use of onBackPressedCallback, which is what
305-
// sends backs to the framework if setFrameworkHandlesBack is true.
306304
.shouldAutomaticallyHandleOnBackPressed(true)
307305
.build();
308306
FragmentActivity activity = getMockFragmentActivity();
@@ -320,15 +318,8 @@ public void itDelegatesOnBackPressedWithSetFrameworkHandlesBack() {
320318
TestDelegateFactory delegateFactory = new TestDelegateFactory(mockDelegate);
321319
fragment.setDelegateFactory(delegateFactory);
322320

323-
// Calling onBackPressed now will still be handled by Android (the default),
324-
// until setFrameworkHandlesBack is set to true.
325321
activity.getOnBackPressedDispatcher().onBackPressed();
326-
verify(mockDelegate, times(0)).onBackPressed();
327322

328-
// Setting setFrameworkHandlesBack to true means the delegate will receive
329-
// the back and Android won't handle it.
330-
fragment.setFrameworkHandlesBack(true);
331-
activity.getOnBackPressedDispatcher().onBackPressed();
332323
verify(mockDelegate, times(1)).onBackPressed();
333324
}
334325

@@ -370,20 +361,10 @@ public void handleOnBackPressed() {
370361
TestDelegateFactory delegateFactory = new TestDelegateFactory(mockDelegate);
371362
fragment.setDelegateFactory(delegateFactory);
372363

373-
assertTrue(callback.isEnabled());
374-
375364
assertTrue(fragment.popSystemNavigator());
376365

377366
verify(mockDelegate, never()).onBackPressed();
378367
assertTrue(onBackPressedCalled.get());
379-
assertTrue(callback.isEnabled());
380-
381-
callback.setEnabled(false);
382-
assertFalse(callback.isEnabled());
383-
assertTrue(fragment.popSystemNavigator());
384-
385-
verify(mockDelegate, never()).onBackPressed();
386-
assertFalse(callback.isEnabled());
387368
}
388369

389370
@Test

0 commit comments

Comments
 (0)