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

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

Merge changes from topic "dreamActivityExemption" into main

* changes:
  [1/n] Exempt dream activities from desktop
  [0/n] Create flag for exempting dream activity from desktop
parents 9e8f1d8b f51262ac
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -162,6 +162,8 @@ public enum DesktopExperienceFlags {
    ENABLE_DRAG_END_STABLE_BOUNDS_RESET(Flags::enableDragEndStableBoundsReset, false,
            Flags.FLAG_ENABLE_DRAG_END_STABLE_BOUNDS_RESET),
    ENABLE_DRAG_TO_MAXIMIZE(Flags::enableDragToMaximize, true, Flags.FLAG_ENABLE_DRAG_TO_MAXIMIZE),
    ENABLE_DREAM_ACTIVITY_WINDOWING_EXCLUSION(Flags::enableDreamActivityWindowingExclusion, false,
            Flags.FLAG_ENABLE_DREAM_ACTIVITY_WINDOWING_EXCLUSION),
    ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX(Flags::enableDynamicRadiusComputationBugfix, true,
            Flags.FLAG_ENABLE_DYNAMIC_RADIUS_COMPUTATION_BUGFIX),
    ENABLE_EMPTY_DESK_ON_MINIMIZE(Flags::enableEmptyDeskOnMinimize, true,
+10 −0
Original line number Diff line number Diff line
@@ -884,6 +884,16 @@ flag {
    bug: "383403514"
}

flag {
    name: "enable_dream_activity_windowing_exclusion"
    namespace: "lse_desktop_experience"
    description: "When enabled activities with type dream will be exempt from desktop windowing"
    bug: "414619063"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "enable_dynamic_radius_computation_bugfix"
    namespace: "lse_desktop_experience"
+22 −6
Original line number Diff line number Diff line
@@ -16,10 +16,13 @@

package com.android.internal.policy;

import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;

import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.TaskInfo;
import android.app.WindowConfiguration;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
@@ -88,12 +91,12 @@ public class DesktopModeCompatPolicy {

    /**
     * @see #isTopActivityExemptFromDesktopWindowing(ComponentName, boolean, boolean, int, int,
     * ActivityInfo)
     * ActivityInfo, int)
     */
    public boolean isTopActivityExemptFromDesktopWindowing(@NonNull TaskInfo task) {
        return isTopActivityExemptFromDesktopWindowing(task.baseActivity,
                task.isTopActivityNoDisplay, task.isActivityStackTransparent, task.numActivities,
                task.userId, task.topActivityInfo);
                task.userId, task.topActivityInfo, task.topActivityType);
    }

    /**
@@ -105,7 +108,7 @@ public class DesktopModeCompatPolicy {
     */
    public boolean isTopActivityExemptFromDesktopWindowing(@Nullable ComponentName baseActivity,
            boolean isTopActivityNoDisplay, boolean isActivityStackTransparent, int numActivities,
            int userId, ActivityInfo info) {
            int userId, ActivityInfo info, @WindowConfiguration.ActivityType int topActivityType) {
        final String packageName = baseActivity != null ? baseActivity.getPackageName() : null;
        if (packageName == null) {
            return false;
@@ -119,6 +122,11 @@ public class DesktopModeCompatPolicy {
        if (isTopActivityNoDisplay) {
            return false;
        }
        // Dream activities should be fullscreen and thus should be forced out of desktop.
        if (DesktopExperienceFlags.ENABLE_DREAM_ACTIVITY_WINDOWING_EXCLUSION.isTrue()
                && topActivityType == ACTIVITY_TYPE_DREAM) {
            return true;
        }
        // TODO: b/434943016 - Replace with permission.
        // If activity belongs to package exempt via device config, force out of desktop.
        if (isPackageExemptViaConfig(packageName) && !isActivityStackTransparent) {
@@ -140,7 +148,7 @@ public class DesktopModeCompatPolicy {
                || hasPlatformSignature(info));
    }

    /** @see #shouldDisableDesktopEntryPoints(String, int, boolean, boolean) */
    /** @see #shouldDisableDesktopEntryPoints(String, int, boolean, boolean, int) */
    public boolean shouldDisableDesktopEntryPoints(@NonNull TaskInfo task) {
        final String packageName = task.baseActivity != null ? task.baseActivity.getPackageName() :
                null;
@@ -148,7 +156,8 @@ public class DesktopModeCompatPolicy {
                packageName,
                task.numActivities,
                task.isTopActivityNoDisplay,
                task.isActivityStackTransparent
                task.isActivityStackTransparent,
                task.topActivityType
        );
    }

@@ -160,11 +169,18 @@ public class DesktopModeCompatPolicy {
            @Nullable String packageName,
            int numActivities,
            boolean isTopActivityNoDisplay,
            boolean isActivityStackTransparent) {
            boolean isActivityStackTransparent,
            @WindowConfiguration.ActivityType int topActivityType
    ) {
        // Activity will not be displayed, no need to show desktop entry point.
        if (isTopActivityNoDisplay) {
            return true;
        }
        // Dream activities should be fullscreen and thus not allowed to enter desktop.
        if (DesktopExperienceFlags.ENABLE_DREAM_ACTIVITY_WINDOWING_EXCLUSION.isTrue()
                && topActivityType == ACTIVITY_TYPE_DREAM) {
            return true;
        }
        // If activity belongs to system ui package, hide desktop entry point.
        if (isSystemUiTask(packageName)) {
            return true;
+23 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.wm.shell.shared.desktopmode

import android.Manifest.permission.SYSTEM_ALERT_WINDOW
import android.app.TaskInfo
import android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM
import android.compat.testing.PlatformCompatChangeRule
import android.content.ComponentName
import android.content.pm.ActivityInfo
@@ -322,6 +323,17 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
                }))
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DREAM_ACTIVITY_WINDOWING_EXCLUSION)
    fun testIsTopActivityExemptFromDesktopWindowing_dreamActivity() {
        assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
            createFreeformTask()
                .apply {
                    baseActivity = baseActivityTest
                    topActivityType = ACTIVITY_TYPE_DREAM
                }))
    }

    @Test
    fun testShouldDisableDesktopEntryPoints_noDisplayActivity() {
        assertTrue(desktopModeCompatPolicy.shouldDisableDesktopEntryPoints(
@@ -382,6 +394,17 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
                }))
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DREAM_ACTIVITY_WINDOWING_EXCLUSION)
    fun testShouldDisableDesktopEntryPoints_dreamActivity() {
        assertTrue(desktopModeCompatPolicy.shouldDisableDesktopEntryPoints(
            createFreeformTask()
                .apply {
                    baseActivity = baseActivityTest
                    topActivityType = ACTIVITY_TYPE_DREAM
                }))
    }

    @Test
    @EnableFlags(Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS)
    @DisableCompatChanges(ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED)
+12 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static com.android.wm.shell.shared.split.SplitScreenConstants.CONTROLLED_
import android.app.ActivityManager;
import android.app.ActivityManager.TaskDescription;
import android.app.TaskInfo;
import android.app.WindowConfiguration;
import android.content.ComponentName;
import android.content.Intent;
import android.graphics.Point;
@@ -90,6 +91,10 @@ public class Task {
         * Whether fillsParent() is false for every activity in the tasks stack.
         */
        public boolean isActivityStackTransparent;
        /**
         * The type of the top most activity.
         */
        public @WindowConfiguration.ActivityType int topActivityType;

        // The source component name which started this task
        public final ComponentName sourceComponent;
@@ -113,6 +118,7 @@ public class Task {
            this.numActivities = t.numActivities;
            this.isTopActivityNoDisplay = t.isTopActivityNoDisplay;
            this.isActivityStackTransparent = t.isActivityStackTransparent;
            this.topActivityType = t.topActivityType;
            updateHashCode();
        }

@@ -131,7 +137,8 @@ public class Task {
        public TaskKey(int id, int windowingMode, @NonNull Intent intent,
                ComponentName sourceComponent, int userId, long lastActiveTime, int displayId,
                @Nullable ComponentName baseActivity, int numActivities,
                boolean isTopActivityNoDisplay, boolean isActivityStackTransparent) {
                boolean isTopActivityNoDisplay, boolean isActivityStackTransparent,
                @WindowConfiguration.ActivityType int topActivityType) {
            this.id = id;
            this.windowingMode = windowingMode;
            this.baseIntent = intent;
@@ -143,6 +150,7 @@ public class Task {
            this.numActivities = numActivities;
            this.isTopActivityNoDisplay = isTopActivityNoDisplay;
            this.isActivityStackTransparent = isActivityStackTransparent;
            this.topActivityType = topActivityType;
            updateHashCode();
        }

@@ -218,6 +226,7 @@ public class Task {
            parcel.writeInt(numActivities);
            parcel.writeBoolean(isTopActivityNoDisplay);
            parcel.writeBoolean(isActivityStackTransparent);
            parcel.writeInt(topActivityType);
        }

        private static TaskKey readFromParcel(Parcel parcel) {
@@ -232,10 +241,11 @@ public class Task {
            int numActivities = parcel.readInt();
            boolean isTopActivityNoDisplay = parcel.readBoolean();
            boolean isActivityStackTransparent = parcel.readBoolean();
            int topActivityType = parcel.readInt();

            return new TaskKey(id, windowingMode, baseIntent, sourceComponent, userId,
                    lastActiveTime, displayId, baseActivity, numActivities, isTopActivityNoDisplay,
                    isActivityStackTransparent);
                    isActivityStackTransparent, topActivityType);
        }

        @Override
Loading