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.
220 lines
6.7 KiB
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);
|
|
}
|
|
}
|