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

Commit f324936f authored by Vania Desmonda's avatar Vania Desmonda
Browse files

Retain previous configs if current and new windowing modes are pinned.

Update the COLOR_MODE, TOUCHSCREEN and DENSITY configs with the new
parent configs if it's exiting PiP, for example, by expanding. So that
the app gets updated with the correct display configs when it exits PiP.

Test: atest ActivityRecordTests
Flag: com.android.window.flags.enable_dragging_pip_across_displays
Fixes: 431280403
Change-Id: Ic4e62f407f47a12efc29cec31d1ab2f5b6026487
parent 55d0ea08
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -210,6 +210,7 @@ public class PipDisplayLayoutState {
        pw.println(prefix + TAG);
        pw.println(innerPrefix + "mDisplayId=" + mDisplayId);
        pw.println(innerPrefix + "getDisplayBounds=" + getDisplayBounds());
        pw.println(innerPrefix + "getDisplayLayout#densityDpi=" + getDisplayLayout().densityDpi());
        pw.println(innerPrefix + "mScreenEdgeInsets=" + mScreenEdgeInsets);
        pw.println(innerPrefix + "mNavigationBarsInsets=" + mNavigationBarsInsets);
    }
+3 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import android.app.PictureInPictureParams;
import android.app.TaskInfo;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.SystemProperties;
@@ -132,6 +133,7 @@ public class PipScheduler implements PipTransitionState.PipTransitionStateChange
        // final expanded bounds to be inherited from the parent
        wct.setBounds(pipTaskToken, null);
        wct.setWindowingMode(pipTaskToken, mPipDesktopState.getOutPipWindowingMode());
        wct.setDensityDpi(pipTaskToken, Configuration.DENSITY_DPI_UNDEFINED);

        final TaskInfo pipTaskInfo = mPipTransitionState.getPipTaskInfo();
        mDesktopPipTransitionController.ifPresent(c -> {
@@ -162,7 +164,7 @@ public class PipScheduler implements PipTransitionState.PipTransitionStateChange
        }

        wct.reparent(pipToken, displayAreaInfo.token, true);
        wct.setDensityDpi(pipToken, displayAreaInfo.configuration.densityDpi);
        wct.setDensityDpi(pipToken, Configuration.DENSITY_DPI_UNDEFINED);
        return wct;
    }

+21 −13
Original line number Diff line number Diff line
@@ -7604,9 +7604,11 @@ final class ActivityRecord extends WindowToken {
            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()) {
            // Retain the following configs for PiP so that the activity doesn't get destroyed and
            // recreated on display transfer while still remaining in PiP.
            if (newParentConfiguration.windowConfiguration.getWindowingMode()
                    == WINDOWING_MODE_PINNED) {
                final Configuration lastReportedMergedConfig =
                        mLastReportedConfiguration.getMergedConfiguration();
                int configChanges = info.getRealConfigChanged();
@@ -7619,6 +7621,12 @@ final class ActivityRecord extends WindowToken {
                if ((configChanges & ActivityInfo.CONFIG_DENSITY) == 0) {
                    requestedOverrideConfig.densityDpi = lastReportedMergedConfig.densityDpi;
                }
            } else {
                // Update the configs if we're exiting PiP mode.
                requestedOverrideConfig.colorMode = newParentConfiguration.colorMode;
                requestedOverrideConfig.touchscreen = newParentConfiguration.touchscreen;
                requestedOverrideConfig.densityDpi = newParentConfiguration.densityDpi;
            }
        }

        super.resolveOverrideConfiguration(newParentConfiguration);
+26 −0
Original line number Diff line number Diff line
@@ -3608,6 +3608,7 @@ public class ActivityRecordTests extends WindowTestsBase {
        activity.setLastReportedConfiguration(new Configuration(), config);

        final Configuration newConfig = new Configuration();
        newConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_PINNED);
        newConfig.touchscreen = TOUCHSCREEN_NOTOUCH;
        newConfig.densityDpi = 200;
        newConfig.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_YES;
@@ -3631,6 +3632,7 @@ public class ActivityRecordTests extends WindowTestsBase {
        activity.info.configChanges = CONFIG_TOUCHSCREEN | CONFIG_DENSITY | CONFIG_COLOR_MODE;

        final Configuration newConfig = new Configuration();
        newConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_PINNED);
        newConfig.touchscreen = TOUCHSCREEN_NOTOUCH;
        newConfig.densityDpi = 200;
        newConfig.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_YES;
@@ -3664,6 +3666,30 @@ public class ActivityRecordTests extends WindowTestsBase {
        assertNotEquals(activity.getRequestedOverrideConfiguration().colorMode, config.colorMode);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DRAGGING_PIP_ACROSS_DISPLAYS)
    public void resolveOverrideConfiguration_inPinnedMode_newConfigFullscreen_updatesConfigs() {
        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.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
        newConfig.touchscreen = TOUCHSCREEN_NOTOUCH;
        newConfig.densityDpi = 200;
        newConfig.colorMode = COLOR_MODE_WIDE_COLOR_GAMUT_YES;
        activity.resolveOverrideConfiguration(newConfig);

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

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