Loading packages/SystemUI/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModel.kt +26 −12 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 -> { Loading @@ -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) Loading @@ -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" } } packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModelTest.kt +40 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading Loading @@ -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 { Loading Loading
packages/SystemUI/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModel.kt +26 −12 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 -> { Loading @@ -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) Loading @@ -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" } }
packages/SystemUI/tests/src/com/android/systemui/mediaprojection/taskswitcher/ui/viewmodel/TaskSwitcherNotificationViewModelTest.kt +40 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading Loading @@ -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 { Loading