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

Commit 0d4967fe authored by mattsziklay's avatar mattsziklay Committed by Matt Sziklay
Browse files

Fixes for mirror-disconnect transition.

Removes the unnecessary transition check for ChangeDeskDisplay
transitions as these prevented Shell-started disconnects from being
handled.

Removes independent handling of desk activations on displays with pending ChangeDeskDisplay transitions on that display, in favor of letting the repository handle activations when that transition is processed instead.

Additionally, dedupes the canCreateDesksChanged check in DesktopRepository.

Bug: 431119389
Test: Manual
Flag: com.android.window.flags.enable_display_disconnect_interaction
Change-Id: I86cc479ca2dbe3648bcee182efd3d865e587ce29
parent b65abf84
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -278,15 +278,19 @@ class DesktopRepository(


    /** Update the data to reflect a desk changing displays. */
    /** Update the data to reflect a desk changing displays. */
    fun onDeskDisplayChanged(deskId: Int, newDisplayId: Int, newUniqueDisplayId: String?) {
    fun onDeskDisplayChanged(deskId: Int, newDisplayId: Int, newUniqueDisplayId: String?) {
        logD(
            "onDeskDisplayChanged for deskId=%d, newDisplayId=%d, and newUniqueDisplayId=%s",
            deskId,
            newDisplayId,
            newUniqueDisplayId,
        )
        val couldCreateDesk = canCreateDesks()
        val couldCreateDesk = canCreateDesks()
        val desk =
        val desk =
            desktopData.getDesk(deskId)?.deepCopy()
            desktopData.getDesk(deskId)?.deepCopy()
                ?: error("Expected to find desk with id: $deskId")
                ?: error("Expected to find desk with id: $deskId")
        desk.displayId = newDisplayId
        desk.displayId = newDisplayId
        desk.uniqueDisplayId = newUniqueDisplayId
        desk.uniqueDisplayId = newUniqueDisplayId
        // TODO: b/412484513 - consider de-duping unnecessary updates to listeners, such as the one
        removeDesk(deskId = deskId, checkCanCreateDesksChanged = false)
        //  made here by |removeDesk| that will be reverted at the end of this method.
        removeDesk(deskId)
        desktopData.addDesk(newDisplayId, desk)
        desktopData.addDesk(newDisplayId, desk)
        val canCreateDesk = canCreateDesks()
        val canCreateDesk = canCreateDesks()
        deskChangeListeners.forEach { (listener, executor) ->
        deskChangeListeners.forEach { (listener, executor) ->
@@ -1084,7 +1088,7 @@ class DesktopRepository(
    }
    }


    /** Removes the given desk and returns the active tasks in that desk. */
    /** Removes the given desk and returns the active tasks in that desk. */
    fun removeDesk(deskId: Int): Set<Int> {
    fun removeDesk(deskId: Int, checkCanCreateDesksChanged: Boolean = true): Set<Int> {
        logD("removeDesk %d", deskId)
        logD("removeDesk %d", deskId)
        val couldCreateDesks = canCreateDesks()
        val couldCreateDesks = canCreateDesks()
        val desk =
        val desk =
@@ -1107,7 +1111,7 @@ class DesktopRepository(
                    )
                    )
                }
                }
                listener.onDeskRemoved(displayId = desk.displayId, deskId = desk.deskId)
                listener.onDeskRemoved(displayId = desk.displayId, deskId = desk.deskId)
                if (couldCreateDesks != canCreateDesks) {
                if (checkCanCreateDesksChanged && couldCreateDesks != canCreateDesks) {
                    listener.onCanCreateDesksChanged(canCreateDesks)
                    listener.onCanCreateDesksChanged(canCreateDesks)
                }
                }
            }
            }
+22 −14
Original line number Original line Diff line number Diff line
@@ -197,7 +197,7 @@ class DesksTransitionObserver(
                deskTransition.runOnTransitEnd?.invoke()
                deskTransition.runOnTransitEnd?.invoke()
            }
            }
            is DeskTransition.DeactivateDesk -> handleDeactivateDeskTransition(info, deskTransition)
            is DeskTransition.DeactivateDesk -> handleDeactivateDeskTransition(info, deskTransition)
            is DeskTransition.ChangeDeskDisplay -> handleChangeDeskDisplay(info, deskTransition)
            is DeskTransition.ChangeDeskDisplay -> handleChangeDeskDisplay(deskTransition)
            is DeskTransition.RemoveDisplay -> handleRemoveDisplay(deskTransition)
            is DeskTransition.RemoveDisplay -> handleRemoveDisplay(deskTransition)
            is DeskTransition.AddTaskToDesk -> handleAddTaskToDesk(deskTransition)
            is DeskTransition.AddTaskToDesk -> handleAddTaskToDesk(deskTransition)
        }
        }
@@ -234,14 +234,9 @@ class DesksTransitionObserver(
        desktopRepository.setDeskInactive(deskId = deskTransition.deskId)
        desktopRepository.setDeskInactive(deskId = deskTransition.deskId)
    }
    }


    private fun handleChangeDeskDisplay(
    private fun handleChangeDeskDisplay(deskTransition: DeskTransition.ChangeDeskDisplay) {
        info: TransitionInfo,
        deskTransition: DeskTransition.ChangeDeskDisplay,
    ) {
        logD("handleChangeDeskDisplay: %s", deskTransition)
        logD("handleChangeDeskDisplay: %s", deskTransition)
        val deskId = deskTransition.deskId
        val deskId = deskTransition.deskId
        val deskChange = info.changes.find { change -> desksOrganizer.isDeskChange(change, deskId) }
        if (deskChange != null) {
        desktopUserRepositories.getRepositoriesWithDeskId(deskId).forEach { desktopRepository ->
        desktopUserRepositories.getRepositoriesWithDeskId(deskId).forEach { desktopRepository ->
            desktopRepository.onDeskDisplayChanged(
            desktopRepository.onDeskDisplayChanged(
                deskId,
                deskId,
@@ -250,7 +245,6 @@ class DesksTransitionObserver(
            )
            )
        }
        }
    }
    }
    }


    private fun handleRemoveDisplay(deskTransition: DeskTransition.RemoveDisplay) {
    private fun handleRemoveDisplay(deskTransition: DeskTransition.RemoveDisplay) {
        logD("handleRemoveDisplay: %s", deskTransition)
        logD("handleRemoveDisplay: %s", deskTransition)
@@ -498,6 +492,20 @@ class DesksTransitionObserver(
                    }
                    }
                }
                }
                change.isToTop() -> {
                change.isToTop() -> {
                    // Do not handle independent desk activations when a desk is pending a move to
                    // this display. The activation will be handled when that transition is
                    // processed.
                    if (
                        deskTransitions.values.any { transitionsForBinder ->
                            transitionsForBinder.any { transition ->
                                transition is DeskTransition.ChangeDeskDisplay &&
                                    transition.displayId == displayId
                            }
                        }
                    ) {
                        logD("Pending display change found; skipping.")
                        continue
                    }
                    val repository = desktopUserRepositories.getProfile(changeUserId)
                    val repository = desktopUserRepositories.getProfile(changeUserId)
                    logD(
                    logD(
                        "desk=%d of user=%d moved to front, " +
                        "desk=%d of user=%d moved to front, " +