diff options
9 files changed, 88 insertions, 31 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 56e1a872423d..2cf41bbfffc1 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -328,4 +328,7 @@ oneway interface IStatusBar /** Shows rear display educational dialog */ void showRearDisplayDialog(int currentBaseState); + + /** Called when requested to go to fullscreen from the active split app. */ + void goToFullscreenFromSplit(); } 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 d86aadc996e3..2f2bc77b804b 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 @@ -73,6 +73,9 @@ public interface SplitScreen { /** Called when device waking up finished. */ void onFinishedWakingUp(); + /** Called when requested to go to fullscreen from the current active split app. */ + void goToFullscreenFromSplit(); + /** Get a string representation of a stage type */ static String stageTypeToString(@StageType int stage) { switch (stage) { 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 b20125df3a6d..400039b32618 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 @@ -123,6 +123,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, public static final int EXIT_REASON_SCREEN_LOCKED = 7; public static final int EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP = 8; public static final int EXIT_REASON_CHILD_TASK_ENTER_PIP = 9; + public static final int EXIT_REASON_FULLSCREEN_SHORTCUT = 10; @IntDef(value = { EXIT_REASON_UNKNOWN, EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW, @@ -134,6 +135,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, EXIT_REASON_SCREEN_LOCKED, EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP, EXIT_REASON_CHILD_TASK_ENTER_PIP, + EXIT_REASON_FULLSCREEN_SHORTCUT, }) @Retention(RetentionPolicy.SOURCE) @interface ExitReason{} @@ -418,6 +420,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator.unregisterSplitScreenListener(listener); } + public void goToFullscreenFromSplit() { + mStageCoordinator.goToFullscreenFromSplit(); + } + public void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options) { final int[] result = new int[1]; IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() { @@ -860,9 +866,12 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, @Override public void onFinishedWakingUp() { - mMainExecutor.execute(() -> { - SplitScreenController.this.onFinishedWakingUp(); - }); + mMainExecutor.execute(SplitScreenController.this::onFinishedWakingUp); + } + + @Override + public void goToFullscreenFromSplit() { + mMainExecutor.execute(SplitScreenController.this::goToFullscreenFromSplit); } } @@ -918,33 +927,25 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, @Override public void exitSplitScreen(int toTopTaskId) { executeRemoteCallWithTaskPermission(mController, "exitSplitScreen", - (controller) -> { - controller.exitSplitScreen(toTopTaskId, EXIT_REASON_UNKNOWN); - }); + (controller) -> controller.exitSplitScreen(toTopTaskId, EXIT_REASON_UNKNOWN)); } @Override public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { executeRemoteCallWithTaskPermission(mController, "exitSplitScreenOnHide", - (controller) -> { - controller.exitSplitScreenOnHide(exitSplitScreenOnHide); - }); + (controller) -> controller.exitSplitScreenOnHide(exitSplitScreenOnHide)); } @Override public void removeFromSideStage(int taskId) { executeRemoteCallWithTaskPermission(mController, "removeFromSideStage", - (controller) -> { - controller.removeFromSideStage(taskId); - }); + (controller) -> controller.removeFromSideStage(taskId)); } @Override public void startTask(int taskId, int position, @Nullable Bundle options) { executeRemoteCallWithTaskPermission(mController, "startTask", - (controller) -> { - controller.startTask(taskId, position, options); - }); + (controller) -> controller.startTask(taskId, position, options)); } @Override @@ -1036,19 +1037,16 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, public void startShortcut(String packageName, String shortcutId, int position, @Nullable Bundle options, UserHandle user, InstanceId instanceId) { executeRemoteCallWithTaskPermission(mController, "startShortcut", - (controller) -> { - controller.startShortcut(packageName, shortcutId, position, options, user, - instanceId); - }); + (controller) -> controller.startShortcut(packageName, shortcutId, position, + options, user, instanceId)); } @Override public void startIntent(PendingIntent intent, Intent fillInIntent, int position, @Nullable Bundle options, InstanceId instanceId) { executeRemoteCallWithTaskPermission(mController, "startIntent", - (controller) -> { - controller.startIntent(intent, fillInIntent, position, options, instanceId); - }); + (controller) -> controller.startIntent(intent, fillInIntent, position, options, + instanceId)); } @Override 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 eb7b0d700d15..aa0512b64a16 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 @@ -49,6 +49,7 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASO import static com.android.wm.shell.splitscreen.SplitScreenController.ENTER_REASON_MULTI_INSTANCE; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_APP_FINISHED; +import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_SHORTCUT; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_CHILD_TASK_ENTER_PIP; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DEVICE_FOLDED; import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DRAG_DIVIDER; @@ -1115,15 +1116,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, * 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); - } + mSplitLayout.flingDividerToDismiss(stageToClose == SPLIT_POSITION_BOTTOM_OR_RIGHT, + EXIT_REASON_APP_FINISHED); } /** @@ -1157,6 +1151,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, case EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP: // User has unlocked the device after folded case EXIT_REASON_DEVICE_FOLDED: + // The device is folded + case EXIT_REASON_FULLSCREEN_SHORTCUT: + // User has used a keyboard shortcut to go back to fullscreen from split return true; default: return false; @@ -2119,6 +2116,16 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return true; } + public void goToFullscreenFromSplit() { + boolean leftOrTop; + if (mSideStage.isFocused()) { + leftOrTop = (mSideStagePosition == SPLIT_POSITION_TOP_OR_LEFT); + } else { + leftOrTop = (mSideStagePosition == SPLIT_POSITION_BOTTOM_OR_RIGHT); + } + mSplitLayout.flingDividerToDismiss(!leftOrTop, EXIT_REASON_FULLSCREEN_SHORTCUT); + } + /** Synchronize split-screen state with transition and make appropriate preparations. */ public void prepareDismissAnimation(@StageType int toStage, @ExitReason int dismissReason, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 426d4fcbb27d..d000e6e75eed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -166,6 +166,7 @@ public class CommandQueue extends IStatusBar.Stub implements private static final int MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 67 << MSG_SHIFT; private static final int MSG_TILE_SERVICE_REQUEST_LISTENING_STATE = 68 << MSG_SHIFT; private static final int MSG_SHOW_REAR_DISPLAY_DIALOG = 69 << MSG_SHIFT; + private static final int MSG_GO_TO_FULLSCREEN_FROM_SPLIT = 70 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -480,6 +481,11 @@ public class CommandQueue extends IStatusBar.Stub implements * @see IStatusBar#showRearDisplayDialog */ default void showRearDisplayDialog(int currentBaseState) {} + + /** + * @see IStatusBar#goToFullscreenFromSplit + */ + default void goToFullscreenFromSplit() {} } public CommandQueue(Context context) { @@ -1302,6 +1308,11 @@ public class CommandQueue extends IStatusBar.Stub implements .sendToTarget(); } + @Override + public void goToFullscreenFromSplit() { + mHandler.obtainMessage(MSG_GO_TO_FULLSCREEN_FROM_SPLIT).sendToTarget(); + } + private final class H extends Handler { private H(Looper l) { super(l); @@ -1741,6 +1752,12 @@ public class CommandQueue extends IStatusBar.Stub implements for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).showRearDisplayDialog((Integer) msg.obj); } + break; + case MSG_GO_TO_FULLSCREEN_FROM_SPLIT: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).goToFullscreenFromSplit(); + } + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 02738d5ae48b..8ef98f08c60d 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -253,6 +253,12 @@ public final class WMShell implements splitScreen.onFinishedWakingUp(); } }); + mCommandQueue.addCallback(new CommandQueue.Callbacks() { + @Override + public void goToFullscreenFromSplit() { + splitScreen.goToFullscreenFromSplit(); + } + }); } @VisibleForTesting diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 352d4be6c7ce..a4c9684af418 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2864,6 +2864,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { return key_consumed; } break; + case KeyEvent.KEYCODE_DPAD_UP: + if (down && event.isMetaPressed() && event.isCtrlPressed() && repeatCount == 0) { + StatusBarManagerInternal statusbar = getStatusBarManagerInternal(); + if (statusbar != null) { + statusbar.goToFullscreenFromSplit(); + } + return key_consumed; + } + break; case KeyEvent.KEYCODE_SLASH: if (down && repeatCount == 0 && event.isMetaPressed() && !keyguardOn) { toggleKeyboardShortcutsMenu(event.getDeviceId()); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index c758f487d4de..9957140162a0 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -179,4 +179,9 @@ public interface StatusBarManagerInternal { * @see com.android.internal.statusbar.IStatusBar#showRearDisplayDialog */ void showRearDisplayDialog(int currentBaseState); + + /** + * Called when requested to go to fullscreen from the active split app. + */ + void goToFullscreenFromSplit(); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 194dfb25583f..5a91dc6ef8d9 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -696,6 +696,15 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } catch (RemoteException ex) { } } } + + @Override + public void goToFullscreenFromSplit() { + if (mBar != null) { + try { + mBar.goToFullscreenFromSplit(); + } catch (RemoteException ex) { } + } + } }; private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() { |