Skip to content

Commit 3dbce6e

Browse files
committed
fix: Reject current active call when telecom puts it to inactive or hold
1 parent fc23079 commit 3dbce6e

1 file changed

Lines changed: 31 additions & 0 deletions

File tree

  • stream-video-android-core/src/main/kotlin/io/getstream/video/android/core

stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ import io.getstream.video.android.core.notifications.IncomingNotificationData
116116
import io.getstream.video.android.core.notifications.NotificationType
117117
import io.getstream.video.android.core.notifications.internal.service.CallServiceConfig
118118
import io.getstream.video.android.core.notifications.internal.telecom.jetpack.JetpackTelecomRepository
119+
import io.getstream.video.android.core.notifications.internal.telecom.jetpack.TelecomCall
119120
import io.getstream.video.android.core.permission.PermissionRequest
120121
import io.getstream.video.android.core.pinning.PinType
121122
import io.getstream.video.android.core.pinning.PinUpdateAtTime
@@ -130,6 +131,7 @@ import io.getstream.video.android.core.utils.toUser
130131
import io.getstream.video.android.model.StreamCallId
131132
import io.getstream.video.android.model.User
132133
import kotlinx.coroutines.CoroutineScope
134+
import kotlinx.coroutines.Dispatchers
133135
import kotlinx.coroutines.Job
134136
import kotlinx.coroutines.channels.awaitClose
135137
import kotlinx.coroutines.currentCoroutineContext
@@ -145,6 +147,7 @@ import kotlinx.coroutines.flow.combine
145147
import kotlinx.coroutines.flow.debounce
146148
import kotlinx.coroutines.flow.distinctUntilChanged
147149
import kotlinx.coroutines.flow.flow
150+
import kotlinx.coroutines.flow.map
148151
import kotlinx.coroutines.flow.stateIn
149152
import kotlinx.coroutines.flow.transform
150153
import kotlinx.coroutines.isActive
@@ -720,8 +723,14 @@ public class CallState(
720723
@InternalStreamVideoApi
721724
public val notificationIdFlow: StateFlow<Int?> = _notificationIdFlow
722725

726+
private var telecomHoldObserverJob: Job? = null
727+
723728
@InternalStreamVideoApi
724729
internal var jetpackTelecomRepository: JetpackTelecomRepository? = null
730+
set(value) {
731+
field = value
732+
value?.let { observeTelecomHold(it) }
733+
}
725734

726735
internal var incomingNotificationData = IncomingNotificationData(emptyMap())
727736

@@ -1749,6 +1758,28 @@ public class CallState(
17491758
this._notificationIdFlow.value = notificationId
17501759
this.atomicNotification.set(notification)
17511760
}
1761+
1762+
/**
1763+
* [RingingState.Incoming] and [RingingState.Outgoing] are intentionally not observed.
1764+
* In Android Telecom, hold states are only applicable once a call is active (answered).
1765+
*/
1766+
private fun observeTelecomHold(repo: JetpackTelecomRepository) {
1767+
telecomHoldObserverJob?.cancel()
1768+
1769+
telecomHoldObserverJob = scope.launch(Dispatchers.Default) {
1770+
repo.currentCall
1771+
.map { (it as? TelecomCall.Registered)?.isOnHold == true }
1772+
.distinctUntilChanged()
1773+
.collect { telecomCall ->
1774+
when (ringingState.value) {
1775+
is RingingState.Active -> {
1776+
call.leave("call-on-hold")
1777+
}
1778+
else -> {}
1779+
}
1780+
}
1781+
}
1782+
}
17521783
}
17531784

17541785
private fun MemberResponse.toMemberState(): MemberState {

0 commit comments

Comments
 (0)