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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18432995

Change-Id: I0549611638f2c95ade03b28f7a0f1195e2c83cd6
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-05-19 07:59:11 +00:00
committed by Automerger Merge Worker

View File

@@ -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);