diff options
-rw-r--r-- | core/java/android/view/SurfaceControl.java | 27 | ||||
-rw-r--r-- | core/jni/android_view_SurfaceControl.cpp | 10 | ||||
-rw-r--r-- | services/core/java/com/android/server/display/DisplayManagerService.java | 11 |
3 files changed, 40 insertions, 8 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index aaf85aff2e8f..ee91c8519ff4 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -88,7 +88,8 @@ public final class SurfaceControl implements Parcelable { private static native void nativeDisconnect(long nativeObject); private static native GraphicBuffer nativeScreenshot(IBinder displayToken, - Rect sourceCrop, int width, int height, boolean useIdentityTransform, int rotation); + Rect sourceCrop, int width, int height, boolean useIdentityTransform, int rotation, + boolean captureSecureLayers); private static native GraphicBuffer nativeCaptureLayers(IBinder layerHandleToken, Rect sourceCrop, float frameScale); @@ -1853,7 +1854,29 @@ public final class SurfaceControl implements Parcelable { throw new IllegalArgumentException("displayToken must not be null"); } - return nativeScreenshot(display, sourceCrop, width, height, useIdentityTransform, rotation); + return nativeScreenshot(display, sourceCrop, width, height, useIdentityTransform, rotation, + false /* captureSecureLayers */); + } + + /** + * Like screenshotToBuffer, but if the caller is AID_SYSTEM, allows + * for the capture of secure layers. This is used for the screen rotation + * animation where the system server takes screenshots but does + * not persist them or allow them to leave the server. However in other + * cases in the system server, we mostly want to omit secure layers + * like when we take a screenshot on behalf of the assistant. + * + * @hide + */ + public static GraphicBuffer screenshotToBufferWithSecureLayersUnsafe(IBinder display, + Rect sourceCrop, int width, int height, boolean useIdentityTransform, + int rotation) { + if (display == null) { + throw new IllegalArgumentException("displayToken must not be null"); + } + + return nativeScreenshot(display, sourceCrop, width, height, useIdentityTransform, rotation, + true /* captureSecureLayers */); } private static void rotateCropForSF(Rect crop, int rot) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 003ee37995af..4069e95d8c35 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -205,7 +205,7 @@ static Rect rectFromObj(JNIEnv* env, jobject rectObj) { static jobject nativeScreenshot(JNIEnv* env, jclass clazz, jobject displayTokenObj, jobject sourceCropObj, jint width, jint height, - bool useIdentityTransform, int rotation) { + bool useIdentityTransform, int rotation, bool captureSecureLayers) { sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj); if (displayToken == NULL) { return NULL; @@ -213,9 +213,9 @@ static jobject nativeScreenshot(JNIEnv* env, jclass clazz, Rect sourceCrop = rectFromObj(env, sourceCropObj); sp<GraphicBuffer> buffer; status_t res = ScreenshotClient::capture(displayToken, ui::Dataspace::V0_SRGB, - ui::PixelFormat::RGBA_8888, - sourceCrop, width, height, - useIdentityTransform, rotation, &buffer); + ui::PixelFormat::RGBA_8888, + sourceCrop, width, height, + useIdentityTransform, rotation, captureSecureLayers, &buffer); if (res != NO_ERROR) { return NULL; } @@ -1232,7 +1232,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetOverrideScalingMode }, {"nativeGetHandle", "(J)Landroid/os/IBinder;", (void*)nativeGetHandle }, - {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIZI)Landroid/graphics/GraphicBuffer;", + {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIZIZ)Landroid/graphics/GraphicBuffer;", (void*)nativeScreenshot }, {"nativeCaptureLayers", "(Landroid/os/IBinder;Landroid/graphics/Rect;F)Landroid/graphics/GraphicBuffer;", (void*)nativeCaptureLayers }, diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index b0209973edbf..01d19c04d97e 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -37,7 +37,9 @@ import android.content.pm.ParceledListSlice; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.ColorSpace; +import android.graphics.GraphicBuffer; import android.graphics.Point; +import android.graphics.Rect; import android.hardware.SensorManager; import android.hardware.display.AmbientBrightnessDayStats; import android.hardware.display.BrightnessChangeEvent; @@ -1277,7 +1279,14 @@ public final class DisplayManagerService extends SystemService { if (token == null) { return false; } - SurfaceControl.screenshot(token, outSurface); + final GraphicBuffer gb = SurfaceControl.screenshotToBufferWithSecureLayersUnsafe( + token, new Rect(), 0 /* width */, 0 /* height */, false /* useIdentityTransform */, + 0 /* rotation */); + try { + outSurface.attachAndQueueBuffer(gb); + } catch (RuntimeException e) { + Slog.w(TAG, "Failed to take screenshot - " + e.getMessage()); + } return true; } |