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