Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:flutter/foundation.dart'
show debugDefaultTargetPlatformOverride;

import 'package:flutter/material.dart';
import 'src/sip_ua_helper.dart';
import 'package:sip_ua/sip_ua.dart';
import 'src/register.dart';
import 'src/dialpad.dart';
import 'src/callscreen.dart';
Expand Down
109 changes: 53 additions & 56 deletions example/lib/src/callscreen.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_webrtc/webrtc.dart';
import 'package:sip_ua/src/RTCSession.dart';
import 'package:sip_ua/src/NameAddrHeader.dart';
import 'package:sip_ua/src/event_manager/event_manager.dart';

import 'widgets/action_button.dart';
import 'sip_ua_helper.dart';
import 'package:sip_ua/sip_ua.dart';

class CallScreenWidget extends StatefulWidget {
final SIPUAHelper _helper;
Expand All @@ -15,17 +12,16 @@ class CallScreenWidget extends StatefulWidget {
_MyCallScreenWidget createState() => _MyCallScreenWidget();
}

class _MyCallScreenWidget extends State<CallScreenWidget> {
class _MyCallScreenWidget extends State<CallScreenWidget>
implements SipUaHelperListener {
RTCVideoRenderer _localRenderer = RTCVideoRenderer();
RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
double _localVideoHeight;
double _localVideoWidth;
EdgeInsetsGeometry _localVideoMargin;
MediaStream _localStream;
MediaStream _remoteStream;
String _direction;
NameAddrHeader _local_identity;
NameAddrHeader _remote_identity;

bool _showNumPad = false;

String _timeLabel = '00:00';
Expand All @@ -36,34 +32,30 @@ class _MyCallScreenWidget extends State<CallScreenWidget> {
bool _speakerOn = false;
bool _hold = false;
String _holdOriginator;
String _state = 'new';

RTCSession get session => helper.session;
CallStateEnum _state = CallStateEnum.NONE;

SIPUAHelper get helper => widget._helper;

bool get voiceonly =>
(_localStream == null || _localStream.getVideoTracks().isEmpty) &&
(_remoteStream == null || _remoteStream.getVideoTracks().isEmpty);

String get remote_identity =>
_remote_identity.display_name ?? _remote_identity.uri.user;
String get remote_identity => helper.remote_identity;

String get direction => helper.direction;

@override
initState() {
super.initState();
_initRenderers();
_bindEventListeners();
helper.addSipUaHelperListener(this);
_startTimer();
_direction = session.direction.toUpperCase();
_local_identity = session.local_identity;
_remote_identity = session.remote_identity;
}

@override
deactivate() {
super.deactivate();
_removeEventListeners();
helper.removeSipUaHelperListener(this);
_disposeRenderers();
}

Expand Down Expand Up @@ -102,63 +94,68 @@ class _MyCallScreenWidget extends State<CallScreenWidget> {
}
}

void _bindEventListeners() {
helper.on(EventCallState(), _handleCalllState);
}

void _handleCalllState(EventCallState data) {
if (data.state == 'hold' || data.state == 'unhold') {
_hold = data.state == 'hold';
_holdOriginator = data.originator;
@override
void callStateChanged(CallState callState) {
if (callState.state == CallStateEnum.HOLD ||
callState.state == CallStateEnum.UNHOLD) {
_hold = callState.state == CallStateEnum.HOLD;
_holdOriginator = callState.originator;
this.setState(() {});
return;
}

if (data.state == 'muted') {
if (data.audio) _audioMuted = true;
if (data.video) _videoMuted = true;
if (callState.state == CallStateEnum.MUTED) {
if (callState.audio) _audioMuted = true;
if (callState.video) _videoMuted = true;
this.setState(() {});
return;
}

if (data.state == 'unmuted') {
if (data.audio) _audioMuted = false;
if (data.video) _videoMuted = false;
if (callState.state == CallStateEnum.UNMUTED) {
if (callState.audio) _audioMuted = false;
if (callState.video) _videoMuted = false;
this.setState(() {});
return;
}

if (data.state != 'stream') {
_state = data.state;
if (callState.state != CallStateEnum.STREAM) {
_state = callState.state;
}

switch (data.state) {
case 'stream':
_handelStreams(data);
break;
case 'progress':
case 'connecting':
case 'confirmed':
switch (callState.state) {
case CallStateEnum.STREAM:
_handelStreams(callState);
break;
case 'ended':
case 'failed':
case CallStateEnum.ENDED:
case CallStateEnum.FAILED:
_backToDialPad();
break;
case CallStateEnum.UNMUTED:
case CallStateEnum.MUTED:
case CallStateEnum.CONNECTING:
case CallStateEnum.PROGRESS:
case CallStateEnum.ACCEPTED:
case CallStateEnum.CONFIRMED:
case CallStateEnum.HOLD:
case CallStateEnum.UNHOLD:
case CallStateEnum.NONE:
case CallStateEnum.CALL_INITIATION:
break;
}
}

void _removeEventListeners() {
helper.remove(EventCallState(), _handleCalllState);
@override
void registrationStateChanged(RegistrationStateEnum state, String cause) {
//NO OP
}

void _backToDialPad() {
_timer.cancel();
Timer(Duration(seconds: 2), () {
Navigator.of(context).pop();
});
}

void _handelStreams(EventCallState event) async {
void _handelStreams(CallState event) async {
var stream = event.stream;
if (event.originator == 'local') {
if (_localRenderer != null) {
Expand Down Expand Up @@ -264,9 +261,9 @@ class _MyCallScreenWidget extends State<CallScreenWidget> {
var advanceActions = <Widget>[];

switch (_state) {
case 'new':
case 'connecting':
if (_direction == 'INCOMING') {
case CallStateEnum.NONE:
case CallStateEnum.CONNECTING:
if (direction == 'INCOMING') {
basicActions.add(ActionButton(
title: "Accept",
fillColor: Colors.green,
Expand All @@ -278,8 +275,8 @@ class _MyCallScreenWidget extends State<CallScreenWidget> {
basicActions.add(hangupBtn);
}
break;
case 'accepted':
case 'confirmed':
case CallStateEnum.ACCEPTED:
case CallStateEnum.CONFIRMED:
{
advanceActions.add(ActionButton(
title: _audioMuted ? 'unmute' : 'mute',
Expand Down Expand Up @@ -334,11 +331,11 @@ class _MyCallScreenWidget extends State<CallScreenWidget> {
));
}
break;
case 'failed':
case 'ended':
case CallStateEnum.FAILED:
case CallStateEnum.ENDED:
basicActions.add(hangupBtnInactive);
break;
case 'progress':
case CallStateEnum.PROGRESS:
basicActions.add(hangupBtn);
break;
default:
Expand Down Expand Up @@ -441,7 +438,7 @@ class _MyCallScreenWidget extends State<CallScreenWidget> {
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
title: Text('[$_direction] ${_state}')),
title: Text('[$direction] ${EnumHelper.getName(_state)}')),
body: Container(
child: _buildContent(),
),
Expand Down
30 changes: 18 additions & 12 deletions example/lib/src/dialpad.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'sip_ua_helper.dart';

import 'widgets/numpad.dart';
import 'package:sip_ua/src/event_manager/event_manager.dart';
import 'package:sip_ua/sip_ua.dart';

class DialPadWidget extends StatefulWidget {
final SIPUAHelper _helper;
Expand All @@ -11,7 +11,8 @@ class DialPadWidget extends StatefulWidget {
_MyDialPadWidget createState() => _MyDialPadWidget();
}

class _MyDialPadWidget extends State<DialPadWidget> {
class _MyDialPadWidget extends State<DialPadWidget>
implements SipUaHelperListener {
String _dest;
SIPUAHelper get helper => widget._helper;
TextEditingController _textController;
Expand All @@ -33,14 +34,7 @@ class _MyDialPadWidget extends State<DialPadWidget> {
}

void _bindEventListeners() {
helper.on(EventRegisterState(), (EventRegisterState data) {
this.setState(() {});
});
helper.on(EventUaState(), (EventUaState data) {
if (data.state == 'newRTCSession') {
Navigator.pushNamed(context, '/callscreen');
}
});
helper.addSipUaHelperListener(this);
}

Widget _handleCall(BuildContext context, [bool voiceonly = false]) {
Expand Down Expand Up @@ -202,7 +196,7 @@ class _MyDialPadWidget extends State<DialPadWidget> {
padding: const EdgeInsets.all(6.0),
child: Center(
child: Text(
'Status: ${helper.registerState}',
'Status: ${EnumHelper.getName(helper.registerState)}',
style: TextStyle(fontSize: 14, color: Colors.black54),
)),
),
Expand All @@ -214,4 +208,16 @@ class _MyDialPadWidget extends State<DialPadWidget> {
)),
])));
}

@override
void registrationStateChanged(RegistrationStateEnum state, String cause) {
this.setState(() {});
}

@override
void callStateChanged(CallState callState) {
if (callState.state == CallStateEnum.CALL_INITIATION) {
Navigator.pushNamed(context, '/callscreen');
}
}
}
31 changes: 14 additions & 17 deletions example/lib/src/register.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'sip_ua_helper.dart';
import 'package:sip_ua/src/event_manager/event_manager.dart';
import 'package:sip_ua/sip_ua.dart';

class RegisterWidget extends StatefulWidget {
final SIPUAHelper _helper;
Expand All @@ -10,7 +9,8 @@ class RegisterWidget extends StatefulWidget {
_MyRegisterWidget createState() => _MyRegisterWidget();
}

class _MyRegisterWidget extends State<RegisterWidget> {
class _MyRegisterWidget extends State<RegisterWidget>
implements SipUaHelperListener {
String _password;
String _wsUri;
String _sipUri;
Expand All @@ -20,24 +20,22 @@ class _MyRegisterWidget extends State<RegisterWidget> {
'Host': 'tryit.jssip.net:10443'
};
SharedPreferences prefs;
String _registerState;
RegistrationStateEnum _registerState;

SIPUAHelper get helper => widget._helper;

@override
initState() {
super.initState();
_registerState = helper.registerState;
helper.on(EventRegisterState(), _handleRegisterState);
helper.on(EventSocketState(), _handleSocketState);
helper.addSipUaHelperListener(this);
_loadSettings();
}

@override
deactivate() {
super.deactivate();
helper.remove(EventRegisterState(), _handleRegisterState);
helper.remove(EventSocketState(), _handleSocketState);
helper.removeSipUaHelperListener(this);
_saveSettings();
}

Expand All @@ -59,15 +57,9 @@ class _MyRegisterWidget extends State<RegisterWidget> {
prefs.commit();
}

void _handleRegisterState(EventRegisterState data) {
void registrationStateChanged(RegistrationStateEnum state, String cause) {
this.setState(() {
_registerState = data.state;
});
}

void _handleSocketState(EventSocketState data) {
this.setState(() {
_registerState = data.state;
_registerState = state;
});
}

Expand Down Expand Up @@ -122,7 +114,7 @@ class _MyRegisterWidget extends State<RegisterWidget> {
const EdgeInsets.fromLTRB(48.0, 18.0, 48.0, 18.0),
child: Center(
child: Text(
'Register Status: $_registerState',
'Register Status: ${EnumHelper.getName(_registerState)}',
style: TextStyle(fontSize: 18, color: Colors.black54),
)),
),
Expand Down Expand Up @@ -258,4 +250,9 @@ class _MyRegisterWidget extends State<RegisterWidget> {
))
])));
}

@override
void callStateChanged(CallState state) {
//NO OP
}
}
7 changes: 3 additions & 4 deletions lib/sip_ua.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export 'src/Config.dart';
export 'src/UA.dart';
export 'src/WebSocketInterface.dart';
export 'src/logger.dart';
/// only expose the bare minimum of internals required
export 'src/enum_helper.dart';
export 'src/sip_ua_helper.dart';
1 change: 1 addition & 0 deletions lib/src/Config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'Grammar.dart';
import 'Socket.dart' as Socket;
import 'URI.dart';
import 'Utils.dart' as Utils;
import 'WebSocketInterface.dart';
import 'logger.dart';

final logger = Log();
Expand Down
Loading