media_track_constraints_delegate.dart
2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import 'dart:js_interop';
import 'package:mobile_scanner/src/enums/torch_state.dart';
import 'package:web/web.dart';
/// This class represents a delegate that manages the constraints for a [MediaStreamTrack].
final class MediaTrackConstraintsDelegate {
/// Constructs a [MediaTrackConstraintsDelegate] instance.
const MediaTrackConstraintsDelegate();
/// Get the constraints for the given [mediaStream].
MediaTrackConstraints? getConstraints(MediaStream? mediaStream) {
final List<JSAny?> tracks = mediaStream?.getVideoTracks().toDart ?? const [];
if (tracks.isEmpty) {
return null;
}
final MediaStreamTrack? track = tracks.first as MediaStreamTrack?;
return track?.getConstraints();
}
/// Returns a list of supported flashlight modes for the given [mediaStream].
///
/// The [TorchState.off] mode is always supported, regardless of the return value.
Future<List<TorchState>> getSupportedFlashlightModes(MediaStream? mediaStream) async {
if (mediaStream == null) {
return [];
}
final List<JSAny?> tracks = mediaStream.getVideoTracks().toDart;
if (tracks.isEmpty) {
return [];
}
final MediaStreamTrack? track = tracks.first as MediaStreamTrack?;
if (track == null) {
return [];
}
try {
final MediaTrackCapabilities capabilities = track.getCapabilities();
return [
if (capabilities.torch) TorchState.on,
];
} catch (_) {
// Firefox does not support getCapabilities() yet.
// https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getCapabilities#browser_compatibility
return [];
}
}
/// Returns whether the given [mediaStream] has a flashlight.
Future<bool> hasFlashlight(MediaStream? mediaStream) async {
return (await getSupportedFlashlightModes(mediaStream)).isNotEmpty;
}
/// Set the flashlight state of the given [mediaStream] to the given [value].
Future<void> setFlashlightState(MediaStream? mediaStream, TorchState value) async {
if (mediaStream == null) {
return;
}
if (await hasFlashlight(mediaStream)) {
final List<JSAny?> tracks = mediaStream.getVideoTracks().toDart;
if (tracks.isEmpty) {
return;
}
final bool flashlightEnabled = switch (value) {
TorchState.on => true,
TorchState.off || TorchState.unavailable => false,
};
final MediaStreamTrack? track = tracks.first as MediaStreamTrack?;
final MediaTrackConstraints constraints = MediaTrackConstraints(
advanced: [
{'torch': flashlightEnabled}.jsify(),
].toJS,
);
await track?.applyConstraints(constraints).toDart;
}
}
}