screenshotMessageChannel property

  1. @visibleForTesting
BasicMessageChannel<ByteData> get screenshotMessageChannel

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;
}