diff options
| author | 2024-12-03 08:56:59 +0000 | |
|---|---|---|
| committer | 2024-12-03 08:57:45 +0000 | |
| commit | ecad8299d55263c8a13a19529c3d58182557752e (patch) | |
| tree | 024ee984a67efd2a1b4977a3e74e6356cfbf7d06 | |
| parent | c60efe594e0c2ce6b672516d9538700011fa5c98 (diff) | |
Fix fragment back navigation in PreferenceActivity with predictive back
When isOnBackInvokedCallbackEnabled=false, popBackStackImmediate() is called in Activity#onBackPressed. When isOnBackInvokedCallbackEnabled=true, we need to call popBackStackImmediate() manually when back is invoked, since onBackPressed is not called anymore.
Bug: 381779683
Test: Manual, i.e. verified back navigation in PreferenceActivity cts test app
Test: CtsPreferenceTestCases
Flag: com.android.window.flags.predictive_back_default_enable_sdk_36
Change-Id: I648362d320acb790802de143114f9c893e745335
| -rw-r--r-- | core/java/android/preference/PreferenceActivity.java | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java index e4a3c9fa7741..25e8a4ddffcd 100644 --- a/core/java/android/preference/PreferenceActivity.java +++ b/core/java/android/preference/PreferenceActivity.java @@ -213,7 +213,10 @@ public abstract class PreferenceActivity extends ListActivity implements private int mPreferenceHeaderItemResId = 0; private boolean mPreferenceHeaderRemoveEmptyIcon = false; + private boolean mIsBackCallbackRegistered = false; private final OnBackInvokedCallback mOnBackInvokedCallback = this::onBackInvoked; + private final FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener = + this::updateBackCallbackRegistrationState; /** * The starting request code given out to preference framework. @@ -706,6 +709,7 @@ public abstract class PreferenceActivity extends ListActivity implements } } updateBackCallbackRegistrationState(); + getFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener); } @Override @@ -715,17 +719,25 @@ public abstract class PreferenceActivity extends ListActivity implements private void updateBackCallbackRegistrationState() { if (!WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(this)) return; - if (mCurHeader != null && mSinglePane && getFragmentManager().getBackStackEntryCount() == 0 - && getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT) == null) { - getOnBackInvokedDispatcher() - .registerOnBackInvokedCallback(PRIORITY_DEFAULT, mOnBackInvokedCallback); - } else { + if ((mCurHeader != null && getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT) == null + && mSinglePane) || getFragmentManager().getBackStackEntryCount() != 0) { + if (!mIsBackCallbackRegistered) { + getOnBackInvokedDispatcher() + .registerOnBackInvokedCallback(PRIORITY_DEFAULT, mOnBackInvokedCallback); + mIsBackCallbackRegistered = true; + } + } else if (mIsBackCallbackRegistered) { getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(mOnBackInvokedCallback); + mIsBackCallbackRegistered = false; } } private void onBackInvoked() { - if (mCurHeader != null && mSinglePane && getFragmentManager().getBackStackEntryCount() == 0 + if (WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(this) + && getFragmentManager().getBackStackEntryCount() != 0) { + getFragmentManager().popBackStackImmediate(); + } else if (mCurHeader != null && mSinglePane + && getFragmentManager().getBackStackEntryCount() == 0 && getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT) == null) { mCurHeader = null; @@ -1012,6 +1024,7 @@ public abstract class PreferenceActivity extends ListActivity implements @Override protected void onDestroy() { + getFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener); mHandler.removeMessages(MSG_BIND_PREFERENCES); mHandler.removeMessages(MSG_BUILD_HEADERS); super.onDestroy(); |