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

Commit 043005ec authored by Massimo Carli's avatar Massimo Carli
Browse files

Consider userId in transparent policy heuristic

We need to consider the current userId when checking the permission
for a specific app using PackageManager.

Flag: com.android.window.flags.enable_modals_fullscreen_with_permission
Bug: 401583497
Test: atest WMShellUnitTests:SystemModalsTransitionHandlerTest
Test: atest WMShellUnitTests:DesktopTasksControllerTest
Test: atest WMShellUnitTests:DesktopModeWindowDecorViewModelTests.
Test: atest WMShellUnitTests:DesktopModeCompatPolicyTest

Change-Id: I560de1bae4df6bea1325a5a7a3fd1dd55ae16170
parent 209ca69a
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -49,15 +49,21 @@ class DesktopModeCompatPolicy(private val context: Context) {
     */
    fun isTopActivityExemptFromDesktopWindowing(task: TaskInfo) =
        isTopActivityExemptFromDesktopWindowing(task.baseActivity?.packageName,
            task.numActivities, task.isTopActivityNoDisplay, task.isActivityStackTransparent)
            task.numActivities, task.isTopActivityNoDisplay, task.isActivityStackTransparent,
            task.userId)

    fun isTopActivityExemptFromDesktopWindowing(packageName: String?,
        numActivities: Int, isTopActivityNoDisplay: Boolean, isActivityStackTransparent: Boolean) =
    fun isTopActivityExemptFromDesktopWindowing(
        packageName: String?,
        numActivities: Int,
        isTopActivityNoDisplay: Boolean,
        isActivityStackTransparent: Boolean,
        userId: Int
    ) =
        DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue &&
                ((isSystemUiTask(packageName) ||
                        isPartOfDefaultHomePackageOrNoHomeAvailable(packageName) ||
                        (isTransparentTask(isActivityStackTransparent, numActivities) &&
                                hasFullscreenTransparentPermission(packageName))) &&
                                hasFullscreenTransparentPermission(packageName, userId))) &&
                        !isTopActivityNoDisplay)

    /**
@@ -91,16 +97,17 @@ class DesktopModeCompatPolicy(private val context: Context) {
    private fun isSystemUiTask(packageName: String?) = packageName == systemUiPackage

    // Checks if the app for the given package has the SYSTEM_ALERT_WINDOW permission.
    private fun hasFullscreenTransparentPermission(packageName: String?): Boolean {
    private fun hasFullscreenTransparentPermission(packageName: String?, userId: Int): Boolean {
        if (DesktopModeFlags.ENABLE_MODALS_FULLSCREEN_WITH_PERMISSIONS.isTrue) {
            if (packageName == null) {
                return false
            }
            return packageInfoCache.getOrPut(packageName) {
            return packageInfoCache.getOrPut("$userId@$packageName") {
                try {
                    val packageInfo = pkgManager.getPackageInfo(
                    val packageInfo = pkgManager.getPackageInfoAsUser(
                        packageName,
                        PackageManager.GET_PERMISSIONS
                        PackageManager.GET_PERMISSIONS,
                        userId
                    )
                    packageInfo?.requestedPermissions?.contains(SYSTEM_ALERT_WINDOW) == true
                } catch (e: PackageManager.NameNotFoundException) {
+1 −0
Original line number Diff line number Diff line
@@ -4366,6 +4366,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    fun handleRequest_closeTransition_singleTaskNoToken_secondaryDisplay_launchesHome() {
        taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
        taskRepository.setActiveDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
+9 −3
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ class SystemModalsTransitionHandlerTest : ShellTestCase() {
        whenever(packageManager.getHomeActivities(ArrayList())).thenReturn(componentName)
        desktopModeCompatPolicy = DesktopModeCompatPolicy(spyContext)
        transitionHandler = createTransitionHandler()
        allowOverlayPermission(arrayOf(SYSTEM_ALERT_WINDOW))
        allowOverlayPermissionForAllUsers(arrayOf(SYSTEM_ALERT_WINDOW))
    }

    private fun createTransitionHandler() =
@@ -200,10 +200,16 @@ class SystemModalsTransitionHandlerTest : ShellTestCase() {
            .isTrue()
    }

    fun allowOverlayPermission(permissions: Array<String>) {
    fun allowOverlayPermissionForAllUsers(permissions: Array<String>) {
        val packageInfo = mock<PackageInfo>()
        packageInfo.requestedPermissions = permissions
        whenever(packageManager.getPackageInfo(anyString(), eq(PackageManager.GET_PERMISSIONS)))
        whenever(
                packageManager.getPackageInfoAsUser(
                    anyString(),
                    eq(PackageManager.GET_PERMISSIONS),
                    anyInt(),
                )
            )
            .thenReturn(packageInfo)
    }
}
+27 −8
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.anyString
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
@@ -87,7 +88,7 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    fun testIsTopActivityExemptWithPermission_onlyTransparentActivitiesInStack() {
        allowOverlayPermission(arrayOf(SYSTEM_ALERT_WINDOW))
        allowOverlayPermissionForAllUsers(arrayOf(SYSTEM_ALERT_WINDOW))
        assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
                .apply {
@@ -101,7 +102,7 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    fun testIsTopActivityExemptWithNoPermission_onlyTransparentActivitiesInStack() {
        allowOverlayPermission(arrayOf())
        allowOverlayPermissionForAllUsers(arrayOf())
        assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
                .apply {
@@ -115,7 +116,7 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    fun testIsTopActivityExemptCachedPermissionCheckIsUsed() {
        allowOverlayPermission(arrayOf())
        allowOverlayPermissionForAllUsers(arrayOf())
        assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
                .apply {
@@ -123,6 +124,7 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
                    isTopActivityNoDisplay = false
                    numActivities = 1
                    baseActivity = baseActivityTest
                    userId = 10
                }))
        assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
@@ -131,10 +133,26 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
                    isTopActivityNoDisplay = false
                    numActivities = 1
                    baseActivity = baseActivityTest
                    userId = 10
                }))
        verify(packageManager, times(1)).getPackageInfo(
        assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
                .apply {
                    isActivityStackTransparent = true
                    isTopActivityNoDisplay = false
                    numActivities = 1
                    baseActivity = baseActivityTest
                    userId = 0
                }))
        verify(packageManager, times(1)).getPackageInfoAsUser(
            eq("com.test.dummypackage"),
            eq(PackageManager.GET_PERMISSIONS),
            eq(10)
        )
        verify(packageManager, times(1)).getPackageInfoAsUser(
            eq("com.test.dummypackage"),
            eq(PackageManager.GET_PERMISSIONS)
            eq(PackageManager.GET_PERMISSIONS),
            eq(0)
        )
    }

@@ -284,13 +302,14 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
            }
        }

    fun allowOverlayPermission(permissions: Array<String>) {
    fun allowOverlayPermissionForAllUsers(permissions: Array<String>) {
        val packageInfo = mock<PackageInfo>()
        packageInfo.requestedPermissions = permissions
        whenever(
            packageManager.getPackageInfo(
            packageManager.getPackageInfoAsUser(
                anyString(),
                eq(PackageManager.GET_PERMISSIONS)
                eq(PackageManager.GET_PERMISSIONS),
                anyInt(),
            )
        ).thenReturn(packageInfo)
    }