Skip to content

Commit 804b916

Browse files
authored
fix(llc): Update screen share visibility separate from video (#1032)
* Update screen share visibility separate from video * Add changelog entry
1 parent 04c0cd9 commit 804b916

File tree

6 files changed

+46
-1
lines changed

6 files changed

+46
-1
lines changed

packages/stream_video/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
🔄 Changed
88
* Deprecated `callRejoinTimeout` in `RetryConfig`, instead added `networkAvailabilityTimeout` to `CallPreferences` to control how long the SDK waits for network connectivity to be restored during reconnection attempts before timing out.
99

10+
🐞 Fixed
11+
* Sorting of participants after screen sharing stopped.s
12+
1013
🔄 Dependency updates
1114
* Updated `flutter_callkit_incoming` dependency to the latests (2.5.5) version. That version contains Android 14 compatibility fixes for ringing notifications and lock screen handling.
1215

packages/stream_video/lib/src/call/call.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2856,12 +2856,21 @@ class Call {
28562856
required String sessionId,
28572857
required String userId,
28582858
required ViewportVisibility visibility,
2859+
required SfuTrackTypeVideo trackType,
28592860
}) async {
28602861
final change = VisibilityChange(
28612862
sessionId: sessionId,
28622863
userId: userId,
28632864
visibility: visibility,
28642865
);
2866+
if (trackType.isScreenShare) {
2867+
_stateManager.participantUpdateScreenShareViewportVisibility(
2868+
sessionId: sessionId,
2869+
userId: userId,
2870+
visibility: visibility,
2871+
);
2872+
return const Result.success(none);
2873+
}
28652874

28662875
final result = await _session?.updateViewportVisibility(change) ??
28672876
Result.error('Session is null');

packages/stream_video/lib/src/call/state/mixins/state_participant_mixin.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,25 @@ mixin StateParticipantMixin on StateNotifier<CallState> {
5353
);
5454
}
5555

56+
void participantUpdateScreenShareViewportVisibility({
57+
required String sessionId,
58+
required String userId,
59+
required ViewportVisibility visibility,
60+
}) {
61+
state = state.copyWith(
62+
callParticipants: state.callParticipants.map((participant) {
63+
if (participant.sessionId == sessionId &&
64+
participant.userId == userId) {
65+
return participant.copyWith(
66+
screenShareViewportVisibility: visibility,
67+
);
68+
}
69+
70+
return participant;
71+
}).toList(),
72+
);
73+
}
74+
5675
void participantUpdateSubscription({
5776
required String userId,
5877
required String sessionId,

packages/stream_video/lib/src/models/call_participant_state.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class CallParticipantState
3434
this.pin,
3535
this.reaction,
3636
this.viewportVisibility = ViewportVisibility.unknown,
37+
this.screenShareViewportVisibility = ViewportVisibility.unknown,
3738
}) : audioLevels = audioLevels ?? [audioLevel];
3839

3940
/// Internal constructor to be used with copyWith methods
@@ -56,6 +57,7 @@ class CallParticipantState
5657
required this.pin,
5758
required this.reaction,
5859
required this.viewportVisibility,
60+
required this.screenShareViewportVisibility,
5961
});
6062

6163
final String userId;
@@ -81,6 +83,7 @@ class CallParticipantState
8183
final CallParticipantPin? pin;
8284
final CallReaction? reaction;
8385
final ViewportVisibility viewportVisibility;
86+
final ViewportVisibility screenShareViewportVisibility;
8487

8588
bool get isPinned => pin != null;
8689
String get uniqueParticipantKey => '$userId-$sessionId';
@@ -108,6 +111,7 @@ class CallParticipantState
108111
CallParticipantPin? pin,
109112
CallReaction? reaction,
110113
ViewportVisibility? viewportVisibility,
114+
ViewportVisibility? screenShareViewportVisibility,
111115
}) {
112116
return CallParticipantState._(
113117
userId: userId ?? this.userId,
@@ -128,6 +132,8 @@ class CallParticipantState
128132
pin: pin ?? this.pin,
129133
reaction: reaction ?? this.reaction,
130134
viewportVisibility: viewportVisibility ?? this.viewportVisibility,
135+
screenShareViewportVisibility:
136+
screenShareViewportVisibility ?? this.screenShareViewportVisibility,
131137
);
132138
}
133139

@@ -171,6 +177,7 @@ class CallParticipantState
171177
pin: participantPin,
172178
reaction: reaction,
173179
viewportVisibility: viewportVisibility,
180+
screenShareViewportVisibility: screenShareViewportVisibility,
174181
);
175182
}
176183

@@ -200,6 +207,7 @@ class CallParticipantState
200207
pin: pin,
201208
reaction: reaction,
202209
viewportVisibility: viewportVisibility,
210+
screenShareViewportVisibility: screenShareViewportVisibility,
203211
);
204212
}
205213

packages/stream_video/lib/src/sfu/data/models/sfu_track_type.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class SfuTrackType {
1717
bool get isAudio => this is SfuTrackTypeAudio;
1818

1919
bool get isVideo => this is SfuTrackTypeVideo;
20+
21+
bool get isScreenShare => this is SfuTrackTypeVideo && this == screenShare;
2022
}
2123

2224
abstract class SfuTrackTypeAudio extends SfuTrackType {

packages/stream_video_flutter/lib/src/renderer/video_renderer.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,10 @@ class _StreamVideoRendererState extends State<StreamVideoRenderer> {
153153
latestVisibilityInfo = info;
154154
final fraction = info.visibleFraction;
155155

156-
final prevVisibility = widget.participant.viewportVisibility;
156+
final prevVisibility = widget.videoTrackType.isScreenShare
157+
? widget.participant.screenShareViewportVisibility
158+
: widget.participant.viewportVisibility;
159+
157160
final visibility = ViewportVisibility.fromVisibleFraction(fraction);
158161

159162
// Update the viewport visibility of the participant.
@@ -162,6 +165,7 @@ class _StreamVideoRendererState extends State<StreamVideoRenderer> {
162165
sessionId: widget.participant.sessionId,
163166
userId: widget.participant.userId,
164167
visibility: visibility,
168+
trackType: widget.videoTrackType,
165169
);
166170
}
167171

0 commit comments

Comments
 (0)