Skip to content

Commit 5068498

Browse files
cloudwebrtczi6xuan趙金元viplifes
authored
Null safety (#234)
* update. * chore: format and import short. * Add extended header support (#232) * hangup add the options hangup function increase self-determination option number of participants, expedient unity communication time notification * fix: Fix breaking changes. * Add extended header support Add extended header support, in order to carry custom information when calling Co-authored-by: cloudwebrtc <[email protected]> Co-authored-by: 趙金元 <[email protected]> * migrate to null safety (#247) * migrate to null safety * fix local_seqnum * support null safety for test folder * fix: fix issue for digest authentication. * chore: fix lints. Co-authored-by: cloudwebrtc <[email protected]> * update. Co-authored-by: zi6xuan <[email protected]> Co-authored-by: 趙金元 <[email protected]> Co-authored-by: viplifes <[email protected]>
1 parent 5407ecc commit 5068498

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+8874
-5595
lines changed

.github/workflows/dart.yml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ jobs:
2222
java-version: '12.x'
2323
- uses: subosito/flutter-action@v1
2424
with:
25-
flutter-version: '1.22.6'
25+
flutter-version: '2.2.3'
2626
channel: 'stable'
2727
- run: flutter packages get
2828
- run: flutter format lib/ test/ --set-exit-if-changed
29-
- run: flutter pub run import_sorter:main --no-comments --exit-if-changed
30-
- run: flutter analyze
31-
- run: flutter test

analysis_options.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
include: package:pedantic/analysis_options.yaml
1+
include: package:lints/recommended.yaml
22

33
linter:
44
rules:
@@ -45,7 +45,6 @@ analyzer:
4545
slash_for_doc_comments: ignore
4646
library_prefixes: ignore
4747
unused_field: ignore
48-
top_level_function_literal_block: ignore
4948
avoid_init_to_null: ignore
5049
prefer_is_empty: ignore
5150
unused_element: ignore
@@ -59,6 +58,8 @@ analyzer:
5958
unused_import: ignore
6059
must_be_immutable: ignore
6160
todo: ignore
61+
non_constant_identifier_names: ignore
62+
unnecessary_null_comparison: ignore
6263

6364
exclude:
6465
- lib/src/grammar_parser.dart

example/analysis_options.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
include: package:pedantic/analysis_options.yaml
1+
include: package:lints/recommended.yaml
22

3-
analyzer:
4-
strong-mode:
5-
implicit-casts: false
6-
implicit-dynamic: false
3+
linter:
4+
rules:
5+
# avoid_print: false # Uncomment to disable the `avoid_print` rule
6+
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule

example/lib/main.dart

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import 'package:flutter/foundation.dart'
22
show debugDefaultTargetPlatformOverride;
3-
43
import 'package:flutter/material.dart';
5-
import 'package:sip_ua/sip_ua.dart';
64
import 'package:flutter_webrtc/flutter_webrtc.dart';
7-
import 'src/register.dart';
8-
import 'src/dialpad.dart';
9-
import 'src/callscreen.dart';
5+
import 'package:sip_ua/sip_ua.dart';
6+
107
import 'src/about.dart';
8+
import 'src/callscreen.dart';
9+
import 'src/dialpad.dart';
10+
import 'src/register.dart';
1111

1212
void main() {
1313
if (WebRTC.platformIsDesktop) {
@@ -17,23 +17,23 @@ void main() {
1717
}
1818

1919
typedef PageContentBuilder = Widget Function(
20-
[SIPUAHelper helper, Object arguments]);
20+
[SIPUAHelper? helper, Object? arguments]);
2121

2222
// ignore: must_be_immutable
2323
class MyApp extends StatelessWidget {
2424
final SIPUAHelper _helper = SIPUAHelper();
2525
Map<String, PageContentBuilder> routes = {
26-
'/': ([SIPUAHelper helper, Object arguments]) => DialPadWidget(helper),
27-
'/register': ([SIPUAHelper helper, Object arguments]) =>
26+
'/': ([SIPUAHelper? helper, Object? arguments]) => DialPadWidget(helper),
27+
'/register': ([SIPUAHelper? helper, Object? arguments]) =>
2828
RegisterWidget(helper),
29-
'/callscreen': ([SIPUAHelper helper, Object arguments]) =>
30-
CallScreenWidget(helper, arguments as Call),
31-
'/about': ([SIPUAHelper helper, Object arguments]) => AboutWidget(),
29+
'/callscreen': ([SIPUAHelper? helper, Object? arguments]) =>
30+
CallScreenWidget(helper, arguments as Call?),
31+
'/about': ([SIPUAHelper? helper, Object? arguments]) => AboutWidget(),
3232
};
3333

34-
Route<dynamic> _onGenerateRoute(RouteSettings settings) {
35-
final String name = settings.name;
36-
final PageContentBuilder pageContentBuilder = routes[name];
34+
Route<dynamic>? _onGenerateRoute(RouteSettings settings) {
35+
final String? name = settings.name;
36+
final PageContentBuilder? pageContentBuilder = routes[name!];
3737
if (pageContentBuilder != null) {
3838
if (settings.arguments != null) {
3939
final Route route = MaterialPageRoute<Widget>(

example/lib/src/callscreen.dart

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,61 +3,61 @@ import 'dart:async';
33
import 'package:flutter/foundation.dart';
44
import 'package:flutter/material.dart';
55
import 'package:flutter_webrtc/flutter_webrtc.dart';
6+
import 'package:sip_ua/sip_ua.dart';
67

78
import 'widgets/action_button.dart';
8-
import 'package:sip_ua/sip_ua.dart';
99

1010
class CallScreenWidget extends StatefulWidget {
11-
final SIPUAHelper _helper;
12-
final Call _call;
13-
CallScreenWidget(this._helper, this._call, {Key key}) : super(key: key);
11+
final SIPUAHelper? _helper;
12+
final Call? _call;
13+
CallScreenWidget(this._helper, this._call, {Key? key}) : super(key: key);
1414
@override
1515
_MyCallScreenWidget createState() => _MyCallScreenWidget();
1616
}
1717

1818
class _MyCallScreenWidget extends State<CallScreenWidget>
1919
implements SipUaHelperListener {
20-
RTCVideoRenderer _localRenderer = RTCVideoRenderer();
21-
RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
22-
double _localVideoHeight;
23-
double _localVideoWidth;
24-
EdgeInsetsGeometry _localVideoMargin;
25-
MediaStream _localStream;
26-
MediaStream _remoteStream;
20+
RTCVideoRenderer? _localRenderer = RTCVideoRenderer();
21+
RTCVideoRenderer? _remoteRenderer = RTCVideoRenderer();
22+
double? _localVideoHeight;
23+
double? _localVideoWidth;
24+
EdgeInsetsGeometry? _localVideoMargin;
25+
MediaStream? _localStream;
26+
MediaStream? _remoteStream;
2727

2828
bool _showNumPad = false;
2929
String _timeLabel = '00:00';
30-
Timer _timer;
30+
late Timer _timer;
3131
bool _audioMuted = false;
3232
bool _videoMuted = false;
3333
bool _speakerOn = false;
3434
bool _hold = false;
35-
String _holdOriginator;
35+
String? _holdOriginator;
3636
CallStateEnum _state = CallStateEnum.NONE;
37-
SIPUAHelper get helper => widget._helper;
37+
SIPUAHelper? get helper => widget._helper;
3838

3939
bool get voiceonly =>
40-
(_localStream == null || _localStream.getVideoTracks().isEmpty) &&
41-
(_remoteStream == null || _remoteStream.getVideoTracks().isEmpty);
40+
(_localStream == null || _localStream!.getVideoTracks().isEmpty) &&
41+
(_remoteStream == null || _remoteStream!.getVideoTracks().isEmpty);
4242

43-
String get remote_identity => call.remote_identity;
43+
String? get remote_identity => call!.remote_identity;
4444

45-
String get direction => call.direction;
45+
String get direction => call!.direction;
4646

47-
Call get call => widget._call;
47+
Call? get call => widget._call;
4848

4949
@override
5050
initState() {
5151
super.initState();
5252
_initRenderers();
53-
helper.addSipUaHelperListener(this);
53+
helper!.addSipUaHelperListener(this);
5454
_startTimer();
5555
}
5656

5757
@override
5858
deactivate() {
5959
super.deactivate();
60-
helper.removeSipUaHelperListener(this);
60+
helper!.removeSipUaHelperListener(this);
6161
_disposeRenderers();
6262
}
6363

@@ -78,20 +78,20 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
7878

7979
void _initRenderers() async {
8080
if (_localRenderer != null) {
81-
await _localRenderer.initialize();
81+
await _localRenderer!.initialize();
8282
}
8383
if (_remoteRenderer != null) {
84-
await _remoteRenderer.initialize();
84+
await _remoteRenderer!.initialize();
8585
}
8686
}
8787

8888
void _disposeRenderers() {
8989
if (_localRenderer != null) {
90-
_localRenderer.dispose();
90+
_localRenderer!.dispose();
9191
_localRenderer = null;
9292
}
9393
if (_remoteRenderer != null) {
94-
_remoteRenderer.dispose();
94+
_remoteRenderer!.dispose();
9595
_remoteRenderer = null;
9696
}
9797
}
@@ -107,15 +107,15 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
107107
}
108108

109109
if (callState.state == CallStateEnum.MUTED) {
110-
if (callState.audio) _audioMuted = true;
111-
if (callState.video) _videoMuted = true;
110+
if (callState.audio!) _audioMuted = true;
111+
if (callState.video!) _videoMuted = true;
112112
this.setState(() {});
113113
return;
114114
}
115115

116116
if (callState.state == CallStateEnum.UNMUTED) {
117-
if (callState.audio) _audioMuted = false;
118-
if (callState.video) _videoMuted = false;
117+
if (callState.audio!) _audioMuted = false;
118+
if (callState.video!) _videoMuted = false;
119119
this.setState(() {});
120120
return;
121121
}
@@ -154,10 +154,10 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
154154
void registrationStateChanged(RegistrationState state) {}
155155

156156
void _cleanUp() {
157-
_localStream?.getTracks()?.forEach((track) {
157+
_localStream?.getTracks().forEach((track) {
158158
track.stop();
159159
});
160-
_localStream.dispose();
160+
_localStream!.dispose();
161161
_localStream = null;
162162
}
163163

@@ -170,19 +170,19 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
170170
}
171171

172172
void _handelStreams(CallState event) async {
173-
MediaStream stream = event.stream;
173+
MediaStream? stream = event.stream;
174174
if (event.originator == 'local') {
175175
if (_localRenderer != null) {
176-
_localRenderer.srcObject = stream;
176+
_localRenderer!.srcObject = stream;
177177
}
178178
if (!kIsWeb && !WebRTC.platformIsDesktop) {
179-
event.stream?.getAudioTracks()?.first?.enableSpeakerphone(false);
179+
event.stream?.getAudioTracks().first.enableSpeakerphone(false);
180180
}
181181
_localStream = stream;
182182
}
183183
if (event.originator == 'remote') {
184184
if (_remoteRenderer != null) {
185-
_remoteRenderer.srcObject = stream;
185+
_remoteRenderer!.srcObject = stream;
186186
}
187187
_remoteStream = stream;
188188
}
@@ -205,12 +205,12 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
205205
}
206206

207207
void _handleHangup() {
208-
call.hangup();
208+
call!.hangup();
209209
_timer.cancel();
210210
}
211211

212212
void _handleAccept() async {
213-
bool remote_has_video = call.remote_has_video;
213+
bool remote_has_video = call!.remote_has_video;
214214
final mediaConstraints = <String, dynamic>{
215215
'audio': true,
216216
'video': remote_has_video
@@ -229,41 +229,41 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
229229
mediaStream = await navigator.mediaDevices.getUserMedia(mediaConstraints);
230230
}
231231

232-
call.answer(helper.buildCallOptions(!remote_has_video),
232+
call!.answer(helper!.buildCallOptions(!remote_has_video),
233233
mediaStream: mediaStream);
234234
}
235235

236236
void _switchCamera() {
237237
if (_localStream != null) {
238-
_localStream.getVideoTracks()[0].switchCamera();
238+
Helper.switchCamera(_localStream!.getVideoTracks()[0]);
239239
}
240240
}
241241

242242
void _muteAudio() {
243243
if (_audioMuted) {
244-
call.unmute(true, false);
244+
call!.unmute(true, false);
245245
} else {
246-
call.mute(true, false);
246+
call!.mute(true, false);
247247
}
248248
}
249249

250250
void _muteVideo() {
251251
if (_videoMuted) {
252-
call.unmute(false, true);
252+
call!.unmute(false, true);
253253
} else {
254-
call.mute(false, true);
254+
call!.mute(false, true);
255255
}
256256
}
257257

258258
void _handleHold() {
259259
if (_hold) {
260-
call.unhold();
260+
call!.unhold();
261261
} else {
262-
call.hold();
262+
call!.hold();
263263
}
264264
}
265265

266-
String _tansfer_target;
266+
late String _tansfer_target;
267267
void _handleTransfer() {
268268
showDialog<Null>(
269269
context: context,
@@ -286,7 +286,7 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
286286
TextButton(
287287
child: Text('Ok'),
288288
onPressed: () {
289-
call.refer(_tansfer_target);
289+
call!.refer(_tansfer_target);
290290
Navigator.of(context).pop();
291291
},
292292
),
@@ -304,7 +304,7 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
304304

305305
void _handleDtmf(String tone) {
306306
print('Dtmf tone => $tone');
307-
call.sendDTMF(tone);
307+
call!.sendDTMF(tone);
308308
}
309309

310310
void _handleKeyPad() {
@@ -317,7 +317,7 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
317317
if (_localStream != null) {
318318
_speakerOn = !_speakerOn;
319319
if (!kIsWeb) {
320-
_localStream.getAudioTracks()[0].enableSpeakerphone(_speakerOn);
320+
_localStream!.getAudioTracks()[0].enableSpeakerphone(_speakerOn);
321321
}
322322
}
323323
}
@@ -502,14 +502,14 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
502502

503503
if (!voiceonly && _remoteStream != null) {
504504
stackWidgets.add(Center(
505-
child: RTCVideoView(_remoteRenderer),
505+
child: RTCVideoView(_remoteRenderer!),
506506
));
507507
}
508508

509509
if (!voiceonly && _localStream != null) {
510510
stackWidgets.add(Container(
511511
child: AnimatedContainer(
512-
child: RTCVideoView(_localRenderer),
512+
child: RTCVideoView(_localRenderer!),
513513
height: _localVideoHeight,
514514
width: _localVideoWidth,
515515
alignment: Alignment.topRight,
@@ -536,7 +536,7 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
536536
child: Text(
537537
(voiceonly ? 'VOICE CALL' : 'VIDEO CALL') +
538538
(_hold
539-
? ' PAUSED BY ${this._holdOriginator.toUpperCase()}'
539+
? ' PAUSED BY ${this._holdOriginator!.toUpperCase()}'
540540
: ''),
541541
style: TextStyle(fontSize: 24, color: Colors.black54),
542542
))),

0 commit comments

Comments
 (0)