diff options
| author | 2025-01-06 13:31:03 +0900 | |
|---|---|---|
| committer | 2025-01-10 12:09:58 +0900 | |
| commit | 8566c1637748704223d45d995b2215c635794f68 (patch) | |
| tree | b43a2e0c74ffdbaa35799e4e128560e6a1bd2792 | |
| parent | a5bd2ed77cc68383896e3634d01b81b6c2eb5f07 (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.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/DragState.java | 39 |
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(); |