diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowAnimator.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 14 |
2 files changed, 15 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 0b11dd28e595..92a9e30c2f0a 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -75,6 +75,7 @@ public class WindowAnimator { * vsync-app and then schedule the animation tick at the right time (vsync-sf). */ private boolean mAnimationFrameCallbackScheduled; + boolean mNotifyWhenNoAnimation = false; /** * A list of runnable that need to be run after {@link WindowContainer#prepareSurfaces} is @@ -97,6 +98,9 @@ public class WindowAnimator { synchronized (mService.mGlobalLock) { mAnimationFrameCallbackScheduled = false; animate(frameTimeNs); + if (mNotifyWhenNoAnimation && !mLastRootAnimating) { + mService.mGlobalLock.notifyAll(); + } } }; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 3ecc173909c6..8e457522c4b0 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -193,7 +193,6 @@ import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.DisplayMetrics; -import android.util.Log; import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; @@ -7746,9 +7745,16 @@ public class WindowManagerService extends IWindowManager.Stub t.syncInputWindows().apply(); } + /** + * Wait until all container animations and surface operations behalf of WindowManagerService + * complete. + */ private void waitForAnimationsToComplete() { synchronized (mGlobalLock) { long timeoutRemaining = ANIMATION_COMPLETED_TIMEOUT_MS; + // This could prevent if there is no container animation, we still have to apply the + // pending transaction and exit waiting. + mAnimator.mNotifyWhenNoAnimation = true; while ((mAnimator.isAnimationScheduled() || mRoot.isAnimating(TRANSITION | CHILDREN)) && timeoutRemaining > 0) { long startTime = System.currentTimeMillis(); @@ -7758,9 +7764,11 @@ public class WindowManagerService extends IWindowManager.Stub } timeoutRemaining -= (System.currentTimeMillis() - startTime); } + mAnimator.mNotifyWhenNoAnimation = false; - if (mRoot.isAnimating(TRANSITION | CHILDREN)) { - Log.w(TAG, "Timed out waiting for animations to complete."); + if (mAnimator.isAnimationScheduled() + || mRoot.isAnimating(TRANSITION | CHILDREN)) { + Slog.w(TAG, "Timed out waiting for animations to complete."); } } } |