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  */
16 package com.android.browser;
17 
18 import android.app.Activity;
19 import android.content.Context;
20 import android.content.res.Resources;
21 import android.graphics.drawable.Drawable;
22 import android.util.AttributeSet;
23 import android.view.Menu;
24 import android.view.MenuItem;
25 import android.view.View;
26 import android.view.ViewConfiguration;
27 import android.webkit.WebView;
28 import android.widget.ImageView;
29 import android.widget.PopupMenu;
30 import android.widget.PopupMenu.OnDismissListener;
31 import android.widget.PopupMenu.OnMenuItemClickListener;
32 
33 import com.android.browser.UrlInputView.StateListener;
34 
35 public class NavigationBarPhone extends NavigationBarBase implements
36         StateListener, OnMenuItemClickListener, OnDismissListener {
37 
38     private ImageView mStopButton;
39     private ImageView mMagnify;
40     private ImageView mClearButton;
41     private ImageView mVoiceButton;
42     private Drawable mStopDrawable;
43     private Drawable mRefreshDrawable;
44     private String mStopDescription;
45     private String mRefreshDescription;
46     private View mTabSwitcher;
47     private View mComboIcon;
48     private View mTitleContainer;
49     private View mMore;
50     private Drawable mTextfieldBgDrawable;
51     private PopupMenu mPopupMenu;
52     private boolean mOverflowMenuShowing;
53     private boolean mNeedsMenu;
54     private View mIncognitoIcon;
55 
NavigationBarPhone(Context context)56     public NavigationBarPhone(Context context) {
57         super(context);
58     }
59 
NavigationBarPhone(Context context, AttributeSet attrs)60     public NavigationBarPhone(Context context, AttributeSet attrs) {
61         super(context, attrs);
62     }
63 
NavigationBarPhone(Context context, AttributeSet attrs, int defStyle)64     public NavigationBarPhone(Context context, AttributeSet attrs, int defStyle) {
65         super(context, attrs, defStyle);
66     }
67 
68     @Override
onFinishInflate()69     protected void onFinishInflate() {
70         super.onFinishInflate();
71         mStopButton = (ImageView) findViewById(R.id.stop);
72         mStopButton.setOnClickListener(this);
73         mClearButton = (ImageView) findViewById(R.id.clear);
74         mClearButton.setOnClickListener(this);
75         mVoiceButton = (ImageView) findViewById(R.id.voice);
76         mVoiceButton.setOnClickListener(this);
77         mMagnify = (ImageView) findViewById(R.id.magnify);
78         mTabSwitcher = findViewById(R.id.tab_switcher);
79         mTabSwitcher.setOnClickListener(this);
80         mMore = findViewById(R.id.more);
81         mMore.setOnClickListener(this);
82         mComboIcon = findViewById(R.id.iconcombo);
83         mComboIcon.setOnClickListener(this);
84         mTitleContainer = findViewById(R.id.title_bg);
85         setFocusState(false);
86         Resources res = getContext().getResources();
87         mStopDrawable = res.getDrawable(R.drawable.ic_stop_holo_dark);
88         mRefreshDrawable = res.getDrawable(R.drawable.ic_refresh_holo_dark);
89         mStopDescription = res.getString(R.string.accessibility_button_stop);
90         mRefreshDescription = res.getString(R.string.accessibility_button_refresh);
91         mTextfieldBgDrawable = res.getDrawable(R.drawable.textfield_active_holo_dark);
92         mUrlInput.setContainer(this);
93         mUrlInput.setStateListener(this);
94         mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
95         mIncognitoIcon = findViewById(R.id.incognito_icon);
96     }
97 
98     @Override
onProgressStarted()99     public void onProgressStarted() {
100         super.onProgressStarted();
101         if (mStopButton.getDrawable() != mStopDrawable) {
102             mStopButton.setImageDrawable(mStopDrawable);
103             mStopButton.setContentDescription(mStopDescription);
104             if (mStopButton.getVisibility() != View.VISIBLE) {
105                 mComboIcon.setVisibility(View.GONE);
106                 mStopButton.setVisibility(View.VISIBLE);
107             }
108         }
109     }
110 
111     @Override
onProgressStopped()112     public void onProgressStopped() {
113         super.onProgressStopped();
114         mStopButton.setImageDrawable(mRefreshDrawable);
115         mStopButton.setContentDescription(mRefreshDescription);
116         if (!isEditingUrl()) {
117             mComboIcon.setVisibility(View.VISIBLE);
118         }
119         onStateChanged(mUrlInput.getState());
120     }
121 
122     /**
123      * Update the text displayed in the title bar.
124      * @param title String to display.  If null, the new tab string will be
125      *      shown.
126      */
127     @Override
setDisplayTitle(String title)128     void setDisplayTitle(String title) {
129         mUrlInput.setTag(title);
130         if (!isEditingUrl()) {
131             if (title == null) {
132                 mUrlInput.setText(R.string.new_tab);
133             } else {
134                 mUrlInput.setText(UrlUtils.stripUrl(title), false);
135             }
136             mUrlInput.setSelection(0);
137         }
138     }
139 
140     @Override
onClick(View v)141     public void onClick(View v) {
142         if (v == mStopButton) {
143             if (mTitleBar.isInLoad()) {
144                 mUiController.stopLoading();
145             } else {
146                 WebView web = mBaseUi.getWebView();
147                 if (web != null) {
148                     stopEditingUrl();
149                     web.reload();
150                 }
151             }
152         } else if (v == mTabSwitcher) {
153             ((PhoneUi) mBaseUi).toggleNavScreen();
154         } else if (mMore == v) {
155             showMenu(mMore);
156         } else if (mClearButton == v) {
157             mUrlInput.setText("");
158         } else if (mComboIcon == v) {
159             mUiController.showPageInfo();
160         } else if (mVoiceButton == v) {
161             mUiController.startVoiceRecognizer();
162         } else {
163             super.onClick(v);
164         }
165     }
166 
167     @Override
isMenuShowing()168     public boolean isMenuShowing() {
169         return super.isMenuShowing() || mOverflowMenuShowing;
170     }
171 
showMenu(View anchor)172     void showMenu(View anchor) {
173         Activity activity = mUiController.getActivity();
174         if (mPopupMenu == null) {
175             mPopupMenu = new PopupMenu(mContext, anchor);
176             mPopupMenu.setOnMenuItemClickListener(this);
177             mPopupMenu.setOnDismissListener(this);
178             if (!activity.onCreateOptionsMenu(mPopupMenu.getMenu())) {
179                 mPopupMenu = null;
180                 return;
181             }
182         }
183         Menu menu = mPopupMenu.getMenu();
184         if (activity.onPrepareOptionsMenu(menu)) {
185             mOverflowMenuShowing = true;
186             mPopupMenu.show();
187         }
188     }
189 
190     @Override
onDismiss(PopupMenu menu)191     public void onDismiss(PopupMenu menu) {
192         if (menu == mPopupMenu) {
193             onMenuHidden();
194         }
195     }
196 
onMenuHidden()197     private void onMenuHidden() {
198         mOverflowMenuShowing = false;
199         mBaseUi.showTitleBarForDuration();
200     }
201 
202     @Override
onFocusChange(View view, boolean hasFocus)203     public void onFocusChange(View view, boolean hasFocus) {
204         if (view == mUrlInput) {
205             if (hasFocus && !mUrlInput.getText().toString().equals(mUrlInput.getTag())) {
206                 // only change text if different
207                 mUrlInput.setText((String) mUrlInput.getTag(), false);
208                 mUrlInput.selectAll();
209             } else {
210                 setDisplayTitle(mUrlInput.getText().toString());
211             }
212         }
213         super.onFocusChange(view, hasFocus);
214     }
215 
216     @Override
onStateChanged(int state)217     public void onStateChanged(int state) {
218         mVoiceButton.setVisibility(View.GONE);
219         switch(state) {
220         case StateListener.STATE_NORMAL:
221             mComboIcon.setVisibility(View.VISIBLE);
222             mStopButton.setVisibility(View.GONE);
223             mClearButton.setVisibility(View.GONE);
224             mMagnify.setVisibility(View.GONE);
225             mTabSwitcher.setVisibility(View.VISIBLE);
226             mTitleContainer.setBackgroundDrawable(null);
227             mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
228             break;
229         case StateListener.STATE_HIGHLIGHTED:
230             mComboIcon.setVisibility(View.GONE);
231             mStopButton.setVisibility(View.VISIBLE);
232             mClearButton.setVisibility(View.GONE);
233             if ((mUiController != null) && mUiController.supportsVoice()) {
234                 mVoiceButton.setVisibility(View.VISIBLE);
235             }
236             mMagnify.setVisibility(View.GONE);
237             mTabSwitcher.setVisibility(View.GONE);
238             mMore.setVisibility(View.GONE);
239             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
240             break;
241         case StateListener.STATE_EDITED:
242             mComboIcon.setVisibility(View.GONE);
243             mStopButton.setVisibility(View.GONE);
244             mClearButton.setVisibility(View.VISIBLE);
245             mMagnify.setVisibility(View.VISIBLE);
246             mTabSwitcher.setVisibility(View.GONE);
247             mMore.setVisibility(View.GONE);
248             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
249             break;
250         }
251     }
252 
253     @Override
onTabDataChanged(Tab tab)254     public void onTabDataChanged(Tab tab) {
255         super.onTabDataChanged(tab);
256         mIncognitoIcon.setVisibility(tab.isPrivateBrowsingEnabled()
257                 ? View.VISIBLE : View.GONE);
258     }
259 
260     @Override
onMenuItemClick(MenuItem item)261     public boolean onMenuItemClick(MenuItem item) {
262         return mUiController.onOptionsItemSelected(item);
263     }
264 
265 }
266