Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitMultiDisplayHelper.kt +20 −6 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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) } /** Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +13 −6 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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() Loading Loading @@ -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) { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitMultiDisplayHelperTests.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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() } Loading @@ -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) } Loading @@ -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) } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitMultiDisplayHelper.kt +20 −6 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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) } /** Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +13 −6 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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() Loading Loading @@ -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) { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitMultiDisplayHelperTests.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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() } Loading @@ -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) } Loading @@ -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) } Loading