Merge "Drop the hardware buffer" into rvc-dev
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 23cbdcd..a712956 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -2400,6 +2400,10 @@
 
         /**
          * Gets the {@link HardwareBuffer} representing a memory buffer of the screenshot.
+         * <p>
+         * <strong>Note:</strong> The application should call {@link HardwareBuffer#close()} when
+         * the buffer is no longer needed to free the underlying resources.
+         * </p>
          *
          * @return the hardware buffer
          */
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index b905a39..4052942 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -1023,18 +1023,21 @@
                                 displaySize.x, displaySize.y, false,
                                 rotation);
                 final GraphicBuffer graphicBuffer = screenshotBuffer.getGraphicBuffer();
-                final HardwareBuffer hardwareBuffer =
-                        HardwareBuffer.createFromGraphicBuffer(graphicBuffer);
-                final ParcelableColorSpace colorSpace =
-                        new ParcelableColorSpace(screenshotBuffer.getColorSpace());
+                try (HardwareBuffer hardwareBuffer =
+                        HardwareBuffer.createFromGraphicBuffer(graphicBuffer)) {
+                    final ParcelableColorSpace colorSpace =
+                            new ParcelableColorSpace(screenshotBuffer.getColorSpace());
 
-                // Send back the result.
-                final Bundle payload = new Bundle();
-                payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER,
-                        hardwareBuffer);
-                payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace);
-                payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP, SystemClock.uptimeMillis());
-                callback.sendResult(payload);
+                    // Send back the result.
+                    final Bundle payload = new Bundle();
+                    payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_HARDWAREBUFFER,
+                            hardwareBuffer);
+                    payload.putParcelable(KEY_ACCESSIBILITY_SCREENSHOT_COLORSPACE, colorSpace);
+                    payload.putLong(KEY_ACCESSIBILITY_SCREENSHOT_TIMESTAMP,
+                            SystemClock.uptimeMillis());
+                    callback.sendResult(payload);
+                    hardwareBuffer.close();
+                }
             }, null).recycleOnUse());
         } finally {
             Binder.restoreCallingIdentity(identity);