@ -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 < MediaDeviceInfo > devices = [ ] ;
Future < void > 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 < HubConnection > 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.eyJuYW1laWQiOiIzNDE2ODIiLCJlbWFpbCI6IkFhbWlyLk11aGFtbWFkQGNsb3Vkc29sdXRpb25zLmNvbS5zYSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJBYW1pci5NdWhhbW1hZCIsIm5iZiI6MTcwNz IwNTAyMywiZXhwIjoxNzA3MjkxNDIzLCJpYXQiOjE3MDcyMDUwMjN9.Zz2bcsMwiLAAWGZh2E_p5Qs6ItMt0JHhDFI_0DLdggCQtt6HHcT4n8nvqMZx-uYr3jLwqhA_IAjTuaCeSE15sw " ,
" eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIzNDE2ODIiLCJlbWFpbCI6IkFhbWlyLk11aGFtbWFkQGNsb3Vkc29sdXRpb25zLmNvbS5zYSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvdXNlcmRhdGEiOiJBYW1pci5NdWhhbW1hZCIsIm5iZiI6MTcwNz M3NzMyMiwiZXhwIjoxNzA3NDYzNzIyLCJpYXQiOjE3MDczNzczMjJ9.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 < CallDataModel > makeCall ( { required 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 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 < void > initLocalCamera ( { callData , BuildContext ? context , bool isIncomingCall = false } ) async {
Future < void > 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 < void > startCall ( {String ? callType } ) async {
Future < void > 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 (
provider Context! ,
locator< NavigationService > ( ) . navigatorKey . current Context! ,
MaterialPageRoute (
builder: ( BuildContext context ) = > StartCallPage ( ) ,
) ) ;
} ) ;
} else {
Navigator . pushReplacement (
provider Context! ,
locator< NavigationService > ( ) . navigatorKey . current Context! ,
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 ( ) ;