updateCallAttributes method

  1. @override
Future<CKCall?> updateCallAttributes(
  1. String uuid, {
  2. 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;
}