| OLD | NEW |
| 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.graphics.Bitmap; | 8 import android.graphics.Bitmap; |
| 9 import android.graphics.Canvas; | 9 import android.graphics.Canvas; |
| 10 import android.graphics.Paint; | 10 import android.graphics.Paint; |
| 11 import android.graphics.Rect; | 11 import android.graphics.Rect; |
| 12 import android.graphics.RectF; | 12 import android.graphics.RectF; |
| 13 import android.support.v7.widget.Toolbar; | 13 import android.support.v7.widget.Toolbar; |
| 14 import android.util.AttributeSet; | 14 import android.util.AttributeSet; |
| 15 import android.view.View; | 15 import android.view.View; |
| 16 import android.view.ViewGroup; | 16 import android.view.ViewGroup; |
| 17 import android.widget.ImageView; | 17 import android.widget.ImageView; |
| 18 | 18 |
| 19 import org.chromium.base.ApiCompatibilityUtils; | 19 import org.chromium.base.ApiCompatibilityUtils; |
| 20 import org.chromium.chrome.R; | 20 import org.chromium.chrome.R; |
| 21 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; | 21 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; |
| 22 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver; | 22 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver; |
| 23 import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver; |
| 23 | 24 |
| 24 /** | 25 /** |
| 25 * Phone specific toolbar that exists at the bottom of the screen. | 26 * Phone specific toolbar that exists at the bottom of the screen. |
| 26 */ | 27 */ |
| 27 public class BottomToolbarPhone extends ToolbarPhone implements BottomSheetObser
ver { | 28 public class BottomToolbarPhone extends ToolbarPhone { |
| 29 /** |
| 30 * The observer used to listen to {@link BottomSheet} events. |
| 31 */ |
| 32 private final BottomSheetObserver mBottomSheetObserver = new EmptyBottomShee
tObserver() { |
| 33 @Override |
| 34 public void onTransitionPeekToHalf(float transitionFraction) { |
| 35 // TODO(twellington): animate end toolbar button appearance/disappea
rance. |
| 36 if (transitionFraction >= 0.5 && !mShouldHideEndToolbarButtons) { |
| 37 mShouldHideEndToolbarButtons = true; |
| 38 updateUrlExpansionAnimation(); |
| 39 } else if (transitionFraction < 0.5 && mShouldHideEndToolbarButtons)
{ |
| 40 mShouldHideEndToolbarButtons = false; |
| 41 updateUrlExpansionAnimation(); |
| 42 } |
| 43 |
| 44 boolean buttonsClickable = transitionFraction == 0.f; |
| 45 mToggleTabStackButton.setClickable(buttonsClickable); |
| 46 mMenuButton.setClickable(buttonsClickable); |
| 47 } |
| 48 |
| 49 @Override |
| 50 public void onSheetOffsetChanged(float heightFraction) { |
| 51 boolean isMovingDown = heightFraction < mLastHeightFraction; |
| 52 mLastHeightFraction = heightFraction; |
| 53 |
| 54 // The only time the omnibox should have focus is when the sheet is
fully expanded. Any |
| 55 // movement of the sheet should unfocus it. |
| 56 if (isMovingDown && getLocationBar().isUrlBarFocused()) { |
| 57 getLocationBar().setUrlBarFocus(false); |
| 58 } |
| 59 } |
| 60 }; |
| 61 |
| 28 /** The white version of the toolbar handle; used for dark themes and incogn
ito. */ | 62 /** The white version of the toolbar handle; used for dark themes and incogn
ito. */ |
| 29 private final Bitmap mHandleLight; | 63 private final Bitmap mHandleLight; |
| 30 | 64 |
| 31 /** The dark version of the toolbar handle; this is the default handle to us
e. */ | 65 /** The dark version of the toolbar handle; this is the default handle to us
e. */ |
| 32 private final Bitmap mHandleDark; | 66 private final Bitmap mHandleDark; |
| 33 | 67 |
| 34 /** A handle to the bottom sheet. */ | 68 /** A handle to the bottom sheet. */ |
| 35 private BottomSheet mBottomSheet; | 69 private BottomSheet mBottomSheet; |
| 36 | 70 |
| 37 /** | 71 /** |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 | 114 |
| 81 mBottomSheet.setSheetState(BottomSheet.SHEET_STATE_FULL, true); | 115 mBottomSheet.setSheetState(BottomSheet.SHEET_STATE_FULL, true); |
| 82 } | 116 } |
| 83 | 117 |
| 84 @Override | 118 @Override |
| 85 public void setBottomSheet(BottomSheet sheet) { | 119 public void setBottomSheet(BottomSheet sheet) { |
| 86 assert mBottomSheet == null; | 120 assert mBottomSheet == null; |
| 87 | 121 |
| 88 mBottomSheet = sheet; | 122 mBottomSheet = sheet; |
| 89 getLocationBar().setBottomSheet(mBottomSheet); | 123 getLocationBar().setBottomSheet(mBottomSheet); |
| 90 mBottomSheet.addObserver(this); | 124 mBottomSheet.addObserver(mBottomSheetObserver); |
| 91 } | 125 } |
| 92 | 126 |
| 93 @Override | 127 @Override |
| 94 public boolean shouldIgnoreSwipeGesture() { | 128 public boolean shouldIgnoreSwipeGesture() { |
| 95 // Only detect swipes if the bottom sheet in the peeking state and not a
nimating. | 129 // Only detect swipes if the bottom sheet in the peeking state and not a
nimating. |
| 96 return mBottomSheet.getSheetState() != BottomSheet.SHEET_STATE_PEEK | 130 return mBottomSheet.getSheetState() != BottomSheet.SHEET_STATE_PEEK |
| 97 || mBottomSheet.isRunningSettleAnimation() || super.shouldIgnore
SwipeGesture(); | 131 || mBottomSheet.isRunningSettleAnimation() || super.shouldIgnore
SwipeGesture(); |
| 98 } | 132 } |
| 99 | 133 |
| 100 @Override | 134 @Override |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 canvas.drawRoundRect(rect, handleHeight / 2f, handleHeight / 2f, paint); | 222 canvas.drawRoundRect(rect, handleHeight / 2f, handleHeight / 2f, paint); |
| 189 | 223 |
| 190 return handle; | 224 return handle; |
| 191 } | 225 } |
| 192 | 226 |
| 193 @Override | 227 @Override |
| 194 protected boolean shouldHideEndToolbarButtons() { | 228 protected boolean shouldHideEndToolbarButtons() { |
| 195 return mShouldHideEndToolbarButtons; | 229 return mShouldHideEndToolbarButtons; |
| 196 } | 230 } |
| 197 | 231 |
| 198 @Override | |
| 199 public void onSheetOpened() {} | |
| 200 | |
| 201 @Override | |
| 202 public void onSheetClosed() {} | |
| 203 | |
| 204 @Override | |
| 205 public void onLoadUrl(String url) {} | |
| 206 | |
| 207 @Override | |
| 208 public void onTransitionPeekToHalf(float transitionFraction) { | |
| 209 // TODO(twellington): animate end toolbar button appearance/disappearanc
e. | |
| 210 if (transitionFraction >= 0.5 && !mShouldHideEndToolbarButtons) { | |
| 211 mShouldHideEndToolbarButtons = true; | |
| 212 updateUrlExpansionAnimation(); | |
| 213 } else if (transitionFraction < 0.5 && mShouldHideEndToolbarButtons) { | |
| 214 mShouldHideEndToolbarButtons = false; | |
| 215 updateUrlExpansionAnimation(); | |
| 216 } | |
| 217 | |
| 218 boolean buttonsClickable = transitionFraction == 0.f; | |
| 219 mToggleTabStackButton.setClickable(buttonsClickable); | |
| 220 mMenuButton.setClickable(buttonsClickable); | |
| 221 } | |
| 222 | |
| 223 @Override | |
| 224 public void onSheetOffsetChanged(float heightFraction) { | |
| 225 boolean isMovingDown = heightFraction < mLastHeightFraction; | |
| 226 mLastHeightFraction = heightFraction; | |
| 227 | |
| 228 // The only time the omnibox should have focus is when the sheet is full
y expanded. Any | |
| 229 // movement of the sheet should unfocus it. | |
| 230 if (isMovingDown && getLocationBar().isUrlBarFocused()) { | |
| 231 getLocationBar().setUrlBarFocus(false); | |
| 232 } | |
| 233 } | |
| 234 | |
| 235 /** | 232 /** |
| 236 * Sets the height and title text appearance of the provided toolbar so that
its style is | 233 * Sets the height and title text appearance of the provided toolbar so that
its style is |
| 237 * consistent with BottomToolbarPhone. | 234 * consistent with BottomToolbarPhone. |
| 238 * @param otherToolbar The other {@link Toolbar} to style. | 235 * @param otherToolbar The other {@link Toolbar} to style. |
| 239 */ | 236 */ |
| 240 public void setOtherToolbarStyle(Toolbar otherToolbar) { | 237 public void setOtherToolbarStyle(Toolbar otherToolbar) { |
| 241 // Android's Toolbar class typically changes its height based on device
orientation. | 238 // Android's Toolbar class typically changes its height based on device
orientation. |
| 242 // BottomToolbarPhone has a fixed height. Update |toolbar| to match. | 239 // BottomToolbarPhone has a fixed height. Update |toolbar| to match. |
| 243 otherToolbar.getLayoutParams().height = getHeight(); | 240 otherToolbar.getLayoutParams().height = getHeight(); |
| 244 | 241 |
| 245 // Android Toolbar action buttons are aligned based on the minimum heigh
t. | 242 // Android Toolbar action buttons are aligned based on the minimum heigh
t. |
| 246 int extraTopMargin = getExtraTopMargin(); | 243 int extraTopMargin = getExtraTopMargin(); |
| 247 otherToolbar.setMinimumHeight(getHeight() - extraTopMargin); | 244 otherToolbar.setMinimumHeight(getHeight() - extraTopMargin); |
| 248 | 245 |
| 249 otherToolbar.setTitleTextAppearance( | 246 otherToolbar.setTitleTextAppearance( |
| 250 otherToolbar.getContext(), R.style.BottomSheetContentTitle); | 247 otherToolbar.getContext(), R.style.BottomSheetContentTitle); |
| 251 ApiCompatibilityUtils.setPaddingRelative(otherToolbar, | 248 ApiCompatibilityUtils.setPaddingRelative(otherToolbar, |
| 252 ApiCompatibilityUtils.getPaddingStart(otherToolbar), | 249 ApiCompatibilityUtils.getPaddingStart(otherToolbar), |
| 253 otherToolbar.getPaddingTop() + extraTopMargin, | 250 otherToolbar.getPaddingTop() + extraTopMargin, |
| 254 ApiCompatibilityUtils.getPaddingEnd(otherToolbar), otherToolbar.
getPaddingBottom()); | 251 ApiCompatibilityUtils.getPaddingEnd(otherToolbar), otherToolbar.
getPaddingBottom()); |
| 255 | 252 |
| 256 otherToolbar.requestLayout(); | 253 otherToolbar.requestLayout(); |
| 257 } | 254 } |
| 258 } | 255 } |
| OLD | NEW |