Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +8 −4 Original line number Diff line number Diff line Loading @@ -213,13 +213,17 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mShellController.addKeyguardChangeListener(this); if (mStageCoordinator == null) { // TODO: Multi-display mStageCoordinator = new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mStageCoordinator = createStageCoordinator(); } mDragAndDropController.setSplitScreenController(this); } protected StageCoordinator createStageCoordinator() { return new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mTaskOrganizer, mDisplayController, mDisplayImeController, mDisplayInsetsController, mTransitions, mTransactionPool, mLogger, mIconProvider, mMainExecutor, mRecentTasksOptional); } mDragAndDropController.setSplitScreenController(this); } @Override public Context getContext() { Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +48 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.IActivityTaskManager; import android.app.PendingIntent; import android.app.WindowConfiguration; import android.content.Context; Loading @@ -81,6 +82,7 @@ import android.os.Bundle; import android.os.Debug; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.util.Slog; import android.view.Choreographer; Loading Loading @@ -244,7 +246,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } }; StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, protected StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, ShellTaskOrganizer taskOrganizer, DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, Transitions transitions, Loading Loading @@ -880,6 +882,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, WindowContainerTransaction wct, @ExitReason int exitReason) { if (!mMainStage.isActive() || mIsExiting) return; onSplitScreenExit(); mRecentTasks.ifPresent(recentTasks -> { // Notify recents if we are exiting in a way that breaks the pair, and disable further // updates to splits in the recents until we enter split again Loading Loading @@ -948,6 +952,47 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } /** * Overridden by child classes. */ protected void onSplitScreenEnter() { } /** * Overridden by child classes. */ protected void onSplitScreenExit() { } /** * Exits the split screen by finishing one of the tasks. */ protected void exitStage(@SplitPosition int stageToClose) { if (ENABLE_SHELL_TRANSITIONS) { StageTaskListener stageToTop = mSideStagePosition == stageToClose ? mMainStage : mSideStage; exitSplitScreen(stageToTop, EXIT_REASON_APP_FINISHED); } else { boolean toEnd = stageToClose == SPLIT_POSITION_BOTTOM_OR_RIGHT; mSplitLayout.flingDividerToDismiss(toEnd, EXIT_REASON_APP_FINISHED); } } /** * Grants focus to the main or the side stages. */ protected void grantFocusToStage(@SplitPosition int stageToFocus) { IActivityTaskManager activityTaskManagerService = IActivityTaskManager.Stub.asInterface( ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE)); try { activityTaskManagerService.setFocusedTask(getTaskId(stageToFocus)); } catch (RemoteException | NullPointerException e) { ProtoLog.e(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "%s: Unable to update focus on the chosen stage, %s", TAG, e); } } /** * Returns whether the split pair in the recent tasks list should be broken. */ Loading Loading @@ -995,6 +1040,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Nullable ActivityManager.RunningTaskInfo taskInfo, @SplitPosition int startPosition) { if (mMainStage.isActive()) return; onSplitScreenEnter(); if (taskInfo != null) { setSideStagePosition(startPosition, wct); mSideStage.addTask(taskInfo, wct); Loading Loading @@ -1388,6 +1434,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } else if (isSideStage && hasChildren && !mMainStage.isActive()) { // TODO (b/238697912) : Add the validation to prevent entering non-recovered status onSplitScreenEnter(); final WindowContainerTransaction wct = new WindowContainerTransaction(); mSplitLayout.init(); mSplitLayout.setDividerAtBorder(mSideStagePosition == SPLIT_POSITION_TOP_OR_LEFT); Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +8 −4 Original line number Diff line number Diff line Loading @@ -213,13 +213,17 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mShellController.addKeyguardChangeListener(this); if (mStageCoordinator == null) { // TODO: Multi-display mStageCoordinator = new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mStageCoordinator = createStageCoordinator(); } mDragAndDropController.setSplitScreenController(this); } protected StageCoordinator createStageCoordinator() { return new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mTaskOrganizer, mDisplayController, mDisplayImeController, mDisplayInsetsController, mTransitions, mTransactionPool, mLogger, mIconProvider, mMainExecutor, mRecentTasksOptional); } mDragAndDropController.setSplitScreenController(this); } @Override public Context getContext() { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +48 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.IActivityTaskManager; import android.app.PendingIntent; import android.app.WindowConfiguration; import android.content.Context; Loading @@ -81,6 +82,7 @@ import android.os.Bundle; import android.os.Debug; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.util.Slog; import android.view.Choreographer; Loading Loading @@ -244,7 +246,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } }; StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, protected StageCoordinator(Context context, int displayId, SyncTransactionQueue syncQueue, ShellTaskOrganizer taskOrganizer, DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, Transitions transitions, Loading Loading @@ -880,6 +882,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, WindowContainerTransaction wct, @ExitReason int exitReason) { if (!mMainStage.isActive() || mIsExiting) return; onSplitScreenExit(); mRecentTasks.ifPresent(recentTasks -> { // Notify recents if we are exiting in a way that breaks the pair, and disable further // updates to splits in the recents until we enter split again Loading Loading @@ -948,6 +952,47 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } /** * Overridden by child classes. */ protected void onSplitScreenEnter() { } /** * Overridden by child classes. */ protected void onSplitScreenExit() { } /** * Exits the split screen by finishing one of the tasks. */ protected void exitStage(@SplitPosition int stageToClose) { if (ENABLE_SHELL_TRANSITIONS) { StageTaskListener stageToTop = mSideStagePosition == stageToClose ? mMainStage : mSideStage; exitSplitScreen(stageToTop, EXIT_REASON_APP_FINISHED); } else { boolean toEnd = stageToClose == SPLIT_POSITION_BOTTOM_OR_RIGHT; mSplitLayout.flingDividerToDismiss(toEnd, EXIT_REASON_APP_FINISHED); } } /** * Grants focus to the main or the side stages. */ protected void grantFocusToStage(@SplitPosition int stageToFocus) { IActivityTaskManager activityTaskManagerService = IActivityTaskManager.Stub.asInterface( ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE)); try { activityTaskManagerService.setFocusedTask(getTaskId(stageToFocus)); } catch (RemoteException | NullPointerException e) { ProtoLog.e(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "%s: Unable to update focus on the chosen stage, %s", TAG, e); } } /** * Returns whether the split pair in the recent tasks list should be broken. */ Loading Loading @@ -995,6 +1040,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Nullable ActivityManager.RunningTaskInfo taskInfo, @SplitPosition int startPosition) { if (mMainStage.isActive()) return; onSplitScreenEnter(); if (taskInfo != null) { setSideStagePosition(startPosition, wct); mSideStage.addTask(taskInfo, wct); Loading Loading @@ -1388,6 +1434,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } else if (isSideStage && hasChildren && !mMainStage.isActive()) { // TODO (b/238697912) : Add the validation to prevent entering non-recovered status onSplitScreenEnter(); final WindowContainerTransaction wct = new WindowContainerTransaction(); mSplitLayout.init(); mSplitLayout.setDividerAtBorder(mSideStagePosition == SPLIT_POSITION_TOP_OR_LEFT); Loading