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

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

Issue 2744763005: 🏠 Add pull-handle to bottom toolbar (Closed)
Patch Set: findbugs nit picking Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
index 494538dd9c63e7a07c7dd209b05ab81c8ea0ff1c..5c1b66594bfbf4ff0a25e9b0aedb8534c02ed7b6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
@@ -5,9 +5,17 @@
package org.chromium.chrome.browser.toolbar;
import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
import android.util.AttributeSet;
+import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
+import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.widget.BottomSheet;
import org.chromium.chrome.browser.widget.BottomSheetObserver;
@@ -16,6 +24,12 @@ import org.chromium.chrome.browser.widget.BottomSheetObserver;
* Phone specific toolbar that exists at the bottom of the screen.
*/
public class BottomToolbarPhone extends ToolbarPhone implements BottomSheetObserver {
+ /** The white version of the toolbar handle; used for dark themes and incognito. */
+ private final Bitmap mHandleLight;
+
+ /** The dark version of the toolbar handle; this is the default handle to use. */
+ private final Bitmap mHandleDark;
+
/** A handle to the bottom sheet. */
private BottomSheet mBottomSheet;
@@ -30,6 +44,9 @@ public class BottomToolbarPhone extends ToolbarPhone implements BottomSheetObser
*/
private float mLastHeightFraction;
+ /** The toolbar handle view that indicates the toolbar can be pulled upward. */
+ private ImageView mToolbarHandleView;
+
/**
* Constructs a BottomToolbarPhone object.
* @param context The Context in which this View object is created.
@@ -37,6 +54,14 @@ public class BottomToolbarPhone extends ToolbarPhone implements BottomSheetObser
*/
public BottomToolbarPhone(Context context, AttributeSet attrs) {
super(context, attrs);
+
+ int defaultHandleColor =
+ ApiCompatibilityUtils.getColor(getResources(), R.color.google_grey_500);
+ mHandleDark = generateHandleBitmap(defaultHandleColor);
+
+ int lightHandleColor =
+ ApiCompatibilityUtils.getColor(getResources(), R.color.semi_opaque_white);
+ mHandleLight = generateHandleBitmap(lightHandleColor);
}
@Override
@@ -80,6 +105,90 @@ public class BottomToolbarPhone extends ToolbarPhone implements BottomSheetObser
mProgressBar.setProgressBarContainer(coordinator);
}
+ /**
+ * @return The extra top margin that should be applied to the browser controls views to
+ * correctly offset them from the handle that sits above them.
+ */
+ private int getExtraTopMargin() {
+ return getResources().getDimensionPixelSize(R.dimen.bottom_toolbar_top_margin);
+ }
+
+ @Override
+ public void onFinishInflate() {
+ super.onFinishInflate();
+
+ // Programmatically apply a top margin to all the children of the toolbar container. This
+ // is done so the view hierarchy does not need to be changed.
+ int topMarginForControls = getExtraTopMargin();
+
+ View topShadow = findViewById(R.id.bottom_toolbar_shadow);
+
+ for (int i = 0; i < getChildCount(); i++) {
+ View curView = getChildAt(i);
+
+ // Skip the shadow that sits at the top of the toolbar since this needs to sit on top
+ // of the toolbar.
+ if (curView == topShadow) continue;
+
+ ((MarginLayoutParams) curView.getLayoutParams()).topMargin = topMarginForControls;
+ }
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ // The toolbar handle is part of the control container so it can draw on top of the other
+ // toolbar views. Get the root view and search for the handle.
+ mToolbarHandleView = (ImageView) getRootView().findViewById(R.id.toolbar_handle);
+ mToolbarHandleView.setImageBitmap(mHandleDark);
+ }
+
+ @Override
+ protected void updateVisualsForToolbarState() {
+ super.updateVisualsForToolbarState();
+
+ // The handle should not show in tab switcher mode.
+ mToolbarHandleView.setVisibility(
+ mTabSwitcherState != ToolbarPhone.STATIC_TAB ? View.INVISIBLE : View.VISIBLE);
+ mToolbarHandleView.setImageBitmap(mUseLightToolbarDrawables ? mHandleLight : mHandleDark);
+ }
+
+ @Override
+ protected void updateLocationBarBackgroundBounds(Rect out, VisualState visualState) {
+ super.updateLocationBarBackgroundBounds(out, visualState);
+
+ // Allow the location bar to expand to the full height of the control container.
+ out.top -= getExtraTopMargin() * mUrlExpansionPercent;
+ }
+
+ /**
+ * Generate the bitmap used as the handle on the toolbar. This indicates that the toolbar can
+ * be pulled up.
+ * @return The handle as a bitmap.
+ */
+ private Bitmap generateHandleBitmap(int handleColor) {
+ int handleWidth = getResources().getDimensionPixelSize(R.dimen.toolbar_handle_width);
+ int handleHeight = getResources().getDimensionPixelSize(R.dimen.toolbar_handle_height);
+
+ Bitmap handle = Bitmap.createBitmap(handleWidth, handleHeight, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(handle);
+
+ // Clear the canvas to be completely transparent.
+ canvas.drawARGB(0, 0, 0, 0);
+
+ Paint paint = new Paint();
+ paint.setColor(handleColor);
+ paint.setAntiAlias(true);
+
+ RectF rect = new RectF(0, 0, handleWidth, handleHeight);
+
+ // Use height / 2 for the corner radius so the handle always takes the shape of a pill.
+ canvas.drawRoundRect(rect, handleHeight / 2f, handleHeight / 2f, paint);
+
+ return handle;
+ }
+
@Override
protected boolean shouldHideEndToolbarButtons() {
return mShouldHideEndToolbarButtons;

Powered by Google App Engine
This is Rietveld 408576698