Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2727ce3 authored by Omar Elmekkawy's avatar Omar Elmekkawy
Browse files

Add multi-desk support for tiling.

This cl adds multi desk support for tiling, by swapping the displayId key
within the tilingViewModel with the deskId concept.

the CL also tracks desks that are being hidden and hides the divider, and
tracks when a task is removed from a desk to remove it from the tiling
session.

Flag: com.android.window.flags.enable_tile_resizing
Flag: com.android.window.flags.enable_multiple_desktops_backend
Test: unit tests and on device testing
Bug: 411433308
Change-Id: I15dd185a5c43ba226d6022a76bf058a2b8f17e8c
parent 923cd35c
Loading
Loading
Loading
Loading
+26 −56
Original line number Diff line number Diff line
@@ -339,91 +339,61 @@ class DesktopRepository(
        }
    }

    /** Register a left tiled task to desktop state. */
    fun addLeftTiledTask(displayId: Int, taskId: Int) {
        logD("addLeftTiledTask for displayId=%d, taskId=%d", displayId, taskId)
        val activeDesk =
            checkNotNull(desktopData.getDefaultDesk(displayId)) {
                "Expected desk in display: $displayId"
            }
        addLeftTiledTaskToDesk(displayId, taskId, activeDesk.deskId)
    }

    private fun addLeftTiledTaskToDesk(displayId: Int, taskId: Int, deskId: Int) {
        logD("addLeftTiledTaskToDesk for displayId=%d, taskId=%d", displayId, taskId)
    fun addLeftTiledTaskToDesk(displayId: Int, taskId: Int, deskId: Int) {
        logD(
            "addLeftTiledTaskToDesk for displayId=%d, taskId=%d, deskId=%d",
            displayId,
            taskId,
            deskId,
        )
        val desk = checkNotNull(desktopData.getDesk(deskId)) { "Did not find desk: $deskId" }
        desk.leftTiledTaskId = taskId
        if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_PERSISTENCE.isTrue()) {
            updatePersistentRepository(displayId)
        }
    }

    /** Register a right tiled task to desktop state. */
    fun addRightTiledTask(displayId: Int, taskId: Int) {
        logD("addRightTiledTask for displayId=%d, taskId=%d", displayId, taskId)
        val activeDesk =
            checkNotNull(desktopData.getDefaultDesk(displayId)) {
                "Expected desk in display: $displayId"
            updatePersistentRepositoryForDesk(deskId)
        }
        addRightTiledTaskToDesk(displayId, taskId, activeDesk.deskId)
    }

    private fun addRightTiledTaskToDesk(displayId: Int, taskId: Int, deskId: Int) {
        logD("addRightTiledTaskToDesk for displayId=%d, taskId=%d", displayId, taskId)
    fun addRightTiledTaskToDesk(displayId: Int, taskId: Int, deskId: Int) {
        logD(
            "addRightTiledTaskToDesk for displayId=%d, taskId=%d, deskId=%d",
            displayId,
            taskId,
            deskId,
        )
        val desk = checkNotNull(desktopData.getDesk(deskId)) { "Did not find desk: $deskId" }
        desk.rightTiledTaskId = taskId
        if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_PERSISTENCE.isTrue()) {
            updatePersistentRepository(displayId)
            updatePersistentRepositoryForDesk(deskId)
        }
    }

    /** Gets a registered left tiled task to desktop state or returns null. */
    fun getLeftTiledTask(displayId: Int): Int? {
        logD("getLeftTiledTask for displayId=%d", displayId)
        return desktopData.getActiveDesk(displayId)?.leftTiledTaskId
    fun getLeftTiledTask(deskId: Int): Int? {
        logD("getLeftTiledTask for deskId=%d", deskId)
        return desktopData.getDesk(deskId)?.leftTiledTaskId
    }

    /** gets a registered right tiled task to desktop state or returns null. */
    fun getRightTiledTask(displayId: Int): Int? {
        logD("getRightTiledTask for displayId=%d", displayId)
        return desktopData.getActiveDesk(displayId)?.rightTiledTaskId
    }

    /* Unregisters a left tiled task from desktop state. */
    fun removeLeftTiledTask(displayId: Int) {
        logD("removeLeftTiledTask for displayId=%d", displayId)
        val activeDesk =
            checkNotNull(desktopData.getDefaultDesk(displayId)) {
                "Expected desk in display: $displayId"
            }
        removeLeftTiledTaskFromDesk(displayId, activeDesk.deskId)
    fun getRightTiledTask(deskId: Int): Int? {
        logD("getRightTiledTask for deskId=%d", deskId)
        return desktopData.getDesk(deskId)?.rightTiledTaskId
    }

    private fun removeLeftTiledTaskFromDesk(displayId: Int, deskId: Int) {
    fun removeLeftTiledTaskFromDesk(displayId: Int, deskId: Int) {
        logD("removeLeftTiledTaskToDesk for displayId=%d", displayId)
        val desk = checkNotNull(desktopData.getDesk(deskId)) { "Did not find desk: $deskId" }
        desk.leftTiledTaskId = null
        if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_PERSISTENCE.isTrue()) {
            updatePersistentRepository(displayId)
        }
    }

    /* Unregisters a right tiled task from desktop state. */
    fun removeRightTiledTask(displayId: Int) {
        logD("removeRightTiledTask for displayId=%d", displayId)
        val activeDesk =
            checkNotNull(desktopData.getDefaultDesk(displayId)) {
                "Expected desk in display: $displayId"
            updatePersistentRepositoryForDesk(deskId)
        }
        removeRightTiledTaskFromDesk(displayId, activeDesk.deskId)
    }

    private fun removeRightTiledTaskFromDesk(displayId: Int, deskId: Int) {
    fun removeRightTiledTaskFromDesk(displayId: Int, deskId: Int) {
        logD("removeRightTiledTaskFromDesk for displayId=%d", displayId)
        val desk = checkNotNull(desktopData.getDesk(deskId)) { "Did not find desk: $deskId" }
        desk.rightTiledTaskId = null
        if (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_PERSISTENCE.isTrue()) {
            updatePersistentRepository(displayId)
            updatePersistentRepositoryForDesk(deskId)
        }
    }

+5 −1
Original line number Diff line number Diff line
@@ -3770,7 +3770,11 @@ class DesktopTasksController(
        desksOrganizer.deactivateDesk(wct, deskId)
        return { transition ->
            desksTransitionObserver.addPendingTransition(
                DeskTransition.DeactivateDesk(token = transition, deskId = deskId)
                DeskTransition.DeactivateDesk(
                    token = transition,
                    deskId = deskId,
                    runOnTransitEnd = { snapEventHandler.onDeskDeactivated(deskId) },
                )
            )
        }
    }
+9 −1
Original line number Diff line number Diff line
@@ -53,7 +53,15 @@ sealed interface DeskTransition {
    }

    /** A transition to deactivate a desk. */
    data class DeactivateDesk(override val token: IBinder, val deskId: Int) : DeskTransition {
    data class DeactivateDesk(
        override val token: IBinder,
        val deskId: Int,
    ) : DeskTransition {
        constructor(token: IBinder, deskId: Int, runOnTransitEnd: (() -> Unit)?)
                : this(token, deskId) {
            this.runOnTransitEnd = runOnTransitEnd
        }
        var runOnTransitEnd: (() -> Unit)? = null
        override fun copyWithToken(token: IBinder): DeskTransition = copy(token)
    }

+1 −0
Original line number Diff line number Diff line
@@ -172,6 +172,7 @@ class DesksTransitionObserver(
        val desktopRepository = desktopUserRepositories.current
        var deskChangeFound = false

        deskTransition.runOnTransitEnd?.invoke()
        val changes = info?.changes ?: emptyList()
        for (change in changes) {
            val isDeskChange = desksOrganizer.isDeskChange(change, deskTransition.deskId)
+14 −5
Original line number Diff line number Diff line
@@ -140,17 +140,26 @@ class DesktopRepositoryInitializerImpl(
                                    )
                                }

                                if (task.desktopTaskTilingState == DesktopTaskTilingState.LEFT) {
                                    repository.addLeftTiledTask(
                                val tilingEnabled =
                                    DesktopExperienceFlags.ENABLE_TILE_RESIZING.isTrue()
                                if (
                                    tilingEnabled &&
                                        task.desktopTaskTilingState == DesktopTaskTilingState.LEFT
                                ) {
                                    repository.addLeftTiledTaskToDesk(
                                        persistentDesktop.displayId,
                                        task.taskId,
                                        newDeskId,
                                    )
                                } else if (
                                }
                                if (
                                    tilingEnabled &&
                                        task.desktopTaskTilingState == DesktopTaskTilingState.RIGHT
                                ) {
                                    repository.addRightTiledTask(
                                    repository.addRightTiledTaskToDesk(
                                        persistentDesktop.displayId,
                                        task.taskId,
                                        newDeskId,
                                    )
                                }
                            }
Loading