feat(video_calls): repeated calls after call termination fix

This commit is contained in:
misha
2026-10-15 15:21:38 +03:00
parent 1901248539
commit 4ef174ebde
5 changed files with 74 additions and 4 deletions

View File

@@ -406,7 +406,11 @@ class VideoCallManager {
Future<void> endCall() async {
final uuid = _snapshot.conversationUuid;
final shouldNotifyBackend = !_callEndedNotified && uuid.isNotEmpty;
final shouldNotifyBackend = shouldNotifyCallEnded(
alreadyNotified: _callEndedNotified,
hasConversation: uuid.isNotEmpty,
peerStillInRoom: _roomHasRemoteUser(),
);
if (uuid.isNotEmpty) {
_callEndedNotified = true;
}
@@ -1099,6 +1103,14 @@ class VideoCallManager {
return false;
}
bool _roomHasRemoteUser() {
final room = _room;
if (room == null) return false;
return videoCallRoomStillHasRemoteUser(
room.remoteParticipants.values.map((participant) => participant.identity),
);
}
bool get _canHandleCallAudio =>
_callStageEntered &&
!_liveKitDisposed &&

View File

@@ -541,9 +541,20 @@ class VideoCallSessionCubit extends BaseCubit<VideoCallSessionState> {
}
Future<void> endCall() async {
await _screenWakeLock.release();
await _systemPipCoordinator.disarm();
await _videoCallManager.endCall();
_suppressDisposeSideEffects = true;
try {
await _screenWakeLock.release();
await _systemPipCoordinator.disarm();
await _videoCallManager.endCall();
if (isClosed) return;
// The idle snapshot is ignored while the call screen is still visible,
// so hang up has to clear the session before the route pops. Otherwise
// dispose keeps the call and the next token request rings both users.
emit(const VideoCallSessionState());
await _restoreSystemUiAfterCall();
} finally {
_suppressDisposeSideEffects = false;
}
}
void expandLocal() {

View File

@@ -18,6 +18,18 @@ bool shouldForceEndCallAfterPeerLeft({
return !videoCallRoomStillHasRemoteUser(remoteIdentities);
}
/// The participant who taps hang up must not report the end while the other
/// person is still in the room. That report and the remaining client's report
/// both see an empty room and each one rings the other user again.
bool shouldNotifyCallEnded({
required bool alreadyNotified,
required bool hasConversation,
required bool peerStillInRoom,
}) {
if (!hasConversation || alreadyNotified || peerStillInRoom) return false;
return true;
}
bool shouldForceEndCallAfterRoomDisconnect({
required bool callStageEntered,
required bool sessionConnected,