Ios Stream Audio

merge-requests/131/head
Aamir Muhammad 3 years ago
parent 935f959a02
commit 54961c875f

@ -518,5 +518,6 @@
"winners": "الفائزين!!!", "winners": "الفائزين!!!",
"noUpcoming": "لا يوجد قادم", "noUpcoming": "لا يوجد قادم",
"fakeLocation": ".لقد تتبعنا أنك تحاول استخدام موقع مزيف! يعتبر هذا مخالفة وقد تم إخطار الموارد البشرية", "fakeLocation": ".لقد تتبعنا أنك تحاول استخدام موقع مزيف! يعتبر هذا مخالفة وقد تم إخطار الموارد البشرية",
"noWinner": "حزين! لم يفز أحد اليوم." "noWinner": "حزين! لم يفز أحد اليوم.",
"myTeam" : "فريقي"
} }

@ -518,5 +518,6 @@
"winners": "WINNERS!!!", "winners": "WINNERS!!!",
"noUpcoming": "There is no upcoming", "noUpcoming": "There is no upcoming",
"fakeLocation": "We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.", "fakeLocation": "We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.",
"noWinner": "Sad! No one won today." "noWinner": "Sad! No one won today.",
"myTeam" : "My Team"
} }

@ -505,5 +505,6 @@ abstract class LocaleKeys {
static const noUpcoming = 'noUpcoming'; static const noUpcoming = 'noUpcoming';
static const fakeLocation = 'fakeLocation'; static const fakeLocation = 'fakeLocation';
static const noWinner = 'noWinner'; static const noWinner = 'noWinner';
static const myTeam = 'myTeam';
} }

@ -61,11 +61,17 @@ class ChatBubble extends StatelessWidget {
required SingleUserChatModel data, required SingleUserChatModel data,
}) async { }) async {
if (data.voice != null && data.voice!.existsSync()) { if (data.voice != null && data.voice!.existsSync()) {
await data.voiceController!.setFilePath(data!.voice!.path);
await data.voiceController!.setLoopMode(LoopMode.off); await data.voiceController!.setLoopMode(LoopMode.off);
Duration? duration = await data.voiceController!.load(); if (Platform.isIOS) {
await data.voiceController!.seek(duration); Duration? duration = await data.voiceController!.setAudioSource(MyCustomStream(data.voice!.readAsBytesSync()));
await data.voiceController!.play(); await data.voiceController!.seek(duration);
data.voiceController!.play();
} else {
await data.voiceController!.setFilePath(data!.voice!.path);
Duration? duration = await data.voiceController!.load();
await data.voiceController!.seek(duration);
await data.voiceController!.play();
}
} else { } else {
Utils.showLoading(context); Utils.showLoading(context);
Uint8List encodedString = await ChatApiClient().downloadURL(fileName: data.contant!, fileTypeDescription: provider.getFileTypeDescription(data.fileTypeResponse!.fileTypeName ?? "")); Uint8List encodedString = await ChatApiClient().downloadURL(fileName: data.contant!, fileTypeDescription: provider.getFileTypeDescription(data.fileTypeResponse!.fileTypeName ?? ""));
@ -74,13 +80,19 @@ class ChatBubble extends StatelessWidget {
File file = File(path!); File file = File(path!);
await file.readAsBytes(); await file.readAsBytes();
data.voice = file; data.voice = file;
Duration? duration = await data.voiceController!.setFilePath(file.path); if (Platform.isIOS) {
await data.voiceController!.setLoopMode(LoopMode.off); Duration? duration = await data.voiceController!.setAudioSource(MyCustomStream(encodedString));
await data.voiceController!.seek(duration); await data.voiceController!.seek(duration);
await data.voiceController!.setVolume(1.0); data.voiceController!.play();
await data.voiceController!.load(); } else {
Utils.hideLoading(context); Duration? duration = await data.voiceController!.setFilePath(file.path);
await data.voiceController!.play(); await data.voiceController!.setLoopMode(LoopMode.off);
await data.voiceController!.seek(duration);
await data.voiceController!.setVolume(1.0);
await data.voiceController!.load();
Utils.hideLoading(context);
await data.voiceController!.play();
}
} catch (e) { } catch (e) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(e.toString()); Utils.showToast(e.toString());
@ -114,7 +126,7 @@ class ChatBubble extends StatelessWidget {
Widget currentUser(BuildContext context) { Widget currentUser(BuildContext context) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: <Widget>[
if (isReplied) if (isReplied)
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(5.0), borderRadius: BorderRadius.circular(5.0),
@ -200,7 +212,7 @@ class ChatBubble extends StatelessWidget {
), ),
), ),
], ],
).paddingOnly(top: 11, left: 13, right: 13, bottom: 5).objectContainerView(disablePadding: true).paddingOnly(left: MediaQuery.of(context).size.width * 0.3); ).paddingOnly(top: 11, left: 13, right: 13, bottom: 5).objectContainerView(disablePadding: true, radius: 10).paddingOnly(left: MediaQuery.of(context).size.width * 0.3);
} }
Widget receiptUser(BuildContext context) { Widget receiptUser(BuildContext context) {
@ -340,6 +352,7 @@ class ChatBubble extends StatelessWidget {
Widget currentWaveBubble(BuildContext context, SingleUserChatModel data) { Widget currentWaveBubble(BuildContext context, SingleUserChatModel data) {
return Container( return Container(
margin: const EdgeInsets.all(0), margin: const EdgeInsets.all(0),
constraints: const BoxConstraints(),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
left: BorderSide(width: 6, color: isCurrentUser ? MyColors.gradiantStartColor : MyColors.white), left: BorderSide(width: 6, color: isCurrentUser ? MyColors.gradiantStartColor : MyColors.white),
@ -411,7 +424,7 @@ class ChatBubble extends StatelessWidget {
child: const CircularProgressIndicator(), child: const CircularProgressIndicator(),
); );
} else if (playing != true) { } else if (playing != true) {
return Icon( return const Icon(
Icons.play_arrow, Icons.play_arrow,
size: 30, size: 30,
color: MyColors.lightGreenColor, color: MyColors.lightGreenColor,
@ -419,7 +432,7 @@ class ChatBubble extends StatelessWidget {
playVoice(context, data: modelData); playVoice(context, data: modelData);
}); });
} else if (processingState != ProcessingState.completed) { } else if (processingState != ProcessingState.completed) {
return Icon( return const Icon(
Icons.pause, Icons.pause,
size: 30, size: 30,
color: MyColors.lightGreenColor, color: MyColors.lightGreenColor,
@ -427,7 +440,7 @@ class ChatBubble extends StatelessWidget {
pausePlaying(context, data: modelData); pausePlaying(context, data: modelData);
}); });
} else { } else {
return Icon( return const Icon(
Icons.replay, Icons.replay,
size: 30, size: 30,
color: MyColors.lightGreenColor, color: MyColors.lightGreenColor,
@ -439,3 +452,23 @@ class ChatBubble extends StatelessWidget {
); );
} }
} }
// Feed your own stream of bytes into the player
class MyCustomStream extends StreamAudioSource {
final Uint8List bytes;
MyCustomStream(this.bytes);
@override
Future<StreamAudioResponse> request([int? start, int? end]) async {
start ??= 0;
end ??= bytes.length;
return StreamAudioResponse(
sourceLength: bytes.length,
contentLength: end - start,
offset: start,
stream: Stream.value(bytes.sublist(start, end)),
contentType: 'audio/aac',
);
}
}

@ -275,7 +275,6 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
: null, : null,
), ),
onChanged: (String val) { onChanged: (String val) {
print(val.length);
if (val.isNotEmpty) { if (val.isNotEmpty) {
m.isTextMsg = true; m.isTextMsg = true;
} else { } else {

@ -83,7 +83,7 @@ class _ChatHomeState extends State<ChatHome> {
children: <Widget>[ children: <Widget>[
myTab(LocaleKeys.mychats.tr(), 0), myTab(LocaleKeys.mychats.tr(), 0),
myTab(LocaleKeys.favorite.tr(), 1), myTab(LocaleKeys.favorite.tr(), 1),
AppState().getempStatusIsManager ? myTab("My Team", 2) : const SizedBox(), AppState().getempStatusIsManager ? myTab(LocaleKeys.myTeam.tr(), 2) : const SizedBox(),
], ],
), ),
), ),

@ -136,7 +136,6 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
@override @override
void dispose() { void dispose() {
print("// TODO: implement dispose");
super.dispose(); super.dispose();
provider.chatUsersList = []; provider.chatUsersList = [];
provider.pageNo = 1; provider.pageNo = 1;

Loading…
Cancel
Save