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

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

Fix a crash where tiling is destroyed after a desk is removed from repo.

This cl ensures that tiling gets notified of desks being removed before
the desk gets destroyed, as this caused an interaction between the repo
and tiling to cause a crash.

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: 414809501
Change-Id: I7c5e5044dc6483ce955f2cbb613a11c361715bfe
parent 11fae1bc
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -684,6 +684,7 @@ class DesktopTasksController(
                                deskId = deskId,
                                tasks = emptySet(),
                                onDeskRemovedListener = onDeskRemovedListener,
                                runOnTransitEnd = { snapEventHandler.onDeskRemoved(deskId) },
                            )
                        )
                    } else {
@@ -731,6 +732,7 @@ class DesktopTasksController(
                            deskId = deskId,
                            tasks = emptySet(),
                            onDeskRemovedListener = onDeskRemovedListener,
                            runOnTransitEnd = { snapEventHandler.onDeskRemoved(deskId) },
                        )
                    )
                    desksTransitionObserver.addPendingTransition(
@@ -3895,6 +3897,7 @@ class DesktopTasksController(
                    deskId = deskId,
                    tasks = tasksToRemove,
                    onDeskRemovedListener = onDeskRemovedListener,
                    runOnTransitEnd = { snapEventHandler.onDeskRemoved(deskId) },
                )
            )
        }
+16 −0
Original line number Diff line number Diff line
@@ -33,6 +33,22 @@ sealed interface DeskTransition {
        val tasks: Set<Int>,
        val onDeskRemovedListener: OnDeskRemovedListener?,
    ) : DeskTransition {
        constructor(
            token: IBinder,
            displayId: Int,
            deskId: Int,
            tasks: Set<Int>,
            onDeskRemovedListener: OnDeskRemovedListener?,
            // TODO(b/415259520): Consolidate desk removed listeners and callback lambdas
            // after verifying that the call order before and after repository does not matter
            // for [DesktopDisplayEventHandler].
            runOnTransitEnd: (() -> Unit)?,
        ) : this(token, displayId, deskId, tasks, onDeskRemovedListener) {
            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
@@ -101,6 +101,7 @@ class DesksTransitionObserver(
                //  visible, such as when dismissing from Overview.
                val deskId = deskTransition.deskId
                val displayId = deskTransition.displayId
                deskTransition.runOnTransitEnd?.invoke()
                desktopRepository.removeDesk(deskTransition.deskId)
                deskTransition.onDeskRemovedListener?.onDeskRemoved(displayId, deskId)
            }
+5 −0
Original line number Diff line number Diff line
@@ -1039,6 +1039,11 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel,
                desktopModeSupportedOnNewDisplay);
    }

    @Override
    public void onDeskRemoved(int deskId) {
        mDesktopTilingDecorViewModel.onDeskRemoved(deskId);
    }

    private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener
            implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener,
            View.OnGenericMotionListener, DragDetector.MotionEventHandler {
+6 −0
Original line number Diff line number Diff line
@@ -287,6 +287,12 @@ class DesktopTilingDecorViewModel(
    /** Removes [deskId] from the previously deactivated desks to mark it's activation. */
    fun onDeskActivated(deskId: Int): Boolean = disconnectedDisplayDesks.remove(deskId)

    /** Destroys a tiling session for a removed desk. */
    fun onDeskRemoved(deskId: Int) {
        tilingHandlerByUserAndDeskId[currentUserId]?.get(deskId)?.resetTilingSession()
        tilingHandlerByUserAndDeskId[currentUserId]?.remove(deskId)
    }

    fun getCurrentActiveDeskForDisplay(displayId: Int): Int? =
        desktopUserRepositories.current.getActiveDeskId(displayId)

Loading