diff options
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 177646b22ea3..7ca569349633 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 bbad36dcc046..b0167afa2e4e 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);      } @@ -292,6 +296,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 {                  mMainExecutor.executeBlocking(() -> { 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 176852b148fa..2d4b77e0c630 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<SplitScreen.SplitScreenListener> 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 e38cf237d36b..5c943f63a9a1 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 01a8c1c89f84..5b2a7e7ff617 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -620,6 +620,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")) {                  return;  |