diff options
| author | 2024-12-04 10:35:24 +0000 | |
|---|---|---|
| committer | 2024-12-04 10:35:24 +0000 | |
| commit | 2c22eca35d9cc73cef8083adad3ad2da00a37d86 (patch) | |
| tree | 7161a9e5ac437128e36deac5717a9c079694d48f | |
| parent | 9890167f7e5a38bbc6706f342b088b9668bd1b29 (diff) | |
| parent | ecad8299d55263c8a13a19529c3d58182557752e (diff) | |
Merge "Fix fragment back navigation in PreferenceActivity with predictive back" into main
| -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(); |