Chat Redirect Fix

merge-requests/188/head
Aamir Muhammad 3 years ago
parent 595c47acbb
commit 7191e25ea5

@ -88,7 +88,7 @@ class AppState {
String get getHuaweiPushToken => _huaweiPushToken; 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() { void setPostParamsInitConfig() {
isAuthenticated = false; isAuthenticated = false;

@ -4,6 +4,7 @@ import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
// import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; // import 'package:huawei_hmsavailability/huawei_hmsavailability.dart';
import 'package:huawei_push/huawei_push.dart' as huawei_push; import 'package:huawei_push/huawei_push.dart' as huawei_push;
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -73,7 +74,6 @@ class AppNotifications {
if (Platform.isAndroid) { if (Platform.isAndroid) {
// await hmsApiAvailability.isHMSAvailable().then((value) async { // await hmsApiAvailability.isHMSAvailable().then((value) async {
if (!(await Utils.isGoogleServicesAvailable())) { if (!(await Utils.isGoogleServicesAvailable())) {
huawei_push.Push.enableLogger(); huawei_push.Push.enableLogger();
var result = await huawei_push.Push.setAutoInitEnabled(true); var result = await huawei_push.Push.setAutoInitEnabled(true);
@ -119,9 +119,11 @@ class AppNotifications {
} }
void _handleOpenApp(RemoteMessage message) { void _handleOpenApp(RemoteMessage message) {
if (message.data.isNotEmpty && message.data["type"] == 'chat') {
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());
} }
}
} }
AndroidNotificationChannel channel = const AndroidNotificationChannel( AndroidNotificationChannel channel = const AndroidNotificationChannel(
@ -134,5 +136,7 @@ Future<dynamic> backgroundMessageHandler(RemoteMessage message) async {
await Firebase.initializeApp(); await Firebase.initializeApp();
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());
if (message.data.isNotEmpty && message.data["type"] == 'call') {
ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message); ChatVoipCall().showCallkitIncoming(uuid: const Uuid().v4(), data: message);
}
} }

@ -25,7 +25,6 @@ class ChatVoipCall {
"loginDetails": autoLoginData.toJson(), "loginDetails": autoLoginData.toJson(),
"callerDetails": callerData.toJson(), "callerDetails": callerData.toJson(),
}; };
logger.d(values);
CallKitParams params = CallKitParams( CallKitParams params = CallKitParams(
id: uuid, id: uuid,
nameCaller: callerData.targetUserName, nameCaller: callerData.targetUserName,
@ -67,7 +66,7 @@ class ChatVoipCall {
); );
if (callerData.chatEventId == 3) { if (callerData.chatEventId == 3) {
await Utils.saveStringFromPrefs("isIncomingCall", "true"); await Utils.saveStringFromPrefs("isIncomingCall", "true");
await Utils.saveStringFromPrefs("inComingCallData",jsonEncode(params.toJson())); await Utils.saveStringFromPrefs("inComingCallData",jsonEncode(values));
await FlutterCallkitIncoming.showCallkitIncoming(params); await FlutterCallkitIncoming.showCallkitIncoming(params);
} }
} }
@ -85,11 +84,11 @@ class ChatVoipCall {
// TODO: show screen calling in Flutter // TODO: show screen calling in Flutter
break; break;
case Event.ACTION_CALL_ACCEPT: case Event.ACTION_CALL_ACCEPT:
break; break;
case Event.ACTION_CALL_DECLINE: case Event.ACTION_CALL_DECLINE:
Utils.saveStringFromPrefs("isIncomingCall", "false"); Utils.saveStringFromPrefs("isIncomingCall", "false");
Utils.saveStringFromPrefs("inComingCallData", "null"); Utils.saveStringFromPrefs("inComingCallData", "null");
break; break;
case Event.ACTION_CALL_ENDED: case Event.ACTION_CALL_ENDED:
Utils.saveStringFromPrefs("isIncomingCall", "false"); Utils.saveStringFromPrefs("isIncomingCall", "false");

@ -3,10 +3,6 @@ import 'dart:io';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
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/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:flutter_webrtc/flutter_webrtc.dart';
import 'package:just_audio/just_audio.dart'; import 'package:just_audio/just_audio.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -31,7 +27,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
final AudioPlayer player = AudioPlayer(); final AudioPlayer player = AudioPlayer();
late MediaStream localStream; late MediaStream localStream;
late CallDataModel outGoingCallData; late CallDataModel outGoingCallData;
late IncomingCallDataPayload incomingCallData; late IncomingCallDataPayload inComingCallData;
bool isMicOff = false; bool isMicOff = false;
bool isLoudSpeaker = false; bool isLoudSpeaker = false;
bool isCamOff = false; bool isCamOff = false;
@ -43,11 +39,12 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
/// WebRTC Connection Variables /// WebRTC Connection Variables
bool _offer = false; bool _offer = false;
bool isIncomingCallLoader = true; bool isIncomingCallLoader = true;
late BuildContext providerContext; late BuildContext providerContext;
/// Temp Variable Remove After Development
var tempPayLoad;
void initCallListeners({required BuildContext context}) { void initCallListeners({required BuildContext context}) {
providerContext = context; providerContext = context;
if (kDebugMode) { if (kDebugMode) {
@ -59,7 +56,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
chatHubConnection.on("OnAnswerOffer", onAnswerOffer); chatHubConnection.on("OnAnswerOffer", onAnswerOffer);
chatHubConnection.on("OnHangUpAsync", onHangUpAsync); chatHubConnection.on("OnHangUpAsync", onHangUpAsync);
chatHubConnection.on("OnCallDeclinedAsync", onCallDeclinedAsync); chatHubConnection.on("OnCallDeclinedAsync", onCallDeclinedAsync);
chatHubConnection.on("OnIncomingCallAsync", OnIncomingCallAsync); // chatHubConnection.on("OnIncomingCallAsync", OnIncomingCallAsync);
} }
//Video Constraints //Video Constraints
@ -149,13 +146,6 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
return true; return true;
} }
Future<void> startIncomingCall() async {
await localVideoRenderer.initialize();
localStream = await navigator.mediaDevices.getUserMedia(isVideoCall ? videoConstraints : audioConstraints);
localVideoRenderer.srcObject = localStream;
await remoteRenderer.initialize();
}
// OutGoing Listeners // OutGoing Listeners
void onCallAcceptedAsync(List<Object?>? params) async { void onCallAcceptedAsync(List<Object?>? params) async {
print("--------------------- On Call Accept ---------------------------------------"); print("--------------------- On Call Accept ---------------------------------------");
@ -192,8 +182,14 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners(); notifyListeners();
} }
void onOfferAsync(List<Object?>? params) { Future<void> onOfferAsync(List<Object?>? params) async {
print("--------------------- onOfferAsync ---------------------------------------"); // 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 // Incoming Listeners
@ -264,7 +260,7 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
Future<void> invoke({required String invokeMethod, required int currentUserID, required int targetUserID, var data, int userStatus = 1}) async { Future<void> invoke({required String invokeMethod, required int currentUserID, required int targetUserID, var data, int userStatus = 1}) async {
List<Object> args = []; List<Object> args = [];
Utils.showToast(currentUserID.toString() + " -- " + targetUserID.toString() + " -- " + isVideoCall.toString()); // Utils.showToast(currentUserID.toString() + " -- " + targetUserID.toString() + " -- " + isVideoCall.toString());
if (invokeMethod == "CallUserAsync") { if (invokeMethod == "CallUserAsync") {
args = [currentUserID, targetUserID, isVideoCall]; args = [currentUserID, targetUserID, isVideoCall];
} else if (invokeMethod == "answerCallAsync") { } else if (invokeMethod == "answerCallAsync") {
@ -384,12 +380,11 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
return description; return description;
} }
// Future<RTCSessionDescription> _createAnswer() async { Future<RTCSessionDescription> _createAnswer() async {
// RTCSessionDescription description = await _pc!.createAnswer(); RTCSessionDescription description = await _pc!.createAnswer();
// var session = description.sdp.toString(); _offer = false;
// return description; return description;
// _pc!.setLocalDescription(description); }
// }
void micOff() { void micOff() {
isMicOff = !isMicOff; isMicOff = !isMicOff;
@ -431,9 +426,16 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners(); notifyListeners();
} }
Future<void> startIncomingCall() async {
await localVideoRenderer.initialize();
localStream = await navigator.mediaDevices.getUserMedia(isVideoCall ? videoConstraints : audioConstraints);
localVideoRenderer.srcObject = localStream;
await remoteRenderer.initialize();
_pc = await creatOfferWithCon();
}
Future<void> startIncomingCallViaKit() async { Future<void> startIncomingCallViaKit() async {
await startIncomingCall(); 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!);
} }
} }

@ -1,3 +1,4 @@
import 'dart:convert';
import 'dart:core'; import 'dart:core';
import 'dart:ui'; import 'dart:ui';
import 'package:draggable_widget/draggable_widget.dart'; import 'package:draggable_widget/draggable_widget.dart';
@ -29,7 +30,7 @@ class _StartCallPageState extends State<StartCallPage> {
final dragController = DragController(); final dragController = DragController();
late ChatProviderModel cPro; late ChatProviderModel cPro;
late ChatCallProvider callPro; late ChatCallProvider callPro;
IncomingCallDataPayload incomingCallData = IncomingCallDataPayload(); var inCallData;
bool isIncomingCall = false; bool isIncomingCall = false;
//userChatDetails //userChatDetails
@ -51,35 +52,28 @@ class _StartCallPageState extends State<StartCallPage> {
void connection() async { void connection() async {
isIncomingCall = (Utils.getStringFromPrefs("isIncomingCall") == "true" ? true : false); isIncomingCall = (Utils.getStringFromPrefs("isIncomingCall") == "true" ? true : false);
Utils.saveStringFromPrefs("isIncomingCall", "false"); Utils.saveStringFromPrefs("isIncomingCall", "false");
Utils.showToast(incomingCallData.extra!.loginDetails!.toRawJson(), longDuration: false); callPro.tempPayLoad = inCallData;
// callPro.isIncomingCallLoader = false;
// callPro.notifyListeners();
cPro.userLoginData = UserAutoLoginModel( cPro.userLoginData = UserAutoLoginModel(
response: Response( response: Response.fromJson(jsonDecode(inCallData["loginDetails"])),
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),
errorResponses: null, errorResponses: null,
); );
AppState().setchatUserDetails = cPro.userLoginData; AppState().setchatUserDetails = cPro.userLoginData;
await cPro.buildHubConnection(context: context, ccProvider: callPro); await cPro.buildHubConnection(context: context, ccProvider: callPro);
callPro.incomingCallData = incomingCallData; //callPro.inComingCallData = inCallData;
callPro.isIncomingCallLoader = false; callPro.isIncomingCallLoader = false;
Future.delayed(const Duration(seconds: 2)).then((value) { Future.delayed(const Duration(seconds: 2)).then((value) {
callPro.startIncomingCallViaKit(); callPro.startIncomingCallViaKit();
//Utils.showToast(inCallData.extra!.loginDetails!.toRawJson(), longDuration: false);
callPro.notifyListeners(); callPro.notifyListeners();
}); });
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
incomingCallData = ModalRoute.of(context)!.settings.arguments as IncomingCallDataPayload; inCallData = ModalRoute.of(context)!.settings.arguments;
if (incomingCallData != null) { if (inCallData != null) {
connection(); connection();
} }
return Consumer2<ChatCallProvider, ChatProviderModel>(builder: (BuildContext context, ChatCallProvider provider, ChatProviderModel cpm, Widget? child) { return Consumer2<ChatCallProvider, ChatProviderModel>(builder: (BuildContext context, ChatCallProvider provider, ChatProviderModel cpm, Widget? child) {
@ -313,18 +307,17 @@ class _StartCallPageState extends State<StartCallPage> {
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
) )
: Column( : ListView(
children: const [ padding: EdgeInsets.fromLTRB(20,40,20,20),
Center( children: [
child: Text( Consumer<ChatCallProvider>(
"Testing", builder: (BuildContext cxt, ChatCallProvider data, Widget? child) {
), return Text(
), data.tempPayLoad.toString(),style: TextStyle(fontSize: 12, color: Colors.white, decoration: TextDecoration.none,),
Center( );
child: Text( },
"Data",
),
), ),
], ],
), ),
); );

@ -56,11 +56,6 @@ class _ChatHomeState extends State<ChatHome> {
if (data.searchedChats == null || data.searchedChats!.isEmpty) { if (data.searchedChats == null || data.searchedChats!.isEmpty) {
data.isLoading = true; data.isLoading = true;
data.getUserRecentChats().whenComplete(() async { 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);
// }
}); });
} }
} }

@ -101,9 +101,9 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
cProvider.getUserAutoLoginToken().whenComplete(() async { cProvider.getUserAutoLoginToken().whenComplete(() async {
if (!cProvider.disbaleChatForThisUser) { if (!cProvider.disbaleChatForThisUser) {
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); 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);
@ -131,6 +131,11 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
if (chatHubConnection.state == HubConnectionState.Connected) { if (chatHubConnection.state == HubConnectionState.Connected) {
Utils.hideLoading(context); Utils.hideLoading(context);
Navigator.pushNamed(context, AppRoutes.chat); Navigator.pushNamed(context, AppRoutes.chat);
String isAppOpendByChat = await Utils.getStringFromPrefs("isAppOpendByChat");
if (isAppOpendByChat != "null" || isAppOpendByChat == "true") {
Utils.saveStringFromPrefs("isAppOpendByChat", "false");
Utils.saveStringFromPrefs("notificationData", "null");
}
} }
} }

@ -9,7 +9,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.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/api/login_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.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/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/models/chat/incomingCall.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';
@ -99,6 +99,10 @@ class _LoginScreenState extends State<LoginScreen> {
GetMobileLoginInfoListModel? loginInfo; GetMobileLoginInfoListModel? loginInfo;
Future<void> checkFirebaseToken() async { Future<void> checkFirebaseToken() async {
if (await Utils.getStringFromPrefs("isIncomingCall") == "true") {
Utils.hideLoading(context);
Navigator.pushNamed(context, AppRoutes.chatStartCall, arguments: await Utils.getStringFromPrefs("inComingCallData"));
} else {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
if (Platform.isAndroid) { if (Platform.isAndroid) {
@ -132,6 +136,7 @@ class _LoginScreenState extends State<LoginScreen> {
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
} }
} }
}
void checkLoginInfo() async { void checkLoginInfo() async {
loginInfo = await LoginApiClient().getMobileLoginInfoNEW(AppState().getIsHuawei ? AppState().getHuaweiPushToken : firebaseToken ?? "", Platform.isAndroid ? "android" : "ios"); loginInfo = await LoginApiClient().getMobileLoginInfoNEW(AppState().getIsHuawei ? AppState().getHuaweiPushToken : firebaseToken ?? "", Platform.isAndroid ? "android" : "ios");

Loading…
Cancel
Save