diff options
| author | Shan Huang <shanh@google.com> | 2022-05-17 07:43:50 +0000 |
|---|---|---|
| committer | Shan Huang <shanh@google.com> | 2022-05-18 19:08:59 +0000 |
| commit | 7caa2c1c6bc20c63f8961eee4e02b461835f8922 (patch) | |
| tree | 623df90c7cfa7d24ea830a6ab8a0e19051b008ef /core/java/android/widget/AutoCompleteTextView.java | |
| parent | cd1a10a216eeb9bcae0c6899df8d3c368284c5bc (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.java | 47 |
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); |
