Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +14 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ class DesktopRepository( /** Specific [TaskInfo] data related to top transparent fullscreen task handling. */ data class TopTransparentFullscreenTaskData(val taskId: Int, val token: WindowContainerToken) /** Tiling data preserved after a display got disconnected. */ data class PreservedTiledAppData(val leftTiledTask: Int?, val rightTiledTask: Int?) /** * Task data tracked per desk. * Loading Loading @@ -228,6 +231,17 @@ class DesktopRepository( fun getPreservedActiveDesk(uniqueDisplayId: String): Int? = preservedDisplaysByUniqueId[uniqueDisplayId]?.activeDeskId /** Returns a preserved desk data post a display reconnect event. */ fun getPreservedTilingData( uniqueDisplayId: String, preservedDeskId: Int?, ): PreservedTiledAppData? = preservedDisplaysByUniqueId[uniqueDisplayId] ?.orderedDesks ?.firstOrNull { desk -> desk.deskId == preservedDeskId } ?.let { PreservedTiledAppData(it.leftTiledTaskId, it.rightTiledTaskId) } ?.takeIf { it.leftTiledTask != null || it.rightTiledTask != null } /** * Checks if the provided task is minimized on the preserved display with the provided * uniqueDisplayId. Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +25 −4 Original line number Diff line number Diff line Loading @@ -173,6 +173,7 @@ import com.android.wm.shell.windowdecor.extension.isFullscreen import com.android.wm.shell.windowdecor.extension.isMultiWindow import com.android.wm.shell.windowdecor.extension.requestingImmersive import com.android.wm.shell.windowdecor.tiling.SnapEventHandler import com.android.wm.shell.windowdecor.tiling.TilingDisplayReconnectEventHandler import java.io.PrintWriter import java.util.Optional import java.util.concurrent.Executor Loading Loading @@ -711,7 +712,7 @@ class DesktopTasksController( "destinationDisplayId=$destinationDisplayId" ) } snapEventHandler.onDisplayDisconnected(disconnectedDisplayId, desktopModeSupportedOnDisplay) snapEventHandler.onDisplayDisconnected(disconnectedDisplayId) removeWallpaperTask(wct, disconnectedDisplayId) removeHomeTask(wct, disconnectedDisplayId) userRepositories.forAllRepositories { desktopRepository -> Loading Loading @@ -823,7 +824,13 @@ class DesktopTasksController( val wct = WindowContainerTransaction() var runOnTransitStart: RunOnTransitStart? = null val destDisplayLayout = displayController.getDisplayLayout(displayId) ?: return val tilingReconnectHandler = TilingDisplayReconnectEventHandler( taskRepository, snapEventHandler, transitions, displayId, ) mainScope.launch { preservedTaskIdsByDeskId.forEach { (preservedDeskId, preservedTaskIds) -> val newDeskId = Loading @@ -836,8 +843,8 @@ class DesktopTasksController( "restoreDisplay: created new desk deskId=$newDeskId " + "from preserved deskId=$preservedDeskId" ) if (preservedDeskId == activeDeskId) { val isActiveDesk = preservedDeskId == activeDeskId if (isActiveDesk) { runOnTransitStart = addDeskActivationChanges(deskId = newDeskId, wct = wct) } Loading @@ -851,8 +858,22 @@ class DesktopTasksController( boundsByTaskId[taskId], ) } val preservedTilingData = taskRepository.getPreservedTilingData(uniqueDisplayId, preservedDeskId) if (preservedTilingData != null) { tilingReconnectHandler.addTilingDisplayReconnectSession( TilingDisplayReconnectEventHandler.TilingDisplayReconnectSession( preservedTilingData.leftTiledTask, preservedTilingData.rightTiledTask, newDeskId, isActiveDesk, ) ) } } val transition = transitions.startTransition(TRANSIT_CHANGE, wct, null) tilingReconnectHandler.activationBinder = transition runOnTransitStart?.invoke(transition) taskRepository.removePreservedDisplay(uniqueDisplayId) } Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +2 −5 Original line number Diff line number Diff line Loading @@ -966,7 +966,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, if (!mDesktopTilingDecorViewModel.onDeskActivated(deskId)) { return; } final DesktopRepository repository = mDesktopUserRepositories.getCurrent(); final Integer leftTaskId = repository.getLeftTiledTask(deskId); final Integer rightTaskId = repository.getRightTiledTask(deskId); Loading Loading @@ -1023,10 +1022,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, } @Override public void onDisplayDisconnected(int disconnectedDisplayId, boolean desktopModeSupportedOnNewDisplay) { mDesktopTilingDecorViewModel.onDisplayDisconnected(disconnectedDisplayId, desktopModeSupportedOnNewDisplay); public void onDisplayDisconnected(int disconnectedDisplayId) { mDesktopTilingDecorViewModel.onDisplayDisconnected(disconnectedDisplayId); } @Override Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt +5 −7 Original line number Diff line number Diff line Loading @@ -187,23 +187,20 @@ class DesktopTilingDecorViewModel( */ fun onDisplayDisconnected( disconnectedDisplayId: Int, desktopModeSupportedOnNewDisplay: Boolean, ) { if (!desktopModeSupportedOnNewDisplay) { resetAllDesksWithDisplayId(disconnectedDisplayId) return } // Reset the tiling session but keep the persistence data for when the moved desks // are activated again. for (userHandlerList in tilingHandlerByUserAndDeskId.valueIterator()) { val desksToRemove = ArrayList<Int>() for (desk in userHandlerList.keyIterator()) { val handler = userHandlerList[desk] if (disconnectedDisplayId == handler.displayId) { handler.resetTilingSession(shouldPersistTilingData = true) userHandlerList.remove(desk) desksToRemove.add(desk) disconnectedDisplayDesks.add(desk) } } desksToRemove.forEach { desk -> userHandlerList.remove(desk) } } } Loading Loading @@ -280,7 +277,8 @@ class DesktopTilingDecorViewModel( } /** Removes [deskId] from the previously deactivated desks to mark it's activation. */ fun onDeskActivated(deskId: Int): Boolean = disconnectedDisplayDesks.remove(deskId) fun onDeskActivated(deskId: Int): Boolean = disconnectedDisplayDesks.remove(deskId) || !tilingHandlerByUserAndDeskId.contains(deskId) /** Destroys a tiling session for a removed desk. */ fun onDeskRemoved(deskId: Int) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/SnapEventHandler.kt +1 −5 Original line number Diff line number Diff line Loading @@ -67,12 +67,8 @@ interface SnapEventHandler { /** * Notifies the snap event handler of a display disconnect event. * * [desktopModeSupportedOnNewDisplay] is a boolean that indicates whether a display supports * desktop mode after the external display disconnection, for example a tablet or a secondary * display. */ fun onDisplayDisconnected(disconnectedDisplayId: Int, desktopModeSupportedOnNewDisplay: Boolean) fun onDisplayDisconnected(disconnectedDisplayId: Int) /** * Notifies the snap event handler of a desk being activated. Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +14 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ class DesktopRepository( /** Specific [TaskInfo] data related to top transparent fullscreen task handling. */ data class TopTransparentFullscreenTaskData(val taskId: Int, val token: WindowContainerToken) /** Tiling data preserved after a display got disconnected. */ data class PreservedTiledAppData(val leftTiledTask: Int?, val rightTiledTask: Int?) /** * Task data tracked per desk. * Loading Loading @@ -228,6 +231,17 @@ class DesktopRepository( fun getPreservedActiveDesk(uniqueDisplayId: String): Int? = preservedDisplaysByUniqueId[uniqueDisplayId]?.activeDeskId /** Returns a preserved desk data post a display reconnect event. */ fun getPreservedTilingData( uniqueDisplayId: String, preservedDeskId: Int?, ): PreservedTiledAppData? = preservedDisplaysByUniqueId[uniqueDisplayId] ?.orderedDesks ?.firstOrNull { desk -> desk.deskId == preservedDeskId } ?.let { PreservedTiledAppData(it.leftTiledTaskId, it.rightTiledTaskId) } ?.takeIf { it.leftTiledTask != null || it.rightTiledTask != null } /** * Checks if the provided task is minimized on the preserved display with the provided * uniqueDisplayId. Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +25 −4 Original line number Diff line number Diff line Loading @@ -173,6 +173,7 @@ import com.android.wm.shell.windowdecor.extension.isFullscreen import com.android.wm.shell.windowdecor.extension.isMultiWindow import com.android.wm.shell.windowdecor.extension.requestingImmersive import com.android.wm.shell.windowdecor.tiling.SnapEventHandler import com.android.wm.shell.windowdecor.tiling.TilingDisplayReconnectEventHandler import java.io.PrintWriter import java.util.Optional import java.util.concurrent.Executor Loading Loading @@ -711,7 +712,7 @@ class DesktopTasksController( "destinationDisplayId=$destinationDisplayId" ) } snapEventHandler.onDisplayDisconnected(disconnectedDisplayId, desktopModeSupportedOnDisplay) snapEventHandler.onDisplayDisconnected(disconnectedDisplayId) removeWallpaperTask(wct, disconnectedDisplayId) removeHomeTask(wct, disconnectedDisplayId) userRepositories.forAllRepositories { desktopRepository -> Loading Loading @@ -823,7 +824,13 @@ class DesktopTasksController( val wct = WindowContainerTransaction() var runOnTransitStart: RunOnTransitStart? = null val destDisplayLayout = displayController.getDisplayLayout(displayId) ?: return val tilingReconnectHandler = TilingDisplayReconnectEventHandler( taskRepository, snapEventHandler, transitions, displayId, ) mainScope.launch { preservedTaskIdsByDeskId.forEach { (preservedDeskId, preservedTaskIds) -> val newDeskId = Loading @@ -836,8 +843,8 @@ class DesktopTasksController( "restoreDisplay: created new desk deskId=$newDeskId " + "from preserved deskId=$preservedDeskId" ) if (preservedDeskId == activeDeskId) { val isActiveDesk = preservedDeskId == activeDeskId if (isActiveDesk) { runOnTransitStart = addDeskActivationChanges(deskId = newDeskId, wct = wct) } Loading @@ -851,8 +858,22 @@ class DesktopTasksController( boundsByTaskId[taskId], ) } val preservedTilingData = taskRepository.getPreservedTilingData(uniqueDisplayId, preservedDeskId) if (preservedTilingData != null) { tilingReconnectHandler.addTilingDisplayReconnectSession( TilingDisplayReconnectEventHandler.TilingDisplayReconnectSession( preservedTilingData.leftTiledTask, preservedTilingData.rightTiledTask, newDeskId, isActiveDesk, ) ) } } val transition = transitions.startTransition(TRANSIT_CHANGE, wct, null) tilingReconnectHandler.activationBinder = transition runOnTransitStart?.invoke(transition) taskRepository.removePreservedDisplay(uniqueDisplayId) } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +2 −5 Original line number Diff line number Diff line Loading @@ -966,7 +966,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, if (!mDesktopTilingDecorViewModel.onDeskActivated(deskId)) { return; } final DesktopRepository repository = mDesktopUserRepositories.getCurrent(); final Integer leftTaskId = repository.getLeftTiledTask(deskId); final Integer rightTaskId = repository.getRightTiledTask(deskId); Loading Loading @@ -1023,10 +1022,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, } @Override public void onDisplayDisconnected(int disconnectedDisplayId, boolean desktopModeSupportedOnNewDisplay) { mDesktopTilingDecorViewModel.onDisplayDisconnected(disconnectedDisplayId, desktopModeSupportedOnNewDisplay); public void onDisplayDisconnected(int disconnectedDisplayId) { mDesktopTilingDecorViewModel.onDisplayDisconnected(disconnectedDisplayId); } @Override Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/DesktopTilingDecorViewModel.kt +5 −7 Original line number Diff line number Diff line Loading @@ -187,23 +187,20 @@ class DesktopTilingDecorViewModel( */ fun onDisplayDisconnected( disconnectedDisplayId: Int, desktopModeSupportedOnNewDisplay: Boolean, ) { if (!desktopModeSupportedOnNewDisplay) { resetAllDesksWithDisplayId(disconnectedDisplayId) return } // Reset the tiling session but keep the persistence data for when the moved desks // are activated again. for (userHandlerList in tilingHandlerByUserAndDeskId.valueIterator()) { val desksToRemove = ArrayList<Int>() for (desk in userHandlerList.keyIterator()) { val handler = userHandlerList[desk] if (disconnectedDisplayId == handler.displayId) { handler.resetTilingSession(shouldPersistTilingData = true) userHandlerList.remove(desk) desksToRemove.add(desk) disconnectedDisplayDesks.add(desk) } } desksToRemove.forEach { desk -> userHandlerList.remove(desk) } } } Loading Loading @@ -280,7 +277,8 @@ class DesktopTilingDecorViewModel( } /** Removes [deskId] from the previously deactivated desks to mark it's activation. */ fun onDeskActivated(deskId: Int): Boolean = disconnectedDisplayDesks.remove(deskId) fun onDeskActivated(deskId: Int): Boolean = disconnectedDisplayDesks.remove(deskId) || !tilingHandlerByUserAndDeskId.contains(deskId) /** Destroys a tiling session for a removed desk. */ fun onDeskRemoved(deskId: Int) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/SnapEventHandler.kt +1 −5 Original line number Diff line number Diff line Loading @@ -67,12 +67,8 @@ interface SnapEventHandler { /** * Notifies the snap event handler of a display disconnect event. * * [desktopModeSupportedOnNewDisplay] is a boolean that indicates whether a display supports * desktop mode after the external display disconnection, for example a tablet or a secondary * display. */ fun onDisplayDisconnected(disconnectedDisplayId: Int, desktopModeSupportedOnNewDisplay: Boolean) fun onDisplayDisconnected(disconnectedDisplayId: Int) /** * Notifies the snap event handler of a desk being activated. Loading