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

Commit a2e1b4db authored by Massimo Carli's avatar Massimo Carli Committed by Android (Google) Code Review
Browse files

Merge "Consider userId in transparent policy heuristic" into main

parents 0131dc87 043005ec
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)

    /** @see DesktopModeCompatUtils.shouldExcludeCaptionFromAppBounds */
@@ -80,16 +86,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
@@ -5015,6 +5015,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)
    }