End Call Android Native

development_aamir_testing23
Aamir Muhammad 2 years ago
parent 3a821a1744
commit 7bc36188c4

@ -1,5 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:io';
import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:audio_waveforms/audio_waveforms.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -10,11 +10,9 @@ 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/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_search_user_chat_model.dart'; import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart';
import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_model.dart'; import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_model.dart';
import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart';
import 'package:mohem_flutter_app/provider/chat_call_provider.dart'; import 'package:mohem_flutter_app/provider/chat_call_provider.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/ui/chat/custom_auto_direction.dart'; import 'package:mohem_flutter_app/ui/chat/custom_auto_direction.dart';
@ -23,9 +21,9 @@ import 'package:mohem_flutter_app/ui/chat/chat_bubble.dart';
import 'package:mohem_flutter_app/ui/chat/common.dart'; import 'package:mohem_flutter_app/ui/chat/common.dart';
import 'package:mohem_flutter_app/widgets/chat_app_bar_widge.dart'; import 'package:mohem_flutter_app/widgets/chat_app_bar_widge.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:signalr_netcore/signalr_client.dart';
import 'package:swipe_to/swipe_to.dart'; import 'package:swipe_to/swipe_to.dart';
class ChatDetailedScreenParams { class ChatDetailedScreenParams {
@ -78,7 +76,7 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
params = ModalRoute.of(context)!.settings.arguments as ChatDetailedScreenParams; params = ModalRoute.of(context)!.settings.arguments as ChatDetailedScreenParams;
data = Provider.of<ChatProviderModel>(context, listen: false); data = Provider.of<ChatProviderModel>(context, listen: false);
// callPro = Provider.of<ChatCallProvider>(context, listen: false); // callPro = Provider.of<ChatCallProvider>(context, listen: false);
if (params != null) { if (params != null) {
data.getSingleUserChatHistory( data.getSingleUserChatHistory(
senderUID: AppState().chatDetails!.response!.id!.toInt(), senderUID: AppState().chatDetails!.response!.id!.toInt(),
@ -98,14 +96,32 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
showTyping: true, showTyping: true,
chatUser: params!.chatUser, chatUser: params!.chatUser,
actions: [ actions: [
// SvgPicture.asset("assets/icons/chat/call.svg", width: 21, height: 23).onPress(() { // if (Platform.isAndroid)
// makeCall(callType: "AUDIO"); SvgPicture.asset("assets/icons/chat/call.svg", width: 21, height: 23).onPress(() async {
// }), Future<PermissionStatus> micPer = Permission.microphone.request();
// 24.width, if (await micPer.isGranted) {
// SvgPicture.asset("assets/icons/chat/video_call.svg", width: 21, height: 18).onPress(() { makeCall(callType: "AUDIO");
// makeCall(callType: "VIDEO"); } else {
// }), Permission.microphone.request().isGranted.then((value) {
// 21.width, makeCall(callType: "AUDIO");
});
}
}),
// if (Platform.isAndroid)
24.width,
// if (Platform.isAndroid)
SvgPicture.asset("assets/icons/chat/video_call.svg", width: 21, height: 18).onPress(() async {
Future<PermissionStatus> camPer = Permission.camera.request();
if (await camPer.isGranted) {
makeCall(callType: "VIDEO");
} else {
Permission.camera.request().isGranted.then((value) {
makeCall(callType: "VIDEO");
});
}
}),
// if (Platform.isAndroid)
21.width,
], ],
), ),
body: SafeArea( body: SafeArea(
@ -113,218 +129,218 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
builder: (BuildContext context, ChatProviderModel m, Widget? child) { builder: (BuildContext context, ChatProviderModel m, Widget? child) {
return (m.isLoading return (m.isLoading
? ChatHomeShimmer( ? ChatHomeShimmer(
isDetailedScreen: true, isDetailedScreen: true,
) )
: Column( : Column(
children: <Widget>[ children: <Widget>[
SmartRefresher( SmartRefresher(
enablePullDown: false, enablePullDown: false,
enablePullUp: true, enablePullUp: true,
onLoading: () { onLoading: () {
getMoreChat(); getMoreChat();
}, },
header: const MaterialClassicHeader( header: const MaterialClassicHeader(
color: MyColors.gradiantEndColor, color: MyColors.gradiantEndColor,
), ),
controller: _rc, controller: _rc,
reverse: true, reverse: true,
child: ListView.separated( child: ListView.separated(
controller: m.scrollController, controller: m.scrollController,
shrinkWrap: true, shrinkWrap: true,
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
reverse: true, reverse: true,
itemCount: m.userChatHistory.length, itemCount: m.userChatHistory.length,
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
separatorBuilder: (BuildContext cxt, int index) => 8.height, separatorBuilder: (BuildContext cxt, int index) => 8.height,
itemBuilder: (BuildContext context, int i) { itemBuilder: (BuildContext context, int i) {
return SwipeTo( return SwipeTo(
iconColor: MyColors.lightGreenColor, iconColor: MyColors.lightGreenColor,
child: ChatBubble( child: ChatBubble(
dateTime: m.dateFormte(m.userChatHistory[i].createdDate!), dateTime: m.dateFormte(m.userChatHistory[i].createdDate!),
cItem: m.userChatHistory[i], cItem: m.userChatHistory[i],
),
onRightSwipe: () {
m.chatReply(
m.userChatHistory[i],
);
},
).onPress(() async {
logger.w(m.userChatHistory[i].toJson());
if (m.userChatHistory[i].fileTypeResponse != null && m.userChatHistory[i].fileTypeId != null) {
if (m.userChatHistory[i].fileTypeId! == 1 ||
m.userChatHistory[i].fileTypeId! == 5 ||
m.userChatHistory[i].fileTypeId! == 7 ||
m.userChatHistory[i].fileTypeId! == 6 ||
m.userChatHistory[i].fileTypeId! == 8
// || m.userChatHistory[i].fileTypeId! == 2
) {
m.getChatMedia(context,
fileTypeName: m.userChatHistory[i].fileTypeResponse!.fileTypeName ?? "", fileTypeID: m.userChatHistory[i].fileTypeId!, fileName: m.userChatHistory[i].contant!);
}
}
});
},
), ),
).expanded, onRightSwipe: () {
if (m.isReplyMsg) m.chatReply(
SizedBox( m.userChatHistory[i],
height: 82, );
},
).onPress(() async {
// logger.w(m.userChatHistory[i].toJson());
if (m.userChatHistory[i].fileTypeResponse != null && m.userChatHistory[i].fileTypeId != null) {
if (m.userChatHistory[i].fileTypeId! == 1 ||
m.userChatHistory[i].fileTypeId! == 5 ||
m.userChatHistory[i].fileTypeId! == 7 ||
m.userChatHistory[i].fileTypeId! == 6 ||
m.userChatHistory[i].fileTypeId! == 8
// || m.userChatHistory[i].fileTypeId! == 2
) {
m.getChatMedia(context,
fileTypeName: m.userChatHistory[i].fileTypeResponse!.fileTypeName ?? "", fileTypeID: m.userChatHistory[i].fileTypeId!, fileName: m.userChatHistory[i].contant!);
}
}
});
},
),
).expanded,
if (m.isReplyMsg)
SizedBox(
height: 82,
child: Row(
children: <Widget>[
Container(height: 82, color: MyColors.textMixColor, width: 6),
Container(
color: MyColors.darkTextColor.withOpacity(0.10),
padding: const EdgeInsets.only(top: 11, left: 14, bottom: 14, right: 21),
child: Row( child: Row(
children: <Widget>[ children: [
Container(height: 82, color: MyColors.textMixColor, width: 6), Column(
Container( crossAxisAlignment: CrossAxisAlignment.start,
color: MyColors.darkTextColor.withOpacity(0.10), children: [
padding: const EdgeInsets.only(top: 11, left: 14, bottom: 14, right: 21), (AppState().chatDetails!.response!.userName == m.repliedMsg.first.currentUserName.toString()
child: Row( ? "You"
children: [ : m.repliedMsg.first.currentUserName.toString().replaceAll(".", " "))
Column( .toText14(color: MyColors.lightGreenColor),
crossAxisAlignment: CrossAxisAlignment.start, (m.repliedMsg.isNotEmpty ? m.repliedMsg.first.contant! : "").toText12(color: MyColors.grey71Color, maxLine: 2)
children: [ ],
(AppState().chatDetails!.response!.userName == m.repliedMsg.first.currentUserName.toString()
? "You"
: m.repliedMsg.first.currentUserName.toString().replaceAll(".", " "))
.toText14(color: MyColors.lightGreenColor),
(m.repliedMsg.isNotEmpty ? m.repliedMsg.first.contant! : "").toText12(color: MyColors.grey71Color, maxLine: 2)
],
).expanded,
12.width,
if (m.isReplyMsg && m.repliedMsg.isNotEmpty) showReplyImage(m.repliedMsg, m),
12.width,
const Icon(Icons.cancel, size: 23, color: MyColors.grey7BColor).onPress(m.closeMe),
],
),
).expanded, ).expanded,
12.width,
if (m.isReplyMsg && m.repliedMsg.isNotEmpty) showReplyImage(m.repliedMsg, m),
12.width,
const Icon(Icons.cancel, size: 23, color: MyColors.grey7BColor).onPress(m.closeMe),
], ],
), ),
), ).expanded,
if (m.isAttachmentMsg && m.sFileType == ".png" || m.sFileType == ".jpeg" || m.sFileType == ".jpg") ],
SizedBox(height: 200, width: double.infinity, child: Image.file(m.selectedFile, fit: BoxFit.cover)).paddingOnly(left: 21, right: 21, top: 21), ),
const Divider(height: 1, color: MyColors.lightGreyEFColor), ),
if (m.isRecoding) if (m.isAttachmentMsg && m.sFileType == ".png" || m.sFileType == ".jpeg" || m.sFileType == ".jpg")
Column( SizedBox(height: 200, width: double.infinity, child: Image.file(m.selectedFile, fit: BoxFit.cover)).paddingOnly(left: 21, right: 21, top: 21),
children: <Widget>[ const Divider(height: 1, color: MyColors.lightGreyEFColor),
Row( if (m.isRecoding)
children: [ Column(
Text(m.buildTimer()).paddingAll(10), children: <Widget>[
if (m.isRecoding && m.isPlaying) Row(
WaveBubble( children: [
playerController: m.playerController, Text(m.buildTimer()).paddingAll(10),
isPlaying: m.playerController.playerState == PlayerState.playing, if (m.isRecoding && m.isPlaying)
onTap: () {}, WaveBubble(
).expanded playerController: m.playerController,
else isPlaying: m.playerController.playerState == PlayerState.playing,
AudioWaveforms( onTap: () {},
waveStyle: const WaveStyle( ).expanded
waveColor: MyColors.lightGreenColor, else
middleLineColor: Colors.transparent, AudioWaveforms(
extendWaveform: true, waveStyle: const WaveStyle(
showBottom: true, waveColor: MyColors.lightGreenColor,
showTop: true, middleLineColor: Colors.transparent,
waveThickness: 2, extendWaveform: true,
showMiddleLine: false, showBottom: true,
middleLineThickness: 0, showTop: true,
), waveThickness: 2,
padding: const EdgeInsets.all(5), showMiddleLine: false,
shouldCalculateScrolledPosition: false, middleLineThickness: 0,
margin: EdgeInsets.zero, ),
size: const Size(double.infinity, 30.0), padding: const EdgeInsets.all(5),
recorderController: m.recorderController, shouldCalculateScrolledPosition: false,
backgroundColor: Colors.white, margin: EdgeInsets.zero,
).expanded, size: const Size(double.infinity, 30.0),
], recorderController: m.recorderController,
), backgroundColor: Colors.white,
Row( ).expanded,
mainAxisAlignment: MainAxisAlignment.spaceBetween, ],
children: [ ),
const Icon( Row(
Icons.delete_outlined, mainAxisAlignment: MainAxisAlignment.spaceBetween,
size: 26, children: [
color: MyColors.lightGreenColor, const Icon(
).paddingAll(10).onPress(() { Icons.delete_outlined,
m.deleteRecoding(); size: 26,
}), color: MyColors.lightGreenColor,
SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26) ).paddingAll(10).onPress(() {
.onPress( m.deleteRecoding();
() => m.sendChatMessage(context, }),
targetUserId: params!.chatUser!.id!, SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26)
userStatus: params!.chatUser!.userStatus ?? 0, .onPress(
userEmail: params!.chatUser!.email!, () => m.sendChatMessage(context,
targetUserName: params!.chatUser!.userName!), targetUserId: params!.chatUser!.id!,
) userStatus: params!.chatUser!.userStatus ?? 0,
.paddingOnly(right: 21), userEmail: params!.chatUser!.email!,
], targetUserName: params!.chatUser!.userName!),
)
.paddingOnly(right: 21),
],
),
],
).objectContainerView(disablePadding: true, radius: 0),
if (!m.isRecoding)
Row(
children: [
CustomAutoDirection(
onDirectionChange: (bool isRTL) => m.onDirectionChange(isRTL),
text: m.msgText,
child: TextField(
// textDirection: m.textDirection,
controller: m.message,
decoration: InputDecoration(
hintTextDirection: m.textDirection,
hintText: m.isAttachmentMsg ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(),
hintStyle: TextStyle(color: m.isAttachmentMsg ? MyColors.darkTextColor : MyColors.grey98Color, fontSize: 14),
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
filled: true,
fillColor: MyColors.white,
contentPadding: const EdgeInsets.only(
left: 21,
top: 20,
bottom: 20,
), ),
], prefixIconConstraints: const BoxConstraints(),
).objectContainerView(disablePadding: true, radius: 0), prefixIcon: m.sFileType.isNotEmpty
if (!m.isRecoding) ? SvgPicture.asset(m.getType(m.sFileType), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 21, right: 15)
: null,
),
onChanged: (String val) {
m.inputBoxDirection(val);
m.userTypingInvoke(currentUser: AppState().chatDetails!.response!.id!, reciptUser: params!.chatUser!.id!);
},
).expanded,
),
if (m.sFileType.isNotEmpty)
Row( Row(
children: [ children: <Widget>[
CustomAutoDirection( const Icon(Icons.cancel, size: 15, color: MyColors.redA3Color).paddingOnly(right: 5),
onDirectionChange: (bool isRTL) => m.onDirectionChange(isRTL), ("Clear").toText11(color: MyColors.redA3Color, isUnderLine: true).paddingOnly(left: 0),
text: m.msgText,
child: TextField(
// textDirection: m.textDirection,
controller: m.message,
decoration: InputDecoration(
hintTextDirection: m.textDirection,
hintText: m.isAttachmentMsg ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(),
hintStyle: TextStyle(color: m.isAttachmentMsg ? MyColors.darkTextColor : MyColors.grey98Color, fontSize: 14),
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
filled: true,
fillColor: MyColors.white,
contentPadding: const EdgeInsets.only(
left: 21,
top: 20,
bottom: 20,
),
prefixIconConstraints: const BoxConstraints(),
prefixIcon: m.sFileType.isNotEmpty
? SvgPicture.asset(m.getType(m.sFileType), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 21, right: 15)
: null,
),
onChanged: (String val) {
m.inputBoxDirection(val);
m.userTypingInvoke(currentUser: AppState().chatDetails!.response!.id!, reciptUser: params!.chatUser!.id!);
},
).expanded,
),
if (m.sFileType.isNotEmpty)
Row(
children: <Widget>[
const Icon(Icons.cancel, size: 15, color: MyColors.redA3Color).paddingOnly(right: 5),
("Clear").toText11(color: MyColors.redA3Color, isUnderLine: true).paddingOnly(left: 0),
],
).onPress(() => m.removeAttachment()).paddingOnly(right: 15),
if (m.sFileType.isEmpty)
RotationTransition(
turns: const AlwaysStoppedAnimation(45 / 360),
child: const Icon(Icons.attach_file_rounded, size: 26, color: MyColors.grey3AColor).onPress(
() => m.selectImageToUpload(context),
),
).paddingOnly(right: 15),
const Icon(
Icons.mic,
color: MyColors.lightGreenColor,
).paddingOnly(right: 15).onPress(() {
m.startRecoding(context);
}),
SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26)
.onPress(
() => m.sendChatMessage(context,
targetUserId: params!.chatUser!.id!,
userStatus: params!.chatUser!.userStatus ?? 0,
userEmail: params!.chatUser!.email!,
targetUserName: params!.chatUser!.userName!),
)
.paddingOnly(right: 21),
], ],
).objectContainerView(disablePadding: true, radius: 0), ).onPress(() => m.removeAttachment()).paddingOnly(right: 15),
if (m.sFileType.isEmpty)
RotationTransition(
turns: const AlwaysStoppedAnimation(45 / 360),
child: const Icon(Icons.attach_file_rounded, size: 26, color: MyColors.grey3AColor).onPress(
() => m.selectImageToUpload(context),
),
).paddingOnly(right: 15),
const Icon(
Icons.mic,
color: MyColors.lightGreenColor,
).paddingOnly(right: 15).onPress(() {
m.startRecoding(context);
}),
SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26)
.onPress(
() => m.sendChatMessage(context,
targetUserId: params!.chatUser!.id!,
userStatus: params!.chatUser!.userStatus ?? 0,
userEmail: params!.chatUser!.email!,
targetUserName: params!.chatUser!.userName!),
)
.paddingOnly(right: 21),
], ],
)); ).objectContainerView(disablePadding: true, radius: 0),
],
));
}, },
), ),
), ),
@ -342,39 +358,31 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
} else { } else {
return data.first.fileTypeResponse != null && data.first.fileTypeResponse!.fileTypeName != null return data.first.fileTypeResponse != null && data.first.fileTypeResponse!.fileTypeName != null
? Container( ? Container(
width: 43, width: 43,
height: 43, height: 43,
constraints: const BoxConstraints(), constraints: const BoxConstraints(),
decoration: BoxDecoration(border: Border.all(color: MyColors.darkGrey3BColor, width: 1), borderRadius: BorderRadius.circular(10.0), color: Colors.white), decoration: BoxDecoration(border: Border.all(color: MyColors.darkGrey3BColor, width: 1), borderRadius: BorderRadius.circular(10.0), color: Colors.white),
child: SvgPicture.asset(m.getType(data.first.fileTypeResponse!.fileTypeName ?? ""), alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 5, right: 5, top: 5, bottom: 5)) child: SvgPicture.asset(m.getType(data.first.fileTypeResponse!.fileTypeName ?? ""), alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 5, right: 5, top: 5, bottom: 5))
: const SizedBox(); : const SizedBox();
} }
} }
// void makeCall({required String callType}) async { void makeCall({required String callType}) async {
// callPro.initCallListeners(); Map<String, dynamic> json = {
// print("================== Make call Triggered ============================"); "callerID": AppState().chatDetails!.response!.id,
// Map<String, dynamic> json = { "callerName": AppState().chatDetails!.response!.userName,
// "callerID": AppState().chatDetails!.response!.id!.toString(), "callerEmail": AppState().chatDetails!.response!.email,
// "callerDetails": AppState().chatDetails!.toJson(), "callerTitle": AppState().chatDetails!.response!.title,
// "receiverID": params!.chatUser!.id.toString(), "callerPhone": AppState().chatDetails!.response!.phone,
// "receiverDetails": params!.chatUser!.toJson(), "receiverID": params!.chatUser!.id,
// "title": params!.chatUser!.userName!.replaceAll(".", " "), "receiverName": params!.chatUser!.userName,
// "calltype": callType == "VIDEO" ? "Video" : "Audio", "receiverEmail": params!.chatUser!.email,
// }; "receiverTitle": params!.chatUser!.title,
// logger.w(json); "receiverPhone": params!.chatUser!.phone,
// CallDataModel callData = CallDataModel.fromJson(json); "title": params!.chatUser!.userName!.replaceAll(".", " "),
// await Navigator.push( "callType": callType == "VIDEO" ? "Video" : "Audio",
// context, };
// MaterialPageRoute( CallDataModel callData = CallDataModel.fromJson(json);
// builder: (BuildContext context) => OutGoingCall( await Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => OutGoingCall(isVideoCall: callType == "VIDEO" ? true : false, outGoingCallData: callData)));
// isVideoCall: callType == "VIDEO" ? true : false, }
// outGoingCallData: callData,
// ),
// ),
// ).then((value) {
// print("then");
// callPro.stopListeners();
// });
// }
} }

Loading…
Cancel
Save