summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java12
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java5
-rw-r--r--services/core/java/com/android/server/input/KeyboardMetricsCollector.java4
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java26
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java8
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java9
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) {