Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt +15 −8 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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) { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -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) Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt +9 −3 Original line number Diff line number Diff line Loading @@ -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() = Loading Loading @@ -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) } } libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt +27 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading @@ -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 { Loading @@ -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 { Loading @@ -123,6 +124,7 @@ class DesktopModeCompatPolicyTest : ShellTestCase() { isTopActivityNoDisplay = false numActivities = 1 baseActivity = baseActivityTest userId = 10 })) assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing( createFreeformTask(/* displayId */ 0) Loading @@ -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) ) } Loading Loading @@ -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) } Loading Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt +15 −8 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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) { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt +9 −3 Original line number Diff line number Diff line Loading @@ -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() = Loading Loading @@ -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) } }
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt +27 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading @@ -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 { Loading @@ -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 { Loading @@ -123,6 +124,7 @@ class DesktopModeCompatPolicyTest : ShellTestCase() { isTopActivityNoDisplay = false numActivities = 1 baseActivity = baseActivityTest userId = 10 })) assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing( createFreeformTask(/* displayId */ 0) Loading @@ -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) ) } Loading Loading @@ -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) } Loading