You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PatientApp-KKUMC/lib/pages/webRTC/OpenTok/OpenTok.dart

220 lines
6.7 KiB
Dart

import 'dart:async';
import 'package:diplomaticquarterapp/pages/conference/conference_button_bar.dart';
import 'package:diplomaticquarterapp/pages/conference/draggable_publisher.dart';
import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'OpenTokPlatformBridge.dart';
class OpenTokConnectCallPage extends StatefulWidget {
final String sessionId;
final String token;
final String apiKey;
OpenTokConnectCallPage({@required this.sessionId, @required this.token, @required this.apiKey});
@override
State<StatefulWidget> createState() => OpenTokState();
}
class OpenTokState extends State<OpenTokConnectCallPage> {
OpenTokPlatformBridge openTokPlatform;
OpenTokSDKState sdkState = OpenTokSDKState.LOGGED_OUT;
final StreamController<bool> _audioButton = StreamController<bool>.broadcast();
final StreamController<bool> _videoButton = StreamController<bool>.broadcast();
final StreamController<bool> _onButtonBarVisibleStreamController = StreamController<bool>.broadcast();
final StreamController<double> _onButtonBarHeightStreamController = StreamController<double>.broadcast();
var audioMute = false;
var videoMute = false;
initOpenTok() {
openTokPlatform = OpenTokPlatformBridge.init(
apiKey: widget.apiKey,
sessionID: widget.sessionId,
token: widget.token,
onStateChange: (state) {
setState(() => sdkState = state);
});
}
@override
void initState() {
initOpenTok();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
extendBodyBehindAppBar: true,
appBar: AppBar(
backgroundColor: Colors.transparent,
actions: [
TextButton(
onPressed: () {
initOpenTok();
},
child: Icon(
Icons.connect_without_contact_outlined,
color: Colors.green,
))
],
),
body: Stack(
fit: StackFit.expand,
children: [
if (sdkState == OpenTokSDKState.LOGGED_IN) ...platformVideoViews(),
if (sdkState == OpenTokSDKState.LOGGED_OUT)
Center(
child: Text("Logged Out"),
),
if (sdkState == OpenTokSDKState.ERROR)
Center(
child: Text("Error opening session"),
),
if (sdkState == OpenTokSDKState.WAIT)
Center(
child: CircularProgressIndicator(),
),
if (sdkState == OpenTokSDKState.ON_CALL) Container(),
ConferenceButtonBar(
audioEnabled: _audioButton.stream,
videoEnabled: _videoButton.stream,
onAudioEnabled: _onAudioEnable,
onVideoEnabled: _onVideoEnabled,
onSwitchCamera: _onSwitchCamera,
onHangup: _onHangup,
onPersonAdd: () {},
onPersonRemove: () {},
onHeight: _onHeightBar,
onShow: _onShowBar,
onHide: _onHideBar,
),
],
),
);
}
bool remoteVideoOnFull = true;
List<Widget> platformVideoViews() {
return [
SizedBox(width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, child: remoteVideoOnFull ? remotePlatformVideoView() : localPlatformVideoView()),
DraggablePublisher(
onButtonBarHeight: ((double) async* {}(50)),
onButtonBarVisible: ((bool) async* {}(true)),
availableScreenSize: MediaQuery.of(context).size,
child: InkWell(
child: (remoteVideoOnFull ? localPlatformVideoView() : remotePlatformVideoView()),
onTap: () {
print('');
},
),
)
];
}
Widget localPlatformVideoView() {
return PlatformViewLink(
viewType: 'local-video-container', // custom platform-view-type
surfaceFactory: (BuildContext context, PlatformViewController controller) {
return AndroidViewSurface(
controller: controller,
gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
hitTestBehavior: PlatformViewHitTestBehavior.opaque,
);
},
onCreatePlatformView: (PlatformViewCreationParams params) {
return PlatformViewsService.initSurfaceAndroidView(
id: params.id,
viewType: 'local-video-container',
// custom platform-view-type,
layoutDirection: TextDirection.ltr,
creationParams: {},
creationParamsCodec: StandardMessageCodec(),
)
..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
..create();
},
);
}
Widget remotePlatformVideoView() {
return PlatformViewLink(
viewType: 'remote-video-container', // custom platform-view-type
surfaceFactory: (BuildContext context, PlatformViewController controller) {
return AndroidViewSurface(
controller: controller,
gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
hitTestBehavior: PlatformViewHitTestBehavior.opaque,
);
},
onCreatePlatformView: (PlatformViewCreationParams params) {
return PlatformViewsService.initSurfaceAndroidView(
id: params.id,
viewType: 'remote-video-container',
// custom platform-view-type,
layoutDirection: TextDirection.ltr,
creationParams: {},
creationParamsCodec: StandardMessageCodec(),
)
..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
..create();
},
);
}
_onAudioEnable() async {
await openTokPlatform.toggleAudio();
_audioButton.add(!audioMute);
}
_onVideoEnabled() async {
await openTokPlatform.toggleVideo();
_videoButton.add(!videoMute);
}
_onSwitchCamera() async {
await openTokPlatform.swapCamera();
}
Future<void> _onHangup() async {
print('onHangup');
await openTokPlatform.hangupCall();
endCallAPI();
Navigator.of(context).pop();
}
void endCallAPI() {
LiveCareService service = new LiveCareService();
service.endCallAPI(widget.sessionId, 2, context).then((res) {}).catchError((err) {
print(err);
});
}
void _onShowBar() {
setState(() {});
_onButtonBarVisibleStreamController.add(true);
}
void _onHeightBar(double height) {
_onButtonBarHeightStreamController.add(height);
}
void _onHideBar() {
setState(() {
SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
});
_onButtonBarVisibleStreamController.add(false);
}
}