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

Commit 223f8445 authored by Omar Elmekkawy's avatar Omar Elmekkawy
Browse files

Guarding against crashes for unexpected null leashes within tilig.

Flag: com.android.window.flags.enable_tile_resizing
Test: on device testing
Bug: 441630218
Change-Id: Ia6893ef7c53f33ccb44719eb4fed2798bef7946b
parent d866dcbf
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -192,6 +192,7 @@ class DesktopTilingWindowDecoration(
        when (snapPosition) {
            SnapPosition.LEFT ->
                desktopUserRepositories.current.addLeftTiledTaskToDesk(displayId, taskId, deskId)

            SnapPosition.RIGHT ->
                desktopUserRepositories.current.addRightTiledTaskToDesk(displayId, taskId, deskId)
        }
@@ -223,10 +224,26 @@ class DesktopTilingWindowDecoration(
        }
    }

    private fun abandonTilingSession() {
        rightTaskResizingHelper?.taskInfo?.let {
            removeTaskIfTiled(taskId = it.taskId, taskVanished = true, shouldDelayUpdate = true)
        }
        leftTaskResizingHelper?.taskInfo?.let {
            removeTaskIfTiled(taskId = it.taskId, taskVanished = true, shouldDelayUpdate = true)
        }
    }

    private fun initTilingForDisplayIfNeeded(config: Configuration, firstTiledApp: Boolean) {
        if (leftTaskResizingHelper != null && rightTaskResizingHelper != null) {
            if (!isTilingManagerInitialised) {
                desktopTilingDividerWindowManager = initTilingManagerForDisplay(displayId, config)
                if (desktopTilingDividerWindowManager == null) {
                    logE(
                        "Could not initialise the tiling divider window manager, abandoning tiling session"
                    )
                    abandonTilingSession()
                    return
                }
                isTilingManagerInitialised = true

                if (DesktopExperienceFlags.ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS.isTrue) {
@@ -282,8 +299,7 @@ class DesktopTilingWindowDecoration(
                )
            }
        // a leash to present the divider on top of, without re-parenting.
        val relativeLeash =
            leftTaskResizingHelper?.windowDecoration?.taskSurface ?: return tilingManager
        val relativeLeash = leftTaskResizingHelper?.windowDecoration?.taskSurface ?: return null
        tilingManager?.generateViewHost(relativeLeash)
        return tilingManager
    }
@@ -801,7 +817,6 @@ class DesktopTilingWindowDecoration(
     */
    fun moveTiledPairToFront(taskId: Int, isFocusedOnDisplay: Boolean): Boolean {
        if (!isTilingManagerInitialised) return false

        if (!isFocusedOnDisplay) return false

        // If a task that isn't tiled is being focused, let the generic handler do the work.
@@ -957,4 +972,8 @@ class DesktopTilingWindowDecoration(
    private fun logV(msg: String, vararg arguments: Any?) {
        ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
    }

    private fun logE(msg: String, vararg arguments: Any?) {
        ProtoLog.e(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.view.WindowManager.TRANSIT_TO_FRONT
import android.window.TransitionInfo
import android.window.TransitionInfo.Change
import android.window.WindowContainerTransaction
import androidx.test.annotation.UiThreadTest
import androidx.test.filters.SmallTest
import com.android.internal.jank.InteractionJankMonitor
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
@@ -319,11 +320,13 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
    }

    @Test
    @UiThreadTest
    fun taskTiled_broughtToFront_alreadyInFrontStillReorder() {
        val task1 = createVisibleTask()
        val task2 = createVisibleTask()
        val stableBounds = STABLE_BOUNDS_MOCK
        whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout)
        whenever(displayController.getDisplayContext(any())).thenReturn(mContext)
        whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
            (i.arguments.first() as Rect).set(stableBounds)
        }
@@ -331,6 +334,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
        whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width)
        whenever(userRepositories.current.isVisibleTask(eq(task1.taskId))).thenReturn(true)
        whenever(userRepositories.current.isVisibleTask(eq(task2.taskId))).thenReturn(true)
        whenever(windowDecoration.taskSurface).thenReturn(mock())

        tilingDecoration.onAppTiled(
            task1,
@@ -362,11 +366,13 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
    }

    @Test
    @UiThreadTest
    fun taskTiled_broughtToFront_uponTilingFocusedTasks() {
        val task1 = createVisibleTask()
        val task2 = createVisibleTask()
        val stableBounds = STABLE_BOUNDS_MOCK
        whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout)
        whenever(displayController.getDisplayContext(any())).thenReturn(mContext)
        whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
            (i.arguments.first() as Rect).set(stableBounds)
        }
@@ -374,6 +380,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
        whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width)
        whenever(userRepositories.current.isVisibleTask(eq(task1.taskId))).thenReturn(true)
        whenever(userRepositories.current.isVisibleTask(eq(task2.taskId))).thenReturn(true)
        whenever(windowDecoration.taskSurface).thenReturn(mock())
        task1.isFocused = true
        task2.isFocused = true

@@ -399,6 +406,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
    }

    @Test
    @UiThreadTest
    fun taskTiled_broughtToFront_bringToFront() {
        val task1 = createVisibleTask()
        val task2 = createVisibleTask()
@@ -411,6 +419,8 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
        whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width)
        whenever(windowDecoration.taskSurface).thenReturn(surfaceControlMock)
        whenever(userRepositories.current.isVisibleTask(any())).thenReturn(true)
        whenever(displayController.getDisplayContext(any())).thenReturn(mContext)
        whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout)
        tilingDecoration.onAppTiled(
            task1,
            windowDecoration,
@@ -437,6 +447,7 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
    }

    @Test
    @UiThreadTest
    fun taskTiled_broughtToFront_taskInfoNotUpdated_bringToFront() {
        val task1 = createVisibleTask()
        val task2 = createVisibleTask()
@@ -449,6 +460,11 @@ class DesktopTilingWindowDecorationTest : ShellTestCase() {
        whenever(resources.getDimensionPixelSize(any())).thenReturn(split_divider_width)
        whenever(windowDecoration.taskSurface).thenReturn(surfaceControlMock)
        whenever(userRepositories.current.isVisibleTask(any())).thenReturn(true)
        whenever(displayController.getDisplayContext(any())).thenReturn(mContext)
        whenever(displayController.getDisplayLayout(any())).thenReturn(displayLayout)
        whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
            (i.arguments.first() as Rect).set(stableBounds)
        }
        tilingDecoration.onAppTiled(
            task1,
            windowDecoration,