diff --git a/api/current.txt b/api/current.txt index 475506a317bc5..4cacbcd67f1f7 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2953,7 +2953,7 @@ package android.accessibilityservice { } public static final class AccessibilityService.ScreenshotResult { - method @Nullable public android.graphics.ColorSpace getColorSpace(); + method @NonNull public android.graphics.ColorSpace getColorSpace(); method @NonNull public android.hardware.HardwareBuffer getHardwareBuffer(); method public long getTimestamp(); } diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index b65f68e177ca2..32ed0ddffc2b1 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -29,6 +29,7 @@ import android.content.Intent; import android.content.pm.ParceledListSlice; import android.graphics.Bitmap; import android.graphics.ColorSpace; +import android.graphics.ParcelableColorSpace; import android.graphics.Region; import android.hardware.HardwareBuffer; import android.os.Binder; @@ -39,6 +40,7 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteCallback; import android.os.RemoteException; +import android.os.SystemClock; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; @@ -591,8 +593,12 @@ public abstract class AccessibilityService extends Service { "screenshot_hardwareBuffer"; /** @hide */ - public static final String KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE_ID = - "screenshot_colorSpaceId"; + public static final String KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE = + "screenshot_colorSpace"; + + /** @hide */ + public static final String KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP = + "screenshot_timestamp"; /** * Callback for {@link android.view.accessibility.AccessibilityEvent}s. @@ -1911,6 +1917,8 @@ public abstract class AccessibilityService extends Service { * default display. * @param executor Executor on which to run the callback. * @param callback The callback invoked when the taking screenshot is done. + * The {@link AccessibilityService.ScreenshotResult} will be null for an + * invalid display. * * @return {@code true} if the taking screenshot accepted, {@code false} if not. */ @@ -1932,14 +1940,11 @@ public abstract class AccessibilityService extends Service { } final HardwareBuffer hardwareBuffer = result.getParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER); - final int colorSpaceId = - result.getInt(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE_ID); - ColorSpace colorSpace = null; - if (colorSpaceId >= 0 && colorSpaceId < ColorSpace.Named.values().length) { - colorSpace = ColorSpace.get(ColorSpace.Named.values()[colorSpaceId]); - } + final ParcelableColorSpace colorSpace = + result.getParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE); ScreenshotResult screenshot = new ScreenshotResult(hardwareBuffer, - colorSpace, System.currentTimeMillis()); + colorSpace.getColorSpace(), + result.getLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP)); sendScreenshotResult(executor, callback, screenshot); })); } catch (RemoteException re) { @@ -2352,41 +2357,38 @@ public abstract class AccessibilityService extends Service { } /** - * Class including hardwareBuffer, colorSpace, and timestamp to be the result for + * Can be used to construct a bitmap of the screenshot or any other operations for * {@link AccessibilityService#takeScreenshot} API. - *
- * Note: colorSpace would be null if the name of this colorSpace isn't at - * {@link ColorSpace.Named}. - *
*/ public static final class ScreenshotResult { private final @NonNull HardwareBuffer mHardwareBuffer; - private final @Nullable ColorSpace mColorSpace; + private final @NonNull ColorSpace mColorSpace; private final long mTimestamp; private ScreenshotResult(@NonNull HardwareBuffer hardwareBuffer, - @Nullable ColorSpace colorSpace, long timestamp) { + @NonNull ColorSpace colorSpace, long timestamp) { Preconditions.checkNotNull(hardwareBuffer, "hardwareBuffer cannot be null"); + Preconditions.checkNotNull(colorSpace, "colorSpace cannot be null"); mHardwareBuffer = hardwareBuffer; mColorSpace = colorSpace; mTimestamp = timestamp; } /** - * Gets the colorSpace identifying a specific organization of colors of the screenshot. + * Gets the {@link ColorSpace} identifying a specific organization of colors of the + * screenshot. * - * @return the colorSpace or {@code null} if the name of colorSpace isn't at - * {@link ColorSpace.Named} + * @return the color space */ - @Nullable + @NonNull public ColorSpace getColorSpace() { return mColorSpace; } /** - * Gets the hardwareBuffer representing a memory buffer of the screenshot. + * Gets the {@link HardwareBuffer} representing a memory buffer of the screenshot. * - * @return the hardwareBuffer + * @return the hardware buffer */ @NonNull public HardwareBuffer getHardwareBuffer() { @@ -2396,7 +2398,8 @@ public abstract class AccessibilityService extends Service { /** * Gets the timestamp of taking the screenshot. * - * @return the timestamp from {@link System#currentTimeMillis()} + * @return milliseconds of non-sleep uptime before screenshot since boot and it's from + * {@link SystemClock#uptimeMillis()} */ public long getTimestamp() { return mTimestamp; diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index 75ec4b04eeeda..6c8aaf465c446 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -16,8 +16,9 @@ package com.android.server.accessibility; -import static android.accessibilityservice.AccessibilityService.KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE_ID; +import static android.accessibilityservice.AccessibilityService.KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE; import static android.accessibilityservice.AccessibilityService.KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER; +import static android.accessibilityservice.AccessibilityService.KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP; import static android.accessibilityservice.AccessibilityServiceInfo.DEFAULT; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS; @@ -39,6 +40,7 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.graphics.GraphicBuffer; +import android.graphics.ParcelableColorSpace; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; @@ -1021,13 +1023,15 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final GraphicBuffer graphicBuffer = screenshotBuffer.getGraphicBuffer(); final HardwareBuffer hardwareBuffer = HardwareBuffer.createFromGraphicBuffer(graphicBuffer); - final int colorSpaceId = screenshotBuffer.getColorSpace().getId(); + final ParcelableColorSpace colorSpace = + new ParcelableColorSpace(screenshotBuffer.getColorSpace()); // Send back the result. final Bundle payload = new Bundle(); payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER, hardwareBuffer); - payload.putInt(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE_ID, colorSpaceId); + payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace); + payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP, SystemClock.uptimeMillis()); callback.sendResult(payload); }, null).recycleOnUse()); } finally {