From 48146fdd66f00fc77dbbc43cde6995c334477559 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Mon, 7 Aug 2017 11:22:50 -0700 Subject: [PATCH] Rotate only VR secondary display The rotation tracking and logic in PhoneWindowManager assumes that there is only one display in the system, so we can't enable rotation for all displays just yet. For now will update only VR display. Change-Id: Ia35b4e919155a043eae4e3e97bd15a583e9476e2 Fixes: 64393199 Test: android.server.cts.ActivityManagerDisplayTests Test: #testRotationNotAffectingSecondaryScreen --- .../server/wm/RootWindowContainer.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 40528d06f665f..7bcad9fd852f3 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -52,6 +52,7 @@ import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_DEFAULT; import static android.app.AppOpsManager.OP_NONE; import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.Display.INVALID_DISPLAY; import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE; @@ -760,16 +761,21 @@ class RootWindowContainer extends WindowContainer { if (mUpdateRotation) { if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); - - for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - final DisplayContent displayContent = mChildren.get(displayNdx); - final int displayId = displayContent.getDisplayId(); - if (displayContent.updateRotationUnchecked(false /* inTransaction */)) { - mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget(); - } else if (displayId == DEFAULT_DISPLAY) { - // TODO(multi-display): Track rotation updates for different displays separately - mUpdateRotation = false; - } + // TODO(multi-display): Update rotation for different displays separately. + final int displayId = defaultDisplay.getDisplayId(); + if (defaultDisplay.updateRotationUnchecked(false /* inTransaction */)) { + mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget(); + } else { + mUpdateRotation = false; + } + // Update rotation of VR virtual display separately. Currently this is the only kind of + // secondary display that can be rotated because of the single-display limitations in + // PhoneWindowManager. + final DisplayContent vrDisplay = mService.mVr2dDisplayId != INVALID_DISPLAY + ? getDisplayContent(mService.mVr2dDisplayId) : null; + if (vrDisplay != null && vrDisplay.updateRotationUnchecked(false /* inTransaction */)) { + mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, mService.mVr2dDisplayId) + .sendToTarget(); } }