NavigationBarPhone.java revision ef654f1dd80f55609060005342fc4f2cde62990c
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 View mTabSwitcher;
44    private View mComboIcon;
45    private View mTitleContainer;
46    private View mMore;
47    private Drawable mTextfieldBgDrawable;
48    private boolean mMenuShowing;
49    private boolean mNeedsMenu;
50
51    public NavigationBarPhone(Context context) {
52        super(context);
53    }
54
55    public NavigationBarPhone(Context context, AttributeSet attrs) {
56        super(context, attrs);
57    }
58
59    public NavigationBarPhone(Context context, AttributeSet attrs, int defStyle) {
60        super(context, attrs, defStyle);
61    }
62
63    @Override
64    protected void onFinishInflate() {
65        super.onFinishInflate();
66        mStopButton = (ImageView) findViewById(R.id.stop);
67        mStopButton.setOnClickListener(this);
68        mVoiceButton = (ImageView) findViewById(R.id.voice);
69        mVoiceButton.setOnClickListener(this);
70        mTabSwitcher = findViewById(R.id.tab_switcher);
71        mTabSwitcher.setOnClickListener(this);
72        mMore = findViewById(R.id.more);
73        mMore.setOnClickListener(this);
74        mComboIcon = findViewById(R.id.iconcombo);
75        mTitleContainer = findViewById(R.id.title_bg);
76        setFocusState(false);
77        Resources res = getContext().getResources();
78        mStopDrawable = res.getDrawable(R.drawable.ic_stop_holo_dark);
79        mRefreshDrawable = res.getDrawable(R.drawable.ic_refresh_holo_dark);
80        mTextfieldBgDrawable = res.getDrawable(R.drawable.textfield_active_holo_dark);
81        setUaSwitcher(mComboIcon);
82        mUrlInput.setContainer(this);
83        mUrlInput.setStateListener(this);
84        mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
85    }
86
87    @Override
88    public void createContextMenu(ContextMenu menu) {
89        Activity activity = mBaseUi.getActivity();
90        MenuInflater inflater = activity.getMenuInflater();
91        inflater.inflate(R.menu.title_context, menu);
92        activity.onCreateContextMenu(menu, this, null);
93    }
94
95    @Override
96    protected void setSearchMode(boolean voiceSearchEnabled) {
97        boolean showvoicebutton = voiceSearchEnabled &&
98                mUiController.supportsVoiceSearch();
99        mVoiceButton.setVisibility(showvoicebutton ? View.VISIBLE :
100                View.GONE);
101    }
102
103    @Override
104    public void onProgressStarted() {
105        super.onProgressStarted();
106        if (mStopButton.getDrawable() != mStopDrawable) {
107            mStopButton.setImageDrawable(mStopDrawable);
108            if (mStopButton.getVisibility() != View.VISIBLE) {
109                mComboIcon.setVisibility(View.GONE);
110                mStopButton.setVisibility(View.VISIBLE);
111            }
112        }
113    }
114
115    @Override
116    public void onProgressStopped() {
117        super.onProgressStopped();
118        mStopButton.setVisibility(View.GONE);
119        mStopButton.setImageDrawable(mRefreshDrawable);
120        if (!isEditingUrl()) {
121            mComboIcon.setVisibility(View.VISIBLE);
122        }
123    }
124
125    /**
126     * Update the text displayed in the title bar.
127     * @param title String to display.  If null, the new tab string will be
128     *      shown.
129     */
130    @Override
131    void setDisplayTitle(String title) {
132        if (!isEditingUrl()) {
133            if (title == null) {
134                mUrlInput.setText(R.string.new_tab);
135            } else {
136                mUrlInput.setText(title);
137            }
138            mUrlInput.setSelection(0);
139        }
140    }
141
142    @Override
143    public void onClick(View v) {
144        if (v == mStopButton) {
145            if (mTitleBar.isInLoad()) {
146                mUiController.stopLoading();
147            } else {
148                WebView web = mBaseUi.getWebView();
149                if (web != null) {
150                    stopEditingUrl();
151                    web.reload();
152                }
153            }
154        } else if (v == mVoiceButton) {
155            mUiController.startVoiceSearch();
156        } else if (v == mTabSwitcher) {
157            mBaseUi.onMenuKey();
158        } else if (mMore == v) {
159            showMenu(mMore);
160        } else {
161            super.onClick(v);
162        }
163    }
164
165    public boolean isMenuShowing() {
166        return mMenuShowing;
167    }
168
169    void showMenu(View anchor) {
170        mMenuShowing = true;
171        PopupMenu popup = new PopupMenu(mContext, anchor);
172        Menu menu = popup.getMenu();
173        popup.getMenuInflater().inflate(R.menu.browser, menu);
174        menu.setGroupVisible(R.id.NAV_MENU, false);
175        popup.setOnMenuItemClickListener(this);
176        popup.setOnDismissListener(this);
177        popup.show();
178    }
179
180    @Override
181    public void onDismiss(PopupMenu menu) {
182        onMenuHidden();
183    }
184
185    @Override
186    public boolean onMenuItemClick(MenuItem item) {
187        onMenuHidden();
188        boolean res = mUiController.onOptionsItemSelected(item);
189        if (!res) {
190            return super.onMenuItemClick(item);
191        }
192        return res;
193    }
194
195    private void onMenuHidden() {
196        mMenuShowing = false;
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(false);
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