From ae0282b1f2623f85ee196ef1bae9742301cffee0 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Fri, 20 Feb 2026 18:13:27 +0530 Subject: [PATCH 1/3] fix: Update ringing state on call-ended event --- .../getstream/video/android/core/CallState.kt | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt index d6ec114a75..eb1c46b703 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt @@ -18,7 +18,6 @@ package io.getstream.video.android.core import android.app.Notification import android.os.Bundle -import android.util.Log import androidx.compose.runtime.Stable import androidx.core.app.NotificationManagerCompat import io.getstream.android.video.generated.models.BlockedUserEvent @@ -834,10 +833,11 @@ public class CallState( } is CallEndedEvent -> { - call.state.cancelTimeout() + cancelTimeout() updateFromResponse(event.call) _endedAt.value = OffsetDateTime.now(Clock.systemUTC()) _endedByUser.value = event.user?.toUser() + updateRingingState() call.leave("CallEndedEvent") } @@ -1256,8 +1256,10 @@ public class CallState( val userIsParticipant = _session.value?.participants?.find { it.user.id == client.userId } != null val outgoingMembersCount = _members.value.filter { it.value.user.id != client.userId }.size + val isCallEnded: Boolean = _endedAt.value != null - Log.d("RingingState", "Current: ${_ringingState.value}, call_id: ${call.cid}") + val ringingLogger by taggedLogger("RingingState") + ringingLogger.d { "Current: ${_ringingState.value}, call_id: ${call.cid}" } val ringingStateLogs = arrayListOf( ("acceptedByMe: $isAcceptedByMe"), @@ -1266,17 +1268,18 @@ public class CallState( ("hasActiveCall: $hasActiveCall"), ("hasRingingCall: $hasRingingCall"), ("userIsParticipant: $userIsParticipant"), + ("isCallEnded: $isCallEnded"), ).joinToString("") { it + "\n" } - Log.d( - "RingingState", - "call_id: ${call.cid}, Flags: $ringingStateLogs", - ) + ringingLogger.d { "call_id: ${call.cid}, Flags: $ringingStateLogs" } // no members - call is empty, we can join val state: RingingState = if (hasActiveCall && !ringingStateUpdatesStopped) { cancelTimeout() RingingState.Active + } else if (isCallEnded) { + cancelTimeout() + RingingState.RejectedByAll } else if (isRejectedByMe) { call.leave("updateRingingState-rejected-self") cancelTimeout() @@ -1303,7 +1306,7 @@ public class CallState( } } else if (hasRingingCall && createdBy?.id == client.userId) { // The call is created by us - logger.d { "acceptedBy: $acceptedBy, userIsParticipant: $userIsParticipant" } + ringingLogger.d { "acceptedBy: $acceptedBy, userIsParticipant: $userIsParticipant" } if (acceptedBy.isEmpty()) { // no one accepted the call RingingState.Outgoing(acceptedByCallee = false) @@ -1325,7 +1328,7 @@ public class CallState( } if (_ringingState.value != state) { - logger.d { "Updating ringing state ${_ringingState.value} -> $state" } + ringingLogger.d { "Updating ringing state ${_ringingState.value} -> $state" } // handle the auto-cancel for outgoing ringing calls if (state is RingingState.Outgoing && !state.acceptedByCallee) { @@ -1338,7 +1341,7 @@ public class CallState( // stop the call ringing timer if it's running } - Log.d("RingingState", "Update: $state") + ringingLogger.d { "Update: $state" } _ringingState.value = state } From 7c17e6ccfbcad185a0af3f47508b71da00e307d9 Mon Sep 17 00:00:00 2001 From: rahullohra Date: Fri, 20 Feb 2026 18:38:27 +0530 Subject: [PATCH 2/3] fix: Update ringing state on call-ended event --- .../main/kotlin/io/getstream/video/android/core/CallState.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt index eb1c46b703..12a1cbc58b 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt @@ -1277,7 +1277,7 @@ public class CallState( val state: RingingState = if (hasActiveCall && !ringingStateUpdatesStopped) { cancelTimeout() RingingState.Active - } else if (isCallEnded) { + } else if (hasRingingCall && isCallEnded) { cancelTimeout() RingingState.RejectedByAll } else if (isRejectedByMe) { From 71330021c41c4ffba43bd655a32b399884804b2f Mon Sep 17 00:00:00 2001 From: rahullohra Date: Tue, 24 Feb 2026 16:46:08 +0530 Subject: [PATCH 3/3] chore: refactor --- .../main/kotlin/io/getstream/video/android/core/CallState.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt index 12a1cbc58b..c1c20e57f6 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt @@ -723,6 +723,7 @@ public class CallState( internal var jetpackTelecomRepository: JetpackTelecomRepository? = null internal var incomingNotificationData = IncomingNotificationData(emptyMap()) + private val ringingLogger by taggedLogger("RingingState") fun handleEvent(event: VideoEvent) { logger.d { "[handleEvent] ${event::class.java.name.split(".").last()}" } @@ -1258,7 +1259,6 @@ public class CallState( val outgoingMembersCount = _members.value.filter { it.value.user.id != client.userId }.size val isCallEnded: Boolean = _endedAt.value != null - val ringingLogger by taggedLogger("RingingState") ringingLogger.d { "Current: ${_ringingState.value}, call_id: ${call.cid}" } val ringingStateLogs = arrayListOf(