Ios Voip Kit Changes

development_aamir
Aamir Muhammad 2 years ago
parent 9f33b2e0e7
commit 3ec44940df

@ -202,6 +202,12 @@ class AppState {
set setiosVoipPlayerID(String value) { set setiosVoipPlayerID(String value) {
_iosVoipPlayerID = value; _iosVoipPlayerID = value;
} }
bool _isUserOnline = false;
bool get getisUserOnline => _isUserOnline;
set setisUserOnline(bool value) {
_isUserOnline = value;
}
} }

@ -156,8 +156,8 @@ class ChatVoipCall {
Future<void> voipDeclineCall(IosCallPayload? _iosCallPayload ) async { Future<void> voipDeclineCall(IosCallPayload? _iosCallPayload ) async {
try { try {
ALM.UserAutoLoginModel model = await ChatApiClient().getUserCallToken(userid: _iosCallPayload!.callData!.split("-").first); ALM.UserAutoLoginModel model = await ChatApiClient().getUserCallToken(userid: _iosCallPayload!.incomingCallReciverId.toString());
dynamic Res = await ChatApiClient().callDecline(cUserID: int.parse(_iosCallPayload!.incomingCallerId!), tUserID: int.parse(_iosCallPayload!.callData!.split("-").first), targetUsertoken: model.response!.token!); dynamic Res = await ChatApiClient().callDecline(cUserID: int.parse(_iosCallPayload!.incomingCallerId!), tUserID: int.parse(_iosCallPayload!.incomingCallReciverId.toString()), targetUsertoken: model.response!.token!);
} catch (err) { } catch (err) {
print(err); print(err);
} }

@ -48,7 +48,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
late BuildContext providerContext; late BuildContext providerContext;
List<MediaDeviceInfo> devices = []; List<MediaDeviceInfo> devices = [];
var _videoDeviceId ; var _videoDeviceId;
void initCallListeners({required BuildContext context}) { void initCallListeners({required BuildContext context}) {
providerContext = context; providerContext = context;
@ -64,29 +64,6 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
// chatHubConnection.on("OnIncomingCallAsync", OnIncomingCallAsync); // chatHubConnection.on("OnIncomingCallAsync", OnIncomingCallAsync);
} }
//Video Constraints
Map<String, Object> videoConstraints = {
"video": {
"mandatory": {
"width": {"min": 1280},
"height": {"min": 720}
},
"optional": [
// {'sourceId': _videoDeviceId},
{
"width": {"max": 1280}
},
{"frameRate": 60},
{"facingMode": "user"}
]
},
"frameRate": 60,
"width": 1280, //420,//640,//1280,
"height": 720, //240//480//720
"audio": true,
};
// Audio Constraints // Audio Constraints
Map<String, Object> audioConstraints = { Map<String, Object> audioConstraints = {
"sampleRate": 8000, "sampleRate": 8000,
@ -112,6 +89,12 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
await initStreams(); await initStreams();
await startCall(callType: isVideoCall ? "Video" : "Audio", context: context); await startCall(callType: isVideoCall ? "Video" : "Audio", context: context);
_pc = await creatOfferWithCon(); _pc = await creatOfferWithCon();
connectOutgoing();
notifyListeners();
}
void connectOutgoing() {
isOutGoingCall = true;
notifyListeners(); notifyListeners();
} }
@ -589,13 +572,68 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
///////////////// Incoming Call /////////////////////////////// ///////////////// Incoming Call ///////////////////////////////
Future<void> initStreams() async { Future<void> initStreams() async {
devices = await navigator.mediaDevices.enumerateDevices(); List<MediaDeviceInfo> devices = await navigator.mediaDevices.enumerateDevices();
localVideoRenderer = RTCVideoRenderer(); localVideoRenderer = RTCVideoRenderer();
remoteRenderer = RTCVideoRenderer(); remoteRenderer = RTCVideoRenderer();
await localVideoRenderer!.initialize(); await localVideoRenderer!.initialize();
_localStream ??= await navigator.mediaDevices.getUserMedia(isVideoCall ? videoConstraints : audioConstraints); _localStream ??= await navigator.mediaDevices.getUserMedia(isVideoCall
// ? Platform.isIOS
// ? // iOS media constraints for maximum quality camera
// {
// '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)
// },
// },
// }
// : // Android media constraints for maximum quality camera
// {
// '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": [
{'sourceId': devices[1].deviceId},
{
"width": {"max": 1080}
},
{"frameRate": 30},
{"facingMode": "user"}
]
},
"frameRate": 30,
"width": 1080, //420,//640,//1280,
"height": 1920, //240//480//720
"audio": true,
}
: audioConstraints);
localVideoRenderer!.srcObject = _localStream; localVideoRenderer!.srcObject = _localStream;
await remoteRenderer!.initialize(); await remoteRenderer!.initialize();
notifyListeners(); notifyListeners();

@ -81,14 +81,15 @@ class _StartCallPageState extends State<StartCallPage> {
} }
void startIosCall() async { void startIosCall() async {
print(await Utils.getStringFromPrefs("iosCallPayload"));
IosCallPayload _iosCallPayload = IosCallPayload.fromRawJson(await Utils.getStringFromPrefs("iosCallPayload")); IosCallPayload _iosCallPayload = IosCallPayload.fromRawJson(await Utils.getStringFromPrefs("iosCallPayload"));
var userID = _iosCallPayload!.callData!.split("-").first; var userID = _iosCallPayload!.incomingCallReciverId;
var callType = _iosCallPayload!.callData!.split("-").last; var callType = _iosCallPayload!.incomingCallType;
SingleUserChatModel inCallData = SingleUserChatModel( SingleUserChatModel inCallData = SingleUserChatModel(
targetUserName: _iosCallPayload.incomingCallerName, targetUserName: _iosCallPayload.incomingCallerName,
chatEventId: 3, chatEventId: 3,
targetUserId: int.parse(_iosCallPayload.incomingCallerId!), targetUserId: int.parse(_iosCallPayload.incomingCallerId!),
currentUserId: int.parse(userID), currentUserId: int.parse(userID.toString()),
); );
if (provider.isUserOnline) { if (provider.isUserOnline) {
cProv.isUserOnline = provider.isUserOnline; cProv.isUserOnline = provider.isUserOnline;
@ -103,7 +104,7 @@ class _StartCallPageState extends State<StartCallPage> {
print("====== Processing Incoming Call ========="); print("====== Processing Incoming Call =========");
} }
cProv.isUserOnline = provider.isUserOnline; cProv.isUserOnline = provider.isUserOnline;
UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserCallToken(userid: userID); UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserCallToken(userid: userID.toString());
if (userLoginResponse.response != null) { if (userLoginResponse.response != null) {
AppState().setchatUserDetails = userLoginResponse; AppState().setchatUserDetails = userLoginResponse;
Utils.saveStringFromPrefs("userLoginChatDetails", jsonEncode(userLoginResponse.response)); Utils.saveStringFromPrefs("userLoginChatDetails", jsonEncode(userLoginResponse.response));
@ -142,19 +143,20 @@ class _StartCallPageState extends State<StartCallPage> {
child: Center(child: CircularProgressIndicator()), child: Center(child: CircularProgressIndicator()),
) )
: provider.isIncomingCall : provider.isIncomingCall
? SizedBox( ? Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
color: Colors.black,
child: Stack( child: Stack(
alignment: FractionalOffset.center, alignment: FractionalOffset.center,
children: <Widget>[ children: <Widget>[
if (!provider.isAudioCall && provider.isVideoCall) if (!provider.isAudioCall && provider.isVideoCall)
Positioned.fill( RTCVideoView(
child: RTCVideoView( provider.remoteRenderer!,
provider.remoteRenderer!, objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitContain,
objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitCover, filterQuality: FilterQuality.high
key: const Key('remote'), ,
), key: const Key('remote'),
), ),
if (provider.isVideoCall) if (provider.isVideoCall)
DraggableWidget( DraggableWidget(
@ -173,6 +175,7 @@ class _StartCallPageState extends State<StartCallPage> {
child: RTCVideoView( child: RTCVideoView(
provider.localVideoRenderer!, provider.localVideoRenderer!,
mirror: true, mirror: true,
filterQuality: FilterQuality.high,
objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitCover, objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitCover,
), ),
), ),
@ -374,12 +377,10 @@ class _StartCallPageState extends State<StartCallPage> {
alignment: FractionalOffset.center, alignment: FractionalOffset.center,
children: <Widget>[ children: <Widget>[
if (!provider.isAudioCall && provider.isVideoCall) if (!provider.isAudioCall && provider.isVideoCall)
Positioned.fill( RTCVideoView(
child: RTCVideoView( provider.remoteRenderer!,
provider.remoteRenderer!, objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitContain,
objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitCover, key: const Key('remote'),
key: const Key('remote'),
),
), ),
if (provider.isVideoCall) if (provider.isVideoCall)
DraggableWidget( DraggableWidget(

@ -25,16 +25,18 @@ class OutGoingCall extends StatefulWidget {
class _OutGoingCallState extends State<OutGoingCall> { class _OutGoingCallState extends State<OutGoingCall> {
late ChatCallProvider callProvider; late ChatCallProvider callProvider;
late ChatProviderModel chatProvider; late ChatProviderModel chatProvider;
bool loader = true;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
} }
void init() { Future<void> init() async {
widget.isVideoCall ? callProvider.isVideoCall = true : callProvider.isVideoCall = false; widget.isVideoCall ? callProvider.isVideoCall = true : callProvider.isVideoCall = false;
callProvider.isOutGoingCall = true; callProvider.isOutGoingCall = true;
callProvider.initLocalCamera(chatProvmodel: chatProvider, callData: widget.outGoingCallData, context: context); await callProvider.initLocalCamera(chatProvmodel: chatProvider, callData: widget.outGoingCallData, context: context);
loader = false;
} }
@override @override
@ -52,129 +54,133 @@ class _OutGoingCallState extends State<OutGoingCall> {
if (chatcp.isCallEnded) { if (chatcp.isCallEnded) {
Navigator.pop(context); Navigator.pop(context);
} }
return Stack( return loader
alignment: FractionalOffset.center, ? const Center(
children: <Widget>[ child: CircularProgressIndicator(),
if (chatcp.isVideoCall) )
Positioned.fill( : Stack(
child: RTCVideoView( alignment: FractionalOffset.center,
chatcp.localVideoRenderer!, children: <Widget>[
objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitCover, if (chatcp.isVideoCall)
), Positioned.fill(
), child: RTCVideoView(
Positioned.fill( chatcp.localVideoRenderer!,
child: ClipRect( objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitCover,
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0),
child: Container(
decoration: BoxDecoration(
color: MyColors.grey57Color.withOpacity(
0.3,
), ),
), ),
child: Column( Positioned.fill(
crossAxisAlignment: CrossAxisAlignment.start, child: ClipRect(
mainAxisSize: MainAxisSize.max, child: BackdropFilter(
children: <Widget>[ filter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0),
40.height, child: Container(
Row( decoration: BoxDecoration(
crossAxisAlignment: CrossAxisAlignment.center, color: MyColors.grey57Color.withOpacity(
mainAxisAlignment: MainAxisAlignment.center, 0.3,
children: <Widget>[ ),
Container( ),
margin: const EdgeInsets.all(21.0), child: Column(
child: Container( crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
40.height,
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
margin: const EdgeInsets.all(21.0),
child: Container(
margin: const EdgeInsets.only(
left: 10.0,
right: 10.0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
SvgPicture.asset(
"assets/images/user.svg",
height: 70,
width: 70,
fit: BoxFit.cover,
),
10.height,
Text(
widget.outGoingCallData.receiverName.toString().replaceAll(".", " "),
style: const TextStyle(
fontSize: 21,
fontWeight: FontWeight.bold,
color: MyColors.white,
letterSpacing: -1.26,
height: 23 / 12,
),
),
const Text(
"Ringing...",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: Color(
0xffC6C6C6,
),
letterSpacing: -0.48,
height: 23 / 24,
),
),
const SizedBox(
height: 2,
),
],
),
),
),
],
),
const Spacer(),
Container(
margin: const EdgeInsets.only( margin: const EdgeInsets.only(
left: 10.0, bottom: 70.0,
right: 10.0, left: 49,
right: 49,
), ),
child: Column( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max,
mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[ children: <Widget>[
SvgPicture.asset( RawMaterialButton(
"assets/images/user.svg", onPressed: () {
height: 70, chatcp.endCall(isUserOnline: chatProvider.isUserOnline).then((bool value) {
width: 70, if (value) {
fit: BoxFit.cover, Navigator.of(context).pop();
), // print("Reintiiiiiiitttzzzz");
10.height, // chatcp.initStreams();
Text( }
widget.outGoingCallData.receiverName.toString().replaceAll(".", " "), });
style: const TextStyle( },
fontSize: 21, elevation: 2.0,
fontWeight: FontWeight.bold, fillColor: MyColors.redA3Color,
color: MyColors.white, padding: const EdgeInsets.all(
letterSpacing: -1.26, 15.0,
height: 23 / 12,
), ),
), shape: const CircleBorder(),
const Text( child: const Icon(
"Ringing...", Icons.call_end,
style: TextStyle( color: MyColors.white,
fontSize: 16, size: 35.0,
fontWeight: FontWeight.w600,
color: Color(
0xffC6C6C6,
),
letterSpacing: -0.48,
height: 23 / 24,
), ),
), ),
const SizedBox(
height: 2,
),
], ],
), ),
), ),
),
],
),
const Spacer(),
Container(
margin: const EdgeInsets.only(
bottom: 70.0,
left: 49,
right: 49,
),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RawMaterialButton(
onPressed: () {
chatcp.endCall(isUserOnline: chatProvider.isUserOnline).then((bool value) {
if (value) {
Navigator.of(context).pop();
// print("Reintiiiiiiitttzzzz");
// chatcp.initStreams();
}
});
},
elevation: 2.0,
fillColor: MyColors.redA3Color,
padding: const EdgeInsets.all(
15.0,
),
shape: const CircleBorder(),
child: const Icon(
Icons.call_end,
color: MyColors.white,
size: 35.0,
),
),
], ],
), ),
), ),
], ),
), ),
), ),
), ],
), );
),
],
);
}), }),
); );
} }

@ -32,7 +32,6 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/chat/call.dart'; import 'package:mohem_flutter_app/models/chat/call.dart';
import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart';
import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart';
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart';
@ -40,10 +39,7 @@ import 'package:mohem_flutter_app/models/member_login_list_model.dart';
import 'package:mohem_flutter_app/models/privilege_list_model.dart'; import 'package:mohem_flutter_app/models/privilege_list_model.dart';
import 'package:mohem_flutter_app/ui/chat/call/chat_incoming_call_screen.dart'; import 'package:mohem_flutter_app/ui/chat/call/chat_incoming_call_screen.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/button/hmg_connectivity_button.dart';
import 'package:mohem_flutter_app/widgets/input_widget.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart';
// import 'package:safe_device/safe_device.dart';
import 'package:wifi_iot/wifi_iot.dart'; import 'package:wifi_iot/wifi_iot.dart';
class LoginScreen extends StatefulWidget { class LoginScreen extends StatefulWidget {
@ -77,7 +73,7 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
// late HmsApiAvailability hmsApiAvailability; // late HmsApiAvailability hmsApiAvailability;
final voIPKit = FlutterIOSVoIPKit.instance; final FlutterIOSVoIPKit voIPKit = FlutterIOSVoIPKit.instance;
late Timer timeOutTimer; late Timer timeOutTimer;
@override @override
@ -93,13 +89,15 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
callListeners(); callListeners();
checkAndNavigationCallingPage(); checkAndNavigationCallingPage();
} }
setupVoIPCallBacks(); if (Platform.isIOS) {
setupVoIPCallBacks();
}
} }
// IOS Voip Call // IOS Voip Call
void setupVoIPCallBacks() { void setupVoIPCallBacks() {
if (Platform.isIOS) { if (Platform.isIOS) {
voIPKit.getVoIPToken().then((value) async { voIPKit.getVoIPToken().then((String? value) async {
if (value != null) { if (value != null) {
AppState().setiosVoipPlayerID = await ChatApiClient().oneSignalVoip(value!); AppState().setiosVoipPlayerID = await ChatApiClient().oneSignalVoip(value!);
} }
@ -114,8 +112,7 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
Map<String, dynamic> payload, Map<String, dynamic> payload,
) async { ) async {
_iosCallPayload = IosCallPayload.fromJson(payload); _iosCallPayload = IosCallPayload.fromJson(payload);
isIncomingCall = true; // _timeOut();
_timeOut();
}; };
voIPKit.onDidRejectIncomingCall = ( voIPKit.onDidRejectIncomingCall = (
@ -130,17 +127,15 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
String uuid, String uuid,
String callerId, String callerId,
) async { ) async {
var callerID = "did accept call $callerId"; await connectCall(uuid: uuid, callDetails: callerId);
timeOutTimer.cancel(); voIPKit.acceptIncomingCall(callerState: CallStateType.calling);
await connectCall(); voIPKit.callConnected();
await voIPKit.acceptIncomingCall(callerState: CallStateType.calling);
await voIPKit.callConnected();
}; };
} }
void _timeOut() async { void _timeOut() async {
timeOutTimer = Timer(const Duration(seconds: 25), () async { timeOutTimer = Timer(const Duration(seconds: 25), () async {
var incomingCallerName = await voIPKit.getIncomingCallerName(); String? incomingCallerName = await voIPKit.getIncomingCallerName();
voIPKit.unansweredIncomingCall( voIPKit.unansweredIncomingCall(
skipLocalNotification: false, skipLocalNotification: false,
missedCallTitle: '📞 Missed call', missedCallTitle: '📞 Missed call',
@ -151,17 +146,31 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
}); });
} }
Future<void> connectCall() async { Future<void> connectCall({required String uuid, required String callDetails}) async {
try { isIncomingCall = true;
if (AppState().getisUserOnline) {
_iosCallPayload = IosCallPayload(
uuid: uuid, incomingCallerId: callDetails.split("-")[0], incomingCallReciverId: callDetails.split("-")[1], incomingCallerName: _iosCallPayload!.incomingCallerName, incomingCallType: callDetails.split("-").last);
} else {
_iosCallPayload = IosCallPayload(
uuid: uuid, incomingCallerId: callDetails.split("-")[0], incomingCallReciverId: callDetails.split("-")[1], incomingCallerName: null, incomingCallType: callDetails.split("-").last);
}
if (_iosCallPayload!.incomingCallerName == null) {
if (Platform.isIOS) {
Utils.hideLoading(context);
}
await Utils.saveStringFromPrefs("iosCallPayload", jsonEncode(_iosCallPayload));
MaterialPageRoute pageRoute = await MaterialPageRoute(builder: (BuildContext context) => StartCallPage());
Navigator.push(context, pageRoute);
} else if (AppState().getisUserOnline) {
await Utils.saveStringFromPrefs("iosCallPayload", jsonEncode(_iosCallPayload));
BuildContext context = AppRoutes.navigatorKey.currentContext!; BuildContext context = AppRoutes.navigatorKey.currentContext!;
Utils.hideLoading(context); MaterialPageRoute pageRoute = await MaterialPageRoute(builder: (BuildContext context) => StartCallPage());
Utils.saveStringFromPrefs("iosCallPayload", jsonEncode(_iosCallPayload)); Navigator.push(context, pageRoute);
var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage()); } else {
Navigator.push(context, pageRoute).whenComplete(() { FlutterCallkitIncoming.endAllCalls();
checkFirebaseToken(); Utils.showToast("Something wen't wrong");
});
} catch (e) {
logger.d(e);
} }
} }
@ -180,21 +189,9 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
// print(error); // print(error);
// } // }
// } // }
// Future<void> connectCall() async {
// try {
// UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserCallToken(userid: _iosCallPayload!.incomingCallerId!.split("-").last);
// if (userLoginResponse.response != null) {
// AppState().setchatUserDetails = userLoginResponse;
// Utils.saveStringFromPrefs("userLoginChatDetails", jsonEncode(userLoginResponse.response));
// }
// } catch (e) {
// logger.d(e);
// }
// }
Future<void> callListeners() async { Future<void> callListeners() async {
try { try {
print("Call Listeners Init");
FlutterCallkitIncoming.onEvent.listen((CallEvent? event) async { FlutterCallkitIncoming.onEvent.listen((CallEvent? event) async {
switch (event!.event) { switch (event!.event) {
case Event.actionCallIncoming: case Event.actionCallIncoming:
@ -238,7 +235,7 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
if (Platform.isAndroid) { if (Platform.isAndroid) {
Utils.hideLoading(context); Utils.hideLoading(context);
} }
var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage()); MaterialPageRoute pageRoute = MaterialPageRoute(builder: (BuildContext context) => StartCallPage());
Navigator.push(context, pageRoute).whenComplete(() { Navigator.push(context, pageRoute).whenComplete(() {
checkFirebaseToken(); checkFirebaseToken();
}); });
@ -254,7 +251,6 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
var calls = await FlutterCallkitIncoming.activeCalls(); var calls = await FlutterCallkitIncoming.activeCalls();
if (calls is List) { if (calls is List) {
if (calls.isNotEmpty) { if (calls.isNotEmpty) {
print('DATA: $calls');
return calls[0]; return calls[0];
} else { } else {
return null; return null;
@ -267,7 +263,7 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
if (currentCall != null && Platform.isAndroid) { if (currentCall != null && Platform.isAndroid) {
isIncomingCall = true; isIncomingCall = true;
Utils.hideLoading(context); Utils.hideLoading(context);
Navigator.push(context, MaterialPageRoute(builder: (context) => StartCallPage())); Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => StartCallPage()));
} }
} }
@ -390,7 +386,7 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
// if (isAppOpenBySystem!) checkFirebaseToken(); // if (isAppOpenBySystem!) checkFirebaseToken();
Utils.showLoading(context); Utils.showLoading(context);
Future.delayed(const Duration(seconds: 2)).whenComplete(() { Future.delayed(Duration(seconds: Platform.isIOS ? 3 : 2)).whenComplete(() {
if (!isIncomingCall) { if (!isIncomingCall) {
if (isAppOpenBySystem!) checkFirebaseToken(); if (isAppOpenBySystem!) checkFirebaseToken();
} }

Loading…
Cancel
Save