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

Commit 3f0407de authored by Tianfan Zhang's avatar Tianfan Zhang
Browse files

Replace FocusedDisplayRepository with TaskStackChangeListener.

Bug: 422055560
Bug: 421433287
Flag: com.android.systemui.enable_underlay
Test: atest AmbientCueRepositoryTest
Change-Id: I7c93ba3e9a585be27d7fc3dd215b00c252765085
parent 568155ad
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import com.android.systemui.navigationbar.NavigationModeController
import com.android.systemui.navigationbar.NavigationModeController.ModeChangedListener
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.shade.data.repository.fakeFocusedDisplayRepository
import com.android.systemui.shared.system.taskStackChangeListeners
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.update
@@ -93,7 +94,7 @@ class AmbientCueRepositoryTest : SysuiTestCase() {
            dumpManager = dumpManager,
            executor = kosmos.fakeExecutor,
            applicationContext = kosmos.testableContext,
            focusdDisplayRepository = kosmos.fakeFocusedDisplayRepository,
            taskStackChangeListeners = kosmos.taskStackChangeListeners,
        )

    @Test
@@ -105,7 +106,9 @@ class AmbientCueRepositoryTest : SysuiTestCase() {
            verify(smartSpaceSession)
                .addOnTargetsAvailableListener(any(), onTargetsAvailableListenerCaptor.capture())

            fakeFocusedDisplayRepository.setGlobalTask(RunningTaskInfo().apply { taskId = TASK_ID })
            taskStackChangeListeners.listenerImpl.onTaskMovedToFront(
                RunningTaskInfo().apply { taskId = TASK_ID }
            )
            advanceTimeBy(DEBOUNCE_DELAY_MS)
            onTargetsAvailableListenerCaptor.firstValue.onTargetsAvailable(listOf(autofillTarget))
            advanceUntilIdle()
@@ -197,8 +200,11 @@ class AmbientCueRepositoryTest : SysuiTestCase() {
    fun globallyFocusedTaskId_whenFocusedTaskChange_taskIdUpdated() =
        kosmos.runTest {
            val globallyFocusedTaskId by collectLastValue(underTest.globallyFocusedTaskId)
            runCurrent()

            fakeFocusedDisplayRepository.setGlobalTask(RunningTaskInfo().apply { taskId = TASK_ID })
            taskStackChangeListeners.listenerImpl.onTaskMovedToFront(
                RunningTaskInfo().apply { taskId = TASK_ID }
            )
            advanceTimeBy(DEBOUNCE_DELAY_MS)

            assertThat(globallyFocusedTaskId).isEqualTo(TASK_ID)
+15 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.ambientcue.data.repository

import android.app.ActivityManager.RunningTaskInfo
import android.app.ActivityOptions
import android.app.ActivityTaskManager
import android.app.BroadcastOptions
@@ -38,12 +39,13 @@ import com.android.systemui.ambientcue.shared.model.ActionModel
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.display.data.repository.FocusedDisplayRepository
import com.android.systemui.dump.DumpManager
import com.android.systemui.navigationbar.NavigationModeController
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.res.R
import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.shared.system.TaskStackChangeListener
import com.android.systemui.shared.system.TaskStackChangeListeners
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import java.io.PrintWriter
import java.util.concurrent.Executor
@@ -101,8 +103,8 @@ constructor(
    dumpManager: DumpManager,
    @Background executor: Executor,
    @Application applicationContext: Context,
    focusdDisplayRepository: FocusedDisplayRepository,
    launcherProxyService: LauncherProxyService,
    private val taskStackChangeListeners: TaskStackChangeListeners,
) : AmbientCueRepository, Dumpable {

    init {
@@ -263,8 +265,17 @@ constructor(

    @OptIn(FlowPreview::class)
    override val globallyFocusedTaskId: StateFlow<Int> =
        focusdDisplayRepository.globallyFocusedTask
            .map { it?.taskId ?: INVALID_TASK_ID }
        conflatedCallbackFlow {
                val taskListener =
                    object : TaskStackChangeListener {
                        override fun onTaskMovedToFront(runningTaskInfo: RunningTaskInfo) {
                            trySend(runningTaskInfo.taskId)
                        }
                    }

                taskStackChangeListeners.registerTaskStackListener(taskListener)
                awaitClose { taskStackChangeListeners.unregisterTaskStackListener(taskListener) }
            }
            .distinctUntilChanged()
            // Filter out focused task quick change. For example, when user clicks ambient cue, the
            // click event will also be sent to NavBar, so it will cause a quick change of focused