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

Commit 97b26ae6 authored by Ivan Tkachenko's avatar Ivan Tkachenko
Browse files

Fix RemoteTargetGluer crash

- Updated DesktopVisibilityController to track the numer of visible
  freeform windows, and use it to initialize RemoteTargetGluer.
- Updated IDesktopTaskListener to observe visible freeform windows count
- Added resize remoteTargetHandles logic in RemoteTargetGLuer to update
  handles size with targets.apps.size on assign.
- This is a workaround and should be removed when RemoteTargetGLuer
  intialisation logic is refactored.

Bug: 288121021
Flag: None
Test: atest DesktopModeTaskRepositoryTest DesktopTasksControllerTest
Change-Id: Ibcb12ef4c1a46f92d6a15e01e45ffcf2d53c6fa0
parent b363ed1d
Loading
Loading
Loading
Loading
+11 −13
Original line number Diff line number Diff line
@@ -86,10 +86,10 @@ class DesktopModeTaskRepository {
    ) {
        visibleTasksListeners[visibleTasksListener] = executor
        displayData.keyIterator().forEach { displayId ->
            val visibleTasks = getVisibleTaskCount(displayId)
            val visibleTasksCount = getVisibleTaskCount(displayId)
            val stashed = isStashed(displayId)
            executor.execute {
                visibleTasksListener.onVisibilityChanged(displayId, visibleTasks > 0)
                visibleTasksListener.onTasksVisibilityChanged(displayId, visibleTasksCount)
                visibleTasksListener.onStashedChanged(displayId, stashed)
            }
        }
@@ -222,10 +222,8 @@ class DesktopModeTaskRepository {
            val otherDisplays = displayData.keyIterator().asSequence().filter { it != displayId }
            for (otherDisplayId in otherDisplays) {
                if (displayData[otherDisplayId].visibleTasks.remove(taskId)) {
                    // Task removed from other display, check if we should notify listeners
                    if (displayData[otherDisplayId].visibleTasks.isEmpty()) {
                        notifyVisibleTaskListeners(otherDisplayId, hasVisibleFreeformTasks = false)
                    }
                    notifyVisibleTaskListeners(otherDisplayId,
                        displayData[otherDisplayId].visibleTasks.size)
                }
            }
        }
@@ -248,15 +246,15 @@ class DesktopModeTaskRepository {
            )
        }

        // Check if count changed and if there was no tasks or this is the first task
        if (prevCount != newCount && (prevCount == 0 || newCount == 0)) {
            notifyVisibleTaskListeners(displayId, newCount > 0)
        // Check if count changed
        if (prevCount != newCount) {
            notifyVisibleTaskListeners(displayId, newCount)
        }
    }

    private fun notifyVisibleTaskListeners(displayId: Int, hasVisibleFreeformTasks: Boolean) {
    private fun notifyVisibleTaskListeners(displayId: Int, visibleTasksCount: Int) {
        visibleTasksListeners.forEach { (listener, executor) ->
            executor.execute { listener.onVisibilityChanged(displayId, hasVisibleFreeformTasks) }
            executor.execute { listener.onTasksVisibilityChanged(displayId, visibleTasksCount) }
        }
    }

@@ -379,9 +377,9 @@ class DesktopModeTaskRepository {
     */
    interface VisibleTasksListener {
        /**
         * Called when the desktop starts or stops showing freeform tasks.
         * Called when the desktop changes the number of visible freeform tasks.
         */
        fun onVisibilityChanged(displayId: Int, hasVisibleFreeformTasks: Boolean) {}
        fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {}

        /**
         * Called when the desktop stashed status changes.
+8 −6
Original line number Diff line number Diff line
@@ -106,8 +106,8 @@ class DesktopTasksController(
        visualIndicator = null
    }
    private val taskVisibilityListener = object : VisibleTasksListener {
        override fun onVisibilityChanged(displayId: Int, hasVisibleFreeformTasks: Boolean) {
            launchAdjacentController.launchAdjacentEnabled = !hasVisibleFreeformTasks
        override fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {
            launchAdjacentController.launchAdjacentEnabled = visibleTasksCount == 0
        }
    }
    private val dragToDesktopStateListener = object : DragToDesktopStateListener {
@@ -1028,14 +1028,16 @@ class DesktopTasksController(
                SingleInstanceRemoteListener<DesktopTasksController, IDesktopTaskListener>

        private val listener: VisibleTasksListener = object : VisibleTasksListener {
            override fun onVisibilityChanged(displayId: Int, visible: Boolean) {
            override fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {
                KtProtoLog.v(
                        WM_SHELL_DESKTOP_MODE,
                        "IDesktopModeImpl: onVisibilityChanged display=%d visible=%b",
                        "IDesktopModeImpl: onVisibilityChanged display=%d visible=%d",
                        displayId,
                        visible
                        visibleTasksCount
                )
                remoteListener.call { l -> l.onVisibilityChanged(displayId, visible) }
                remoteListener.call {
                    l -> l.onTasksVisibilityChanged(displayId, visibleTasksCount)
                }
            }

            override fun onStashedChanged(displayId: Int, stashed: Boolean) {
+2 −2
Original line number Diff line number Diff line
@@ -22,8 +22,8 @@ package com.android.wm.shell.desktopmode;
 */
interface IDesktopTaskListener {

    /** Desktop task visibility has change. Visible if at least 1 task is visible. */
    oneway void onVisibilityChanged(int displayId, boolean visible);
    /** Desktop tasks visibility has changed. Visible if at least 1 task is visible. */
    oneway void onTasksVisibilityChanged(int displayId, int visibleTasksCount);

    /** Desktop task stashed status has changed. */
    oneway void onStashedChanged(int displayId, boolean stashed);
+19 −19
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        repo.addVisibleTasksListener(listener, executor)
        executor.flushAll()

        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isTrue()
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
    }

@@ -148,7 +148,7 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        repo.addVisibleTasksListener(listener, executor)
        executor.flushAll()

        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isFalse()
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
        // One call as adding listener notifies it
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(0)
    }
@@ -162,8 +162,8 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 2, visible = true)
        executor.flushAll()

        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isTrue()
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(2)
    }

    @Test
@@ -175,16 +175,16 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 1, visible = true)
        executor.flushAll()

        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isTrue()
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
        assertThat(listener.hasVisibleTasksOnSecondaryDisplay).isFalse()
        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(0)
        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(0)

        repo.updateVisibleFreeformTasks(displayId = 1, taskId = 2, visible = true)
        executor.flushAll()

        // Listener for secondary display is notified
        assertThat(listener.hasVisibleTasksOnSecondaryDisplay).isTrue()
        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(1)
        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(1)
        // No changes to listener for default display
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
@@ -198,7 +198,7 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {

        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 1, visible = true)
        executor.flushAll()
        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isTrue()
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)

        // Mark task 1 visible on secondary display
        repo.updateVisibleFreeformTasks(displayId = 1, taskId = 1, visible = true)
@@ -208,11 +208,11 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        // 1 - visible task added
        // 2 - visible task removed
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(2)
        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isFalse()
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)

        // Secondary display should have 1 call for visible task added
        assertThat(listener.visibleChangesOnSecondaryDisplay).isEqualTo(1)
        assertThat(listener.hasVisibleTasksOnSecondaryDisplay).isTrue()
        assertThat(listener.visibleTasksCountOnSecondaryDisplay).isEqualTo(1)
    }

    @Test
@@ -224,17 +224,17 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 2, visible = true)
        executor.flushAll()

        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isTrue()
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 1, visible = false)
        executor.flushAll()

        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(1)
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(3)

        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 2, visible = false)
        executor.flushAll()

        assertThat(listener.hasVisibleTasksOnDefaultDisplay).isFalse()
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(2)
        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(0)
        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(4)
    }

    @Test
@@ -397,8 +397,8 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
    }

    class TestVisibilityListener : DesktopModeTaskRepository.VisibleTasksListener {
        var hasVisibleTasksOnDefaultDisplay = false
        var hasVisibleTasksOnSecondaryDisplay = false
        var visibleTasksCountOnDefaultDisplay = 0
        var visibleTasksCountOnSecondaryDisplay = 0

        var visibleChangesOnDefaultDisplay = 0
        var visibleChangesOnSecondaryDisplay = 0
@@ -409,14 +409,14 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() {
        var stashedChangesOnDefaultDisplay = 0
        var stashedChangesOnSecondaryDisplay = 0

        override fun onVisibilityChanged(displayId: Int, hasVisibleFreeformTasks: Boolean) {
        override fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {
            when (displayId) {
                DEFAULT_DISPLAY -> {
                    hasVisibleTasksOnDefaultDisplay = hasVisibleFreeformTasks
                    visibleTasksCountOnDefaultDisplay = visibleTasksCount
                    visibleChangesOnDefaultDisplay++
                }
                SECOND_DISPLAY -> {
                    hasVisibleTasksOnSecondaryDisplay = hasVisibleFreeformTasks
                    visibleTasksCountOnSecondaryDisplay = visibleTasksCount
                    visibleChangesOnSecondaryDisplay++
                }
                else -> fail("Visible task listener received unexpected display id: $displayId")
+2 −2
Original line number Diff line number Diff line
@@ -353,10 +353,10 @@ public final class WMShell implements
        desktopMode.addVisibleTasksListener(
                new DesktopModeTaskRepository.VisibleTasksListener() {
                    @Override
                    public void onVisibilityChanged(int displayId, boolean hasFreeformTasks) {
                    public void onTasksVisibilityChanged(int displayId, int visibleTasksCount) {
                        if (displayId == Display.DEFAULT_DISPLAY) {
                            mSysUiState.setFlag(SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE,
                                            hasFreeformTasks)
                                            visibleTasksCount > 0)
                                    .commitUpdate(mDisplayTracker.getDefaultDisplayId());
                        }
                        // TODO(b/278084491): update sysui state for changes on other displays