Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java +6 −5 Original line number Diff line number Diff line Loading @@ -977,7 +977,7 @@ public class PipTouchHandler implements PipTransitionState.PipTransitionStateCha // Reset the touch state on up before the fling settles mTouchState.reset(); if (mEnableStash && shouldStash(vel, getPossiblyMotionBounds())) { if (mEnableStash && shouldStash(vel, getPossiblyMotionBounds(), displayIdOnUp)) { mMotionHelper.stashToEdge(vel.x, vel.y, null /* endAction */); } else { if (mPipBoundsState.isStashed()) { Loading Loading @@ -1059,7 +1059,7 @@ public class PipTouchHandler implements PipTransitionState.PipTransitionStateCha } } private boolean shouldStash(PointF vel, Rect motionBounds) { private boolean shouldStash(PointF vel, Rect motionBounds, int displayIdOnUp) { final boolean flingToLeft = vel.x < -mStashVelocityThreshold; final boolean flingToRight = vel.x > mStashVelocityThreshold; final int offset = motionBounds.width() / 2; Loading Loading @@ -1094,10 +1094,11 @@ public class PipTouchHandler implements PipTransitionState.PipTransitionStateCha final boolean stashFromDroppingOnEdge = droppingOnLeft || droppingOnRight; // If dragging PiP across displays is allowed, then ensure that stashing only occurs // when no drag mirrors of the window are shown, meaning that it wasn't partially shown // on another display // when no drag mirrors of the window are shown, and the display ID on down and up are // the same, meaning that we don't allow stashing while moving PiP across displays return (stashFromFlingToEdge || stashFromDroppingOnEdge) && !mPipDisplayTransferHandler.isMirrorShown(); && !mPipDisplayTransferHandler.isMirrorShown() && mDisplayIdOnDown == displayIdOnUp; } } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/phone/PipTouchHandlerTest.kt +55 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyInt import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doNothing import org.mockito.kotlin.eq import org.mockito.kotlin.mock Loading Loading @@ -130,6 +131,8 @@ class PipTouchHandlerTest : ShellTestCase() { whenever(pipTouchState.latestMotionEvent).thenReturn(mockMotionEvent) whenever(pipTransitionState.pinnedTaskLeash).thenReturn(mockLeash) whenever(mockPipBoundsState.movementBounds).thenReturn(PIP_BOUNDS) whenever(mockPipBoundsState.displayLayout).thenReturn(mockDisplayLayout) whenever(mockPipBoundsState.displayBounds).thenReturn(DISPLAY_BOUNDS) whenever(mockPipBoundsState.motionBoundsState).thenReturn(mockMotionBoundsState) whenever(pipTouchHandler.possiblyMotionBounds).thenReturn(PIP_BOUNDS) whenever(mockDisplayController.getDisplayLayout(anyInt())) Loading Loading @@ -294,10 +297,62 @@ class PipTouchHandlerTest : ShellTestCase() { verify(mockPipDisplayTransferHandler, never()).removeMirrors() } @Test fun pipTouchGesture_onUpMotionBoundsDroppingOnLeft_pipStashedToEdge() { pipTouchGesture.onDown(pipTouchState) pipTouchHandler.mEnableStash = true whenever(pipTouchState.isDragging).thenReturn(true) PIP_BOUNDS.offset(-500, 0) whenever(mockPipBoundsState.bounds).thenReturn(PIP_BOUNDS) pipTouchGesture.onUp(pipTouchState) verify(mockPipMotionHelper).stashToEdge( any(), any(), anyOrNull() ) } @Test fun pipTouchGesture_onUpDisplayIdChanged_disallowsStashing() { whenever(mockPipDesktopState.isDraggingPipAcrossDisplaysEnabled()).thenReturn(true) pipTouchGesture.onDown(pipTouchState) pipTouchHandler.mEnableStash = true whenever(pipTouchState.isDragging).thenReturn(true) PIP_BOUNDS.offset(-500, 0) whenever(mockPipBoundsState.bounds).thenReturn(PIP_BOUNDS) whenever(pipTouchState.lastTouchDisplayId).thenReturn(TARGET_DISPLAY_ID) pipTouchGesture.onUp(pipTouchState) verify(mockPipMotionHelper, never()).stashToEdge( any(), any(), anyOrNull() ) } @Test fun pipTouchGesture_onUpMirrorIsShown_disallowsStashing() { whenever(mockPipDesktopState.isDraggingPipAcrossDisplaysEnabled()).thenReturn(true) pipTouchGesture.onDown(pipTouchState) pipTouchHandler.mEnableStash = true whenever(pipTouchState.isDragging).thenReturn(true) PIP_BOUNDS.offset(-500, 0) whenever(mockPipBoundsState.bounds).thenReturn(PIP_BOUNDS) whenever(mockPipDisplayTransferHandler.isMirrorShown).thenReturn(true) pipTouchGesture.onUp(pipTouchState) verify(mockPipMotionHelper, never()).stashToEdge( any(), any(), anyOrNull() ) } private companion object { const val ORIGIN_DISPLAY_ID = 0 const val TARGET_DISPLAY_ID = 1 val PIP_BOUNDS = Rect(0, 0, 700, 700) val DISPLAY_BOUNDS = Rect(0, 0, 1000, 1000) val GLOBAL_BOUNDS = RectF(0f, 0f, 400f, 400f) } } No newline at end of file Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java +6 −5 Original line number Diff line number Diff line Loading @@ -977,7 +977,7 @@ public class PipTouchHandler implements PipTransitionState.PipTransitionStateCha // Reset the touch state on up before the fling settles mTouchState.reset(); if (mEnableStash && shouldStash(vel, getPossiblyMotionBounds())) { if (mEnableStash && shouldStash(vel, getPossiblyMotionBounds(), displayIdOnUp)) { mMotionHelper.stashToEdge(vel.x, vel.y, null /* endAction */); } else { if (mPipBoundsState.isStashed()) { Loading Loading @@ -1059,7 +1059,7 @@ public class PipTouchHandler implements PipTransitionState.PipTransitionStateCha } } private boolean shouldStash(PointF vel, Rect motionBounds) { private boolean shouldStash(PointF vel, Rect motionBounds, int displayIdOnUp) { final boolean flingToLeft = vel.x < -mStashVelocityThreshold; final boolean flingToRight = vel.x > mStashVelocityThreshold; final int offset = motionBounds.width() / 2; Loading Loading @@ -1094,10 +1094,11 @@ public class PipTouchHandler implements PipTransitionState.PipTransitionStateCha final boolean stashFromDroppingOnEdge = droppingOnLeft || droppingOnRight; // If dragging PiP across displays is allowed, then ensure that stashing only occurs // when no drag mirrors of the window are shown, meaning that it wasn't partially shown // on another display // when no drag mirrors of the window are shown, and the display ID on down and up are // the same, meaning that we don't allow stashing while moving PiP across displays return (stashFromFlingToEdge || stashFromDroppingOnEdge) && !mPipDisplayTransferHandler.isMirrorShown(); && !mPipDisplayTransferHandler.isMirrorShown() && mDisplayIdOnDown == displayIdOnUp; } } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/phone/PipTouchHandlerTest.kt +55 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyInt import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doNothing import org.mockito.kotlin.eq import org.mockito.kotlin.mock Loading Loading @@ -130,6 +131,8 @@ class PipTouchHandlerTest : ShellTestCase() { whenever(pipTouchState.latestMotionEvent).thenReturn(mockMotionEvent) whenever(pipTransitionState.pinnedTaskLeash).thenReturn(mockLeash) whenever(mockPipBoundsState.movementBounds).thenReturn(PIP_BOUNDS) whenever(mockPipBoundsState.displayLayout).thenReturn(mockDisplayLayout) whenever(mockPipBoundsState.displayBounds).thenReturn(DISPLAY_BOUNDS) whenever(mockPipBoundsState.motionBoundsState).thenReturn(mockMotionBoundsState) whenever(pipTouchHandler.possiblyMotionBounds).thenReturn(PIP_BOUNDS) whenever(mockDisplayController.getDisplayLayout(anyInt())) Loading Loading @@ -294,10 +297,62 @@ class PipTouchHandlerTest : ShellTestCase() { verify(mockPipDisplayTransferHandler, never()).removeMirrors() } @Test fun pipTouchGesture_onUpMotionBoundsDroppingOnLeft_pipStashedToEdge() { pipTouchGesture.onDown(pipTouchState) pipTouchHandler.mEnableStash = true whenever(pipTouchState.isDragging).thenReturn(true) PIP_BOUNDS.offset(-500, 0) whenever(mockPipBoundsState.bounds).thenReturn(PIP_BOUNDS) pipTouchGesture.onUp(pipTouchState) verify(mockPipMotionHelper).stashToEdge( any(), any(), anyOrNull() ) } @Test fun pipTouchGesture_onUpDisplayIdChanged_disallowsStashing() { whenever(mockPipDesktopState.isDraggingPipAcrossDisplaysEnabled()).thenReturn(true) pipTouchGesture.onDown(pipTouchState) pipTouchHandler.mEnableStash = true whenever(pipTouchState.isDragging).thenReturn(true) PIP_BOUNDS.offset(-500, 0) whenever(mockPipBoundsState.bounds).thenReturn(PIP_BOUNDS) whenever(pipTouchState.lastTouchDisplayId).thenReturn(TARGET_DISPLAY_ID) pipTouchGesture.onUp(pipTouchState) verify(mockPipMotionHelper, never()).stashToEdge( any(), any(), anyOrNull() ) } @Test fun pipTouchGesture_onUpMirrorIsShown_disallowsStashing() { whenever(mockPipDesktopState.isDraggingPipAcrossDisplaysEnabled()).thenReturn(true) pipTouchGesture.onDown(pipTouchState) pipTouchHandler.mEnableStash = true whenever(pipTouchState.isDragging).thenReturn(true) PIP_BOUNDS.offset(-500, 0) whenever(mockPipBoundsState.bounds).thenReturn(PIP_BOUNDS) whenever(mockPipDisplayTransferHandler.isMirrorShown).thenReturn(true) pipTouchGesture.onUp(pipTouchState) verify(mockPipMotionHelper, never()).stashToEdge( any(), any(), anyOrNull() ) } private companion object { const val ORIGIN_DISPLAY_ID = 0 const val TARGET_DISPLAY_ID = 1 val PIP_BOUNDS = Rect(0, 0, 700, 700) val DISPLAY_BOUNDS = Rect(0, 0, 1000, 1000) val GLOBAL_BOUNDS = RectF(0f, 0f, 400f, 400f) } } No newline at end of file