Merge remote-tracking branch 'origin/development_aamir' into development_aamir

development_aamir_testing23
Aamir Muhammad 2 years ago
commit fc2aceae0f

@ -7,7 +7,7 @@ import flutter_local_notifications
// PKPushRegistryDelegate // PKPushRegistryDelegate
@UIApplicationMain @UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate, PKPushRegistryDelegate { @objc class AppDelegate: FlutterAppDelegate {
override func application( override func application(
_ application: UIApplication, _ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
@ -16,49 +16,49 @@ import flutter_local_notifications
FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
GeneratedPluginRegistrant.register(with: registry) GeneratedPluginRegistrant.register(with: registry)
} }
if #available(iOS 10.0, *) { // if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate // UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
} // }
GeneratedPluginRegistrant.register(with: self) GeneratedPluginRegistrant.register(with: self)
//Setup VOIP //Setup VOIP
let mainQueue = DispatchQueue.main // let mainQueue = DispatchQueue.main
let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue) // let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue)
voipRegistry.delegate = self // voipRegistry.delegate = self
voipRegistry.desiredPushTypes = [PKPushType.voIP] // voipRegistry.desiredPushTypes = [PKPushType.voIP]
return super.application(application, didFinishLaunchingWithOptions: launchOptions) return super.application(application, didFinishLaunchingWithOptions: launchOptions)
} }
// Handle updated push credentials // Handle updated push credentials
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) { // func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
print(credentials.token) // print(credentials.token)
let deviceToken = credentials.token.map { String(format: "%02x", $0) }.joined() // let deviceToken = credentials.token.map { String(format: "%02x", $0) }.joined()
//Save deviceToken to your server // //Save deviceToken to your server
SwiftFlutterCallkitIncomingPlugin.sharedInstance?.setDevicePushTokenVoIP(deviceToken) // SwiftFlutterCallkitIncomingPlugin.sharedInstance?.setDevicePushTokenVoIP(deviceToken)
} // }
func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) { // func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
print("didInvalidatePushTokenFor") // print("didInvalidatePushTokenFor")
SwiftFlutterCallkitIncomingPlugin.sharedInstance?.setDevicePushTokenVoIP("") // SwiftFlutterCallkitIncomingPlugin.sharedInstance?.setDevicePushTokenVoIP("")
} // }
// Handle incoming pushes // // Handle incoming pushes
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) { // func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
print("didReceiveIncomingPushWith") // print("didReceiveIncomingPushWith")
guard type == .voIP else { return } // guard type == .voIP else { return }
print(payload.dictionaryPayload) // print(payload.dictionaryPayload)
// let id = payload.dictionaryPayload["id"] as? String ?? "" //// let id = payload.dictionaryPayload["id"] as? String ?? ""
// let nameCaller = payload.dictionaryPayload["nameCaller"] as? String ?? "" //// let nameCaller = payload.dictionaryPayload["nameCaller"] as? String ?? ""
// let handle = payload.dictionaryPayload["handle"] as? String ?? "" //// let handle = payload.dictionaryPayload["handle"] as? String ?? ""
let isVideo = payload.dictionaryPayload["isVideo"] as? Bool ?? false // let isVideo = payload.dictionaryPayload["isVideo"] as? Bool ?? false
// ////
// ////
let data = flutter_callkit_incoming.Data(id: "1", nameCaller: "Mohemm", handle: "handle", type: isVideo ? 1 : 0) // let data = flutter_callkit_incoming.Data(id: "1", nameCaller: "Mohemm", handle: "handle", type: isVideo ? 1 : 0)
// data.extra = ["user": "abc@123", "platform": "ios"] //// data.extra = ["user": "abc@123", "platform": "ios"]
// data.iconName = "Mohemm" //// data.iconName = "Mohemm"
SwiftFlutterCallkitIncomingPlugin.sharedInstance?.showCallkitIncoming(data, fromPushKit: true) // SwiftFlutterCallkitIncomingPlugin.sharedInstance?.showCallkitIncoming(data, fromPushKit: true)
} // }
} }

@ -95,5 +95,13 @@
<array> <array>
<string>TAG</string> <string>TAG</string>
</array> </array>
<key>FIVKIconName</key>
<string>AppIcon-VoIPKit</string>
<key>FIVKLocalizedName</key>
<string>VoIP-Kit</string>
<key>FIVKSupportVideo</key>
<true/>
<key>FIVKSkipRecallScreen</key>
<true/>
</dict> </dict>
</plist> </plist>

@ -34,6 +34,7 @@ class ChatApiClient {
"deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken, "deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken,
"isHuaweiDevice": AppState().getIsHuawei, "isHuaweiDevice": AppState().getIsHuawei,
}, },
); );
if (!kReleaseMode) { if (!kReleaseMode) {
@ -187,6 +188,34 @@ class ChatApiClient {
return imagesData; return imagesData;
} }
// CallUser Login Token
Future<user.UserAutoLoginModel> getUserCallToken({required String userid}) async {
user.UserAutoLoginModel userLoginResponse = user.UserAutoLoginModel();
Response response = await ApiClient().postJsonForResponse(
"${ApiConsts.chatLoginTokenUrl}externaluserlogin",
{
"employeeNumber": userid,
"password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG",
},
);
if (!kReleaseMode) {
logger.i("login-res: " + response.body);
}
if (response.statusCode == 200) {
userLoginResponse = user.userAutoLoginModelFromJson(response.body);
} else if (response.statusCode == 501 || response.statusCode == 502 || response.statusCode == 503 || response.statusCode == 504) {
getUserCallToken(userid: userid);
} else {
userLoginResponse = user.userAutoLoginModelFromJson(response.body);
Utils.showToast(userLoginResponse.errorResponses!.first.message!);
}
return userLoginResponse;
}
// Call Decline On App Terminated State // Call Decline On App Terminated State
Future<Response> callDecline({required int cUserID, required int tUserID, required String targetUsertoken}) async { Future<Response> callDecline({required int cUserID, required int tUserID, required String targetUsertoken}) async {

@ -1,6 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/services.dart';
import 'package:flutter_callkit_incoming/entities/entities.dart'; import 'package:flutter_callkit_incoming/entities/entities.dart';
import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';
import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart';

@ -123,7 +123,9 @@ class AppNotifications {
Utils.saveStringFromPrefs("isAppOpendByChat", "true"); Utils.saveStringFromPrefs("isAppOpendByChat", "true");
Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
} else if (message.data.isNotEmpty && message.data["messageType"] == 'call') { } else if (message.data.isNotEmpty && message.data["messageType"] == 'call') {
ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message); if (Platform.isAndroid) {
ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message);
}
} }
} }
@ -151,6 +153,8 @@ Future<void> backgroundMessageHandler(RemoteMessage message) async {
Utils.saveStringFromPrefs("isAppOpendByChat", "false"); Utils.saveStringFromPrefs("isAppOpendByChat", "false");
Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
} else if (message.data.isNotEmpty && message.data["messageType"] == 'call') { } else if (message.data.isNotEmpty && message.data["messageType"] == 'call') {
ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message, background: true); if (Platform.isAndroid) {
ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message, background: true);
}
} }
} }

@ -128,3 +128,41 @@ class Sdp {
"sdp": sdp, "sdp": sdp,
}; };
} }
// final iosCallPayload = iosCallPayloadFromJson(jsonString);
class IosCallPayload {
String? incomingCallType;
String? incomingCallerId;
String? incomingCallerName;
String? uuid;
IosCallPayload({
this.incomingCallType,
this.incomingCallerId,
this.incomingCallerName,
this.uuid,
});
factory IosCallPayload.fromRawJson(String str) => IosCallPayload.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory IosCallPayload.fromJson(Map<String, dynamic> json) => IosCallPayload(
incomingCallType: json["incoming_call_type"],
incomingCallerId: json["incoming_caller_id"],
incomingCallerName: json["incoming_caller_name"],
uuid: json["uuid"],
);
Map<String, dynamic> toJson() => {
"incoming_call_type": incomingCallType,
"incoming_caller_id": incomingCallerId,
"incoming_caller_name": incomingCallerName,
"uuid": uuid,
};
}

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';
@ -163,7 +164,6 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
providerContext, providerContext,
MaterialPageRoute( MaterialPageRoute(
builder: (BuildContext context) => StartCallPage(), builder: (BuildContext context) => StartCallPage(),
allowSnapshotting: false,
)).then((value) { )).then((value) {
Navigator.of(providerContext).pop(); Navigator.of(providerContext).pop();
}); });

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:core'; import 'dart:core';
import 'dart:io';
import 'dart:ui'; import 'dart:ui';
import 'package:draggable_widget/draggable_widget.dart'; import 'package:draggable_widget/draggable_widget.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -45,14 +46,18 @@ class _StartCallPageState extends State<StartCallPage> {
IncomingCallModel? sessionData; IncomingCallModel? sessionData;
dynamic calls = await FlutterCallkitIncoming.activeCalls(); dynamic calls = await FlutterCallkitIncoming.activeCalls();
if (calls.isNotEmpty) { if (calls.isNotEmpty) {
sessionData = IncomingCallModel.fromRawJson(jsonEncode(calls[0])); dynamic values = calls[0];
} logger.d(calls);
print("------- We are Here ---------");
print(calls[0]);
sessionData = await IncomingCallModel.fromRawJson(jsonEncode(values));
print(sessionData.toRawJson());
if (provider.isUserOnline) { if (provider.isUserOnline) {
cProv.isUserOnline = provider.isUserOnline; cProv.isUserOnline = provider.isUserOnline;
if (kDebugMode) { if (kDebugMode) {
print("====== Processing Incoming Call in Online State ========="); print("====== Processing Incoming Call in Online State =========");
} }
await cProv.startIncomingCallViaKit(inCallData: sessionData!.extra!.callerDetails!.toJson(), isVCall: sessionData.extra!.callType == "video" ? true : false); await cProv.startIncomingCallViaKit(inCallData: sessionData!.extra!.callerDetails!.toJson(), isVCall: sessionData.extra!.callType == "video" ? true : false);
cProv.init(); cProv.init();
isCallConnected = true; isCallConnected = true;
@ -72,15 +77,20 @@ class _StartCallPageState extends State<StartCallPage> {
logger.w(e); logger.w(e);
} }
} }
}
} }
void startIosCall() {}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
cProv = context.read<ChatCallProvider>(); cProv = context.read<ChatCallProvider>();
provider = context.read<ChatProviderModel>(); provider = context.read<ChatProviderModel>();
startCall(); if (Platform.isAndroid) {
startCall();
} else if (Platform.isIOS) {
startIosCall();
}
return Scaffold( return Scaffold(
extendBody: true, extendBody: true,
body: Consumer2<ChatCallProvider, ChatProviderModel>( body: Consumer2<ChatCallProvider, ChatProviderModel>(

@ -64,17 +64,19 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
void initState() { void initState() {
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
super.initState(); super.initState();
callListeners(); if (Platform.isAndroid) {
scheduleMicrotask(() { callListeners();
data = Provider.of<DashboardProviderModel>(context, listen: false); }
marathonProvider = Provider.of<MarathonProvider>(context, listen: false); scheduleMicrotask(() {
cProvider = Provider.of<ChatProviderModel>(context, listen: false); data = Provider.of<DashboardProviderModel>(context, listen: false);
chatCallProvider = Provider.of<ChatCallProvider>(context, listen: false); marathonProvider = Provider.of<MarathonProvider>(context, listen: false);
if (checkIfPrivilegedForChat()) { cProvider = Provider.of<ChatProviderModel>(context, listen: false);
_bHubCon(); chatCallProvider = Provider.of<ChatCallProvider>(context, listen: false);
} if (checkIfPrivilegedForChat()) {
_onRefresh(true); _bHubCon();
}); }
_onRefresh(true);
});
} }
Future<void> callListeners() async { Future<void> callListeners() async {
@ -152,13 +154,13 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat"); String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat");
if (isAppOpendByChat != "null" && isAppOpendByChat == "true") { if (isAppOpendByChat != "null" && isAppOpendByChat == "true") {
Utils.showLoading(context); Utils.showLoading(context);
cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); await cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider);
Future.delayed(const Duration(seconds: 2), () async { Future.delayed(const Duration(seconds: 2), () async {
cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!);
gotoChat(context); gotoChat(context);
}); });
} else { } else {
cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); await cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider);
Future.delayed(const Duration(seconds: 2), () { Future.delayed(const Duration(seconds: 2), () {
cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!);
}); });

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
@ -11,6 +12,9 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_callkit_incoming/entities/call_event.dart'; import 'package:flutter_callkit_incoming/entities/call_event.dart';
import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';
import 'package:flutter_ios_voip_kit/call_state_type.dart';
import 'package:flutter_ios_voip_kit/flutter_ios_voip_kit.dart';
import 'package:mohem_flutter_app/api/chat/chat_api_client.dart';
// import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; // import 'package:huawei_hmsavailability/huawei_hmsavailability.dart';
import 'package:mohem_flutter_app/api/login_api_client.dart'; import 'package:mohem_flutter_app/api/login_api_client.dart';
@ -26,7 +30,8 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; 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/incoming_call_model.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';
@ -48,7 +53,7 @@ class LoginScreen extends StatefulWidget {
} }
} }
class _LoginScreenState extends State<LoginScreen> { class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
TextEditingController username = TextEditingController(); TextEditingController username = TextEditingController();
TextEditingController password = TextEditingController(); TextEditingController password = TextEditingController();
@ -56,6 +61,7 @@ class _LoginScreenState extends State<LoginScreen> {
MemberLoginListModel? _memberLoginList; MemberLoginListModel? _memberLoginList;
late final FirebaseMessaging _firebaseMessaging; late final FirebaseMessaging _firebaseMessaging;
IosCallPayload? _iosCallPayload;
bool _autoLogin = false; bool _autoLogin = false;
@ -69,6 +75,9 @@ class _LoginScreenState extends State<LoginScreen> {
// late HmsApiAvailability hmsApiAvailability; // late HmsApiAvailability hmsApiAvailability;
final voIPKit = FlutterIOSVoIPKit.instance;
late Timer timeOutTimer;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -78,6 +87,74 @@ class _LoginScreenState extends State<LoginScreen> {
// checkDeviceSafety(); // checkDeviceSafety();
// } // }
callListeners(); callListeners();
WidgetsBinding.instance.addObserver(this);
setupVoIPCallBacks();
}
void _timeOut({
int seconds = 15,
}) async {
timeOutTimer = Timer(Duration(seconds: seconds), () async {
print('🎈 example: timeOut');
var incomingCallerName = await voIPKit.getIncomingCallerName();
voIPKit.unansweredIncomingCall(
skipLocalNotification: false,
missedCallTitle: '📞 Missed call',
missedCallBody: 'There was a call from $incomingCallerName',
);
});
}
void setupVoIPCallBacks() {
if (Platform.isIOS) {
voIPKit.getVoIPToken().then((value) {
print('🎈 example: getVoIPToken: $value');
});
voIPKit.onDidUpdatePushToken = (String token) {
print('🎈 example: onDidUpdatePushToken: $token');
};
}
voIPKit.onDidReceiveIncomingPush = (
Map<String, dynamic> payload,
) async {
_iosCallPayload = IosCallPayload.fromJson(payload);
logger.d(_iosCallPayload!.incomingCallerId!.split("-").last);
print('🎈 example: onDidReceiveIncomingPush $payload');
_timeOut();
};
voIPKit.onDidRejectIncomingCall = (
String uuid,
String callerId,
) async {
try {
var logText = "did reject call $callerId";
} catch (err) {}
};
voIPKit.onDidAcceptIncomingCall = (
String uuid,
String callerId,
) async {
var callerID = "did accept call $callerId";
debugPrint(callerID);
logger.d(_iosCallPayload!.incomingCallerId!.split("-").last);
debugPrint(_iosCallPayload!.incomingCallerId);
debugPrint(_iosCallPayload!.incomingCallerName);
debugPrint(_iosCallPayload!.incomingCallType);
await connectCall();
await voIPKit.acceptIncomingCall(callerState: CallStateType.calling);
await voIPKit.callConnected();
Future.delayed(const Duration(milliseconds: 2500), () {
voIPKit.endCall().then((value) async {});
});
timeOutTimer.cancel();
};
} }
// void checkDeviceSafety() async { // void checkDeviceSafety() async {
@ -95,6 +172,17 @@ class _LoginScreenState extends State<LoginScreen> {
// 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 {
@ -119,7 +207,7 @@ class _LoginScreenState extends State<LoginScreen> {
case Event.ACTION_CALL_ENDED: case Event.ACTION_CALL_ENDED:
Utils.saveStringFromPrefs("isIncomingCall", "false"); Utils.saveStringFromPrefs("isIncomingCall", "false");
Utils.saveStringFromPrefs("inComingCallData", "null"); Utils.saveStringFromPrefs("inComingCallData", "null");
FlutterCallkitIncoming.endAllCalls(); FlutterCallkitIncoming.endAllCalls();
break; break;
case Event.ACTION_CALL_TIMEOUT: case Event.ACTION_CALL_TIMEOUT:
Utils.saveStringFromPrefs("isIncomingCall", "false"); Utils.saveStringFromPrefs("isIncomingCall", "false");
@ -135,19 +223,20 @@ class _LoginScreenState extends State<LoginScreen> {
dynamic calls = await FlutterCallkitIncoming.activeCalls(); dynamic calls = await FlutterCallkitIncoming.activeCalls();
if (calls is List) { if (calls is List) {
if (calls.isNotEmpty) { if (calls.isNotEmpty) {
Utils.hideLoading(context); if (Platform.isAndroid) {
Utils.hideLoading(context);
}
var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage()); var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage());
Navigator.push(context, pageRoute).whenComplete((){ Navigator.push(context, pageRoute).whenComplete(() {
checkFirebaseToken(); checkFirebaseToken();
}); });
}else{ } else {
FlutterCallkitIncoming.endAllCalls(); FlutterCallkitIncoming.endAllCalls();
Utils.showToast("Something wen't wrong"); Utils.showToast("Something wen't wrong");
} }
} }
} }
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();

@ -119,6 +119,9 @@ dependencies:
store_checker: ^1.1.0 store_checker: ^1.1.0
google_api_availability: ^3.0.1 google_api_availability: ^3.0.1
flutter_ios_voip_kit: ^0.1.0
file: ^6.1.4
dependency_overrides: dependency_overrides:
firebase_core_platform_interface: 4.5.1 firebase_core_platform_interface: 4.5.1

Loading…
Cancel
Save