NavigationBarTablet.java revision f3174a588cdf63ef59055998c23aad4b36b7856e
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.animation.Animator;
19import android.animation.AnimatorListenerAdapter;
20import android.animation.AnimatorSet;
21import android.animation.ObjectAnimator;
22import android.content.Context;
23import android.content.Intent;
24import android.content.res.Configuration;
25import android.content.res.Resources;
26import android.graphics.Bitmap;
27import android.graphics.drawable.Drawable;
28import android.text.TextUtils;
29import android.util.AttributeSet;
30import android.view.View;
31import android.widget.ImageButton;
32import android.widget.ImageView;
33
34import com.android.browser.UI.ComboViews;
35
36import java.util.List;
37
38public class NavigationBarTablet extends NavigationBarBase {
39
40    private Drawable mStopDrawable;
41    private Drawable mReloadDrawable;
42    private String mStopDescription;
43    private String mRefreshDescription;
44
45    private View mUrlContainer;
46    private ImageButton mBackButton;
47    private ImageButton mForwardButton;
48    private ImageView mStar;
49    private ImageView mUrlIcon;
50    private ImageView mSearchButton;
51    private View mGoButton;
52    private ImageView mStopButton;
53    private View mAllButton;
54    private View mClearButton;
55    private ImageView mVoiceSearch;
56    private View mNavButtons;
57    private Drawable mFocusDrawable;
58    private Drawable mUnfocusDrawable;
59    private boolean mHideNavButtons;
60    private Drawable mFaviconDrawable;
61
62    public NavigationBarTablet(Context context) {
63        super(context);
64        init(context);
65    }
66
67    public NavigationBarTablet(Context context, AttributeSet attrs) {
68        super(context, attrs);
69        init(context);
70    }
71
72    public NavigationBarTablet(Context context, AttributeSet attrs, int defStyle) {
73        super(context, attrs, defStyle);
74        init(context);
75    }
76
77    private void init(Context context) {
78        Resources resources = context.getResources();
79        mStopDrawable = resources.getDrawable(R.drawable.ic_stop_holo_dark);
80        mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_holo_dark);
81        mStopDescription = resources.getString(R.string.accessibility_button_stop);
82        mRefreshDescription = resources.getString(R.string.accessibility_button_refresh);
83        mFocusDrawable = resources.getDrawable(
84                R.drawable.textfield_active_holo_dark);
85        mUnfocusDrawable = resources.getDrawable(
86                R.drawable.textfield_default_holo_dark);
87        mHideNavButtons = resources.getBoolean(R.bool.hide_nav_buttons);
88    }
89
90    @Override
91    protected void onFinishInflate() {
92        super.onFinishInflate();
93        mAllButton = findViewById(R.id.all_btn);
94        // TODO: Change enabled states based on whether you can go
95        // back/forward.  Probably should be done inside onPageStarted.
96        mNavButtons = findViewById(R.id.navbuttons);
97        mBackButton = (ImageButton) findViewById(R.id.back);
98        mForwardButton = (ImageButton) findViewById(R.id.forward);
99        mUrlIcon = (ImageView) findViewById(R.id.url_icon);
100        mStar = (ImageView) findViewById(R.id.star);
101        mStopButton = (ImageView) findViewById(R.id.stop);
102        mSearchButton = (ImageView) findViewById(R.id.search);
103        mGoButton = findViewById(R.id.go);
104        mClearButton = findViewById(R.id.clear);
105        mVoiceSearch = (ImageView) findViewById(R.id.voicesearch);
106        mUrlContainer = findViewById(R.id.urlbar_focused);
107        mBackButton.setOnClickListener(this);
108        mForwardButton.setOnClickListener(this);
109        mStar.setOnClickListener(this);
110        mAllButton.setOnClickListener(this);
111        mStopButton.setOnClickListener(this);
112        mSearchButton.setOnClickListener(this);
113        mGoButton.setOnClickListener(this);
114        mClearButton.setOnClickListener(this);
115        mVoiceSearch.setOnClickListener(this);
116        mUrlInput.setContainer(mUrlContainer);
117    }
118
119    public void onConfigurationChanged(Configuration config) {
120        super.onConfigurationChanged(config);
121        Resources res = mContext.getResources();
122        mHideNavButtons = res.getBoolean(R.bool.hide_nav_buttons);
123        if (mUrlInput.hasFocus()) {
124            if (mHideNavButtons && (mNavButtons.getVisibility() == View.VISIBLE)) {
125                int aw = mNavButtons.getMeasuredWidth();
126                mNavButtons.setVisibility(View.GONE);
127                mNavButtons.setAlpha(0f);
128                mNavButtons.setTranslationX(-aw);
129            } else if (!mHideNavButtons && (mNavButtons.getVisibility() == View.GONE)) {
130                mNavButtons.setVisibility(View.VISIBLE);
131                mNavButtons.setAlpha(1f);
132                mNavButtons.setTranslationX(0);
133            }
134        }
135    }
136
137    @Override
138    public void setTitleBar(TitleBar titleBar) {
139        super.setTitleBar(titleBar);
140        setFocusState(false);
141    }
142
143    void updateNavigationState(Tab tab) {
144        if (tab != null) {
145            mBackButton.setImageResource(tab.canGoBack()
146                    ? R.drawable.ic_back_holo_dark
147                    : R.drawable.ic_back_disabled_holo_dark);
148            mForwardButton.setImageResource(tab.canGoForward()
149                    ? R.drawable.ic_forward_holo_dark
150                    : R.drawable.ic_forward_disabled_holo_dark);
151        }
152        updateUrlIcon();
153    }
154
155    @Override
156    public void onTabDataChanged(Tab tab) {
157        super.onTabDataChanged(tab);
158        showHideStar(tab);
159    }
160
161    @Override
162    public void setCurrentUrlIsBookmark(boolean isBookmark) {
163        mStar.setActivated(isBookmark);
164    }
165
166    @Override
167    public void onClick(View v) {
168        if (mBackButton == v) {
169            mUiController.getCurrentTab().goBack();
170        } else if (mForwardButton == v) {
171            mUiController.getCurrentTab().goForward();
172        } else if (mStar == v) {
173            Intent intent = mUiController.createBookmarkCurrentPageIntent(true);
174            if (intent != null) {
175                getContext().startActivity(intent);
176            }
177        } else if (mAllButton == v) {
178            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
179        } else if (mSearchButton == v) {
180            mBaseUi.editUrl(true);
181        } else if (mStopButton == v) {
182            stopOrRefresh();
183        } else if (mGoButton == v) {
184            if (!TextUtils.isEmpty(mUrlInput.getText())) {
185                onAction(mUrlInput.getText().toString(), null,
186                        UrlInputView.TYPED);
187            }
188        } else if (mClearButton == v) {
189            clearOrClose();
190        } else if (mVoiceSearch == v) {
191            mUiController.startVoiceSearch();
192        } else {
193            super.onClick(v);
194        }
195    }
196
197    private void clearOrClose() {
198        if (TextUtils.isEmpty(mUrlInput.getText())) {
199            // close
200            mUrlInput.clearFocus();
201        } else {
202            // clear
203            mUrlInput.setText("");
204        }
205    }
206
207    @Override
208    public void setFavicon(Bitmap icon) {
209        mFaviconDrawable = mBaseUi.getFaviconDrawable(icon);
210        updateUrlIcon();
211    }
212
213    void updateUrlIcon() {
214        if (mUrlInput.hasFocus()) {
215            mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
216        } else {
217            if (mInVoiceMode) {
218                mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
219            } else {
220                if (mFaviconDrawable == null) {
221                    mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
222                }
223                mUrlIcon.setImageDrawable(mFaviconDrawable);
224            }
225        }
226    }
227
228    @Override
229    protected void setFocusState(boolean focus) {
230        super.setFocusState(focus);
231        if (focus) {
232            if (mHideNavButtons) {
233                hideNavButtons();
234            }
235            mSearchButton.setVisibility(View.GONE);
236            mStar.setVisibility(View.GONE);
237            mClearButton.setVisibility(View.VISIBLE);
238            mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
239            updateSearchMode(false);
240        } else {
241            if (mHideNavButtons) {
242                showNavButtons();
243            }
244            mGoButton.setVisibility(View.GONE);
245            mVoiceSearch.setVisibility(View.GONE);
246            showHideStar(mUiController.getCurrentTab());
247            mClearButton.setVisibility(View.GONE);
248            if (mTitleBar.useQuickControls()) {
249                mSearchButton.setVisibility(View.GONE);
250            } else {
251                mSearchButton.setVisibility(View.VISIBLE);
252            }
253            updateUrlIcon();
254        }
255        mUrlContainer.setBackgroundDrawable(focus
256                ? mFocusDrawable : mUnfocusDrawable);
257    }
258
259    private void stopOrRefresh() {
260        if (mUiController == null) return;
261        if (mTitleBar.isInLoad()) {
262            mUiController.stopLoading();
263        } else {
264            mUiController.getCurrentTopWebView().reload();
265        }
266    }
267
268    @Override
269    public void onProgressStarted() {
270        mStopButton.setImageDrawable(mStopDrawable);
271        mStopButton.setContentDescription(mStopDescription);
272    }
273
274    @Override
275    public void onProgressStopped() {
276        mStopButton.setImageDrawable(mReloadDrawable);
277        mStopButton.setContentDescription(mRefreshDescription);
278    }
279
280    protected void updateSearchMode(boolean userEdited) {
281        setSearchMode(!userEdited || TextUtils.isEmpty(mUrlInput.getText()));
282    }
283
284    @Override
285    protected void setSearchMode(boolean voiceSearchEnabled) {
286        boolean showvoicebutton = voiceSearchEnabled &&
287                mUiController.supportsVoiceSearch();
288        mVoiceSearch.setVisibility(showvoicebutton ? View.VISIBLE :
289                View.GONE);
290        mGoButton.setVisibility(voiceSearchEnabled ? View.GONE :
291                View.VISIBLE);
292    }
293
294    @Override
295    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
296        super.setInVoiceMode(voicemode, voiceResults);
297        if (voicemode) {
298            mUrlIcon.setImageDrawable(mSearchButton.getDrawable());
299        }
300    }
301
302    private void hideNavButtons() {
303        int awidth = mNavButtons.getMeasuredWidth();
304        Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, 0, - awidth);
305        Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", mUrlContainer.getLeft(),
306                mUrlContainer.getPaddingLeft());
307        Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA, 1f, 0f);
308        AnimatorSet combo = new AnimatorSet();
309        combo.playTogether(anim1, anim2, anim3);
310        combo.addListener(new AnimatorListenerAdapter() {
311            @Override
312            public void onAnimationEnd(Animator animation) {
313                mNavButtons.setVisibility(View.GONE);
314            }
315        });
316        combo.setDuration(150);
317        combo.start();
318    }
319
320    private void showNavButtons() {
321        int awidth = mNavButtons.getMeasuredWidth();
322        Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, -awidth, 0);
323        Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", 0, awidth);
324        Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA, 0f, 1f);
325        AnimatorSet combo = new AnimatorSet();
326        combo.playTogether(anim1, anim2, anim3);
327        mNavButtons.setVisibility(View.VISIBLE);
328        combo.setDuration(150);
329        combo.start();
330    }
331
332    private void showHideStar(Tab tab) {
333        // hide the bookmark star for data URLs
334        if (tab != null && tab.inForeground()) {
335            int starVisibility = View.VISIBLE;
336            String url = tab.getUrl();
337            if (DataUri.isDataUri(url)) {
338                starVisibility = View.GONE;
339            }
340            mStar.setVisibility(starVisibility);
341        }
342    }
343
344}
345