NavigationBarPhone.java revision 30adae6ebf17a724d24066a200432e6b22a4eeff
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package com.android.browser; 17 18import android.app.Activity; 19import android.content.Context; 20import android.content.res.Resources; 21import android.graphics.drawable.Drawable; 22import android.util.AttributeSet; 23import android.view.ContextMenu; 24import android.view.Menu; 25import android.view.MenuInflater; 26import android.view.MenuItem; 27import android.view.View; 28import android.view.ViewConfiguration; 29import android.webkit.WebView; 30import android.widget.ImageView; 31import android.widget.PopupMenu; 32import android.widget.PopupMenu.OnDismissListener; 33 34import com.android.browser.UrlInputView.StateListener; 35 36public class NavigationBarPhone extends NavigationBarBase implements 37 StateListener, OnDismissListener { 38 39 private ImageView mStopButton; 40 private ImageView mVoiceButton; 41 private Drawable mStopDrawable; 42 private Drawable mRefreshDrawable; 43 private String mStopDescription; 44 private String mRefreshDescription; 45 private View mTabSwitcher; 46 private View mComboIcon; 47 private View mTitleContainer; 48 private View mMore; 49 private Drawable mTextfieldBgDrawable; 50 private PopupMenu mPopupMenu; 51 private boolean mMenuShowing; 52 private boolean mNeedsMenu; 53 54 public NavigationBarPhone(Context context) { 55 super(context); 56 } 57 58 public NavigationBarPhone(Context context, AttributeSet attrs) { 59 super(context, attrs); 60 } 61 62 public NavigationBarPhone(Context context, AttributeSet attrs, int defStyle) { 63 super(context, attrs, defStyle); 64 } 65 66 @Override 67 protected void onFinishInflate() { 68 super.onFinishInflate(); 69 mStopButton = (ImageView) findViewById(R.id.stop); 70 mStopButton.setOnClickListener(this); 71 mVoiceButton = (ImageView) findViewById(R.id.voice); 72 mVoiceButton.setOnClickListener(this); 73 mTabSwitcher = findViewById(R.id.tab_switcher); 74 mTabSwitcher.setOnClickListener(this); 75 mMore = findViewById(R.id.more); 76 mMore.setOnClickListener(this); 77 mComboIcon = findViewById(R.id.iconcombo); 78 mTitleContainer = findViewById(R.id.title_bg); 79 setFocusState(false); 80 Resources res = getContext().getResources(); 81 mStopDrawable = res.getDrawable(R.drawable.ic_stop_holo_dark); 82 mRefreshDrawable = res.getDrawable(R.drawable.ic_refresh_holo_dark); 83 mStopDescription = res.getString(R.string.accessibility_button_stop); 84 mRefreshDescription = res.getString(R.string.accessibility_button_refresh); 85 mTextfieldBgDrawable = res.getDrawable(R.drawable.textfield_active_holo_dark); 86 setUaSwitcher(mComboIcon); 87 mUrlInput.setContainer(this); 88 mUrlInput.setStateListener(this); 89 mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey(); 90 } 91 92 @Override 93 protected void setSearchMode(boolean voiceSearchEnabled) { 94 boolean showvoicebutton = voiceSearchEnabled && 95 mUiController.supportsVoiceSearch(); 96 mVoiceButton.setVisibility(showvoicebutton ? View.VISIBLE : 97 View.GONE); 98 } 99 100 @Override 101 public void onProgressStarted() { 102 super.onProgressStarted(); 103 if (mStopButton.getDrawable() != mStopDrawable) { 104 mStopButton.setImageDrawable(mStopDrawable); 105 mStopButton.setContentDescription(mStopDescription); 106 if (mStopButton.getVisibility() != View.VISIBLE) { 107 mComboIcon.setVisibility(View.GONE); 108 mStopButton.setVisibility(View.VISIBLE); 109 } 110 } 111 } 112 113 @Override 114 public void onProgressStopped() { 115 super.onProgressStopped(); 116 mStopButton.setImageDrawable(mRefreshDrawable); 117 mStopButton.setContentDescription(mRefreshDescription); 118 if (!isEditingUrl()) { 119 mComboIcon.setVisibility(View.VISIBLE); 120 } 121 onStateChanged(mUrlInput.getState()); 122 } 123 124 /** 125 * Update the text displayed in the title bar. 126 * @param title String to display. If null, the new tab string will be 127 * shown. 128 */ 129 @Override 130 void setDisplayTitle(String title) { 131 if (!isEditingUrl()) { 132 if (title == null) { 133 mUrlInput.setText(R.string.new_tab); 134 } else { 135 mUrlInput.setText(title); 136 } 137 mUrlInput.setSelection(0); 138 } 139 } 140 141 @Override 142 public void onClick(View v) { 143 if (v == mStopButton) { 144 if (mTitleBar.isInLoad()) { 145 mUiController.stopLoading(); 146 } else { 147 WebView web = mBaseUi.getWebView(); 148 if (web != null) { 149 stopEditingUrl(); 150 web.reload(); 151 } 152 } 153 } else if (v == mVoiceButton) { 154 mUiController.startVoiceSearch(); 155 } else if (v == mTabSwitcher) { 156 ((PhoneUi) mBaseUi).toggleNavScreen(); 157 } else if (mMore == v) { 158 showMenu(mMore); 159 } else { 160 super.onClick(v); 161 } 162 } 163 164 public boolean isMenuShowing() { 165 return mMenuShowing; 166 } 167 168 void showMenu(View anchor) { 169 mMenuShowing = true; 170 mPopupMenu = new PopupMenu(mContext, anchor); 171 Menu menu = mPopupMenu.getMenu(); 172 mPopupMenu.getMenuInflater().inflate(R.menu.browser, menu); 173 mUiController.updateMenuState(mBaseUi.getActiveTab(), menu); 174 mPopupMenu.setOnMenuItemClickListener(this); 175 mPopupMenu.setOnDismissListener(this); 176 mPopupMenu.show(); 177 } 178 179 @Override 180 public void onDismiss(PopupMenu menu) { 181 onMenuHidden(); 182 } 183 184 @Override 185 public boolean onMenuItemClick(MenuItem item) { 186 onMenuHidden(); 187 boolean res = mUiController.onOptionsItemSelected(item); 188 if (!res) { 189 return super.onMenuItemClick(item); 190 } 191 return res; 192 } 193 194 private void onMenuHidden() { 195 mMenuShowing = false; 196 mPopupMenu = null; 197 mBaseUi.showTitleBarForDuration(); 198 } 199 200 @Override 201 public void onStateChanged(int state) { 202 switch(state) { 203 case StateListener.STATE_NORMAL: 204 mComboIcon.setVisibility(View.VISIBLE); 205 mStopButton.setVisibility(View.GONE); 206 setSearchMode(mInVoiceMode); 207 mTabSwitcher.setVisibility(View.VISIBLE); 208 mTitleContainer.setBackgroundDrawable(null); 209 mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE); 210 break; 211 case StateListener.STATE_HIGHLIGHTED: 212 mComboIcon.setVisibility(View.GONE); 213 mStopButton.setVisibility(View.VISIBLE); 214 setSearchMode(true); 215 mTabSwitcher.setVisibility(View.GONE); 216 mMore.setVisibility(View.GONE); 217 mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable); 218 break; 219 case StateListener.STATE_EDITED: 220 mComboIcon.setVisibility(View.GONE); 221 mStopButton.setVisibility(View.GONE); 222 setSearchMode(false); 223 mTabSwitcher.setVisibility(View.GONE); 224 mMore.setVisibility(View.GONE); 225 mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable); 226 break; 227 } 228 } 229} 230