blob: 77d7dafddf22808fe4a1c2382151973e658f7096 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.browser;
import android.app.SearchManager;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.CursorAdapter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
/**
* url/search input view
* handling suggestions
*/
public class UrlInputView extends AutoCompleteTextView
implements OnFocusChangeListener, OnItemClickListener, OnEditorActionListener {
private UrlInputListener mListener;
private InputMethodManager mInputManager;
private SuggestionsAdapter mAdapter;
private Drawable mFocusDrawable;
public UrlInputView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public UrlInputView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public UrlInputView(Context context) {
super(context);
init(context);
}
private void init(Context ctx) {
mFocusDrawable = ctx.getResources().getDrawable(R.drawable.textfield_stroke);
mInputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
setOnEditorActionListener(this);
setOnFocusChangeListener(this);
final ContentResolver cr = mContext.getContentResolver();
mAdapter = new SuggestionsAdapter(mContext,
BrowserProvider.getBookmarksSuggestions(cr, null));
setAdapter(mAdapter);
setOnItemClickListener(this);
setSelectAllOnFocus(true);
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
finishInput(getText().toString());
return true;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
setBackgroundDrawable(hasFocus ? mFocusDrawable : null);
if (hasFocus) {
forceIme();
} else {
finishInput(null);
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String url = mAdapter.getViewString(view);
finishInput(url);
}
public void setUrlInputListener(UrlInputListener listener) {
mListener = listener;
}
public void forceIme() {
mInputManager.showSoftInput(this, 0);
}
private void finishInput(String url) {
this.dismissDropDown();
mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
if (url == null) {
mListener.onDismiss();
} else {
mListener.onAction(url);
}
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent evt) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// catch back key in order to do slightly more cleanup than usual
finishInput(null);
return true;
}
return super.onKeyPreIme(keyCode, evt);
}
interface UrlInputListener {
public void onDismiss();
public void onAction(String text);
}
/**
* adapter used by suggestion dropdown
*/
class SuggestionsAdapter extends CursorAdapter implements Filterable {
private Cursor mLastCursor;
private ContentResolver mContent;
private int mIndexText1;
private int mIndexText2;
private int mIndexIcon;
public SuggestionsAdapter(Context context, Cursor c) {
super(context, c);
mContent = context.getContentResolver();
mIndexText1 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);
mIndexText2 = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL);
mIndexIcon = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1);
}
public String getViewString(View view) {
TextView tv2 = (TextView) view.findViewById(android.R.id.text2);
if (tv2.getText().length() > 0) {
return tv2.getText().toString();
} else {
TextView tv1 = (TextView) view.findViewById(android.R.id.text1);
return tv1.getText().toString();
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final LayoutInflater inflater = LayoutInflater.from(context);
final View view = inflater.inflate(
R.layout.simple_dropdown_item_2line, parent, false);
bindView(view, context, cursor);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView tv1 = (TextView) view.findViewById(android.R.id.text1);
TextView tv2 = (TextView) view.findViewById(android.R.id.text2);
ImageView ic1 = (ImageView) view.findViewById(R.id.icon1);
tv1.setText(cursor.getString(mIndexText1));
String url = cursor.getString(mIndexText2);
tv2.setText((url != null) ? url : "");
// assume an id
try {
int id = Integer.parseInt(cursor.getString(mIndexIcon));
Drawable d = context.getResources().getDrawable(id);
ic1.setImageDrawable(d);
} catch (NumberFormatException nfx) {
}
}
@Override
public String convertToString(Cursor cursor) {
return cursor.getString(mIndexText1);
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (getFilterQueryProvider() != null) {
return getFilterQueryProvider().runQuery(constraint);
}
mLastCursor = BrowserProvider.getBookmarksSuggestions(mContent,
(constraint != null) ? constraint.toString() : null);
return mLastCursor;
}
}
}