blob: f3eaa2a45688c4cf7957d1947f4c387e7744e97a [file] [log] [blame]
/*
* Copyright (C) 2011 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.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnDismissListener;
import android.widget.PopupMenu.OnMenuItemClickListener;
import com.android.browser.UrlInputView.StateListener;
public class NavigationBarPhone extends NavigationBarBase implements
StateListener, OnMenuItemClickListener, OnDismissListener {
private ImageView mStopButton;
private ImageView mMagnify;
private ImageView mClearButton;
private ImageView mVoiceButton;
private Drawable mStopDrawable;
private Drawable mRefreshDrawable;
private String mStopDescription;
private String mRefreshDescription;
private View mTabSwitcher;
private View mComboIcon;
private View mTitleContainer;
private View mMore;
private Drawable mTextfieldBgDrawable;
private PopupMenu mPopupMenu;
private boolean mOverflowMenuShowing;
private boolean mNeedsMenu;
private View mIncognitoIcon;
public NavigationBarPhone(Context context) {
super(context);
}
public NavigationBarPhone(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NavigationBarPhone(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mStopButton = (ImageView) findViewById(R.id.stop);
mStopButton.setOnClickListener(this);
mClearButton = (ImageView) findViewById(R.id.clear);
mClearButton.setOnClickListener(this);
mVoiceButton = (ImageView) findViewById(R.id.voice);
mVoiceButton.setOnClickListener(this);
mMagnify = (ImageView) findViewById(R.id.magnify);
mTabSwitcher = findViewById(R.id.tab_switcher);
mTabSwitcher.setOnClickListener(this);
mMore = findViewById(R.id.more);
mMore.setOnClickListener(this);
mComboIcon = findViewById(R.id.iconcombo);
mComboIcon.setOnClickListener(this);
mTitleContainer = findViewById(R.id.title_bg);
setFocusState(false);
Resources res = getContext().getResources();
mStopDrawable = res.getDrawable(R.drawable.ic_stop_holo_dark);
mRefreshDrawable = res.getDrawable(R.drawable.ic_refresh_holo_dark);
mStopDescription = res.getString(R.string.accessibility_button_stop);
mRefreshDescription = res.getString(R.string.accessibility_button_refresh);
mTextfieldBgDrawable = res.getDrawable(R.drawable.textfield_active_holo_dark);
mUrlInput.setContainer(this);
mUrlInput.setStateListener(this);
mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
mIncognitoIcon = findViewById(R.id.incognito_icon);
}
@Override
public void onProgressStarted() {
super.onProgressStarted();
if (mStopButton.getDrawable() != mStopDrawable) {
mStopButton.setImageDrawable(mStopDrawable);
mStopButton.setContentDescription(mStopDescription);
if (mStopButton.getVisibility() != View.VISIBLE) {
mComboIcon.setVisibility(View.GONE);
mStopButton.setVisibility(View.VISIBLE);
}
}
}
@Override
public void onProgressStopped() {
super.onProgressStopped();
mStopButton.setImageDrawable(mRefreshDrawable);
mStopButton.setContentDescription(mRefreshDescription);
if (!isEditingUrl()) {
mComboIcon.setVisibility(View.VISIBLE);
}
onStateChanged(mUrlInput.getState());
}
/**
* Update the text displayed in the title bar.
* @param title String to display. If null, the new tab string will be
* shown.
*/
@Override
void setDisplayTitle(String title) {
mUrlInput.setTag(title);
if (!isEditingUrl()) {
if (title == null) {
mUrlInput.setText(R.string.new_tab);
} else {
mUrlInput.setText(UrlUtils.stripUrl(title), false);
}
mUrlInput.setSelection(0);
}
}
@Override
public void onClick(View v) {
if (v == mStopButton) {
if (mTitleBar.isInLoad()) {
mUiController.stopLoading();
} else {
WebView web = mBaseUi.getWebView();
if (web != null) {
stopEditingUrl();
web.reload();
}
}
} else if (v == mTabSwitcher) {
((PhoneUi) mBaseUi).toggleNavScreen();
} else if (mMore == v) {
showMenu(mMore);
} else if (mClearButton == v) {
mUrlInput.setText("");
} else if (mComboIcon == v) {
mUiController.showPageInfo();
} else if (mVoiceButton == v) {
mUiController.startVoiceRecognizer();
} else {
super.onClick(v);
}
}
@Override
public boolean isMenuShowing() {
return super.isMenuShowing() || mOverflowMenuShowing;
}
void showMenu(View anchor) {
Activity activity = mUiController.getActivity();
if (mPopupMenu == null) {
mPopupMenu = new PopupMenu(mContext, anchor);
mPopupMenu.setOnMenuItemClickListener(this);
mPopupMenu.setOnDismissListener(this);
if (!activity.onCreateOptionsMenu(mPopupMenu.getMenu())) {
mPopupMenu = null;
return;
}
}
Menu menu = mPopupMenu.getMenu();
if (activity.onPrepareOptionsMenu(menu)) {
mOverflowMenuShowing = true;
mPopupMenu.show();
}
}
@Override
public void onDismiss(PopupMenu menu) {
if (menu == mPopupMenu) {
onMenuHidden();
}
}
private void onMenuHidden() {
mOverflowMenuShowing = false;
mBaseUi.showTitleBarForDuration();
}
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (view == mUrlInput) {
if (hasFocus && !mUrlInput.getText().toString().equals(mUrlInput.getTag())) {
// only change text if different
mUrlInput.setText((String) mUrlInput.getTag(), false);
mUrlInput.selectAll();
} else {
setDisplayTitle(mUrlInput.getText().toString());
}
}
super.onFocusChange(view, hasFocus);
}
@Override
public void onStateChanged(int state) {
mVoiceButton.setVisibility(View.GONE);
switch(state) {
case StateListener.STATE_NORMAL:
mComboIcon.setVisibility(View.VISIBLE);
mStopButton.setVisibility(View.GONE);
mClearButton.setVisibility(View.GONE);
mMagnify.setVisibility(View.GONE);
mTabSwitcher.setVisibility(View.VISIBLE);
mTitleContainer.setBackgroundDrawable(null);
mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
break;
case StateListener.STATE_HIGHLIGHTED:
mComboIcon.setVisibility(View.GONE);
mStopButton.setVisibility(View.VISIBLE);
mClearButton.setVisibility(View.GONE);
if ((mUiController != null) && mUiController.supportsVoice()) {
mVoiceButton.setVisibility(View.VISIBLE);
}
mMagnify.setVisibility(View.GONE);
mTabSwitcher.setVisibility(View.GONE);
mMore.setVisibility(View.GONE);
mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
break;
case StateListener.STATE_EDITED:
mComboIcon.setVisibility(View.GONE);
mStopButton.setVisibility(View.GONE);
mClearButton.setVisibility(View.VISIBLE);
mMagnify.setVisibility(View.VISIBLE);
mTabSwitcher.setVisibility(View.GONE);
mMore.setVisibility(View.GONE);
mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
break;
}
}
@Override
public void onTabDataChanged(Tab tab) {
super.onTabDataChanged(tab);
mIncognitoIcon.setVisibility(tab.isPrivateBrowsingEnabled()
? View.VISIBLE : View.GONE);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return mUiController.onOptionsItemSelected(item);
}
}