summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java14
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.");
}
}
}