diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java b/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java index 586d60c9c6980..bf766dac15e24 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterFragment.java @@ -1062,6 +1062,11 @@ public void onAttach(@NonNull Context context) { delegate.onAttach(context); if (getArguments().getBoolean(ARG_SHOULD_AUTOMATICALLY_HANDLE_ON_BACK_PRESSED, false)) { requireActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback); + // By default, Android handles backs, and predictive back is enabled. This + // can be changed by calling setFrameworkHandlesBack. For example, the + // framework will call this automatically in a typical app when it has + // routes to pop. + onBackPressedCallback.setEnabled(false); } context.registerComponentCallbacks(this); } @@ -1684,6 +1689,14 @@ public boolean popSystemNavigator() { 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 4f3ab481b9ee2..5cb028d9ed7f9 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java @@ -521,6 +521,7 @@ protected FlutterFragment createFlutterFragment() { ? TransparencyMode.opaque : TransparencyMode.transparent; final boolean shouldDelayFirstAndroidViewDraw = renderMode == RenderMode.surface; + final boolean shouldAutomaticallyHandleOnBackPressed = Build.VERSION.SDK_INT >= 33; if (getCachedEngineId() != null) { Log.v( @@ -545,6 +546,7 @@ protected FlutterFragment createFlutterFragment() { .shouldAttachEngineToActivity(shouldAttachEngineToActivity()) .destroyEngineWithFragment(shouldDestroyEngineWithHost()) .shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw) + .shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed) .build(); } else { Log.v( @@ -581,6 +583,7 @@ protected FlutterFragment createFlutterFragment() { .transparencyMode(transparencyMode) .shouldAttachEngineToActivity(shouldAttachEngineToActivity()) .shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw) + .shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed) .build(); } @@ -596,6 +599,7 @@ protected FlutterFragment createFlutterFragment() { .transparencyMode(transparencyMode) .shouldAttachEngineToActivity(shouldAttachEngineToActivity()) .shouldDelayFirstAndroidViewDraw(shouldDelayFirstAndroidViewDraw) + .shouldAutomaticallyHandleOnBackPressed(shouldAutomaticallyHandleOnBackPressed) .build(); } }