Chromium Code Reviews| 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. | |
|
gone
2017/03/14 22:38:40
Add why.
mdjones
2017/03/15 17:26:12
Done.
| |
| 130 if (curView == topShadow) continue; | |
| 131 | |
| 132 ((MarginLayoutParams) curView.getLayoutParams()).topMargin = topMarg inForControls; | |
| 133 } | |
| 134 } | |
| 135 | |
| 136 @Override | |
| 137 public void onAttachedToWindow() { | |
| 138 super.onAttachedToWindow(); | |
| 139 | |
| 140 // The toolbar handle is part of the control container so it can draw on top of the other | |
| 141 // toolbar views. Get the root view and search for the handle. | |
| 142 mToolbarHandleView = (ImageView) getRootView().findViewById(R.id.toolbar _handle); | |
| 143 mToolbarHandleView.setImageBitmap(mHandleDark); | |
| 144 } | |
| 145 | |
| 146 @Override | |
| 147 protected void updateVisualsForToolbarState() { | |
| 148 super.updateVisualsForToolbarState(); | |
| 149 | |
| 150 // The handle should not show in tab switcher mode. | |
| 151 mToolbarHandleView.setVisibility( | |
| 152 mTabSwitcherState != ToolbarPhone.STATIC_TAB ? View.INVISIBLE : View.VISIBLE); | |
| 153 mToolbarHandleView.setImageBitmap(mUseLightToolbarDrawables ? mHandleLig ht : mHandleDark); | |
| 154 } | |
| 155 | |
| 156 @Override | |
| 157 protected void updateLocationBarBackgroundBounds(Rect out, VisualState visua lState) { | |
| 158 super.updateLocationBarBackgroundBounds(out, visualState); | |
| 159 | |
| 160 // Allow the location bar to expand to the full height of the control co ntainer. | |
| 161 out.top -= getExtraTopMargin() * mUrlExpansionPercent; | |
| 162 } | |
| 163 | |
| 164 /** | |
| 165 * Generate the bitmap used as the handle on the toolbar. This indicates tha t the toolbar can | |
| 166 * be pulled up. | |
| 167 * @return The handle as a bitmap. | |
| 168 */ | |
| 169 private Bitmap generateHandleBitmap(int handleColor) { | |
| 170 int handleWidth = getResources().getDimensionPixelSize(R.dimen.toolbar_h andle_width); | |
| 171 int handleHeight = getResources().getDimensionPixelSize(R.dimen.toolbar_ handle_height); | |
| 172 | |
| 173 Bitmap handle = Bitmap.createBitmap(handleWidth, handleHeight, Bitmap.Co nfig.ARGB_8888); | |
| 174 | |
|
gone
2017/03/14 22:38:40
I guess you really like newlines, but please remov
mdjones
2017/03/15 17:26:12
Done.
| |
| 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 / 2, handleHeight / 2, 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 |