handleBackgroundCall function

Future<void> handleBackgroundCall(
  1. DRBackgroundClient client,
  2. PushPayload payload
)

FCM 的后台处理函数中的来电(Android,App 不在前台时):来电显示全屏来电通知(正在打电话的以忙线拒绝), 未接、取消把通知替换为数据中的标题和正文,清除来电通知的取消通知(《2.功能概述文档》第 8.2、8.3 节)。

Implementation

Future<void> handleBackgroundCall(DRBackgroundClient client, PushPayload payload) async {
  if (payload is DismissPush) {
    await CallNative.instance.invoke<void>('endCall', {'callId': payload.callId, 'reason': 'answeredElsewhere'});
    return;
  }
  if (payload is! CallPush) return;
  final id = payload.callId;
  switch (payload.event) {
    case 'incoming':
      if (await CallNative.instance.invoke<bool>('activeSystemCall') ?? false) {
        await client.rejectCall(id, reason: 'busy').catchError((Object _) {});
        return;
      }
      final expires = payload.ringExpiresAt;
      if (expires != null && expires.isBefore(DateTime.now())) return;
      await CallNative.instance.invoke<void>('reportIncoming', {
        'callId': id,
        'callerName': payload.callerName ?? payload.title ?? '',
        'video': payload.data?['media'] == 'video',
        'ringExpiresAt': ?expires?.millisecondsSinceEpoch,
      });
    case 'missed':
    case 'canceled':
      await CallNative.instance.invoke<void>('endCall', {'callId': id, 'reason': 'unanswered'});
      if (payload.title != null) await CallNative.instance.invoke<void>('showMissed', {'callId': id, 'title': payload.title, 'body': payload.body ?? ''});
  }
}