Make sure NaturalSurfaceLayout is consistent with SurfaceControl
SurfaceControl and NaturalSurfaceLayout will be created in screen-off
mode. Screen-on animation also creates NaturalSurfaceLayout. And
NaturalSurfaceLayout uses the reference of SurfaceControl.
SurfaceControl points to NULL when screen-on process calls destory
function, which will not be called in screen-off process. It makes
NaturalSurfaceLayout's member points to the SurfaceControl with NULL.
Crash occurs by accessing the destroyed SurfaceControl.
This CL makes the creation of SurfaceControl and NaturalSurfaceLayout
to one-to-one.
Change-Id: Ic47ea73dea67d2aba4e3e0766d1353198d7dff1d
diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java
index 835ba17..a16fcd2 100644
--- a/services/core/java/com/android/server/display/ColorFade.java
+++ b/services/core/java/com/android/server/display/ColorFade.java
@@ -587,16 +587,16 @@
Slog.e(TAG, "Unable to create surface.", ex);
return false;
}
+
+ mSurfaceControl.setLayerStack(mDisplayLayerStack);
+ mSurfaceControl.setSize(mDisplayWidth, mDisplayHeight);
+ mSurface = new Surface();
+ mSurface.copyFrom(mSurfaceControl);
+
+ mSurfaceLayout = new NaturalSurfaceLayout(mDisplayManagerInternal,
+ mDisplayId, mSurfaceControl);
+ mSurfaceLayout.onDisplayTransaction();
}
-
- mSurfaceControl.setLayerStack(mDisplayLayerStack);
- mSurfaceControl.setSize(mDisplayWidth, mDisplayHeight);
- mSurface = new Surface();
- mSurface.copyFrom(mSurfaceControl);
-
- mSurfaceLayout = new NaturalSurfaceLayout(mDisplayManagerInternal,
- mDisplayId, mSurfaceControl);
- mSurfaceLayout.onDisplayTransaction();
} finally {
SurfaceControl.closeTransaction();
}