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

Commit 81d11783 authored by Eghosa Ewansiha-Vlachavas's avatar Eghosa Ewansiha-Vlachavas Committed by Android (Google) Code Review
Browse files

Merge changes If43008f3,I6b9cb9e4 into main

* changes:
  [2/n] Include platform signed apps in transparent windowing exemption policy
  [1/n] Add enableModalsFullscreenWithPlatformSignature flag
parents 3c034e12 2392b2c5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -114,6 +114,8 @@ public enum DesktopModeFlags {
    ENABLE_INPUT_LAYER_TRANSITION_FIX(Flags::enableInputLayerTransitionFix, true),
    ENABLE_MINIMIZE_BUTTON(Flags::enableMinimizeButton, true),
    ENABLE_MODALS_FULLSCREEN_WITH_PERMISSIONS(Flags::enableModalsFullscreenWithPermission, true),
    ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE(
            Flags::enableModalsFullscreenWithPlatformSignature, false),
    ENABLE_OPAQUE_BACKGROUND_FOR_TRANSPARENT_WINDOWS(
            Flags::enableOpaqueBackgroundForTransparentWindows, true),
    ENABLE_QUICKSWITCH_DESKTOP_SPLIT_BUGFIX(Flags::enableQuickswitchDesktopSplitBugfix, true),
+11 −0
Original line number Diff line number Diff line
@@ -26,6 +26,17 @@ flag {
    }
}

flag {
    name: "enable_modals_fullscreen_with_platform_signature"
    namespace: "lse_desktop_experience"
    description: "Uses platform signature to understand if modal fullscreen is allowed for /n"
                 "transparent activities."
    bug: "407759199"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "inherit_task_bounds_for_trampoline_task_launches"
    namespace: "lse_desktop_experience"
+39 −34
Original line number Diff line number Diff line
@@ -43,36 +43,33 @@ class DesktopModeCompatPolicy(private val context: Context) {

    /**
     * If the top activity should be exempt from desktop windowing and forced back to fullscreen.
     * Currently includes all system ui, default home and transparent stack activities. However if
     * the top activity is not being displayed, regardless of its configuration, we will not exempt
     * it as to remain in the desktop windowing environment.
     * Currently includes all system ui, default home and transparent stack activities with the
     * relevant permission or signature. However if the top activity is not being displayed,
     * regardless of its configuration, we will not exempt it as to remain in the desktop windowing
     * environment.
     */
    fun isTopActivityExemptFromDesktopWindowing(task: TaskInfo) =
        isTopActivityExemptFromDesktopWindowing(task.baseActivity?.packageName,
            task.numActivities, task.isTopActivityNoDisplay, task.isActivityStackTransparent,
            task.userId)
    fun isTopActivityExemptFromDesktopWindowing(task: TaskInfo): Boolean {
        val packageName = task.baseActivity?.packageName ?: return false

    private fun isTopActivityExemptFromDesktopWindowing(
        packageName: String?,
        numActivities: Int,
        isTopActivityNoDisplay: Boolean,
        isActivityStackTransparent: Boolean,
        userId: Int
    ) = when {
        return when {
            !DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue -> false
            // If activity is not being displayed, window mode change has no visual affect so leave
            // unchanged.
        isTopActivityNoDisplay -> false
            task.isTopActivityNoDisplay -> false
            // If activity belongs to system ui package, safe to force out of desktop.
            isSystemUiTask(packageName) -> true
            // If activity belongs to default home package, safe to force out of desktop.
            isPartOfDefaultHomePackageOrNoHomeAvailable(packageName) -> true
        // If all activities in task stack are transparent AND package has the relevant fullscreen
        // transparent permission, safe to force out of desktop.
        isTransparentTask(isActivityStackTransparent, numActivities) &&
                hasFullscreenTransparentPermission(packageName, userId) -> true
            // If all activities in task stack are transparent AND package has the relevant
            // fullscreen transparent permission OR is signed with platform key, safe to force out
            // of desktop.
            isTransparentTask(task.isActivityStackTransparent, task.numActivities) &&
                    (hasFullscreenTransparentPermission(packageName, task.userId) ||
                            hasPlatformSignature(task)) -> true

            else -> false
        }
    }

    fun shouldDisableDesktopEntryPoints(task: TaskInfo) = shouldDisableDesktopEntryPoints(
        task.baseActivity?.packageName, task.numActivities, task.isTopActivityNoDisplay,
@@ -117,11 +114,8 @@ 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?, userId: Int): 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("$userId@$packageName") {
                try {
                    val packageInfo = pkgManager.getPackageInfoAsUser(
@@ -135,8 +129,19 @@ class DesktopModeCompatPolicy(private val context: Context) {
                }
            }
        }
        // If the flag is disabled we make this condition neutral.
        return true
        // If the ENABLE_MODALS_FULLSCREEN_WITH_PERMISSIONS flag is disabled, make neutral condition
        // dependant on the ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE flag.
        return !DesktopModeFlags.ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE.isTrue
    }

    // Checks if the app is signed with the platform signature.
    private fun hasPlatformSignature(task: TaskInfo): Boolean {
        if (DesktopModeFlags.ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE.isTrue) {
            return task.topActivityInfo?.applicationInfo?.isSignedWithPlatformKey ?: false
        }
        // If the ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE flag is disabled, make neutral
        // condition dependant on the ENABLE_MODALS_FULLSCREEN_WITH_PERMISSIONS flag.
        return !DesktopModeFlags.ENABLE_MODALS_FULLSCREEN_WITH_PERMISSIONS.isTrue
    }

    /**
+15 −3
Original line number Diff line number Diff line
@@ -4666,7 +4666,10 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    @DisableFlags(
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION,
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE,
    )
    fun handleRequest_topActivityTransparentWithDisplay_returnSwitchToFullscreenWCT() {
        val freeformTask = setUpFreeformTask()
        markTaskVisible(freeformTask)
@@ -4676,6 +4679,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
                isActivityStackTransparent = true
                isTopActivityNoDisplay = false
                numActivities = 1
                baseActivity = ComponentName(/* pkg= */ "", /* cls= */ "")
            }

        val result = controller.handleRequest(Binder(), createTransition(task))
@@ -4690,6 +4694,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
    )
    @DisableFlags(
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION,
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE,
        Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND,
    )
    fun handleRequest_topActivityTransparentWithDisplay_savedToDesktopRepository() {
@@ -4701,6 +4706,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
                isActivityStackTransparent = true
                isTopActivityNoDisplay = false
                numActivities = 1
                baseActivity = ComponentName(/* pkg= */ "", /* cls= */ "")
            }

        controller.handleRequest(Binder(), createTransition(transparentTask))
@@ -4713,7 +4719,10 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
        Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY,
        Flags.FLAG_INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC,
    )
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    @DisableFlags(
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION,
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE,
    )
    fun handleRequest_desktopNotShowing_topTransparentFullscreenTask_notSavedToDesktopRepository() {
        val task = setUpFullscreenTask(displayId = DEFAULT_DISPLAY)

@@ -5084,7 +5093,10 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    @DisableFlags(
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION,
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE,
    )
    fun handleRequest_closeTransition_singleTaskNoToken_secondaryDisplay_launchesHome() {
        taskRepository.addDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
        taskRepository.setActiveDesk(displayId = SECOND_DISPLAY, deskId = SECOND_DISPLAY)
+41 −1
Original line number Diff line number Diff line
@@ -74,7 +74,8 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
    }

    @Test
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION,
        Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE)
    fun testIsTopActivityExemptFromDesktopWindowing_onlyTransparentActivitiesInStack() {
        assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
@@ -86,6 +87,44 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
                    }))
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE)
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    fun testIsTopActivityExemptWithPlatformSignature_onlyTransparentActivitiesInStack() {
        assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
                .apply {
                    isActivityStackTransparent = true
                    isTopActivityNoDisplay = false
                    numActivities = 1
                    topActivityInfo = ActivityInfo().apply {
                        applicationInfo = ApplicationInfo().apply {
                            privateFlags = ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY
                        }
                    }
                    baseActivity = baseActivityTest
                }))
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PLATFORM_SIGNATURE)
    @DisableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    fun testIsTopActivityExemptWithoutPlatformSignature_onlyTransparentActivitiesInStack() {
        assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
                .apply {
                    isActivityStackTransparent = true
                    isTopActivityNoDisplay = false
                    numActivities = 1
                    topActivityInfo = ActivityInfo().apply {
                        applicationInfo = ApplicationInfo().apply {
                            privateFlags = 0
                        }
                    }
                    baseActivity = baseActivityTest
                }))
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION)
    fun testIsTopActivityExemptWithPermission_onlyTransparentActivitiesInStack() {
@@ -245,6 +284,7 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
        assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask(/* displayId */ 0)
                .apply {
                    baseActivity = baseActivityTest
                    isTopActivityNoDisplay = false
                }))
    }