Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java

Issue 2853583002: 🏠 Add expand button and flag to enable it (Closed)
Patch Set: fix histograms Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.toolbar; 5 package org.chromium.chrome.browser.toolbar;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.content.res.ColorStateList;
8 import android.graphics.Canvas; 9 import android.graphics.Canvas;
9 import android.graphics.Rect; 10 import android.graphics.Rect;
10 import android.graphics.drawable.Drawable; 11 import android.graphics.drawable.Drawable;
11 import android.os.Build; 12 import android.os.Build;
13 import android.os.SystemClock;
12 import android.support.v7.widget.Toolbar; 14 import android.support.v7.widget.Toolbar;
13 import android.util.AttributeSet; 15 import android.util.AttributeSet;
14 import android.view.View; 16 import android.view.View;
15 import android.view.ViewGroup; 17 import android.view.ViewGroup;
16 import android.widget.ImageView; 18 import android.widget.ImageView;
17 19
18 import org.chromium.base.ApiCompatibilityUtils; 20 import org.chromium.base.ApiCompatibilityUtils;
19 import org.chromium.base.SysUtils; 21 import org.chromium.base.SysUtils;
20 import org.chromium.chrome.R; 22 import org.chromium.chrome.R;
21 import org.chromium.chrome.browser.util.ColorUtils; 23 import org.chromium.chrome.browser.util.ColorUtils;
24 import org.chromium.chrome.browser.util.FeatureUtilities;
25 import org.chromium.chrome.browser.widget.TintedImageButton;
22 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; 26 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
23 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetMetrics; 27 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetMetrics;
24 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver; 28 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver;
25 import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver; 29 import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver;
26 30
27 /** 31 /**
28 * Phone specific toolbar that exists at the bottom of the screen. 32 * Phone specific toolbar that exists at the bottom of the screen.
29 */ 33 */
30 public class BottomToolbarPhone extends ToolbarPhone { 34 public class BottomToolbarPhone extends ToolbarPhone {
31 /** 35 /**
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 85
82 /** The white version of the toolbar handle; used for dark themes and incogn ito. */ 86 /** The white version of the toolbar handle; used for dark themes and incogn ito. */
83 private final Drawable mHandleLight; 87 private final Drawable mHandleLight;
84 88
85 /** The dark version of the toolbar handle; this is the default handle to us e. */ 89 /** The dark version of the toolbar handle; this is the default handle to us e. */
86 private final Drawable mHandleDark; 90 private final Drawable mHandleDark;
87 91
88 /** A handle to the bottom sheet. */ 92 /** A handle to the bottom sheet. */
89 private BottomSheet mBottomSheet; 93 private BottomSheet mBottomSheet;
90 94
95 /** A handle to the expand button that Chrome Home may or may not use. */
96 private TintedImageButton mExpandButton;
97
91 /** 98 /**
92 * Whether the end toolbar buttons should be hidden regardless of whether th e URL bar is 99 * Whether the end toolbar buttons should be hidden regardless of whether th e URL bar is
93 * focused. 100 * focused.
94 */ 101 */
95 private boolean mShouldHideEndToolbarButtons; 102 private boolean mShouldHideEndToolbarButtons;
96 103
97 /** 104 /**
98 * This tracks the height fraction of the bottom bar to determine if it is m oving up or down. 105 * This tracks the height fraction of the bottom bar to determine if it is m oving up or down.
99 */ 106 */
100 private float mLastHeightFraction; 107 private float mLastHeightFraction;
101 108
102 /** The toolbar handle view that indicates the toolbar can be pulled upward. */ 109 /** The toolbar handle view that indicates the toolbar can be pulled upward. */
103 private ImageView mToolbarHandleView; 110 private ImageView mToolbarHandleView;
104 111
105 /** Whether accessibility is enabled. */ 112 /** Whether accessibility is enabled. */
106 private boolean mAccessibilityEnabled; 113 private boolean mAccessibilityEnabled;
107 114
115 /** Whether or not the toolbar handle should be used. */
116 private boolean mUseToolbarHandle;
117
108 /** 118 /**
109 * Constructs a BottomToolbarPhone object. 119 * Constructs a BottomToolbarPhone object.
110 * @param context The Context in which this View object is created. 120 * @param context The Context in which this View object is created.
111 * @param attrs The AttributeSet that was specified with this View. 121 * @param attrs The AttributeSet that was specified with this View.
112 */ 122 */
113 public BottomToolbarPhone(Context context, AttributeSet attrs) { 123 public BottomToolbarPhone(Context context, AttributeSet attrs) {
114 super(context, attrs); 124 super(context, attrs);
115 125
116 mHandleDark = ApiCompatibilityUtils.getDrawable( 126 mHandleDark = ApiCompatibilityUtils.getDrawable(
117 context.getResources(), R.drawable.toolbar_handle_dark); 127 context.getResources(), R.drawable.toolbar_handle_dark);
118 mHandleLight = ApiCompatibilityUtils.getDrawable( 128 mHandleLight = ApiCompatibilityUtils.getDrawable(
119 context.getResources(), R.drawable.toolbar_handle_light); 129 context.getResources(), R.drawable.toolbar_handle_light);
120 mLocationBarVerticalMargin = 130 mLocationBarVerticalMargin =
121 getResources().getDimensionPixelOffset(R.dimen.bottom_location_b ar_vertical_margin); 131 getResources().getDimensionPixelOffset(R.dimen.bottom_location_b ar_vertical_margin);
132 mUseToolbarHandle = true;
122 } 133 }
123 134
124 /** 135 /**
125 * Set the color of the pull handle used by the toolbar. 136 * Set the color of the pull handle used by the toolbar.
126 * @param useLightDrawable If the handle color should be light. 137 * @param useLightDrawable If the handle color should be light.
127 */ 138 */
128 public void updateHandleTint(boolean useLightDrawable) { 139 public void updateHandleTint(boolean useLightDrawable) {
140 if (!mUseToolbarHandle) return;
129 mToolbarHandleView.setImageDrawable(useLightDrawable ? mHandleLight : mH andleDark); 141 mToolbarHandleView.setImageDrawable(useLightDrawable ? mHandleLight : mH andleDark);
130 } 142 }
131 143
132 /** 144 /**
133 * @return Whether or not the toolbar is currently using a light theme color . 145 * @return Whether or not the toolbar is currently using a light theme color .
134 */ 146 */
135 public boolean isLightTheme() { 147 public boolean isLightTheme() {
136 return !ColorUtils.shouldUseLightForegroundOnBackground(getTabThemeColor ()); 148 return !ColorUtils.shouldUseLightForegroundOnBackground(getTabThemeColor ());
137 } 149 }
138 150
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 ViewGroup coordinator = (ViewGroup) getRootView().findViewById(R.id.coor dinator); 208 ViewGroup coordinator = (ViewGroup) getRootView().findViewById(R.id.coor dinator);
197 coordinator.addView(mProgressBar); 209 coordinator.addView(mProgressBar);
198 mProgressBar.setProgressBarContainer(coordinator); 210 mProgressBar.setProgressBarContainer(coordinator);
199 } 211 }
200 212
201 /** 213 /**
202 * @return The extra top margin that should be applied to the browser contro ls views to 214 * @return The extra top margin that should be applied to the browser contro ls views to
203 * correctly offset them from the handle that sits above them. 215 * correctly offset them from the handle that sits above them.
204 */ 216 */
205 private int getExtraTopMargin() { 217 private int getExtraTopMargin() {
218 if (!mUseToolbarHandle) return 0;
206 return getResources().getDimensionPixelSize(R.dimen.bottom_toolbar_top_m argin); 219 return getResources().getDimensionPixelSize(R.dimen.bottom_toolbar_top_m argin);
207 } 220 }
208 221
209 @Override 222 @Override
223 protected int getBoundsAfterAccountingForLeftButton() {
224 int padding = super.getBoundsAfterAccountingForLeftButton();
225 if (!mUseToolbarHandle && mExpandButton != null && mExpandButton.getVisi bility() != GONE) {
gone 2017/04/30 01:56:00 You constantly use !mUseToolbarHandle && mExpandBu
mdjones 2017/05/01 20:46:08 Removed the null checks.
226 padding = mExpandButton.getMeasuredWidth()
227 + getResources().getDimensionPixelSize(
228 R.dimen.chrome_home_expand_button_extra_padding);
229 }
230 return padding;
231 }
232
233 @Override
234 public void updateButtonVisibility() {
235 super.updateButtonVisibility();
236 if (!mUseToolbarHandle && mExpandButton != null) {
237 mExpandButton.setVisibility(
238 urlHasFocus() || isTabSwitcherAnimationRunning() ? INVISIBLE : VISIBLE);
239 }
240 }
241
242 @Override
243 protected void updateUrlExpansionAnimation() {
244 super.updateUrlExpansionAnimation();
245
246 if (!mUseToolbarHandle && mExpandButton != null) {
247 mExpandButton.setVisibility(mShouldHideEndToolbarButtons ? View.GONE : View.VISIBLE);
248 }
249 }
250
251 @Override
210 public void onFinishInflate() { 252 public void onFinishInflate() {
211 super.onFinishInflate(); 253 super.onFinishInflate();
212 254
255 if (mExpandButton != null) {
256 // Make the "expand" button square.
257 mExpandButton.getLayoutParams().width = mExpandButton.getHeight();
258 }
259
213 // Add extra top margin to the URL bar to compensate for the change to l ocation bar's 260 // Add extra top margin to the URL bar to compensate for the change to l ocation bar's
214 // vertical margin in the constructor. 261 // vertical margin in the constructor.
215 ((MarginLayoutParams) mLocationBar.findViewById(R.id.url_bar).getLayoutP arams()).topMargin = 262 ((MarginLayoutParams) mLocationBar.findViewById(R.id.url_bar).getLayoutP arams()).topMargin =
216 getResources().getDimensionPixelSize(R.dimen.bottom_toolbar_url_ bar_top_margin); 263 getResources().getDimensionPixelSize(R.dimen.bottom_toolbar_url_ bar_top_margin);
217 264
218 // Exclude the location bar from the list of browsing mode views. This p revents its 265 // Exclude the location bar from the list of browsing mode views. This p revents its
219 // visibility from changing during transitions. 266 // visibility from changing during transitions.
220 mBrowsingModeViews.remove(mLocationBar); 267 mBrowsingModeViews.remove(mLocationBar);
221 268
269 updateToolbarTopMargin();
270 }
271
272 /**
273 * Update the top margin of all the components inside the toolbar. If the to olbar handle is
274 * being used, extra margin is added.
275 */
276 private void updateToolbarTopMargin() {
222 // Programmatically apply a top margin to all the children of the toolba r container. This 277 // Programmatically apply a top margin to all the children of the toolba r container. This
223 // is done so the view hierarchy does not need to be changed. 278 // is done so the view hierarchy does not need to be changed.
224 int topMarginForControls = getExtraTopMargin(); 279 int topMarginForControls = getExtraTopMargin();
280 if (topMarginForControls == 0) return;
225 281
226 View topShadow = findViewById(R.id.bottom_toolbar_shadow); 282 View topShadow = findViewById(R.id.bottom_toolbar_shadow);
227 283
228 for (int i = 0; i < getChildCount(); i++) { 284 for (int i = 0; i < getChildCount(); i++) {
229 View curView = getChildAt(i); 285 View curView = getChildAt(i);
230 286
231 // Skip the shadow that sits at the top of the toolbar since this ne eds to sit on top 287 // Skip the shadow that sits at the top of the toolbar since this ne eds to sit on top
232 // of the toolbar. 288 // of the toolbar.
233 if (curView == topShadow) continue; 289 if (curView == topShadow) continue;
234 290
235 ((MarginLayoutParams) curView.getLayoutParams()).topMargin = topMarg inForControls; 291 ((MarginLayoutParams) curView.getLayoutParams()).topMargin = topMarg inForControls;
236 } 292 }
237 } 293 }
238 294
239 @Override 295 @Override
240 public void onAttachedToWindow() { 296 public void onAttachedToWindow() {
241 super.onAttachedToWindow(); 297 super.onAttachedToWindow();
242 298
243 // The toolbar handle is part of the control container so it can draw on top of the other 299 // The toolbar handle is part of the control container so it can draw on top of the
gone 2017/04/30 01:56:00 why?
mdjones 2017/05/01 20:46:08 Reasons.
244 // toolbar views. Get the root view and search for the handle. 300 // other toolbar views. Get the root view and search for the handle.
245 mToolbarHandleView = (ImageView) getRootView().findViewById(R.id.toolbar _handle); 301 mToolbarHandleView = (ImageView) getRootView().findViewById(R.id.toolbar _handle);
246 mToolbarHandleView.setImageDrawable(mHandleDark); 302 mToolbarHandleView.setImageDrawable(mHandleDark);
247 } 303 }
248 304
249 @Override 305 @Override
306 public void onNativeLibraryReady() {
307 super.onNativeLibraryReady();
308
309 mUseToolbarHandle = !FeatureUtilities.isChromeHomeExpandButtonEnabled();
310 mExpandButton = (TintedImageButton) findViewById(R.id.expand_sheet_butto n);
311 mExpandButton.setOnClickListener(new OnClickListener() {
312 @Override
313 public void onClick(View v) {
314 if (mBottomSheet == null) return;
315
316 mBottomSheet.setSheetState(BottomSheet.SHEET_STATE_HALF, true);
317 }
318 });
319
320 if (!mUseToolbarHandle) {
321 mToolbarHandleView.setVisibility(View.GONE);
322
323 // If not using the toolbar handle, change the height of the control container to be
324 // the same as the top toolbar.
325 getRootView().findViewById(R.id.control_container).getLayoutParams() .height =
326 getResources().getDimensionPixelSize(R.dimen.control_contain er_height)
327 + getResources().getDimensionPixelSize(R.dimen.toolbar_shado w_height);
328 } else {
329 mExpandButton.setVisibility(View.VISIBLE);
330 mBrowsingModeViews.add(mExpandButton);
331 }
332
333 updateToolbarTopMargin();
334 }
335
336 @Override
250 protected void updateVisualsForToolbarState() { 337 protected void updateVisualsForToolbarState() {
251 super.updateVisualsForToolbarState(); 338 super.updateVisualsForToolbarState();
252 339
253 // TODO(mdjones): Creating a new tab from the tab switcher skips the 340 // TODO(mdjones): Creating a new tab from the tab switcher skips the
254 // drawTabSwitcherFadeAnimation which would otherwise make this line unn ecessary. 341 // drawTabSwitcherFadeAnimation which would otherwise make this line unn ecessary.
255 if (mTabSwitcherState == STATIC_TAB) mToolbarHandleView.setAlpha(1f); 342 if (mTabSwitcherState == STATIC_TAB && mUseToolbarHandle) mToolbarHandle View.setAlpha(1f);
256 343
257 // The tab switcher's background color should not affect the toolbar han dle; it should only 344 // The tab switcher's background color should not affect the toolbar han dle; it should only
258 // switch color based on the static tab's theme color. This is done so f ade in/out looks 345 // switch color based on the static tab's theme color. This is done so f ade in/out looks
259 // correct. 346 // correct.
260 mToolbarHandleView.setImageDrawable(isLightTheme() ? mHandleDark : mHand leLight); 347 if (mUseToolbarHandle) {
gone 2017/04/30 01:56:00 You treat the toolbar handle's non-existence as an
mdjones 2017/05/01 20:46:08 The expand button waits for the native library to
348 mToolbarHandleView.setImageDrawable(isLightTheme() ? mHandleDark : m HandleLight);
349 } else {
350 ColorStateList tint = mUseLightToolbarDrawables ? mLightModeTint : m DarkModeTint;
351 mExpandButton.setTint(tint);
352 }
261 } 353 }
262 354
263 @Override 355 @Override
264 protected void updateLocationBarBackgroundBounds(Rect out, VisualState visua lState) { 356 protected void updateLocationBarBackgroundBounds(Rect out, VisualState visua lState) {
265 super.updateLocationBarBackgroundBounds(out, visualState); 357 super.updateLocationBarBackgroundBounds(out, visualState);
266 358
267 // Allow the location bar to expand to the full height of the control co ntainer. 359 // Allow the location bar to expand to the full height of the control co ntainer.
268 out.top -= getExtraTopMargin() * mUrlExpansionPercent; 360 out.top -= getExtraTopMargin() * mUrlExpansionPercent;
269 } 361 }
270 362
271 @Override 363 @Override
272 protected boolean shouldDrawLocationBar() { 364 protected boolean shouldDrawLocationBar() {
273 return true; 365 return true;
274 } 366 }
275 367
276 @Override 368 @Override
277 protected void drawTabSwitcherFadeAnimation(boolean animationFinished, float progress) { 369 protected void drawTabSwitcherFadeAnimation(boolean animationFinished, float progress) {
278 mNewTabButton.setAlpha(progress); 370 mNewTabButton.setAlpha(progress);
279 371
280 mLocationBar.setAlpha(1f - progress); 372 mLocationBar.setAlpha(1f - progress);
281 mToolbarHandleView.setAlpha(1f - progress); 373 if (mUseToolbarHandle) mToolbarHandleView.setAlpha(1f - progress);
282 374
283 int tabSwitcherThemeColor = getToolbarColorForVisualState(VisualState.TA B_SWITCHER_NORMAL); 375 int tabSwitcherThemeColor = getToolbarColorForVisualState(VisualState.TA B_SWITCHER_NORMAL);
284 376
285 updateToolbarBackground(ColorUtils.getColorWithOverlay( 377 updateToolbarBackground(ColorUtils.getColorWithOverlay(
286 getTabThemeColor(), tabSwitcherThemeColor, progress)); 378 getTabThemeColor(), tabSwitcherThemeColor, progress));
287 379
288 // Don't use transparency for accessibility mode or low-end devices sinc e the 380 // Don't use transparency for accessibility mode or low-end devices sinc e the
289 // {@link OverviewListLayout} will be used instead of the normal tab swi tcher. 381 // {@link OverviewListLayout} will be used instead of the normal tab swi tcher.
290 if (!mAccessibilityEnabled && !SysUtils.isLowEndDevice()) { 382 if (!mAccessibilityEnabled && !SysUtils.isLowEndDevice()) {
291 float alphaTransition = 1f - TAB_SWITCHER_TOOLBAR_ALPHA; 383 float alphaTransition = 1f - TAB_SWITCHER_TOOLBAR_ALPHA;
(...skipping 10 matching lines...) Expand all
302 @Override 394 @Override
303 protected void onAccessibilityStatusChanged(boolean enabled) { 395 protected void onAccessibilityStatusChanged(boolean enabled) {
304 super.onAccessibilityStatusChanged(enabled); 396 super.onAccessibilityStatusChanged(enabled);
305 mAccessibilityEnabled = enabled; 397 mAccessibilityEnabled = enabled;
306 } 398 }
307 399
308 @Override 400 @Override
309 protected void drawTabSwitcherAnimationOverlay(Canvas canvas, float animatio nProgress) { 401 protected void drawTabSwitcherAnimationOverlay(Canvas canvas, float animatio nProgress) {
310 // Intentionally overridden to block everything but the compositor scree n shot. Otherwise 402 // Intentionally overridden to block everything but the compositor scree n shot. Otherwise
311 // the toolbar in Chrome Home does not have an animation overlay compone nt. 403 // the toolbar in Chrome Home does not have an animation overlay compone nt.
312 if (mTextureCaptureMode) super.drawTabSwitcherAnimationOverlay(canvas, 0 f); 404 if (mTextureCaptureMode) {
405 super.drawTabSwitcherAnimationOverlay(canvas, 0f);
406 float previousAlpha = 0.f;
gone 2017/04/30 01:56:00 Where do you actually use this?
mdjones 2017/05/01 20:46:08 I don't any more. Removed.
407 if (mExpandButton != null && mExpandButton.getVisibility() != View.G ONE) {
408 drawChild(canvas, mExpandButton, SystemClock.uptimeMillis());
409 }
410 }
313 } 411 }
314 412
315 @Override 413 @Override
316 protected void resetNtpAnimationValues() { 414 protected void resetNtpAnimationValues() {
317 // The NTP animations don't matter if the browser is in tab switcher mod e. 415 // The NTP animations don't matter if the browser is in tab switcher mod e.
318 if (mTabSwitcherState != ToolbarPhone.STATIC_TAB) return; 416 if (mTabSwitcherState != ToolbarPhone.STATIC_TAB) return;
319 super.resetNtpAnimationValues(); 417 super.resetNtpAnimationValues();
320 } 418 }
321 419
322 @Override 420 @Override
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 otherToolbar.setTitleTextAppearance( 455 otherToolbar.setTitleTextAppearance(
358 otherToolbar.getContext(), R.style.BottomSheetContentTitle); 456 otherToolbar.getContext(), R.style.BottomSheetContentTitle);
359 ApiCompatibilityUtils.setPaddingRelative(otherToolbar, 457 ApiCompatibilityUtils.setPaddingRelative(otherToolbar,
360 ApiCompatibilityUtils.getPaddingStart(otherToolbar), 458 ApiCompatibilityUtils.getPaddingStart(otherToolbar),
361 otherToolbar.getPaddingTop() + extraTopMargin, 459 otherToolbar.getPaddingTop() + extraTopMargin,
362 ApiCompatibilityUtils.getPaddingEnd(otherToolbar), otherToolbar. getPaddingBottom()); 460 ApiCompatibilityUtils.getPaddingEnd(otherToolbar), otherToolbar. getPaddingBottom());
363 461
364 otherToolbar.requestLayout(); 462 otherToolbar.requestLayout();
365 } 463 }
366 } 464 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698