Skip to content

Commit a92cc75

Browse files
authored
Merge branch 'master' into feat/desktop-capture-testing
2 parents 420495f + 45be971 commit a92cc75

File tree

9 files changed

+352
-90
lines changed

9 files changed

+352
-90
lines changed

.github/workflows/flutter.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
java-version: '12.x'
2323
- uses: subosito/flutter-action@v1
2424
with:
25-
flutter-version: '2.0.5'
25+
flutter-version: '3.3.2'
2626
channel: 'stable'
2727
- run: flutter packages get
2828
- run: flutter test

android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

ios/Runner/GeneratedPluginRegistrant.h

Lines changed: 0 additions & 17 deletions
This file was deleted.

ios/Runner/GeneratedPluginRegistrant.m

Lines changed: 0 additions & 33 deletions
This file was deleted.

lib/src/call_sample/call_sample.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class _CallSampleState extends State<CallSample> {
2121
RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
2222
bool _inCalling = false;
2323
Session? _session;
24-
24+
DesktopCapturerSource? selected_source_;
2525
bool _waitAccept = false;
2626

2727
// ignore: unused_element
@@ -31,7 +31,7 @@ class _CallSampleState extends State<CallSample> {
3131
initState() {
3232
super.initState();
3333
initRenderers();
34-
_connect();
34+
_connect(context);
3535
}
3636

3737
initRenderers() async {
@@ -47,8 +47,8 @@ class _CallSampleState extends State<CallSample> {
4747
_remoteRenderer.dispose();
4848
}
4949

50-
void _connect() async {
51-
_signaling ??= Signaling(widget.host)..connect();
50+
void _connect(BuildContext context) async {
51+
_signaling ??= Signaling(widget.host, context)..connect();
5252
_signaling?.onSignalingStateChange = (SignalingState state) {
5353
switch (state) {
5454
case SignalingState.ConnectionClosed:

lib/src/call_sample/data_channel_sample.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class _DataChannelSampleState extends State<DataChannelSample> {
2929
@override
3030
initState() {
3131
super.initState();
32-
_connect();
32+
_connect(context);
3333
}
3434

3535
@override
@@ -39,8 +39,8 @@ class _DataChannelSampleState extends State<DataChannelSample> {
3939
_timer?.cancel();
4040
}
4141

42-
void _connect() async {
43-
_signaling ??= Signaling(widget.host)..connect();
42+
void _connect(BuildContext context) async {
43+
_signaling ??= Signaling(widget.host, context)..connect();
4444

4545
_signaling?.onDataChannelMessage = (_, dc, RTCDataChannelMessage data) {
4646
setState(() {

lib/src/call_sample/signaling.dart

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'dart:convert';
22
import 'dart:async';
3+
import 'package:flutter/material.dart';
34
import 'package:flutter_webrtc/flutter_webrtc.dart';
45

6+
import '../utils/screen_select_dialog.dart';
57
import 'random_string.dart';
68

79
import '../utils/device_info.dart'
@@ -39,12 +41,13 @@ class Session {
3941
}
4042

4143
class Signaling {
42-
Signaling(this._host);
44+
Signaling(this._host, this._context);
4345

4446
JsonEncoder _encoder = JsonEncoder();
4547
JsonDecoder _decoder = JsonDecoder();
4648
String _selfId = randomNumeric(6);
4749
SimpleWebSocket? _socket;
50+
BuildContext? _context;
4851
var _host;
4952
var _port = 8086;
5053
var _turnCredential;
@@ -330,7 +333,8 @@ class Signaling {
330333
await _socket?.connect();
331334
}
332335

333-
Future<MediaStream> createStream(String media, bool userScreen) async {
336+
Future<MediaStream> createStream(String media, bool userScreen,
337+
{BuildContext? context}) async {
334338
final Map<String, dynamic> mediaConstraints = {
335339
'audio': userScreen ? false : true,
336340
'video': userScreen
@@ -346,22 +350,43 @@ class Signaling {
346350
'optional': [],
347351
}
348352
};
353+
late MediaStream stream;
354+
if (userScreen) {
355+
if (WebRTC.platformIsDesktop) {
356+
final source = await showDialog<DesktopCapturerSource>(
357+
context: context!,
358+
builder: (context) => ScreenSelectDialog(),
359+
);
360+
stream = await navigator.mediaDevices.getDisplayMedia(<String, dynamic>{
361+
'video': source == null
362+
? true
363+
: {
364+
'deviceId': {'exact': source.id},
365+
'mandatory': {'frameRate': 30.0}
366+
}
367+
});
368+
} else {
369+
stream = await navigator.mediaDevices.getDisplayMedia(mediaConstraints);
370+
}
371+
} else {
372+
stream = await navigator.mediaDevices.getUserMedia(mediaConstraints);
373+
}
349374

350-
MediaStream stream = userScreen
351-
? await navigator.mediaDevices.getDisplayMedia(mediaConstraints)
352-
: await navigator.mediaDevices.getUserMedia(mediaConstraints);
353375
onLocalStream?.call(stream);
354376
return stream;
355377
}
356378

357-
Future<Session> _createSession(Session? session,
358-
{required String peerId,
359-
required String sessionId,
360-
required String media,
361-
required bool screenSharing}) async {
379+
Future<Session> _createSession(
380+
Session? session, {
381+
required String peerId,
382+
required String sessionId,
383+
required String media,
384+
required bool screenSharing,
385+
}) async {
362386
var newSession = session ?? Session(sid: sessionId, pid: peerId);
363387
if (media != 'data')
364-
_localStream = await createStream(media, screenSharing);
388+
_localStream =
389+
await createStream(media, screenSharing, context: _context);
365390
print(_iceServers);
366391
RTCPeerConnection pc = await createPeerConnection({
367392
..._iceServers,

0 commit comments

Comments
 (0)