blob: d35a21236ae816465aa0df101579ac45695b62ab [file] [log] [blame]
package com.android.systemui.mediaprojection.appselector.data
import android.app.ActivityManager.RecentTaskInfo
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.settings.UserTracker
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.wm.shell.recents.RecentTasks
import com.android.wm.shell.util.GroupedRecentTaskInfo
import com.google.common.truth.Truth.assertThat
import java.util.*
import java.util.function.Consumer
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidTestingRunner::class)
@SmallTest
class ShellRecentTaskListProviderTest : SysuiTestCase() {
private val dispatcher = Dispatchers.Unconfined
private val recentTasks: RecentTasks = mock()
private val userTracker: UserTracker = mock()
private val recentTaskListProvider =
ShellRecentTaskListProvider(
dispatcher,
Runnable::run,
Optional.of(recentTasks),
userTracker
)
@Test
fun loadRecentTasks_oneTask_returnsTheSameTask() {
givenRecentTasks(createSingleTask(taskId = 1))
val result = runBlocking { recentTaskListProvider.loadRecentTasks() }
assertThat(result).containsExactly(createRecentTask(taskId = 1))
}
@Test
fun loadRecentTasks_multipleTasks_returnsTheSameTasks() {
givenRecentTasks(
createSingleTask(taskId = 1),
createSingleTask(taskId = 2),
createSingleTask(taskId = 3),
)
val result = runBlocking { recentTaskListProvider.loadRecentTasks() }
assertThat(result)
.containsExactly(
createRecentTask(taskId = 1),
createRecentTask(taskId = 2),
createRecentTask(taskId = 3),
)
}
@Test
fun loadRecentTasks_groupedTask_returnsUngroupedTasks() {
givenRecentTasks(createTaskPair(taskId1 = 1, taskId2 = 2))
val result = runBlocking { recentTaskListProvider.loadRecentTasks() }
assertThat(result)
.containsExactly(createRecentTask(taskId = 1), createRecentTask(taskId = 2))
}
@Test
fun loadRecentTasks_mixedSingleAndGroupedTask_returnsUngroupedTasks() {
givenRecentTasks(
createSingleTask(taskId = 1),
createTaskPair(taskId1 = 2, taskId2 = 3),
createSingleTask(taskId = 4),
createTaskPair(taskId1 = 5, taskId2 = 6),
)
val result = runBlocking { recentTaskListProvider.loadRecentTasks() }
assertThat(result)
.containsExactly(
createRecentTask(taskId = 1),
createRecentTask(taskId = 2),
createRecentTask(taskId = 3),
createRecentTask(taskId = 4),
createRecentTask(taskId = 5),
createRecentTask(taskId = 6),
)
}
@Suppress("UNCHECKED_CAST")
private fun givenRecentTasks(vararg tasks: GroupedRecentTaskInfo) {
whenever(recentTasks.getRecentTasks(any(), any(), any(), any(), any())).thenAnswer {
val consumer = it.arguments.last() as Consumer<List<GroupedRecentTaskInfo>>
consumer.accept(tasks.toList())
}
}
private fun createRecentTask(taskId: Int): RecentTask =
RecentTask(
taskId = taskId,
userId = 0,
topActivityComponent = null,
baseIntentComponent = null,
colorBackground = null
)
private fun createSingleTask(taskId: Int): GroupedRecentTaskInfo =
GroupedRecentTaskInfo.forSingleTask(createTaskInfo(taskId))
private fun createTaskPair(taskId1: Int, taskId2: Int): GroupedRecentTaskInfo =
GroupedRecentTaskInfo.forSplitTasks(createTaskInfo(taskId1), createTaskInfo(taskId2), null)
private fun createTaskInfo(taskId: Int) = RecentTaskInfo().apply { this.taskId = taskId }
}