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

Commit 33ab8691 authored by Andrii Kulian's avatar Andrii Kulian
Browse files

Set parent for WindowProcessController

If WindowProcessController was registered to display configuration
changes, then an override from display level can erase some of the
configuration fields. This can result in incomplete configuration.
Since process configuration is used as a "global" config in some
places, it should always be complete and contain all fields.

This CL uses ActivityRootContainer as parent for a
WindowProcessController, so any overrides should be applied on top
of global configuration and the resulting full config will always be
complete.

Bug: 131915789
Test: WindowProcessControllerTests#testConfigurationForSecondaryScreen
Change-Id: Id4d30ec9fc64dbdf3f31347240f6bb3cbd655fb2
parent a7423ca9
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -439,7 +439,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio

    @Override
    protected ConfigurationContainer getParent() {
        return null;
        // Returning RootActivityContainer as the parent, so that this process controller always
        // has full configuration and overrides (e.g. from display) are always added on top of
        // global config.
        return mAtm.mRootActivityContainer;
    }

    @HotPath(caller = HotPath.PROCESS_CHANGE)
+1 −1
Original line number Diff line number Diff line
@@ -3103,7 +3103,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
            if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, "Reporting new frame to " + this
                    + ": " + mWindowFrames.mCompatFrame);
            final MergedConfiguration mergedConfiguration =
                    new MergedConfiguration(mWmService.mRoot.getConfiguration(),
                    new MergedConfiguration(getProcessGlobalConfiguration(),
                    getMergedOverrideConfiguration());

            setLastReportedMergedConfiguration(mergedConfiguration);
+22 −0
Original line number Diff line number Diff line
@@ -26,7 +26,9 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;

import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
import android.platform.test.annotations.Presubmit;
import android.view.DisplayInfo;

import org.junit.Test;

@@ -78,6 +80,26 @@ public class WindowProcessControllerTests extends ActivityTestsBase {
        assertEquals(INVALID_DISPLAY, wpc.getDisplayId());
    }

    @Test
    public void testConfigurationForSecondaryScreen() {
        final WindowProcessController wpc = new WindowProcessController(
                mService, mock(ApplicationInfo.class), null, 0, -1, null, null);
        //By default, the process should not listen to any display.
        assertEquals(INVALID_DISPLAY, wpc.getDisplayId());

        // Register to a new display as a listener.
        final DisplayInfo info = new DisplayInfo();
        info.logicalWidth = 100;
        info.logicalHeight = 100;
        TestActivityDisplay display = addNewActivityDisplayAt(info, WindowContainer.POSITION_TOP);
        wpc.registerDisplayConfigurationListenerLocked(display);

        assertEquals(display.mDisplayId, wpc.getDisplayId());
        final Configuration expectedConfig = mService.mRootActivityContainer.getConfiguration();
        expectedConfig.updateFrom(display.getConfiguration());
        assertEquals(expectedConfig, wpc.getConfiguration());
    }

    private TestActivityDisplay createTestActivityDisplayInContainer() {
        final TestActivityDisplay testActivityDisplay = createNewActivityDisplay();
        mRootActivityContainer.addChild(testActivityDisplay, POSITION_TOP);