Merge "[Partial Screensharing] Hide app selector from Recent Tasks and move the caller to the tail" into tm-qpr-dev am: 339a4f201a am: 0bb9a62a9f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20875855

Change-Id: I211c0867b4b92a0f023cf095537049146c4a92b4
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Yalan Yiue
2023-02-08 11:52:05 +00:00
committed by Automerger Merge Worker
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
}
}