diff options
-rw-r--r-- | core/java/android/view/accessibility/AccessibilityInteractionClient.java | 13 | ||||
-rw-r--r-- | core/java/android/window/ScreenCapture.java | 20 | ||||
-rw-r--r-- | core/jni/android_window_ScreenCapture.cpp | 12 |
3 files changed, 30 insertions, 15 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java index f14ec37ca402..60f46e60ec9e 100644 --- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java +++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java @@ -831,8 +831,17 @@ public final class AccessibilityInteractionClient // A11yService -> App -> SurfaceFlinger -> A11yService ScreenCapture.ScreenCaptureListener listener = new ScreenCapture.ScreenCaptureListener( - screenshot -> sendWindowScreenshotSuccess(screenshot, - interactionId)); + (screenshot, status) -> { + if (status != 0) { + sendTakeScreenshotOfWindowError( + AccessibilityService + .ERROR_TAKE_SCREENSHOT_INTERNAL_ERROR, + interactionId); + } else { + sendWindowScreenshotSuccess(screenshot, + interactionId); + } + }); connection.takeScreenshotOfWindow(accessibilityWindowId, interactionId, listener, this); mMainHandler.postDelayed(() -> { diff --git a/core/java/android/window/ScreenCapture.java b/core/java/android/window/ScreenCapture.java index 0cc9c644f8ea..de0fe25ef96f 100644 --- a/core/java/android/window/ScreenCapture.java +++ b/core/java/android/window/ScreenCapture.java @@ -33,7 +33,7 @@ import libcore.util.NativeAllocationRegistry; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; +import java.util.function.ObjIntConsumer; /** * Handles display and layer captures for the system. @@ -43,13 +43,12 @@ import java.util.function.Consumer; public class ScreenCapture { private static final String TAG = "ScreenCapture"; private static final int SCREENSHOT_WAIT_TIME_S = 1; - private static native int nativeCaptureDisplay(DisplayCaptureArgs captureArgs, long captureListener); private static native int nativeCaptureLayers(LayerCaptureArgs captureArgs, long captureListener); private static native long nativeCreateScreenCaptureListener( - Consumer<ScreenshotHardwareBuffer> consumer); + ObjIntConsumer<ScreenshotHardwareBuffer> consumer); private static native void nativeWriteListenerToParcel(long nativeObject, Parcel out); private static native long nativeReadListenerFromParcel(Parcel in); private static native long getNativeListenerFinalizer(); @@ -695,7 +694,7 @@ public class ScreenCapture { /** * @param consumer The callback invoked when the screen capture is complete. */ - public ScreenCaptureListener(Consumer<ScreenshotHardwareBuffer> consumer) { + public ScreenCaptureListener(ObjIntConsumer<ScreenshotHardwareBuffer> consumer) { mNativeObject = nativeCreateScreenCaptureListener(consumer); sRegistry.registerNativeAllocation(this, mNativeObject); } @@ -748,8 +747,13 @@ public class ScreenCapture { public static SynchronousScreenCaptureListener createSyncCaptureListener() { ScreenshotHardwareBuffer[] bufferRef = new ScreenshotHardwareBuffer[1]; CountDownLatch latch = new CountDownLatch(1); - Consumer<ScreenshotHardwareBuffer> consumer = buffer -> { - bufferRef[0] = buffer; + ObjIntConsumer<ScreenshotHardwareBuffer> consumer = (buffer, status) -> { + if (status != 0) { + bufferRef[0] = null; + Log.e(TAG, "Failed to generate screen capture. Error code: " + status); + } else { + bufferRef[0] = buffer; + } latch.countDown(); }; @@ -758,7 +762,7 @@ public class ScreenCapture { // it references, the underlying JNI listener holds a weak reference to the consumer. // This property exists to ensure the consumer stays alive during the listener's // lifetime. - private Consumer<ScreenshotHardwareBuffer> mConsumer = consumer; + private ObjIntConsumer<ScreenshotHardwareBuffer> mConsumer = consumer; @Override public ScreenshotHardwareBuffer getBuffer() { @@ -779,7 +783,7 @@ public class ScreenCapture { * {@link #captureDisplay(DisplayCaptureArgs, ScreenCaptureListener)} */ public abstract static class SynchronousScreenCaptureListener extends ScreenCaptureListener { - SynchronousScreenCaptureListener(Consumer<ScreenshotHardwareBuffer> consumer) { + SynchronousScreenCaptureListener(ObjIntConsumer<ScreenshotHardwareBuffer> consumer) { super(consumer); } diff --git a/core/jni/android_window_ScreenCapture.cpp b/core/jni/android_window_ScreenCapture.cpp index e729750b812e..bdf7eaa8aace 100644 --- a/core/jni/android_window_ScreenCapture.cpp +++ b/core/jni/android_window_ScreenCapture.cpp @@ -102,7 +102,8 @@ public: } if (!captureResults.fenceResult.ok() || captureResults.buffer == nullptr) { - env->CallVoidMethod(consumer.get(), gConsumerClassInfo.accept, nullptr); + env->CallVoidMethod(consumer.get(), gConsumerClassInfo.accept, nullptr, + fenceStatus(captureResults.fenceResult)); checkAndClearException(env, "accept"); return binder::Status::ok(); } @@ -117,7 +118,8 @@ public: captureResults.capturedSecureLayers, captureResults.capturedHdrLayers); checkAndClearException(env, "builder"); - env->CallVoidMethod(consumer.get(), gConsumerClassInfo.accept, screenshotHardwareBuffer); + env->CallVoidMethod(consumer.get(), gConsumerClassInfo.accept, screenshotHardwareBuffer, + fenceStatus(captureResults.fenceResult)); checkAndClearException(env, "accept"); env->DeleteLocalRef(jhardwareBuffer); env->DeleteLocalRef(screenshotHardwareBuffer); @@ -285,7 +287,7 @@ static const JNINativeMethod sScreenCaptureMethods[] = { (void*)nativeCaptureDisplay }, {"nativeCaptureLayers", "(Landroid/window/ScreenCapture$LayerCaptureArgs;J)I", (void*)nativeCaptureLayers }, - {"nativeCreateScreenCaptureListener", "(Ljava/util/function/Consumer;)J", + {"nativeCreateScreenCaptureListener", "(Ljava/util/function/ObjIntConsumer;)J", (void*)nativeCreateScreenCaptureListener }, {"nativeWriteListenerToParcel", "(JLandroid/os/Parcel;)V", (void*)nativeWriteListenerToParcel }, {"nativeReadListenerFromParcel", "(Landroid/os/Parcel;)J", @@ -333,8 +335,8 @@ int register_android_window_ScreenCapture(JNIEnv* env) { gLayerCaptureArgsClassInfo.childrenOnly = GetFieldIDOrDie(env, layerCaptureArgsClazz, "mChildrenOnly", "Z"); - jclass consumer = FindClassOrDie(env, "java/util/function/Consumer"); - gConsumerClassInfo.accept = GetMethodIDOrDie(env, consumer, "accept", "(Ljava/lang/Object;)V"); + jclass consumer = FindClassOrDie(env, "java/util/function/ObjIntConsumer"); + gConsumerClassInfo.accept = GetMethodIDOrDie(env, consumer, "accept", "(Ljava/lang/Object;I)V"); jclass screenshotGraphicsBufferClazz = FindClassOrDie(env, "android/window/ScreenCapture$ScreenshotHardwareBuffer"); |