@@ -21,6 +21,7 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable {
21
21
var createdBy : User ?
22
22
var isActive : Bool = false
23
23
var ringingTimedOut : Bool = false
24
+ var isEndedElsewhere : Bool = false
24
25
25
26
init (
26
27
call: Call ,
@@ -215,12 +216,24 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable {
215
216
/// The call was accepted somewhere else (e.g the incoming call on the same device or another
216
217
/// device). No action is required.
217
218
guard
218
- response. user. id == streamVideo? . user. id,
219
219
let newCallEntry = callEntry ( for: response. callCid) ,
220
- newCallEntry. callUUID != active // Ensure that the new call isn't the currently active one.
220
+ newCallEntry. callUUID != active, // Ensure that the new call isn't the currently active one.
221
+ response. user. id == streamVideo? . user. id
221
222
else {
222
223
return
223
224
}
225
+ log. debug (
226
+ """
227
+ Call rejected
228
+ callId: \( newCallEntry. call. callId)
229
+ callType: \( newCallEntry. call. callType)
230
+ callerId: \( newCallEntry. createdBy? . id)
231
+ ringingTimedOut: \( newCallEntry. ringingTimedOut)
232
+ isEndedElsewhere: \( newCallEntry. isEndedElsewhere)
233
+ """ ,
234
+ subsystems: . callKit
235
+ )
236
+
224
237
callProvider. reportCall (
225
238
with: newCallEntry. callUUID,
226
239
endedAt: nil ,
@@ -252,6 +265,20 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable {
252
265
else {
253
266
return
254
267
}
268
+ log. debug (
269
+ """
270
+ Call rejected
271
+ callId: \( newCallEntry. call. callId)
272
+ callType: \( newCallEntry. call. callType)
273
+ callerId: \( newCallEntry. createdBy? . id)
274
+ ringingTimedOut: \( newCallEntry. ringingTimedOut)
275
+ isEndedElsewhere: \( newCallEntry. isEndedElsewhere)
276
+ isCurrentUserRejection: \( isCurrentUserRejection)
277
+ isCallCreatorRejection: \( isCallCreatorRejection)
278
+ """ ,
279
+ subsystems: . callKit
280
+ )
281
+
255
282
callProvider. reportCall (
256
283
with: newCallEntry. callUUID,
257
284
endedAt: nil ,
@@ -271,8 +298,24 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable {
271
298
guard let callEndedEntry = callEntry ( for: cId) else {
272
299
return
273
300
}
274
- callEndedEntry. ringingTimedOut = ringingTimedOut
301
+ if ringingTimedOut {
302
+ callEndedEntry. ringingTimedOut = ringingTimedOut
303
+ } else {
304
+ callEndedEntry. isEndedElsewhere = true
305
+ }
275
306
set ( callEndedEntry, for: callEndedEntry. callUUID)
307
+
308
+ log. debug (
309
+ """
310
+ CallEnded
311
+ callId: \( callEndedEntry. call. callId)
312
+ callType: \( callEndedEntry. call. callType)
313
+ callerId: \( callEndedEntry. createdBy? . id)
314
+ ringingTimedOut: \( callEndedEntry. ringingTimedOut)
315
+ isEndedElsewhere: \( callEndedEntry. isEndedElsewhere)
316
+ """ ,
317
+ subsystems: . callKit
318
+ )
276
319
Task {
277
320
do {
278
321
// End the call.
@@ -298,6 +341,10 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable {
298
341
Task { @MainActor in
299
342
if let call = callEntry ( for: response. callCid) ? . call,
300
343
call. state. participants. count == 1 {
344
+ log. debug (
345
+ " Call will end as only one participant left in the call " ,
346
+ subsystems: . callKit
347
+ )
301
348
callEnded ( response. callCid, ringingTimedOut: false )
302
349
}
303
350
}
@@ -527,12 +574,21 @@ open class CallKitService: NSObject, CXProviderDelegate, @unchecked Sendable {
527
574
return false
528
575
}
529
576
577
+ var allMembers = callState. members. map ( \. user. toUser)
578
+ let creator = callState. call. createdBy. toUser
579
+ let isUserInMembersArray = allMembers. filter { $0. id == creator. id } . isEmpty == false
580
+ if !isUserInMembersArray {
581
+ allMembers. append ( creator)
582
+ }
583
+ let allCallees = allMembers. filter { $0. id != creator. id }
584
+
530
585
let currentUserId = streamVideo. user. id
531
586
let acceptedBy = callState. call. session? . acceptedBy ?? [ : ]
532
587
let rejectedBy = callState. call. session? . rejectedBy ?? [ : ]
533
588
let isAccepted = acceptedBy [ currentUserId] != nil
534
589
let isRejected = rejectedBy [ currentUserId] != nil
535
- let isRejectedByEveryoneElse = rejectedBy. keys. filter { $0 != currentUserId } . count == ( callState. members. count - 1 )
590
+ let isRejectedByEveryoneElse = ( allCallees. endIndex > 1 )
591
+ && rejectedBy. keys. filter { $0 != currentUserId } . count == ( allCallees. endIndex - 1 )
536
592
return isAccepted || isRejected || isRejectedByEveryoneElse
537
593
}
538
594
0 commit comments