diff options
10 files changed, 90 insertions, 5 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index a2efbd29c54a..a22232ac945e 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -376,6 +376,12 @@ oneway interface IStatusBar void moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop); /** + * Set the split screen focus to the left / top app or the right / bottom app based on + * {@param leftOrTop}. + */ + void setSplitscreenFocus(boolean leftOrTop); + + /** * Shows the media output switcher dialog. * * @param packageName of the session for which the output switcher is shown. 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 ad4049320d93..2b433e9c4227 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 @@ -85,6 +85,9 @@ public interface SplitScreen { /** Called when requested to go to fullscreen from the current active split app. */ void goToFullscreenFromSplit(); + /** Called when splitscreen focused app is changed. */ + void setSplitscreenFocus(boolean leftOrTop); + /** 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 86c8f04f8138..3e34c303e161 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 @@ -485,6 +485,12 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, } } + public void setSplitscreenFocus(boolean leftOrTop) { + if (mStageCoordinator.isSplitActive()) { + mStageCoordinator.grantFocusToPosition(leftOrTop); + } + } + /** Move the specified task to fullscreen, regardless of focus state. */ public void moveTaskToFullscreen(int taskId, int exitReason) { mStageCoordinator.moveTaskToFullscreen(taskId, exitReason); @@ -1146,6 +1152,12 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, public void goToFullscreenFromSplit() { mMainExecutor.execute(SplitScreenController.this::goToFullscreenFromSplit); } + + @Override + public void setSplitscreenFocus(boolean leftOrTop) { + mMainExecutor.execute( + () -> SplitScreenController.this.setSplitscreenFocus(leftOrTop)); + } } /** 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 36368df9af36..41890df9a4ee 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 @@ -1592,6 +1592,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } + protected void grantFocusToPosition(boolean leftOrTop) { + grantFocusToStage(mSideStagePosition == SPLIT_POSITION_BOTTOM_OR_RIGHT + ? getMainStagePosition() : getSideStagePosition()); + } + private void clearRequestIfPresented() { ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "clearRequestIfPresented"); if (mSideStageListener.mVisible && mSideStageListener.mHasChildren diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 4275fc6f4097..44068139f66b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -178,6 +178,7 @@ public class CommandQueue extends IStatusBar.Stub implements private static final int MSG_IMMERSIVE_CHANGED = 78 << MSG_SHIFT; private static final int MSG_SET_QS_TILES = 79 << MSG_SHIFT; private static final int MSG_ENTER_DESKTOP = 80 << MSG_SHIFT; + private static final int MSG_SET_SPLITSCREEN_FOCUS = 81 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; public static final int FLAG_EXCLUDE_RECENTS_PANEL = 1 << 1; @@ -508,6 +509,11 @@ public class CommandQueue extends IStatusBar.Stub implements default void moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop) {} /** + * @see IStatusBar#setSplitscreenFocus + */ + default void setSplitscreenFocus(boolean leftOrTop) {} + + /** * @see IStatusBar#showMediaOutputSwitcher */ default void showMediaOutputSwitcher(String packageName) {} @@ -1349,6 +1355,12 @@ public class CommandQueue extends IStatusBar.Stub implements } @Override + public void setSplitscreenFocus(boolean leftOrTop) { + synchronized (mLock) { + mHandler.obtainMessage(MSG_SET_SPLITSCREEN_FOCUS, leftOrTop).sendToTarget(); + } + } + @Override public void showMediaOutputSwitcher(String packageName) { int callingUid = Binder.getCallingUid(); if (callingUid != 0 && callingUid != Process.SYSTEM_UID) { @@ -1919,6 +1931,11 @@ public class CommandQueue extends IStatusBar.Stub implements } break; } + case MSG_SET_SPLITSCREEN_FOCUS: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).setSplitscreenFocus((Boolean) msg.obj); + } + break; case MSG_SHOW_MEDIA_OUTPUT_SWITCHER: args = (SomeArgs) msg.obj; String clientPackageName = (String) args.arg1; diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 7674fe988255..7931fab91f46 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -259,6 +259,11 @@ public final class WMShell implements public void moveFocusedTaskToFullscreen(int displayId) { splitScreen.goToFullscreenFromSplit(); } + + @Override + public void setSplitscreenFocus(boolean leftOrTop) { + splitScreen.setSplitscreenFocus(leftOrTop); + } }); } diff --git a/services/core/java/com/android/server/input/KeyboardMetricsCollector.java b/services/core/java/com/android/server/input/KeyboardMetricsCollector.java index b8ae737919d9..f21fd4132f0f 100644 --- a/services/core/java/com/android/server/input/KeyboardMetricsCollector.java +++ b/services/core/java/com/android/server/input/KeyboardMetricsCollector.java @@ -146,6 +146,10 @@ public final class KeyboardMetricsCollector { SPLIT_SCREEN_NAVIGATION( FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__SPLIT_SCREEN_NAVIGATION, "SPLIT_SCREEN_NAVIGATION"), + + CHANGE_SPLITSCREEN_FOCUS( + FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__CHANGE_SPLITSCREEN_FOCUS, + "CHANGE_SPLITSCREEN_FOCUS"), TRIGGER_BUG_REPORT( FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TRIGGER_BUG_REPORT, "TRIGGER_BUG_REPORT"), diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 266418fd5b4a..ecd70350c303 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3526,6 +3526,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { moveFocusedTaskToStageSplit(getTargetDisplayIdForKeyEvent(event), true /* leftOrTop */); logKeyboardSystemsEvent(event, KeyboardLogEvent.SPLIT_SCREEN_NAVIGATION); + } else if (event.isAltPressed()) { + setSplitscreenFocus(true /* leftOrTop */); + logKeyboardSystemsEvent(event, KeyboardLogEvent.CHANGE_SPLITSCREEN_FOCUS); } else { logKeyboardSystemsEvent(event, KeyboardLogEvent.BACK); injectBackGesture(event.getDownTime()); @@ -3534,11 +3537,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { } break; case KeyEvent.KEYCODE_DPAD_RIGHT: - if (firstDown && event.isMetaPressed() && event.isCtrlPressed()) { - moveFocusedTaskToStageSplit(getTargetDisplayIdForKeyEvent(event), - false /* leftOrTop */); - logKeyboardSystemsEvent(event, KeyboardLogEvent.SPLIT_SCREEN_NAVIGATION); - return true; + if (firstDown && event.isMetaPressed()) { + if (event.isCtrlPressed()) { + moveFocusedTaskToStageSplit(getTargetDisplayIdForKeyEvent(event), + false /* leftOrTop */); + logKeyboardSystemsEvent(event, KeyboardLogEvent.SPLIT_SCREEN_NAVIGATION); + return true; + } else if (event.isAltPressed()) { + setSplitscreenFocus(false /* leftOrTop */); + logKeyboardSystemsEvent(event, KeyboardLogEvent.CHANGE_SPLITSCREEN_FOCUS); + return true; + } } break; case KeyEvent.KEYCODE_SLASH: @@ -4398,6 +4407,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + private void setSplitscreenFocus(boolean leftOrTop) { + StatusBarManagerInternal statusbar = getStatusBarManagerInternal(); + if (statusbar != null) { + statusbar.setSplitscreenFocus(leftOrTop); + } + } + void launchHomeFromHotKey(int displayId) { launchHomeFromHotKey(displayId, true /* awakenFromDreams */, true /*respectKeyguard*/); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index c73f89c4731e..f7c236afda20 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -238,6 +238,14 @@ public interface StatusBarManagerInternal { void moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop); /** + * Change the split screen focus to the left / top app or the right / bottom app based on + * {@param leftOrTop}. + * + * @see com.android.internal.statusbar.IStatusBar#setSplitscreenFocus + */ + void setSplitscreenFocus(boolean leftOrTop); + + /** * Shows the media output switcher dialog. * * @param packageName of the session for which the output switcher is shown. diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 214dbe01aee5..7b3e23776a55 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -830,6 +830,15 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override + public void setSplitscreenFocus(boolean leftOrTop) { + IStatusBar bar = mBar; + if (bar != null) { + try { + bar.setSplitscreenFocus(leftOrTop); + } catch (RemoteException ex) { } + } + } + @Override public void enterDesktop(int displayId) { IStatusBar bar = mBar; if (bar != null) { |