mirror of
https://gitlab.com/comunic/comunicmobile
synced 2025-06-19 08:15:16 +00:00
Integrate an audio player in the application
This commit is contained in:
82
lib/ui/dialogs/audio_player_dialog.dart
Normal file
82
lib/ui/dialogs/audio_player_dialog.dart
Normal file
@ -0,0 +1,82 @@
|
||||
import 'package:chewie_audio/chewie_audio.dart';
|
||||
import 'package:comunic/ui/widgets/async_screen_widget.dart';
|
||||
import 'package:comunic/utils/intl_utils.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:video_player/video_player.dart';
|
||||
|
||||
/// Audio player dialog
|
||||
///
|
||||
/// @author Pierre Hubert
|
||||
|
||||
/// Show audio player dialog
|
||||
Future<void> showAudioPlayerDialog(BuildContext context, String url) async {
|
||||
showDialog(context: context, builder: (c) => _AudioPlayerDialog(url: url));
|
||||
}
|
||||
|
||||
class _AudioPlayerDialog extends StatefulWidget {
|
||||
final String url;
|
||||
|
||||
const _AudioPlayerDialog({
|
||||
Key key,
|
||||
@required this.url,
|
||||
}) : assert(url != null),
|
||||
super(key: key);
|
||||
|
||||
@override
|
||||
__AudioPlayerDialogState createState() => __AudioPlayerDialogState();
|
||||
}
|
||||
|
||||
class __AudioPlayerDialogState extends State<_AudioPlayerDialog> {
|
||||
VideoPlayerController _videoPlayerController;
|
||||
ChewieAudioController _chewieAudioController;
|
||||
|
||||
Future<void> _initialize() async {
|
||||
_videoPlayerController = VideoPlayerController.network(widget.url);
|
||||
|
||||
await _videoPlayerController.initialize();
|
||||
|
||||
_chewieAudioController = ChewieAudioController(
|
||||
videoPlayerController: _videoPlayerController,
|
||||
autoPlay: true,
|
||||
looping: false,
|
||||
);
|
||||
}
|
||||
|
||||
void _closeDialog() {
|
||||
Navigator.pop(context);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
if (_videoPlayerController != null) _videoPlayerController.dispose();
|
||||
if (_chewieAudioController != null) _chewieAudioController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text(tr("Audio Player")),
|
||||
content: _buildContent(),
|
||||
actions: [
|
||||
MaterialButton(
|
||||
onPressed: _closeDialog,
|
||||
child: Text(tr("Close").toUpperCase()),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildContent() => ConstrainedBox(
|
||||
constraints: BoxConstraints(maxHeight: 300, maxWidth: 500),
|
||||
child: AsyncScreenWidget(
|
||||
onReload: _initialize,
|
||||
onBuild: _buildReadyContent,
|
||||
errorMessage: tr("Failed to initialize audio player!"),
|
||||
),
|
||||
);
|
||||
|
||||
Widget _buildReadyContent() =>
|
||||
ChewieAudio(controller: _chewieAudioController);
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
///
|
||||
/// @author Pierre Hubert
|
||||
import 'package:comunic/models/conversation_message.dart';
|
||||
import 'package:comunic/ui/dialogs/audio_player_dialog.dart';
|
||||
import 'package:comunic/ui/widgets/network_image_widget.dart';
|
||||
import 'package:filesize/filesize.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@ -47,7 +48,7 @@ class _ConversationFileWidgetState extends State<ConversationFileWidget> {
|
||||
),
|
||||
);
|
||||
|
||||
// The file is not downloadable, we open it in the browser
|
||||
// We open it in the browser
|
||||
default:
|
||||
return Container(
|
||||
color: widget.defaultBackgroundColor,
|
||||
@ -69,11 +70,22 @@ class _ConversationFileWidgetState extends State<ConversationFileWidget> {
|
||||
Spacer(flex: 2),
|
||||
],
|
||||
),
|
||||
onPressed: () => launch(file.url),
|
||||
onPressed: _openFile,
|
||||
),
|
||||
),
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void _openFile() {
|
||||
switch (file.fileType) {
|
||||
case ConversationMessageFileType.AUDIO:
|
||||
showAudioPlayerDialog(context, file.url);
|
||||
break;
|
||||
|
||||
default:
|
||||
launch(file.url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user