From 6c71c0b86b67080bd79d695d0e3a1c9d00e38d98 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Fri, 1 Apr 2016 15:10:31 -0700 Subject: [PATCH] Never "save" if the surface control is null. This may or may not happen, but putting in some preventative measure and extra logging to help debug crashes related to null mSurfaceController. bug: 27533667 Change-Id: I010147da819402c48efd26a7cc631776052a702d --- .../com/android/server/wm/WindowState.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 57ead8b3a617f..0f515db38ed1f 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1878,6 +1878,11 @@ final class WindowState implements WindowManagerPolicy.WindowState { } private boolean shouldSaveSurface() { + if (mWinAnimator.mSurfaceController == null) { + // Don't bother if the surface controller is gone for any reason. + return false; + } + if ((mAttrs.flags & FLAG_SECURE) != 0) { // We don't save secure surfaces since their content shouldn't be shown while the app // isn't on screen and content might leak through during the transition animation with @@ -1951,10 +1956,18 @@ final class WindowState implements WindowManagerPolicy.WindowState { return; } mSurfaceSaved = false; - setHasSurface(true); - mWinAnimator.mDrawState = WindowStateAnimator.READY_TO_SHOW; - if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) { - Slog.v(TAG, "Restoring saved surface: " + this); + if (mWinAnimator.mSurfaceController != null) { + setHasSurface(true); + mWinAnimator.mDrawState = WindowStateAnimator.READY_TO_SHOW; + + if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) { + Slog.v(TAG, "Restoring saved surface: " + this); + } + } else { + // mSurfaceController shouldn't be null if mSurfaceSaved was still true at + // this point. Even if we destroyed the saved surface because of rotation + // or resize, mSurfaceSaved flag should have been cleared. So this is a wtf. + Slog.wtf(TAG, "Failed to restore saved surface: surface gone! " + this); } }