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

Commit 4597b277 authored by Eghosa Ewansiha-Vlachavas's avatar Eghosa Ewansiha-Vlachavas
Browse files

Handle incompatible activity given null task in DMLPM

If no task is present during the calculation of the launch params in
DesktopModeLaunchParamsModifier, use available information about the
launching activity to determine incompatability. This prevents the
freeform windowing mode from being applied prematurely and needing
re-parenting down the line if the launching task and activity is
incompatible.

Flag: com.android.window.flags.handle_incompatible_tasks_in_desktop_launch_params
Fixes: 424100970
Test: atest WmTests:DesktopModeLaunchParamsModifierTests
Change-Id: I29efa9007a64209561039c3c7b99d7b6bfea4e7b
parent 2cbbe4a1
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -110,6 +110,17 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier {
        if (ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS.isTrue() && task == null
                && (isRequestingFreeformWindowMode(null, options, currentParams)
                || inDesktopMode)) {
            if (DesktopExperienceFlags.HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS.isTrue()
                    && activity != null) {
                if (mDesktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
                        activity.mActivityComponent, activity.isNoDisplay(),
                        !activity.occludesParent(), /* numActivities */ 1, activity.mUserId,
                        activity.info)) {
                    appendLog("activity exempt from desktop, launching in fullscreen");
                    outParams.mWindowingMode = WINDOWING_MODE_FULLSCREEN;
                    return RESULT_DONE;
                }
            }
            if (options != null) {
                final int windowingMode = options.getLaunchWindowingMode();
                if (windowingMode == WINDOWING_MODE_FREEFORM) {
+90 −0
Original line number Diff line number Diff line
@@ -196,6 +196,28 @@ public class DesktopModeLaunchParamsModifierTests extends
                new CalculateRequestBuilder().setTask(task).setOptions(options).calculate());
    }

    @Test
    @EnableFlags({Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS,
            Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS})
    public void testHomeActivitiesForcedToFullscreenWithoutTask() {
        setupDesktopModeLaunchParamsModifier();

        final DisplayContent display = createDisplayContent(ORIENTATION_LANDSCAPE,
                LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM);

        final ActivityOptions options = ActivityOptions.makeBasic();
        options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
        options.setLaunchDisplayId(display.mDisplayId);
        final Task task = new TaskBuilder(mSupervisor).build();
        final ActivityRecord activity = createActivity(display, SCREEN_ORIENTATION_PORTRAIT,
                task, /* ignoreOrientationRequest */ true, /* isResizeable */ false,
                HOME_ACTIVITIES);

        assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions(options)
                .setActivity(activity).calculate());
        assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
    }

    @Test
    @EnableFlags(Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS)
    public void testHomeActivitiesForcedToFullscreen() {
@@ -213,6 +235,30 @@ public class DesktopModeLaunchParamsModifierTests extends
        assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
    }

    @Test
    @EnableFlags({Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS,
            Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS})
    public void testSystemUIActivitiesForcedToFullscreenWithoutTask() {
        setupDesktopModeLaunchParamsModifier();

        final DisplayContent display = createDisplayContent(ORIENTATION_LANDSCAPE,
                LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM);

        final ActivityOptions options = ActivityOptions.makeBasic();
        options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
        options.setLaunchDisplayId(display.mDisplayId);
        final Task task = new TaskBuilder(mSupervisor).build();
        final ComponentName sysUiComponent = new ComponentName(
                mContext.getResources().getString(R.string.config_systemUi), "");
        final ActivityRecord activity = createActivity(display, SCREEN_ORIENTATION_PORTRAIT,
                task, /* ignoreOrientationRequest */ true, /* isResizeable */ false,
                sysUiComponent);

        assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null)
                .setOptions(options).setActivity(activity).calculate());
        assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
    }

    @Test
    @EnableFlags(Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS)
    public void testSystemUIActivitiesForcedToFullscreen() {
@@ -232,6 +278,28 @@ public class DesktopModeLaunchParamsModifierTests extends
        assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
    }

    @Test
    @EnableFlags({Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS,
            Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS})
    public void testTransparentActivitiesWithPlatformSignatureForcedToFullscreenWithoutTask() {
        setupDesktopModeLaunchParamsModifier();

        final DisplayContent display = createDisplayContent(ORIENTATION_LANDSCAPE,
                LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM);

        final ActivityOptions options = ActivityOptions.makeBasic();
        options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
        options.setLaunchDisplayId(display.mDisplayId);
        mActivity.setOccludesParent(false);
        mActivity.info.applicationInfo = new ApplicationInfo();
        mActivity.info.applicationInfo.privateFlags =
                ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY;

        assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions(options)
                .calculate());
        assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
    }

    @Test
    @EnableFlags(Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS)
    public void testTransparentActivitiesWithPlatformSignatureForcedToFullscreen() {
@@ -249,6 +317,28 @@ public class DesktopModeLaunchParamsModifierTests extends
        assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
    }

    @Test
    @EnableFlags({Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS,
            Flags.FLAG_ENABLE_FREEFORM_DISPLAY_LAUNCH_PARAMS})
    public void testTransparentActivitiesWithPermissionForcedToFullscreenWithoutTask()
            throws PackageManager.NameNotFoundException {
        setupDesktopModeLaunchParamsModifier();

        final DisplayContent display = createDisplayContent(ORIENTATION_LANDSCAPE,
                LANDSCAPE_DISPLAY_BOUNDS, WINDOWING_MODE_FREEFORM);

        final ActivityOptions options = ActivityOptions.makeBasic();
        options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
        options.setLaunchDisplayId(display.mDisplayId);
        mActivity.setOccludesParent(false);
        allowOverlayPermissionForAllUsers(
                new String[]{android.Manifest.permission.SYSTEM_ALERT_WINDOW});

        assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(null).setOptions(options)
                .calculate());
        assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode);
    }

    @Test
    @EnableFlags(Flags.FLAG_HANDLE_INCOMPATIBLE_TASKS_IN_DESKTOP_LAUNCH_PARAMS)
    public void testTransparentActivitiesWithPermissionForcedToFullscreen()