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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/CompositorButton.java

Issue 842083003: Upstream CompositorButton, VirtualView and TitleBitmapFactory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix typos Created 5 years, 11 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/compositor/layouts/components/CompositorButton.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/CompositorButton.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/CompositorButton.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d40c0f2e0033fe4a9c31963d4ebad9614599550
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/CompositorButton.java
@@ -0,0 +1,347 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.compositor.layouts.components;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.RectF;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation;
+
+/**
+ * {@link CompositorButton} keeps track of state for buttons that are rendered
+ * in the compositor.
+ */
+public class CompositorButton
+ implements ChromeAnimation.Animatable<CompositorButton.Property>, VirtualView {
+ /**
+ * Animatable properties that can be used with a {@link ChromeAnimation.Animatable} on a
+ * {@link CompositorButton}.
+ */
+ public enum Property {
+ OPACITY,
+ }
+
+ // Precached bounds rect.
+ private final RectF mBounds = new RectF();
+
+ private int mResource;
+ private int mPressedResource;
+ private int mIncognitoResource;
+ private int mIncognitoPressedResource;
+
+ private float mOpacity;
+ private float mClickSlop;
+ private boolean mIsPressed;
+ private boolean mIsVisible;
+ private boolean mIsIncognito;
+ private boolean mIsEnabled;
+ private String mAccessibilityDescription;
+ private String mAccessibilityDescriptionIncognito;
+
+ private final RectF mCacheBounds = new RectF(); // Pre-allocated to avoid in-frame allocations.
+
+ /**
+ * Default constructor for {@link CompositorButton}
+ * @param context An Android context for fetching dimens.
+ * @param width The button width.
+ * @param height The button height.
+ */
+ public CompositorButton(Context context, float width, float height) {
+ mBounds.set(0, 0, width, height);
+
+ mOpacity = 1.f;
+ mIsPressed = false;
+ mIsVisible = true;
+ mIsIncognito = false;
+ mIsEnabled = true;
+
+ Resources res = context.getResources();
+ float sPxToDp = 1.0f / res.getDisplayMetrics().density;
+ mClickSlop = res.getDimension(R.dimen.compositor_button_slop) * sPxToDp;
+ }
+
+ /**
+ * Secondary constructor for {@link CompositorButton}
+ * @param context An Android context for fetching dimens.
+ * @param bounds A RectF that bounds the button.
+ */
+ public CompositorButton(Context context, RectF bounds) {
+ this(context, bounds.width(), bounds.height());
+ mBounds.set(bounds);
+ }
+
+ /**
+ * A set of Android resources to supply to the compositor.
+ * @param resource The default Android resource.
+ * @param pressedResource The pressed Android resource.
+ * @param incognitoResource The incognito Android resource.
+ * @param incognitoPressedResource The incognito pressed resource.
+ */
+ public void setResources(int resource, int presssedResource, int incognitoResource,
+ int incognitoPressedResource) {
+ mResource = resource;
+ mPressedResource = presssedResource;
+ mIncognitoResource = incognitoResource;
+ mIncognitoPressedResource = incognitoPressedResource;
+ }
+
+ /**
+ * @param description A string describing the resource.
+ */
+ public void setAccessibilityDescription(String description, String incognitoDescription) {
+ mAccessibilityDescription = description;
+ mAccessibilityDescriptionIncognito = incognitoDescription;
+ }
+
+ @Override
+ public String getAccessibilityDescription() {
+ return mIsIncognito ? mAccessibilityDescriptionIncognito : mAccessibilityDescription;
+ }
+
+ @Override
+ public void getTouchTarget(RectF outTarget) {
+ outTarget.set(mBounds);
+ // Get the whole touchable region.
+ outTarget.inset((int) -mClickSlop, (int) -mClickSlop);
+ }
+
+ /**
+ * @return The the x offset of the button.
+ */
+ public float getX() {
+ return mBounds.left;
+ }
+
+ /**
+ * @param x The x offset of the button.
+ */
+ public void setX(float x) {
+ mBounds.right = x + mBounds.width();
+ mBounds.left = x;
+ }
+
+ /**
+ * @return The y offset of the button.
+ */
+ public float getY() {
+ return mBounds.top;
+ }
+
+ /**
+ * @param y The y offset of the button.
+ */
+ public void setY(float y) {
+ mBounds.bottom = y + mBounds.height();
+ mBounds.top = y;
+ }
+
+ /**
+ * @return The width of the button.
+ */
+ public float getWidth() {
+ return mBounds.width();
+ }
+
+ /**
+ * @param width The width of the button.
+ */
+ public void setWidth(float width) {
+ mBounds.right = mBounds.left + width;
+ }
+
+ /**
+ * @return The height of the button.
+ */
+ public float getHeight() {
+ return mBounds.height();
+ }
+
+ /**
+ * @param height The height of the button.
+ */
+ public void setHeight(float height) {
+ mBounds.bottom = mBounds.top + height;
+ }
+
+ /**
+ * @param bounds A {@link Rect} representing the location of the button.
+ */
+ public void setBounds(RectF bounds) {
+ mBounds.set(bounds);
+ }
+
+ /**
+ * @return The opacity of the button.
+ */
+ public float getOpacity() {
+ return mOpacity;
+ }
+
+ /**
+ * @param opacity The opacity of the button.
+ */
+ public void setOpacity(float opacity) {
+ mOpacity = opacity;
+ }
+
+ /**
+ * @return The pressed state of the button.
+ */
+ public boolean isPressed() {
+ return mIsPressed;
+ }
+
+ /**
+ * @param state The pressed state of the button.
+ */
+ public void setPressed(boolean state) {
+ mIsPressed = state;
+ }
+
+ /**
+ * @return The visiblity of the button.
+ */
+ public boolean isVisible() {
+ return mIsVisible;
+ }
+
+ /**
+ * @param state The visibility of the button.
+ */
+ public void setVisible(boolean state) {
+ mIsVisible = state;
+ }
+
+ /**
+ * @return The incognito state of the button.
+ */
+ public boolean isIncognito() {
+ return mIsIncognito;
+ }
+
+ /**
+ * @param state The incognito state of the button.
+ */
+ public void setIncognito(boolean state) {
+ mIsIncognito = state;
+ }
+
+ /**
+ * @return Whether or not the button can be interacted with.
+ */
+ public boolean isEnabled() {
+ return mIsEnabled;
+ }
+
+ /**
+ * @param state Whether or not the button can be interacted with.
+ */
+ public void setEnabled(boolean enabled) {
+ mIsEnabled = enabled;
+ }
+
+ /**
+ * @param slop The additional area outside of the button to be considered when
+ * checking click target bounds.
+ */
+ public void setClickSlop(float slop) {
+ mClickSlop = slop;
+ }
+
+ /**
+ * @return The Android resource id for this button based on it's state.
+ */
+ public int getResourceId() {
+ if (isPressed()) {
+ return isIncognito() ? mIncognitoPressedResource : mPressedResource;
+ }
+ return isIncognito() ? mIncognitoResource : mResource;
+ }
+
+ /**
+ * @param x The x offset of the click.
+ * @param y The y offset of the click.
+ * @return Whether or not that click occurred inside of the button + slop area.
+ */
+ @Override
+ public boolean checkClicked(float x, float y) {
+ if (mOpacity < 1.f || !mIsVisible || !mIsEnabled) return false;
+
+ mCacheBounds.set(mBounds);
+ mCacheBounds.inset(-mClickSlop, -mClickSlop);
+ return mCacheBounds.contains(x, y);
+ }
+
+ /**
+ * Set state for a drag event.
+ * @param x The x offset of the event.
+ * @param y The y offset of the event.
+ * @return Whether or not the button is selected after the event.
+ */
+ public boolean drag(float x, float y) {
+ if (!checkClicked(x, y)) {
+ setPressed(false);
+ return false;
+ }
+ return isPressed();
+ }
+
+ /**
+ * Set state for an onDown event.
+ * @param x The x offset of the event.
+ * @param y The y offset of the event.
+ * @return Whether or not the close button was selected.
+ */
+ public boolean onDown(float x, float y) {
+ if (checkClicked(x, y)) {
+ setPressed(true);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param x The x offset of the event.
+ * @param y The y offset of the event.
+ * @return If the button was clicked or not.
+ */
+ public boolean click(float x, float y) {
+ if (checkClicked(x, y)) {
+ setPressed(false);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Set state for an onUpOrCancel event.
+ * @return Whether or not the button was selected.
+ */
+ public boolean onUpOrCancel() {
+ boolean state = isPressed();
+ setPressed(false);
+ return state;
+ }
+
+ /**
+ * Callback for {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation
+ * .Animatable}
+ *
+ * @param prop The property to set
+ * @param val The value to set it to
+ */
+ @Override
+ public void setProperty(Property prop, float val) {
+ switch (prop) {
+ case OPACITY:
+ setOpacity(val);
+ break;
+ default:
+ // Do nothing.
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698