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

Commit d1594bbe authored by Shuming Hao's avatar Shuming Hao Committed by Android (Google) Code Review
Browse files

Merge "[MultiSplit] Avoid calling displayManager::getDisplayIds multiple times" into main

parents bb811908 79e7d9b5
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -39,6 +39,15 @@ class SplitMultiDisplayHelper(private val displayManager: DisplayManager) {
     */
    private val displayTaskMap: MutableMap<Int, SplitTaskHierarchy> = mutableMapOf()

    /**
     * A list of all currently connected display ids.
     * This is saved to avoid repeatedly querying the display manager. Display ids here does not
     * support disconnect/reconnect update at the moment.
     *
     * TODO: b/415861490 - support updating displayIds for split screen when connecting/disconnecting
     */
    private var displayIds: ArrayList<Int>? = null

    /**
     * SplitTaskHierarchy is a class that encapsulates the components required
     * for managing split-screen functionality on a specific display.
@@ -52,16 +61,21 @@ class SplitMultiDisplayHelper(private val displayManager: DisplayManager) {
    )

    /**
     * Returns a list of all currently connected display IDs.
     * Returns a cached list of all currently connected display IDs if available, otherwise query
     * the system for the latest display ids.
     *
     * @return An ArrayList of display IDs.
     */
    fun getDisplayIds(): ArrayList<Int> {
        val displayIds = ArrayList<Int>()
    fun getCachedOrSystemDisplayIds(): ArrayList<Int> {
        if (displayIds == null) {
            val ids = ArrayList<Int>()
            displayManager.displays?.forEach { display ->
            displayIds.add(display.displayId)
                ids.add(display.displayId)
            }
            displayIds = ids
        }
        return displayIds

        return checkNotNull(displayIds)
    }

    /**
+13 −6
Original line number Diff line number Diff line
@@ -417,9 +417,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mSplitMultiDisplayHelper = new SplitMultiDisplayHelper(
                Objects.requireNonNull(displayManager));

        ArrayList<Integer> displayIds = mSplitMultiDisplayHelper.getDisplayIds();

        if (enableMultiDisplaySplit()) {
            ArrayList<Integer> displayIds = mSplitMultiDisplayHelper.getCachedOrSystemDisplayIds();
            displayIds.forEach(id -> {
                taskOrganizer.createRootTask(
                        id, WINDOWING_MODE_FULLSCREEN, this);
@@ -650,7 +649,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    }

    boolean isRootOrStageRoot(int taskId) {
        ArrayList<Integer> displayIds = mSplitMultiDisplayHelper.getDisplayIds();
        if (enableMultiDisplaySplit()) {
            ArrayList<Integer> displayIds = mSplitMultiDisplayHelper.getCachedOrSystemDisplayIds();
            for (int displayId : displayIds) {
                ActivityManager.RunningTaskInfo rootTaskInfo =
                        mSplitMultiDisplayHelper.getDisplayRootTaskInfo(displayId);
@@ -658,6 +658,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                    return true;
                }
            }
        } else {
            ActivityManager.RunningTaskInfo rootTaskInfo =
                    mSplitMultiDisplayHelper.getDisplayRootTaskInfo(DEFAULT_DISPLAY);
            if (rootTaskInfo != null && rootTaskInfo.taskId == taskId) {
                return true;
            }
        }

        if (enableFlexibleSplit()) {
            return mStageOrderOperator.getActiveStages().stream()
@@ -2242,7 +2249,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    @CallSuper
    public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) {
        if (enableMultiDisplaySplit()) {
            ArrayList<Integer> displayIds = mSplitMultiDisplayHelper.getDisplayIds();
            ArrayList<Integer> displayIds = mSplitMultiDisplayHelper.getCachedOrSystemDisplayIds();
            boolean allRootsNull = true;
            boolean taskIsNotRootTask = true;
            for (int displayId : displayIds) {
+3 −3
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ class SplitMultiDisplayHelperTests : ShellTestCase() {
    fun getDisplayIds_noDisplays_returnsEmptyList() {
        `when`(mockDisplayManager.displays).thenReturn(emptyArray())

        val displayIds = splitMultiDisplayHelper.getDisplayIds()
        val displayIds = splitMultiDisplayHelper.getCachedOrSystemDisplayIds()

        assertThat(displayIds).isEmpty()
    }
@@ -78,7 +78,7 @@ class SplitMultiDisplayHelperTests : ShellTestCase() {
    fun getDisplayIds_singleDisplay_returnsCorrectId() {
        `when`(mockDisplayManager.displays).thenReturn(arrayOf(mockDisplay1))

        val displayIds = splitMultiDisplayHelper.getDisplayIds()
        val displayIds = splitMultiDisplayHelper.getCachedOrSystemDisplayIds()

        assertThat(displayIds).containsExactly(Display.DEFAULT_DISPLAY)
    }
@@ -87,7 +87,7 @@ class SplitMultiDisplayHelperTests : ShellTestCase() {
    fun getDisplayIds_multiDisplays_returnsCorrectIds() {
        `when`(mockDisplayManager.displays).thenReturn(arrayOf(mockDisplay1, mockDisplay2))

        val displayIds = splitMultiDisplayHelper.getDisplayIds()
        val displayIds = splitMultiDisplayHelper.getCachedOrSystemDisplayIds()

        assertThat(displayIds).containsExactly(Display.DEFAULT_DISPLAY, Display.DEFAULT_DISPLAY + 1)
    }