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 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 {
@@ -1033,14 +1033,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
@@ -347,10 +347,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