From 31e48a2df863042dbcfe3d2ecd9c67d188e4fd49 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Mon, 8 Feb 2021 14:51:40 -0800 Subject: [PATCH] Fixed issue with not sending stage position change Also, added API to specify if split-screen should exit on hide. Bug: 179176511 Test: presubmits Change-Id: Iad2884554d16d922906386cb2887bcf35d6327e8 --- .../wm/shell/splitscreen/SplitScreen.java | 2 ++ .../splitscreen/SplitScreenController.java | 11 ++++++++++ .../shell/splitscreen/StageCoordinator.java | 21 +++++++++++++++++-- .../shared/recents/ISystemUiProxy.aidl | 8 ++++--- .../recents/OverviewProxyService.java | 13 ++++++++++++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java index 177646b22ea39..7ca5693496336 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java @@ -106,6 +106,8 @@ public interface SplitScreen extends DragAndDropPolicy.Starter { /** Removes the split-screen stages. */ void exitSplitScreen(); + /** @param exitSplitScreenOnHide if to exit split-screen if both stages are not visible. */ + void exitSplitScreenOnHide(boolean exitSplitScreenOnHide); /** Gets the stage bounds. */ void getStageBounds(Rect outTopOrLeftBounds, Rect outBottomOrRightBounds); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index bbad36dcc0469..b0167afa2e4eb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -126,6 +126,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter { mStageCoordinator.exitSplitScreen(); } + public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { + mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); + } + public void getStageBounds(Rect outTopOrLeftBounds, Rect outBottomOrRightBounds) { mStageCoordinator.getStageBounds(outTopOrLeftBounds, outBottomOrRightBounds); } @@ -291,6 +295,13 @@ public class SplitScreenController implements DragAndDropPolicy.Starter { }); } + @Override + public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { + mMainExecutor.execute(() -> { + SplitScreenController.this.exitSplitScreenOnHide(exitSplitScreenOnHide); + }); + } + @Override public void getStageBounds(Rect outTopOrLeftBounds, Rect outBottomOrRightBounds) { try { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 176852b148fa6..2d4b77e0c6303 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -79,6 +79,7 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, private DisplayAreaInfo mDisplayAreaInfo; private final Context mContext; private final List mListeners = new ArrayList<>(); + private boolean mExitSplitScreenOnHide = true; StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, RootTaskDisplayAreaOrganizer rootTDAOrganizer, ShellTaskOrganizer taskOrganizer) { @@ -113,7 +114,7 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, boolean moveToSideStage(ActivityManager.RunningTaskInfo task, @SplitScreen.StagePosition int sideStagePosition) { final WindowContainerTransaction wct = new WindowContainerTransaction(); - mSideStagePosition = sideStagePosition; + setSideStagePosition(sideStagePosition); mMainStage.activate(getMainStageBounds(), wct); mSideStage.addTask(task, getSideStageBounds(), wct); mTaskOrganizer.applyTransaction(wct); @@ -144,10 +145,14 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, } void setSideStagePosition(@SplitScreen.StagePosition int sideStagePosition) { + if (mSideStagePosition == sideStagePosition) return; + mSideStagePosition = sideStagePosition; if (mSideStageListener.mVisible) { onStageVisibilityChanged(mSideStageListener); } + + sendOnStagePositionChanged(); } void setSideStageVisibility(boolean visible) { @@ -162,6 +167,10 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, exitSplitScreen(null /* childrenToTop */); } + void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { + mExitSplitScreenOnHide = exitSplitScreenOnHide; + } + private void exitSplitScreen(StageTaskListener childrenToTop) { final WindowContainerTransaction wct = new WindowContainerTransaction(); mSideStage.removeAllTasks(wct, childrenToTop == mSideStage); @@ -202,6 +211,14 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, mListeners.remove(listener); } + private void sendOnStagePositionChanged() { + for (int i = mListeners.size() - 1; i >= 0; --i) { + final SplitScreen.SplitScreenListener l = mListeners.get(i); + l.onStagePositionChanged(STAGE_TYPE_MAIN, getMainStagePosition()); + l.onStagePositionChanged(STAGE_TYPE_SIDE, getSideStagePosition()); + } + } + private void onStageChildTaskStatusChanged( StageListenerImpl stageListener, int taskId, boolean present) { @@ -251,7 +268,7 @@ class StageCoordinator implements SplitLayout.LayoutChangeListener, } } - if (!mainStageVisible && !sideStageVisible) { + if (mExitSplitScreenOnHide && !mainStageVisible && !sideStageVisible) { // Exit split-screen if both stage are not visible. // TODO: This is only a temporary request from UX and is likely to be removed soon... exitSplitScreen(); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl index e38cf237d36b9..5c943f63a9a1f 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl @@ -245,9 +245,11 @@ interface ISystemUiProxy { void setSideStageVisibility(in boolean visible) = 36; /** Removes the split-screen stages. */ void exitSplitScreen() = 37; - void startTask(in int taskId, in int stage, in int position, in Bundle options) = 38; + /** @param exitSplitScreenOnHide if to exit split-screen if both stages are not visible. */ + void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) = 38; + void startTask(in int taskId, in int stage, in int position, in Bundle options) = 39; void startShortcut(in String packageName, in String shortcutId, in int stage, in int position, - in Bundle options, in UserHandle user) = 39; + in Bundle options, in UserHandle user) = 40; void startIntent( - in PendingIntent intent, in int stage, in int position, in Bundle options) = 40; + in PendingIntent intent, in int stage, in int position, in Bundle options) = 41; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 01a8c1c89f840..5b2a7e7ff6176 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -619,6 +619,19 @@ public class OverviewProxyService extends CurrentUserTracker implements } } + @Override + public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { + if (!verifyCaller("exitSplitScreenOnHide")) { + return; + } + final long token = Binder.clearCallingIdentity(); + try { + mSplitScreenOptional.ifPresent(s -> s.exitSplitScreenOnHide(exitSplitScreenOnHide)); + } finally { + Binder.restoreCallingIdentity(token); + } + } + @Override public void startTask(int taskId, int stage, int position, Bundle options) { if (!verifyCaller("startTask")) {