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

Commit 96bdac33 authored by Omar Elmekkawy's avatar Omar Elmekkawy Committed by Android (Google) Code Review
Browse files

Merge "Guarding against crashes for unexpected null leashes within tilig." into main

parents 17d3ab35 223f8445
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@ class DesktopTilingWindowDecoration(
        when (snapPosition) {
            SnapPosition.LEFT ->
                desktopUserRepositories.current.addLeftTiledTaskToDesk(displayId, taskId, deskId)

            SnapPosition.RIGHT ->
                desktopUserRepositories.current.addRightTiledTaskToDesk(displayId, taskId, deskId)
        }
@@ -225,10 +226,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) {
@@ -284,8 +301,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
    }
@@ -805,7 +821,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.
@@ -961,4 +976,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,