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.
		
		
		
		
		
			
		
			
				
	
	
		
			391 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			391 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Dart
		
	
// import 'dart:async';
 | 
						|
//
 | 
						|
// import 'package:diplomaticquarterapp/models/LiveCare/room_model.dart';
 | 
						|
// import 'package:diplomaticquarterapp/pages/conference/conference_button_bar.dart';
 | 
						|
// import 'package:diplomaticquarterapp/pages/conference/conference_room.dart';
 | 
						|
// import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
 | 
						|
// import 'package:diplomaticquarterapp/pages/conference/draggable_publisher.dart';
 | 
						|
// import 'package:diplomaticquarterapp/pages/conference/participant_widget.dart';
 | 
						|
// import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart';
 | 
						|
// import 'package:diplomaticquarterapp/pages/conference/widgets/platform_alert_dialog.dart';
 | 
						|
// import 'package:flutter/material.dart';
 | 
						|
// import 'package:flutter/services.dart';
 | 
						|
// import 'package:wakelock/wakelock.dart';
 | 
						|
//
 | 
						|
// class ConferencePage extends StatefulWidget {
 | 
						|
//   final RoomModel roomModel;
 | 
						|
//
 | 
						|
//   const ConferencePage({Key key, this.roomModel}) : super(key: key);
 | 
						|
//
 | 
						|
//   @override
 | 
						|
//   _ConferencePageState createState() => _ConferencePageState();
 | 
						|
// }
 | 
						|
//
 | 
						|
// class _ConferencePageState extends State<ConferencePage> {
 | 
						|
//   final StreamController<bool> _onButtonBarVisibleStreamController = StreamController<bool>.broadcast();
 | 
						|
//   final StreamController<double> _onButtonBarHeightStreamController = StreamController<double>.broadcast();
 | 
						|
//   // ConferenceRoom _conferenceRoom;
 | 
						|
//   StreamSubscription _onConferenceRoomException;
 | 
						|
//
 | 
						|
//   @override
 | 
						|
//   void initState() {
 | 
						|
//     super.initState();
 | 
						|
//     _lockInPortrait();
 | 
						|
//     _connectToRoom();
 | 
						|
//     _wakeLock(true);
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _connectToRoom() async {
 | 
						|
//     try {
 | 
						|
//       final conferenceRoom = ConferenceRoom(
 | 
						|
//         name: widget.roomModel.name,
 | 
						|
//         token: widget.roomModel.token,
 | 
						|
//         identity: widget.roomModel.identity,
 | 
						|
//       );
 | 
						|
//       await conferenceRoom.connect();
 | 
						|
//       setState(() {
 | 
						|
//         _conferenceRoom = conferenceRoom;
 | 
						|
//         _onConferenceRoomException = _conferenceRoom.onException.listen((err) async {
 | 
						|
//           await PlatformAlertDialog(
 | 
						|
//             title: err is PlatformException ? err.message : 'An error occured',
 | 
						|
//             content: err is PlatformException ? err.details : err.toString(),
 | 
						|
//             defaultActionText: 'OK',
 | 
						|
//           ).show(context);
 | 
						|
//         });
 | 
						|
//         _conferenceRoom.addListener(_conferenceRoomUpdated);
 | 
						|
//       });
 | 
						|
//     } catch (err) {
 | 
						|
//       print(err);
 | 
						|
//       await PlatformAlertDialog(
 | 
						|
//         title: err is PlatformException ? err.message : 'An error occured',
 | 
						|
//         content: err is PlatformException ? err.details : err.toString(),
 | 
						|
//         defaultActionText: 'OK',
 | 
						|
//       ).show(context);
 | 
						|
//
 | 
						|
//       Navigator.of(context).pop();
 | 
						|
//     }
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   Future<void> _lockInPortrait() async {
 | 
						|
//     await SystemChrome.setPreferredOrientations(<DeviceOrientation>[
 | 
						|
//       DeviceOrientation.portraitUp,
 | 
						|
//       DeviceOrientation.portraitDown,
 | 
						|
//     ]);
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   @override
 | 
						|
//   void dispose() {
 | 
						|
//     _freePortraitLock();
 | 
						|
//     _wakeLock(false);
 | 
						|
//     _disposeStreamsAndSubscriptions();
 | 
						|
//     if (_conferenceRoom != null) _conferenceRoom.removeListener(_conferenceRoomUpdated);
 | 
						|
//     super.dispose();
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   Future<void> _freePortraitLock() async {
 | 
						|
//     await SystemChrome.setPreferredOrientations(<DeviceOrientation>[
 | 
						|
//       DeviceOrientation.landscapeRight,
 | 
						|
//       DeviceOrientation.landscapeLeft,
 | 
						|
//       DeviceOrientation.portraitUp,
 | 
						|
//       DeviceOrientation.portraitDown,
 | 
						|
//     ]);
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   Future<void> _disposeStreamsAndSubscriptions() async {
 | 
						|
//     if (_onButtonBarVisibleStreamController != null) await _onButtonBarVisibleStreamController.close();
 | 
						|
//     if (_onButtonBarHeightStreamController != null) await _onButtonBarHeightStreamController.close();
 | 
						|
//     if (_onConferenceRoomException != null) await _onConferenceRoomException.cancel();
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   @override
 | 
						|
//   Widget build(BuildContext context) {
 | 
						|
//     return WillPopScope(
 | 
						|
//       onWillPop: () async => false,
 | 
						|
//       child: Scaffold(
 | 
						|
//         backgroundColor: Colors.white,
 | 
						|
//         body: _conferenceRoom == null ? showProgress() : buildLayout(),
 | 
						|
//       ),
 | 
						|
//     );
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   LayoutBuilder buildLayout() {
 | 
						|
//     return LayoutBuilder(
 | 
						|
//       builder: (BuildContext context, BoxConstraints constraints) {
 | 
						|
//         return Stack(
 | 
						|
//           children: <Widget>[
 | 
						|
//             _buildParticipants(context, constraints.biggest, _conferenceRoom),
 | 
						|
//             ConferenceButtonBar(
 | 
						|
//               audioEnabled: _conferenceRoom.onAudioEnabled,
 | 
						|
//               videoEnabled: _conferenceRoom.onVideoEnabled,
 | 
						|
//               onAudioEnabled: _conferenceRoom.toggleAudioEnabled,
 | 
						|
//               onVideoEnabled: _conferenceRoom.toggleVideoEnabled,
 | 
						|
//               onHangup: _onHangup,
 | 
						|
//               onSwitchCamera: _conferenceRoom.switchCamera,
 | 
						|
//               onPersonAdd: _onPersonAdd,
 | 
						|
//               onPersonRemove: _onPersonRemove,
 | 
						|
//               onHeight: _onHeightBar,
 | 
						|
//               onShow: _onShowBar,
 | 
						|
//               onHide: _onHideBar,
 | 
						|
//             ),
 | 
						|
//           ],
 | 
						|
//         );
 | 
						|
//       },
 | 
						|
//     );
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   Widget showProgress() {
 | 
						|
//     return Column(
 | 
						|
//       mainAxisAlignment: MainAxisAlignment.center,
 | 
						|
//       crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
//       children: <Widget>[
 | 
						|
//         Center(child: CircularProgressIndicator()),
 | 
						|
//         SizedBox(
 | 
						|
//           height: 10,
 | 
						|
//         ),
 | 
						|
//         Text(
 | 
						|
//           'Connecting to the call...',
 | 
						|
//           style: TextStyle(color: Colors.white),
 | 
						|
//         ),
 | 
						|
//       ],
 | 
						|
//     );
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   Future<void> _onHangup() async {
 | 
						|
//     print('onHangup');
 | 
						|
//     await _conferenceRoom.disconnect();
 | 
						|
//     LandingPage.isOpenCallPage = false;
 | 
						|
//     Navigator.of(context).pop();
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _onPersonAdd() {
 | 
						|
//     print('onPersonAdd');
 | 
						|
//     try {
 | 
						|
//       _conferenceRoom.addDummy(
 | 
						|
//         child: Stack(
 | 
						|
//           children: <Widget>[
 | 
						|
//             const Placeholder(),
 | 
						|
//             Center(
 | 
						|
//               child: Text(
 | 
						|
//                 (_conferenceRoom.participants.length + 1).toString(),
 | 
						|
//                 style: const TextStyle(
 | 
						|
//                   shadows: <Shadow>[
 | 
						|
//                     Shadow(
 | 
						|
//                       blurRadius: 3.0,
 | 
						|
//                       color: Color.fromARGB(255, 0, 0, 0),
 | 
						|
//                     ),
 | 
						|
//                     Shadow(
 | 
						|
//                       blurRadius: 8.0,
 | 
						|
//                       color: Color.fromARGB(255, 255, 255, 255),
 | 
						|
//                     ),
 | 
						|
//                   ],
 | 
						|
//                   fontSize: 80,
 | 
						|
//                 ),
 | 
						|
//               ),
 | 
						|
//             ),
 | 
						|
//           ],
 | 
						|
//         ),
 | 
						|
//       );
 | 
						|
//     } on PlatformException catch (err) {
 | 
						|
//       PlatformAlertDialog(
 | 
						|
//         title: err.message,
 | 
						|
//         content: err.details,
 | 
						|
//         defaultActionText: 'OK',
 | 
						|
//       ).show(context);
 | 
						|
//     }
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _onPersonRemove() {
 | 
						|
//     print('onPersonRemove');
 | 
						|
//     _conferenceRoom.removeDummy();
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   Widget _buildParticipants(BuildContext context, Size size, ConferenceRoom conferenceRoom) {
 | 
						|
//     final children = <Widget>[];
 | 
						|
//     final length = conferenceRoom.participants.length;
 | 
						|
//
 | 
						|
//     if (length <= 2) {
 | 
						|
//       _buildOverlayLayout(context, size, children);
 | 
						|
//       return Stack(children: children);
 | 
						|
//     }
 | 
						|
//
 | 
						|
//     void buildInCols(bool removeLocalBeforeChunking, bool moveLastOfEachRowToNextRow, int columns) {
 | 
						|
//       _buildLayoutInGrid(
 | 
						|
//         context,
 | 
						|
//         size,
 | 
						|
//         children,
 | 
						|
//         removeLocalBeforeChunking: removeLocalBeforeChunking,
 | 
						|
//         moveLastOfEachRowToNextRow: moveLastOfEachRowToNextRow,
 | 
						|
//         columns: columns,
 | 
						|
//       );
 | 
						|
//     }
 | 
						|
//
 | 
						|
// //    if (length <= 3) {
 | 
						|
// //      buildInCols(true, false, 1);
 | 
						|
// //    } else if (length == 5) {
 | 
						|
// //      buildInCols(false, true, 2);
 | 
						|
// //    } else if (length <= 6 || length == 8) {
 | 
						|
// //      buildInCols(false, false, 2);
 | 
						|
// //    } else if (length == 7 || length == 9) {
 | 
						|
// //      buildInCols(true, false, 2);
 | 
						|
// //    } else if (length == 10) {
 | 
						|
// //      buildInCols(false, true, 3);
 | 
						|
// //    } else if (length == 13 || length == 16) {
 | 
						|
// //      buildInCols(true, false, 3);
 | 
						|
// //    } else if (length <= 18) {
 | 
						|
// //      buildInCols(false, false, 3);
 | 
						|
// //    }
 | 
						|
//
 | 
						|
//     return Column(
 | 
						|
//       children: children,
 | 
						|
//     );
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _buildOverlayLayout(BuildContext context, Size size, List<Widget> children) {
 | 
						|
//     final participants = _conferenceRoom.participants;
 | 
						|
//     if (participants.length == 1) {
 | 
						|
//       children.add(_buildNoiseBox());
 | 
						|
//     } else {
 | 
						|
//       final remoteParticipant = participants.firstWhere((ParticipantWidget participant) => participant.isRemote, orElse: () => null);
 | 
						|
//       if (remoteParticipant != null) {
 | 
						|
//         children.add(remoteParticipant);
 | 
						|
//       }
 | 
						|
//     }
 | 
						|
//
 | 
						|
//     final localParticipant = participants.firstWhere((ParticipantWidget participant) => !participant.isRemote, orElse: () => null);
 | 
						|
//     if (localParticipant != null) {
 | 
						|
//       children.add(DraggablePublisher(
 | 
						|
//         key: Key('publisher'),
 | 
						|
//         child: localParticipant,
 | 
						|
//         availableScreenSize: size,
 | 
						|
//         onButtonBarVisible: _onButtonBarVisibleStreamController.stream,
 | 
						|
//         onButtonBarHeight: _onButtonBarHeightStreamController.stream,
 | 
						|
//       ));
 | 
						|
//     }
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _buildLayoutInGrid(
 | 
						|
//     BuildContext context,
 | 
						|
//     Size size,
 | 
						|
//     List<Widget> children, {
 | 
						|
//     bool removeLocalBeforeChunking = false,
 | 
						|
//     bool moveLastOfEachRowToNextRow = false,
 | 
						|
//     int columns = 2,
 | 
						|
//   }) {
 | 
						|
//     final participants = _conferenceRoom.participants;
 | 
						|
//     ParticipantWidget localParticipant;
 | 
						|
//     if (removeLocalBeforeChunking) {
 | 
						|
//       localParticipant = participants.firstWhere((ParticipantWidget participant) => !participant.isRemote, orElse: () => null);
 | 
						|
//       if (localParticipant != null) {
 | 
						|
//         participants.remove(localParticipant);
 | 
						|
//       }
 | 
						|
//     }
 | 
						|
//     final chunkedParticipants = chunk(array: participants, size: columns);
 | 
						|
//     if (localParticipant != null) {
 | 
						|
//       chunkedParticipants.last.add(localParticipant);
 | 
						|
//       participants.add(localParticipant);
 | 
						|
//     }
 | 
						|
//
 | 
						|
//     if (moveLastOfEachRowToNextRow) {
 | 
						|
//       for (var i = 0; i < chunkedParticipants.length - 1; i++) {
 | 
						|
//         var participant = chunkedParticipants[i].removeLast();
 | 
						|
//         chunkedParticipants[i + 1].insert(0, participant);
 | 
						|
//       }
 | 
						|
//     }
 | 
						|
//
 | 
						|
//     for (final participantChunk in chunkedParticipants) {
 | 
						|
//       final rowChildren = <Widget>[];
 | 
						|
//       for (final participant in participantChunk) {
 | 
						|
//         rowChildren.add(
 | 
						|
//           Container(
 | 
						|
//             width: size.width / participantChunk.length,
 | 
						|
//             height: size.height / chunkedParticipants.length,
 | 
						|
//             child: participant,
 | 
						|
//           ),
 | 
						|
//         );
 | 
						|
//       }
 | 
						|
//       children.add(
 | 
						|
//         Container(
 | 
						|
//           height: size.height / chunkedParticipants.length,
 | 
						|
//           child: Row(
 | 
						|
//             mainAxisAlignment: MainAxisAlignment.spaceEvenly,
 | 
						|
//             children: rowChildren,
 | 
						|
//           ),
 | 
						|
//         ),
 | 
						|
//       );
 | 
						|
//     }
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   NoiseBox _buildNoiseBox() {
 | 
						|
//     return NoiseBox(
 | 
						|
//       density: NoiseBoxDensity.xLow,
 | 
						|
//       backgroundColor: Colors.grey.shade900,
 | 
						|
//       child: Center(
 | 
						|
//         child: Container(
 | 
						|
//           color: Colors.black54,
 | 
						|
//           width: double.infinity,
 | 
						|
//           height: 40,
 | 
						|
//           child: Center(
 | 
						|
//             child: Text(
 | 
						|
//               'Waiting for another participant to connect to the call...',
 | 
						|
//               key: Key('text-wait'),
 | 
						|
//               textAlign: TextAlign.center,
 | 
						|
//               style: TextStyle(color: Colors.white),
 | 
						|
//             ),
 | 
						|
//           ),
 | 
						|
//         ),
 | 
						|
//       ),
 | 
						|
//     );
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   List<List<T>> chunk<T>({@required List<T> array, @required int size}) {
 | 
						|
//     final result = <List<T>>[];
 | 
						|
//     if (array.isEmpty || size <= 0) {
 | 
						|
//       return result;
 | 
						|
//     }
 | 
						|
//     var first = 0;
 | 
						|
//     var last = size;
 | 
						|
//     final totalLoop = array.length % size == 0 ? array.length ~/ size : array.length ~/ size + 1;
 | 
						|
//     for (var i = 0; i < totalLoop; i++) {
 | 
						|
//       if (last > array.length) {
 | 
						|
//         result.add(array.sublist(first, array.length));
 | 
						|
//       } else {
 | 
						|
//         result.add(array.sublist(first, last));
 | 
						|
//       }
 | 
						|
//       first = last;
 | 
						|
//       last = last + size;
 | 
						|
//     }
 | 
						|
//     return result;
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _onHeightBar(double height) {
 | 
						|
//     _onButtonBarHeightStreamController.add(height);
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _onShowBar() {
 | 
						|
//     setState(() {
 | 
						|
//       SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom, SystemUiOverlay.top]);
 | 
						|
//     });
 | 
						|
//     _onButtonBarVisibleStreamController.add(true);
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _onHideBar() {
 | 
						|
//     setState(() {
 | 
						|
//       SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
 | 
						|
//     });
 | 
						|
//     _onButtonBarVisibleStreamController.add(false);
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   Future<void> _wakeLock(bool enable) async {
 | 
						|
//     try {
 | 
						|
//       return await (enable ? Wakelock.enable() : Wakelock.disable());
 | 
						|
//     } catch (err) {
 | 
						|
//       print('Unable to change the Wakelock and set it to $enable');
 | 
						|
//       print(err);
 | 
						|
//     }
 | 
						|
//   }
 | 
						|
//
 | 
						|
//   void _conferenceRoomUpdated() {
 | 
						|
//     setState(() {});
 | 
						|
//   }
 | 
						|
// }
 |