Skip to content

Commit 0ac16a1

Browse files
Brazolkanat
andauthored
chore: missing missed call parts (#700)
* [PBE-1710] make example app Firebase friendly * [PBE-1710] support reject.reason & show notification * fix ios, improve setup * support pronto-staging * write openapi script + generate new API * added missing parts of missed call feature --------- Co-authored-by: kanat <[email protected]>
1 parent e3ffefe commit 0ac16a1

File tree

12 files changed

+58
-22
lines changed

12 files changed

+58
-22
lines changed

packages/stream_video/lib/src/coordinator/models/coordinator_events.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,28 @@ class CoordinatorCallRingingEvent extends CoordinatorCallEvent {
125125
];
126126
}
127127

128+
/// Sent when someone misses a call.
129+
class CoordinatorCallMissedEvent extends CoordinatorCallEvent {
130+
const CoordinatorCallMissedEvent({
131+
required this.callCid,
132+
required this.sessionId,
133+
required this.createdAt,
134+
});
135+
136+
final String sessionId;
137+
final DateTime createdAt;
138+
139+
@override
140+
final StreamCallCid callCid;
141+
142+
@override
143+
List<Object?> get props => [
144+
...super.props,
145+
sessionId,
146+
createdAt,
147+
];
148+
}
149+
128150
/// Sent when a call gets updated.
129151
class CoordinatorCallUpdatedEvent extends CoordinatorCallEvent {
130152
const CoordinatorCallUpdatedEvent({

packages/stream_video/lib/src/coordinator/open_api/event/event_type.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ enum EventType {
88
callCreated('call.created'),
99
callAccepted('call.accepted'),
1010
callRejected('call.rejected'),
11+
callMissed('call.missed'),
1112
callRing('call.ring'),
1213
callUpdated('call.updated'),
1314
callEnded('call.ended'),

packages/stream_video/lib/src/coordinator/open_api/event/open_api_event.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class OpenApiEvent with EquatableMixin {
1414
this.connected,
1515
this.healthCheck,
1616
this.callCreated,
17+
this.callMissed,
1718
this.callRing,
1819
this.callNotification,
1920
this.callAccepted,
@@ -151,6 +152,9 @@ class OpenApiEvent with EquatableMixin {
151152
case EventType.callRecordingFailed:
152153
final event = open.CallRecordingFailedEvent.fromJson(jsonObj);
153154
return result.copyWith(callRecordingFailed: event);
155+
case EventType.callMissed:
156+
final event = open.CallMissedEvent.fromJson(jsonObj);
157+
return result.copyWith(callMissed: event);
154158
case EventType.unknown:
155159
streamLog.e(_tag, () => '[fromJson] unexpected event: $jsonObj');
156160
return result.copyWith(unknown: jsonObj);
@@ -161,6 +165,7 @@ class OpenApiEvent with EquatableMixin {
161165
final open.ConnectedEvent? connected;
162166
final open.HealthCheckEvent? healthCheck;
163167
final open.CallCreatedEvent? callCreated;
168+
final open.CallMissedEvent? callMissed;
164169
final open.CallRingEvent? callRing;
165170
final open.CallNotificationEvent? callNotification;
166171
final open.CallAcceptedEvent? callAccepted;
@@ -196,6 +201,7 @@ class OpenApiEvent with EquatableMixin {
196201
open.ConnectedEvent? connected,
197202
open.HealthCheckEvent? healthCheck,
198203
open.CallCreatedEvent? callCreated,
204+
open.CallMissedEvent? callMissed,
199205
open.CallRingEvent? callRing,
200206
open.CallNotificationEvent? callNotification,
201207
open.CallAcceptedEvent? callAccepted,
@@ -231,6 +237,7 @@ class OpenApiEvent with EquatableMixin {
231237
connected: connected ?? this.connected,
232238
healthCheck: healthCheck ?? this.healthCheck,
233239
callCreated: callCreated ?? this.callCreated,
240+
callMissed: callMissed ?? this.callMissed,
234241
callRing: callRing ?? this.callRing,
235242
callNotification: callNotification ?? this.callNotification,
236243
callAccepted: callAccepted ?? this.callAccepted,
@@ -279,6 +286,7 @@ class OpenApiEvent with EquatableMixin {
279286
connected,
280287
healthCheck,
281288
callCreated,
289+
callMissed,
282290
callRing,
283291
callNotification,
284292
callAccepted,

packages/stream_video/lib/src/coordinator/open_api/open_api_mapper_extensions.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ extension WebsocketEventMapperExt on OpenApiEvent {
3333
),
3434
createdAt: event.createdAt,
3535
);
36+
case EventType.callMissed:
37+
final event = callMissed!;
38+
final call = event.call;
39+
return CoordinatorCallMissedEvent(
40+
callCid: StreamCallCid(cid: call.cid),
41+
sessionId: event.sessionId,
42+
createdAt: event.createdAt,
43+
);
3644
case EventType.callRing:
3745
final event = callRing!;
3846
final call = event.call;

packages/stream_video/lib/src/stream_video.dart

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -593,11 +593,6 @@ class StreamVideo extends Disposable {
593593
final sender = payload['sender'] as String?;
594594
if (sender != 'stream.video') return false;
595595

596-
// Only handle ringing calls.
597-
final type = payload['type'] as String?;
598-
if (type != 'call.ring') return false;
599-
600-
// Return if the payload does not contain a call cid.
601596
final callCid = payload['call_cid'] as String?;
602597
if (callCid == null) return false;
603598

@@ -614,6 +609,22 @@ class StreamVideo extends Disposable {
614609
final createdById = payload['created_by_id'] as String?;
615610
final createdByName = payload['created_by_display_name'] as String?;
616611

612+
final type = payload['type'] as String?;
613+
if (type == 'call.missed') {
614+
unawaited(
615+
manager.showMissedCall(
616+
uuid: callUUID,
617+
handle: createdById,
618+
nameCaller: createdByName,
619+
callCid: callCid,
620+
),
621+
);
622+
623+
return true;
624+
} else if (type != 'call.ring') {
625+
return false;
626+
}
627+
617628
final callRingingState = await getCallRingingState(
618629
// ignore: deprecated_member_use_from_same_package
619630
type: callType.value,
@@ -637,14 +648,6 @@ class StreamVideo extends Disposable {
637648
case CallRingingState.rejected:
638649
return false;
639650
case CallRingingState.ended:
640-
unawaited(
641-
manager.showMissedCall(
642-
uuid: callUUID,
643-
handle: createdById,
644-
nameCaller: createdByName,
645-
callCid: callCid,
646-
),
647-
);
648651
return false;
649652
}
650653
}

packages/stream_video_flutter/lib/src/call_participants/call_participant.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
33
import 'package:flutter_webrtc/flutter_webrtc.dart';
44

55
import '../../stream_video_flutter.dart';
6-
import '../utils/extensions.dart';
76
import 'indicators/connection_quality_indicator.dart';
87
import 'participant_label.dart';
98

packages/stream_video_flutter/lib/src/call_participants/overlay_app_bar.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'package:collection/collection.dart';
22
import 'package:flutter/material.dart';
33

44
import '../../stream_video_flutter.dart';
5-
import '../utils/extensions.dart';
65

76
/// A widget that represents a semi-transparent toolbar that is displayed
87
/// over the [StreamCallParticipants] widget on mobile devices in landscape

packages/stream_video_flutter/lib/src/call_screen/call_container.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ class _StreamCallContainerState extends State<StreamCallContainer> {
179179
_logger.d(() => '[leave] no args');
180180
// play tone
181181
final bool popped;
182+
182183
if (mounted) {
183184
popped = await Navigator.maybePop(context);
184185
} else {

packages/stream_video_flutter/lib/src/call_screen/call_content/call_app_bar.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:flutter/material.dart' hide ConnectionState;
22

33
import '../../../stream_video_flutter.dart';
4-
import '../../utils/extensions.dart';
54

65
/// Widget that represents the default app bar that's shown in calls.
76
class CallAppBar extends StatelessWidget implements PreferredSizeWidget {

packages/stream_video_flutter/lib/src/call_screen/incoming_call/incoming_call_content.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:flutter/material.dart';
22

33
import '../../../stream_video_flutter.dart';
4-
import '../../utils/extensions.dart';
54
import '../common/call_background.dart';
65
import '../common/calling_participants.dart';
76
import '../common/participant_avatars.dart';
@@ -152,7 +151,7 @@ class _StreamIncomingCallContentState extends State<StreamIncomingCallContent> {
152151
if (widget.onDeclineCallTap != null) {
153152
widget.onDeclineCallTap!();
154153
} else {
155-
await widget.call.reject();
154+
await widget.call.reject(reason: 'decline');
156155
await widget.call.leave();
157156
}
158157
}

0 commit comments

Comments
 (0)