Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +6 −4 Original line number Diff line number Diff line Loading @@ -1024,17 +1024,19 @@ public abstract class WMShellModule { Context context, Transitions transitions, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, DesksOrganizer desksOrganizer, @DynamicOverride DesktopUserRepositories desktopUserRepositories, InteractionJankMonitor interactionJankMonitor, Optional<BubbleController> bubbleController, DesktopState desktopState) { return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue() ? new SpringDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState) context, transitions, rootTaskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState) : new DefaultDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState); context, transitions, rootTaskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState); } @WMSingleton Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +11 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import com.android.wm.shell.bubbles.BubbleTransitions import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.TransitionUtil import com.android.wm.shell.shared.animation.Interpolators Loading Loading @@ -85,6 +86,7 @@ sealed class DragToDesktopTransitionHandler( private val context: Context, private val transitions: Transitions, private val taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, private val desksOrganizer: DesksOrganizer, private val desktopUserRepositories: DesktopUserRepositories, protected val interactionJankMonitor: InteractionJankMonitor, private val bubbleController: Optional<BubbleController>, Loading Loading @@ -875,8 +877,11 @@ sealed class DragToDesktopTransitionHandler( startTransaction.setLayer(change.leash, it.dragLayer) } } change.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM -> { // Other freeform tasks that are being restored go behind the dragged task. // Other desktop tasks that are being restored go behind the dragged task. change.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM // Except for the desk root, that should not be sent back or it might // take the dragged task surface back with it. && !desksOrganizer.isDeskChange(change) -> { val draggedTaskLeash = state.draggedTaskChange?.leash ?: error("Expected dragged leash to be non-null") Loading Loading @@ -1269,6 +1274,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desksOrganizer: DesksOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, bubbleController: Optional<BubbleController>, Loading @@ -1281,6 +1287,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, Loading Loading @@ -1311,6 +1318,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desksOrganizer: DesksOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, bubbleController: Optional<BubbleController>, Loading @@ -1323,6 +1331,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +46 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKT import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler.CancelState import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler.Companion.DRAG_TO_DESKTOP_FINISH_ANIM_DURATION_MS import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer import com.android.wm.shell.shared.desktopmode.FakeDesktopState import com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT import com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT Loading Loading @@ -80,6 +81,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { @Mock private lateinit var transitions: Transitions @Mock private lateinit var taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer @Mock private lateinit var desksOrganizer: DesksOrganizer @Mock private lateinit var splitScreenController: SplitScreenController @Mock private lateinit var dragAnimator: MoveToDesktopAnimator @Mock private lateinit var mockInteractionJankMonitor: InteractionJankMonitor Loading Loading @@ -114,6 +116,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, mockInteractionJankMonitor, Optional.of(bubbleController), Loading @@ -130,6 +133,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, mockInteractionJankMonitor, Optional.of(bubbleController), Loading Loading @@ -566,6 +570,40 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { verify(finishCallback).onTransitionFinished(null) } @Test fun mergeAnimation_endTransition_hasDeskChange_doesNotMoveBehindDraggedTask() { val playingFinishTransaction = mock<SurfaceControl.Transaction>() val mergedStartTransaction = mock<SurfaceControl.Transaction>() val mergedFinishTransaction = mock<SurfaceControl.Transaction>() val finishCallback = mock<Transitions.TransitionFinishCallback>() val deskChange = createDeskChange() val task = createTask() val startTransition = startDrag(defaultHandler, task, finishTransaction = playingFinishTransaction) defaultHandler.onTaskResizeAnimationListener = mock() whenever(desksOrganizer.isDeskChange(deskChange)).thenReturn(true) defaultHandler.mergeAnimation( transition = mock<IBinder>(), info = createTransitionInfo( type = TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP, draggedTask = task, deskChange = deskChange, ), startT = mergedStartTransaction, finishT = mergedFinishTransaction, mergeTarget = startTransition, finishCallback = finishCallback, ) // Don't move the desk leash back, or it will take the dragged task with it. verify(mergedStartTransaction, never()) .setRelativeLayer(eq(deskChange.leash), eq(draggedTaskLeash), anyInt()) verify(playingFinishTransaction, never()) .setRelativeLayer(eq(deskChange.leash), eq(draggedTaskLeash), anyInt()) } @Test fun mergeAnimation_endTransition_springHandler_hidesHome() { whenever(dragAnimator.computeCurrentVelocity()).thenReturn(PointF()) Loading Loading @@ -1216,6 +1254,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { draggedTask: RunningTaskInfo, homeChange: TransitionInfo.Change? = createHomeChange(), rootLeash: SurfaceControl = mock(), deskChange: TransitionInfo.Change? = null, ) = TransitionInfo(type, /* flags= */ 0).apply { homeChange?.let { addChange(it) } Loading @@ -1225,6 +1264,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { taskInfo = draggedTask } ) deskChange?.let { addChange(it) } addChange( // Wallpaper. TransitionInfo.Change(mock(), wallpaperLeash).apply { parent = null Loading @@ -1242,6 +1282,12 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { flags = flags or FLAG_IS_WALLPAPER } private fun createDeskChange() = TransitionInfo.Change(mock(), mock()).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().build() } private fun systemPropertiesKey(name: String) = "${SpringDragToDesktopTransitionHandler.SYSTEM_PROPERTIES_GROUP}.$name" Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +6 −4 Original line number Diff line number Diff line Loading @@ -1024,17 +1024,19 @@ public abstract class WMShellModule { Context context, Transitions transitions, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, DesksOrganizer desksOrganizer, @DynamicOverride DesktopUserRepositories desktopUserRepositories, InteractionJankMonitor interactionJankMonitor, Optional<BubbleController> bubbleController, DesktopState desktopState) { return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue() ? new SpringDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState) context, transitions, rootTaskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState) : new DefaultDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState); context, transitions, rootTaskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, desktopState); } @WMSingleton Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +11 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import com.android.wm.shell.bubbles.BubbleTransitions import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.TransitionUtil import com.android.wm.shell.shared.animation.Interpolators Loading Loading @@ -85,6 +86,7 @@ sealed class DragToDesktopTransitionHandler( private val context: Context, private val transitions: Transitions, private val taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, private val desksOrganizer: DesksOrganizer, private val desktopUserRepositories: DesktopUserRepositories, protected val interactionJankMonitor: InteractionJankMonitor, private val bubbleController: Optional<BubbleController>, Loading Loading @@ -875,8 +877,11 @@ sealed class DragToDesktopTransitionHandler( startTransaction.setLayer(change.leash, it.dragLayer) } } change.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM -> { // Other freeform tasks that are being restored go behind the dragged task. // Other desktop tasks that are being restored go behind the dragged task. change.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM // Except for the desk root, that should not be sent back or it might // take the dragged task surface back with it. && !desksOrganizer.isDeskChange(change) -> { val draggedTaskLeash = state.draggedTaskChange?.leash ?: error("Expected dragged leash to be non-null") Loading Loading @@ -1269,6 +1274,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desksOrganizer: DesksOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, bubbleController: Optional<BubbleController>, Loading @@ -1281,6 +1287,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, Loading Loading @@ -1311,6 +1318,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desksOrganizer: DesksOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, bubbleController: Optional<BubbleController>, Loading @@ -1323,6 +1331,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, interactionJankMonitor, bubbleController, Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +46 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKT import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler.CancelState import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler.Companion.DRAG_TO_DESKTOP_FINISH_ANIM_DURATION_MS import com.android.wm.shell.desktopmode.multidesks.DesksOrganizer import com.android.wm.shell.shared.desktopmode.FakeDesktopState import com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT import com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT Loading Loading @@ -80,6 +81,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { @Mock private lateinit var transitions: Transitions @Mock private lateinit var taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer @Mock private lateinit var desksOrganizer: DesksOrganizer @Mock private lateinit var splitScreenController: SplitScreenController @Mock private lateinit var dragAnimator: MoveToDesktopAnimator @Mock private lateinit var mockInteractionJankMonitor: InteractionJankMonitor Loading Loading @@ -114,6 +116,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, mockInteractionJankMonitor, Optional.of(bubbleController), Loading @@ -130,6 +133,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desksOrganizer, desktopUserRepositories, mockInteractionJankMonitor, Optional.of(bubbleController), Loading Loading @@ -566,6 +570,40 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { verify(finishCallback).onTransitionFinished(null) } @Test fun mergeAnimation_endTransition_hasDeskChange_doesNotMoveBehindDraggedTask() { val playingFinishTransaction = mock<SurfaceControl.Transaction>() val mergedStartTransaction = mock<SurfaceControl.Transaction>() val mergedFinishTransaction = mock<SurfaceControl.Transaction>() val finishCallback = mock<Transitions.TransitionFinishCallback>() val deskChange = createDeskChange() val task = createTask() val startTransition = startDrag(defaultHandler, task, finishTransaction = playingFinishTransaction) defaultHandler.onTaskResizeAnimationListener = mock() whenever(desksOrganizer.isDeskChange(deskChange)).thenReturn(true) defaultHandler.mergeAnimation( transition = mock<IBinder>(), info = createTransitionInfo( type = TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP, draggedTask = task, deskChange = deskChange, ), startT = mergedStartTransaction, finishT = mergedFinishTransaction, mergeTarget = startTransition, finishCallback = finishCallback, ) // Don't move the desk leash back, or it will take the dragged task with it. verify(mergedStartTransaction, never()) .setRelativeLayer(eq(deskChange.leash), eq(draggedTaskLeash), anyInt()) verify(playingFinishTransaction, never()) .setRelativeLayer(eq(deskChange.leash), eq(draggedTaskLeash), anyInt()) } @Test fun mergeAnimation_endTransition_springHandler_hidesHome() { whenever(dragAnimator.computeCurrentVelocity()).thenReturn(PointF()) Loading Loading @@ -1216,6 +1254,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { draggedTask: RunningTaskInfo, homeChange: TransitionInfo.Change? = createHomeChange(), rootLeash: SurfaceControl = mock(), deskChange: TransitionInfo.Change? = null, ) = TransitionInfo(type, /* flags= */ 0).apply { homeChange?.let { addChange(it) } Loading @@ -1225,6 +1264,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { taskInfo = draggedTask } ) deskChange?.let { addChange(it) } addChange( // Wallpaper. TransitionInfo.Change(mock(), wallpaperLeash).apply { parent = null Loading @@ -1242,6 +1282,12 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { flags = flags or FLAG_IS_WALLPAPER } private fun createDeskChange() = TransitionInfo.Change(mock(), mock()).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().build() } private fun systemPropertiesKey(name: String) = "${SpringDragToDesktopTransitionHandler.SYSTEM_PROPERTIES_GROUP}.$name" Loading