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