Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 339a4f20 authored by Yalan Yiue's avatar Yalan Yiue Committed by Android (Google) Code Review
Browse files

Merge "[Partial Screensharing] Hide app selector from Recent Tasks and move...

Merge "[Partial Screensharing] Hide app selector from Recent Tasks and move the caller to the tail" into tm-qpr-dev
parents 3cb3420b b044d6b5
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -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
+10 −5
Original line number Diff line number Diff line
@@ -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
    }
}
+94 −68
Original line number Diff line number Diff line
@@ -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,13 +33,15 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
    private val view: MediaProjectionAppSelectorView = mock()
    private val featureFlags: FeatureFlags = mock()

    private val controller = MediaProjectionAppSelectorController(
    private val controller =
        MediaProjectionAppSelectorController(
            taskListProvider,
            view,
            featureFlags,
            hostUserHandle,
            scope,
        appSelectorComponentName
            appSelectorComponentName,
            callerPackageName
        )

    @Test
@@ -51,22 +55,17 @@ 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(
        val tasks =
            listOf(
                createRecentTask(taskId = 1),
                createRecentTask(taskId = 2),
                createRecentTask(taskId = 3),
@@ -75,7 +74,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {

        controller.init()

        verify(view).bind(
        verify(view)
            .bind(
                listOf(
                    createRecentTask(taskId = 1),
                    createRecentTask(taskId = 2),
@@ -85,25 +85,48 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
    }

    @Test
    fun initRecentTasksWithAppSelectorTasks_bindsAppSelectorTasksAtTheEnd() {
        val tasks = listOf(
    fun initRecentTasksWithAppSelectorTasks_removeAppSelector() {
        val tasks =
            listOf(
                createRecentTask(taskId = 1),
                createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName),
                createRecentTask(taskId = 3),
            createRecentTask(taskId = 4, topActivityComponent = appSelectorComponentName),
            createRecentTask(taskId = 5),
                createRecentTask(taskId = 4),
            )
        taskListProvider.tasks = tasks

        controller.init()

        verify(view).bind(
        verify(view)
            .bind(
                listOf(
                    createRecentTask(taskId = 1),
                    createRecentTask(taskId = 3),
                createRecentTask(taskId = 5),
                createRecentTask(taskId = 2, topActivityComponent = appSelectorComponentName),
                createRecentTask(taskId = 4, topActivityComponent = appSelectorComponentName),
                    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),
                )
            )
    }
@@ -112,7 +135,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
    fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesDisabled_bindsOnlyTasksWithHostProfile() {
        givenEnterprisePoliciesFeatureFlag(enabled = false)

        val tasks = listOf(
        val tasks =
            listOf(
                createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
                createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
                createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
@@ -123,7 +147,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {

        controller.init()

        verify(view).bind(
        verify(view)
            .bind(
                listOf(
                    createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
                    createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
@@ -136,7 +161,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
    fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesEnabled_bindsAllTasks() {
        givenEnterprisePoliciesFeatureFlag(enabled = true)

        val tasks = listOf(
        val tasks =
            listOf(
                createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
                createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
                createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
@@ -148,7 +174,8 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
        controller.init()

        // TODO(b/233348916) should filter depending on the policies
        verify(view).bind(
        verify(view)
            .bind(
                listOf(
                    createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
                    createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
@@ -183,6 +210,5 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
        var tasks: List<RecentTask> = emptyList()

        override suspend fun loadRecentTasks(): List<RecentTask> = tasks

    }
}