screenshotMessageChannel property
Implementation
@visibleForTesting
BasicMessageChannel<ByteData> get screenshotMessageChannel {
if (_screenshotMessageChannel != null) {
return _screenshotMessageChannel!;
}
WidgetsFlutterBinding.ensureInitialized();
const rvalue = BasicMessageChannel<ByteData>(
'cobrowse_sdk_flutter/screenshot', BinaryCodec());
rvalue.setMessageHandler((ByteData? call) async {
double scale = 1.0;
if (call != null && call.buffer.lengthInBytes >= 8) {
final bd = call.buffer.asByteData(0, 8);
scale = bd.getFloat64(0, Endian.little);
}
final frame =
await _CobrowseScreenshot()._captureAppScreenshot(scale: scale);
if (frame == null) {
return ByteData(0);
}
if (frame.rgba.length != frame.width * frame.height * 4) {
throw StateError('Unexpected RGBA length: got ${frame.rgba.length}, '
'expected ${frame.width * frame.height * 4}');
}
const headerSize = 8;
final Uint8List msg = Uint8List(headerSize + frame.rgba.length);
final ByteData header = ByteData.view(msg.buffer, 0, headerSize);
header.setUint32(0, frame.width, Endian.little);
header.setUint32(4, frame.height, Endian.little);
msg.setRange(8, msg.length, frame.rgba);
return ByteData.view(msg.buffer, 0, msg.length);
});
return _screenshotMessageChannel = rvalue;
}