diff --git a/core/java/com/android/internal/view/ScrollCaptureViewSupport.java b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java index 8d63a400c63c5..2f25d60bf3aec 100644 --- a/core/java/com/android/internal/view/ScrollCaptureViewSupport.java +++ b/core/java/com/android/internal/view/ScrollCaptureViewSupport.java @@ -21,10 +21,12 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.HardwareRenderer; +import android.graphics.HardwareRenderer.SyncAndDrawResult; import android.graphics.RecordingCanvas; import android.graphics.Rect; import android.graphics.RenderNode; import android.os.CancellationSignal; +import android.os.SystemClock; import android.provider.Settings; import android.util.DisplayMetrics; import android.util.Log; @@ -52,7 +54,7 @@ import java.util.function.Consumer; @UiThread public class ScrollCaptureViewSupport implements ScrollCaptureCallback { - private static final String TAG = "ScrollCaptureViewSupport"; + private static final String TAG = "SCViewSupport"; private static final String SETTING_CAPTURE_DELAY = "screenshot.scroll_capture_delay"; private static final long SETTING_CAPTURE_DELAY_DEFAULT = 60L; // millis @@ -264,8 +266,25 @@ public class ScrollCaptureViewSupport implements ScrollCaptureCa if (signal.isCanceled()) { Log.w(TAG, "onScrollCaptureImageRequest: cancelled! skipping render."); } else { - mRenderer.renderView(view, viewCaptureArea); - onComplete.accept(new Rect(scrollResult.availableArea)); + int result = mRenderer.renderView(view, viewCaptureArea); + switch (result) { + case HardwareRenderer.SYNC_OK: + case HardwareRenderer.SYNC_REDRAW_REQUESTED: + /* Frame synced, buffer will be produced... notify client. */ + onComplete.accept(new Rect(scrollResult.availableArea)); + return; + case HardwareRenderer.SYNC_FRAME_DROPPED: + Log.e(TAG, "syncAndDraw(): SYNC_FRAME_DROPPED !"); + break; + case HardwareRenderer.SYNC_LOST_SURFACE_REWARD_IF_FOUND: + Log.e(TAG, "syncAndDraw(): SYNC_LOST_SURFACE !"); + break; + case HardwareRenderer.SYNC_CONTEXT_IS_STOPPED: + Log.e(TAG, "syncAndDraw(): SYNC_CONTEXT_IS_STOPPED !"); + break; + } + // No buffer will be produced. + onComplete.accept(new Rect(/* empty */)); } }; @@ -373,37 +392,16 @@ public class ScrollCaptureViewSupport implements ScrollCaptureCa mCaptureRenderNode.endRecording(); } - public void renderView(View view, Rect sourceRect) { + @SyncAndDrawResult + public int renderView(View view, Rect sourceRect) { + HardwareRenderer.FrameRenderRequest request = mRenderer.createRenderRequest(); + request.setVsyncTime(SystemClock.elapsedRealtimeNanos()); if (updateForView(view)) { setupLighting(view); } view.invalidate(); updateRootNode(view, sourceRect); - HardwareRenderer.FrameRenderRequest request = mRenderer.createRenderRequest(); - long timestamp = System.nanoTime(); - request.setVsyncTime(timestamp); - - // Would be nice to access nextFrameNumber from HwR without having to hold on to Surface - final long frameNumber = mSurface.getNextFrameNumber(); - - // Block until a frame is presented to the Surface - request.setWaitForPresent(true); - - switch (request.syncAndDraw()) { - case HardwareRenderer.SYNC_OK: - case HardwareRenderer.SYNC_REDRAW_REQUESTED: - return; - - case HardwareRenderer.SYNC_FRAME_DROPPED: - Log.e(TAG, "syncAndDraw(): SYNC_FRAME_DROPPED !"); - break; - case HardwareRenderer.SYNC_LOST_SURFACE_REWARD_IF_FOUND: - Log.e(TAG, "syncAndDraw(): SYNC_LOST_SURFACE !"); - break; - case HardwareRenderer.SYNC_CONTEXT_IS_STOPPED: - Log.e(TAG, "syncAndDraw(): SYNC_CONTEXT_IS_STOPPED !"); - break; - } + return request.syncAndDraw(); } public void trimMemory() {