Skip to content

Commit 81ff030

Browse files
Improve the behaviour when rejecting a call while already in an active call (#1482)
* feat: Forward push payload to our notification sdk * feat: Fix compile time * feat: replace DeprecationLevel.ERROR with DeprecationLevel.WARNING, * feat: remove unnecessary apis, * feat: update deprecation message * feat: remove unnecessary code * feat: refactor code * feat: Allow customization of Pending intent * fix: Fix UTs * fix: Update logic to reject class via notification buttons * fix: Refactor code * fix: Refactor code * fix: Pass rejection intent via call state * temp commit * temp commit * temp commit * removed isInTransition * Remove comments * Refactor code * Refactor code * Refactor code * Refactor code * Refactor code --------- Co-authored-by: Aleksandar Apostolov <[email protected]>
1 parent 6d659b6 commit 81ff030

File tree

13 files changed

+156
-55
lines changed

13 files changed

+156
-55
lines changed

demo-app/src/main/kotlin/io/getstream/video/android/CallActivity.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import io.getstream.video.android.datastore.delegate.StreamUserDataStore
3737
import io.getstream.video.android.ui.call.CallScreen
3838
import io.getstream.video.android.ui.common.StreamActivityUiDelegate
3939
import io.getstream.video.android.ui.common.StreamCallActivity
40-
import io.getstream.video.android.ui.common.StreamCallActivityConfiguration
4140
import io.getstream.video.android.ui.common.util.StreamCallActivityDelicateApi
4241
import io.getstream.video.android.util.FullScreenCircleProgressBar
4342
import io.getstream.video.android.util.StreamVideoInitHelper
@@ -48,11 +47,6 @@ class CallActivity : ComposeStreamCallActivity() {
4847

4948
override val uiDelegate: StreamActivityUiDelegate<StreamCallActivity> = StreamDemoUiDelegate()
5049

51-
override fun loadConfigFromIntent(intent: Intent?): StreamCallActivityConfiguration {
52-
return super.loadConfigFromIntent(intent)
53-
.copy(closeScreenOnCallEnded = false, canSkipPermissionRationale = false)
54-
}
55-
5650
@StreamCallActivityDelicateApi
5751
override fun onPreCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
5852
runBlocking {

demo-app/src/main/kotlin/io/getstream/video/android/ui/DogfoodingNavHost.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import androidx.navigation.navArgument
2929
import io.getstream.video.android.CallActivity
3030
import io.getstream.video.android.core.notifications.NotificationHandler
3131
import io.getstream.video.android.ui.common.StreamCallActivity
32+
import io.getstream.video.android.ui.common.StreamCallActivityConfiguration
3233
import io.getstream.video.android.ui.join.CallJoinScreen
3334
import io.getstream.video.android.ui.join.barcode.BarcodeScanner
3435
import io.getstream.video.android.ui.lobby.CallLobbyScreen
@@ -94,6 +95,10 @@ fun AppNavHost(
9495
context.startActivity(
9596
StreamCallActivity.callIntent(
9697
action = NotificationHandler.ACTION_OUTGOING_CALL,
98+
configuration = StreamCallActivityConfiguration(
99+
closeScreenOnCallEnded = true,
100+
),
101+
leaveWhenLastInCall = true,
97102
context = context,
98103
cid = cid,
99104
members = members.split(","),

demo-app/src/main/kotlin/io/getstream/video/android/util/StreamVideoInitHelper.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,20 @@ object StreamVideoInitHelper {
233233
context,
234234
object : DefaultNotificationIntentBundleResolver() {
235235

236+
override fun getIncomingCallBundle(
237+
callId: StreamCallId,
238+
notificationId: Int,
239+
payload: Map<String, Any?>,
240+
): Bundle {
241+
return StreamCallActivity.callIntentBundle(
242+
callId,
243+
configuration = StreamCallActivityConfiguration(
244+
closeScreenOnCallEnded = true,
245+
),
246+
leaveWhenLastInCall = true,
247+
)
248+
}
249+
236250
override fun getAcceptCallBundle(
237251
callId: StreamCallId,
238252
notificationId: Int,

stream-video-android-core/api/stream-video-android-core.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5610,6 +5610,7 @@ public final class io/getstream/video/android/core/CallState {
56105610
public final fun getPinnedParticipants ()Lkotlinx/coroutines/flow/StateFlow;
56115611
public final fun getReactions ()Lkotlinx/coroutines/flow/StateFlow;
56125612
public final fun getRecording ()Lkotlinx/coroutines/flow/StateFlow;
5613+
public final fun getRejectActionBundle ()Lkotlinx/coroutines/flow/StateFlow;
56135614
public final fun getRejectedBy ()Lkotlinx/coroutines/flow/StateFlow;
56145615
public final fun getRemoteParticipants ()Lkotlinx/coroutines/flow/StateFlow;
56155616
public final fun getRingingState ()Lkotlinx/coroutines/flow/StateFlow;
@@ -5647,6 +5648,7 @@ public final class io/getstream/video/android/core/CallState {
56475648
public final fun updateParticipantSortingOrder (Ljava/util/Comparator;)V
56485649
public final fun updateParticipantVisibility (Ljava/lang/String;Lio/getstream/video/android/core/model/VisibilityOnScreenState;)V
56495650
public final fun updateParticipantVisibilityFlow (Lkotlinx/coroutines/flow/Flow;)V
5651+
public final fun updateRejectActionBundle (Landroid/os/Bundle;)V
56505652
public final fun updateRejectedBy (Ljava/util/Set;)V
56515653
public final fun upsertParticipants (Ljava/util/List;)V
56525654
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ public class Call(
634634
)
635635
session.fastReconnect(reconnectDetails)
636636
} else {
637-
logger.e { "[reconnect] Disconnecting" }
637+
logger.d { "[fastReconnect] [RealtimeConnection.Disconnected], call_id:$id" }
638638
this@Call.state._connection.value = RealtimeConnection.Disconnected
639639
}
640640
}
@@ -767,18 +767,19 @@ public class Call(
767767

768768
/** Leave the call, but don't end it for other users */
769769
fun leave() {
770-
logger.d { "[leave] #ringing; no args" }
770+
logger.d { "[leave] #ringing; no args, call_cid:$cid" }
771771
leave(disconnectionReason = null)
772772
}
773773

774774
private fun leave(disconnectionReason: Throwable?) = atomicLeave {
775+
val callId = id
775776
session?.leaveWithReason(disconnectionReason?.message ?: "user")
776777
leaveTimeoutAfterDisconnect?.cancel()
777778
network.unsubscribe(listener)
778779
sfuListener?.cancel()
779780
sfuEvents?.cancel()
780781
state._connection.value = RealtimeConnection.Disconnected
781-
logger.v { "[leave] #ringing; disconnectionReason: $disconnectionReason" }
782+
logger.v { "[leave] #ringing; disconnectionReason: $disconnectionReason, call_id = $id" }
782783
if (isDestroyed) {
783784
logger.w { "[leave] #ringing; Call already destroyed, ignoring" }
784785
return@atomicLeave
@@ -1318,7 +1319,7 @@ public class Call(
13181319
}
13191320

13201321
suspend fun accept(): Result<AcceptCallResponse> {
1321-
logger.d { "[accept] #ringing; no args" }
1322+
logger.d { "[accept] #ringing; no args, call_id:$id" }
13221323
state.acceptedOnThisDevice = true
13231324

13241325
clientImpl.state.removeRingingCall()
@@ -1327,7 +1328,7 @@ public class Call(
13271328
}
13281329

13291330
suspend fun reject(reason: RejectReason? = null): Result<RejectCallResponse> {
1330-
logger.d { "[reject] #ringing; rejectReason: $reason" }
1331+
logger.d { "[reject] #ringing; rejectReason: $reason, call_id:$id" }
13311332
return clientImpl.reject(type, id, reason)
13321333
}
13331334

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.getstream.video.android.core
1818

19+
import android.os.Bundle
1920
import android.util.Log
2021
import androidx.compose.runtime.Stable
2122
import io.getstream.android.video.generated.models.BlockedUserEvent
@@ -548,6 +549,9 @@ public class CallState(
548549
private val _rejectedBy: MutableStateFlow<Set<String>> = MutableStateFlow(emptySet())
549550
val rejectedBy: StateFlow<Set<String>> = _rejectedBy
550551

552+
private val _rejectActionBundle: MutableStateFlow<Bundle?> = MutableStateFlow(null)
553+
val rejectActionBundle: StateFlow<Bundle?> = _rejectActionBundle
554+
551555
internal val _session = MutableStateFlow<CallSessionResponse?>(null)
552556
val session: StateFlow<CallSessionResponse?> = _session
553557

@@ -1529,6 +1533,10 @@ public class CallState(
15291533
fun updateRejectedBy(userId: Set<String>) {
15301534
_rejectedBy.value = userId
15311535
}
1536+
1537+
fun updateRejectActionBundle(bundle: Bundle) {
1538+
_rejectActionBundle.value = bundle
1539+
}
15321540
}
15331541

15341542
private fun MemberResponse.toMemberState(): MemberState {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,9 @@ public class RtcSession internal constructor(
469469
WebsocketReconnectStrategy.WEBSOCKET_RECONNECT_STRATEGY_DISCONNECT -> {
470470
// We are told to disconnect.
471471
sfuConnectionModule.socketConnection.disconnect()
472+
logger.d {
473+
"[WebsocketReconnectStrategy.WEBSOCKET_RECONNECT_STRATEGY_DISCONNECT], call_id = ${call.id}"
474+
}
472475
call.state._connection.value = RealtimeConnection.Disconnected
473476
}
474477

stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/notifications/internal/receivers/RejectCallBroadcastReceiver.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package io.getstream.video.android.core.notifications.internal.receivers
1818

1919
import android.content.Context
2020
import android.content.Intent
21+
import android.os.Bundle
2122
import io.getstream.log.taggedLogger
2223
import io.getstream.result.Result
2324
import io.getstream.video.android.core.Call
@@ -39,8 +40,18 @@ internal class RejectCallBroadcastReceiver : GenericCallActionBroadcastReceiver(
3940

4041
override suspend fun onReceive(call: Call, context: Context, intent: Intent) {
4142
when (val rejectResult = call.reject(RejectReason.Decline)) {
42-
is Result.Success -> logger.d { "[onReceive] rejectCall, Success: $rejectResult" }
43-
is Result.Failure -> logger.d { "[onReceive] rejectCall, Failure: $rejectResult" }
43+
is Result.Success -> {
44+
val userId = StreamVideo.instanceOrNull()?.userId
45+
userId?.let {
46+
val set = mutableSetOf(it)
47+
call.state.updateRejectedBy(set)
48+
call.state.updateRejectActionBundle(intent.extras ?: Bundle())
49+
}
50+
logger.d { "[onReceive] rejectCall, Success: $rejectResult" }
51+
}
52+
is Result.Failure -> {
53+
logger.d { "[onReceive] rejectCall, Failure: $rejectResult" }
54+
}
4455
}
4556
logger.d { "[onReceive] #ringing; callId: ${call.id}, action: ${intent.action}" }
4657
CallService.removeIncomingCall(

stream-video-android-ui-compose/api/stream-video-android-ui-compose.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ public class io/getstream/video/android/compose/ui/StreamCallActivityComposeDele
389389
public fun AudioCallContent (Lio/getstream/video/android/ui/common/StreamCallActivity;Lio/getstream/video/android/core/Call;Landroidx/compose/runtime/Composer;I)V
390390
public fun CallDisconnectedContent (Lio/getstream/video/android/ui/common/StreamCallActivity;Lio/getstream/video/android/core/Call;Landroidx/compose/runtime/Composer;I)V
391391
public fun CallFailedContent (Lio/getstream/video/android/ui/common/StreamCallActivity;Lio/getstream/video/android/core/Call;Ljava/lang/Exception;Landroidx/compose/runtime/Composer;I)V
392+
public fun HandleCallRejectionFromNotification (Lio/getstream/video/android/ui/common/StreamCallActivity;Lio/getstream/video/android/core/Call;Landroidx/compose/runtime/Composer;I)V
392393
public fun IncomingCallContent (Lio/getstream/video/android/ui/common/StreamCallActivity;Landroidx/compose/ui/Modifier;Lio/getstream/video/android/core/Call;ZZLkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V
393394
public fun LoadingContent (Lio/getstream/video/android/ui/common/StreamCallActivity;Lio/getstream/video/android/core/Call;Landroidx/compose/runtime/Composer;I)V
394395
public fun NoAnswerContent (Lio/getstream/video/android/ui/common/StreamCallActivity;Lio/getstream/video/android/core/Call;Landroidx/compose/runtime/Composer;I)V

0 commit comments

Comments
 (0)