diff options
4 files changed, 52 insertions, 19 deletions
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt index e145ea9dfa8f..529203f7ded2 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt @@ -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) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 240140499e69..8d8140c47c1a 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -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) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt index 7560945856ec..dc973d0fda77 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt @@ -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) } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt index 5ac680048a7e..12785c03aa9f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt @@ -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) } |