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

Commit 143a47bf authored by Vania Desmonda's avatar Vania Desmonda
Browse files

Retain the last merged config to the requested override config for PiP.

Avoid propagating config changes for CONFIG_TOUCHSCREEN,
CONFIG_COLORMODE and CONFIG_DENSITY since apps are known to be destroyed
and restarted on these config changes and they affect PiP quality on
transferring PiP across displays.

Test: atest ActivityRecordTests
Flag: com.android.window.flags.enable_dragging_pip_across_displays
Fixes: 422565128
Change-Id: I824ab315dbefd2b9a2a5d4ffc7b930586aba1b73
parent 45a5ba0b
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -155,6 +155,7 @@ import static android.view.WindowManager.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENAB
import static android.view.WindowManager.PROPERTY_ALLOW_UNTRUSTED_ACTIVITY_EMBEDDING_STATE_SHARING;
import static android.view.WindowManager.TRANSIT_RELAUNCH;
import static android.view.WindowManager.hasWindowExtensionsEnabled;
import static android.window.DesktopExperienceFlags.ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS;
import static android.window.DesktopExperienceFlags.ENABLE_PIP_PARAMS_UPDATE_NOTIFICATION_BUGFIX;
import static android.window.DesktopExperienceFlags.ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS;
import static android.window.TransitionInfo.FLAGS_IS_OCCLUDED_NO_ANIMATION;
@@ -7525,6 +7526,24 @@ final class ActivityRecord extends WindowToken {
                && newParentConfiguration.assetsSeq > requestedOverrideConfig.assetsSeq) {
            requestedOverrideConfig.assetsSeq = ASSETS_SEQ_UNDEFINED;
        }

        // Retain the following configs for PiP so that the activity doesn't get destroyed and
        // recreated on display transfer.
        if (ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS.isTrue() && inPinnedWindowingMode()) {
            final Configuration lastReportedMergedConfig =
                    mLastReportedConfiguration.getMergedConfiguration();
            int configChanges = info.getRealConfigChanged();
            if ((configChanges & ActivityInfo.CONFIG_COLOR_MODE) == 0) {
                requestedOverrideConfig.colorMode = lastReportedMergedConfig.colorMode;
            }
            if ((configChanges & ActivityInfo.CONFIG_TOUCHSCREEN) == 0) {
                requestedOverrideConfig.touchscreen = lastReportedMergedConfig.touchscreen;
            }
            if ((configChanges & ActivityInfo.CONFIG_DENSITY) == 0) {
                requestedOverrideConfig.densityDpi = lastReportedMergedConfig.densityDpi;
            }
        }

        super.resolveOverrideConfiguration(newParentConfiguration);
        final Configuration resolvedConfig = getResolvedOverrideConfiguration();

+75 −0
Original line number Diff line number Diff line
@@ -23,10 +23,13 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.content.pm.ActivityInfo.CONFIG_COLOR_MODE;
import static android.content.pm.ActivityInfo.CONFIG_DENSITY;
import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
import static android.content.pm.ActivityInfo.CONFIG_SCREEN_LAYOUT;
import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.CONFIG_TOUCHSCREEN;
import static android.content.pm.ActivityInfo.FLAG_SUPPORTS_PICTURE_IN_PICTURE;
import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS;
import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT;
@@ -44,8 +47,12 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.pm.ApplicationInfo.CATEGORY_GAME;
import static android.content.pm.ApplicationInfo.CATEGORY_SOCIAL;
import static android.content.res.Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_NO;
import static android.content.res.Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_YES;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.content.res.Configuration.TOUCHSCREEN_FINGER;
import static android.content.res.Configuration.TOUCHSCREEN_NOTOUCH;
import static android.content.res.Configuration.UI_MODE_TYPE_DESK;
import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
import static android.os.Process.NOBODY_UID;
@@ -3546,6 +3553,74 @@ public class ActivityRecordTests extends WindowTestsBase {
        assertTrue(appWindow.mResizeReported);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS)
    public void resolveOverrideConfiguration_windowingModePinned_keepsLastReportedConfigs() {
        final ActivityRecord activity = createActivityWithTask();
        activity.setWindowingMode(WINDOWING_MODE_PINNED);
        final Configuration config = new Configuration();
        config.touchscreen = TOUCHSCREEN_FINGER;
        config.densityDpi = 100;
        config.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_NO;
        activity.setLastReportedConfiguration(new Configuration(), config);

        final Configuration newConfig = new Configuration();
        newConfig.touchscreen = TOUCHSCREEN_NOTOUCH;
        newConfig.densityDpi = 200;
        newConfig.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_YES;
        activity.resolveOverrideConfiguration(newConfig);

        assertEquals(activity.getRequestedOverrideConfiguration().touchscreen, config.touchscreen);
        assertEquals(activity.getRequestedOverrideConfiguration().densityDpi, config.densityDpi);
        assertEquals(activity.getRequestedOverrideConfiguration().colorMode, config.colorMode);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS)
    public void resolveOverrideConfiguration_pinnedActivityInfoHasConfigs_updatesOverrideConfigs() {
        final ActivityRecord activity = createActivityWithTask();
        activity.setWindowingMode(WINDOWING_MODE_PINNED);
        final Configuration config = new Configuration();
        config.touchscreen = TOUCHSCREEN_FINGER;
        config.densityDpi = 100;
        config.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_NO;
        activity.setLastReportedConfiguration(new Configuration(), config);
        activity.info.configChanges = CONFIG_TOUCHSCREEN | CONFIG_DENSITY | CONFIG_COLOR_MODE;

        final Configuration newConfig = new Configuration();
        newConfig.touchscreen = TOUCHSCREEN_NOTOUCH;
        newConfig.densityDpi = 200;
        newConfig.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_YES;
        activity.resolveOverrideConfiguration(newConfig);

        assertNotEquals(activity.getRequestedOverrideConfiguration().touchscreen,
                config.touchscreen);
        assertNotEquals(activity.getRequestedOverrideConfiguration().densityDpi, config.densityDpi);
        assertNotEquals(activity.getRequestedOverrideConfiguration().colorMode, config.colorMode);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS)
    public void resolveOverrideConfiguration_windowingModeUndefined_updatesOverrideConfigs() {
        final ActivityRecord activity = createActivityWithTask();
        final Configuration config = new Configuration();
        config.touchscreen = TOUCHSCREEN_FINGER;
        config.densityDpi = 100;
        config.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_NO;
        activity.setLastReportedConfiguration(new Configuration(), config);

        final Configuration newConfig = new Configuration();
        newConfig.touchscreen = TOUCHSCREEN_NOTOUCH;
        newConfig.densityDpi = 200;
        newConfig.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_YES;
        activity.resolveOverrideConfiguration(newConfig);

        assertNotEquals(activity.getRequestedOverrideConfiguration().touchscreen,
                config.touchscreen);
        assertNotEquals(activity.getRequestedOverrideConfiguration().densityDpi, config.densityDpi);
        assertNotEquals(activity.getRequestedOverrideConfiguration().colorMode, config.colorMode);
    }

    private ActivityRecord setupDisplayAndActivityForCameraCompat(boolean isCameraRunning,
            int windowingMode) {
        doReturn(true).when(() -> DesktopModeHelper.canEnterDesktopMode(any()));