Merge "Don't release surface if relayout is visible" into nyc-mr1-dev

This commit is contained in:
Chong Zhang
2016-07-15 18:26:27 +00:00
committed by Android (Google) Code Review

View File

@@ -2907,9 +2907,23 @@ public class WindowManagerService extends IWindowManager.Stub
} }
result |= RELAYOUT_RES_SURFACE_CHANGED; result |= RELAYOUT_RES_SURFACE_CHANGED;
} }
final WindowSurfaceController surfaceController = winAnimator.mSurfaceController;
if (viewVisibility == View.VISIBLE && surfaceController != null) {
// We already told the client to go invisible, but the message may not be
// handled yet, or it might want to draw a last frame. If we already have a
// surface, let the client use that, but don't create new surface at this point.
surfaceController.getSurface(outSurface);
} else {
if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win);
outSurface.release(); try {
if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win); Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmReleaseOutSurface_"
+ win.mAttrs.getTitle());
outSurface.release();
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}
}
} }
if (focusMayChange) { if (focusMayChange) {
@@ -3044,6 +3058,7 @@ public class WindowManagerService extends IWindowManager.Stub
} else { } else {
// For some reason there isn't a surface. Clear the // For some reason there isn't a surface. Clear the
// caller's object so they see the same state. // caller's object so they see the same state.
Slog.w(TAG_WM, "Failed to create surface control for " + win);
outSurface.release(); outSurface.release();
} }
return result; return result;