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

Commit b044d6b5 authored by yyalan's avatar yyalan Committed by Yalan Yiue
Browse files

[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
parent 7ef14c02
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

    }
}