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

Commit 41c59b4e authored by Johannes Gallmann's avatar Johannes Gallmann
Browse files

Make PreferenceActivity predictive-back compatible

Bug: 380244081
Test: PreferenceActivityFlowLandscapeTest
Manual: Verify correct back navigation behaviour in PreferenceActivity (PreferenceWithHeaders test activity)
Flag: com.android.window.flags.predictive_back_default_enable_sdk_36
Change-Id: I6f4de092233644e3e04645871f466e0f17c810b8
parent 3ebccb43
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.preference;

import static android.window.OnBackInvokedDispatcher.PRIORITY_DEFAULT;

import android.animation.LayoutTransition;
import android.annotation.Nullable;
import android.annotation.StringRes;
@@ -54,6 +56,8 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.window.OnBackInvokedCallback;
import android.window.WindowOnBackInvokedDispatcher;

import com.android.internal.util.XmlUtils;

@@ -209,6 +213,8 @@ public abstract class PreferenceActivity extends ListActivity implements
    private int mPreferenceHeaderItemResId = 0;
    private boolean mPreferenceHeaderRemoveEmptyIcon = false;

    private final OnBackInvokedCallback mOnBackInvokedCallback = this::onBackInvoked;

    /**
     * The starting request code given out to preference framework.
     */
@@ -699,10 +705,26 @@ public abstract class PreferenceActivity extends ListActivity implements
                skipButton.setVisibility(View.VISIBLE);
            }
        }
        updateBackCallbackRegistrationState();
    }

    @Override
    public void onBackPressed() {
        onBackInvoked();
    }

    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 {
            getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(mOnBackInvokedCallback);
        }
    }

    private void onBackInvoked() {
        if (mCurHeader != null && mSinglePane && getFragmentManager().getBackStackEntryCount() == 0
                && getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT) == null) {
            mCurHeader = null;
@@ -713,9 +735,10 @@ public abstract class PreferenceActivity extends ListActivity implements
                showBreadCrumbs(mActivityTitle, null);
            }
            getListView().clearChoices();
        } else {
        } else if (!WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(this)) {
            super.onBackPressed();
        }
        updateBackCallbackRegistrationState();
    }

    /**
@@ -1221,6 +1244,7 @@ public abstract class PreferenceActivity extends ListActivity implements
            getListView().clearChoices();
        }
        showBreadCrumbs(header);
        updateBackCallbackRegistrationState();
    }

    void showBreadCrumbs(Header header) {