fix: voip code breaking from 0.28
have not tested it but should mostly be fine, rewrite should get in someday anyway :p
This commit is contained in:
parent
57f0962921
commit
4095560412
10 changed files with 124 additions and 115 deletions
|
|
@ -8,8 +8,6 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|||
import 'package:matrix/matrix.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
|
||||
import 'package:fluffychat/utils/voip_plugin.dart';
|
||||
|
||||
class CallKeeper {
|
||||
CallKeeper(this.callKeepManager, this.call) {
|
||||
call.onCallStateChanged.stream.listen(_handleCallState);
|
||||
|
|
@ -40,31 +38,14 @@ class CallKeeper {
|
|||
case CallState.kEnded:
|
||||
callKeepManager.hangup(call.callId);
|
||||
break;
|
||||
/* TODO:
|
||||
case CallState.kMuted:
|
||||
callKeepManager.setMutedCall(uuid, true);
|
||||
break;
|
||||
case CallState.kHeld:
|
||||
callKeepManager.setOnHold(uuid, true);
|
||||
break;
|
||||
*/
|
||||
|
||||
case CallState.kFledgling:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case CallState.kInviteSent:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case CallState.kWaitLocalMedia:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case CallState.kCreateOffer:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case CallState.kCreateAnswer:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case CallState.kRinging:
|
||||
// TODO: Handle this case.
|
||||
case CallState.kEnding:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -84,7 +65,6 @@ class CallKeepManager {
|
|||
static final CallKeepManager _instance = CallKeepManager._internal();
|
||||
|
||||
late FlutterCallkeep _callKeep;
|
||||
VoipPlugin? _voipPlugin;
|
||||
|
||||
String get appName => 'FluffyChat';
|
||||
|
||||
|
|
@ -130,7 +110,7 @@ class CallKeepManager {
|
|||
});
|
||||
call.onCallEventChanged.stream.listen(
|
||||
(event) {
|
||||
if (event == CallEvent.kLocalHoldUnhold) {
|
||||
if (event == CallStateChange.kLocalHoldUnhold) {
|
||||
Logs().i(
|
||||
'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}',
|
||||
);
|
||||
|
|
@ -170,10 +150,7 @@ class CallKeepManager {
|
|||
Future<void> initialize() async {
|
||||
_callKeep.on(CallKeepPerformAnswerCallAction(), answerCall);
|
||||
_callKeep.on(CallKeepDidPerformDTMFAction(), didPerformDTMFAction);
|
||||
_callKeep.on(
|
||||
CallKeepDidReceiveStartCallAction(),
|
||||
didReceiveStartCallAction,
|
||||
);
|
||||
|
||||
_callKeep.on(CallKeepDidToggleHoldAction(), didToggleHoldCallAction);
|
||||
_callKeep.on(
|
||||
CallKeepDidPerformSetMutedCallAction(),
|
||||
|
|
@ -313,7 +290,7 @@ class CallKeepManager {
|
|||
|
||||
Future<void> endCall(CallKeepPerformEndCallAction event) async {
|
||||
final keeper = calls[event.callUUID];
|
||||
keeper?.call.hangup();
|
||||
keeper?.call.hangup(reason: CallErrorCode.userHangup);
|
||||
removeCall(event.callUUID);
|
||||
}
|
||||
|
||||
|
|
@ -322,25 +299,6 @@ class CallKeepManager {
|
|||
keeper.call.sendDTMF(event.digits!);
|
||||
}
|
||||
|
||||
Future<void> didReceiveStartCallAction(
|
||||
CallKeepDidReceiveStartCallAction event,
|
||||
) async {
|
||||
if (event.handle == null) {
|
||||
// @TODO: sometime we receive `didReceiveStartCallAction` with handle` undefined`
|
||||
return;
|
||||
}
|
||||
final callUUID = event.callUUID!;
|
||||
if (event.callUUID == null) {
|
||||
final call =
|
||||
await _voipPlugin!.voip.inviteToCall(event.handle!, CallType.kVideo);
|
||||
addCall(callUUID, CallKeeper(this, call));
|
||||
}
|
||||
await _callKeep.startCall(callUUID, event.handle!, event.handle!);
|
||||
Timer(const Duration(seconds: 1), () {
|
||||
_callKeep.setCurrentCallActive(callUUID);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> didPerformSetMutedCallAction(
|
||||
CallKeepDidPerformSetMutedCallAction event,
|
||||
) async {
|
||||
|
|
|
|||
86
lib/utils/voip/video_renderer.dart
Normal file
86
lib/utils/voip/video_renderer.dart
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
class VideoRenderer extends StatefulWidget {
|
||||
final WrappedMediaStream? stream;
|
||||
final bool mirror;
|
||||
final RTCVideoViewObjectFit fit;
|
||||
|
||||
const VideoRenderer(
|
||||
this.stream, {
|
||||
this.mirror = false,
|
||||
this.fit = RTCVideoViewObjectFit.RTCVideoViewObjectFitContain,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => _VideoRendererState();
|
||||
}
|
||||
|
||||
class _VideoRendererState extends State<VideoRenderer> {
|
||||
RTCVideoRenderer? _renderer;
|
||||
bool _rendererReady = false;
|
||||
MediaStream? get mediaStream => widget.stream?.stream;
|
||||
StreamSubscription? _streamChangeSubscription;
|
||||
|
||||
Future<RTCVideoRenderer> _initializeRenderer() async {
|
||||
_renderer ??= RTCVideoRenderer();
|
||||
await _renderer!.initialize();
|
||||
_renderer!.srcObject = mediaStream;
|
||||
return _renderer!;
|
||||
}
|
||||
|
||||
void disposeRenderer() {
|
||||
try {
|
||||
_renderer?.srcObject = null;
|
||||
_renderer?.dispose();
|
||||
_renderer = null;
|
||||
// ignore: empty_catches
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_streamChangeSubscription =
|
||||
widget.stream?.onStreamChanged.stream.listen((stream) {
|
||||
setState(() {
|
||||
_renderer?.srcObject = stream;
|
||||
});
|
||||
});
|
||||
setupRenderer();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
Future<void> setupRenderer() async {
|
||||
await _initializeRenderer();
|
||||
setState(() => _rendererReady = true);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_streamChangeSubscription?.cancel();
|
||||
disposeRenderer();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => !_rendererReady
|
||||
? Container()
|
||||
: Builder(
|
||||
key: widget.key,
|
||||
builder: (ctx) {
|
||||
return RTCVideoView(
|
||||
_renderer!,
|
||||
mirror: widget.mirror,
|
||||
filterQuality: FilterQuality.medium,
|
||||
objectFit: widget.fit,
|
||||
placeholderBuilder: (_) =>
|
||||
Container(color: Colors.white.withOpacity(0.18)),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
|
@ -90,11 +90,6 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate {
|
|||
]) =>
|
||||
webrtc_impl.createPeerConnection(configuration, constraints);
|
||||
|
||||
@override
|
||||
VideoRenderer createRenderer() {
|
||||
return webrtc_impl.RTCVideoRenderer();
|
||||
}
|
||||
|
||||
Future<bool> get hasCallingAccount async =>
|
||||
kIsWeb ? false : await CallKeepManager().hasPhoneAccountEnabled;
|
||||
|
||||
|
|
@ -179,12 +174,12 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<void> handleGroupCallEnded(GroupCall groupCall) async {
|
||||
Future<void> handleGroupCallEnded(GroupCallSession groupCall) async {
|
||||
// TODO: implement handleGroupCallEnded
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> handleNewGroupCall(GroupCall groupCall) async {
|
||||
Future<void> handleNewGroupCall(GroupCallSession groupCall) async {
|
||||
// TODO: implement handleNewGroupCall
|
||||
}
|
||||
|
||||
|
|
@ -197,4 +192,8 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate {
|
|||
Future<void> handleMissedCall(CallSession session) async {
|
||||
// TODO: implement handleMissedCall
|
||||
}
|
||||
|
||||
@override
|
||||
// TODO: implement keyProvider
|
||||
EncryptionKeyProvider? get keyProvider => throw UnimplementedError();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue