Scale up the drag drop offsets and surface size

The surface size and thumbCenterX/Y use app's coordinate space, which
need to be scaled up on the server side.

Bug: b/239478191
Test: atest DragDropTest DragDropCompatTest
Test: am compat enable DOWNSCALED com.android.dragsource
      am compat enable DOWNSCALE_30 com.android.dragsource
Change-Id: Id36caee8aa38885a95f8d237766ac968ef6c8f85
This commit is contained in:
Xiang Wang
2022-08-08 17:54:46 -07:00
parent 2b74b5c6ab
commit 1e0a4edcc3
4 changed files with 19 additions and 4 deletions

View File

@@ -195,7 +195,7 @@ public class DragEvent implements Parcelable {
* {@link #ACTION_DRAG_ENTERED} while the drag shadow is still within the View object's bounding
* box, but not within a descendant view that can accept the data. The {@link #getX()} and
* {@link #getY()} methods supply
* the X and Y position of of the drag point within the View object's bounding box.
* the X and Y position of the drag point within the View object's bounding box.
* <p>
* A View receives an {@link #ACTION_DRAG_ENTERED} event before receiving any
* ACTION_DRAG_LOCATION events.

View File

@@ -62,6 +62,7 @@ import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -27546,6 +27547,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|| (shadowTouchPoint.x < 0) || (shadowTouchPoint.y < 0)) {
throw new IllegalStateException("Drag shadow dimensions must not be negative");
}
final float overrideInvScale = CompatibilityInfo.getOverrideInvertedScale();
if (overrideInvScale != 1f) {
shadowTouchPoint.x = (int) (shadowTouchPoint.x / overrideInvScale);
shadowTouchPoint.y = (int) (shadowTouchPoint.y / overrideInvScale);
}
// Create 1x1 surface when zero surface size is specified because SurfaceControl.Builder
// does not accept zero size surface.
@@ -27570,6 +27576,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
.setFormat(PixelFormat.TRANSLUCENT)
.setCallsite("View.startDragAndDrop")
.build();
if (overrideInvScale != 1f) {
final SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
transaction.setMatrix(surfaceControl, 1 / overrideInvScale, 0, 0, 1 / overrideInvScale)
.apply();
}
final Surface surface = new Surface();
surface.copyFrom(surfaceControl);
IBinder token = null;

View File

@@ -101,7 +101,8 @@ class DragDropController {
float thumbCenterX, float thumbCenterY, ClipData data) {
if (DEBUG_DRAG) {
Slog.d(TAG_WM, "perform drag: win=" + window + " surface=" + surface + " flags=" +
Integer.toHexString(flags) + " data=" + data);
Integer.toHexString(flags) + " data=" + data + " touch(" + touchX + ","
+ touchY + ") thumb center(" + thumbCenterX + "," + thumbCenterY + ")");
}
final IBinder dragToken = new Binder();
@@ -156,6 +157,7 @@ class DragDropController {
mDragState.mPid = callerPid;
mDragState.mUid = callerUid;
mDragState.mOriginalAlpha = alpha;
mDragState.mAnimatedScale = callingWin.mGlobalScale;
mDragState.mToken = dragToken;
mDragState.mDisplayContent = displayContent;
mDragState.mData = data;

View File

@@ -112,6 +112,7 @@ class DragState {
int mTouchSource;
boolean mDragResult;
boolean mRelinquishDragSurfaceToDropTarget;
float mAnimatedScale = 1.0f;
float mOriginalAlpha;
float mOriginalX, mOriginalY;
float mCurrentX, mCurrentY;
@@ -650,7 +651,8 @@ class DragState {
PropertyValuesHolder.ofFloat(
ANIMATED_PROPERTY_Y, mCurrentY - mThumbOffsetY,
mOriginalY - mThumbOffsetY),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, 1, 1),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, mAnimatedScale,
mAnimatedScale),
PropertyValuesHolder.ofFloat(
ANIMATED_PROPERTY_ALPHA, mOriginalAlpha, mOriginalAlpha / 2));
@@ -678,7 +680,7 @@ class DragState {
ANIMATED_PROPERTY_X, mCurrentX - mThumbOffsetX, mCurrentX),
PropertyValuesHolder.ofFloat(
ANIMATED_PROPERTY_Y, mCurrentY - mThumbOffsetY, mCurrentY),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, 1, 0),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, mAnimatedScale, 0),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mOriginalAlpha, 0));
final AnimationListener listener = new AnimationListener();
animator.setDuration(MIN_ANIMATION_DURATION_MS);