Drop the hardware buffer

Closing the hardware buffer after sending over to the requesting app,
and adding the document that the app developer has to close the buffer
ASAP.

Bug: 150174095
Test: atest AccessibilityTakeScreenshotTest
Change-Id: I8e759a7d83c0a9adfd1b37d0bbf515c9babde7a4
This commit is contained in:
Jacky Kao
2020-02-27 10:37:20 +08:00
parent 979600dce1
commit 4082aa2e19
2 changed files with 18 additions and 11 deletions

View File

@@ -2400,6 +2400,10 @@ public abstract class AccessibilityService extends Service {
/**
* 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
*/

View File

@@ -1023,18 +1023,21 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
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);