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

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: unittests Created 5 years, 6 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 720534c628e6c35b71cb89f5870c755ce41a07f1..fbe3b0f85190ca96a54c3946bff5734b1c66b86e 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
@@ -50,6 +50,10 @@ public class PopupTouchHandleDrawable extends View {
private int mParentPositionX;
private int mParentPositionY;
+ // The mirror values based on which the handles are inverted
+ private boolean mMirrorHorizontal;
+ private boolean mMirrorVertical;
+
// The offset from this handles position to the "tip" of the handle.
private float mHotspotX;
private float mHotspotY;
@@ -142,32 +146,37 @@ 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;
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();
+
switch (orientation) {
case TouchHandleOrientation.LEFT: {
- mDrawable = HandleViewResources.getLeftHandleDrawable(mContext);
- mHotspotX = (mDrawable.getIntrinsicWidth() * 3) / 4f;
+ int drawableWidth = mDrawable.getIntrinsicWidth();
+ mHotspotX = mirrorHorizontal ? drawableWidth / 4f : (drawableWidth * 3) / 4f;
jdduke (slow) 2015/06/19 14:33:58 Hmm, it's a bit odd to have the handle padding com
AviD 2015/06/19 15:25:29 mfomitchev suggested moving this logic of setting
break;
}
case TouchHandleOrientation.RIGHT: {
- mDrawable = HandleViewResources.getRightHandleDrawable(mContext);
- mHotspotX = mDrawable.getIntrinsicWidth() / 4f;
+ int drawableWidth = mDrawable.getIntrinsicWidth();
+ mHotspotX = mirrorHorizontal ? (drawableWidth * 3) / 4f : drawableWidth / 4f;
break;
}
case TouchHandleOrientation.CENTER: {
- mDrawable = HandleViewResources.getCenterHandleDrawable(mContext);
mHotspotX = mDrawable.getIntrinsicWidth() / 2f;
break;
}
@@ -176,7 +185,8 @@ public class PopupTouchHandleDrawable extends View {
default:
break;
}
- mHotspotY = 0;
+
+ mHotspotY = mirrorVertical ? mDrawable.getIntrinsicHeight() : 0;
// Force handle repositioning to accommodate the new orientation's hotspot.
if (hadValidOrientation) setFocus(oldAdjustedPositionX, oldAdjustedPositionY);
@@ -184,6 +194,27 @@ public class PopupTouchHandleDrawable extends View {
scheduleInvalidate();
}
+ private Drawable getHandleDrawable() {
+ switch (mOrientation) {
+ case TouchHandleOrientation.LEFT: {
+ return HandleViewResources.getLeftHandleDrawable(mContext);
+ }
+
+ case TouchHandleOrientation.RIGHT: {
+ return HandleViewResources.getRightHandleDrawable(mContext);
+ }
+
+ case TouchHandleOrientation.CENTER: {
+ return HandleViewResources.getCenterHandleDrawable(mContext);
+ }
+
+ case TouchHandleOrientation.UNDEFINED:
+ default:
+ assert false;
+ return HandleViewResources.getCenterHandleDrawable(mContext);
+ }
+ }
+
private void updateParentPosition(int parentPositionX, int parentPositionY) {
if (mParentPositionX == parentPositionX && mParentPositionY == parentPositionY) return;
mParentPositionX = parentPositionX;
@@ -284,9 +315,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();
}
// Returns the x coordinate of the position that the handle appears to be pointing to relative
@@ -373,6 +412,16 @@ public class PopupTouchHandleDrawable extends View {
}
@CalledByNative
+ private float getHandleVerticalPadding() {
+ return HandleViewResources.getHandleVerticalPadding();
+ }
+
+ @CalledByNative
+ private float getHandleHorizontalPadding() {
+ return HandleViewResources.getHandleHorizontalPadding();
+ }
+
+ @CalledByNative
private int getPositionY() {
return mPositionY;
}

Powered by Google App Engine
This is Rietveld 408576698