Migrate AutoCompleteTextView to use OnBackInvokedDispatcher.
With ag/17952046 we now actively intercept KEYCODE_BACK before they are sent to IME when new back flow is used. This requires us to migrate AutoCompleteTextView#onKeyPreIme, and is also what causes the test failure in b/231960630. Test: atest AutoCompleteTextView test. Test: Test back behavior of AutoCompleteTextView in BackTestApp. Bug: 231960630 Change-Id: I1a5e01c9a4f8f0e762b493284650854a230aecd3
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user