/* * 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 mVoiceButton; private ImageView mMagnify; private ImageView mClearButton; 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); mVoiceButton = (ImageView) findViewById(R.id.voice); mVoiceButton.setOnClickListener(this); mClearButton = (ImageView) findViewById(R.id.clear); mClearButton.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 protected void setSearchMode(boolean voiceSearchEnabled) { boolean showvoicebutton = voiceSearchEnabled && mUiController.supportsVoiceSearch(); mVoiceButton.setVisibility(showvoicebutton ? View.VISIBLE : View.GONE); } @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 == mVoiceButton) { mUiController.startVoiceSearch(); } 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 { 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) { switch(state) { case StateListener.STATE_NORMAL: mComboIcon.setVisibility(View.VISIBLE); mStopButton.setVisibility(View.GONE); mClearButton.setVisibility(View.GONE); mMagnify.setVisibility(View.GONE); setSearchMode(mInVoiceMode); 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); mMagnify.setVisibility(View.GONE); setSearchMode(true); 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); setSearchMode(false); 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); } }