From 720ee2eff13ed2e8c995a8da8fc29d9c79657e9d Mon Sep 17 00:00:00 2001 From: Santos Cordon Date: Fri, 21 Jul 2017 16:15:13 -0700 Subject: [PATCH] If an Activity transitions to VR, then ensure it's in the main stack. Bug: 62791734 Test: Manual. From VR, start an app that sets VR dynamically via Activity.setVrModeEnabled. Ensure it transitions from virtual display to main display via added logging and 'adb shell am stack list'. Change-Id: I11c1aad09e41666b928a6c2d896f9f2e22bb1aa5 --- .../android/server/am/ActivityManagerService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 325ffb4c3581d..30e5a2cdba9d6 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -28,6 +28,7 @@ import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; import static android.app.ActivityManager.RESIZE_MODE_PRESERVE_WINDOW; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; +import static android.app.ActivityManager.StackId.FIRST_DYNAMIC_STACK_ID; import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import static android.app.ActivityManager.StackId.PINNED_STACK_ID; @@ -3230,6 +3231,18 @@ public class ActivityManagerService extends IActivityManager.Stub } final void applyUpdateVrModeLocked(ActivityRecord r) { + // VR apps are expected to run in a main display. If an app is turning on VR for + // itself, but lives in a dynamic stack, then make sure that it is moved to the main + // fullscreen stack before enabling VR Mode. + // TODO: The goal of this code is to keep the VR app on the main display. When the + // stack implementation changes in the future, keep in mind that the use of the fullscreen + // stack is a means to move the activity to the main display and a moveActivityToDisplay() + // option would be a better choice here. + if (r.requestedVrComponent != null && r.getStackId() >= FIRST_DYNAMIC_STACK_ID) { + Slog.i(TAG, "Moving " + r.shortComponentName + " from stack " + r.getStackId() + + " to main stack for VR"); + moveTaskToStack(r.getTask().taskId, FULLSCREEN_WORKSPACE_STACK_ID, true /* toTop */); + } mHandler.sendMessage( mHandler.obtainMessage(VR_MODE_CHANGE_MSG, 0, 0, r)); }