summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Massimo Carli <mcarli@google.com> 2025-02-21 16:12:16 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-02-21 16:12:16 -0800
commite4acd96aa312f706d157c29ff33fe16cdafb5e3f (patch)
tree2908961b7c5ee33f72cade06804e475411990846
parentbd26f06e02c735e5f1b5d3aabacd6b1e9cfec441 (diff)
parent1e0b1c30959080f814073069a03838dfea841680 (diff)
Merge "[3/n] Add cache to PackageManager#getActivityInfo usage" into main
-rw-r--r--libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt20
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt28
2 files changed, 40 insertions, 8 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 0e4a6b9fb083..9ea0532f9450 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
@@ -38,6 +38,8 @@ class DesktopModeCompatPolicy(private val context: Context) {
get() = context.getPackageManager()
private val defaultHomePackage: String?
get() = pkgManager.getHomeActivities(ArrayList())?.packageName
+ private val packageInfoCache = mutableMapOf<String, Boolean>()
+
/**
* If the top activity should be exempt from desktop windowing and forced back to fullscreen.
@@ -94,14 +96,16 @@ class DesktopModeCompatPolicy(private val context: Context) {
if (packageName == null) {
return false
}
- return try {
- val packageInfo = pkgManager.getPackageInfo(
- packageName,
- PackageManager.GET_PERMISSIONS
- )
- packageInfo?.requestedPermissions?.contains(SYSTEM_ALERT_WINDOW) == true
- } catch (e: PackageManager.NameNotFoundException) {
- false // Package not found
+ return packageInfoCache.getOrPut(packageName) {
+ try {
+ val packageInfo = pkgManager.getPackageInfo(
+ packageName,
+ PackageManager.GET_PERMISSIONS
+ )
+ packageInfo?.requestedPermissions?.contains(SYSTEM_ALERT_WINDOW) == true
+ } catch (e: PackageManager.NameNotFoundException) {
+ false // Package not found
+ }
}
}
// If the flag is disabled we make this condition neutral.
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 88c6e499b869..5ac680048a7e 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
@@ -46,6 +46,8 @@ import org.mockito.ArgumentMatchers.anyString
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
/**
@@ -111,6 +113,32 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
+ fun testIsTopActivityExemptCachedPermissionCheckIsUsed() {
+ allowOverlayPermission(arrayOf())
+ assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
+ createFreeformTask(/* displayId */ 0)
+ .apply {
+ isActivityStackTransparent = true
+ isTopActivityNoDisplay = false
+ numActivities = 1
+ baseActivity = baseActivityTest
+ }))
+ assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
+ createFreeformTask(/* displayId */ 0)
+ .apply {
+ isActivityStackTransparent = true
+ isTopActivityNoDisplay = false
+ numActivities = 1
+ baseActivity = baseActivityTest
+ }))
+ verify(packageManager, times(1)).getPackageInfo(
+ eq("com.test.dummypackage"),
+ eq(PackageManager.GET_PERMISSIONS)
+ )
+ }
+
+ @Test
fun testIsTopActivityExemptFromDesktopWindowing_noActivitiesInStack() {
assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
createFreeformTask(/* displayId */ 0)