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

Commit b94c7a94 authored by Melody Hsu's avatar Melody Hsu Committed by Android (Google) Code Review
Browse files

Merge changes I57ad5add,I71ce6342 into main

* changes:
  Remove useIdentityTransform from DisplayCaptureArgs.
  Remove most uses of ScreenCapture#captureDisplay.
parents fa492c0d ab2dc1d0
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -528,14 +528,12 @@ public class ScreenCapture {
        private final IBinder mDisplayToken;
        private final int mWidth;
        private final int mHeight;
        private final boolean mUseIdentityTransform;

        private DisplayCaptureArgs(Builder builder) {
            super(builder);
            mDisplayToken = builder.mDisplayToken;
            mWidth = builder.mWidth;
            mHeight = builder.mHeight;
            mUseIdentityTransform = builder.mUseIdentityTransform;
        }

        /**
@@ -545,7 +543,6 @@ public class ScreenCapture {
            private IBinder mDisplayToken;
            private int mWidth;
            private int mHeight;
            private boolean mUseIdentityTransform;

            /**
             * Construct a new {@link LayerCaptureArgs} with the set parameters. The builder
@@ -586,17 +583,6 @@ public class ScreenCapture {
                return this;
            }

            /**
             * Replace the rotation transform of the display with the identity transformation while
             * taking the screenshot. This ensures the screenshot is taken in the ROTATION_0
             * orientation. Set this value to false if the screenshot should be taken in the
             * current screen orientation.
             */
            public Builder setUseIdentityTransform(boolean useIdentityTransform) {
                mUseIdentityTransform = useIdentityTransform;
                return this;
            }

            @Override
            Builder getThis() {
                return this;
+7 −0
Original line number Diff line number Diff line
@@ -32,3 +32,10 @@ flag {
    description: "Enable public API for Window Surfaces"
    bug: "287076178"
}

flag {
    namespace: "window_surfaces"
    name: "remove_capture_display"
    description: "Remove uses of ScreenCapture#captureDisplay"
    bug: "293445881"
}
 No newline at end of file
+0 −6
Original line number Diff line number Diff line
@@ -53,7 +53,6 @@ static struct {
    jfieldID displayToken;
    jfieldID width;
    jfieldID height;
    jfieldID useIdentityTransform;
} gDisplayCaptureArgsClassInfo;

static struct {
@@ -194,9 +193,6 @@ static DisplayCaptureArgs displayCaptureArgsFromObject(JNIEnv* env,
            env->GetIntField(displayCaptureArgsObject, gDisplayCaptureArgsClassInfo.width);
    captureArgs.height =
            env->GetIntField(displayCaptureArgsObject, gDisplayCaptureArgsClassInfo.height);
    captureArgs.useIdentityTransform =
            env->GetBooleanField(displayCaptureArgsObject,
                                 gDisplayCaptureArgsClassInfo.useIdentityTransform);
    return captureArgs;
}

@@ -325,8 +321,6 @@ int register_android_window_ScreenCapture(JNIEnv* env) {
            GetFieldIDOrDie(env, displayCaptureArgsClazz, "mWidth", "I");
    gDisplayCaptureArgsClassInfo.height =
            GetFieldIDOrDie(env, displayCaptureArgsClazz, "mHeight", "I");
    gDisplayCaptureArgsClassInfo.useIdentityTransform =
            GetFieldIDOrDie(env, displayCaptureArgsClazz, "mUseIdentityTransform", "Z");

    jclass layerCaptureArgsClazz =
            FindClassOrDie(env, "android/window/ScreenCapture$LayerCaptureArgs");
+76 −30
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCE
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK;

import static com.android.window.flags.Flags.removeCaptureDisplay;

import android.accessibilityservice.AccessibilityGestureEvent;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
@@ -1440,8 +1442,29 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
                    AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY, callback);
            return;
        }

        final long identity = Binder.clearCallingIdentity();
        if (removeCaptureDisplay()) {
            try {
                ScreenCapture.ScreenCaptureListener screenCaptureListener = new
                        ScreenCapture.ScreenCaptureListener(
                        (screenshotBuffer, result) -> {
                            if (screenshotBuffer != null && result == 0) {
                                sendScreenshotSuccess(screenshotBuffer, callback);
                            } else {
                                sendScreenshotFailure(
                                        AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY,
                                        callback);
                            }
                        }
                );
                mWindowManagerService.captureDisplay(displayId, null, screenCaptureListener);
            } catch (Exception e) {
                sendScreenshotFailure(AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY,
                        callback);
            } finally {
                Binder.restoreCallingIdentity(identity);
            }
        } else {
            try {
                mMainHandler.post(PooledLambda.obtainRunnable((nonArg) -> {
                    final ScreenshotHardwareBuffer screenshotBuffer = LocalServices
@@ -1450,16 +1473,20 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
                        sendScreenshotSuccess(screenshotBuffer, callback);
                    } else {
                        sendScreenshotFailure(
                            AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY, callback);
                                AccessibilityService.ERROR_TAKE_SCREENSHOT_INVALID_DISPLAY,
                                callback);
                    }
                }, null).recycleOnUse());
            } finally {
                Binder.restoreCallingIdentity(identity);
            }
        }
    }

    private void sendScreenshotSuccess(ScreenshotHardwareBuffer screenshotBuffer,
            RemoteCallback callback) {
        if (removeCaptureDisplay()) {
            mMainHandler.post(PooledLambda.obtainRunnable((nonArg) -> {
                final HardwareBuffer hardwareBuffer = screenshotBuffer.getHardwareBuffer();
                final ParcelableColorSpace colorSpace =
                        new ParcelableColorSpace(screenshotBuffer.getColorSpace());
@@ -1476,6 +1503,25 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
                // Send back the result.
                callback.sendResult(payload);
                hardwareBuffer.close();
            }, null).recycleOnUse());
        } else {
            final HardwareBuffer hardwareBuffer = screenshotBuffer.getHardwareBuffer();
            final ParcelableColorSpace colorSpace =
                    new ParcelableColorSpace(screenshotBuffer.getColorSpace());

            final Bundle payload = new Bundle();
            payload.putInt(KEY_ACCESSIBILITY_SCREENSHOT_STATUS,
                    AccessibilityService.TAKE_SCREENSHOT_SUCCESS);
            payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER,
                    hardwareBuffer);
            payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace);
            payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP,
                    SystemClock.uptimeMillis());

            // Send back the result.
            callback.sendResult(payload);
            hardwareBuffer.close();
        }
    }

    private void sendScreenshotFailure(@AccessibilityService.ScreenshotErrorCode int errorCode,
+15 −1
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_SCREEN_ROTATI
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.utils.CoordinateTransforms.computeRotationMatrix;
import static com.android.window.flags.Flags.removeCaptureDisplay;

import android.animation.ArgbEvaluator;
import android.content.Context;
@@ -170,7 +171,7 @@ class ScreenRotationAnimation {

        try {
            final ScreenCapture.ScreenshotHardwareBuffer screenshotBuffer;
            if (isSizeChanged) {
            if (isSizeChanged && !removeCaptureDisplay()) {
                final DisplayAddress address = displayInfo.address;
                if (!(address instanceof DisplayAddress.Physical)) {
                    Slog.e(TAG, "Display does not have a physical address: " + displayId);
@@ -196,6 +197,19 @@ class ScreenRotationAnimation {
                                .setHintForSeamlessTransition(true)
                                .build();
                screenshotBuffer = ScreenCapture.captureDisplay(captureArgs);
            } else if (isSizeChanged) {
                // Temporarily not skip screenshot for the rounded corner overlays and screenshot
                // the whole display to include the rounded corner overlays.
                setSkipScreenshotForRoundedCornerOverlays(false, t);
                ScreenCapture.LayerCaptureArgs captureArgs =
                        new ScreenCapture.LayerCaptureArgs.Builder(
                                displayContent.getSurfaceControl())
                                .setCaptureSecureLayers(true)
                                .setAllowProtected(true)
                                .setSourceCrop(new Rect(0, 0, width, height))
                                .setHintForSeamlessTransition(true)
                                .build();
                screenshotBuffer = ScreenCapture.captureLayers(captureArgs);
            } else {
                ScreenCapture.LayerCaptureArgs captureArgs =
                        new ScreenCapture.LayerCaptureArgs.Builder(
Loading