Loading core/java/android/view/SurfaceControl.java +10 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ public class SurfaceControl { throws OutOfResourcesException; private static native void nativeRelease(long nativeObject); private static native void nativeDestroy(long nativeObject); private static native void nativeDisconnect(long nativeObject); private static native Bitmap nativeScreenshot(IBinder displayToken, Rect sourceCrop, int width, int height, int minLayer, int maxLayer, Loading Loading @@ -341,6 +342,15 @@ public class SurfaceControl { mCloseGuard.close(); } /** * Disconnect any client still connected to the surface. */ public void disconnect() { if (mNativeObject != 0) { nativeDisconnect(mNativeObject); } } private void checkNotReleased() { if (mNativeObject == 0) throw new NullPointerException( "mNativeObject is null. Have you called release() already?"); Loading core/jni/android_view_SurfaceControl.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,13 @@ static void nativeDestroy(JNIEnv* env, jclass clazz, jlong nativeObject) { ctrl->decStrong((void *)nativeCreate); } static void nativeDisconnect(JNIEnv* env, jclass clazz, jlong nativeObject) { SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); if (ctrl != NULL) { ctrl->disconnect(); } } static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, jobject displayTokenObj, jobject sourceCropObj, jint width, jint height, jint minLayer, jint maxLayer, bool allLayers, bool useIdentityTransform, Loading Loading @@ -595,6 +602,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeRelease }, {"nativeDestroy", "(J)V", (void*)nativeDestroy }, {"nativeDisconnect", "(J)V", (void*)nativeDisconnect }, {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIIIZZI)Landroid/graphics/Bitmap;", (void*)nativeScreenshotBitmap }, {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/view/Surface;Landroid/graphics/Rect;IIIIZZ)V", Loading services/core/java/com/android/server/wm/WindowState.java +6 −0 Original line number Diff line number Diff line Loading @@ -1902,6 +1902,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { mWinAnimator.hide("saved surface"); mWinAnimator.mDrawState = WindowStateAnimator.NO_SURFACE; setHasSurface(false); // The client should have disconnected at this point, but if it doesn't, // we need to make sure it's disconnected. Otherwise when we reuse the surface // the client can't reconnect to the buffer queue, and rendering will fail. if (mWinAnimator.mSurfaceController != null) { mWinAnimator.mSurfaceController.disconnectInTransaction(); } } else { mWinAnimator.destroySurfaceLocked(); } Loading services/core/java/com/android/server/wm/WindowSurfaceController.java +14 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,20 @@ class WindowSurfaceController { } } void disconnectInTransaction() { if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { Slog.i(TAG, "Disconnecting client: " + this); } try { if (mSurfaceControl != null) { mSurfaceControl.disconnect(); } } catch (RuntimeException e) { Slog.w(TAG, "Error disconnecting surface in: " + this, e); } } void setCropInTransaction(Rect clipRect, boolean recoveringMemory) { if (SHOW_TRANSACTIONS) logSurface( "CROP " + clipRect.toShortString(), null); Loading Loading
core/java/android/view/SurfaceControl.java +10 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ public class SurfaceControl { throws OutOfResourcesException; private static native void nativeRelease(long nativeObject); private static native void nativeDestroy(long nativeObject); private static native void nativeDisconnect(long nativeObject); private static native Bitmap nativeScreenshot(IBinder displayToken, Rect sourceCrop, int width, int height, int minLayer, int maxLayer, Loading Loading @@ -341,6 +342,15 @@ public class SurfaceControl { mCloseGuard.close(); } /** * Disconnect any client still connected to the surface. */ public void disconnect() { if (mNativeObject != 0) { nativeDisconnect(mNativeObject); } } private void checkNotReleased() { if (mNativeObject == 0) throw new NullPointerException( "mNativeObject is null. Have you called release() already?"); Loading
core/jni/android_view_SurfaceControl.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,13 @@ static void nativeDestroy(JNIEnv* env, jclass clazz, jlong nativeObject) { ctrl->decStrong((void *)nativeCreate); } static void nativeDisconnect(JNIEnv* env, jclass clazz, jlong nativeObject) { SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); if (ctrl != NULL) { ctrl->disconnect(); } } static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, jobject displayTokenObj, jobject sourceCropObj, jint width, jint height, jint minLayer, jint maxLayer, bool allLayers, bool useIdentityTransform, Loading Loading @@ -595,6 +602,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeRelease }, {"nativeDestroy", "(J)V", (void*)nativeDestroy }, {"nativeDisconnect", "(J)V", (void*)nativeDisconnect }, {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIIIZZI)Landroid/graphics/Bitmap;", (void*)nativeScreenshotBitmap }, {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/view/Surface;Landroid/graphics/Rect;IIIIZZ)V", Loading
services/core/java/com/android/server/wm/WindowState.java +6 −0 Original line number Diff line number Diff line Loading @@ -1902,6 +1902,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { mWinAnimator.hide("saved surface"); mWinAnimator.mDrawState = WindowStateAnimator.NO_SURFACE; setHasSurface(false); // The client should have disconnected at this point, but if it doesn't, // we need to make sure it's disconnected. Otherwise when we reuse the surface // the client can't reconnect to the buffer queue, and rendering will fail. if (mWinAnimator.mSurfaceController != null) { mWinAnimator.mSurfaceController.disconnectInTransaction(); } } else { mWinAnimator.destroySurfaceLocked(); } Loading
services/core/java/com/android/server/wm/WindowSurfaceController.java +14 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,20 @@ class WindowSurfaceController { } } void disconnectInTransaction() { if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { Slog.i(TAG, "Disconnecting client: " + this); } try { if (mSurfaceControl != null) { mSurfaceControl.disconnect(); } } catch (RuntimeException e) { Slog.w(TAG, "Error disconnecting surface in: " + this, e); } } void setCropInTransaction(Rect clipRect, boolean recoveringMemory) { if (SHOW_TRANSACTIONS) logSurface( "CROP " + clipRect.toShortString(), null); Loading