From 2639da500e3d53ea3a17d888b1c0001d043c6b98 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Mon, 9 Jul 2012 09:39:06 -0700 Subject: [PATCH] Fix hang on rotation. A recent optimization to only send updates to WindowManagerService when there is something to report backfired. One bit indicating change had negative polarity so the update should also have been sent when this bit was cleared. This change alters the bit to positive polarity. Fixes bug 6780496. Change-Id: I3336812a60534ebffc9e94b2fb1d0df4d6969bca --- services/java/com/android/server/wm/WindowAnimator.java | 3 ++- .../java/com/android/server/wm/WindowManagerService.java | 5 +++-- services/java/com/android/server/wm/WindowStateAnimator.java | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index fd9be5eb406c5..af373e4adf1e4 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -8,6 +8,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION; import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE; import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED; +import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE; import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS; @@ -506,7 +507,7 @@ public class WindowAnimator { private void animateLocked() { mPendingLayoutChanges = 0; mCurrentTime = SystemClock.uptimeMillis(); - mBulkUpdateParams = 0; + mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE; boolean wasAnimating = mAnimating; mAnimating = false; if (WindowManagerService.DEBUG_WINDOW_TRACE) { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 5f5c9b3c6f93e..48bad9f69d70d 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -631,7 +631,7 @@ public class WindowManagerService extends IWindowManager.Stub static final int SET_UPDATE_ROTATION = 1 << 0; static final int SET_WALLPAPER_MAY_CHANGE = 1 << 1; static final int SET_FORCE_HIDING_CHANGED = 1 << 2; - static final int CLEAR_ORIENTATION_CHANGE_COMPLETE = 1 << 3; + static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 3; static final int SET_TURN_ON_SCREEN = 1 << 4; boolean mWallpaperForceHidingChanged = false; @@ -7344,7 +7344,8 @@ public class WindowManagerService extends IWindowManager.Stub mInnerFields.mWallpaperForceHidingChanged = true; doRequest = true; } - if ((bulkUpdateParams & LayoutFields.CLEAR_ORIENTATION_CHANGE_COMPLETE) != 0) { + if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) + == 0) { mInnerFields.mOrientationChangeComplete = false; } else { mInnerFields.mOrientationChangeComplete = true; diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 012e58b86d9de..794dadec19783 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -5,7 +5,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; -import static com.android.server.wm.WindowManagerService.LayoutFields.CLEAR_ORIENTATION_CHANGE_COMPLETE; +import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE; import static com.android.server.wm.WindowManagerService.LayoutFields.SET_TURN_ON_SCREEN; import android.content.Context; @@ -1226,7 +1226,7 @@ class WindowStateAnimator { if (displayed) { if (w.mOrientationChanging) { if (!w.isDrawnLw()) { - mAnimator.mBulkUpdateParams |= CLEAR_ORIENTATION_CHANGE_COMPLETE; + mAnimator.mBulkUpdateParams &= ~SET_ORIENTATION_CHANGE_COMPLETE; if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation continue waiting for draw in " + w); } else {