From 83fe3f559249451706957b1a5f660b2b8272f114 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Sat, 12 Sep 2009 23:38:30 -0700 Subject: Last big work on #1991910: Make swipes work with capacitive keys This takes care of allowing us to cancel the back button. The back button is a bear because it is strewn all over the place -- everywhere you can close something, there is some code looking for the back button that now needs to deal with being canceled. The main things changed are activity (of course), dialog, input method, search dialog. There are some other misc places in the framework (and some I missed here that I will get in a second pass). To facility all of this, the key dispatching APIs now provide a lot more support for dealing with looking for cancelled keys, and incidentally also provide an actual API for catching long key presses. This also helped clean up the code in PhoneWindow where it deals with all of the combinations of key pressed and releases. (And also allows people to override Activity.onKeyLongPress() to provide a different long press action for a standard key like search.) And while I was doing this, I reworked how we detect long presses by having this be part of the key event delivered by the window manager. This should greatly reduce (hopefully outright eliminate) the problems with long presses being mis-detected when an application is being slow. Change-Id: Ia19066b8d588d573df3eee6d96e1c90fdc19f57d --- core/java/android/widget/AbsListView.java | 12 ++++++++---- core/java/android/widget/AutoCompleteTextView.java | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) (limited to 'core/java/android/widget') diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 2f292d5..bed2a7a 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2945,10 +2945,14 @@ public abstract class AbsListView extends AdapterView implements Te okToSend = false; break; case KeyEvent.KEYCODE_BACK: - if (mFiltered && mPopup != null && mPopup.isShowing() && - event.getAction() == KeyEvent.ACTION_DOWN) { - handled = true; - mTextFilter.setText(""); + if (mFiltered && mPopup != null && mPopup.isShowing()) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + handled = true; + } else if (event.getAction() == KeyEvent.ACTION_UP + && event.isTracking() && !event.isCanceled()) { + handled = true; + mTextFilter.setText(""); + } } okToSend = false; break; diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java index d821a7d..7891d3c 100644 --- a/core/java/android/widget/AutoCompleteTextView.java +++ b/core/java/android/widget/AutoCompleteTextView.java @@ -132,6 +132,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe private AutoCompleteTextView.PassThroughClickListener mPassThroughClickListener; + private int mDownKeyCode; + public AutoCompleteTextView(Context context) { this(context, null); } @@ -603,12 +605,19 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN + && event.getRepeatCount() == 0) { + mDownKeyCode = keyCode; + } if (isPopupShowing()) { // special case for the back key, we do not even try to send it // to the drop down list but instead, consume it immediately if (keyCode == KeyEvent.KEYCODE_BACK && !mDropDownAlwaysVisible) { - dismissDropDown(); - return true; + if (event.getAction() == KeyEvent.ACTION_UP + && mDownKeyCode == keyCode && !event.isCanceled()) { + dismissDropDown(); + return true; + } } } return super.onKeyPreIme(keyCode, event); @@ -1017,6 +1026,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); + mDownKeyCode = 0; performValidation(); if (!hasWindowFocus && !mDropDownAlwaysVisible) { dismissDropDown(); @@ -1026,6 +1036,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); + mDownKeyCode = 0; performValidation(); if (!focused && !mDropDownAlwaysVisible) { dismissDropDown(); -- cgit v1.1