From eb66557eeb923cf33a4c2e133776ab8cbc9aa571 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Mon, 9 May 2016 18:28:27 -0700 Subject: [PATCH] Make sure preserved surface is removed when it's no longer needed Preserved surface might be used for format change as well as surface size change outside a drag resizing. We currently remove the preserved surface in prepareSurfaceLocked() after the window is shown, but sometimes app gets stopped before any animation pass is run. bug: 28546172 Change-Id: I7f883f4b5c6da4dce70f94173b368a912056d062 --- .../java/com/android/server/wm/AppWindowToken.java | 7 +++++-- .../com/android/server/wm/WindowStateAnimator.java | 11 ++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 805c986b1445f..de613aaa94ad2 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -329,11 +329,14 @@ class AppWindowToken extends WindowToken { final DisplayContentList displayList = new DisplayContentList(); for (int i = allWindows.size() - 1; i >= 0; i--) { final WindowState win = allWindows.get(i); - if (!win.mDestroying) { + + if (!(mAppStopped || win.mWindowRemovalAllowed)) { continue; } - if (!(mAppStopped || win.mWindowRemovalAllowed)) { + win.mWinAnimator.destroyPreservedSurfaceLocked(); + + if (!win.mDestroying) { continue; } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index e5f603c7865bc..f88e30b3c5e57 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -659,6 +659,13 @@ class WindowStateAnimator { mDestroyPreservedSurfaceUponRedraw = false; } + void markPreservedSurfaceForDestroy() { + if (mDestroyPreservedSurfaceUponRedraw + && !mService.mDestroyPreservedSurface.contains(mWin)) { + mService.mDestroyPreservedSurface.add(mWin); + } + } + WindowSurfaceController createSurfaceLocked() { final WindowState w = mWin; if (w.hasSavedSurface()) { @@ -1518,9 +1525,7 @@ class WindowStateAnimator { if (prepared && mLastHidden && mDrawState == HAS_DRAWN) { if (showSurfaceRobustlyLocked()) { - if (mDestroyPreservedSurfaceUponRedraw) { - mService.mDestroyPreservedSurface.add(mWin); - } + markPreservedSurfaceForDestroy(); mAnimator.requestRemovalOfReplacedWindows(w); mLastHidden = false; if (mIsWallpaper) {