am 0d843dc4: am ea32f94e: Fix bug 3058082 - text anchor positioning within moving dialogs
Merge commit '0d843dc47929ff6e3dbaa4cc1d07de7fbdba8506'
* commit '0d843dc47929ff6e3dbaa4cc1d07de7fbdba8506':
Fix bug 3058082 - text anchor positioning within moving dialogs
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 5a2cebe..fe9b94a 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -7755,8 +7755,10 @@
private int mPositionY;
private CursorController mController;
private boolean mIsDragging;
- private int mOffsetX;
- private int mOffsetY;
+ private float mOffsetX;
+ private float mOffsetY;
+ private float mHotspotX;
+ private float mHotspotY;
public HandleView(CursorController controller, Drawable handle) {
super(TextView.this.mContext);
@@ -7766,7 +7768,8 @@
com.android.internal.R.attr.textSelectHandleWindowStyle);
mContainer.setSplitTouchEnabled(true);
mContainer.setClippingEnabled(false);
- mContainer.setLayoutInScreenEnabled(true);
+ mHotspotX = mDrawable.getIntrinsicWidth() * 0.5f;
+ mHotspotY = -mDrawable.getIntrinsicHeight() * 0.2f;
}
@Override
@@ -7782,7 +7785,7 @@
}
mContainer.setContentView(this);
final int[] coords = mTempCoords;
- TextView.this.getLocationOnScreen(coords);
+ TextView.this.getLocationInWindow(coords);
coords[0] += mPositionX;
coords[1] += mPositionY;
mContainer.showAtLocation(TextView.this, 0, coords[0], coords[1]);
@@ -7825,7 +7828,7 @@
if (isPositionInBounds()) {
if (mContainer.isShowing()){
final int[] coords = mTempCoords;
- TextView.this.getLocationOnScreen(coords);
+ TextView.this.getLocationInWindow(coords);
coords[0] += mPositionX;
coords[1] += mPositionY;
mContainer.update(coords[0], coords[1], mRight - mLeft, mBottom - mTop);
@@ -7853,24 +7856,25 @@
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getActionMasked()) {
- case MotionEvent.ACTION_DOWN:
- mOffsetX = (int) (ev.getX() - mDrawable.getIntrinsicWidth() / 2.f + 0.5f);
- mOffsetY = (int) (ev.getY() - mDrawable.getIntrinsicHeight() / 2.f + 0.5f);
- mIsDragging = true;
- break;
-
- case MotionEvent.ACTION_MOVE:
+ case MotionEvent.ACTION_DOWN: {
final float rawX = ev.getRawX();
final float rawY = ev.getRawY();
- final int[] coords = mTempCoords;
- TextView.this.getLocationOnScreen(coords);
- final int x = (int) (rawX - coords[0] + 0.5f) - mOffsetX;
- final int y = (int) (rawY - coords[1] + 0.5f) -
- (int) (mDrawable.getIntrinsicHeight() * 0.8f) - mOffsetY;
-
- mController.updatePosition(this, x, y);
+ mOffsetX = rawX - mPositionX;
+ mOffsetY = rawY - mPositionY;
+ mIsDragging = true;
break;
+ }
+ case MotionEvent.ACTION_MOVE: {
+ final float rawX = ev.getRawX();
+ final float rawY = ev.getRawY();
+ final float newPosX = rawX - mOffsetX + mHotspotX;
+ final float newPosY = rawY - mOffsetY + mHotspotY;
+ mController.updatePosition(this, (int) Math.round(newPosX),
+ (int) Math.round(newPosY));
+
+ break;
+ }
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mIsDragging = false;