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

Commit f425f3e2 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "PSS: Task Switcher - Auto hide notification after 5 seconds" into main

parents 0be1acba a8c77681
Loading
Loading
Loading
Loading
+26 −12
Original line number Diff line number Diff line
@@ -18,14 +18,18 @@ package com.android.systemui.mediaprojection.taskswitcher.ui.viewmodel

import android.app.ActivityManager.RunningTaskInfo
import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.mediaprojection.taskswitcher.domain.interactor.TaskSwitchInteractor
import com.android.systemui.mediaprojection.taskswitcher.domain.model.TaskSwitchState
import com.android.systemui.mediaprojection.taskswitcher.ui.model.TaskSwitcherNotificationUiState
import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.transformLatest
import kotlinx.coroutines.withContext

class TaskSwitcherNotificationViewModel
@@ -36,7 +40,8 @@ constructor(
) {

    val uiState: Flow<TaskSwitcherNotificationUiState> =
        interactor.taskSwitchChanges.map { taskSwitchChange ->
        interactor.taskSwitchChanges
            .map { taskSwitchChange ->
                Log.d(TAG, "taskSwitchChange: $taskSwitchChange")
                when (taskSwitchChange) {
                    is TaskSwitchState.TaskSwitched -> {
@@ -51,6 +56,14 @@ constructor(
                    }
                }
            }
            .transformLatest { uiState ->
                emit(uiState)
                if (uiState is TaskSwitcherNotificationUiState.Showing) {
                    delay(NOTIFICATION_MAX_SHOW_DURATION)
                    Log.d(TAG, "Auto hiding notification after $NOTIFICATION_MAX_SHOW_DURATION")
                    emit(TaskSwitcherNotificationUiState.NotShowing)
                }
            }

    suspend fun onSwitchTaskClicked(task: RunningTaskInfo) {
        interactor.switchProjectedTask(task)
@@ -60,6 +73,7 @@ constructor(
        withContext(backgroundDispatcher) { interactor.goBackToTask(task) }

    companion object {
        @VisibleForTesting val NOTIFICATION_MAX_SHOW_DURATION = 5.seconds
        private const val TAG = "TaskSwitchNotifVM"
    }
}
+40 −1
Original line number Diff line number Diff line
@@ -31,8 +31,11 @@ import com.android.systemui.mediaprojection.taskswitcher.data.repository.FakeMed
import com.android.systemui.mediaprojection.taskswitcher.data.repository.MediaProjectionManagerRepository
import com.android.systemui.mediaprojection.taskswitcher.domain.interactor.TaskSwitchInteractor
import com.android.systemui.mediaprojection.taskswitcher.ui.model.TaskSwitcherNotificationUiState
import com.android.systemui.mediaprojection.taskswitcher.ui.viewmodel.TaskSwitcherNotificationViewModel.Companion.NOTIFICATION_MAX_SHOW_DURATION
import com.google.common.truth.Truth.assertThat
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestCoroutineScheduler
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
@@ -44,7 +47,8 @@ import org.junit.runner.RunWith
@SmallTest
class TaskSwitcherNotificationViewModelTest : SysuiTestCase() {

    private val dispatcher = UnconfinedTestDispatcher()
    private val scheduler = TestCoroutineScheduler()
    private val dispatcher = UnconfinedTestDispatcher(scheduler)
    private val testScope = TestScope(dispatcher)

    private val fakeActivityTaskManager = FakeActivityTaskManager()
@@ -137,6 +141,41 @@ class TaskSwitcherNotificationViewModelTest : SysuiTestCase() {
                .isEqualTo(TaskSwitcherNotificationUiState.Showing(projectedTask, foregroundTask))
        }

    @Test
    fun uiState_taskChanged_beforeDelayLimit_stillEmitsShowing() =
        testScope.runTest {
            val projectedTask = createTask(taskId = 1)
            val foregroundTask = createTask(taskId = 2)
            val uiState by collectLastValue(viewModel.uiState)

            fakeActivityTaskManager.addRunningTasks(projectedTask, foregroundTask)
            fakeMediaProjectionManager.dispatchOnSessionSet(
                session = createSingleTaskSession(projectedTask.token.asBinder())
            )
            fakeActivityTaskManager.moveTaskToForeground(foregroundTask)

            testScheduler.advanceTimeBy(NOTIFICATION_MAX_SHOW_DURATION - 1.milliseconds)
            assertThat(uiState)
                .isEqualTo(TaskSwitcherNotificationUiState.Showing(projectedTask, foregroundTask))
        }

    @Test
    fun uiState_taskChanged_afterDelayLimit_emitsNotShowing() =
        testScope.runTest {
            val projectedTask = createTask(taskId = 1)
            val foregroundTask = createTask(taskId = 2)
            val uiState by collectLastValue(viewModel.uiState)

            fakeActivityTaskManager.addRunningTasks(projectedTask, foregroundTask)
            fakeMediaProjectionManager.dispatchOnSessionSet(
                session = createSingleTaskSession(projectedTask.token.asBinder())
            )
            fakeActivityTaskManager.moveTaskToForeground(foregroundTask)

            testScheduler.advanceTimeBy(NOTIFICATION_MAX_SHOW_DURATION)
            assertThat(uiState).isEqualTo(TaskSwitcherNotificationUiState.NotShowing)
        }

    @Test
    fun uiState_projectingTask_foregroundTaskChanged_thenTaskSwitched_emitsNotShowing() =
        testScope.runTest {