Merge "[Partial Screensharing] Hide app selector from Recent Tasks and move the caller to the tail" into tm-qpr-dev

This commit is contained in:
Yalan Yiue
2023-02-08 10:35:46 +00:00
committed by Android (Google) Code Review
3 changed files with 126 additions and 89 deletions

View File

@@ -46,10 +46,10 @@ import dagger.Provides
import dagger.Subcomponent import dagger.Subcomponent
import dagger.multibindings.ClassKey import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap import dagger.multibindings.IntoMap
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
import javax.inject.Qualifier import javax.inject.Qualifier
import javax.inject.Scope import javax.inject.Scope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
@Qualifier @Retention(AnnotationRetention.BINARY) annotation class MediaProjectionAppSelector @Qualifier @Retention(AnnotationRetention.BINARY) annotation class MediaProjectionAppSelector
@@ -107,6 +107,12 @@ interface MediaProjectionAppSelectorModule {
fun provideAppSelectorComponentName(context: Context): ComponentName = fun provideAppSelectorComponentName(context: Context): ComponentName =
ComponentName(context, MediaProjectionAppSelectorActivity::class.java) ComponentName(context, MediaProjectionAppSelectorActivity::class.java)
@Provides
@MediaProjectionAppSelector
@MediaProjectionAppSelectorScope
fun provideCallerPackageName(activity: MediaProjectionAppSelectorActivity): String? =
activity.callingPackage
@Provides @Provides
@MediaProjectionAppSelector @MediaProjectionAppSelector
@MediaProjectionAppSelectorScope @MediaProjectionAppSelectorScope

View File

@@ -36,16 +36,16 @@ constructor(
private val flags: FeatureFlags, private val flags: FeatureFlags,
@HostUserHandle private val hostUserHandle: UserHandle, @HostUserHandle private val hostUserHandle: UserHandle,
@MediaProjectionAppSelector private val scope: CoroutineScope, @MediaProjectionAppSelector private val scope: CoroutineScope,
@MediaProjectionAppSelector private val appSelectorComponentName: ComponentName @MediaProjectionAppSelector private val appSelectorComponentName: ComponentName,
@MediaProjectionAppSelector private val callerPackageName: String?
) { ) {
fun init() { fun init() {
scope.launch { scope.launch {
val recentTasks = recentTaskListProvider.loadRecentTasks() val recentTasks = recentTaskListProvider.loadRecentTasks()
val tasks = recentTasks val tasks =
.filterDevicePolicyRestrictedTasks() recentTasks.filterDevicePolicyRestrictedTasks().filterAppSelector().sortedTasks()
.sortedTasks()
view.bind(tasks) view.bind(tasks)
} }
@@ -67,8 +67,13 @@ constructor(
filter { UserHandle.of(it.userId) == hostUserHandle } filter { UserHandle.of(it.userId) == hostUserHandle }
} }
private fun List<RecentTask>.filterAppSelector(): List<RecentTask> = filter {
// Only take tasks that is not the app selector
it.topActivityComponent != appSelectorComponentName
}
private fun List<RecentTask>.sortedTasks(): List<RecentTask> = sortedBy { private fun List<RecentTask>.sortedTasks(): List<RecentTask> = sortedBy {
// Show normal tasks first and only then tasks with opened app selector // Show normal tasks first and only then tasks with opened app selector
it.topActivityComponent == appSelectorComponentName it.topActivityComponent?.packageName == callerPackageName
} }
} }

View File

@@ -24,6 +24,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
private val taskListProvider = TestRecentTaskListProvider() private val taskListProvider = TestRecentTaskListProvider()
private val scope = CoroutineScope(Dispatchers.Unconfined) private val scope = CoroutineScope(Dispatchers.Unconfined)
private val appSelectorComponentName = ComponentName("com.test", "AppSelector") private val appSelectorComponentName = ComponentName("com.test", "AppSelector")
private val callerPackageName = "com.test.caller"
private val callerComponentName = ComponentName(callerPackageName, "Caller")
private val hostUserHandle = UserHandle.of(123) private val hostUserHandle = UserHandle.of(123)
private val otherUserHandle = UserHandle.of(456) private val otherUserHandle = UserHandle.of(456)
@@ -31,13 +33,15 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
private val view: MediaProjectionAppSelectorView = mock() private val view: MediaProjectionAppSelectorView = mock()
private val featureFlags: FeatureFlags = mock() private val featureFlags: FeatureFlags = mock()
private val controller = MediaProjectionAppSelectorController( private val controller =
MediaProjectionAppSelectorController(
taskListProvider, taskListProvider,
view, view,
featureFlags, featureFlags,
hostUserHandle, hostUserHandle,
scope, scope,
appSelectorComponentName appSelectorComponentName,
callerPackageName
) )
@Test @Test
@@ -51,22 +55,17 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
@Test @Test
fun initOneRecentTask_bindsList() { fun initOneRecentTask_bindsList() {
taskListProvider.tasks = listOf( taskListProvider.tasks = listOf(createRecentTask(taskId = 1))
createRecentTask(taskId = 1)
)
controller.init() controller.init()
verify(view).bind( verify(view).bind(listOf(createRecentTask(taskId = 1)))
listOf(
createRecentTask(taskId = 1)
)
)
} }
@Test @Test
fun initMultipleRecentTasksWithoutAppSelectorTask_bindsListInTheSameOrder() { fun initMultipleRecentTasksWithoutAppSelectorTask_bindsListInTheSameOrder() {
val tasks = listOf( val tasks =
listOf(
createRecentTask(taskId = 1), createRecentTask(taskId = 1),
createRecentTask(taskId = 2), createRecentTask(taskId = 2),
createRecentTask(taskId = 3), createRecentTask(taskId = 3),
@@ -75,7 +74,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
controller.init() controller.init()
verify(view).bind( verify(view)
.bind(
listOf( listOf(
createRecentTask(taskId = 1), createRecentTask(taskId = 1),
createRecentTask(taskId = 2), createRecentTask(taskId = 2),
@@ -85,25 +85,48 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
} }
@Test @Test
fun initRecentTasksWithAppSelectorTasks_bindsAppSelectorTasksAtTheEnd() { fun initRecentTasksWithAppSelectorTasks_removeAppSelector() {
val tasks = listOf( val tasks =
listOf(
createRecentTask(taskId = 1), createRecentTask(taskId = 1),
createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName), createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName),
createRecentTask(taskId = 3), createRecentTask(taskId = 3),
createRecentTask(taskId = 4, topActivityComponent = appSelectorComponentName), createRecentTask(taskId = 4),
createRecentTask(taskId = 5),
) )
taskListProvider.tasks = tasks taskListProvider.tasks = tasks
controller.init() controller.init()
verify(view).bind( verify(view)
.bind(
listOf( listOf(
createRecentTask(taskId = 1), createRecentTask(taskId = 1),
createRecentTask(taskId = 3), createRecentTask(taskId = 3),
createRecentTask(taskId = 5), createRecentTask(taskId = 4),
createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName), )
createRecentTask(taskId = 4, topActivityComponent = appSelectorComponentName), )
}
@Test
fun initRecentTasksWithAppSelectorTasks_bindsCallerTasksAtTheEnd() {
val tasks =
listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 2, topActivityComponent = callerComponentName),
createRecentTask(taskId = 3),
createRecentTask(taskId = 4),
)
taskListProvider.tasks = tasks
controller.init()
verify(view)
.bind(
listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 3),
createRecentTask(taskId = 4),
createRecentTask(taskId = 2, topActivityComponent = callerComponentName),
) )
) )
} }
@@ -112,7 +135,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesDisabled_bindsOnlyTasksWithHostProfile() { fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesDisabled_bindsOnlyTasksWithHostProfile() {
givenEnterprisePoliciesFeatureFlag(enabled = false) givenEnterprisePoliciesFeatureFlag(enabled = false)
val tasks = listOf( val tasks =
listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier), createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier), createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier), createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
@@ -123,7 +147,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
controller.init() controller.init()
verify(view).bind( verify(view)
.bind(
listOf( listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier), createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier), createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
@@ -136,7 +161,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesEnabled_bindsAllTasks() { fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesEnabled_bindsAllTasks() {
givenEnterprisePoliciesFeatureFlag(enabled = true) givenEnterprisePoliciesFeatureFlag(enabled = true)
val tasks = listOf( val tasks =
listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier), createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier), createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier), createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
@@ -148,7 +174,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
controller.init() controller.init()
// TODO(b/233348916) should filter depending on the policies // TODO(b/233348916) should filter depending on the policies
verify(view).bind( verify(view)
.bind(
listOf( listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier), createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier), createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
@@ -183,6 +210,5 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
var tasks: List<RecentTask> = emptyList() var tasks: List<RecentTask> = emptyList()
override suspend fun loadRecentTasks(): List<RecentTask> = tasks override suspend fun loadRecentTasks(): List<RecentTask> = tasks
} }
} }