Loading core/java/android/app/UiAutomation.java +16 −7 Original line number Original line Diff line number Diff line Loading @@ -1206,12 +1206,14 @@ public final class UiAutomation { return null; return null; } } final ScreenshotHardwareBuffer screenshotBuffer = final ScreenshotHardwareBuffer screenshotBuffer = syncScreenCapture.getBuffer(); syncScreenCapture.getBuffer(); if (screenshotBuffer == null) { Log.e(LOG_TAG, "Failed to take screenshot for display=" + mDisplayId); return null; } Bitmap screenShot = screenshotBuffer.asBitmap(); Bitmap screenShot = screenshotBuffer.asBitmap(); if (screenShot == null) { if (screenShot == null) { Log.e(LOG_TAG, "mUiAutomationConnection.takeScreenshot() returned null for display " Log.e(LOG_TAG, "Failed to take screenshot for display=" + mDisplayId); + mDisplayId); return null; return null; } } Bitmap swBitmap; Bitmap swBitmap; Loading Loading @@ -1263,16 +1265,23 @@ public final class UiAutomation { ScreenCapture.createSyncCaptureListener(); ScreenCapture.createSyncCaptureListener(); try { try { if (!mUiAutomationConnection.takeSurfaceControlScreenshot(sc, syncScreenCapture)) { if (!mUiAutomationConnection.takeSurfaceControlScreenshot(sc, syncScreenCapture)) { Log.e(LOG_TAG, "Failed to take screenshot for window=" + window); return null; return null; } } } catch (RemoteException re) { } catch (RemoteException re) { Log.e(LOG_TAG, "Error while taking screenshot!", re); Log.e(LOG_TAG, "Error while taking screenshot!", re); return null; return null; } } ScreenCapture.ScreenshotHardwareBuffer captureBuffer = ScreenCapture.ScreenshotHardwareBuffer captureBuffer = syncScreenCapture.getBuffer(); syncScreenCapture.getBuffer(); if (captureBuffer == null) { Log.e(LOG_TAG, "Failed to take screenshot for window=" + window); return null; } Bitmap screenShot = captureBuffer.asBitmap(); Bitmap screenShot = captureBuffer.asBitmap(); if (screenShot == null) { Log.e(LOG_TAG, "Failed to take screenshot for window=" + window); return null; } Bitmap swBitmap; Bitmap swBitmap; try (HardwareBuffer buffer = captureBuffer.getHardwareBuffer()) { try (HardwareBuffer buffer = captureBuffer.getHardwareBuffer()) { swBitmap = screenShot.copy(Bitmap.Config.ARGB_8888, false); swBitmap = screenShot.copy(Bitmap.Config.ARGB_8888, false); Loading core/java/android/window/ScreenCapture.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.graphics.ColorSpace; import android.graphics.PixelFormat; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Rect; import android.hardware.HardwareBuffer; import android.hardware.HardwareBuffer; import android.os.Build; import android.os.IBinder; import android.os.IBinder; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; Loading @@ -42,7 +43,8 @@ import java.util.function.ObjIntConsumer; */ */ public class ScreenCapture { public class ScreenCapture { private static final String TAG = "ScreenCapture"; private static final String TAG = "ScreenCapture"; private static final int SCREENSHOT_WAIT_TIME_S = 1; private static final int SCREENSHOT_WAIT_TIME_S = 4 * Build.HW_TIMEOUT_MULTIPLIER; private static native int nativeCaptureDisplay(DisplayCaptureArgs captureArgs, private static native int nativeCaptureDisplay(DisplayCaptureArgs captureArgs, long captureListener); long captureListener); private static native int nativeCaptureLayers(LayerCaptureArgs captureArgs, private static native int nativeCaptureLayers(LayerCaptureArgs captureArgs, Loading Loading @@ -767,7 +769,10 @@ public class ScreenCapture { @Override @Override public ScreenshotHardwareBuffer getBuffer() { public ScreenshotHardwareBuffer getBuffer() { try { try { latch.await(SCREENSHOT_WAIT_TIME_S, TimeUnit.SECONDS); if (!latch.await(SCREENSHOT_WAIT_TIME_S, TimeUnit.SECONDS)) { Log.e(TAG, "Timed out waiting for screenshot results"); return null; } return bufferRef[0]; return bufferRef[0]; } catch (Exception e) { } catch (Exception e) { Log.e(TAG, "Failed to wait for screen capture result", e); Log.e(TAG, "Failed to wait for screen capture result", e); Loading @@ -791,6 +796,7 @@ public class ScreenCapture { * Get the {@link ScreenshotHardwareBuffer} synchronously. This can be null if the * Get the {@link ScreenshotHardwareBuffer} synchronously. This can be null if the * screenshot failed or if there was no callback in {@link #SCREENSHOT_WAIT_TIME_S} seconds. * screenshot failed or if there was no callback in {@link #SCREENSHOT_WAIT_TIME_S} seconds. */ */ @Nullable public abstract ScreenshotHardwareBuffer getBuffer(); public abstract ScreenshotHardwareBuffer getBuffer(); } } } } Loading
core/java/android/app/UiAutomation.java +16 −7 Original line number Original line Diff line number Diff line Loading @@ -1206,12 +1206,14 @@ public final class UiAutomation { return null; return null; } } final ScreenshotHardwareBuffer screenshotBuffer = final ScreenshotHardwareBuffer screenshotBuffer = syncScreenCapture.getBuffer(); syncScreenCapture.getBuffer(); if (screenshotBuffer == null) { Log.e(LOG_TAG, "Failed to take screenshot for display=" + mDisplayId); return null; } Bitmap screenShot = screenshotBuffer.asBitmap(); Bitmap screenShot = screenshotBuffer.asBitmap(); if (screenShot == null) { if (screenShot == null) { Log.e(LOG_TAG, "mUiAutomationConnection.takeScreenshot() returned null for display " Log.e(LOG_TAG, "Failed to take screenshot for display=" + mDisplayId); + mDisplayId); return null; return null; } } Bitmap swBitmap; Bitmap swBitmap; Loading Loading @@ -1263,16 +1265,23 @@ public final class UiAutomation { ScreenCapture.createSyncCaptureListener(); ScreenCapture.createSyncCaptureListener(); try { try { if (!mUiAutomationConnection.takeSurfaceControlScreenshot(sc, syncScreenCapture)) { if (!mUiAutomationConnection.takeSurfaceControlScreenshot(sc, syncScreenCapture)) { Log.e(LOG_TAG, "Failed to take screenshot for window=" + window); return null; return null; } } } catch (RemoteException re) { } catch (RemoteException re) { Log.e(LOG_TAG, "Error while taking screenshot!", re); Log.e(LOG_TAG, "Error while taking screenshot!", re); return null; return null; } } ScreenCapture.ScreenshotHardwareBuffer captureBuffer = ScreenCapture.ScreenshotHardwareBuffer captureBuffer = syncScreenCapture.getBuffer(); syncScreenCapture.getBuffer(); if (captureBuffer == null) { Log.e(LOG_TAG, "Failed to take screenshot for window=" + window); return null; } Bitmap screenShot = captureBuffer.asBitmap(); Bitmap screenShot = captureBuffer.asBitmap(); if (screenShot == null) { Log.e(LOG_TAG, "Failed to take screenshot for window=" + window); return null; } Bitmap swBitmap; Bitmap swBitmap; try (HardwareBuffer buffer = captureBuffer.getHardwareBuffer()) { try (HardwareBuffer buffer = captureBuffer.getHardwareBuffer()) { swBitmap = screenShot.copy(Bitmap.Config.ARGB_8888, false); swBitmap = screenShot.copy(Bitmap.Config.ARGB_8888, false); Loading
core/java/android/window/ScreenCapture.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.graphics.ColorSpace; import android.graphics.PixelFormat; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Rect; import android.hardware.HardwareBuffer; import android.hardware.HardwareBuffer; import android.os.Build; import android.os.IBinder; import android.os.IBinder; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; Loading @@ -42,7 +43,8 @@ import java.util.function.ObjIntConsumer; */ */ public class ScreenCapture { public class ScreenCapture { private static final String TAG = "ScreenCapture"; private static final String TAG = "ScreenCapture"; private static final int SCREENSHOT_WAIT_TIME_S = 1; private static final int SCREENSHOT_WAIT_TIME_S = 4 * Build.HW_TIMEOUT_MULTIPLIER; private static native int nativeCaptureDisplay(DisplayCaptureArgs captureArgs, private static native int nativeCaptureDisplay(DisplayCaptureArgs captureArgs, long captureListener); long captureListener); private static native int nativeCaptureLayers(LayerCaptureArgs captureArgs, private static native int nativeCaptureLayers(LayerCaptureArgs captureArgs, Loading Loading @@ -767,7 +769,10 @@ public class ScreenCapture { @Override @Override public ScreenshotHardwareBuffer getBuffer() { public ScreenshotHardwareBuffer getBuffer() { try { try { latch.await(SCREENSHOT_WAIT_TIME_S, TimeUnit.SECONDS); if (!latch.await(SCREENSHOT_WAIT_TIME_S, TimeUnit.SECONDS)) { Log.e(TAG, "Timed out waiting for screenshot results"); return null; } return bufferRef[0]; return bufferRef[0]; } catch (Exception e) { } catch (Exception e) { Log.e(TAG, "Failed to wait for screen capture result", e); Log.e(TAG, "Failed to wait for screen capture result", e); Loading @@ -791,6 +796,7 @@ public class ScreenCapture { * Get the {@link ScreenshotHardwareBuffer} synchronously. This can be null if the * Get the {@link ScreenshotHardwareBuffer} synchronously. This can be null if the * screenshot failed or if there was no callback in {@link #SCREENSHOT_WAIT_TIME_S} seconds. * screenshot failed or if there was no callback in {@link #SCREENSHOT_WAIT_TIME_S} seconds. */ */ @Nullable public abstract ScreenshotHardwareBuffer getBuffer(); public abstract ScreenshotHardwareBuffer getBuffer(); } } } }