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

Unified Diff: content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java

Issue 481683003: Support for Adaptive Handle Orientation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 5 years, 2 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: content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java b/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java
index 28966f5c2059baabd292b850e2bbcbfa3c6ced12..b4f97867001965d0c1c9c86213cfaa1efad51fc4 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/PopupTouchHandleDrawable.java
@@ -5,6 +5,7 @@
package org.chromium.content.browser.input;
import android.annotation.SuppressLint;
+import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Build;
@@ -52,9 +53,9 @@ public class PopupTouchHandleDrawable extends View {
private int mParentPositionX;
private int mParentPositionY;
- // The offset from this handles position to the "tip" of the handle.
- private float mHotspotX;
- private float mHotspotY;
+ // The mirror values based on which the handles are inverted about X and Y axes.
+ private boolean mMirrorHorizontal;
+ private boolean mMirrorVertical;
private float mAlpha;
@@ -178,6 +179,27 @@ public class PopupTouchHandleDrawable extends View {
}
}
+ private static Drawable getHandleDrawable(Context context, int orientation) {
+ switch (orientation) {
+ case TouchHandleOrientation.LEFT: {
+ return HandleViewResources.getLeftHandleDrawable(context);
+ }
+
+ case TouchHandleOrientation.RIGHT: {
+ return HandleViewResources.getRightHandleDrawable(context);
+ }
+
+ case TouchHandleOrientation.CENTER: {
+ return HandleViewResources.getCenterHandleDrawable(context);
+ }
+
+ case TouchHandleOrientation.UNDEFINED:
+ default:
+ assert false;
+ return HandleViewResources.getCenterHandleDrawable(context);
+ }
+ }
+
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
@@ -200,46 +222,24 @@ public class PopupTouchHandleDrawable extends View {
}
@CalledByNative
- private void setOrientation(int orientation) {
+ private void setOrientation(int orientation, boolean mirrorVertical, boolean mirrorHorizontal) {
assert (orientation >= TouchHandleOrientation.LEFT
&& orientation <= TouchHandleOrientation.UNDEFINED);
- if (mOrientation == orientation) return;
- final boolean hadValidOrientation = mOrientation != TouchHandleOrientation.UNDEFINED;
+ final boolean orientationChanged = mOrientation != orientation;
+ final boolean mirroringChanged =
+ mMirrorHorizontal != mirrorHorizontal || mMirrorVertical != mirrorVertical;
mOrientation = orientation;
+ mMirrorHorizontal = mirrorHorizontal;
+ mMirrorVertical = mirrorVertical;
- final int oldAdjustedPositionX = getAdjustedPositionX();
- final int oldAdjustedPositionY = getAdjustedPositionY();
+ // Create new InvertedDrawable only if orientation has changed.
+ // Otherwise, change the mirror values to scale canvas on draw() calls.
+ if (orientationChanged) mDrawable = getHandleDrawable(getContext(), mOrientation);
- switch (orientation) {
- case TouchHandleOrientation.LEFT: {
- mDrawable = HandleViewResources.getLeftHandleDrawable(getContext());
- mHotspotX = (mDrawable.getIntrinsicWidth() * 3) / 4f;
- break;
- }
-
- case TouchHandleOrientation.RIGHT: {
- mDrawable = HandleViewResources.getRightHandleDrawable(getContext());
- mHotspotX = mDrawable.getIntrinsicWidth() / 4f;
- break;
- }
-
- case TouchHandleOrientation.CENTER: {
- mDrawable = HandleViewResources.getCenterHandleDrawable(getContext());
- mHotspotX = mDrawable.getIntrinsicWidth() / 2f;
- break;
- }
-
- case TouchHandleOrientation.UNDEFINED:
- default:
- break;
- }
- mHotspotY = 0;
-
- // Force handle repositioning to accommodate the new orientation's hotspot.
- if (hadValidOrientation) setFocus(oldAdjustedPositionX, oldAdjustedPositionY);
if (mDrawable != null) mDrawable.setAlpha((int) (255 * mAlpha));
- scheduleInvalidate();
+
+ if (orientationChanged || mirroringChanged) scheduleInvalidate();
}
private void updateParentPosition(int parentPositionX, int parentPositionY) {
@@ -388,9 +388,17 @@ public class PopupTouchHandleDrawable extends View {
@Override
protected void onDraw(Canvas c) {
if (mDrawable == null) return;
+ final boolean needsMirror = mMirrorHorizontal || mMirrorVertical;
+ if (needsMirror) {
+ c.save();
+ float scaleX = mMirrorHorizontal ? -1.f : 1.f;
+ float scaleY = mMirrorVertical ? -1.f : 1.f;
+ c.scale(scaleX, scaleY, getWidth() / 2.0f, getHeight() / 2.0f);
+ }
updateAlpha();
mDrawable.setBounds(0, 0, getRight() - getLeft(), getBottom() - getTop());
mDrawable.draw(c);
+ if (needsMirror) c.restore();
}
@Override
@@ -399,18 +407,6 @@ public class PopupTouchHandleDrawable extends View {
hide();
}
- // Returns the x coordinate of the position that the handle appears to be pointing to relative
- // to the handles "parent" view.
- private int getAdjustedPositionX() {
- return mPositionX + Math.round(mHotspotX);
- }
-
- // Returns the y coordinate of the position that the handle appears to be pointing to relative
- // to the handles "parent" view.
- private int getAdjustedPositionY() {
- return mPositionY + Math.round(mHotspotY);
- }
-
@CalledByNative
private void destroy() {
if (mContentViewCore == null) return;
@@ -446,12 +442,10 @@ public class PopupTouchHandleDrawable extends View {
}
@CalledByNative
- private void setFocus(float focusX, float focusY) {
- int x = (int) focusX - Math.round(mHotspotX);
- int y = (int) focusY - Math.round(mHotspotY);
- if (mPositionX == x && mPositionY == y) return;
- mPositionX = x;
- mPositionY = y;
+ private void setOrigin(float originX, float originY) {
+ if (mPositionX == originX && mPositionY == originY) return;
+ mPositionX = (int) originX;
+ mPositionY = (int) originY;
if (getVisibility() == VISIBLE) scheduleInvalidate();
}
@@ -468,6 +462,11 @@ public class PopupTouchHandleDrawable extends View {
}
@CalledByNative
+ private float getHandleHorizontalPaddingRatio() {
+ return HandleViewResources.getHandleHorizontalPaddingRatio();
+ }
+
+ @CalledByNative
private int getPositionY() {
return mPositionY;
}

Powered by Google App Engine
This is Rietveld 408576698