/* * Tint Browser for Android * * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 3 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ package com.seal.ui.views; import android.content.Context; import android.database.Cursor; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AutoCompleteTextView; import android.widget.FilterQueryProvider; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SimpleCursorAdapter.CursorToStringConverter; import com.seal.R; import com.seal.model.UrlSuggestionCursorAdapter; import com.seal.model.UrlSuggestionCursorAdapter.QueryBuilderListener; import com.seal.providers.BookmarksProvider; import com.seal.providers.BookmarksWrapper; public class TabletUrlBar extends LinearLayout { public interface OnTabletUrlBarEventListener { void onBackClicked(); void onForwardClicked(); void onHomeClicked(); void onBookmarksClicked(); void onGoStopReloadClicked(); void onUrlValidated(); } private Context mContext; private AutoCompleteTextView mUrl; private ImageView mBack; private ImageView mForward; private ImageView mHome; private ImageView mGoStopReload; private ImageView mBookmarks; private TextWatcher mUrlTextWatcher; private boolean mIsUrlChangedByUser = false; private OnTabletUrlBarEventListener mEventListener = null; public TabletUrlBar(Context context) { this(context, null); } public TabletUrlBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TabletUrlBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = layoutInflater.inflate(R.layout.tablet_url_bar, this); mUrl = (AutoCompleteTextView) v.findViewById(R.id.UrlBarUrlEdit); mUrl.setCompoundDrawablePadding(5); mBack = (ImageView) v.findViewById(R.id.UrlBarGoBack); mBack.setEnabled(false); mForward = (ImageView) v.findViewById(R.id.UrlBarGoForward); mForward.setEnabled(false); mHome = (ImageView) v.findViewById(R.id.UrlBarHome); mBookmarks = (ImageView) v.findViewById(R.id.UrlBarBookmarks); mGoStopReload = (ImageView) v.findViewById(R.id.UrlBarGoStopReload); String[] from = new String[] { BookmarksProvider.Columns.TITLE, BookmarksProvider.Columns.URL }; int[] to = new int[] { R.id.AutocompleteTitle, R.id.AutocompleteUrl }; UrlSuggestionCursorAdapter adapter = new UrlSuggestionCursorAdapter(mContext, R.layout.url_autocomplete_line, null, from, to, 0, new QueryBuilderListener() { @Override public void onSuggestionSelected(String url) { setUrl(url); mUrl.setSelection(url.length()); } }); adapter.setCursorToStringConverter(new CursorToStringConverter() { @Override public CharSequence convertToString(Cursor cursor) { String aColumnString = cursor.getString(cursor.getColumnIndex(BookmarksProvider.Columns.URL)); return aColumnString; } }); adapter.setFilterQueryProvider(new FilterQueryProvider() { @Override public Cursor runQuery(CharSequence constraint) { if ((constraint != null) && (constraint.length() > 0)) { return BookmarksWrapper.getUrlSuggestions(mContext.getContentResolver(), constraint.toString()); } else { return BookmarksWrapper.getUrlSuggestions(mContext.getContentResolver(), null); } } }); mUrl.setThreshold(1); mUrl.setAdapter(adapter); mUrlTextWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { mIsUrlChangedByUser = true; mGoStopReload.setImageResource(R.drawable.ic_go); } }; mUrl.addTextChangedListener(mUrlTextWatcher); mUrl.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { triggerOnUrlValidated(); return true; } return false; } }); mUrl.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { triggerOnUrlValidated(); } }); mBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mEventListener != null) { mEventListener.onBackClicked(); } } }); mForward.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mEventListener != null) { mEventListener.onForwardClicked(); } } }); mHome.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mEventListener != null) { mEventListener.onHomeClicked(); } } }); mBookmarks.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mEventListener != null) { mEventListener.onBookmarksClicked(); } } }); mGoStopReload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mEventListener != null) { mEventListener.onGoStopReloadClicked(); } } }); } public void setBackEnabled(boolean enabled) { mBack.setEnabled(enabled); } public void setForwardEnabled(boolean enabled) { mForward.setEnabled(enabled); } public void setUrl(String url) { mUrl.removeTextChangedListener(mUrlTextWatcher); mUrl.setText(url); mUrl.addTextChangedListener(mUrlTextWatcher); mIsUrlChangedByUser = false; } public boolean isUrlChangedByUser() { return mIsUrlChangedByUser; } public void setGoStopReloadImage(int resId) { mGoStopReload.setImageResource(resId); } public void setEventListener(OnTabletUrlBarEventListener listener) { mEventListener = listener; } public void setPrivateBrowsingIndicator(boolean value) { if (value) { mUrl.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_incognito_holo_dark, 0, 0, 0); } else { mUrl.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); } } public void setFocusOnUrl() { mUrl.requestFocus(); InputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); mgr.showSoftInput(mUrl, InputMethodManager.SHOW_IMPLICIT); } private void triggerOnUrlValidated() { if (mEventListener != null) { mEventListener.onUrlValidated(); } } public String getUrl() { return mUrl.getText().toString(); } }