From 761a6daf520140462f208efb909e09117a1dc3af Mon Sep 17 00:00:00 2001 From: Aamir Date: Thu, 8 Feb 2024 14:47:46 +0300 Subject: [PATCH] Changes --- android/app/build.gradle | 26 ++++ .../call/chat_outgoing_call_screen.dart | 5 +- lib/voipcall/provider/chat_call_provider.dart | 137 +++++++----------- lib/widgets/drawer/app_drawer_widget.dart | 33 +++-- pubspec.yaml | 4 +- 5 files changed, 103 insertions(+), 102 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e8fb92f1..e863c41b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -38,8 +38,19 @@ configurations.all { resolutionStrategy { force 'androidx.core:core-ktx:1.6.0' } + } +//configurations.all { +// c -> c.resolutionStrategy.dependencySubstitution { +// all { DependencySubstitution dependency -> +// if (dependency.requested.group == 'org.bouncycastle') { +// dependency.useTarget 'org.bouncycastle:bcprov-jdk15to18:1.68' +// } +// } +// } +//} + android { compileSdkVersion 34 @@ -102,6 +113,21 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + + + configurations.all { + c -> c.resolutionStrategy.eachDependency { + DependencyResolveDetails dependency -> + println dependency.requested.group + if (dependency.requested.group == 'org.bouncycastle') { + dependency.useTarget 'org.bouncycastle:bcprov-jdk15to18:1.68' + } + } + } + + + } flutter { diff --git a/lib/voipcall/call/chat_outgoing_call_screen.dart b/lib/voipcall/call/chat_outgoing_call_screen.dart index adcd0d2a..0c03759f 100644 --- a/lib/voipcall/call/chat_outgoing_call_screen.dart +++ b/lib/voipcall/call/chat_outgoing_call_screen.dart @@ -29,7 +29,8 @@ class _OutGoingCallState extends State { } Future init() async { - widget.isVideoCall ? callProvider!.isVideoCall = true : callProvider!.isVideoCall = false; + // widget.isVideoCall ? callProvider!.isVideoCall = true : callProvider!.isVideoCall = false; + widget.isVideoCall = true; callProvider!.isOutGoingCall = true; // IosCallPayload payload = IosCallPayload( // incomingCallerId: widget.outGoingCallData.callerId.toString(), @@ -39,7 +40,7 @@ class _OutGoingCallState extends State { // uuid: "", // callData: widget.outGoingCallData.toRawJson()); // await Utils.saveStringFromPrefs("iosCallPayload", jsonEncode(payload)); - await callProvider!.initLocalCamera(callData: widget.outGoingCallData, context: context); + await callProvider!.initLocalCamera(callData: widget.outGoingCallData); loader = false; } diff --git a/lib/voipcall/provider/chat_call_provider.dart b/lib/voipcall/provider/chat_call_provider.dart index c66f4bb1..8a8e999d 100644 --- a/lib/voipcall/provider/chat_call_provider.dart +++ b/lib/voipcall/provider/chat_call_provider.dart @@ -39,7 +39,8 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { bool isLoudSpeaker = false; bool isCamOff = false; bool isCallEnded = false; - bool isVideoCall = false; + // This need to Be Changed to dynamic + bool isVideoCall = true; bool isAudioCall = false; bool isCallStarted = false; bool isFrontCamera = true; @@ -51,17 +52,17 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { bool isOutGoingCall = false; bool isUserOnline = false; - BuildContext? providerContext; - List devices = []; Future buildHubConnection() async { try { chatHubConnection = await getHubConnection(); + await chatHubConnection!.start(); } catch (e) { + print(e.toString()); Utils.showErrorToast(e.toString()); } - await chatHubConnection!.start(); + if (kDebugMode) { print("Hub Conn: Startedddddddd"); } @@ -73,7 +74,8 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { //{"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 getHubConnection() async { - AppState().chatDetails!.response = Response.fromJson( + AppState().chatDetails = UserAutoLoginModel( + response: Response.fromJson( { "id": 341682, "userName": "Aamir.Muhammad", @@ -81,13 +83,13 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { "phone": null, "title": "Aamir Saleem Ahmad Dost Muhammad", "token": - "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIzNDE2ODIiLCJlbWFpbCI6IkFhbWlyLk11aGFtbWFkQGNsb3Vkc29sdXRpb25zLmNvbS5zYSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJBYW1pci5NdWhhbW1hZCIsIm5iZiI6MTcwNzIwNTAyMywiZXhwIjoxNzA3MjkxNDIzLCJpYXQiOjE3MDcyMDUwMjN9.Zz2bcsMwiLAAWGZh2E_p5Qs6ItMt0JHhDFI_0DLdggCQtt6HHcT4n8nvqMZx-uYr3jLwqhA_IAjTuaCeSE15sw", + "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIzNDE2ODIiLCJlbWFpbCI6IkFhbWlyLk11aGFtbWFkQGNsb3Vkc29sdXRpb25zLmNvbS5zYSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJBYW1pci5NdWhhbW1hZCIsIm5iZiI6MTcwNzM3NzMyMiwiZXhwIjoxNzA3NDYzNzIyLCJpYXQiOjE3MDczNzczMjJ9.qYzwICr5URSIE0kQ0PQypKZCpqTAx0EYBNlhHl8Bq0InpmL4zhvHHDfC6YPNL1DTQpfp6kk5G7VZTr6nCAmuyg", "isDomainUser": true, "isActiveCode": false, "encryptedUserId": "nn7RkYzbnQc=", "encryptedUserName": "/QruOyp4QMcmNXKZlljUgg==" }, - ); + )); HubConnection hub; HttpConnectionOptions httpOp = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true); @@ -97,6 +99,25 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { return hub; } + Future makeCall({required String callType}) async { + Map 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 res = CallDataModel.fromJson(json); + return res; + } + void registerCallListners() { if (kDebugMode) { print("=================== Call Listeners Registered ======================="); @@ -128,11 +149,11 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { ///////////////////////////////////////////////OutGoing Call//////////////////////////////////////////////////// - Future initLocalCamera({callData, BuildContext? context, bool isIncomingCall = false}) async { + Future initLocalCamera({callData, bool isIncomingCall = false}) async { isCallEnded = false; outGoingCallData = callData; await initStreams(); - await startCall(callType: isVideoCall ? "Video" : "Audio"); + await startCall(); _pc = await creatOfferWithCon(); connectOutgoing(); notifyListeners(); @@ -143,7 +164,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { // notifyListeners(); } - Future startCall({String? callType}) async { + Future startCall() async { // chatProvModel.isTextMsg = true; // chatProvModel.isAttachmentMsg = false; // chatProvModel.isVoiceMsg = false; @@ -197,14 +218,14 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { if (Platform.isIOS) { Future.delayed(Duration(seconds: 2), () { Navigator.pushReplacement( - providerContext!, + locator().navigatorKey.currentContext!, MaterialPageRoute( builder: (BuildContext context) => StartCallPage(), )); }); } else { Navigator.pushReplacement( - providerContext!, + locator().navigatorKey.currentContext!, MaterialPageRoute( builder: (BuildContext context) => StartCallPage(), )); @@ -700,86 +721,30 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { try { _localStream = await navigator.mediaDevices.getUserMedia({ 'audio': true, - 'video': isVideoCall - ? { - 'mandatory': { - 'minWidth': '640', // Provide your own width, height and frame rate here - 'minHeight': '480', - 'minFrameRate': '30', - }, - 'facingMode': 'user', - 'optional': [], - } - : false + 'video': + //isVideoCall? + { + 'mandatory': { + 'minWidth': '640', // Provide your own width, height and frame rate here + 'minHeight': '480', + 'minFrameRate': '30', + }, + 'facingMode': 'user', + 'optional': [], + "audio": true, + } + // : false }); - if (kDebugMode) { - print(_localStream..toString()); - } localVideoRenderer!.srcObject = _localStream; - localVideoRenderer!.value = (const RTCVideoValue(width: 200, height: 200, renderVideo: true)); + localVideoRenderer!.value = (const RTCVideoValue( + width: 200, + height: 200, + renderVideo: true, + )); print("Working localStream"); } 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(); diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index 96d70042..5c419aaa 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -46,6 +46,7 @@ import 'package:flutter/material.dart'; // import 'package:flutter_amazonpaymentservices/flutter_amazonpaymentservices.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:in_app_review/in_app_review.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -463,20 +464,28 @@ class _AppDrawerState extends State { 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, + Future micPer = Permission.microphone.request(); + Future camPer = Permission.camera.request(); + if (await micPer.isGranted && await camPer.isGranted) { + 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, + ), ), - ), - ); + ); + }); }); - }); + } else if (await micPer.isDenied) { + micPer = Permission.microphone.request(); + } else if (await camPer.isDenied) { + camPer = Permission.camera.request(); + } }, child: Card( child: Container( diff --git a/pubspec.yaml b/pubspec.yaml index c1947e5e..e250356c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -109,7 +109,7 @@ dependencies: circular_countdown_timer: ^0.2.0 #Just Audio to play ringing for incoming video call - just_audio: ^0.9.30 + just_audio: ^0.9.36 #hijri hijri: ^3.0.0 @@ -174,7 +174,7 @@ dependencies: signalr_netcore: ^1.3.6 logging: ^1.0.1 swipe_to: ^1.0.5 - flutter_webrtc: ^0.9.47 + flutter_webrtc: ^0.9.48+hotfix.1 draggable_widget: ^2.0.0 flutter_callkit_incoming: ^2.0.0+1 camera: ^0.10.5+9