RcsSegmentedMessage constructor

RcsSegmentedMessage(
  1. String message, [
  2. RcsRegion region = RcsRegion.us
])

Calculates the RCS billing of message in region.

Implementation

RcsSegmentedMessage(this.message, [this.region = RcsRegion.us]) {
  final utf8Bytes = countUtf8Bytes(message);
  numberOfBytes = utf8Bytes;
  messageSize = utf8Bytes * 8;
  totalSize = messageSize;

  if (utf8Bytes == 0) {
    segmentsCount = 0;
    messageType =
        region == RcsRegion.us ? RcsMessageType.rich : RcsMessageType.basic;
    segments = const [];
    return;
  }

  if (region == RcsRegion.us) {
    segmentsCount = (utf8Bytes / rcsSegmentCapacityBytes).ceil();
    messageType = RcsMessageType.rich;

    final result = <RcsSegment>[];
    var remaining = utf8Bytes;
    for (var index = 0; index < segmentsCount; index += 1) {
      final used = remaining < rcsSegmentCapacityBytes
          ? remaining
          : rcsSegmentCapacityBytes;
      result.add(RcsSegment(
        index: index,
        capacity: rcsSegmentCapacityBytes,
        used: used,
      ));
      remaining -= used;
    }
    segments = List.unmodifiable(result);
  } else {
    // International: no segmentation. Billing is classification-based:
    // Basic (≤160 bytes) or Single (>160 bytes).
    // Capacity reflects the tier limit so the UI shows meaningful "remaining."
    segmentsCount = 1;
    final isBasic = utf8Bytes <= rcsSegmentCapacityBytes;
    messageType = isBasic ? RcsMessageType.basic : RcsMessageType.single;
    final capacity =
        isBasic ? rcsSegmentCapacityBytes : rcsSingleCapacityBytes;
    segments = List.unmodifiable([
      RcsSegment(index: 0, capacity: capacity, used: utf8Bytes),
    ]);
  }
}