merge-update-with-lab-changes
haroon amjad 3 years ago
parent 3fb8876c31
commit a60f66a069

@ -20,8 +20,8 @@ var PACKAGES_ORDERS = '/api/orders';
var PACKAGES_ORDER_HISTORY = '/api/orders/items';
var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara';
// var BASE_URL = 'http://10.50.100.198:2018/';
var BASE_URL = 'https://uat.hmgwebservices.com/';
// var BASE_URL = 'https://hmgwebservices.com/';
// var BASE_URL = 'https://uat.hmgwebservices.com/';
var BASE_URL = 'https://hmgwebservices.com/';
// var BASE_URL = 'https://orash.cloudsolutions.com.sa/';
// var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/';
@ -182,6 +182,7 @@ var SAVE_BLOOD_AGREEMENT = 'Services/PatientVarification.svc/REST/AddUserAgreeme
var REPORTS = 'Services/Doctors.svc/REST/GetPatientMedicalReportStatusInfo';
var INSERT_REQUEST_FOR_MEDICAL_REPORT = 'Services/Doctors.svc/REST/InsertRequestForMedicalReport';
var SEND_MEDICAL_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendMedicalReportEmail';
var GET_INPATIENT_ADMISSIONS = 'Services/inps.svc/REST/getAdmissionForMedicalReport';
///Rate
// var IS_LAST_APPOITMENT_RATED = 'Services/Doctors.svc/REST/IsLastAppoitmentRated';

@ -1888,4 +1888,5 @@ const Map localizedValues = {
"comments": {"en": "Comments", "ar": "تعليقات"},
"rateDoctorResponseHeading": {"en": "Please rate the doctor response:", "ar": "يرجى تقييم استجابة الطبيب:"},
"updateInsuranceManuallyDialog": {"en": "Would you like to update your insurance manually?", "ar": "هل ترغب في تحديث التأمين الخاص بك يدويًا؟"},
"viewReport": {"en": "View Report", "ar": "عرض التقرير"},
};

@ -15,24 +15,26 @@ class RequestReports {
String tokenID;
int patientTypeID;
int patientType;
int projectID;
RequestReports(
{this.isReport,
this.encounterType,
this.requestType,
this.versionID,
this.channel,
this.languageID,
this.iPAdress,
this.generalid,
this.patientOutSA,
this.sessionID,
this.isDentalAllowedBackend,
this.deviceTypeID,
this.patientID,
this.tokenID,
this.patientTypeID,
this.patientType});
this.encounterType,
this.requestType,
this.versionID,
this.channel,
this.languageID,
this.iPAdress,
this.generalid,
this.patientOutSA,
this.sessionID,
this.isDentalAllowedBackend,
this.deviceTypeID,
this.patientID,
this.tokenID,
this.patientTypeID,
this.patientType,
this.projectID});
RequestReports.fromJson(Map<String, dynamic> json) {
isReport = json['IsReport'];
@ -51,6 +53,7 @@ class RequestReports {
tokenID = json['TokenID'];
patientTypeID = json['PatientTypeID'];
patientType = json['PatientType'];
projectID = json['ProjectID'];
}
Map<String, dynamic> toJson() {
@ -71,6 +74,7 @@ class RequestReports {
data['TokenID'] = this.tokenID;
data['PatientTypeID'] = this.patientTypeID;
data['PatientType'] = this.patientType;
data['ProjectID'] = this.projectID;
return data;
}
}
}

@ -8,17 +8,11 @@ class ReportsService extends BaseService {
List<Reports> reportsList = List();
List<AppointmentHistory> appointHistoryList = List();
String userAgreementContent = "";
RequestReports _requestReports = RequestReports(
isReport: true,
encounterType: 1,
requestType: 1,
patientOutSA: 0,
);
RequestReports _requestReports = RequestReports(isReport: true, encounterType: 1, requestType: 1, patientOutSA: 0, projectID: 0);
Future getReports() async {
hasError = false;
await baseAppClient.post(REPORTS,
onSuccess: (dynamic response, int statusCode) {
await baseAppClient.post(REPORTS, onSuccess: (dynamic response, int statusCode) {
reportsList.clear();
response['GetPatientMedicalStatus'].forEach((reports) {
reportsList.add(Reports.fromJson(reports));
@ -29,12 +23,25 @@ class ReportsService extends BaseService {
}, body: _requestReports.toJson());
}
Future getInpatientAdmissionsList() async {
hasError = false;
await baseAppClient.post(GET_INPATIENT_ADMISSIONS, onSuccess: (dynamic response, int statusCode) {
reportsList.clear();
print(response['AdmissionsForMedicalReport']);
response['AdmissionsForMedicalReport'].forEach((reports) {
// reportsList.add(Reports.fromJson(reports));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _requestReports.toJson());
}
Future getPatentAppointmentHistory() async {
hasError = false;
Map<String, dynamic> body = new Map<String, dynamic>();
body['IsForMedicalReport'] = true;
await baseAppClient.post(GET_PATIENT_AppointmentHistory,
onSuccess: (dynamic response, int statusCode) {
await baseAppClient.post(GET_PATIENT_AppointmentHistory, onSuccess: (dynamic response, int statusCode) {
appointHistoryList = [];
response['AppoimentAllHistoryResultList'].forEach((appoint) {
appointHistoryList.add(AppointmentHistory.fromJson(appoint));
@ -47,8 +54,7 @@ class ReportsService extends BaseService {
Future getUserTermsAndConditions() async {
hasError = false;
await baseAppClient.post(GET_USER_TERMS,
onSuccess: (dynamic response, int statusCode) {
await baseAppClient.post(GET_USER_TERMS, onSuccess: (dynamic response, int statusCode) {
userAgreementContent = response['UserAgreementContent'];
}, onFailure: (String error, int statusCode) {
hasError = true;
@ -60,9 +66,7 @@ class ReportsService extends BaseService {
Map<String, dynamic> body = Map<String, dynamic>();
body['RSummaryReport'] = isSummary;
hasError = false;
await baseAppClient.post(UPDATE_HEALTH_TERMS,
onSuccess: (dynamic response, int statusCode) {},
onFailure: (String error, int statusCode) {
await baseAppClient.post(UPDATE_HEALTH_TERMS, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
@ -73,16 +77,13 @@ class ReportsService extends BaseService {
body['EmailAddress'] = email;
body['isDentalAllowedBackend'] = false;
hasError = false;
await baseAppClient.post(UPDATE_PATENT_EMAIL,
onSuccess: (dynamic response, int statusCode) {},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
await baseAppClient.post(UPDATE_PATENT_EMAIL, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
Future insertRequestForMedicalReport(
AppointmentHistory appointmentHistory) async {
Future insertRequestForMedicalReport(AppointmentHistory appointmentHistory) async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['ClinicID'] = appointmentHistory.clinicID;
body['DoctorID'] = appointmentHistory.doctorID;
@ -98,23 +99,13 @@ class ReportsService extends BaseService {
body['Status'] = 1;
body['CreatedBy'] = 102;
hasError = false;
await baseAppClient.post(INSERT_REQUEST_FOR_MEDICAL_REPORT,
onSuccess: (dynamic response, int statusCode) {},
onFailure: (String error, int statusCode) {
await baseAppClient.post(INSERT_REQUEST_FOR_MEDICAL_REPORT, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
Future sendEmailForMedicalReport(
String projectName,
String clinicName,
String doctorName,
String requestDate,
String invoiceNo,
int projectID,
String stamp,
String setupID) async {
Future sendEmailForMedicalReport(String projectName, String clinicName, String doctorName, String requestDate, String invoiceNo, int projectID, String stamp, String setupID) async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['SetupID'] = setupID;
body['PrintDate'] = requestDate;
@ -135,11 +126,9 @@ class ReportsService extends BaseService {
dynamic response;
hasError = false;
await baseAppClient.post(SEND_MEDICAL_REPORT_EMAIL,
onSuccess: (dynamic res, int statusCode) {
response = res;
},
onFailure: (String error, int statusCode) {
await baseAppClient.post(SEND_MEDICAL_REPORT_EMAIL, onSuccess: (dynamic res, int statusCode) {
response = res;
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);

@ -33,6 +33,7 @@ class ReportsViewModel extends BaseViewModel {
setState(ViewState.Error);
} else {
_filterList();
await _reportsService.getInpatientAdmissionsList();
setState(ViewState.Idle);
}
}

@ -1,204 +1,204 @@
import 'dart:async';
import 'dart:convert';
import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart';
import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart';
import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
import '../conference_button_bar.dart';
class CallHomePage extends StatefulWidget {
final String receiverId;
final String callerId;
const CallHomePage({Key key, this.receiverId, this.callerId}) : super(key: key);
@override
_CallHomePageState createState() => _CallHomePageState();
}
class _CallHomePageState extends State<CallHomePage> {
bool showNoise = true;
RTCVideoRenderer _localRenderer = RTCVideoRenderer();
RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
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();
//Stream to enable video
MediaStream localMediaStream;
MediaStream remoteMediaStream;
Signaling signaling = Signaling();
@override
void initState() {
// TODO: implement initState
super.initState();
startCall();
}
startCall() async{
await _localRenderer.initialize();
await _remoteRenderer.initialize();
await signaling.init();
final connected = await receivedCall();
}
Future<bool> receivedCall() async {
//Stream local media
localMediaStream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': true});
_localRenderer.srcObject = localMediaStream;
final connected = await signaling.acceptCall(widget.callerId, widget.receiverId, localMediaStream: localMediaStream,
onRemoteMediaStream: (remoteMediaStream){
// print(remoteMediaStream.toString());
// print(json.encode(remoteMediaStream.getTracks().asMap()));
this.remoteMediaStream = remoteMediaStream;
_remoteRenderer.srcObject = remoteMediaStream;
_remoteRenderer.addListener(() {
print('_remoteRenderer');
print(_remoteRenderer);
setState(() {});
});
},
onRemoteTrack: (track){
_remoteRenderer.srcObject.addTrack(track.track);
// setState(() {
// });
print(track.streams.first.getVideoTracks());
print(track.streams.first.getAudioTracks());
print(json.encode(track.streams.asMap()));
}
);
if(connected){
signaling.signalR.listen(
onAcceptCall: (arg0){
print(arg0.toString());
},
onCandidate: (candidateJson){
signaling.addCandidate(candidateJson);
},
onDeclineCall: (arg0,arg1){
// _onHangup();
},
onHangupCall: (arg0){
// _onHangup();
},
onOffer: (offerSdp, callerUser) async{
print('${offerSdp.toString()} | ${callerUser.toString()}');
await signaling.answerOffer(offerSdp);
}
);
}
return connected;
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
signaling.dispose();
_localRenderer?.dispose();
_remoteRenderer?.dispose();
_audioButton?.close();
_videoButton?.close();
localMediaStream?.dispose();
remoteMediaStream?.dispose();
_disposeStreamsAndSubscriptions();
}
Future<void> _disposeStreamsAndSubscriptions() async {
if (_onButtonBarVisibleStreamController != null) await _onButtonBarVisibleStreamController.close();
if (_onButtonBarHeightStreamController != null) await _onButtonBarHeightStreamController.close();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: buildLayout(),
);
}
LayoutBuilder buildLayout() {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Stack(
children: [
CamViewWidget(
localRenderer: _localRenderer,
remoteRenderer: _remoteRenderer,
constraints: constraints,
onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController,
onButtonBarHeightStreamController: _onButtonBarHeightStreamController,
),
ConferenceButtonBar(
audioEnabled: _audioButton.stream,
videoEnabled: _videoButton.stream,
onAudioEnabled: _onAudioEnable,
onVideoEnabled: _onVideoEnabled,
onSwitchCamera: _onSwitchCamera,
onHangup: _onHangup,
onPersonAdd: () {},
onPersonRemove: () {},
onHeight: _onHeightBar,
onShow: _onShowBar,
onHide: _onHideBar,
),
],
);
},
);
}
Function _onAudioEnable() {
final audioTrack = localMediaStream.getAudioTracks()[0];
final mute = audioTrack.muted;
Helper.setMicrophoneMute(!mute, audioTrack);
_audioButton.add(mute);
}
Function _onVideoEnabled() {
final videoTrack = localMediaStream.getVideoTracks()[0];
bool videoEnabled = videoTrack.enabled;
localMediaStream.getVideoTracks()[0].enabled = !videoEnabled;
_videoButton.add(!videoEnabled);
}
Function _onSwitchCamera() {
Helper.switchCamera(localMediaStream.getVideoTracks()[0]);
}
void _onShowBar() {
setState(() {
});
_onButtonBarVisibleStreamController.add(true);
}
void _onHeightBar(double height) {
_onButtonBarHeightStreamController.add(height);
}
void _onHideBar() {
setState(() {
SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
});
_onButtonBarVisibleStreamController.add(false);
}
Future<void> _onHangup() async {
signaling.hangupCall(widget.callerId, widget.receiverId);
print('onHangup');
Navigator.of(context).pop();
}
}
// import 'dart:async';
// import 'dart:convert';
//
// import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart';
// import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart';
// import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter/services.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
//
// import '../conference_button_bar.dart';
//
// class CallHomePage extends StatefulWidget {
// final String receiverId;
// final String callerId;
//
// const CallHomePage({Key key, this.receiverId, this.callerId}) : super(key: key);
//
// @override
// _CallHomePageState createState() => _CallHomePageState();
// }
//
// class _CallHomePageState extends State<CallHomePage> {
// bool showNoise = true;
// RTCVideoRenderer _localRenderer = RTCVideoRenderer();
// RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
//
// 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();
//
// //Stream to enable video
// MediaStream localMediaStream;
// MediaStream remoteMediaStream;
// Signaling signaling = Signaling();
//
// @override
// void initState() {
// // TODO: implement initState
// super.initState();
// startCall();
// }
//
// startCall() async{
// await _localRenderer.initialize();
// await _remoteRenderer.initialize();
// await signaling.init();
// final connected = await receivedCall();
// }
//
//
// Future<bool> receivedCall() async {
// //Stream local media
// localMediaStream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': true});
// _localRenderer.srcObject = localMediaStream;
//
// final connected = await signaling.acceptCall(widget.callerId, widget.receiverId, localMediaStream: localMediaStream,
// onRemoteMediaStream: (remoteMediaStream){
//
// // print(remoteMediaStream.toString());
// // print(json.encode(remoteMediaStream.getTracks().asMap()));
// this.remoteMediaStream = remoteMediaStream;
// _remoteRenderer.srcObject = remoteMediaStream;
// _remoteRenderer.addListener(() {
// print('_remoteRenderer');
// print(_remoteRenderer);
// setState(() {});
// });
// },
// onRemoteTrack: (track){
// _remoteRenderer.srcObject.addTrack(track.track);
// // setState(() {
// // });
//
// print(track.streams.first.getVideoTracks());
// print(track.streams.first.getAudioTracks());
// print(json.encode(track.streams.asMap()));
// }
// );
//
// if(connected){
// signaling.signalR.listen(
// onAcceptCall: (arg0){
// print(arg0.toString());
// },
// onCandidate: (candidateJson){
// signaling.addCandidate(candidateJson);
// },
// onDeclineCall: (arg0,arg1){
// // _onHangup();
// },
// onHangupCall: (arg0){
// // _onHangup();
// },
//
// onOffer: (offerSdp, callerUser) async{
// print('${offerSdp.toString()} | ${callerUser.toString()}');
// await signaling.answerOffer(offerSdp);
// }
// );
// }
// return connected;
// }
//
// @override
// void dispose() {
// // TODO: implement dispose
// super.dispose();
// signaling.dispose();
// _localRenderer?.dispose();
// _remoteRenderer?.dispose();
// _audioButton?.close();
// _videoButton?.close();
// localMediaStream?.dispose();
// remoteMediaStream?.dispose();
// _disposeStreamsAndSubscriptions();
// }
//
// Future<void> _disposeStreamsAndSubscriptions() async {
// if (_onButtonBarVisibleStreamController != null) await _onButtonBarVisibleStreamController.close();
// if (_onButtonBarHeightStreamController != null) await _onButtonBarHeightStreamController.close();
// }
//
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// backgroundColor: Colors.white,
// body: buildLayout(),
// );
// }
//
// LayoutBuilder buildLayout() {
// return LayoutBuilder(
// builder: (BuildContext context, BoxConstraints constraints) {
// return Stack(
// children: [
// CamViewWidget(
// localRenderer: _localRenderer,
// remoteRenderer: _remoteRenderer,
// constraints: constraints,
// onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController,
// onButtonBarHeightStreamController: _onButtonBarHeightStreamController,
// ),
// ConferenceButtonBar(
// audioEnabled: _audioButton.stream,
// videoEnabled: _videoButton.stream,
// onAudioEnabled: _onAudioEnable,
// onVideoEnabled: _onVideoEnabled,
// onSwitchCamera: _onSwitchCamera,
// onHangup: _onHangup,
// onPersonAdd: () {},
// onPersonRemove: () {},
// onHeight: _onHeightBar,
// onShow: _onShowBar,
// onHide: _onHideBar,
// ),
// ],
// );
// },
// );
// }
//
// Function _onAudioEnable() {
// final audioTrack = localMediaStream.getAudioTracks()[0];
// final mute = audioTrack.muted;
// Helper.setMicrophoneMute(!mute, audioTrack);
// _audioButton.add(mute);
// }
//
// Function _onVideoEnabled() {
// final videoTrack = localMediaStream.getVideoTracks()[0];
// bool videoEnabled = videoTrack.enabled;
// localMediaStream.getVideoTracks()[0].enabled = !videoEnabled;
// _videoButton.add(!videoEnabled);
// }
//
// Function _onSwitchCamera() {
// Helper.switchCamera(localMediaStream.getVideoTracks()[0]);
// }
//
// void _onShowBar() {
// setState(() {
// });
// _onButtonBarVisibleStreamController.add(true);
// }
//
// void _onHeightBar(double height) {
// _onButtonBarHeightStreamController.add(height);
// }
//
// void _onHideBar() {
// setState(() {
// SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
// });
// _onButtonBarVisibleStreamController.add(false);
// }
//
// Future<void> _onHangup() async {
// signaling.hangupCall(widget.callerId, widget.receiverId);
// print('onHangup');
// Navigator.of(context).pop();
// }
// }

@ -25,7 +25,6 @@ import 'package:diplomaticquarterapp/services/livecare_services/livecare_provide
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/LocalNotification.dart';
import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
@ -81,7 +80,7 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
var themeNotifier;
DateTime currentBackPressTime;
SignalRUtil signalRUtil;
// SignalRUtil signalRUtil;
ToDoCountProviderModel toDoProvider;

@ -34,7 +34,7 @@ class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderSt
CameraController _controller;
Future<void> _initializeControllerFuture;
bool isCameraReady = false;
Signaling signaling = Signaling()..init();
// Signaling signaling = Signaling()..init();
@override
void initState() {

@ -112,16 +112,16 @@ class _ViewDoctorResponsesPageState extends State<ViewDoctorResponsesPage> {
),
),
),
// Container(
// margin: EdgeInsets.only(top: 10.0),
// child: DefaultButton(
// TranslationBase.of(context).rateDoctorResponse,
// () {
// openResponseRateDialog(context);
// },
// color: CustomColors.accentColor,
// ),
// ),
Container(
margin: EdgeInsets.only(top: 10.0),
child: DefaultButton(
TranslationBase.of(context).rateDoctorResponse,
() {
openResponseRateDialog(context);
},
color: CustomColors.accentColor,
),
),
],
),
);

@ -21,19 +21,23 @@ class HomeReportPage extends StatefulWidget {
}
class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProviderStateMixin {
TabController _tabController;
TabController _tabController_new;
List<ImagesInfo> imagesInfo = List();
int _currentPage = 0;
@override
void initState() {
_tabController_new = TabController(length: 2, vsync: this);
WidgetsBinding.instance.addPostFrameCallback((_) {
getInPatientAdmissionList();
});
super.initState();
_tabController = TabController(length: 3, vsync: this);
}
@override
void dispose() {
super.dispose();
_tabController.dispose();
_tabController_new.dispose();
}
@override
@ -57,74 +61,138 @@ class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProvid
showNewAppBarTitle: true,
backgroundColor: Color(0xffF7F7F7),
imagesInfo: imagesInfo,
body: Column(
children: [
TabBar(
isScrollable: true,
controller: _tabController,
indicatorWeight: 3.0,
indicatorSize: TabBarIndicatorSize.tab,
labelColor: Color(0xff2B353E),
unselectedLabelColor: Color(0xff575757),
labelPadding: EdgeInsets.only(top: 15, bottom: 13, left: 20, right: 20),
labelStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.48,
),
unselectedLabelStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.48,
),
tabs: [
Text(
TranslationBase.of(context).requested,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
Text(
TranslationBase.of(context).ready,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
// Text(
// TranslationBase.of(context).completed,
// style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
// ),
Text(
TranslationBase.of(context).cancelled,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
body: Container(
child: Column(
children: [
TabBar(
controller: _tabController_new,
indicatorWeight: 3.0,
indicatorSize: TabBarIndicatorSize.tab,
labelColor: Color(0xff2B353E),
unselectedLabelColor: Color(0xff575757),
labelPadding: EdgeInsets.only(top: 15, bottom: 13, left: 20, right: 20),
labelStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.48,
),
],
),
if (model.user != null)
Expanded(
child: TabBarView(
physics: BouncingScrollPhysics(),
controller: _tabController,
children: <Widget>[
ReportListWidget(reportList: model.reportsOrderRequestList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderReadyList, emailAddress: model.user.emailAddress),
// ReportListWidget(reportList: model.reportsOrderCompletedList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderCanceledList, emailAddress: model.user.emailAddress),
],
unselectedLabelStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.48,
),
onTap: (int value) {
print(value);
setState(() {});
},
tabs: [
Text(
TranslationBase.of(context).inPatient,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
Text(
TranslationBase.of(context).outpatient,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
],
),
if (projectViewModel.havePrivilege(21))
Padding(
padding: EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
child: DefaultButton(
TranslationBase.of(context).requestMedicalReport.toLowerCase().capitalizeFirstofEach,
() => Navigator.push(
context,
FadePage(
page: MedicalReports(),
),
if (model.user != null)
Expanded(
child: TabBarView(
physics: BouncingScrollPhysics(),
controller: _tabController_new,
children: <Widget>[
Container(),
Container(
child: Column(
children: [
Padding(
padding: EdgeInsets.all(21),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
myRadioButton(TranslationBase.of(context).requested, 0),
myRadioButton(TranslationBase.of(context).ready, 1),
myRadioButton(TranslationBase.of(context).cancelled, 2),
],
),
),
Expanded(
child: IndexedStack(
index: _currentPage,
children: [
ReportListWidget(reportList: model.reportsOrderRequestList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderReadyList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderCanceledList, emailAddress: model.user.emailAddress),
],
),
)
],
),
)
],
),
),
)
],
if (projectViewModel.havePrivilege(21) && _tabController_new.index == 1)
Padding(
padding: EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
child: DefaultButton(
TranslationBase.of(context).requestMedicalReport.toLowerCase().capitalizeFirstofEach,
() => Navigator.push(
context,
FadePage(
page: MedicalReports(),
),
).then((value) {
model.getReports();
}),
),
)
],
),
),
),
);
}
Widget myRadioButton(String _label, int _value) {
return InkWell(
onTap: () {
setState(() {
_currentPage = _value;
});
},
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 22,
height: 22,
child: Radio(
value: _value,
activeColor: _value == _currentPage ? Color(0xffD02127) : Color(0xffE8E8E8),
groupValue: _currentPage,
onChanged: (index) {
setState(() {
_currentPage = index;
});
},
),
),
SizedBox(width: 10),
Text(
_label,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Color(0xff575757),
letterSpacing: -0.56,
),
),
],
),
);
}
void getInPatientAdmissionList() {}
}

@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/model/reports/Reports.dart';
import 'package:diplomaticquarterapp/core/service/medical/reports_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
@ -55,9 +56,24 @@ class ReportListWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (report.doctorName != null)
Text(
report.doctorName,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
report.doctorName,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(DateUtil.getDayMonthYearDateFormatted(report.requestDate),
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
Text(DateUtil.formatDateToTimeLang(report.requestDate, projectViewModel.isArabic),
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
],
),
],
),
if (report.doctorName != null) SizedBox(height: 6),
Row(
@ -93,14 +109,23 @@ class ReportListWidget extends StatelessWidget {
emptyIcon: Icons.star_border,
),
if (reportList[index].status == 2)
IconButton(
icon: Icon(Icons.email),
color: Color(0xff28323A),
constraints: BoxConstraints(),
padding: EdgeInsets.zero,
onPressed: () {
showConfirmMessage(reportList[index]);
})
Row(
children: [
Padding(
padding: const EdgeInsets.only(right: 11.0, left: 11.0),
child: Text(TranslationBase.of(context).viewReport,
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, fontStyle: FontStyle.italic, color: CustomColors.accentColor, letterSpacing: -0.48, height: 18 / 12, decoration: TextDecoration.underline)),
),
IconButton(
icon: Icon(Icons.email),
color: Color(0xff28323A),
constraints: BoxConstraints(),
padding: EdgeInsets.zero,
onPressed: () {
showConfirmMessage(reportList[index]);
})
],
),
],
),
],

@ -1,164 +1,164 @@
import 'dart:io';
import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart';
import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart';
import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
class CallPage extends StatefulWidget {
@override
_CallPageState createState() => _CallPageState();
}
class _CallPageState extends State<CallPage> {
Signaling signaling = Signaling();
RTCVideoRenderer _localRenderer = RTCVideoRenderer();
RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
String roomId;
TextEditingController textEditingController = TextEditingController(text: '');
@override
void initState() {
_localRenderer.initialize();
_remoteRenderer.initialize();
// signaling.onRemoteStream = ((stream) {
// _remoteRenderer.srcObject = stream;
// setState(() {});
// });
fcmConfigure();
super.initState();
}
@override
void dispose() {
_localRenderer.dispose();
_remoteRenderer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
FirebaseMessaging.instance.getToken().then((value) {
print('FCM_TOKEN: $value');
});
return AppScaffold(
isShowAppBar: true,
showNewAppBar: true,
showNewAppBarTitle: true,
isShowDecPage: false,
appBarTitle: "WebRTC Calling",
body: Column(
children: [
SizedBox(height: 8),
Wrap(
children: [
SizedBox(
width: 8,
),
ElevatedButton(
onPressed: () {
dummyCall();
},
child: Text("Call"),
),
SizedBox(
width: 8,
),
ElevatedButton(
onPressed: () {
signaling.hangUp(_localRenderer);
},
child: Text("Hangup"),
)
],
),
SizedBox(height: 8),
Expanded(
child: Padding(
padding: const EdgeInsets.all(0.0),
child: Stack(
children: [
Positioned(top: 0.0, right: 0.0, left: 0.0, bottom: 0.0, child: RTCVideoView(_remoteRenderer)),
Positioned(
top: 20.0,
right: 100.0,
left: 20.0,
bottom: 300.0,
child: RTCVideoView(_localRenderer, mirror: true),
),
],
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Join the following Room: "),
Flexible(
child: TextFormField(
controller: textEditingController,
),
)
],
),
),
SizedBox(height: 8)
],
),
);
}
dummyCall() async {
final json = {
"callerID": "9920",
"receiverID": "2001273",
"msgID": "123",
"notfID": "123",
"notification_foreground": "true",
"count": "1",
"message": "Doctor is calling ",
"AppointmentNo": "123",
"title": "Rayyan Hospital",
"ProjectID": "123",
"NotificationType": "10",
"background": "1",
"doctorname": "Dr Sulaiman Al Habib",
"clinicname": "ENT Clinic",
"speciality": "Speciality",
"appointmentdate": "Sun, 15th Dec, 2019",
"appointmenttime": "09:00",
"type": "video",
"session_id":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImN0eSI6InR3aWxpby1mcGE7dj0xIn0.eyJqdGkiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0LTE1OTg3NzQ1MDYiLCJpc3MiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0Iiwic3ViIjoiQUNhYWQ1YTNmOGM2NGZhNjczNTY3NTYxNTc0N2YyNmMyYiIsImV4cCI6MTU5ODc3ODEwNiwiZ3JhbnRzIjp7ImlkZW50aXR5IjoiSGFyb29uMSIsInZpZGVvIjp7InJvb20iOiJTbWFsbERhaWx5U3RhbmR1cCJ9fX0.7XUS5uMQQJfkrBZu9EjQ6STL6R7iXkso6BtO1HmrQKk",
"identity": "Haroon1",
"name": "SmallDailyStandup",
"videoUrl": "video",
"picture": "video",
"is_call": "true"
};
IncomingCallData incomingCallData = IncomingCallData.fromJson(json);
final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData)));
}
fcmConfigure() {
FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
print(message.toString());
IncomingCallData incomingCallData;
if (Platform.isAndroid)
incomingCallData = IncomingCallData.fromJson(message.data['data']);
else if (Platform.isIOS) incomingCallData = IncomingCallData.fromJson(message.data);
if (incomingCallData != null) final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData)));
});
}
}
// import 'dart:io';
//
// import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart';
// import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart';
// import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart';
// import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
// import 'package:firebase_messaging/firebase_messaging.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
//
// class CallPage extends StatefulWidget {
// @override
// _CallPageState createState() => _CallPageState();
// }
//
// class _CallPageState extends State<CallPage> {
// Signaling signaling = Signaling();
// RTCVideoRenderer _localRenderer = RTCVideoRenderer();
// RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
// String roomId;
// TextEditingController textEditingController = TextEditingController(text: '');
//
// @override
// void initState() {
// _localRenderer.initialize();
// _remoteRenderer.initialize();
//
// // signaling.onRemoteStream = ((stream) {
// // _remoteRenderer.srcObject = stream;
// // setState(() {});
// // });
//
// fcmConfigure();
//
// super.initState();
// }
//
// @override
// void dispose() {
// _localRenderer.dispose();
// _remoteRenderer.dispose();
// super.dispose();
// }
//
// @override
// Widget build(BuildContext context) {
// FirebaseMessaging.instance.getToken().then((value) {
// print('FCM_TOKEN: $value');
// });
//
// return AppScaffold(
// isShowAppBar: true,
// showNewAppBar: true,
// showNewAppBarTitle: true,
// isShowDecPage: false,
// appBarTitle: "WebRTC Calling",
// body: Column(
// children: [
// SizedBox(height: 8),
// Wrap(
// children: [
// SizedBox(
// width: 8,
// ),
// ElevatedButton(
// onPressed: () {
// dummyCall();
// },
// child: Text("Call"),
// ),
// SizedBox(
// width: 8,
// ),
// ElevatedButton(
// onPressed: () {
// signaling.hangUp(_localRenderer);
// },
// child: Text("Hangup"),
// )
// ],
// ),
// SizedBox(height: 8),
// Expanded(
// child: Padding(
// padding: const EdgeInsets.all(0.0),
// child: Stack(
// children: [
// Positioned(top: 0.0, right: 0.0, left: 0.0, bottom: 0.0, child: RTCVideoView(_remoteRenderer)),
// Positioned(
// top: 20.0,
// right: 100.0,
// left: 20.0,
// bottom: 300.0,
// child: RTCVideoView(_localRenderer, mirror: true),
// ),
// ],
// ),
// ),
// ),
// Padding(
// padding: const EdgeInsets.all(8.0),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Text("Join the following Room: "),
// Flexible(
// child: TextFormField(
// controller: textEditingController,
// ),
// )
// ],
// ),
// ),
// SizedBox(height: 8)
// ],
// ),
// );
// }
//
// dummyCall() async {
// final json = {
// "callerID": "9920",
// "receiverID": "2001273",
// "msgID": "123",
// "notfID": "123",
// "notification_foreground": "true",
// "count": "1",
// "message": "Doctor is calling ",
// "AppointmentNo": "123",
// "title": "Rayyan Hospital",
// "ProjectID": "123",
// "NotificationType": "10",
// "background": "1",
// "doctorname": "Dr Sulaiman Al Habib",
// "clinicname": "ENT Clinic",
// "speciality": "Speciality",
// "appointmentdate": "Sun, 15th Dec, 2019",
// "appointmenttime": "09:00",
// "type": "video",
// "session_id":
// "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImN0eSI6InR3aWxpby1mcGE7dj0xIn0.eyJqdGkiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0LTE1OTg3NzQ1MDYiLCJpc3MiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0Iiwic3ViIjoiQUNhYWQ1YTNmOGM2NGZhNjczNTY3NTYxNTc0N2YyNmMyYiIsImV4cCI6MTU5ODc3ODEwNiwiZ3JhbnRzIjp7ImlkZW50aXR5IjoiSGFyb29uMSIsInZpZGVvIjp7InJvb20iOiJTbWFsbERhaWx5U3RhbmR1cCJ9fX0.7XUS5uMQQJfkrBZu9EjQ6STL6R7iXkso6BtO1HmrQKk",
// "identity": "Haroon1",
// "name": "SmallDailyStandup",
// "videoUrl": "video",
// "picture": "video",
// "is_call": "true"
// };
//
// IncomingCallData incomingCallData = IncomingCallData.fromJson(json);
// final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData)));
// }
//
// fcmConfigure() {
// FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
// print(message.toString());
//
// IncomingCallData incomingCallData;
// if (Platform.isAndroid)
// incomingCallData = IncomingCallData.fromJson(message.data['data']);
// else if (Platform.isIOS) incomingCallData = IncomingCallData.fromJson(message.data);
// if (incomingCallData != null) final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData)));
// });
// }
// }

@ -1,277 +1,277 @@
import 'dart:convert';
import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
typedef void StreamStateCallback(MediaStream stream);
typedef void RTCIceGatheringStateCallback(RTCIceGatheringState state);
typedef void RTCPeerConnectionStateCallback(RTCPeerConnectionState state);
typedef void RTCSignalingStateCallback(RTCSignalingState state);
final Map<String, dynamic> constraints = {
'mandatory': {},
'optional': [
{'DtlsSrtpKeyAgreement': true},
]
};
Map<String, dynamic> snapsis_ice_config = {
'iceServers': [
{ "urls": 'stun:15.185.116.59:3478' },
{ "urls": "turn:15.185.116.59:3479", "username": "admin", "credential": "admin" },
],
// 'sdpSemantics': 'unified-plan'
};
Map<String, dynamic> twilio_ice_config = {
"ice_servers": [
{
"url": "stun:global.stun.twilio.com:3478?transport=udp",
"urls": "stun:global.stun.twilio.com:3478?transport=udp"
},
{
"url": "turn:global.turn.twilio.com:3478?transport=udp",
"username": "ce8042842b62c21bd20b176f80d6067fd3db81b1e9766312418ef5421d9ca2a2",
"urls": "turn:global.turn.twilio.com:3478?transport=udp",
"credential": "UzGOsiLwPZJ32cjafAebfDDpVrqeQjgpFHZEdau/8r4="
},
{
"url": "turn:global.turn.twilio.com:3478?transport=tcp",
"username": "ce8042842b62c21bd20b176f80d6067fd3db81b1e9766312418ef5421d9ca2a2",
"urls": "turn:global.turn.twilio.com:3478?transport=tcp",
"credential": "UzGOsiLwPZJ32cjafAebfDDpVrqeQjgpFHZEdau/8r4="
},
{
"url": "turn:global.turn.twilio.com:443?transport=tcp",
"username": "ce8042842b62c21bd20b176f80d6067fd3db81b1e9766312418ef5421d9ca2a2",
"urls": "turn:global.turn.twilio.com:443?transport=tcp",
"credential": "UzGOsiLwPZJ32cjafAebfDDpVrqeQjgpFHZEdau/8r4="
}
],
// 'sdpSemantics': 'unified-plan'
};
Map<String, dynamic> google_ice_config = {
'iceServers': [
{
'urls': [
'stun:stun.l.google.com:19302',
'stun:stun1.l.google.com:19302',
'stun:stun2.l.google.com:19302',
'stun:stun3.l.google.com:19302'
]
},
],
// 'sdpSemantics': 'unified-plan'
};
Map<String, dynamic> aws_ice_config = {
'iceServers': [
{'url': "stun:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3478"},
{'url': "turn:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3479", 'credential': "admin", 'username': "admin"}
],
// 'sdpSemantics': 'unified-plan'
};
class Signaling {
dispose() {
if (peerConnection != null) {
peerConnection.dispose();
peerConnection.getLocalStreams().forEach((e) => e.dispose());
peerConnection.getRemoteStreams().forEach((e) => e.dispose());
}
signalR.closeConnection();
}
init() async{
// Create Peer Connection
peerConnection = await createPeerConnection(google_ice_config, constraints);
registerPeerConnectionListeners();
}
initializeSignalR(String userName) async {
if (signalR != null) await signalR.closeConnection();
// https://vcallapi.hmg.com/webRTCHub?source=web&username=zohaib
// signalR = SignalRUtil(hubName: "https://vcallapi.hmg.com/webRTCHub?source=mobile&username=$userName");
signalR = SignalRUtil(hubName: "http://35.193.237.29/webRTCHub?source=mobile&username=$userName");
final connected = await signalR.openConnection();
if (!connected) throw 'Failed to connect SignalR';
}
Map<String, dynamic> configuration = {
// 'iceServers': [
// {
// 'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302']
// }
// ]
'iceServers': [
// {'url': "stun:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3478"},
// {'url': "turn:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3479", 'credential': "admin", 'username': "admin"}
// {'url': "stun:15.185.116.59:3478"},
// {
// "url":"turn:15.185.116.59:3479",
// "username": "admin",
// "credential":"admin"
// }
{
"url": "stun:global.stun.twilio.com:3478?transport=udp",
"urls": "stun:global.stun.twilio.com:3478?transport=udp"
},
{
"url": "turn:global.turn.twilio.com:3478?transport=udp",
"username": "f18fc347ba4aeeaa1b00f5199b1e900834b464962d434a4a89b4cdba02510047",
"urls": "turn:global.turn.twilio.com:3478?transport=udp",
"credential": "WX16BB+9nKm0f+Whf5EwpM8S/Yv+T2tlvQWLfdV7oqo="
}
]
};
SignalRUtil signalR;
RTCPeerConnection peerConnection;
MediaStream localStream;
MediaStream remoteStream;
RTCDataChannel dataChannel;
// Future<bool> call(String patientId, String mobile, {@required RTCVideoRenderer localVideo, @required RTCVideoRenderer remoteVideo}) async {
// await initializeSignalR(patientId);
//
// // final isCallPlaced = await FCM.sendCallNotifcationTo(DOCTOR_TOKEN, patientId, mobile);
// if(!isCallPlaced)
// throw 'Failed to notify target for call';
//
// return isCallPlaced;
// }
Future<bool> acceptCall(String caller, String receiver, {@required MediaStream localMediaStream, @required Function(MediaStream) onRemoteMediaStream, @required Function(RTCTrackEvent) onRemoteTrack}) async {
await initializeSignalR(receiver);
signalR.setContributors(caller: caller, receiver: receiver);
await signalR.acceptCall(receiver, caller).catchError((e) => throw 'Failed to inform signalR that i accepted a call');
peerConnection.addStream(localMediaStream);
// peerConnection?.onTrack = (track){
// onRemoteTrack(track);
// };
peerConnection?.onAddStream = (MediaStream stream) {
remoteStream = stream;
onRemoteMediaStream?.call(stream);
};
return true;
}
Future<bool> declineCall(String caller, String receiver) async {
await initializeSignalR(receiver);
signalR.setContributors(caller: caller, receiver: receiver);
await signalR.declineCall(receiver, caller).catchError((e) => throw 'Failed to inform signalR that i accepted a call');
// peerConnection.addStream(localMediaStream);
//
// peerConnection?.onAddStream = (MediaStream stream) {
// remoteStream = stream;
// onRemoteMediaStream?.call(stream);
// };
return true;
}
Future hangupCall(String caller, String receiver) async {
await signalR.hangupCall(caller, receiver);
dispose();
}
answerOffer(String sdp) async {
final offer = jsonDecode(sdp);
final caller = offer['caller'];
final receiver = offer['target'];
final offerSdp = offer['sdp'];
peerConnection.setRemoteDescription(rtcSessionDescriptionFrom(offerSdp)).then((value) {
return peerConnection.createAnswer().catchError((e){
print(e);
});
}).then((anwser) {
return peerConnection.setLocalDescription(anwser).catchError((e){
print(e);
});
}).then((value) {
return peerConnection.getLocalDescription().catchError((e){
print(e);
});
}).then((answer) {
return signalR.answerOffer(answer, caller, receiver).catchError((e){
print(e);
});
}).catchError((e) {
print(e);
});
}
Future<void> hangUp(RTCVideoRenderer localVideo) async {}
Future<String> createSdpAnswer(String toOfferSdp) async {
final offerSdp = rtcSessionDescriptionFrom(jsonDecode(toOfferSdp));
peerConnection.setRemoteDescription(offerSdp).catchError((e){
print(e);
});
final answer = await peerConnection.createAnswer().catchError((e){
print(e);
});
var answerSdp = json.encode(answer); // Send SDP via Push or any channel
return answerSdp;
}
Future<String> createSdpOffer() async {
final offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer).catchError((e){
print(e);
});
final map = offer.toMap();
var offerSdp = json.encode(map); // Send SDP via Push or any channel
return offerSdp;
}
addCandidate(String candidateJson) {
peerConnection.addCandidate(rtcIceCandidateFrom(candidateJson)).catchError((e){
print(e);
});
}
void registerPeerConnectionListeners() {
peerConnection.onRenegotiationNeeded = (){
print('Renegotiation Needed...');
};
peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
// print(json.encode(candidate.toMap()));
signalR.addIceCandidate(json.encode(candidate.toMap())).catchError((e){
print(e);
});
};
peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
print('ICE gathering state changed: $state');
};
peerConnection?.onConnectionState = (RTCPeerConnectionState state) {
print('Connection state change: $state');
};
peerConnection?.onSignalingState = (RTCSignalingState state) {
print('Signaling state change: $state');
};
}
}
rtcSessionDescriptionFrom(Map sdp) {
return RTCSessionDescription(
sdp['sdp'],
sdp['type'],
);
}
rtcIceCandidateFrom(String json) {
final map = jsonDecode(json)['candidate'];
return RTCIceCandidate(map['candidate'], map['sdpMid'], map['sdpMLineIndex']);
}
// import 'dart:convert';
//
// import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart';
// import 'package:flutter/cupertino.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
//
// typedef void StreamStateCallback(MediaStream stream);
// typedef void RTCIceGatheringStateCallback(RTCIceGatheringState state);
// typedef void RTCPeerConnectionStateCallback(RTCPeerConnectionState state);
// typedef void RTCSignalingStateCallback(RTCSignalingState state);
//
// final Map<String, dynamic> constraints = {
// 'mandatory': {},
// 'optional': [
// {'DtlsSrtpKeyAgreement': true},
// ]
// };
//
// Map<String, dynamic> snapsis_ice_config = {
// 'iceServers': [
// { "urls": 'stun:15.185.116.59:3478' },
// { "urls": "turn:15.185.116.59:3479", "username": "admin", "credential": "admin" },
// ],
// // 'sdpSemantics': 'unified-plan'
// };
// Map<String, dynamic> twilio_ice_config = {
// "ice_servers": [
// {
// "url": "stun:global.stun.twilio.com:3478?transport=udp",
// "urls": "stun:global.stun.twilio.com:3478?transport=udp"
// },
// {
// "url": "turn:global.turn.twilio.com:3478?transport=udp",
// "username": "ce8042842b62c21bd20b176f80d6067fd3db81b1e9766312418ef5421d9ca2a2",
// "urls": "turn:global.turn.twilio.com:3478?transport=udp",
// "credential": "UzGOsiLwPZJ32cjafAebfDDpVrqeQjgpFHZEdau/8r4="
// },
// {
// "url": "turn:global.turn.twilio.com:3478?transport=tcp",
// "username": "ce8042842b62c21bd20b176f80d6067fd3db81b1e9766312418ef5421d9ca2a2",
// "urls": "turn:global.turn.twilio.com:3478?transport=tcp",
// "credential": "UzGOsiLwPZJ32cjafAebfDDpVrqeQjgpFHZEdau/8r4="
// },
// {
// "url": "turn:global.turn.twilio.com:443?transport=tcp",
// "username": "ce8042842b62c21bd20b176f80d6067fd3db81b1e9766312418ef5421d9ca2a2",
// "urls": "turn:global.turn.twilio.com:443?transport=tcp",
// "credential": "UzGOsiLwPZJ32cjafAebfDDpVrqeQjgpFHZEdau/8r4="
// }
// ],
// // 'sdpSemantics': 'unified-plan'
// };
// Map<String, dynamic> google_ice_config = {
// 'iceServers': [
// {
// 'urls': [
// 'stun:stun.l.google.com:19302',
// 'stun:stun1.l.google.com:19302',
// 'stun:stun2.l.google.com:19302',
// 'stun:stun3.l.google.com:19302'
// ]
// },
// ],
// // 'sdpSemantics': 'unified-plan'
// };
// Map<String, dynamic> aws_ice_config = {
// 'iceServers': [
// {'url': "stun:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3478"},
// {'url': "turn:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3479", 'credential': "admin", 'username': "admin"}
// ],
// // 'sdpSemantics': 'unified-plan'
// };
//
// class Signaling {
// dispose() {
// if (peerConnection != null) {
// peerConnection.dispose();
// peerConnection.getLocalStreams().forEach((e) => e.dispose());
// peerConnection.getRemoteStreams().forEach((e) => e.dispose());
// }
// signalR.closeConnection();
// }
//
// init() async{
// // Create Peer Connection
// peerConnection = await createPeerConnection(google_ice_config, constraints);
// registerPeerConnectionListeners();
// }
//
// initializeSignalR(String userName) async {
// if (signalR != null) await signalR.closeConnection();
// // https://vcallapi.hmg.com/webRTCHub?source=web&username=zohaib
// // signalR = SignalRUtil(hubName: "https://vcallapi.hmg.com/webRTCHub?source=mobile&username=$userName");
// signalR = SignalRUtil(hubName: "http://35.193.237.29/webRTCHub?source=mobile&username=$userName");
// final connected = await signalR.openConnection();
// if (!connected) throw 'Failed to connect SignalR';
// }
//
// Map<String, dynamic> configuration = {
// // 'iceServers': [
// // {
// // 'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302']
// // }
// // ]
//
// 'iceServers': [
// // {'url': "stun:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3478"},
// // {'url': "turn:ec2-15-185-116-59.me-south-1.compute.amazonaws.com:3479", 'credential': "admin", 'username': "admin"}
// // {'url': "stun:15.185.116.59:3478"},
// // {
// // "url":"turn:15.185.116.59:3479",
// // "username": "admin",
// // "credential":"admin"
// // }
// {
// "url": "stun:global.stun.twilio.com:3478?transport=udp",
// "urls": "stun:global.stun.twilio.com:3478?transport=udp"
// },
// {
// "url": "turn:global.turn.twilio.com:3478?transport=udp",
// "username": "f18fc347ba4aeeaa1b00f5199b1e900834b464962d434a4a89b4cdba02510047",
// "urls": "turn:global.turn.twilio.com:3478?transport=udp",
// "credential": "WX16BB+9nKm0f+Whf5EwpM8S/Yv+T2tlvQWLfdV7oqo="
// }
// ]
// };
//
// SignalRUtil signalR;
//
// RTCPeerConnection peerConnection;
// MediaStream localStream;
// MediaStream remoteStream;
// RTCDataChannel dataChannel;
//
// // Future<bool> call(String patientId, String mobile, {@required RTCVideoRenderer localVideo, @required RTCVideoRenderer remoteVideo}) async {
// // await initializeSignalR(patientId);
// //
// // // final isCallPlaced = await FCM.sendCallNotifcationTo(DOCTOR_TOKEN, patientId, mobile);
// // if(!isCallPlaced)
// // throw 'Failed to notify target for call';
// //
// // return isCallPlaced;
// // }
//
// Future<bool> acceptCall(String caller, String receiver, {@required MediaStream localMediaStream, @required Function(MediaStream) onRemoteMediaStream, @required Function(RTCTrackEvent) onRemoteTrack}) async {
// await initializeSignalR(receiver);
// signalR.setContributors(caller: caller, receiver: receiver);
// await signalR.acceptCall(receiver, caller).catchError((e) => throw 'Failed to inform signalR that i accepted a call');
//
// peerConnection.addStream(localMediaStream);
//
// // peerConnection?.onTrack = (track){
// // onRemoteTrack(track);
// // };
// peerConnection?.onAddStream = (MediaStream stream) {
// remoteStream = stream;
// onRemoteMediaStream?.call(stream);
// };
// return true;
// }
//
//
// Future<bool> declineCall(String caller, String receiver) async {
// await initializeSignalR(receiver);
// signalR.setContributors(caller: caller, receiver: receiver);
// await signalR.declineCall(receiver, caller).catchError((e) => throw 'Failed to inform signalR that i accepted a call');
//
// // peerConnection.addStream(localMediaStream);
// //
// // peerConnection?.onAddStream = (MediaStream stream) {
// // remoteStream = stream;
// // onRemoteMediaStream?.call(stream);
// // };
// return true;
// }
//
// Future hangupCall(String caller, String receiver) async {
// await signalR.hangupCall(caller, receiver);
// dispose();
// }
//
// answerOffer(String sdp) async {
// final offer = jsonDecode(sdp);
// final caller = offer['caller'];
// final receiver = offer['target'];
// final offerSdp = offer['sdp'];
// peerConnection.setRemoteDescription(rtcSessionDescriptionFrom(offerSdp)).then((value) {
// return peerConnection.createAnswer().catchError((e){
// print(e);
// });
// }).then((anwser) {
// return peerConnection.setLocalDescription(anwser).catchError((e){
// print(e);
// });
// }).then((value) {
// return peerConnection.getLocalDescription().catchError((e){
// print(e);
// });
// }).then((answer) {
// return signalR.answerOffer(answer, caller, receiver).catchError((e){
// print(e);
// });
// }).catchError((e) {
// print(e);
// });
// }
//
// Future<void> hangUp(RTCVideoRenderer localVideo) async {}
//
// Future<String> createSdpAnswer(String toOfferSdp) async {
// final offerSdp = rtcSessionDescriptionFrom(jsonDecode(toOfferSdp));
// peerConnection.setRemoteDescription(offerSdp).catchError((e){
// print(e);
// });
//
// final answer = await peerConnection.createAnswer().catchError((e){
// print(e);
// });
// var answerSdp = json.encode(answer); // Send SDP via Push or any channel
// return answerSdp;
// }
//
// Future<String> createSdpOffer() async {
// final offer = await peerConnection.createOffer();
// await peerConnection.setLocalDescription(offer).catchError((e){
// print(e);
// });
// final map = offer.toMap();
// var offerSdp = json.encode(map); // Send SDP via Push or any channel
// return offerSdp;
// }
//
// addCandidate(String candidateJson) {
// peerConnection.addCandidate(rtcIceCandidateFrom(candidateJson)).catchError((e){
// print(e);
// });
// }
//
// void registerPeerConnectionListeners() {
// peerConnection.onRenegotiationNeeded = (){
// print('Renegotiation Needed...');
// };
//
// peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
// // print(json.encode(candidate.toMap()));
// signalR.addIceCandidate(json.encode(candidate.toMap())).catchError((e){
// print(e);
// });
// };
//
// peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
// print('ICE gathering state changed: $state');
// };
//
// peerConnection?.onConnectionState = (RTCPeerConnectionState state) {
// print('Connection state change: $state');
// };
//
// peerConnection?.onSignalingState = (RTCSignalingState state) {
// print('Signaling state change: $state');
// };
//
//
// }
// }
//
// rtcSessionDescriptionFrom(Map sdp) {
// return RTCSessionDescription(
// sdp['sdp'],
// sdp['type'],
// );
// }
//
// rtcIceCandidateFrom(String json) {
// final map = jsonDecode(json)['candidate'];
// return RTCIceCandidate(map['candidate'], map['sdpMid'], map['sdpMLineIndex']);
// }

@ -82,7 +82,7 @@ var routes = {
APP_UPDATE: (_) => AppUpdatePage(),
SETTINGS: (_) => Settings(),
CART_ORDER_PAGE: (_) => CartOrderPage(),
CALL_PAGE: (_) => CallPage(),
// CALL_PAGE: (_) => CallPage(),
INCOMING_CALL_PAGE: (_) => IncomingCall(),
OPENTOK_CALL_PAGE: (_) => OpenTokConnectCallPage(
apiKey: OPENTOK_API_KEY,

@ -1,173 +1,173 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
import 'package:http/io_client.dart';
import 'package:signalr_core/signalr_core.dart';
class SignalRUtil {
String hubName;
String sourceUser;
String destinationUser;
setContributors({@required String caller, @required String receiver}){
this.sourceUser = caller;
this.destinationUser = receiver;
}
Function(bool) onConnected;
SignalRUtil({@required this.hubName});
HubConnection connectionHub;
closeConnection() async{
if(connectionHub != null) {
connectionHub.off('OnIncomingCallAsync');
connectionHub.off('OnCallDeclinedAsync');
connectionHub.off('OnCallAcceptedAsync');
connectionHub.off('nHangUpAsync');
connectionHub.off('OnIceCandidateAsync');
connectionHub.off('OnOfferAsync');
await connectionHub.stop();
}
}
Future<bool> openConnection() async {
connectionHub = HubConnectionBuilder()
.withUrl(
hubName,
HttpConnectionOptions(
logMessageContent: true,
client: IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true),
logging: (level, message) => print(message),
)).build();
await connectionHub.start();
await Future.delayed(Duration(seconds: 1));
connectionHub.on('ReceiveMessage', (message) {
handleIncomingMessage(message);
});
return getConnectionState();
}
void handleIncomingMessage(List<dynamic> message) {
print(message.toString());
}
void sendMessage(List<dynamic> args) async {
await connectionHub.invoke('SendMessage', args: args); //['Bob', 'Says hi!']
}
listen({Function(CallUser) onAcceptCall, Function(CallUser) onHangupCall, Function(String, CallUser) onDeclineCall, Function(String, CallUser) onOffer, Function(String) onCandidate}){
connectionHub.on('OnIncomingCallAsync', (arguments) {
print('OnIncomingCallAsync: ${arguments.toString()}');
});
connectionHub.on('OnCallDeclinedAsync', (arguments) {
print('OnCallDeclinedAsync: ${arguments.toString()}');
onDeclineCall(arguments.first, CallUser.from(arguments.last));
});
connectionHub.on('OnCallAcceptedAsync', (arguments) {
print('OnCallAcceptedAsync: ${arguments.toString()}');
});
connectionHub.on('OnHangUpAsync', (arguments) {
print('nHangUpAsync: ${arguments.toString()}');
onHangupCall(CallUser.from(arguments.first));
});
connectionHub.on('OnIceCandidateAsync', (arguments) {
print('OnIceCandidateAsync: ${arguments.toString()}');
onCandidate(arguments.first);
});
connectionHub.on('OnOfferAsync', (arguments) {
print('OnOfferAsync: ${arguments.toString()}');
onOffer(arguments.first, CallUser.from(arguments.last));
});
}
// CallUserAsync(string currentUserId, string targerUserId)
Future<dynamic> callUser(String from, to) async{
return await connectionHub.invoke('CallUserAsync', args: [from, to]);
}
// CallDeclinedAsync(string currentUserId, string targerUserId)
Future<dynamic> declineCall(String from, to) async{
return await connectionHub.invoke('CallDeclinedAsync', args: [from, to]);
}
// AnswerCallAsync(string currentUserId, string targetUserId)
Future<dynamic> answerCall(String from, to) async{
return await connectionHub.invoke('AnswerCallAsync', args: [from, to]);
}
// IceCandidateAsync(string targetUserId, string candidate)
Future<dynamic> addIceCandidate(String candidate) async{
final target = destinationUser;
return await connectionHub.invoke('IceCandidateAsync', args: [target, candidate]);
}
// OfferAsync(string targetUserId,string currentUserId, string targetOffer)
Future<dynamic> offer(String from, to, offer) async{
return await connectionHub.invoke('OfferAsync', args: [from, to, offer]);
}
// AnswerOfferAsync(string targetUserId, string CallerOffer)
Future<dynamic> answerOffer(RTCSessionDescription answerSdp, caller, receiver) async{
final payload = {
'target': receiver,
'caller': caller,
'sdp': answerSdp.toMap(),
};
return await connectionHub.invoke('AnswerOfferAsync', args: [caller, jsonEncode(payload)]);
}
// HangUpAsync(string currentUserId, string targetUserId)
Future<dynamic> hangupCall(String from, to) async{
return await connectionHub.invoke('HangUpAsync', args: [from, to]);
}
// CallAccepted(string currentUserId,string targetUserId)
Future<dynamic> acceptCall(String from, to) async{
// return await connectionHub.send(methodName: 'CallAccepted', args: [from, to]);
return await connectionHub.invoke("CallAccepted", args: [ from, to]);
}
bool getConnectionState() {
if (connectionHub.state == HubConnectionState.connected) return true;
if (connectionHub.state == HubConnectionState.disconnected) return false;
return false;
}
}
class CallUser{
String Id;
String UserName;
String Email;
String Phone;
String Title;
dynamic UserStatus;
String Image;
int UnreadMessageCount = 0;
CallUser.from(Map map){
Id = map['Id'];
UserName = map['UserName'];
Email = map['Email'];
Phone = map['Phone'];
Title = map['Title'];
UserStatus = map['UserStatus'];
Image = map['Image'];
UnreadMessageCount = map['UnreadMessageCount'];
}
}
// import 'dart:convert';
// import 'dart:io';
//
// import 'package:flutter/cupertino.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
// import 'package:http/io_client.dart';
// import 'package:signalr_core/signalr_core.dart';
//
// class SignalRUtil {
// String hubName;
//
// String sourceUser;
// String destinationUser;
// setContributors({@required String caller, @required String receiver}){
// this.sourceUser = caller;
// this.destinationUser = receiver;
// }
//
// Function(bool) onConnected;
// SignalRUtil({@required this.hubName});
//
//
// HubConnection connectionHub;
//
// closeConnection() async{
// if(connectionHub != null) {
// connectionHub.off('OnIncomingCallAsync');
// connectionHub.off('OnCallDeclinedAsync');
// connectionHub.off('OnCallAcceptedAsync');
// connectionHub.off('nHangUpAsync');
// connectionHub.off('OnIceCandidateAsync');
// connectionHub.off('OnOfferAsync');
// await connectionHub.stop();
// }
// }
//
// Future<bool> openConnection() async {
// connectionHub = HubConnectionBuilder()
// .withUrl(
// hubName,
// HttpConnectionOptions(
// logMessageContent: true,
// client: IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true),
// logging: (level, message) => print(message),
// )).build();
//
// await connectionHub.start();
// await Future.delayed(Duration(seconds: 1));
//
// connectionHub.on('ReceiveMessage', (message) {
// handleIncomingMessage(message);
// });
//
// return getConnectionState();
// }
//
// void handleIncomingMessage(List<dynamic> message) {
// print(message.toString());
// }
//
// void sendMessage(List<dynamic> args) async {
// await connectionHub.invoke('SendMessage', args: args); //['Bob', 'Says hi!']
// }
//
// listen({Function(CallUser) onAcceptCall, Function(CallUser) onHangupCall, Function(String, CallUser) onDeclineCall, Function(String, CallUser) onOffer, Function(String) onCandidate}){
//
// connectionHub.on('OnIncomingCallAsync', (arguments) {
// print('OnIncomingCallAsync: ${arguments.toString()}');
// });
//
// connectionHub.on('OnCallDeclinedAsync', (arguments) {
// print('OnCallDeclinedAsync: ${arguments.toString()}');
// onDeclineCall(arguments.first, CallUser.from(arguments.last));
// });
//
// connectionHub.on('OnCallAcceptedAsync', (arguments) {
// print('OnCallAcceptedAsync: ${arguments.toString()}');
// });
//
// connectionHub.on('OnHangUpAsync', (arguments) {
// print('nHangUpAsync: ${arguments.toString()}');
// onHangupCall(CallUser.from(arguments.first));
// });
//
// connectionHub.on('OnIceCandidateAsync', (arguments) {
// print('OnIceCandidateAsync: ${arguments.toString()}');
// onCandidate(arguments.first);
// });
//
// connectionHub.on('OnOfferAsync', (arguments) {
// print('OnOfferAsync: ${arguments.toString()}');
// onOffer(arguments.first, CallUser.from(arguments.last));
// });
//
// }
//
// // CallUserAsync(string currentUserId, string targerUserId)
// Future<dynamic> callUser(String from, to) async{
// return await connectionHub.invoke('CallUserAsync', args: [from, to]);
// }
//
// // CallDeclinedAsync(string currentUserId, string targerUserId)
// Future<dynamic> declineCall(String from, to) async{
// return await connectionHub.invoke('CallDeclinedAsync', args: [from, to]);
// }
//
// // AnswerCallAsync(string currentUserId, string targetUserId)
// Future<dynamic> answerCall(String from, to) async{
// return await connectionHub.invoke('AnswerCallAsync', args: [from, to]);
// }
//
// // IceCandidateAsync(string targetUserId, string candidate)
// Future<dynamic> addIceCandidate(String candidate) async{
// final target = destinationUser;
// return await connectionHub.invoke('IceCandidateAsync', args: [target, candidate]);
// }
//
// // OfferAsync(string targetUserId,string currentUserId, string targetOffer)
// Future<dynamic> offer(String from, to, offer) async{
// return await connectionHub.invoke('OfferAsync', args: [from, to, offer]);
// }
//
// // AnswerOfferAsync(string targetUserId, string CallerOffer)
// Future<dynamic> answerOffer(RTCSessionDescription answerSdp, caller, receiver) async{
// final payload = {
// 'target': receiver,
// 'caller': caller,
// 'sdp': answerSdp.toMap(),
// };
// return await connectionHub.invoke('AnswerOfferAsync', args: [caller, jsonEncode(payload)]);
// }
//
// // HangUpAsync(string currentUserId, string targetUserId)
// Future<dynamic> hangupCall(String from, to) async{
// return await connectionHub.invoke('HangUpAsync', args: [from, to]);
// }
//
// // CallAccepted(string currentUserId,string targetUserId)
// Future<dynamic> acceptCall(String from, to) async{
// // return await connectionHub.send(methodName: 'CallAccepted', args: [from, to]);
// return await connectionHub.invoke("CallAccepted", args: [ from, to]);
// }
//
//
// bool getConnectionState() {
// if (connectionHub.state == HubConnectionState.connected) return true;
// if (connectionHub.state == HubConnectionState.disconnected) return false;
// return false;
// }
// }
//
//
// class CallUser{
// String Id;
// String UserName;
// String Email;
// String Phone;
// String Title;
// dynamic UserStatus;
// String Image;
// int UnreadMessageCount = 0;
//
// CallUser.from(Map map){
// Id = map['Id'];
// UserName = map['UserName'];
// Email = map['Email'];
// Phone = map['Phone'];
// Title = map['Title'];
// UserStatus = map['UserStatus'];
// Image = map['Image'];
// UnreadMessageCount = map['UnreadMessageCount'];
// }
// }

@ -2896,6 +2896,7 @@ class TranslationBase {
String get comments => localizedValues["comments"][locale.languageCode];
String get rateDoctorResponseHeading => localizedValues["rateDoctorResponseHeading"][locale.languageCode];
String get updateInsuranceManuallyDialog => localizedValues["updateInsuranceManuallyDialog"][locale.languageCode];
String get viewReport => localizedValues["viewReport"][locale.languageCode];
}

@ -454,10 +454,10 @@ class _AppDrawerState extends State<AppDrawer> {
mHeight(12),
InkWell(
onTap: () {
Navigator.push(context, FadePage(page: CallPage()));
GifLoaderDialogUtils.showMyDialog(context);
HMGNetworkConnectivity(context).start();
locator<GAnalytics>().hamburgerMenu.logMenuItemClick('cloud solution logo tap');
// Navigator.push(context, FadePage(page: CallPage()));
// GifLoaderDialogUtils.showMyDialog(context);
// HMGNetworkConnectivity(context).start();
// locator<GAnalytics>().hamburgerMenu.logMenuItemClick('cloud solution logo tap');
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,

@ -24,9 +24,7 @@ enum _PAYMENT_TYPE { PACKAGES, PHARMACY, PATIENT }
var _InAppBrowserOptions = InAppBrowserClassOptions(
inAppWebViewGroupOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(useShouldOverrideUrlLoading: true, transparentBackground: false),
ios: IOSInAppWebViewOptions(
applePayAPIEnabled: true,
)),
ios: IOSInAppWebViewOptions(applePayAPIEnabled: true, isFraudulentWebsiteWarningEnabled: false)),
crossPlatform: InAppBrowserOptions(hideUrlBar: true, toolbarTopBackgroundColor: Colors.black),
android: AndroidInAppBrowserOptions(),
ios: IOSInAppBrowserOptions(hideToolbarBottom: true, toolbarBottomBackgroundColor: Colors.white, closeButtonColor: Colors.white, presentationStyle: IOSUIModalPresentationStyle.OVER_FULL_SCREEN));
@ -127,17 +125,6 @@ class MyInAppBrowser extends InAppBrowser {
this.deviceToken = deviceToken;
}
// getPatientData() async {
// if (await this.sharedPref.getObject(USER_PROFILE) != null) {
// var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE));
// authUser = data;
// }
// if (await this.sharedPref.getDouble(USER_LAT) != null && await this.sharedPref.getDouble(USER_LONG) != null) {
// lat = await this.sharedPref.getDouble(USER_LAT);
// long = await this.sharedPref.getDouble(USER_LONG);
// }
// }
openPackagesPaymentBrowser({@required int customer_id, @required int order_id}) {
paymentType = _PAYMENT_TYPE.PACKAGES;
var full_url = '$PACKAGES_REQUEST_PAYMENT_URL?customer_id=$customer_id&order_id=$order_id';
@ -190,7 +177,7 @@ class MyInAppBrowser extends InAppBrowser {
service.applePayInsertRequest(applePayInsertRequest, context).then((res) {
if (context != null) GifLoaderDialogUtils.hideDialog(context);
String url = "https://hmgwebservices.com/HMGApplePayLive/applepay/pay?apq=" + res['result']; // Prod
// String url = "https://uat.hmgwebservices.com/HMGApplePayLiveNew/applepay/pay?apq=" + res['result']; // UAT
// String url = "https://uat.hmgwebservices.com/HMGApplePayLive/applepay/pay?apq=" + res['result']; // UAT
// safariBrowser.open(url: Uri.parse(url));
this.browser.openUrlRequest(urlRequest: URLRequest(url: Uri.parse(url)), options: _InAppBrowserOptions);
}).catchError((err) {

@ -95,7 +95,7 @@ dependencies:
# Qr code Scanner TODO fix it
# barcode_scanner: ^1.0.1
flutter_polyline_points: ^1.0.0
# flutter_polyline_points: ^1.0.0
location: ^4.3.0
# Qr code Scanner
# barcode_scan_fix: ^1.0.2
@ -183,7 +183,7 @@ dependencies:
badges: ^2.0.1
flutter_app_icon_badge: ^2.0.0
syncfusion_flutter_sliders: ^19.3.55
# syncfusion_flutter_sliders: ^19.3.55
searchable_dropdown: ^1.1.3
dropdown_search: 0.4.9
youtube_player_flutter: ^8.0.0
@ -191,17 +191,17 @@ dependencies:
# Dep by Zohaib
shimmer: ^2.0.0
carousel_slider: ^4.0.0
flutter_material_pickers: ^3.1.2
# flutter_material_pickers: ^3.1.2
flutter_staggered_grid_view: ^0.4.1
# flutter_hms_gms_availability: ^2.0.0
huawei_hmsavailability: ^6.6.0+300
huawei_location: 6.0.0+302
# Marker Animation
flutter_animarker: ^3.2.0
# flutter_animarker: ^3.2.0
auto_size_text: ^3.0.0
equatable: ^2.0.3
signalr_core: ^1.1.1
# signalr_core: ^1.1.1
wave: ^0.2.0
# sms_retriever: ^1.0.0
sms_otp_auto_verify: ^2.1.0

Loading…
Cancel
Save