summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorKarl Rosaen <krosaen@google.com>2009-04-29 13:35:36 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-04-29 13:35:36 -0700
commit2f7e0447ac746e940db753178d513df914c20334 (patch)
tree43443f818f9f290e1c8baa5cdd3e457792dbeb8f /core/java/android
parentd17d8b4f12509666926fd56dd158a892f68869a6 (diff)
parent98e333f551a4bf2ebb50bb97a2a56b14bfdcd74b (diff)
downloadframeworks_base-2f7e0447ac746e940db753178d513df914c20334.zip
frameworks_base-2f7e0447ac746e940db753178d513df914c20334.tar.gz
frameworks_base-2f7e0447ac746e940db753178d513df914c20334.tar.bz2
am 98e333f: Fix back key and ime behavior for search dialog.
Merge commit '98e333f551a4bf2ebb50bb97a2a56b14bfdcd74b' * commit '98e333f551a4bf2ebb50bb97a2a56b14bfdcd74b': Fix back key and ime behavior for search dialog.
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/SearchDialog.java27
-rw-r--r--core/java/android/widget/AutoCompleteTextView.java46
2 files changed, 60 insertions, 13 deletions
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index d3c29cf..2d2e710 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -17,7 +17,6 @@
package android.app;
import static android.app.SuggestionsAdapter.getColumnString;
-
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -26,8 +25,8 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.Cursor;
@@ -54,14 +53,14 @@ import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemSelectedListener;
import java.util.ArrayList;
import java.util.WeakHashMap;
@@ -163,7 +162,10 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
setContentView(com.android.internal.R.layout.search_bar);
theWindow.setLayout(ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
+ // taking up the whole window (even when transparent) is less than ideal,
+ // but necessary to show the popup window until the window manager supports
+ // having windows anchored by their parent but not clipped by them.
+ ViewGroup.LayoutParams.FILL_PARENT);
WindowManager.LayoutParams lp = theWindow.getAttributes();
lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
theWindow.setAttributes(lp);
@@ -1367,27 +1369,28 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
public boolean enoughToFilter() {
return mThreshold <= 0 || super.enoughToFilter();
}
-
+
/**
* {@link AutoCompleteTextView#onKeyPreIme(int, KeyEvent)}) dismisses the drop-down on BACK,
* so we must override this method to modify the BACK behavior.
*/
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
- return mSearchDialog.handleBackKey(keyCode, event);
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
+ if (mSearchDialog.backToPreviousComponent()) {
+ return true;
+ }
+ return false; // will dismiss soft keyboard if necessary
+ }
+ return false;
}
}
protected boolean handleBackKey(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
- mSearchAutoComplete.dismissDropDown();
if (backToPreviousComponent()) {
return true;
}
- if (!mSearchAutoComplete.isEmpty()) {
- mSearchAutoComplete.clear();
- return true;
- }
cancel();
return true;
}
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 89faa95..f999045 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -127,6 +127,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
// The widget is attached to a window when mAttachCount > 0
private int mAttachCount;
+ private AutoCompleteTextView.PassThroughClickListener mPassThroughClickListener;
+
public AutoCompleteTextView(Context context) {
this(context, null);
}
@@ -186,6 +188,28 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
setFocusable(true);
addTextChangedListener(new MyWatcher());
+
+ mPassThroughClickListener = new PassThroughClickListener();
+ super.setOnClickListener(mPassThroughClickListener);
+ }
+
+ @Override
+ public void setOnClickListener(OnClickListener listener) {
+ mPassThroughClickListener.mWrapped = listener;
+ }
+
+ /**
+ * Private hook into the on click event, dispatched from {@link PassThroughClickListener}
+ */
+ private void onClickImpl() {
+ // if drop down should always visible, bring it back in front of the soft
+ // keyboard when the user touches the text field
+ if (mDropDownAlwaysVisible
+ && mPopup.isShowing()
+ && mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED) {
+ mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
+ mPopup.update();
+ }
}
/**
@@ -1125,7 +1149,10 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
}
mPopup.setHeight(height);
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
- mPopup.setOutsideTouchable(true);
+
+ // use outside touchable to dismiss drop down when touching outside of it, so
+ // only set this if the dropdown is not always visible
+ mPopup.setOutsideTouchable(!mDropDownAlwaysVisible);
mPopup.setTouchInterceptor(new PopupTouchIntercepter());
mPopup.showAsDropDown(getDropDownAnchorView(),
mDropDownHorizontalOffset, mDropDownVerticalOffset);
@@ -1442,4 +1469,21 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
*/
CharSequence fixText(CharSequence invalidText);
}
+
+ /**
+ * Allows us a private hook into the on click event without preventing users from setting
+ * their own click listener.
+ */
+ private class PassThroughClickListener implements OnClickListener {
+
+ private View.OnClickListener mWrapped;
+
+ /** {@inheritDoc} */
+ public void onClick(View v) {
+ onClickImpl();
+
+ if (mWrapped != null) mWrapped.onClick(v);
+ }
+ }
+
}