From 7191e25ea5358048e97e98ebcab2a93fa35941bb Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Thu, 16 Mar 2023 18:59:48 +0300 Subject: [PATCH] Chat Redirect Fix --- lib/app_state/app_state.dart | 2 +- lib/classes/notifications.dart | 28 +++++++------ lib/classes/voip_chat_call.dart | 5 +-- lib/provider/chat_call_provider.dart | 54 +++++++++++++------------ lib/ui/chat/call/start_call_screen.dart | 51 ++++++++++------------- lib/ui/chat/chat_home.dart | 5 --- lib/ui/landing/dashboard_screen.dart | 11 +++-- lib/ui/login/login_screen.dart | 39 ++++++++++-------- 8 files changed, 99 insertions(+), 96 deletions(-) diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index cbdcdd9..5363feb 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -88,7 +88,7 @@ class AppState { String get getHuaweiPushToken => _huaweiPushToken; - final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 4.4, mobileType: Platform.isAndroid ? "android" : "ios"); + final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 10, mobileType: Platform.isAndroid ? "android" : "ios"); void setPostParamsInitConfig() { isAuthenticated = false; diff --git a/lib/classes/notifications.dart b/lib/classes/notifications.dart index 60badb1..69264a7 100644 --- a/lib/classes/notifications.dart +++ b/lib/classes/notifications.dart @@ -4,6 +4,7 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + // import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; import 'package:huawei_push/huawei_push.dart' as huawei_push; import 'package:mohem_flutter_app/app_state/app_state.dart'; @@ -73,18 +74,17 @@ class AppNotifications { if (Platform.isAndroid) { // await hmsApiAvailability.isHMSAvailable().then((value) async { if (!(await Utils.isGoogleServicesAvailable())) { - huawei_push.Push.enableLogger(); - var result = await huawei_push.Push.setAutoInitEnabled(true); + var result = await huawei_push.Push.setAutoInitEnabled(true); - huawei_push.Push.onNotificationOpenedApp.listen((message) { - // newMessage(toFirebaseRemoteMessage(message)); - }, onError: (e) => print(e.toString())); + huawei_push.Push.onNotificationOpenedApp.listen((message) { + // newMessage(toFirebaseRemoteMessage(message)); + }, onError: (e) => print(e.toString())); - huawei_push.Push.onMessageReceivedStream.listen((message) { - // newMessage(toFirebaseRemoteMessage(message)); - }, onError: (e) => print(e.toString())); - } + huawei_push.Push.onMessageReceivedStream.listen((message) { + // newMessage(toFirebaseRemoteMessage(message)); + }, onError: (e) => print(e.toString())); + } // }).catchError((err) { // print(err); // }); @@ -119,8 +119,10 @@ class AppNotifications { } void _handleOpenApp(RemoteMessage message) { - Utils.saveStringFromPrefs("isAppOpendByChat", "true"); - Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); + if (message.data.isNotEmpty && message.data["type"] == 'chat') { + Utils.saveStringFromPrefs("isAppOpendByChat", "true"); + Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); + } } } @@ -134,5 +136,7 @@ Future backgroundMessageHandler(RemoteMessage message) async { await Firebase.initializeApp(); Utils.saveStringFromPrefs("isAppOpendByChat", "false"); Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString()); - ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message); + if (message.data.isNotEmpty && message.data["type"] == 'call') { + ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message); + } } diff --git a/lib/classes/voip_chat_call.dart b/lib/classes/voip_chat_call.dart index 266dc01..f591f1c 100644 --- a/lib/classes/voip_chat_call.dart +++ b/lib/classes/voip_chat_call.dart @@ -25,7 +25,6 @@ class ChatVoipCall { "loginDetails": autoLoginData.toJson(), "callerDetails": callerData.toJson(), }; - logger.d(values); CallKitParams params = CallKitParams( id: uuid, nameCaller: callerData.targetUserName, @@ -67,7 +66,7 @@ class ChatVoipCall { ); if (callerData.chatEventId == 3) { await Utils.saveStringFromPrefs("isIncomingCall", "true"); - await Utils.saveStringFromPrefs("inComingCallData",jsonEncode(params.toJson())); + await Utils.saveStringFromPrefs("inComingCallData",jsonEncode(values)); await FlutterCallkitIncoming.showCallkitIncoming(params); } } @@ -85,11 +84,11 @@ class ChatVoipCall { // TODO: show screen calling in Flutter break; case Event.ACTION_CALL_ACCEPT: + break; case Event.ACTION_CALL_DECLINE: Utils.saveStringFromPrefs("isIncomingCall", "false"); Utils.saveStringFromPrefs("inComingCallData", "null"); - break; case Event.ACTION_CALL_ENDED: Utils.saveStringFromPrefs("isIncomingCall", "false"); diff --git a/lib/provider/chat_call_provider.dart b/lib/provider/chat_call_provider.dart index 43584cc..53def54 100644 --- a/lib/provider/chat_call_provider.dart +++ b/lib/provider/chat_call_provider.dart @@ -3,10 +3,6 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_callkit_incoming/entities/android_params.dart'; -import 'package:flutter_callkit_incoming/entities/call_event.dart'; -import 'package:flutter_callkit_incoming/entities/call_kit_params.dart'; -import 'package:flutter_callkit_incoming/entities/ios_params.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:just_audio/just_audio.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; @@ -31,7 +27,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { final AudioPlayer player = AudioPlayer(); late MediaStream localStream; late CallDataModel outGoingCallData; - late IncomingCallDataPayload incomingCallData; + late IncomingCallDataPayload inComingCallData; bool isMicOff = false; bool isLoudSpeaker = false; bool isCamOff = false; @@ -43,11 +39,12 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { /// WebRTC Connection Variables bool _offer = false; - bool isIncomingCallLoader = true; - late BuildContext providerContext; + /// Temp Variable Remove After Development + var tempPayLoad; + void initCallListeners({required BuildContext context}) { providerContext = context; if (kDebugMode) { @@ -59,7 +56,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { chatHubConnection.on("OnAnswerOffer", onAnswerOffer); chatHubConnection.on("OnHangUpAsync", onHangUpAsync); chatHubConnection.on("OnCallDeclinedAsync", onCallDeclinedAsync); - chatHubConnection.on("OnIncomingCallAsync", OnIncomingCallAsync); + // chatHubConnection.on("OnIncomingCallAsync", OnIncomingCallAsync); } //Video Constraints @@ -149,13 +146,6 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { return true; } - Future startIncomingCall() async { - await localVideoRenderer.initialize(); - localStream = await navigator.mediaDevices.getUserMedia(isVideoCall ? videoConstraints : audioConstraints); - localVideoRenderer.srcObject = localStream; - await remoteRenderer.initialize(); - } - // OutGoing Listeners void onCallAcceptedAsync(List? params) async { print("--------------------- On Call Accept ---------------------------------------"); @@ -192,8 +182,14 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { notifyListeners(); } - void onOfferAsync(List? params) { - print("--------------------- onOfferAsync ---------------------------------------"); + Future onOfferAsync(List? params) async { + // tempPayLoad = {"values": params!.toList()}; + dynamic items = params!.toList(); + RTCSessionDescription description = await _createAnswer(); + await _pc.setLocalDescription(description); + var payload = {"target": items[0]["id"], "caller": outGoingCallData.callerId, "sdp": description.toMap()}; + invoke(invokeMethod: "AnswerOffer", currentUserID: outGoingCallData.callerId!, targetUserID: items[0]["id"], data: jsonEncode(payload)); + notifyListeners(); } // Incoming Listeners @@ -264,7 +260,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { Future invoke({required String invokeMethod, required int currentUserID, required int targetUserID, var data, int userStatus = 1}) async { List args = []; - Utils.showToast(currentUserID.toString() + " -- " + targetUserID.toString() + " -- " + isVideoCall.toString()); + // Utils.showToast(currentUserID.toString() + " -- " + targetUserID.toString() + " -- " + isVideoCall.toString()); if (invokeMethod == "CallUserAsync") { args = [currentUserID, targetUserID, isVideoCall]; } else if (invokeMethod == "answerCallAsync") { @@ -384,12 +380,11 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { return description; } -// Future _createAnswer() async { -// RTCSessionDescription description = await _pc!.createAnswer(); -// var session = description.sdp.toString(); -// return description; -// _pc!.setLocalDescription(description); -// } + Future _createAnswer() async { + RTCSessionDescription description = await _pc!.createAnswer(); + _offer = false; + return description; + } void micOff() { isMicOff = !isMicOff; @@ -431,9 +426,16 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin { notifyListeners(); } + Future startIncomingCall() async { + await localVideoRenderer.initialize(); + localStream = await navigator.mediaDevices.getUserMedia(isVideoCall ? videoConstraints : audioConstraints); + localVideoRenderer.srcObject = localStream; + await remoteRenderer.initialize(); + _pc = await creatOfferWithCon(); + } + Future startIncomingCallViaKit() async { await startIncomingCall(); - Utils.showToast("Inside Incoming Call"); - await invoke(invokeMethod: "answerCallAsync", currentUserID: incomingCallData.extra!.loginDetails!.id!, targetUserID: incomingCallData.extra!.callerDetails!.targetUserId!); + await invoke(invokeMethod: "answerCallAsync", currentUserID: inComingCallData.extra!.loginDetails!.id!, targetUserID: inComingCallData.extra!.callerDetails!.targetUserId!); } } diff --git a/lib/ui/chat/call/start_call_screen.dart b/lib/ui/chat/call/start_call_screen.dart index 3c4b54a..e09c304 100644 --- a/lib/ui/chat/call/start_call_screen.dart +++ b/lib/ui/chat/call/start_call_screen.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:core'; import 'dart:ui'; import 'package:draggable_widget/draggable_widget.dart'; @@ -29,7 +30,7 @@ class _StartCallPageState extends State { final dragController = DragController(); late ChatProviderModel cPro; late ChatCallProvider callPro; - IncomingCallDataPayload incomingCallData = IncomingCallDataPayload(); + var inCallData; bool isIncomingCall = false; //userChatDetails @@ -51,35 +52,28 @@ class _StartCallPageState extends State { void connection() async { isIncomingCall = (Utils.getStringFromPrefs("isIncomingCall") == "true" ? true : false); Utils.saveStringFromPrefs("isIncomingCall", "false"); - Utils.showToast(incomingCallData.extra!.loginDetails!.toRawJson(), longDuration: false); + callPro.tempPayLoad = inCallData; + // callPro.isIncomingCallLoader = false; + // callPro.notifyListeners(); cPro.userLoginData = UserAutoLoginModel( - response: Response( - id: incomingCallData.extra!.loginDetails!.id, - userName: incomingCallData.extra!.loginDetails!.userName, - email: incomingCallData.extra!.loginDetails!.email, - phone: incomingCallData.extra!.loginDetails!.phone, - title: incomingCallData.extra!.loginDetails!.title, - token: incomingCallData.extra!.loginDetails!.token, - isActiveCode: incomingCallData.extra!.loginDetails!.isActiveCode, - isDomainUser: incomingCallData.extra!.loginDetails!.isDomainUser, - encryptedUserId: incomingCallData.extra!.loginDetails!.encryptedUserName, - encryptedUserName: incomingCallData.extra!.loginDetails!.encryptedUserId), + response: Response.fromJson(jsonDecode(inCallData["loginDetails"])), errorResponses: null, ); AppState().setchatUserDetails = cPro.userLoginData; - await cPro.buildHubConnection(context: context, ccProvider: callPro); - callPro.incomingCallData = incomingCallData; - callPro.isIncomingCallLoader = false; + await cPro.buildHubConnection(context: context, ccProvider: callPro); + //callPro.inComingCallData = inCallData; + callPro.isIncomingCallLoader = false; Future.delayed(const Duration(seconds: 2)).then((value) { callPro.startIncomingCallViaKit(); + //Utils.showToast(inCallData.extra!.loginDetails!.toRawJson(), longDuration: false); callPro.notifyListeners(); }); } @override Widget build(BuildContext context) { - incomingCallData = ModalRoute.of(context)!.settings.arguments as IncomingCallDataPayload; - if (incomingCallData != null) { + inCallData = ModalRoute.of(context)!.settings.arguments; + if (inCallData != null) { connection(); } return Consumer2(builder: (BuildContext context, ChatCallProvider provider, ChatProviderModel cpm, Widget? child) { @@ -313,18 +307,17 @@ class _StartCallPageState extends State { child: CircularProgressIndicator(), ), ) - : Column( - children: const [ - Center( - child: Text( - "Testing", - ), - ), - Center( - child: Text( - "Data", - ), + : ListView( + padding: EdgeInsets.fromLTRB(20,40,20,20), + children: [ + Consumer( + builder: (BuildContext cxt, ChatCallProvider data, Widget? child) { + return Text( + data.tempPayLoad.toString(),style: TextStyle(fontSize: 12, color: Colors.white, decoration: TextDecoration.none,), + ); + }, ), + ], ), ); diff --git a/lib/ui/chat/chat_home.dart b/lib/ui/chat/chat_home.dart index 50fe6ed..c557bb1 100644 --- a/lib/ui/chat/chat_home.dart +++ b/lib/ui/chat/chat_home.dart @@ -56,11 +56,6 @@ class _ChatHomeState extends State { if (data.searchedChats == null || data.searchedChats!.isEmpty) { data.isLoading = true; data.getUserRecentChats().whenComplete(() async { - // String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat"); - // String notificationData = await Utils.getStringFromPrefs("notificationData"); - // if (isAppOpendByChat != "null" || isAppOpendByChat == "true" && notificationData != "null") { - // data.openChatByNoti(context); - // } }); } } diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index fb4c370..989dbf9 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -101,15 +101,15 @@ class _DashboardScreenState extends State with WidgetsBindingOb cProvider.getUserAutoLoginToken().whenComplete(() async { if (!cProvider.disbaleChatForThisUser) { String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat"); - if (isAppOpendByChat != null && isAppOpendByChat == "true") { + if (isAppOpendByChat != "null" && isAppOpendByChat == "true") { Utils.showLoading(context); - cProvider.buildHubConnection(context: context,ccProvider: chatCallProvider); + cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); Future.delayed(const Duration(seconds: 2), () async { cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); gotoChat(context); }); } else { - cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); + cProvider.buildHubConnection(context: context, ccProvider: chatCallProvider); Future.delayed(const Duration(seconds: 2), () { cProvider.invokeChatCounter(userId: AppState().chatDetails!.response!.id!); }); @@ -131,6 +131,11 @@ class _DashboardScreenState extends State with WidgetsBindingOb if (chatHubConnection.state == HubConnectionState.Connected) { Utils.hideLoading(context); Navigator.pushNamed(context, AppRoutes.chat); + String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat"); + if (isAppOpendByChat != "null" || isAppOpendByChat == "true") { + Utils.saveStringFromPrefs("isAppOpendByChat", "false"); + Utils.saveStringFromPrefs("notificationData", "null"); + } } } diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index 7c64309..a0fc1ad 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -9,7 +9,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; import 'package:mohem_flutter_app/api/login_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; @@ -21,6 +20,7 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_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/models/chat/incomingCall.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/member_information_list_model.dart'; @@ -99,10 +99,14 @@ class _LoginScreenState extends State { GetMobileLoginInfoListModel? loginInfo; Future checkFirebaseToken() async { - try { - Utils.showLoading(context); - if (Platform.isAndroid) { - try { + if (await Utils.getStringFromPrefs("isIncomingCall") == "true") { + Utils.hideLoading(context); + Navigator.pushNamed(context, AppRoutes.chatStartCall, arguments: await Utils.getStringFromPrefs("inComingCallData")); + } else { + try { + Utils.showLoading(context); + if (Platform.isAndroid) { + try { if (!(await Utils.isGoogleServicesAvailable())) { //print("HUAWEI APPPP GALLERYYYY!!!!"); AppState().setIsHuawei = true; @@ -116,20 +120,21 @@ class _LoginScreenState extends State { checkLoginInfo(); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } - // }); - } catch (ex) {} - } else { - await Firebase.initializeApp(); - _firebaseMessaging = FirebaseMessaging.instance; - firebaseToken = await _firebaseMessaging.getToken(); - AppNotifications().init(firebaseToken); - checkLoginInfo(); + // }); + } catch (ex) {} + } else { + await Firebase.initializeApp(); + _firebaseMessaging = FirebaseMessaging.instance; + firebaseToken = await _firebaseMessaging.getToken(); + AppNotifications().init(firebaseToken); + checkLoginInfo(); + await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); + } + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } }