RcsSegmentedMessage constructor
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),
]);
}
}