diff --git a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt index 30f4989..a5a62c4 100644 --- a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt +++ b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverService.kt @@ -16,6 +16,7 @@ import dev.sanderling.driver.v1.Point import dev.sanderling.driver.v1.PressKeyRequest import dev.sanderling.driver.v1.RecentLogsRequest import dev.sanderling.driver.v1.Selector +import dev.sanderling.driver.v1.SnapshotResponse import dev.sanderling.driver.v1.SwipeRequest import dev.sanderling.driver.v1.Text import io.grpc.stub.StreamObserver @@ -27,6 +28,7 @@ class DriverService( ) : DriverGrpc.DriverImplBase() { private val launchedBundleId = AtomicReference(null) + private val snapshotLock = Any() override fun launch(request: LaunchRequest, responseObserver: StreamObserver) { runRpc(responseObserver) { @@ -116,6 +118,23 @@ class DriverService( } } + override fun snapshot(request: Empty, responseObserver: StreamObserver) { + runRpc(responseObserver) { + val sample = synchronized(snapshotLock) { backend.snapshot() } + val (png, width, height) = sample.screenshot + SnapshotResponse.newBuilder() + .setHierarchy(HierarchyJSON.newBuilder().setJson(sample.hierarchyJson).build()) + .setScreenshot( + Image.newBuilder() + .setPng(ByteString.copyFrom(png)) + .setWidth(width) + .setHeight(height) + .build(), + ) + .build() + } + } + override fun waitForIdle(request: Duration, responseObserver: StreamObserver) { runRpc(responseObserver) { backend.waitForIdle(request.millis)