feat(video_calls): fixed navigation from voip push

This commit is contained in:
misha
2026-06-17 11:06:22 +03:00
parent 95c1d40c79
commit 65d529b0af
5 changed files with 210 additions and 8 deletions

View File

@@ -49,8 +49,11 @@ class VideoCallCallKitCoordinator {
if (Platform.isIOS) {
_voipDiagnosticsChannel.setMethodCallHandler((call) async {
if (call.method == 'voipDiagnosticsUpdated') {
_scheduleNativeVoipDiagnosticsDrain();
switch (call.method) {
case 'voipDiagnosticsUpdated':
_scheduleNativeVoipDiagnosticsDrain();
case 'acceptedVoipCall':
await _handleNativeAcceptedVoipCall(call.arguments);
}
});
await _firebaseApi.registerPushToken();
@@ -245,6 +248,57 @@ class VideoCallCallKitCoordinator {
);
}
Future<void> _handleNativeAcceptedVoipCall(Object? arguments) async {
if (!Platform.isIOS) return;
final data = _stringKeyedMap(arguments);
final extra = _stringKeyedMap(data['extra']);
final callKitId = _parseString(data, const ['id', 'uuid']);
if (callKitId == null) {
log(
'VideoCallCallKitCoordinator: native acceptedVoipCall without callKitId, data=$data',
name: 'VideoCallCallKit',
);
return;
}
final conversationUuid = _parseConversationUuid(
extra,
handle: _parseString(data, const ['handle']),
);
if (conversationUuid.isEmpty) {
log(
'VideoCallCallKitCoordinator: native acceptedVoipCall without conversationUuid, data=$data',
name: 'VideoCallCallKit',
);
return;
}
await _deliverIncomingAccept(
callKitId: callKitId,
conversationUuid: conversationUuid,
counterpartName:
_parseString(extra, const [
'counterpartName',
'caller_name',
'callerName',
]) ??
_parseString(data, const ['nameCaller']),
counterpartAvatarUrl:
_parseString(extra, const [
'counterpartAvatarUrl',
'avatar',
'avatarUrl',
'caller_avatar',
]) ??
_parseString(data, const ['avatar']),
localParticipantName: _parseString(extra, const [
'localParticipantName',
'local_participant_name',
]),
);
}
Future<void> _handleAccept(String callKitId) async {
if (_acceptHandledCallKitIds.contains(callKitId)) return;
@@ -384,7 +438,7 @@ class VideoCallCallKitCoordinator {
}
static String _parseConversationUuid(
Map<String, dynamic> extra, {
Map<String, Object?> extra, {
String? handle,
}) {
final fromExtra = _parseString(extra, const [
@@ -401,7 +455,7 @@ class VideoCallCallKitCoordinator {
return '';
}
static String? _parseString(Map<String, dynamic> map, List<String> keys) {
static String? _parseString(Map<String, Object?> map, List<String> keys) {
for (final key in keys) {
final value = map[key];
if (value is String && value.trim().isNotEmpty) {