/* * 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.app.Activity; import android.content.Context; import android.content.Intent; 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.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewConfiguration; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.FilterQueryProvider; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupMenu; import android.widget.RelativeLayout; import android.widget.SimpleCursorAdapter.CursorToStringConverter; import android.widget.TextView; import com.seal.R; import com.seal.controllers.Controller; import com.seal.model.UrlSuggestionCursorAdapter; import com.seal.model.UrlSuggestionCursorAdapter.QueryBuilderListener; import com.seal.providers.BookmarksProvider; import com.seal.providers.BookmarksWrapper; import com.zxing.barcode.util.CaptureActivity; public class PhoneUrlBar extends LinearLayout { public interface OnPhoneUrlBarEventListener { void onVisibilityChanged(boolean urlBarVisible); void onUrlValidated(); void onGoStopReloadClicked(); void onMenuVisibilityChanged(boolean isVisible); } private Context mContext; private Activity mActivity; private PopupMenu mPopupMenu; private RelativeLayout mTitleLayout; private RelativeLayout mUrlLayout; private TextView mSubTitle; private ClearAutocompleteText mUrl; private ImageView mPrivateBrowsing; private ImageView mGoStopReload; private ImageView mMenuButton; private ImageView UrlBarQrcode; private TextWatcher mUrlTextWatcher; private boolean mIsUrlBarVisible = false; private boolean mIsUrlChangedByUser = false; private OnPhoneUrlBarEventListener mEventListener = null; private boolean mOverflowMenuShowing; public PhoneUrlBar(Context context) { this(context, null); } public PhoneUrlBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PhoneUrlBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; mActivity = Controller.getInstance().getMainActivity(); LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = layoutInflater.inflate(R.layout.phone_url_bar, this); mPrivateBrowsing = (ImageView) v.findViewById(R.id.ImagePrivateBrowsing); mTitleLayout = (RelativeLayout) v.findViewById(R.id.UrlBarTitleLayout); mUrlLayout = (RelativeLayout) v.findViewById(R.id.UrlBarUrlLayout); mSubTitle = (TextView) v.findViewById(R.id.UrlBarSubTitle); mUrl = (ClearAutocompleteText) v.findViewById(R.id.UrlBarUrlEdit); mGoStopReload = (ImageView) v.findViewById(R.id.UrlBarGoStopReload); UrlBarQrcode = (ImageView) v.findViewById(R.id.UrlBarQrcode); mMenuButton = (ImageView) v.findViewById(R.id.MenuButton); if (ViewConfiguration.get(mContext).hasPermanentMenuKey()) { mMenuButton.setVisibility(View.GONE); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mGoStopReload.getLayoutParams(); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); mGoStopReload.setLayoutParams(params); } else { mMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mActivity == null) { mActivity = Controller.getInstance().getMainActivity(); } if (mPopupMenu == null) { mPopupMenu = new PopupMenu(mContext, mMenuButton); mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return mActivity.onOptionsItemSelected(item); } }); mPopupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() { @Override public void onDismiss(PopupMenu menu) { if (menu == mPopupMenu) { mOverflowMenuShowing = false; if (mEventListener != null) { mEventListener.onMenuVisibilityChanged(mOverflowMenuShowing); } } } }); if (!mActivity.onCreateOptionsMenu(mPopupMenu.getMenu())) { mPopupMenu = null; return; } } Menu menu = mPopupMenu.getMenu(); if (mActivity.onPrepareOptionsMenu(menu)) { mOverflowMenuShowing = true; mPopupMenu.show(); if (mEventListener != null) { mEventListener.onMenuVisibilityChanged(mOverflowMenuShowing); } } } }); } mTitleLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showUrl(); } }); mSubTitle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showUrl(); } }); 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(); } }); mUrl.setDropDownAnchor(R.id.UrlBarContainer); mGoStopReload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mEventListener != null) { mEventListener.onGoStopReloadClicked(); } } }); UrlBarQrcode.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(mContext, CaptureActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(i); } }); } public void setSubtitle(String subtitle) { mSubTitle.setText(subtitle); if ((subtitle == null) || (subtitle.isEmpty())) { mSubTitle.setVisibility(View.GONE); } else { mSubTitle.setVisibility(View.VISIBLE); } } public void setSubtitle(int resId) { setSubtitle(mContext.getString(resId)); } public void showUrl() { mTitleLayout.setVisibility(View.GONE); mUrlLayout.setVisibility(View.VISIBLE); mIsUrlBarVisible = true; mUrl.requestFocus(); InputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); mgr.showSoftInput(mUrl, InputMethodManager.SHOW_IMPLICIT); triggerOnUrlBarVisibilityChanged(); } public void hideUrl() { hideUrl(true); } public void hideUrl(boolean hideKeyboard) { mUrlLayout.setVisibility(View.GONE); mTitleLayout.setVisibility(View.VISIBLE); mIsUrlBarVisible = false; if (hideKeyboard) { InputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); mgr.hideSoftInputFromWindow(mUrl.getWindowToken(), 0); } triggerOnUrlBarVisibilityChanged(); } public boolean isUrlBarVisible() { return mIsUrlBarVisible; } public String getUrl() { return mUrl.getText().toString(); } 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 showGoStopReloadButton() { mGoStopReload.setVisibility(View.VISIBLE); } public void hideGoStopReloadButton() { mGoStopReload.setVisibility(View.GONE); } public void setEventListener(OnPhoneUrlBarEventListener listener) { mEventListener = listener; } public boolean isMenuShowing() { return mOverflowMenuShowing; } public void setPrivateBrowsingIndicator(boolean value) { if (value) { mPrivateBrowsing.setVisibility(View.VISIBLE); } else { mPrivateBrowsing.setVisibility(View.GONE); } } private void triggerOnUrlBarVisibilityChanged() { if (mEventListener != null) { mEventListener.onVisibilityChanged(mIsUrlBarVisible); } } private void triggerOnUrlValidated() { if (mEventListener != null) { mEventListener.onUrlValidated(); } } }