UrlInputView.java revision a2b2ba8da913f26c820e49d3e43158e2fe6ebeba
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.browser; 18 19import android.app.SearchManager; 20import android.content.ContentResolver; 21import android.content.Context; 22import android.database.Cursor; 23import android.graphics.drawable.Drawable; 24import android.util.AttributeSet; 25import android.view.KeyEvent; 26import android.view.LayoutInflater; 27import android.view.View; 28import android.view.View.OnFocusChangeListener; 29import android.view.ViewGroup; 30import android.view.inputmethod.InputMethodManager; 31import android.widget.AdapterView; 32import android.widget.AdapterView.OnItemClickListener; 33import android.widget.AutoCompleteTextView; 34import android.widget.CursorAdapter; 35import android.widget.Filterable; 36import android.widget.ImageView; 37import android.widget.TextView; 38 39/** 40 * url/search input view 41 * handling suggestions 42 */ 43public class UrlInputView extends AutoCompleteTextView 44 implements OnFocusChangeListener, OnItemClickListener { 45 46 private UrlInputListener mListener; 47 private InputMethodManager mInputManager; 48 private SuggestionsAdapter mAdapter; 49 private Drawable mFocusDrawable; 50 51 public UrlInputView(Context context, AttributeSet attrs, int defStyle) { 52 super(context, attrs, defStyle); 53 init(context); 54 } 55 56 public UrlInputView(Context context, AttributeSet attrs) { 57 super(context, attrs); 58 init(context); 59 } 60 61 public UrlInputView(Context context) { 62 super(context); 63 init(context); 64 } 65 66 private void init(Context ctx) { 67 mFocusDrawable = ctx.getResources().getDrawable(R.drawable.textfield_stroke); 68 mInputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 69 setOnEditorActionListener(new OnEditorActionListener() { 70 @Override 71 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 72 finishInput(getText().toString()); 73 return true; 74 } 75 }); 76 setOnFocusChangeListener(this); 77 final ContentResolver cr = mContext.getContentResolver(); 78 mAdapter = new SuggestionsAdapter(mContext, 79 BrowserProvider.getBookmarksSuggestions(cr, null)); 80 setAdapter(mAdapter); 81 setOnItemClickListener(this); 82 setSelectAllOnFocus(true); 83 } 84 85 @Override 86 public void onFocusChange(View v, boolean hasFocus) { 87 setBackgroundDrawable(hasFocus ? mFocusDrawable : null); 88 if (hasFocus) { 89 forceIme(); 90 } else { 91 finishInput(null); 92 } 93 } 94 95 @Override 96 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 97 String url = mAdapter.getViewString(view); 98 finishInput(url); 99 } 100 101 102 public void setUrlInputListener(UrlInputListener listener) { 103 mListener = listener; 104 } 105 106 public void forceIme() { 107 mInputManager.showSoftInput(this, 0); 108 } 109 110 private void finishInput(String url) { 111 this.dismissDropDown(); 112 mInputManager.hideSoftInputFromWindow(getWindowToken(), 0); 113 if (url == null) { 114 mListener.onDismiss(); 115 } else { 116 mListener.onAction(url); 117 } 118 } 119 120 @Override 121 public boolean onKeyPreIme(int keyCode, KeyEvent evt) { 122 if (keyCode == KeyEvent.KEYCODE_BACK) { 123 // catch back key in order to do slightly more cleanup than usual 124 finishInput(null); 125 return true; 126 } 127 return super.onKeyPreIme(keyCode, evt); 128 } 129 130 interface UrlInputListener { 131 public void onDismiss(); 132 public void onAction(String text); 133 } 134 135 /** 136 * adapter used by suggestion dropdown 137 */ 138 class SuggestionsAdapter extends CursorAdapter implements Filterable { 139 140 private Cursor mLastCursor; 141 private ContentResolver mContent; 142 private int mIndexText1; 143 private int mIndexText2; 144 private int mIndexIcon; 145 146 public SuggestionsAdapter(Context context, Cursor c) { 147 super(context, c); 148 mContent = context.getContentResolver(); 149 mIndexText1 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); 150 mIndexText2 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL); 151 mIndexIcon = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); 152 } 153 154 public String getViewString(View view) { 155 TextView tv2 = (TextView) view.findViewById(android.R.id.text2); 156 if (tv2.getText().length() > 0) { 157 return tv2.getText().toString(); 158 } else { 159 TextView tv1 = (TextView) view.findViewById(android.R.id.text1); 160 return tv1.getText().toString(); 161 } 162 } 163 164 @Override 165 public View newView(Context context, Cursor cursor, ViewGroup parent) { 166 final LayoutInflater inflater = LayoutInflater.from(context); 167 final View view = inflater.inflate( 168 R.layout.simple_dropdown_item_2line, parent, false); 169 bindView(view, context, cursor); 170 return view; 171 } 172 173 @Override 174 public void bindView(View view, Context context, Cursor cursor) { 175 TextView tv1 = (TextView) view.findViewById(android.R.id.text1); 176 TextView tv2 = (TextView) view.findViewById(android.R.id.text2); 177 ImageView ic1 = (ImageView) view.findViewById(R.id.icon1); 178 tv1.setText(cursor.getString(mIndexText1)); 179 String url = cursor.getString(mIndexText2); 180 tv2.setText((url != null) ? url : ""); 181 // assume an id 182 try { 183 int id = Integer.parseInt(cursor.getString(mIndexIcon)); 184 Drawable d = context.getResources().getDrawable(id); 185 ic1.setImageDrawable(d); 186 } catch (NumberFormatException nfx) { 187 } 188 } 189 190 @Override 191 public String convertToString(Cursor cursor) { 192 return cursor.getString(mIndexText1); 193 } 194 195 @Override 196 public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 197 if (getFilterQueryProvider() != null) { 198 return getFilterQueryProvider().runQuery(constraint); 199 } 200 mLastCursor = BrowserProvider.getBookmarksSuggestions(mContent, 201 (constraint != null) ? constraint.toString() : null); 202 return mLastCursor; 203 } 204 205 } 206 207} 208