development_v3.3_voipcall
Aamir Muhammad 2 years ago
parent dcb8e8bf7a
commit 92165cb361

@ -345,7 +345,7 @@ var UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnari
var CHANNEL = 3;
var GENERAL_ID = 'Cs2020@2016\$2958';
var IP_ADDRESS = '10.20.10.20';
var VERSION_ID = 12.4;
var VERSION_ID = 12.8;
var SETUP_ID = '91877';
var LANGUAGE = 2;
// var PATIENT_OUT_SA = 0;

@ -121,9 +121,7 @@ class _MyApp extends State<MyApp> {
ChangeNotifierProvider<CompareList>(create: (context) => CompareList()),
ChangeNotifierProvider<OrderPreviewViewModel>(create: (context) => OrderPreviewViewModel()),
ChangeNotifierProvider<PayfortViewModel>(create: (context) => PayfortViewModel()),
ChangeNotifierProvider<ChatCallProvider>(
create: (context) => ChatCallProvider(),
),
ChangeNotifierProvider<ChatCallProvider>(create: (context) => ChatCallProvider()),
],
child: Consumer<ProjectViewModel>(
builder: (context, projectProvider, child) => MaterialApp(

@ -20,7 +20,6 @@ class OutGoingCall extends StatefulWidget {
class _OutGoingCallState extends State<OutGoingCall> {
ChatCallProvider callProvider;
//late ChatProviderModel chatProvider;
bool loader = true;
@override
@ -29,18 +28,12 @@ class _OutGoingCallState extends State<OutGoingCall> {
}
Future<void> init() async {
print("INITTTTTTTT");
widget.isVideoCall ? callProvider.isVideoCall = true : callProvider.isVideoCall = false;
callProvider.isOutGoingCall = true;
// IosCallPayload payload = IosCallPayload(
// incomingCallerId: widget.outGoingCallData.callerId.toString(),
// incomingCallerName: widget.outGoingCallData.callerName,
// incomingCallReciverId: widget.outGoingCallData.receiverId.toString(),
// incomingCallType: widget.outGoingCallData.callType,
// uuid: "",
// callData: widget.outGoingCallData.toRawJson());
// await Utils.saveStringFromPrefs("iosCallPayload", jsonEncode(payload));
await callProvider.initLocalCamera(callData: widget.outGoingCallData, context: context);
loader = false;
print("INITTTTTTTT ENDDDD");
}
@override

@ -8,7 +8,6 @@ import 'package:diplomaticquarterapp/models/chat/call.dart';
import 'package:diplomaticquarterapp/models/chat/webrtc_payloads.dart';
import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/uitl/navigation_service.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/voipcall/call/chat_incoming_call_screen.dart';
import 'package:diplomaticquarterapp/voipcall/consts.dart';
import 'package:diplomaticquarterapp/voipcall/model/get_single_user_chat_call.dart';
@ -56,38 +55,35 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
List<MediaDeviceInfo> devices = [];
Future<void> buildHubConnection() async {
try {
chatHubConnection = await getHubConnection();
} catch (e) {
Utils.showErrorToast(e.toString());
}
await chatHubConnection.start();
if (kDebugMode) {
print("Hub Conn: Startedddddddd");
}
// chatHubConnection.on("OnDeliveredChatUserAsync", onMsgReceived);
// chatHubConnection.on("OnGetChatConversationCount", onNewChatConversion);
// chatHubConnection.on("OnDeliveredGroupChatHistoryAsync", onGroupMsgReceived);
chatHubConnection = await getHubConnection();
if (chatHubConnection != null) await chatHubConnection.start();
print("Hub Conn: Startedddddddd");
registerCallListners();
Future.delayed(Duration(seconds: 3), () {});
return;
}
//{"id":341682,"userName":"Aamir.Muhammad","email":"Aamir.Muhammad@cloudsolutions.com.sa","phone":null,"title":"Aamir Saleem Ahmad Dost Muhammad","token":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIzNDE2ODIiLCJlbWFpbCI6IkFhbWlyLk11aGFtbWFkQGNsb3Vkc29sdXRpb25zLmNvbS5zYSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJBYW1pci5NdWhhbW1hZCIsIm5iZiI6MTcwNzIwNTAyMywiZXhwIjoxNzA3MjkxNDIzLCJpYXQiOjE3MDcyMDUwMjN9.Zz2bcsMwiLAAWGZh2E_p5Qs6ItMt0JHhDFI_0DLdggCQtt6HHcT4n8nvqMZx-uYr3jLwqhA_IAjTuaCeSE15sw","isDomainUser":true,"isActiveCode":false,"encryptedUserId":"nn7RkYzbnQc=","encryptedUserName":"/QruOyp4QMcmNXKZlljUgg=="}
Future<HubConnection> getHubConnection() async {
AppState().chatDetails.response = Response.fromJson(
{
"id": 341682,
"userName": "Aamir.Muhammad",
"email": "Aamir.Muhammad@cloudsolutions.com.sa",
"phone": null,
"title": "Aamir Saleem Ahmad Dost Muhammad",
"token":
"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIzNDE2ODIiLCJlbWFpbCI6IkFhbWlyLk11aGFtbWFkQGNsb3Vkc29sdXRpb25zLmNvbS5zYSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJBYW1pci5NdWhhbW1hZCIsIm5iZiI6MTcwNzIwNTAyMywiZXhwIjoxNzA3MjkxNDIzLCJpYXQiOjE3MDcyMDUwMjN9.Zz2bcsMwiLAAWGZh2E_p5Qs6ItMt0JHhDFI_0DLdggCQtt6HHcT4n8nvqMZx-uYr3jLwqhA_IAjTuaCeSE15sw",
"isDomainUser": true,
"isActiveCode": false,
"encryptedUserId": "nn7RkYzbnQc=",
"encryptedUserName": "/QruOyp4QMcmNXKZlljUgg=="
},
);
if (AppState().chatDetails == null) {
AppState().chatDetails = UserAutoLoginModel.fromJson(
{
"response": {
"id": 341682,
"userName": "Aamir.Muhammad",
"email": "Aamir.Muhammad@cloudsolutions.com.sa",
"phone": null,
"title": "Aamir Saleem Ahmad Dost Muhammad",
"token":
"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIzNDE2ODIiLCJlbWFpbCI6IkFhbWlyLk11aGFtbWFkQGNsb3Vkc29sdXRpb25zLmNvbS5zYSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJBYW1pci5NdWhhbW1hZCIsIm5iZiI6MTcwNzM3NzMyMiwiZXhwIjoxNzA3NDYzNzIyLCJpYXQiOjE3MDczNzczMjJ9.qYzwICr5URSIE0kQ0PQypKZCpqTAx0EYBNlhHl8Bq0InpmL4zhvHHDfC6YPNL1DTQpfp6kk5G7VZTr6nCAmuyg",
"isDomainUser": true,
"isActiveCode": false,
"encryptedUserId": "nn7RkYzbnQc=",
"encryptedUserName": "/QruOyp4QMcmNXKZlljUgg=="
},
"errorResponses": null,
},
);
}
HubConnection hub;
HttpConnectionOptions httpOp = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true);
@ -97,10 +93,26 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
return hub;
}
Future<CallDataModel> makeCall({String callType}) async {
Map<String, dynamic> json = {
"callerID": AppState().chatDetails.response.id,
"callerName": AppState().chatDetails.response.userName,
"callerEmail": AppState().chatDetails.response.email,
"callerTitle": AppState().chatDetails.response.title,
"callerPhone": AppState().chatDetails.response.phone,
"receiverID": 266642,
"receiverName": "Muhammad Alam",
"receiverEmail": "Muhamad.Alam@cloudsolutions.com.sa",
"receiverTitle": "Muhammad Alam",
"receiverPhone": "123456789",
"title": "Muhammad Alam",
"callType": callType == "VIDEO" ? "Video" : "Audio",
};
CallDataModel callData = CallDataModel.fromJson(json);
return callData;
}
void registerCallListners() {
if (kDebugMode) {
print("=================== Call Listeners Registered =======================");
}
chatHubConnection.on("OnCallAcceptedAsync", onCallAcceptedAsync);
chatHubConnection.on("OnIceCandidateAsync", onIceCandidateAsync);
chatHubConnection.on("OnOfferAsync", onOfferAsync);
@ -132,16 +144,14 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
isCallEnded = false;
outGoingCallData = callData;
await initStreams();
await startCall(callType: isVideoCall ? "Video" : "Audio", context: context);
_pc = await creatOfferWithCon();
connectOutgoing();
isOutGoingCall = true;
notifyListeners();
}
void connectOutgoing() {
isOutGoingCall = true;
// notifyListeners();
}
Future<void> startCall({String callType, BuildContext context}) async {
@ -558,11 +568,11 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
'optional': []
};
RTCPeerConnection pc = await createPeerConnection(configuration, offerSdpConstraints);
// await pc.addStream(_localStream!);
await pc.addStream(_localStream);
//Changed By Aamir
_localStream?.getTracks().forEach((track) {
pc.addTrack(track, _localStream);
});
// _localStream.getTracks().forEach((track) {
// pc.addTrack(track, _localStream);
// });
pc.onConnectionState = (RTCPeerConnectionState state) {};
pc.onAddStream = (MediaStream stream) {
remoteRenderer.srcObject = stream;
@ -694,14 +704,15 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
///////////////// Incoming Call ///////////////////////////////
Future<void> initStreams() async {
print("INIT STREAMSSSSS");
List<MediaDeviceInfo> devices = await navigator.mediaDevices.enumerateDevices();
remoteRenderer = RTCVideoRenderer();
localVideoRenderer ??= RTCVideoRenderer();
localVideoRenderer = RTCVideoRenderer();
await localVideoRenderer.initialize();
try {
_localStream = await navigator.mediaDevices.getUserMedia({
'audio': true,
'video': isVideoCall
'video': true
? {
'mandatory': {
'minWidth': '640', // Provide your own width, height and frame rate here
@ -722,67 +733,6 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
} catch (e) {
print("Failed to get user media: $e");
}
// _localStream = await navigator.mediaDevices.getUserMedia(isVideoCall
// ? Platform.isIOS
// ? {
// 'audio': true,
// 'video': {
// 'facingMode': 'user', // Use 'user' for front camera, 'environment' for back camera
// 'width': {
// 'ideal': 1080, // Set the ideal width (maximum quality)
// },
// 'height': {
// 'ideal': 1920, // Set the ideal height (maximum quality)
// },
// 'frameRate': {
// 'ideal': 30, // Set the ideal frame rate (adjust as needed)
// },
// },
// }
// : {
// 'audio': true,
// 'video': {
// 'facingMode': 'user', // Use 'user' for front camera, 'environment' for back camera
// 'width': {
// 'ideal': 1920, // Set the ideal width (maximum quality)
// },
// 'height': {
// 'ideal': 1080, // Set the ideal height (maximum quality)
// },
// 'frameRate': {
// 'ideal': 30, // Set the ideal frame rate (adjust as needed)
// },
// },
// }
//
// // ? {
// // "video": {
// // "mandatory": {
// // "width": {"min": 1080},
// // "height": {"min": 1920}
// // },
// // "optional": Platform.isAndroid
// // ? [
// // {'sourceId': devices[1].deviceId},
// // {
// // "width": {"max": 1080}
// // },
// // {"frameRate": 30},
// // {"facingMode": "user"}
// // ]
// // : [
// // {"frameRate": 30},
// // {"facingMode": "user"}
// // ]
// // },
// // "frameRate": 30,
// // "width": 1080, //420,//640,//1280,
// // "height": 1920, //240//480//720
// // "audio": true,
// // }
// : audioConstraints);
// localVideoRenderer.srcObject = _localStream;
await remoteRenderer.initialize();
notifyListeners();
}

@ -8,7 +8,6 @@ import 'package:diplomaticquarterapp/core/service/privilege_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/extensions/string_extensions.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart';
@ -19,9 +18,7 @@ import 'package:diplomaticquarterapp/pages/DrawerPages/notifications/notificatio
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart';
import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart';
import 'package:diplomaticquarterapp/pages/webRTC/call_page.dart';
import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart';
@ -29,26 +26,18 @@ import 'package:diplomaticquarterapp/services/livecare_services/livecare_provide
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/theme/theme_notifier.dart';
import 'package:diplomaticquarterapp/theme/theme_value.dart';
import 'package:diplomaticquarterapp/uitl/HMGNetworkConnectivity.dart';
import 'package:diplomaticquarterapp/uitl/LocalNotification.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';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/voipcall/call/chat_outgoing_call_screen.dart';
import 'package:diplomaticquarterapp/voipcall/provider/chat_call_provider.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
// import 'package:flutter_amazonpaymentservices/environment_type.dart';
// import 'package:flutter_amazonpaymentservices/flutter_amazonpaymentservices.dart';
// import 'package:flutter_amazonpaymentservices/environment_type.dart';
// import 'package:flutter_amazonpaymentservices/flutter_amazonpaymentservices.dart';
// import 'package:flutter_amazonpaymentservices/flutter_amazonpaymentservices.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:in_app_review/in_app_review.dart';
@ -78,6 +67,7 @@ class _AppDrawerState extends State<AppDrawer> {
AppointmentRateViewModel appointmentRateViewModel = locator<AppointmentRateViewModel>();
PrivilegeService _privilegeService = locator<PrivilegeService>();
ToDoCountProviderModel toDoProvider;
ChatCallProvider callProv;
String booldType;
String notificationCount;
final authService = new AuthProvider();
@ -93,6 +83,7 @@ class _AppDrawerState extends State<AppDrawer> {
Widget build(BuildContext context) {
projectProvider = Provider.of(context);
toDoProvider = Provider.of<ToDoCountProviderModel>(context);
callProv = Provider.of<ChatCallProvider>(context);
return Container(
width: MediaQuery.of(context).size.width * 0.75,
color: Theme.of(context).scaffoldBackgroundColor,
@ -222,7 +213,7 @@ class _AppDrawerState extends State<AppDrawer> {
builder: (BuildContext context, AsyncSnapshot<GetAllSharedRecordsByStatusResponse> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Padding(padding: EdgeInsets.all(10), child:CircularProgressIndicator());
return Padding(padding: EdgeInsets.all(10), child: CircularProgressIndicator());
default:
if (snapshot.hasError)
return Padding(padding: EdgeInsets.all(10), child: Text(snapshot.error));
@ -457,6 +448,32 @@ class _AppDrawerState extends State<AppDrawer> {
onTap: () {
Navigator.of(context).push(FadePage(page: UserAgreementPage()));
},
),
GestureDetector(
onTap: () async {
//Aamir Call
callProv.buildHubConnection();
await callProv.makeCall(callType: "VIDEO").then((value) {
Future.delayed(Duration(seconds: 3), () {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => OutGoingCall(
isVideoCall: value.callType == "VIDEO" ? true : false,
outGoingCallData: value,
),
),
);
});
});
},
child: Card(
child: Container(
height: 50,
width: 200,
child: Center(child: Text("Call Test")),
),
),
)
],
))

@ -213,7 +213,7 @@ dependencies:
wave: ^0.2.0
# sms_retriever: ^1.0.0
sms_otp_auto_verify: ^2.1.0
flutter_ios_voip_kit: ^0.0.5
flutter_ios_voip_kit: ^0.1.0
google_api_availability: ^3.0.1
# open_file: ^3.2.1
open_filex: ^4.3.2

Loading…
Cancel
Save