updateCallAttributes method
Future<CKCall?>
updateCallAttributes(
- String uuid, {
- required Set<
CKCallAttributes> attributes,
override
Update the call attributes of a call in the callkit UI.
Implementation
@override
Future<CKCall?> updateCallAttributes(
String uuid, {
required Set<CKCallAttributes> attributes,
}) async {
final call = _callManager.getCall(uuid);
if (call == null) {
printDebug("Call with uuid: $uuid not found.", tag: tag);
return null;
}
// Moderate attributes based on call state and capabilities.
Set<CKCallAttributes> moderatedAttributes = {};
for (var value in attributes) {
switch (value) {
case CKCallAttributes.mute:
final hasCapability = call.capabilities.contains(CKCapability.mute);
if (!hasCapability) {
printDebug("Mute attribute not supported. Please enable it with CKCapability.mute.", tag: tag);
} else {
moderatedAttributes.add(value);
}
case CKCallAttributes.hold:
final hasCapabilityHold = call.capabilities.contains(CKCapability.hold);
final hasCapabilitySupportHold = call.capabilities.contains(CKCapability.supportHold);
// if call state is initiated or dialing, we can hold with support hold capability.
// if call is active, we can hold with hold attribute.
if (!hasCapabilityHold && !hasCapabilitySupportHold) {
printDebug("Hold attribute not supported. Please enable it with CKCapability.supportHold or CKCapability.hold.", tag: tag);
} else {
switch (call.state) {
case CKCallState.initiated:
case CKCallState.dialing:
if (hasCapabilitySupportHold) {
moderatedAttributes.add(value);
} else {
printDebug("Hold attribute not supported in current state: ${call.state}", tag: tag);
}
break;
case CKCallState.active:
if (hasCapabilityHold || hasCapabilitySupportHold) {
moderatedAttributes.add(value);
}
break;
default:
printDebug("Hold attribute not supported in current state: ${call.state}", tag: tag);
break;
}
}
}
}
final update = call.copyWith(attributes: moderatedAttributes);
_callManager.updateCall(update);
final metadata = _notificationManager.getNotification(uuid)?.metadata;
final ckCapabilities = update.capabilities;
final notification = _generateNotification(call: update, capabilities: ckCapabilities, metadata: metadata);
await _notificationManager.add(notification, flags: _defaultFlags);
return update;
}