Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ecad8299 authored by Johannes Gallmann's avatar Johannes Gallmann
Browse files

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
parent c60efe59
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -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) {
        if ((mCurHeader != null && getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT) == null
                && mSinglePane) || getFragmentManager().getBackStackEntryCount() != 0) {
            if (!mIsBackCallbackRegistered) {
                getOnBackInvokedDispatcher()
                        .registerOnBackInvokedCallback(PRIORITY_DEFAULT, mOnBackInvokedCallback);
        } else {
                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();