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

Commit 03a3f943 authored by Ivan Tkachenko's avatar Ivan Tkachenko Committed by Android (Google) Code Review
Browse files

Merge "Fix RemoteTargetGluer crash" into main

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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