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