Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +38 −17 Original line number Diff line number Diff line Loading @@ -304,14 +304,14 @@ sealed class DragToDesktopTransitionHandler( val leafTaskFilter = TransitionUtil.LeafTaskFilter() info.changes.withIndex().forEach { (i, change) -> if (TransitionUtil.isWallpaper(change)) { val layer = layers.wallpaperLayers - i val layer = layers.topWallpaperLayer - i startTransaction.apply { setLayer(change.leash, layer) show(change.leash) } } else if (isHomeChange(change)) { state.homeChange = change val layer = layers.homeLayers - i val layer = layers.topHomeLayer - i startTransaction.apply { setLayer(change.leash, layer) show(change.leash) Loading @@ -325,7 +325,7 @@ sealed class DragToDesktopTransitionHandler( if (state.cancelState == CancelState.NO_CANCEL) { // Normal case, split root goes to the bottom behind everything // else. layers.appLayers - i layers.topAppLayer - i } else { // Cancel-early case, pretend nothing happened so split root stays // top. Loading Loading @@ -357,7 +357,7 @@ sealed class DragToDesktopTransitionHandler( state.otherRootChanges.add(change) val bounds = change.endAbsBounds startTransaction.apply { setLayer(change.leash, layers.appLayers - i) setLayer(change.leash, layers.topAppLayer - i) setWindowCrop(change.leash, bounds.width(), bounds.height()) show(change.leash) } Loading Loading @@ -398,6 +398,7 @@ sealed class DragToDesktopTransitionHandler( } } } state.surfaceLayers = layers state.startTransitionFinishCb = finishCallback state.startTransitionFinishTransaction = finishTransaction startTransaction.apply() Loading Loading @@ -522,6 +523,10 @@ sealed class DragToDesktopTransitionHandler( startTransaction.show(change.leash) finishTransaction.show(change.leash) state.draggedTaskChange = change // Restoring the dragged leash layer as it gets reset in the merge transition state.surfaceLayers?.let { startTransaction.setLayer(change.leash, it.dragLayer) } } change.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM -> { // Other freeform tasks that are being restored go behind the dragged task. Loading Loading @@ -647,8 +652,15 @@ sealed class DragToDesktopTransitionHandler( } } private fun isHomeChange(change: Change): Boolean { return change.taskInfo?.activityType == ACTIVITY_TYPE_HOME /** Checks if the change is a home task change */ @VisibleForTesting fun isHomeChange(change: Change): Boolean { return change.taskInfo?.let { it.activityType == ACTIVITY_TYPE_HOME && // Skip translucent wizard task with type home // TODO(b/368334295): Remove when the multiple home changes issue is resolved !(it.isTopActivityTransparent && it.numActivities == 1) } ?: false } private fun startCancelAnimation() { Loading Loading @@ -765,12 +777,18 @@ sealed class DragToDesktopTransitionHandler( /** * Represents the layering (Z order) that will be given to any window based on its type during * the "start" transition of the drag-to-desktop transition * the "start" transition of the drag-to-desktop transition. * * @param topAppLayer Used to calculate the app layer z-order = `topAppLayer - changeIndex`. * @param topHomeLayer Used to calculate the home layer z-order = `topHomeLayer - changeIndex`. * @param topWallpaperLayer Used to calculate the wallpaper layer z-order = `topWallpaperLayer - * changeIndex` * @param dragLayer Defines the drag layer z-order */ protected data class DragToDesktopLayers( val appLayers: Int, val homeLayers: Int, val wallpaperLayers: Int, data class DragToDesktopLayers( val topAppLayer: Int, val topHomeLayer: Int, val topWallpaperLayer: Int, val dragLayer: Int, ) Loading @@ -790,6 +808,7 @@ sealed class DragToDesktopTransitionHandler( abstract var homeChange: Change? abstract var draggedTaskChange: Change? abstract var freeformTaskChanges: List<Change> abstract var surfaceLayers: DragToDesktopLayers? abstract var cancelState: CancelState abstract var startAborted: Boolean Loading @@ -803,6 +822,7 @@ sealed class DragToDesktopTransitionHandler( override var homeChange: Change? = null, override var draggedTaskChange: Change? = null, override var freeformTaskChanges: List<Change> = emptyList(), override var surfaceLayers: DragToDesktopLayers? = null, override var cancelState: CancelState = CancelState.NO_CANCEL, override var startAborted: Boolean = false, var otherRootChanges: MutableList<Change> = mutableListOf() Loading @@ -818,6 +838,7 @@ sealed class DragToDesktopTransitionHandler( override var homeChange: Change? = null, override var draggedTaskChange: Change? = null, override var freeformTaskChanges: List<Change> = emptyList(), override var surfaceLayers: DragToDesktopLayers? = null, override var cancelState: CancelState = CancelState.NO_CANCEL, override var startAborted: Boolean = false, var splitRootChange: Change? = null, Loading Loading @@ -872,9 +893,9 @@ constructor( */ override fun calculateStartDragToDesktopLayers(info: TransitionInfo): DragToDesktopLayers = DragToDesktopLayers( appLayers = info.changes.size, homeLayers = info.changes.size * 2, wallpaperLayers = info.changes.size * 3, topAppLayer = info.changes.size, topHomeLayer = info.changes.size * 2, topWallpaperLayer = info.changes.size * 3, dragLayer = info.changes.size * 3 ) } Loading Loading @@ -914,9 +935,9 @@ constructor( */ override fun calculateStartDragToDesktopLayers(info: TransitionInfo): DragToDesktopLayers = DragToDesktopLayers( appLayers = -1, homeLayers = info.changes.size - 1, wallpaperLayers = info.changes.size * 2 - 1, topAppLayer = -1, topHomeLayer = info.changes.size - 1, topWallpaperLayer = info.changes.size * 2 - 1, dragLayer = info.changes.size * 2 ) Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java +14 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,8 @@ public final class TestRunningTaskInfoBuilder { private ActivityManager.TaskDescription.Builder mTaskDescriptionBuilder = null; private final Point mPositionInParent = new Point(); private boolean mIsVisible = false; private boolean mIsTopActivityTransparent = false; private int mNumActivities = 1; private long mLastActiveTime; public static WindowContainerToken createMockWCToken() { Loading Loading @@ -113,6 +115,16 @@ public final class TestRunningTaskInfoBuilder { return this; } public TestRunningTaskInfoBuilder setTopActivityTransparent(boolean isTopActivityTransparent) { mIsTopActivityTransparent = isTopActivityTransparent; return this; } public TestRunningTaskInfoBuilder setNumActivities(int numActivities) { mNumActivities = numActivities; return this; } public TestRunningTaskInfoBuilder setLastActiveTime(long lastActiveTime) { mLastActiveTime = lastActiveTime; return this; Loading @@ -134,6 +146,8 @@ public final class TestRunningTaskInfoBuilder { mTaskDescriptionBuilder != null ? mTaskDescriptionBuilder.build() : null; info.positionInParent = mPositionInParent; info.isVisible = mIsVisible; info.isTopActivityTransparent = mIsTopActivityTransparent; info.numActivities = mNumActivities; info.lastActiveTime = mLastActiveTime; return info; } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +59 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.wm.shell.windowdecor.MoveToDesktopAnimator import java.util.function.Supplier import junit.framework.Assert.assertEquals import junit.framework.Assert.assertFalse import junit.framework.Assert.assertTrue import org.junit.After import org.junit.Before import org.junit.Test Loading Loading @@ -211,6 +212,60 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { ) } @Test fun isHomeChange_withoutTaskInfo_returnsFalse() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = null } assertFalse(defaultHandler.isHomeChange(change)) assertFalse(springHandler.isHomeChange(change)) } @Test fun isHomeChange_withStandardActivityTaskInfo_returnsFalse() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_STANDARD).build() } assertFalse(defaultHandler.isHomeChange(change)) assertFalse(springHandler.isHomeChange(change)) } @Test fun isHomeChange_withHomeActivityTaskInfo_returnsTrue() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_HOME).build() } assertTrue(defaultHandler.isHomeChange(change)) assertTrue(springHandler.isHomeChange(change)) } @Test fun isHomeChange_withSingleTranslucentHomeActivityTaskInfo_returnsFalse() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder() .setActivityType(ACTIVITY_TYPE_HOME) .setTopActivityTransparent(true) .setNumActivities(1) .build() } assertFalse(defaultHandler.isHomeChange(change)) assertFalse(springHandler.isHomeChange(change)) } @Test fun cancelDragToDesktop_startWasReady_cancel() { startDrag(defaultHandler) Loading Loading @@ -343,6 +398,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { // Should show dragged task layer in start and finish transaction verify(mergedStartTransaction).show(draggedTaskLeash) verify(playingFinishTransaction).show(draggedTaskLeash) // Should update the dragged task layer verify(mergedStartTransaction).setLayer(eq(draggedTaskLeash), anyInt()) // Should merge animation verify(finishCallback).onTransitionFinished(null) } Loading Loading @@ -373,6 +430,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { // Should show dragged task layer in start and finish transaction verify(mergedStartTransaction).show(draggedTaskLeash) verify(playingFinishTransaction).show(draggedTaskLeash) // Should update the dragged task layer verify(mergedStartTransaction).setLayer(eq(draggedTaskLeash), anyInt()) // Should hide home task leash in finish transaction verify(playingFinishTransaction).hide(homeTaskLeash) // Should merge animation Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +38 −17 Original line number Diff line number Diff line Loading @@ -304,14 +304,14 @@ sealed class DragToDesktopTransitionHandler( val leafTaskFilter = TransitionUtil.LeafTaskFilter() info.changes.withIndex().forEach { (i, change) -> if (TransitionUtil.isWallpaper(change)) { val layer = layers.wallpaperLayers - i val layer = layers.topWallpaperLayer - i startTransaction.apply { setLayer(change.leash, layer) show(change.leash) } } else if (isHomeChange(change)) { state.homeChange = change val layer = layers.homeLayers - i val layer = layers.topHomeLayer - i startTransaction.apply { setLayer(change.leash, layer) show(change.leash) Loading @@ -325,7 +325,7 @@ sealed class DragToDesktopTransitionHandler( if (state.cancelState == CancelState.NO_CANCEL) { // Normal case, split root goes to the bottom behind everything // else. layers.appLayers - i layers.topAppLayer - i } else { // Cancel-early case, pretend nothing happened so split root stays // top. Loading Loading @@ -357,7 +357,7 @@ sealed class DragToDesktopTransitionHandler( state.otherRootChanges.add(change) val bounds = change.endAbsBounds startTransaction.apply { setLayer(change.leash, layers.appLayers - i) setLayer(change.leash, layers.topAppLayer - i) setWindowCrop(change.leash, bounds.width(), bounds.height()) show(change.leash) } Loading Loading @@ -398,6 +398,7 @@ sealed class DragToDesktopTransitionHandler( } } } state.surfaceLayers = layers state.startTransitionFinishCb = finishCallback state.startTransitionFinishTransaction = finishTransaction startTransaction.apply() Loading Loading @@ -522,6 +523,10 @@ sealed class DragToDesktopTransitionHandler( startTransaction.show(change.leash) finishTransaction.show(change.leash) state.draggedTaskChange = change // Restoring the dragged leash layer as it gets reset in the merge transition state.surfaceLayers?.let { startTransaction.setLayer(change.leash, it.dragLayer) } } change.taskInfo?.windowingMode == WINDOWING_MODE_FREEFORM -> { // Other freeform tasks that are being restored go behind the dragged task. Loading Loading @@ -647,8 +652,15 @@ sealed class DragToDesktopTransitionHandler( } } private fun isHomeChange(change: Change): Boolean { return change.taskInfo?.activityType == ACTIVITY_TYPE_HOME /** Checks if the change is a home task change */ @VisibleForTesting fun isHomeChange(change: Change): Boolean { return change.taskInfo?.let { it.activityType == ACTIVITY_TYPE_HOME && // Skip translucent wizard task with type home // TODO(b/368334295): Remove when the multiple home changes issue is resolved !(it.isTopActivityTransparent && it.numActivities == 1) } ?: false } private fun startCancelAnimation() { Loading Loading @@ -765,12 +777,18 @@ sealed class DragToDesktopTransitionHandler( /** * Represents the layering (Z order) that will be given to any window based on its type during * the "start" transition of the drag-to-desktop transition * the "start" transition of the drag-to-desktop transition. * * @param topAppLayer Used to calculate the app layer z-order = `topAppLayer - changeIndex`. * @param topHomeLayer Used to calculate the home layer z-order = `topHomeLayer - changeIndex`. * @param topWallpaperLayer Used to calculate the wallpaper layer z-order = `topWallpaperLayer - * changeIndex` * @param dragLayer Defines the drag layer z-order */ protected data class DragToDesktopLayers( val appLayers: Int, val homeLayers: Int, val wallpaperLayers: Int, data class DragToDesktopLayers( val topAppLayer: Int, val topHomeLayer: Int, val topWallpaperLayer: Int, val dragLayer: Int, ) Loading @@ -790,6 +808,7 @@ sealed class DragToDesktopTransitionHandler( abstract var homeChange: Change? abstract var draggedTaskChange: Change? abstract var freeformTaskChanges: List<Change> abstract var surfaceLayers: DragToDesktopLayers? abstract var cancelState: CancelState abstract var startAborted: Boolean Loading @@ -803,6 +822,7 @@ sealed class DragToDesktopTransitionHandler( override var homeChange: Change? = null, override var draggedTaskChange: Change? = null, override var freeformTaskChanges: List<Change> = emptyList(), override var surfaceLayers: DragToDesktopLayers? = null, override var cancelState: CancelState = CancelState.NO_CANCEL, override var startAborted: Boolean = false, var otherRootChanges: MutableList<Change> = mutableListOf() Loading @@ -818,6 +838,7 @@ sealed class DragToDesktopTransitionHandler( override var homeChange: Change? = null, override var draggedTaskChange: Change? = null, override var freeformTaskChanges: List<Change> = emptyList(), override var surfaceLayers: DragToDesktopLayers? = null, override var cancelState: CancelState = CancelState.NO_CANCEL, override var startAborted: Boolean = false, var splitRootChange: Change? = null, Loading Loading @@ -872,9 +893,9 @@ constructor( */ override fun calculateStartDragToDesktopLayers(info: TransitionInfo): DragToDesktopLayers = DragToDesktopLayers( appLayers = info.changes.size, homeLayers = info.changes.size * 2, wallpaperLayers = info.changes.size * 3, topAppLayer = info.changes.size, topHomeLayer = info.changes.size * 2, topWallpaperLayer = info.changes.size * 3, dragLayer = info.changes.size * 3 ) } Loading Loading @@ -914,9 +935,9 @@ constructor( */ override fun calculateStartDragToDesktopLayers(info: TransitionInfo): DragToDesktopLayers = DragToDesktopLayers( appLayers = -1, homeLayers = info.changes.size - 1, wallpaperLayers = info.changes.size * 2 - 1, topAppLayer = -1, topHomeLayer = info.changes.size - 1, topWallpaperLayer = info.changes.size * 2 - 1, dragLayer = info.changes.size * 2 ) Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java +14 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,8 @@ public final class TestRunningTaskInfoBuilder { private ActivityManager.TaskDescription.Builder mTaskDescriptionBuilder = null; private final Point mPositionInParent = new Point(); private boolean mIsVisible = false; private boolean mIsTopActivityTransparent = false; private int mNumActivities = 1; private long mLastActiveTime; public static WindowContainerToken createMockWCToken() { Loading Loading @@ -113,6 +115,16 @@ public final class TestRunningTaskInfoBuilder { return this; } public TestRunningTaskInfoBuilder setTopActivityTransparent(boolean isTopActivityTransparent) { mIsTopActivityTransparent = isTopActivityTransparent; return this; } public TestRunningTaskInfoBuilder setNumActivities(int numActivities) { mNumActivities = numActivities; return this; } public TestRunningTaskInfoBuilder setLastActiveTime(long lastActiveTime) { mLastActiveTime = lastActiveTime; return this; Loading @@ -134,6 +146,8 @@ public final class TestRunningTaskInfoBuilder { mTaskDescriptionBuilder != null ? mTaskDescriptionBuilder.build() : null; info.positionInParent = mPositionInParent; info.isVisible = mIsVisible; info.isTopActivityTransparent = mIsTopActivityTransparent; info.numActivities = mNumActivities; info.lastActiveTime = mLastActiveTime; return info; } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +59 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.wm.shell.windowdecor.MoveToDesktopAnimator import java.util.function.Supplier import junit.framework.Assert.assertEquals import junit.framework.Assert.assertFalse import junit.framework.Assert.assertTrue import org.junit.After import org.junit.Before import org.junit.Test Loading Loading @@ -211,6 +212,60 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { ) } @Test fun isHomeChange_withoutTaskInfo_returnsFalse() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = null } assertFalse(defaultHandler.isHomeChange(change)) assertFalse(springHandler.isHomeChange(change)) } @Test fun isHomeChange_withStandardActivityTaskInfo_returnsFalse() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_STANDARD).build() } assertFalse(defaultHandler.isHomeChange(change)) assertFalse(springHandler.isHomeChange(change)) } @Test fun isHomeChange_withHomeActivityTaskInfo_returnsTrue() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_HOME).build() } assertTrue(defaultHandler.isHomeChange(change)) assertTrue(springHandler.isHomeChange(change)) } @Test fun isHomeChange_withSingleTranslucentHomeActivityTaskInfo_returnsFalse() { val change = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder() .setActivityType(ACTIVITY_TYPE_HOME) .setTopActivityTransparent(true) .setNumActivities(1) .build() } assertFalse(defaultHandler.isHomeChange(change)) assertFalse(springHandler.isHomeChange(change)) } @Test fun cancelDragToDesktop_startWasReady_cancel() { startDrag(defaultHandler) Loading Loading @@ -343,6 +398,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { // Should show dragged task layer in start and finish transaction verify(mergedStartTransaction).show(draggedTaskLeash) verify(playingFinishTransaction).show(draggedTaskLeash) // Should update the dragged task layer verify(mergedStartTransaction).setLayer(eq(draggedTaskLeash), anyInt()) // Should merge animation verify(finishCallback).onTransitionFinished(null) } Loading Loading @@ -373,6 +430,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { // Should show dragged task layer in start and finish transaction verify(mergedStartTransaction).show(draggedTaskLeash) verify(playingFinishTransaction).show(draggedTaskLeash) // Should update the dragged task layer verify(mergedStartTransaction).setLayer(eq(draggedTaskLeash), anyInt()) // Should hide home task leash in finish transaction verify(playingFinishTransaction).hide(homeTaskLeash) // Should merge animation Loading