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;
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;

@ -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<dynamic> 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);
}
}

@ -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");

@ -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<void> startIncomingCall() async {
await localVideoRenderer.initialize();
localStream = await navigator.mediaDevices.getUserMedia(isVideoCall ? videoConstraints : audioConstraints);
localVideoRenderer.srcObject = localStream;
await remoteRenderer.initialize();
}
// OutGoing Listeners
void onCallAcceptedAsync(List<Object?>? params) async {
print("--------------------- On Call Accept ---------------------------------------");
@ -192,8 +182,14 @@ class ChatCallProvider with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners();
}
void onOfferAsync(List<Object?>? params) {
print("--------------------- onOfferAsync ---------------------------------------");
Future<void> onOfferAsync(List<Object?>? 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<void> invoke({required String invokeMethod, required int currentUserID, required int targetUserID, var data, int userStatus = 1}) async {
List<Object> 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<RTCSessionDescription> _createAnswer() async {
// RTCSessionDescription description = await _pc!.createAnswer();
// var session = description.sdp.toString();
// return description;
// _pc!.setLocalDescription(description);
// }
Future<RTCSessionDescription> _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<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 {
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:ui';
import 'package:draggable_widget/draggable_widget.dart';
@ -29,7 +30,7 @@ class _StartCallPageState extends State<StartCallPage> {
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<StartCallPage> {
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<ChatCallProvider, ChatProviderModel>(builder: (BuildContext context, ChatCallProvider provider, ChatProviderModel cpm, Widget? child) {
@ -313,18 +307,17 @@ class _StartCallPageState extends State<StartCallPage> {
child: CircularProgressIndicator(),
),
)
: Column(
children: const [
Center(
child: Text(
"Testing",
),
),
Center(
child: Text(
"Data",
),
: ListView(
padding: EdgeInsets.fromLTRB(20,40,20,20),
children: [
Consumer<ChatCallProvider>(
builder: (BuildContext cxt, ChatCallProvider data, Widget? child) {
return Text(
data.tempPayLoad.toString(),style: TextStyle(fontSize: 12, color: Colors.white, decoration: TextDecoration.none,),
);
},
),
],
),
);

@ -56,11 +56,6 @@ class _ChatHomeState extends State<ChatHome> {
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);
// }
});
}
}

@ -101,15 +101,15 @@ class _DashboardScreenState extends State<DashboardScreen> 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<DashboardScreen> 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");
}
}
}

@ -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<LoginScreen> {
GetMobileLoginInfoListModel? loginInfo;
Future<void> 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<LoginScreen> {
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);
}
}

Loading…
Cancel
Save