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

Commit 73c50071 authored by Toshiki Kikuchi's avatar Toshiki Kikuchi
Browse files

Refresh desktop display mode on sys decors changes

This CL adds a pipeline to propagate system decors changes from Core to
Shell, and uses it to refresh the desktop display mode which depends on
the availability of sys decors.

Flag: com.android.server.display.feature.flags.enable_display_content_mode_management
Flag: com.android.window.flags.enable_display_windowing_mode_switching
Bug: 375319538
Test: DesktopDisplayEventHandlerTest
Test: ActivityTaskManagerServiceTests
Change-Id: I5a1ff8983db65dd8429f0ccaec0a499b6682f28a
parent cc219cbe
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -64,4 +64,9 @@ oneway interface IDisplayWindowListener {
     * Called when the keep clear ares on a display have changed.
     */
    void onKeepClearAreasChanged(int displayId, in List<Rect> restricted, in List<Rect> unrestricted);

    /**
     * Called when the eligibility of the desktop mode for a display have changed.
     */
    void onDesktopModeEligibleChanged(int displayId);
}
+25 −0
Original line number Diff line number Diff line
@@ -355,6 +355,19 @@ public class DisplayController {
        }
    }

    private void onDesktopModeEligibleChanged(int displayId) {
        synchronized (mDisplays) {
            if (mDisplays.get(displayId) == null || getDisplay(displayId) == null) {
                Slog.w(TAG, "Skipping onDesktopModeEligibleChanged on unknown"
                        + " display, displayId=" + displayId);
                return;
            }
            for (int i = mDisplayChangedListeners.size() - 1; i >= 0; --i) {
                mDisplayChangedListeners.get(i).onDesktopModeEligibleChanged(displayId);
            }
        }
    }

    private static class DisplayRecord {
        private int mDisplayId;
        private Context mContext;
@@ -422,6 +435,13 @@ public class DisplayController {
                        new ArraySet<>(restricted), new ArraySet<>(unrestricted));
            });
        }

        @Override
        public void onDesktopModeEligibleChanged(int displayId) {
            mMainExecutor.execute(() -> {
                DisplayController.this.onDesktopModeEligibleChanged(displayId);
            });
        }
    }

    /**
@@ -467,5 +487,10 @@ public class DisplayController {
         * Called when the display topology has changed.
         */
        default void onTopologyChanged(DisplayTopology topology) {}

        /**
         * Called when the eligibility of the desktop mode for a display have changed.
         */
        default void onDesktopModeEligibleChanged(int displayId) {}
    }
}
+9 −0
Original line number Diff line number Diff line
@@ -89,6 +89,15 @@ class DesktopDisplayEventHandler(
        // TODO: b/362720497 - move desks in closing display to the remaining desk.
    }

    override fun onDesktopModeEligibleChanged(displayId: Int) {
        if (
            DesktopExperienceFlags.ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT.isTrue &&
                displayId != DEFAULT_DISPLAY
        ) {
            desktopDisplayModeController.refreshDisplayWindowingMode()
        }
    }

    override fun onDeskRemoved(lastDisplayId: Int, deskId: Int) {
        val remainingDesks = desktopRepository.getNumberOfDesks(lastDisplayId)
        if (remainingDesks == 0) {
+8 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.dx.mockito.inline.extended.ExtendedMockito.never
import com.android.dx.mockito.inline.extended.StaticMockitoSession
import com.android.server.display.feature.flags.Flags as DisplayFlags
import com.android.window.flags.Flags
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTestCase
@@ -246,6 +247,13 @@ class DesktopDisplayEventHandlerTest : ShellTestCase() {
        verify(desktopDisplayModeController).refreshDisplayWindowingMode()
    }

    @Test
    @EnableFlags(DisplayFlags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT)
    fun testDesktopModeEligibleChanged() {
        onDisplaysChangedListenerCaptor.lastValue.onDesktopModeEligibleChanged(externalDisplayId)
        verify(desktopDisplayModeController).refreshDisplayWindowingMode()
    }

    private class FakeDesktopRepositoryInitializer : DesktopRepositoryInitializer {
        override var deskRecreationFactory: DesktopRepositoryInitializer.DeskRecreationFactory =
            DesktopRepositoryInitializer.DeskRecreationFactory { _, _, deskId -> deskId }
+3 −0
Original line number Diff line number Diff line
@@ -559,6 +559,9 @@ public class CameraServiceProxy extends SystemService
        @Override
        public void onKeepClearAreasChanged(int displayId, List<Rect> restricted,
                List<Rect> unrestricted) { }

        @Override
        public void onDesktopModeEligibleChanged(int displayId) { }
    }


Loading