[Partial Screensharing] Hide app selector from Recent Tasks and move the caller to the tail

Remove app selector from the Recent Task. Pass the caller app's packageName to MediaProjectionAppSelectorController and move it to the tail.

Bug: 255340264
Test: MediaProjectionAppSelectorControllerTest
Change-Id: I5b7ed51b3e74c0ba70cdf845b3f50cac2b548c1b
This commit is contained in:
yyalan
2023-01-04 16:50:52 +00:00
committed by Yalan Yiue
parent 7ef14c02c0
commit b044d6b538
3 changed files with 126 additions and 89 deletions

View File

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

View File

@@ -36,16 +36,16 @@ constructor(
private val flags: FeatureFlags,
@HostUserHandle private val hostUserHandle: UserHandle,
@MediaProjectionAppSelector private val scope: CoroutineScope,
@MediaProjectionAppSelector private val appSelectorComponentName: ComponentName
@MediaProjectionAppSelector private val appSelectorComponentName: ComponentName,
@MediaProjectionAppSelector private val callerPackageName: String?
) {
fun init() {
scope.launch {
val recentTasks = recentTaskListProvider.loadRecentTasks()
val tasks = recentTasks
.filterDevicePolicyRestrictedTasks()
.sortedTasks()
val tasks =
recentTasks.filterDevicePolicyRestrictedTasks().filterAppSelector().sortedTasks()
view.bind(tasks)
}
@@ -67,8 +67,13 @@ constructor(
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 {
// 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 scope = CoroutineScope(Dispatchers.Unconfined)
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 otherUserHandle = UserHandle.of(456)
@@ -31,14 +33,16 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
private val view: MediaProjectionAppSelectorView = mock()
private val featureFlags: FeatureFlags = mock()
private val controller = MediaProjectionAppSelectorController(
taskListProvider,
view,
featureFlags,
hostUserHandle,
scope,
appSelectorComponentName
)
private val controller =
MediaProjectionAppSelectorController(
taskListProvider,
view,
featureFlags,
hostUserHandle,
scope,
appSelectorComponentName,
callerPackageName
)
@Test
fun initNoRecentTasks_bindsEmptyList() {
@@ -51,104 +55,87 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
@Test
fun initOneRecentTask_bindsList() {
taskListProvider.tasks = listOf(
createRecentTask(taskId = 1)
)
taskListProvider.tasks = listOf(createRecentTask(taskId = 1))
controller.init()
verify(view).bind(
listOf(
createRecentTask(taskId = 1)
)
)
verify(view).bind(listOf(createRecentTask(taskId = 1)))
}
@Test
fun initMultipleRecentTasksWithoutAppSelectorTask_bindsListInTheSameOrder() {
val tasks = listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 2),
createRecentTask(taskId = 3),
)
taskListProvider.tasks = tasks
controller.init()
verify(view).bind(
val tasks =
listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 2),
createRecentTask(taskId = 3),
)
)
}
@Test
fun initRecentTasksWithAppSelectorTasks_bindsAppSelectorTasksAtTheEnd() {
val tasks = listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName),
createRecentTask(taskId = 3),
createRecentTask(taskId = 4, topActivityComponent = appSelectorComponentName),
createRecentTask(taskId = 5),
)
taskListProvider.tasks = tasks
controller.init()
verify(view).bind(
verify(view)
.bind(
listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 2),
createRecentTask(taskId = 3),
)
)
}
@Test
fun initRecentTasksWithAppSelectorTasks_removeAppSelector() {
val tasks =
listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 3),
createRecentTask(taskId = 5),
createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName),
createRecentTask(taskId = 4, topActivityComponent = appSelectorComponentName),
createRecentTask(taskId = 3),
createRecentTask(taskId = 4),
)
taskListProvider.tasks = tasks
controller.init()
verify(view)
.bind(
listOf(
createRecentTask(taskId = 1),
createRecentTask(taskId = 3),
createRecentTask(taskId = 4),
)
)
}
@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),
)
)
)
}
@Test
fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesDisabled_bindsOnlyTasksWithHostProfile() {
givenEnterprisePoliciesFeatureFlag(enabled = false)
val tasks = listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
)
taskListProvider.tasks = tasks
controller.init()
verify(view).bind(
listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
)
)
}
@Test
fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesEnabled_bindsAllTasks() {
givenEnterprisePoliciesFeatureFlag(enabled = true)
val tasks = listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
)
taskListProvider.tasks = tasks
controller.init()
// TODO(b/233348916) should filter depending on the policies
verify(view).bind(
val tasks =
listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
@@ -156,7 +143,47 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
)
)
taskListProvider.tasks = tasks
controller.init()
verify(view)
.bind(
listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
)
)
}
@Test
fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesEnabled_bindsAllTasks() {
givenEnterprisePoliciesFeatureFlag(enabled = true)
val tasks =
listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
)
taskListProvider.tasks = tasks
controller.init()
// TODO(b/233348916) should filter depending on the policies
verify(view)
.bind(
listOf(
createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
)
)
}
private fun givenEnterprisePoliciesFeatureFlag(enabled: Boolean) {
@@ -183,6 +210,5 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
var tasks: List<RecentTask> = emptyList()
override suspend fun loadRecentTasks(): List<RecentTask> = tasks
}
}