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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,14 +33,16 @@ 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 =
|
||||||
taskListProvider,
|
MediaProjectionAppSelectorController(
|
||||||
view,
|
taskListProvider,
|
||||||
featureFlags,
|
view,
|
||||||
hostUserHandle,
|
featureFlags,
|
||||||
scope,
|
hostUserHandle,
|
||||||
appSelectorComponentName
|
scope,
|
||||||
)
|
appSelectorComponentName,
|
||||||
|
callerPackageName
|
||||||
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun initNoRecentTasks_bindsEmptyList() {
|
fun initNoRecentTasks_bindsEmptyList() {
|
||||||
@@ -51,104 +55,87 @@ 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 =
|
||||||
createRecentTask(taskId = 1),
|
|
||||||
createRecentTask(taskId = 2),
|
|
||||||
createRecentTask(taskId = 3),
|
|
||||||
)
|
|
||||||
taskListProvider.tasks = tasks
|
|
||||||
|
|
||||||
controller.init()
|
|
||||||
|
|
||||||
verify(view).bind(
|
|
||||||
listOf(
|
listOf(
|
||||||
createRecentTask(taskId = 1),
|
createRecentTask(taskId = 1),
|
||||||
createRecentTask(taskId = 2),
|
createRecentTask(taskId = 2),
|
||||||
createRecentTask(taskId = 3),
|
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
|
taskListProvider.tasks = tasks
|
||||||
|
|
||||||
controller.init()
|
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(
|
listOf(
|
||||||
createRecentTask(taskId = 1),
|
createRecentTask(taskId = 1),
|
||||||
createRecentTask(taskId = 3),
|
|
||||||
createRecentTask(taskId = 5),
|
|
||||||
createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName),
|
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
|
@Test
|
||||||
fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesDisabled_bindsOnlyTasksWithHostProfile() {
|
fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesDisabled_bindsOnlyTasksWithHostProfile() {
|
||||||
givenEnterprisePoliciesFeatureFlag(enabled = false)
|
givenEnterprisePoliciesFeatureFlag(enabled = false)
|
||||||
|
|
||||||
val tasks = listOf(
|
val tasks =
|
||||||
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(
|
|
||||||
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),
|
||||||
@@ -156,7 +143,47 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
|
|||||||
createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
|
createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
|
||||||
createRecentTask(taskId = 5, userId = hostUserHandle.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) {
|
private fun givenEnterprisePoliciesFeatureFlag(enabled: Boolean) {
|
||||||
@@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user