Avoid entering display freeze mode when using seamless rotation.

If we enter seamless rotation through the
Activity#setRequestedOrientation->updateOrientationFromAppTokens(conf,
ibinder) codepath, it will helpfully try to freeze the display for us
after updating the orientation. Normally only
updateRotationUncheckedLocked does this and so the seamless rotation
logic there would prevent it...however in this path we fail to prevent
it and strange strange things happen.

Bug: 30642017
Change-Id: I12e94905781975f59384d609d12fa54b9fa4fba0
This commit is contained in:
Robert Carr
2016-09-21 13:42:52 -07:00
committed by Rob Carr
parent d031d57c9e
commit 73a1fa7f2c
2 changed files with 9 additions and 1 deletions

View File

@@ -3790,7 +3790,11 @@ public class WindowManagerService extends IWindowManager.Stub
Configuration config = null;
if (updateOrientationFromAppTokensLocked(false)) {
if (freezeThisOneIfNeeded != null) {
// If we changed the orientation but mOrientationChangeComplete is
// already true, we used seamless rotation, and we don't need
// to freeze the screen.
if (freezeThisOneIfNeeded != null &&
!mWindowPlacerLocked.mOrientationChangeComplete) {
AppWindowToken atoken = findAppWindowToken(freezeThisOneIfNeeded);
if (atoken != null) {
startAppFreezingScreenLocked(atoken);

View File

@@ -101,6 +101,10 @@ class WindowSurfacePlacer {
static final int SET_WALLPAPER_ACTION_PENDING = 1 << 5;
boolean mWallpaperMayChange = false;
// During an orientation change, we track whether all windows have rendered
// at the new orientation, and this will be false from changing orientation until that occurs.
// For seamless rotation cases this always stays true, as the windows complete their orientation
// changes 1 by 1 without disturbing global state.
boolean mOrientationChangeComplete = true;
boolean mWallpaperActionPending = false;