diff options
3 files changed, 30 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 525e0ff1e8dd..71ecaf61da48 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1107,7 +1107,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree mAppAnimator.lastFreezeDuration = 0; mService.mAppsFreezingScreen++; if (mService.mAppsFreezingScreen == 1) { - mService.startFreezingDisplayLocked(false, 0, 0); + mService.startFreezingDisplayLocked(false, 0, 0, getDisplayContent()); mService.mH.removeMessages(H.APP_FREEZE_TIMEOUT); mService.mH.sendEmptyMessageDelayed(H.APP_FREEZE_TIMEOUT, 2000); } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index eef4c9b0f4a0..a8e0d761afc3 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -987,7 +987,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } if (!rotateSeamlessly) { - mService.startFreezingDisplayLocked(inTransaction, anim[0], anim[1]); + mService.startFreezingDisplayLocked(inTransaction, anim[0], anim[1], this); // startFreezingDisplayLocked can reset the ScreenRotationAnimation. screenRotationAnimation = mService.mAnimator.getScreenRotationAnimationLocked( mDisplayId); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 9d1b3d9ed81a..6fd153e13551 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -20,7 +20,6 @@ import static android.Manifest.permission.MANAGE_APP_TOKENS; import static android.Manifest.permission.READ_FRAME_BUFFER; import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS; import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; -import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW; import static android.app.StatusBarManager.DISABLE_MASK; import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED; @@ -33,6 +32,7 @@ import static android.os.Process.THREAD_PRIORITY_DISPLAY; import static android.os.Process.myPid; import static android.os.UserHandle.USER_NULL; import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.Display.INVALID_DISPLAY; import static android.view.WindowManager.DOCKED_INVALID; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; @@ -724,6 +724,9 @@ public class WindowManagerService extends IWindowManager.Stub // For frozen screen animations. private int mExitAnimId, mEnterAnimId; + // The display that the rotation animation is applying to. + private int mFrozenDisplayId; + /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */ int mTransactionSequence; @@ -2449,7 +2452,7 @@ public class WindowManagerService extends IWindowManager.Stub } else { mPolicy.selectRotationAnimationLw(anim); } - startFreezingDisplayLocked(false, anim[0], anim[1]); + startFreezingDisplayLocked(false, anim[0], anim[1], displayContent); config = new Configuration(mTempConfiguration); } } @@ -5555,7 +5558,7 @@ public class WindowManagerService extends IWindowManager.Stub if (configChanged) { mWaitingForConfig = true; startFreezingDisplayLocked(false /* inTransaction */, 0 /* exitAnim */, - 0 /* enterAnim */); + 0 /* enterAnim */, displayContent); mH.obtainMessage(H.SEND_NEW_CONFIGURATION, displayId).sendToTarget(); } @@ -5862,6 +5865,12 @@ public class WindowManagerService extends IWindowManager.Stub } void startFreezingDisplayLocked(boolean inTransaction, int exitAnim, int enterAnim) { + startFreezingDisplayLocked(inTransaction, exitAnim, enterAnim, + getDefaultDisplayContentLocked()); + } + + void startFreezingDisplayLocked(boolean inTransaction, int exitAnim, int enterAnim, + DisplayContent displayContent) { if (mDisplayFrozen) { return; } @@ -5882,6 +5891,10 @@ public class WindowManagerService extends IWindowManager.Stub mDisplayFreezeTime = SystemClock.elapsedRealtime(); mLastFinishedFreezeSource = null; + // {@link mDisplayFrozen} prevents us from freezing on multiple displays at the same time. + // As a result, we only track the display that has initially froze the screen. + mFrozenDisplayId = displayContent.getDisplayId(); + mInputMonitor.freezeInputDispatchingLw(); // Clear the last input window -- that is just used for @@ -5901,10 +5914,8 @@ public class WindowManagerService extends IWindowManager.Stub if (CUSTOM_SCREEN_ROTATION) { mExitAnimId = exitAnim; mEnterAnimId = enterAnim; - final DisplayContent displayContent = getDefaultDisplayContentLocked(); - final int displayId = displayContent.getDisplayId(); ScreenRotationAnimation screenRotationAnimation = - mAnimator.getScreenRotationAnimationLocked(displayId); + mAnimator.getScreenRotationAnimationLocked(mFrozenDisplayId); if (screenRotationAnimation != null) { screenRotationAnimation.kill(); } @@ -5915,8 +5926,10 @@ public class WindowManagerService extends IWindowManager.Stub // TODO(multidisplay): rotation on main screen only. displayContent.updateDisplayInfo(); screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent, - mFxSession, inTransaction, mPolicy.isDefaultOrientationForced(), isSecure, this); - mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation); + mFxSession, inTransaction, mPolicy.isDefaultOrientationForced(), isSecure, + this); + mAnimator.setScreenRotationAnimationLocked(mFrozenDisplayId, + screenRotationAnimation); } } @@ -5940,6 +5953,13 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_ORIENTATION) Slog.d(TAG_WM, "stopFreezingDisplayLocked: Unfreezing now"); + final DisplayContent displayContent = mRoot.getDisplayContent(mFrozenDisplayId); + + // We must make a local copy of the displayId as it can be potentially overwritten later on + // in this method. For example, {@link startFreezingDisplayLocked} may be called as a result + // of update rotation, but we reference the frozen display after that call in this method. + final int displayId = mFrozenDisplayId; + mFrozenDisplayId = INVALID_DISPLAY; mDisplayFrozen = false; mLastDisplayFreezeDuration = (int)(SystemClock.elapsedRealtime() - mDisplayFreezeTime); StringBuilder sb = new StringBuilder(128); @@ -5958,8 +5978,6 @@ public class WindowManagerService extends IWindowManager.Stub boolean updateRotation = false; - final DisplayContent displayContent = getDefaultDisplayContentLocked(); - final int displayId = displayContent.getDisplayId(); ScreenRotationAnimation screenRotationAnimation = mAnimator.getScreenRotationAnimationLocked(displayId); if (CUSTOM_SCREEN_ROTATION && screenRotationAnimation != null |