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

Commit 083631bf authored by Piotr Wilczyński's avatar Piotr Wilczyński Committed by Lingyu Feng
Browse files

WM callback to add/remove display in topology

This internal method allows Window Manager to inform Display Manager that a display should or should not be in the topology.

Remove the display group requirement in isDisplayAllowedInTopology() - in DisplayManagerServiceTest, external displays are initialized to not be in the default display group. Also, now we do want displays from multiple power groups to be in the topology.

Bug: 384013689
Flag: com.android.server.display.feature.flags.display_topology
Test: DisplayManagerServiceTest, DisplayTopologyCoordinatorTest
Change-Id: I4b1d63a4f15ed5eee48eec0889c8aaeb7621c989
parent 1c72035d
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -475,6 +475,16 @@ public abstract class DisplayManagerInternal {
     */
    public abstract boolean isDisplayReadyForMirroring(int displayId);

    /**
     * Called by {@link com.android.server.wm.WindowManagerService} to notify whether a display
     * should be in the topology.
     * @param displayId The logical ID of the display
     * @param inTopology Whether the display should be in the topology. This being true does not
     *                   guarantee that the display will be in the topology - Display Manager might
     *                   also check other parameters.
     */
    public abstract void onDisplayBelongToTopologyChanged(int displayId, boolean inTopology);

    /**
     * Called by {@link  com.android.server.display.DisplayBackupHelper} when backup files were
     * restored and are ready to be reloaded.
+16 −1
Original line number Diff line number Diff line
@@ -2442,7 +2442,10 @@ public final class DisplayManagerService extends SystemService {
            applyDisplayChangedLocked(display);
        }

        if (mDisplayTopologyCoordinator != null) {
        // The default display should always be added to the topology. Other displays will be added
        // upon calling onDisplayBelongToTopologyChanged().
        if (mDisplayTopologyCoordinator != null
                && display.getDisplayIdLocked() == Display.DEFAULT_DISPLAY) {
            mDisplayTopologyCoordinator.onDisplayAdded(display.getDisplayInfoLocked());
        }
    }
@@ -6036,6 +6039,18 @@ public final class DisplayManagerService extends SystemService {
            return mExternalDisplayPolicy.isDisplayReadyForMirroring(displayId);
        }

        @Override
        public void onDisplayBelongToTopologyChanged(int displayId, boolean inTopology) {
            if (mDisplayTopologyCoordinator == null) {
                return;
            }
            if (inTopology) {
                mDisplayTopologyCoordinator.onDisplayAdded(getDisplayInfo(displayId));
            } else {
                mDisplayTopologyCoordinator.onDisplayRemoved(displayId);
            }
        }

        @Override
        public void reloadTopologies(final int userId) {
            // Reload topologies only if the userId matches the current user id.
+0 −5
Original line number Diff line number Diff line
@@ -267,11 +267,6 @@ class DisplayTopologyCoordinator {
                    + "type is EXTERNAL or OVERLAY and !mIsExtendedDisplayEnabled");
            return false;
        }
        if (info.displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
            Slog.d(TAG, "Display " + info.displayId + " not allowed in topology because "
                    + "it is not in the default display group");
            return false;
        }
        return true;
    }

+14 −6
Original line number Diff line number Diff line
@@ -3914,6 +3914,7 @@ public class DisplayManagerServiceTest {
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService.BinderService displayManagerBinderService =
                displayManager.new BinderService();
        DisplayManagerInternal localService = displayManager.new LocalService();
        Handler handler = displayManager.getDisplayHandler();
        waitForIdleHandler(handler);

@@ -3922,8 +3923,8 @@ public class DisplayManagerServiceTest {
                INTERNAL_EVENT_FLAG_TOPOLOGY_UPDATED);
        waitForIdleHandler(handler);

        var topology = initDisplayTopology(displayManager, displayManagerBinderService, callback,
                handler, /*shouldEmitTopologyChangeEvent=*/ true);
        var topology = initDisplayTopology(displayManager, displayManagerBinderService,
                localService, callback, handler, /*shouldEmitTopologyChangeEvent=*/ true);
        callback.clear();
        callback.expectsEvent(TOPOLOGY_CHANGED_EVENT);
        displayManagerBinderService.setDisplayTopology(topology);
@@ -3938,6 +3939,7 @@ public class DisplayManagerServiceTest {
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService.BinderService displayManagerBinderService =
                displayManager.new BinderService();
        DisplayManagerInternal localService = displayManager.new LocalService();
        Handler handler = displayManager.getDisplayHandler();
        waitForIdleHandler(handler);

@@ -3947,8 +3949,8 @@ public class DisplayManagerServiceTest {
                STANDARD_DISPLAY_EVENTS);
        waitForIdleHandler(handler);

        var topology = initDisplayTopology(displayManager, displayManagerBinderService, callback,
                handler, /*shouldEmitTopologyChangeEvent=*/ false);
        var topology = initDisplayTopology(displayManager, displayManagerBinderService,
                localService, callback, handler, /*shouldEmitTopologyChangeEvent=*/ false);
        callback.clear();
        callback.expectsEvent(TOPOLOGY_CHANGED_EVENT); // should not happen
        displayManagerBinderService.setDisplayTopology(topology);
@@ -4706,15 +4708,16 @@ public class DisplayManagerServiceTest {

    private DisplayTopology initDisplayTopology(DisplayManagerService displayManager,
            DisplayManagerService.BinderService displayManagerBinderService,
            FakeDisplayManagerCallback callback,
            DisplayManagerInternal localService, FakeDisplayManagerCallback callback,
            Handler handler, boolean shouldEmitTopologyChangeEvent) {
        Settings.Global.putInt(mContext.getContentResolver(),
                DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 1);
        callback.expectsEvent(TOPOLOGY_CHANGED_EVENT);
        FakeDisplayDevice displayDevice0 =
                createFakeDisplayDevice(displayManager, new float[]{60f}, Display.TYPE_INTERNAL);
                createFakeDisplayDevice(displayManager, new float[]{60f}, Display.TYPE_EXTERNAL);
        int displayId0 = getDisplayIdForDisplayDevice(displayManager, displayManagerBinderService,
                displayDevice0);
        waitForIdleHandler(handler);
        if (shouldEmitTopologyChangeEvent) {
            callback.waitForExpectedEvent();
        } else {
@@ -4728,6 +4731,11 @@ public class DisplayManagerServiceTest {
        int displayId1 = getDisplayIdForDisplayDevice(displayManager, displayManagerBinderService,
                displayDevice1);
        waitForIdleHandler(handler);
        // Non-default display should not be added until onDisplayBelongToTopologyChanged is called
        // with true
        callback.waitForNonExpectedEvent();
        localService.onDisplayBelongToTopologyChanged(displayId1, true);
        waitForIdleHandler(handler);
        if (shouldEmitTopologyChangeEvent) {
            callback.waitForExpectedEvent();
        } else {
+0 −22
Original line number Diff line number Diff line
@@ -219,17 +219,6 @@ class DisplayTopologyCoordinatorTest {
        verify(mockTopologyStore, never()).restoreTopology(any())
    }

    @Test
    fun addDisplay_notInDefaultDisplayGroup() {
        displayInfos[0].displayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1

        coordinator.onDisplayAdded(displayInfos[0])

        verify(mockTopology, never()).addDisplay(anyInt(), anyFloat(), anyFloat())
        verify(mockTopologyChangedCallback, never()).invoke(any())
        verify(mockTopologyStore, never()).restoreTopology(any())
    }

    @Test
    fun updateDisplay() {
        whenever(mockTopology.updateDisplay(eq(displayInfos[0].displayId), anyFloat(), anyFloat()))
@@ -348,17 +337,6 @@ class DisplayTopologyCoordinatorTest {
        verify(mockTopologyStore, never()).restoreTopology(any())
    }

    @Test
    fun updateDisplay_notInDefaultDisplayGroup() {
        displayInfos[0].displayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1

        coordinator.onDisplayChanged(displayInfos[0])

        verify(mockTopology, never()).updateDisplay(anyInt(), anyFloat(), anyFloat())
        verify(mockTopologyCopy, never()).getGraph(any())
        verify(mockTopologyChangedCallback, never()).invoke(any())
    }

    @Test
    fun removeDisplay() {
        addDisplay()