summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author nergi <nergi@google.com> 2025-01-06 13:31:03 +0900
committer nergi <nergi@google.com> 2025-01-10 12:09:58 +0900
commit8566c1637748704223d45d995b2215c635794f68 (patch)
treeb43a2e0c74ffdbaa35799e4e128560e6a1bd2792
parenta5bd2ed77cc68383896e3634d01b81b6c2eb5f07 (diff)
[DnD] Modify return animation for drop in different display
Demo: http://shortn/_xEO7tQIJpy Bug: 365512241 Test: atest WmTests:DragDropControllerTests Flag: com.android.window.flags.enable_connected_displays_dnd Change-Id: I097472019c2ec333594ab95a9e52a43204df50a9
-rw-r--r--services/core/java/com/android/server/wm/DragDropController.java4
-rw-r--r--services/core/java/com/android/server/wm/DragState.java39
2 files changed, 28 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java
index db058cafe5fe..fa748d3a22a5 100644
--- a/services/core/java/com/android/server/wm/DragDropController.java
+++ b/services/core/java/com/android/server/wm/DragDropController.java
@@ -212,7 +212,7 @@ class DragDropController {
surface = null;
mDragState.mPid = callerPid;
mDragState.mUid = callerUid;
- mDragState.mOriginalAlpha = alpha;
+ mDragState.mStartDragAlpha = alpha;
mDragState.mAnimatedScale = callingWin.mGlobalScale;
mDragState.mToken = dragToken;
mDragState.mStartDragDisplayContent = displayContent;
@@ -287,7 +287,7 @@ class DragDropController {
}
final SurfaceControl.Transaction transaction = mDragState.mTransaction;
- transaction.setAlpha(surfaceControl, mDragState.mOriginalAlpha);
+ transaction.setAlpha(surfaceControl, mDragState.mStartDragAlpha);
transaction.show(surfaceControl);
displayContent.reparentToOverlay(transaction, surfaceControl);
mDragState.updateDragSurfaceLocked(true /* keepHandling */,
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index d48b9b4a5d10..69f32cb7b8ea 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -82,6 +82,7 @@ import java.util.concurrent.CompletableFuture;
class DragState {
private static final long MIN_ANIMATION_DURATION_MS = 195;
private static final long MAX_ANIMATION_DURATION_MS = 375;
+ private static final float DIFFERENT_DISPLAY_RETURN_ANIMATION_SCALE = 0.75f;
private static final int DRAG_FLAGS_URI_ACCESS = View.DRAG_FLAG_GLOBAL_URI_READ |
View.DRAG_FLAG_GLOBAL_URI_WRITE;
@@ -114,8 +115,9 @@ class DragState {
boolean mDragResult;
boolean mRelinquishDragSurfaceToDropTarget;
float mAnimatedScale = 1.0f;
- float mOriginalAlpha;
- float mOriginalDisplayX, mOriginalDisplayY;
+ float mStartDragAlpha;
+ // Coords are in display coordinates space.
+ float mStartDragDisplayX, mStartDragDisplayY;
float mCurrentDisplayX, mCurrentDisplayY;
float mThumbOffsetX, mThumbOffsetY;
InputInterceptor mInputInterceptor;
@@ -497,8 +499,8 @@ class DragState {
*/
void broadcastDragStartedLocked(final float touchX, final float touchY) {
Trace.instant(TRACE_TAG_WINDOW_MANAGER, "DragDropController#DRAG_STARTED");
- mOriginalDisplayX = mCurrentDisplayX = touchX;
- mOriginalDisplayY = mCurrentDisplayY = touchY;
+ mStartDragDisplayX = mCurrentDisplayX = touchX;
+ mStartDragDisplayY = mCurrentDisplayY = touchY;
// Cache a base-class instance of the clip metadata so that parceling
// works correctly in calling out to the apps.
@@ -809,21 +811,32 @@ class DragState {
mCurrentDisplayY),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, mAnimatedScale,
mAnimatedScale),
- PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mOriginalAlpha, 0f));
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mStartDragAlpha, 0f));
+ duration = MIN_ANIMATION_DURATION_MS;
+ } else if (Flags.enableConnectedDisplaysDnd() && mCurrentDisplayContent.getDisplayId()
+ != mStartDragDisplayContent.getDisplayId()) {
+ animator = ValueAnimator.ofPropertyValuesHolder(
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_X,
+ mCurrentDisplayX - mThumbOffsetX, mCurrentDisplayX - mThumbOffsetX),
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_Y,
+ mCurrentDisplayY - mThumbOffsetY, mCurrentDisplayY - mThumbOffsetY),
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, mAnimatedScale,
+ DIFFERENT_DISPLAY_RETURN_ANIMATION_SCALE * mAnimatedScale),
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mStartDragAlpha, 0f));
duration = MIN_ANIMATION_DURATION_MS;
} else {
animator = ValueAnimator.ofPropertyValuesHolder(
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_X,
- mCurrentDisplayX - mThumbOffsetX, mOriginalDisplayX - mThumbOffsetX),
+ mCurrentDisplayX - mThumbOffsetX, mStartDragDisplayX - mThumbOffsetX),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_Y,
- mCurrentDisplayY - mThumbOffsetY, mOriginalDisplayY - mThumbOffsetY),
+ mCurrentDisplayY - mThumbOffsetY, mStartDragDisplayY - mThumbOffsetY),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, mAnimatedScale,
mAnimatedScale),
- PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mOriginalAlpha,
- mOriginalAlpha / 2));
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mStartDragAlpha,
+ mStartDragAlpha / 2));
- final float translateX = mOriginalDisplayX - mCurrentDisplayX;
- final float translateY = mOriginalDisplayY - mCurrentDisplayY;
+ final float translateX = mStartDragDisplayX - mCurrentDisplayX;
+ final float translateY = mStartDragDisplayY - mCurrentDisplayY;
// Adjust the duration to the travel distance.
final double travelDistance = Math.sqrt(
translateX * translateX + translateY * translateY);
@@ -853,7 +866,7 @@ class DragState {
mCurrentDisplayY),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, mAnimatedScale,
mAnimatedScale),
- PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mOriginalAlpha, 0f));
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mStartDragAlpha, 0f));
} else {
animator = ValueAnimator.ofPropertyValuesHolder(
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_X,
@@ -861,7 +874,7 @@ class DragState {
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_Y,
mCurrentDisplayY - mThumbOffsetY, mCurrentDisplayY),
PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_SCALE, mAnimatedScale, 0),
- PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mOriginalAlpha, 0));
+ PropertyValuesHolder.ofFloat(ANIMATED_PROPERTY_ALPHA, mStartDragAlpha, 0));
}
final AnimationListener listener = new AnimationListener();