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

Commit d1263fb5 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Migrate AutoCompleteTextView to use OnBackInvokedDispatcher." into tm-dev

parents 0e2cc380 7caa2c1c
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -42,6 +42,9 @@ import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inspector.InspectableProperty;
import android.window.OnBackInvokedCallback;
import android.window.OnBackInvokedDispatcher;
import android.window.WindowOnBackInvokedDispatcher;

import com.android.internal.R;

@@ -143,6 +146,14 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
    @UnsupportedAppUsage
    private PopupDataSetObserver mObserver;

    private boolean mBackCallbackRegistered;
    /** Handles back invocation */
    private final OnBackInvokedCallback mBackCallback = () -> {
        if (isPopupShowing()) {
            dismissDropDown();
        }
    };

    /**
     * Constructs a new auto-complete text view with the given context's theme.
     *
@@ -272,6 +283,9 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
        }

        mPopup = new ListPopupWindow(mPopupContext, attrs, defStyleAttr, defStyleRes);
        mPopup.setOnDismissListener(() -> {
            unregisterOnBackInvokedCallback();
        });
        mPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        mPopup.setPromptPosition(ListPopupWindow.POSITION_PROMPT_BELOW);
        mPopup.setListSelector(popupListSelector);
@@ -734,6 +748,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
            wrappedListener = new PopupWindow.OnDismissListener() {
                @Override public void onDismiss() {
                    dismissListener.onDismiss();
                    unregisterOnBackInvokedCallback();
                }
            };
        }
@@ -1315,6 +1330,9 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
            mPopup.setListItemExpandMax(EXPAND_MAX);
        }
        mPopup.show();
        if (!mPopup.isDropDownAlwaysVisible()) {
            registerOnBackInvokedCallback();
        }
        mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);
    }

@@ -1414,6 +1432,35 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
        return AutoCompleteTextView.class.getName();
    }

    private void unregisterOnBackInvokedCallback() {
        if (!mBackCallbackRegistered) {
            return;
        }
        OnBackInvokedDispatcher dispatcher = findOnBackInvokedDispatcher();
        if (dispatcher == null) {
            return;
        }
        if (WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(mPopupContext)) {
            dispatcher.unregisterOnBackInvokedCallback(mBackCallback);
        }
        mBackCallbackRegistered = false;
    }

    private void registerOnBackInvokedCallback() {
        if (mBackCallbackRegistered) {
            return;
        }
        OnBackInvokedDispatcher dispatcher =  findOnBackInvokedDispatcher();
        if (dispatcher == null) {
            return;
        }
        if (WindowOnBackInvokedDispatcher.isOnBackInvokedCallbackEnabled(mPopupContext)) {
            dispatcher.registerOnBackInvokedCallback(
                    OnBackInvokedDispatcher.PRIORITY_OVERLAY, mBackCallback);
        }
        mBackCallbackRegistered = true;
    }

    private class DropDownItemClickListener implements AdapterView.OnItemClickListener {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            performCompletion(v, position, id);