Skip to content

Commit fd285ef

Browse files
authored
fix(ui): initials creation fix (#1091)
* initials creation fix * fix * tweaks to camera fliping to avoid small mirroring issue
1 parent 830193a commit fd285ef

File tree

6 files changed

+38
-13
lines changed

6 files changed

+38
-13
lines changed

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'package:async/async.dart' show CancelableOperation;
88
import 'package:collection/collection.dart';
99
import 'package:internet_connection_checker_plus/internet_connection_checker_plus.dart';
1010
import 'package:meta/meta.dart';
11-
import 'package:rxdart/transformers.dart';
1211
import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as rtc;
1312
import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart';
1413
import 'package:synchronized/synchronized.dart';
@@ -2691,11 +2690,14 @@ class Call {
26912690
.firstOrNull;
26922691

26932692
_connectOptions = connectOptions.copyWith(
2694-
cameraFacingMode: connectOptions.cameraFacingMode.flip(),
2693+
cameraFacingMode: success.data.mediaConstraints.facingMode,
26952694
videoInputDevice: currentInput,
26962695
);
26972696

2698-
_stateManager.participantFlipCamera(currentInput);
2697+
_stateManager.participantFlipCamera(
2698+
currentInput,
2699+
track: success.data,
2700+
);
26992701
},
27002702
failure: (failure) {},
27012703
);
@@ -2790,10 +2792,16 @@ class Call {
27902792
Result.error('Session is null');
27912793

27922794
if (result.isSuccess) {
2793-
_connectOptions = connectOptions.copyWith(videoInputDevice: device);
2795+
final track = result.getDataOrNull()!;
2796+
2797+
_connectOptions = connectOptions.copyWith(
2798+
videoInputDevice: device,
2799+
cameraFacingMode: track.mediaConstraints.facingMode,
2800+
);
2801+
27942802
_stateManager.participantSetVideoInputDevice(
27952803
device: device,
2796-
track: result.getDataOrNull()!,
2804+
track: track,
27972805
);
27982806
}
27992807

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,15 @@ mixin StateParticipantMixin on StateNotifier<CallState> {
219219
);
220220
}
221221

222-
void participantFlipCamera(RtcMediaDevice? videoDevice) {
222+
void participantFlipCamera(
223+
RtcMediaDevice? videoDevice, {
224+
required RtcLocalTrack<CameraConstraints> track,
225+
}) {
226+
final facingMode = track.mediaConstraints.facingMode;
227+
final cameraPosition = facingMode == FacingMode.user
228+
? CameraPosition.front
229+
: CameraPosition.back;
230+
223231
state = state.copyWith(
224232
videoInputDevice: videoDevice,
225233
callParticipants: state.callParticipants.map((participant) {
@@ -230,7 +238,7 @@ mixin StateParticipantMixin on StateNotifier<CallState> {
230238
// CopyWith doesn't support null values.
231239
final newTrackState = TrackState.local(
232240
muted: trackState.muted,
233-
cameraPosition: trackState.cameraPosition?.flip(),
241+
cameraPosition: cameraPosition,
234242
);
235243

236244
return participant.copyWith(

packages/stream_video/lib/src/webrtc/rtc_manager.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'dart:async';
22

3-
import 'package:async/async.dart' show CancelableOperation;
43
import 'package:collection/collection.dart';
54
import 'package:flutter/widgets.dart';
65
import 'package:rxdart/transformers.dart';
@@ -19,7 +18,6 @@ import '../sfu/data/models/sfu_publish_options.dart';
1918
import '../sfu/data/models/sfu_track_type.dart';
2019
import '../sfu/data/models/sfu_video_sender.dart';
2120
import '../utils/extensions.dart';
22-
import '../utils/future.dart';
2321
import '../utils/none.dart';
2422
import '../utils/result.dart';
2523
import 'codecs_helper.dart' as codecs;
@@ -1043,10 +1041,17 @@ extension RtcManagerTrackHelper on RtcManager {
10431041
return Result.error('Track is not camera');
10441042
}
10451043

1046-
final updatedTrack = await track.flipCamera();
1047-
tracks[updatedTrack.trackId] = updatedTrack;
1044+
track.disable();
10481045

1049-
return Result.success(updatedTrack);
1046+
try {
1047+
final updatedTrack = await track.flipCamera();
1048+
tracks[updatedTrack.trackId] = updatedTrack;
1049+
return Result.success(updatedTrack);
1050+
} finally {
1051+
// small delay avoids camera being mirrored wrongly for a brief moment
1052+
await Future<void>.delayed(const Duration(milliseconds: 50));
1053+
track.enable();
1054+
}
10501055
}
10511056

10521057
Future<Result<RtcLocalCameraTrack>> setVideoInputDevice({

packages/stream_video_flutter/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- [iOS] Improved broadcast extension handling — the app now waits for the broadcast picker selection before actually starting screen sharing.
88
- Resolved an issue where the camera wouldn’t flip correctly if the back camera was selected initially.
99
- Fixed an issue where `callMembers` collection wasn't reflecting the actual members list after starting the call session.
10+
- Fixed an issue with initials creation when multicharacter symbols were used in a user name.
1011

1112
✅ Added
1213
- [Web] Added `checkIfAudioOutputChangeSupported()` to the `Call` class to check whether the browser supports changing the audio output device.

packages/stream_video_flutter/lib/src/utils/extensions.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'dart:math';
22

3+
import 'package:characters/characters.dart';
4+
35
/// Extensions on [String].
46
extension StringExtension on String {
57
/// Returns initials for a string
@@ -13,7 +15,7 @@ extension StringExtension on String {
1315
final resultBuffer = StringBuffer();
1416

1517
for (var i = 0; i < parts.length; i++) {
16-
resultBuffer.write(parts[i][0].toUpperCase());
18+
resultBuffer.write(parts[i].characters.first.toUpperCase());
1719
}
1820

1921
return resultBuffer.toString();

packages/stream_video_flutter/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ environment:
1212

1313
dependencies:
1414
cached_network_image: ^3.4.1
15+
characters: ^1.4.0
1516
collection: ^1.19.1
1617
equatable: ^2.0.7
1718
flutter:

0 commit comments

Comments
 (0)