summaryrefslogtreecommitdiff
path: root/core/java/android/widget/AutoCompleteTextView.java
diff options
context:
space:
mode:
authorShan Huang <shanh@google.com>2022-05-17 07:43:50 +0000
committerShan Huang <shanh@google.com>2022-05-18 19:08:59 +0000
commit7caa2c1c6bc20c63f8961eee4e02b461835f8922 (patch)
tree623df90c7cfa7d24ea830a6ab8a0e19051b008ef /core/java/android/widget/AutoCompleteTextView.java
parentcd1a10a216eeb9bcae0c6899df8d3c368284c5bc (diff)
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
Diffstat (limited to 'core/java/android/widget/AutoCompleteTextView.java')
-rw-r--r--core/java/android/widget/AutoCompleteTextView.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index cfae95dc414f..49d823b590c9 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -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);