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; |
| 9 import android.graphics.Canvas; |
| 10 import android.graphics.Paint; |
| 11 import android.graphics.Rect; |
| 12 import android.graphics.RectF; |
8 import android.util.AttributeSet; | 13 import android.util.AttributeSet; |
| 14 import android.view.View; |
9 import android.view.ViewGroup; | 15 import android.view.ViewGroup; |
| 16 import android.widget.ImageView; |
10 | 17 |
| 18 import org.chromium.base.ApiCompatibilityUtils; |
11 import org.chromium.chrome.R; | 19 import org.chromium.chrome.R; |
12 import org.chromium.chrome.browser.widget.BottomSheet; | 20 import org.chromium.chrome.browser.widget.BottomSheet; |
13 import org.chromium.chrome.browser.widget.BottomSheetObserver; | 21 import org.chromium.chrome.browser.widget.BottomSheetObserver; |
14 | 22 |
15 /** | 23 /** |
16 * Phone specific toolbar that exists at the bottom of the screen. | 24 * Phone specific toolbar that exists at the bottom of the screen. |
17 */ | 25 */ |
18 public class BottomToolbarPhone extends ToolbarPhone implements BottomSheetObser
ver { | 26 public class BottomToolbarPhone extends ToolbarPhone implements BottomSheetObser
ver { |
| 27 /** The white version of the toolbar handle; used for dark themes and incogn
ito. */ |
| 28 private final Bitmap mHandleLight; |
| 29 |
| 30 /** The dark version of the toolbar handle; this is the default handle to us
e. */ |
| 31 private final Bitmap mHandleDark; |
| 32 |
19 /** A handle to the bottom sheet. */ | 33 /** A handle to the bottom sheet. */ |
20 private BottomSheet mBottomSheet; | 34 private BottomSheet mBottomSheet; |
21 | 35 |
22 /** | 36 /** |
23 * Whether the end toolbar buttons should be hidden regardless of whether th
e URL bar is | 37 * Whether the end toolbar buttons should be hidden regardless of whether th
e URL bar is |
24 * focused. | 38 * focused. |
25 */ | 39 */ |
26 private boolean mShouldHideEndToolbarButtons; | 40 private boolean mShouldHideEndToolbarButtons; |
27 | 41 |
28 /** | 42 /** |
29 * This tracks the height fraction of the bottom bar to determine if it is m
oving up or down. | 43 * This tracks the height fraction of the bottom bar to determine if it is m
oving up or down. |
30 */ | 44 */ |
31 private float mLastHeightFraction; | 45 private float mLastHeightFraction; |
32 | 46 |
| 47 /** The toolbar handle view that indicates the toolbar can be pulled upward.
*/ |
| 48 private ImageView mToolbarHandleView; |
| 49 |
33 /** | 50 /** |
34 * Constructs a BottomToolbarPhone object. | 51 * Constructs a BottomToolbarPhone object. |
35 * @param context The Context in which this View object is created. | 52 * @param context The Context in which this View object is created. |
36 * @param attrs The AttributeSet that was specified with this View. | 53 * @param attrs The AttributeSet that was specified with this View. |
37 */ | 54 */ |
38 public BottomToolbarPhone(Context context, AttributeSet attrs) { | 55 public BottomToolbarPhone(Context context, AttributeSet attrs) { |
39 super(context, attrs); | 56 super(context, attrs); |
| 57 |
| 58 int defaultHandleColor = |
| 59 ApiCompatibilityUtils.getColor(getResources(), R.color.google_gr
ey_500); |
| 60 mHandleDark = generateHandleBitmap(defaultHandleColor); |
| 61 |
| 62 int lightHandleColor = |
| 63 ApiCompatibilityUtils.getColor(getResources(), R.color.semi_opaq
ue_white); |
| 64 mHandleLight = generateHandleBitmap(lightHandleColor); |
40 } | 65 } |
41 | 66 |
42 @Override | 67 @Override |
43 protected int getProgressBarTopMargin() { | 68 protected int getProgressBarTopMargin() { |
44 // In the case where the toolbar is at the bottom of the screen, the pro
gress bar should | 69 // In the case where the toolbar is at the bottom of the screen, the pro
gress bar should |
45 // be at the top of the screen. | 70 // be at the top of the screen. |
46 return 0; | 71 return 0; |
47 } | 72 } |
48 | 73 |
49 @Override | 74 @Override |
(...skipping 23 matching lines...) Expand all Loading... |
73 | 98 |
74 @Override | 99 @Override |
75 protected void addProgressBarToHierarchy() { | 100 protected void addProgressBarToHierarchy() { |
76 if (mProgressBar == null) return; | 101 if (mProgressBar == null) return; |
77 | 102 |
78 ViewGroup coordinator = (ViewGroup) getRootView().findViewById(R.id.coor
dinator); | 103 ViewGroup coordinator = (ViewGroup) getRootView().findViewById(R.id.coor
dinator); |
79 coordinator.addView(mProgressBar); | 104 coordinator.addView(mProgressBar); |
80 mProgressBar.setProgressBarContainer(coordinator); | 105 mProgressBar.setProgressBarContainer(coordinator); |
81 } | 106 } |
82 | 107 |
| 108 /** |
| 109 * @return The extra top margin that should be applied to the browser contro
ls views to |
| 110 * correctly offset them from the handle that sits above them. |
| 111 */ |
| 112 private int getExtraTopMargin() { |
| 113 return getResources().getDimensionPixelSize(R.dimen.bottom_toolbar_top_m
argin); |
| 114 } |
| 115 |
| 116 @Override |
| 117 public void onFinishInflate() { |
| 118 super.onFinishInflate(); |
| 119 |
| 120 // Programmatically apply a top margin to all the children of the toolba
r container. This |
| 121 // is done so the view hierarchy does not need to be changed. |
| 122 int topMarginForControls = getExtraTopMargin(); |
| 123 |
| 124 View topShadow = findViewById(R.id.bottom_toolbar_shadow); |
| 125 |
| 126 for (int i = 0; i < getChildCount(); i++) { |
| 127 View curView = getChildAt(i); |
| 128 |
| 129 // Skip the shadow that sits at the top of the toolbar since this ne
eds to sit on top |
| 130 // of the toolbar. |
| 131 if (curView == topShadow) continue; |
| 132 |
| 133 ((MarginLayoutParams) curView.getLayoutParams()).topMargin = topMarg
inForControls; |
| 134 } |
| 135 } |
| 136 |
| 137 @Override |
| 138 public void onAttachedToWindow() { |
| 139 super.onAttachedToWindow(); |
| 140 |
| 141 // The toolbar handle is part of the control container so it can draw on
top of the other |
| 142 // toolbar views. Get the root view and search for the handle. |
| 143 mToolbarHandleView = (ImageView) getRootView().findViewById(R.id.toolbar
_handle); |
| 144 mToolbarHandleView.setImageBitmap(mHandleDark); |
| 145 } |
| 146 |
| 147 @Override |
| 148 protected void updateVisualsForToolbarState() { |
| 149 super.updateVisualsForToolbarState(); |
| 150 |
| 151 // The handle should not show in tab switcher mode. |
| 152 mToolbarHandleView.setVisibility( |
| 153 mTabSwitcherState != ToolbarPhone.STATIC_TAB ? View.INVISIBLE :
View.VISIBLE); |
| 154 mToolbarHandleView.setImageBitmap(mUseLightToolbarDrawables ? mHandleLig
ht : mHandleDark); |
| 155 } |
| 156 |
| 157 @Override |
| 158 protected void updateLocationBarBackgroundBounds(Rect out, VisualState visua
lState) { |
| 159 super.updateLocationBarBackgroundBounds(out, visualState); |
| 160 |
| 161 // Allow the location bar to expand to the full height of the control co
ntainer. |
| 162 out.top -= getExtraTopMargin() * mUrlExpansionPercent; |
| 163 } |
| 164 |
| 165 /** |
| 166 * Generate the bitmap used as the handle on the toolbar. This indicates tha
t the toolbar can |
| 167 * be pulled up. |
| 168 * @return The handle as a bitmap. |
| 169 */ |
| 170 private Bitmap generateHandleBitmap(int handleColor) { |
| 171 int handleWidth = getResources().getDimensionPixelSize(R.dimen.toolbar_h
andle_width); |
| 172 int handleHeight = getResources().getDimensionPixelSize(R.dimen.toolbar_
handle_height); |
| 173 |
| 174 Bitmap handle = Bitmap.createBitmap(handleWidth, handleHeight, Bitmap.Co
nfig.ARGB_8888); |
| 175 Canvas canvas = new Canvas(handle); |
| 176 |
| 177 // Clear the canvas to be completely transparent. |
| 178 canvas.drawARGB(0, 0, 0, 0); |
| 179 |
| 180 Paint paint = new Paint(); |
| 181 paint.setColor(handleColor); |
| 182 paint.setAntiAlias(true); |
| 183 |
| 184 RectF rect = new RectF(0, 0, handleWidth, handleHeight); |
| 185 |
| 186 // Use height / 2 for the corner radius so the handle always takes the s
hape of a pill. |
| 187 canvas.drawRoundRect(rect, handleHeight / 2f, handleHeight / 2f, paint); |
| 188 |
| 189 return handle; |
| 190 } |
| 191 |
83 @Override | 192 @Override |
84 protected boolean shouldHideEndToolbarButtons() { | 193 protected boolean shouldHideEndToolbarButtons() { |
85 return mShouldHideEndToolbarButtons; | 194 return mShouldHideEndToolbarButtons; |
86 } | 195 } |
87 | 196 |
88 @Override | 197 @Override |
89 public void onSheetOpened() {} | 198 public void onSheetOpened() {} |
90 | 199 |
91 @Override | 200 @Override |
92 public void onSheetClosed() {} | 201 public void onSheetClosed() {} |
(...skipping 22 matching lines...) Expand all Loading... |
115 boolean isMovingDown = heightFraction < mLastHeightFraction; | 224 boolean isMovingDown = heightFraction < mLastHeightFraction; |
116 mLastHeightFraction = heightFraction; | 225 mLastHeightFraction = heightFraction; |
117 | 226 |
118 // The only time the omnibox should have focus is when the sheet is full
y expanded. Any | 227 // The only time the omnibox should have focus is when the sheet is full
y expanded. Any |
119 // movement of the sheet should unfocus it. | 228 // movement of the sheet should unfocus it. |
120 if (isMovingDown && getLocationBar().isUrlBarFocused()) { | 229 if (isMovingDown && getLocationBar().isUrlBarFocused()) { |
121 getLocationBar().setUrlBarFocus(false); | 230 getLocationBar().setUrlBarFocus(false); |
122 } | 231 } |
123 } | 232 } |
124 } | 233 } |
OLD | NEW |