Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6265a0fc authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[RESTRICT AUTOMERGE]: Exclude secure layers from most screenshots taken...

Merge "[RESTRICT AUTOMERGE]: Exclude secure layers from most screenshots taken by the system server." into pi-dev
parents abbe99e0 dc49e008
Loading
Loading
Loading
Loading
+24 −2
Original line number Original line Diff line number Diff line
@@ -74,7 +74,8 @@ public class SurfaceControl implements Parcelable {
            boolean allLayers, boolean useIdentityTransform, int rotation);
            boolean allLayers, boolean useIdentityTransform, int rotation);
    private static native GraphicBuffer nativeScreenshotToBuffer(IBinder displayToken,
    private static native GraphicBuffer nativeScreenshotToBuffer(IBinder displayToken,
            Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
            Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
            boolean allLayers, boolean useIdentityTransform, int rotation);
            boolean allLayers, boolean useIdentityTransform, int rotation,
            boolean captureSecureLayers);
    private static native void nativeScreenshot(IBinder displayToken, Surface consumer,
    private static native void nativeScreenshot(IBinder displayToken, Surface consumer,
            Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
            Rect sourceCrop, int width, int height, int minLayer, int maxLayer,
            boolean allLayers, boolean useIdentityTransform);
            boolean allLayers, boolean useIdentityTransform);
@@ -1249,7 +1250,28 @@ public class SurfaceControl implements Parcelable {
        IBinder displayToken = SurfaceControl.getBuiltInDisplay(
        IBinder displayToken = SurfaceControl.getBuiltInDisplay(
                SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
                SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
        return nativeScreenshotToBuffer(displayToken, sourceCrop, width, height,
        return nativeScreenshotToBuffer(displayToken, sourceCrop, width, height,
                minLayer, maxLayer, false, useIdentityTransform, rotation);
                minLayer, maxLayer, false, 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(Rect sourceCrop,
            int width, int height, int minLayer, int maxLayer, boolean useIdentityTransform,
            int rotation) {
        IBinder displayToken = SurfaceControl.getBuiltInDisplay(
                SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
        return nativeScreenshotToBuffer(displayToken, sourceCrop, width, height,
                minLayer, maxLayer, false, useIdentityTransform, rotation,
                true /* captureSecureLayers */);
    }
    }


    /**
    /**
+3 −3
Original line number Original line Diff line number Diff line
@@ -160,7 +160,7 @@ static Rect rectFromObj(JNIEnv* env, jobject rectObj) {
static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz,
static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz,
        jobject displayTokenObj, jobject sourceCropObj, jint width, jint height,
        jobject displayTokenObj, jobject sourceCropObj, jint width, jint height,
        jint minLayer, jint maxLayer, bool allLayers, bool useIdentityTransform,
        jint minLayer, jint maxLayer, bool allLayers, bool useIdentityTransform,
        int rotation) {
        int rotation, bool captureSecureLayers) {
    sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
    sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
    if (displayToken == NULL) {
    if (displayToken == NULL) {
        return NULL;
        return NULL;
@@ -173,7 +173,7 @@ static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz,
    sp<GraphicBuffer> buffer;
    sp<GraphicBuffer> buffer;
    status_t res = ScreenshotClient::capture(displayToken,
    status_t res = ScreenshotClient::capture(displayToken,
            sourceCrop, width, height, minLayer, maxLayer, useIdentityTransform,
            sourceCrop, width, height, minLayer, maxLayer, useIdentityTransform,
            rotation, &buffer);
            rotation, captureSecureLayers, &buffer);
    if (res != NO_ERROR) {
    if (res != NO_ERROR) {
        return NULL;
        return NULL;
    }
    }
@@ -1026,7 +1026,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
    {"nativeGetHandle", "(J)Landroid/os/IBinder;",
    {"nativeGetHandle", "(J)Landroid/os/IBinder;",
            (void*)nativeGetHandle },
            (void*)nativeGetHandle },
    {"nativeScreenshotToBuffer",
    {"nativeScreenshotToBuffer",
     "(Landroid/os/IBinder;Landroid/graphics/Rect;IIIIZZI)Landroid/graphics/GraphicBuffer;",
     "(Landroid/os/IBinder;Landroid/graphics/Rect;IIIIZZIZ)Landroid/graphics/GraphicBuffer;",
     (void*)nativeScreenshotToBuffer },
     (void*)nativeScreenshotToBuffer },
    {"nativeCaptureLayers", "(Landroid/os/IBinder;Landroid/graphics/Rect;F)Landroid/graphics/GraphicBuffer;",
    {"nativeCaptureLayers", "(Landroid/os/IBinder;Landroid/graphics/Rect;F)Landroid/graphics/GraphicBuffer;",
            (void*)nativeCaptureLayers },
            (void*)nativeCaptureLayers },
+16 −4
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import static com.android.server.wm.ScreenRotationAnimationProto.ANIMATION_RUNNI
import static com.android.server.wm.ScreenRotationAnimationProto.STARTED;
import static com.android.server.wm.ScreenRotationAnimationProto.STARTED;


import android.content.Context;
import android.content.Context;
import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.IBinder;
@@ -285,10 +286,21 @@ class ScreenRotationAnimation {
            if (displayHandle != null) {
            if (displayHandle != null) {
                Surface sur = new Surface();
                Surface sur = new Surface();
                sur.copyFrom(mSurfaceControl);
                sur.copyFrom(mSurfaceControl);
                SurfaceControl.screenshot(displayHandle, sur);
                GraphicBuffer gb = SurfaceControl.screenshotToBufferWithSecureLayersUnsafe(
                        new Rect(), 0 /* width */, 0 /* height */, 0 /* minLayer */,
                        0 /* maxLayer */, false /* useIdentityTransform */, 0 /* rotation */);
                if (gb != null) {
                    try {
                        sur.attachAndQueueBuffer(gb);
                    } catch (RuntimeException e) {
                        Slog.w(TAG, "Failed to attach screenshot - " + e.getMessage());
                    }
                    t.setLayer(mSurfaceControl, SCREEN_FREEZE_LAYER_SCREENSHOT);
                    t.setLayer(mSurfaceControl, SCREEN_FREEZE_LAYER_SCREENSHOT);
                    t.setAlpha(mSurfaceControl, 0);
                    t.setAlpha(mSurfaceControl, 0);
                    t.show(mSurfaceControl);
                    t.show(mSurfaceControl);
                } else {
                    Slog.w(TAG, "Unable to take screenshot of display " + displayId);
                }
                sur.destroy();
                sur.destroy();
            } else {
            } else {
                Slog.w(TAG, "Built-in display " + displayId + " is null.");
                Slog.w(TAG, "Built-in display " + displayId + " is null.");