Skip to content

Commit b9ce1cb

Browse files
committed
fix: exclude video calls from Call Pull list (WT-1618)
Pulling a video call offers an audio-only INVITE; the server answer keeps the original video m-line, the offer/answer m-line layout no longer matches and setRemoteDescription rejects it, so the pulled call fails. Thread a nullable has_video flag from the signaling dialog_info through the model and the drift store, and exclude known-video dialogs from the pull list (DialogInfo.pullable). The flag is nullable: until the backend reports media type it stays null and behaviour is unchanged (audio pull keeps working); once the backend sends has_video=true for video dialogs they drop out of the list automatically, with no further client change. - SignalingDialogInfo: parse/serialize has_video - DialogInfo: hasVideo field + pullable gate - app_database: dialog_info.has_video column + schema migration v24 - tests: signaling parsing, pullable gate
1 parent eb55858 commit b9ce1cb

13 files changed

Lines changed: 6839 additions & 4 deletions

File tree

lib/mappers/drift/dialog_info_drift_mapper.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ mixin DialogInfoDriftMapper {
1717
remoteDisplayName: data.remoteDisplayName,
1818
arrivalVersion: data.arrivalVersion,
1919
arrivalTime: DateTime.fromMicrosecondsSinceEpoch(data.arrivalTimeUsec),
20+
hasVideo: data.hasVideo,
2021
);
2122
}
2223

@@ -35,6 +36,7 @@ mixin DialogInfoDriftMapper {
3536
remoteDisplayName: info.remoteDisplayName,
3637
arrivalVersion: info.arrivalVersion,
3738
arrivalTimeUsec: info.arrivalTime.microsecondsSinceEpoch,
39+
hasVideo: info.hasVideo,
3840
);
3941
}
4042
}

lib/mappers/signaling/dialog_info_mapper.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class SignalingDialogInfoMapper {
1818
remoteDisplayName: data.remoteDisplayName,
1919
arrivalVersion: data.arrivalVersion,
2020
arrivalTime: data.arrivalTime,
21+
hasVideo: data.hasVideo,
2122
);
2223
}
2324
}

lib/models/dialog_info.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class DialogInfo extends Equatable {
1919
required this.remoteDisplayName,
2020
required this.arrivalVersion,
2121
required this.arrivalTime,
22+
this.hasVideo,
2223
});
2324

2425
final String id;
@@ -35,11 +36,19 @@ class DialogInfo extends Equatable {
3536
final String arrivalVersion;
3637
final DateTime arrivalTime;
3738

39+
/// Whether the dialog currently has an active video stream. Null when the
40+
/// backend does not report media type yet (treated as unknown, not audio).
41+
final bool? hasVideo;
42+
3843
String? get displayName => remoteDisplayName ?? remoteNumber;
3944

4045
bool get pullable {
4146
if (state != DialogState.confirmed) return false;
4247
if (remoteNumber == null || callId == null || localTag == null || remoteTag == null) return false;
48+
// Pulling a video call offers audio-only and crashes on the answer's video
49+
// m-line, so exclude known-video dialogs. Null (unknown) stays pullable to
50+
// preserve current behaviour until the backend reports media type.
51+
if (hasVideo == true) return false;
4352
return true;
4453
}
4554

@@ -58,10 +67,11 @@ class DialogInfo extends Equatable {
5867
remoteDisplayName,
5968
arrivalVersion,
6069
arrivalTime,
70+
hasVideo,
6171
];
6272

6373
@override
6474
String toString() {
65-
return 'DialogInfo{id: $id, entityNumber: $entityNumber, state: $state, callId: $callId, direction: $direction, localTag: $localTag, localNumber: $localNumber, localDisplayName: $localDisplayName, remoteTag: $remoteTag, remoteNumber: $remoteNumber, remoteDisplayName: $remoteDisplayName, arrivalVersion: $arrivalVersion, arrivalTime: $arrivalTime}';
75+
return 'DialogInfo{id: $id, entityNumber: $entityNumber, state: $state, callId: $callId, direction: $direction, localTag: $localTag, localNumber: $localNumber, localDisplayName: $localDisplayName, remoteTag: $remoteTag, remoteNumber: $remoteNumber, remoteDisplayName: $remoteDisplayName, arrivalVersion: $arrivalVersion, arrivalTime: $arrivalTime, hasVideo: $hasVideo}';
6676
}
6777
}

packages/data/app_database/lib/src/app_database.g.dart

Lines changed: 73 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)