1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-22 21:09:21 +00:00

Simplify conversation files appearance

This commit is contained in:
Pierre HUBERT 2021-03-11 00:13:05 +01:00
parent 1f1ed0cda4
commit 52d217a89c
5 changed files with 3 additions and 194 deletions

View File

@ -1,46 +0,0 @@
import 'dart:io';
import 'package:comunic/models/conversation_message.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
/// Conversation files helper
///
/// @author Pierre Hubert
class ConversationFilesHelper {
/// Get the path for chat file
static Future<File> getPathForChatFile(
int msgID, ConversationMessageFile fileInfo) async {
Directory basePath = await getTemporaryDirectory();
final storageDir = path.join(basePath.absolute.path, "conversation-files");
final fileName = "$msgID";
return File(path.join(storageDir, fileName));
}
/// Download chat file
static Future<void> download({
@required int msgID,
@required ConversationMessageFile fileInfo,
@required Function(double) onProgress,
@required CancelToken cancelToken,
}) async {
final target = await getPathForChatFile(msgID, fileInfo);
// Create parent directory if required
if (!await target.parent.exists()) {
await target.parent.create(recursive: true);
}
await Dio().download(
fileInfo.url,
target.path,
cancelToken: cancelToken,
onReceiveProgress: (p, t) => onProgress(p / fileInfo.size.toDouble()),
);
}
}

View File

@ -78,8 +78,6 @@ class ConversationMessageFile {
bool get hasThumbnail => thumbnail != null; bool get hasThumbnail => thumbnail != null;
bool get downloadable => fileType == ConversationMessageFileType.AUDIO;
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"url": url, "url": url,
"size": size, "size": size,

View File

@ -1,19 +1,8 @@
/// Chat file tile /// Chat file tile
/// ///
/// @author Pierre Hubert /// @author Pierre Hubert
import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:comunic/helpers/conversation_files_helper.dart';
import 'package:comunic/models/conversation_message.dart'; import 'package:comunic/models/conversation_message.dart';
import 'package:comunic/ui/widgets/async_screen_widget.dart';
import 'package:comunic/ui/widgets/audio_player_widget.dart';
import 'package:comunic/ui/widgets/network_image_widget.dart'; import 'package:comunic/ui/widgets/network_image_widget.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/log_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:dio/dio.dart';
import 'package:filesize/filesize.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
@ -36,131 +25,13 @@ class ConversationFileWidget extends StatefulWidget {
} }
class _ConversationFileWidgetState extends State<ConversationFileWidget> { class _ConversationFileWidgetState extends State<ConversationFileWidget> {
final _refreshKey = GlobalKey<AsyncScreenWidgetState>();
File _targetFile;
bool _isDownloaded;
bool _downloading = false;
var _downloadProgress = 0.0;
CancelToken _cancelDownloadToken;
ConversationMessageFile get file => widget.file; ConversationMessageFile get file => widget.file;
Future<void> _refresh() async {
_targetFile = await ConversationFilesHelper.getPathForChatFile(
widget.messageID, file);
_isDownloaded = await _targetFile.exists();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) =>
return Container( Container(width: _AreaSize, height: _AreaSize, child: _buildContent());
width: _AreaSize,
height: _AreaSize,
child: AsyncScreenWidget(
key: _refreshKey,
onReload: _refresh,
onBuild: _buildContent,
errorMessage: tr("Error!"),
),
);
}
Widget _buildContent() => _isDownloaded || !file.downloadable Widget _buildContent() {
? _buildFileWidget()
: _buildDownloadWidget();
Widget _buildDownloadWidget() => Stack(
children: <Widget>[
// Thumbnail, if possible
!file.hasThumbnail
? Container()
: CachedNetworkImage(
imageUrl: file.thumbnail,
width: _AreaSize,
height: _AreaSize,
fit: BoxFit.fill,
),
Container(
width: _AreaSize,
color: Color(0x66000000),
child: DefaultTextStyle(
style: TextStyle(color: Colors.white),
child: Column(
children: <Widget>[
Spacer(),
Icon(file.icon, color: Colors.white),
Spacer(),
_buildDownloadArea(),
Spacer(),
Text(filesize(file.size)),
Spacer(),
],
),
),
)
],
);
Widget _buildDownloadArea() => _downloading
? _buildDownloadingWidget()
: Material(
borderRadius: BorderRadius.all(Radius.circular(2.0)),
color: Colors.green,
child: IconButton(
icon: Icon(Icons.file_download),
onPressed: _downloadFile,
color: Colors.white,
),
);
Widget _buildDownloadingWidget() => Container(
width: 36,
height: 36,
child: Stack(
children: <Widget>[
CircularProgressIndicator(value: _downloadProgress),
Center(
child: InkWell(
onTap: () => _cancelDownloadToken.cancel(),
child: Icon(Icons.cancel, color: Colors.white),
),
)
],
),
);
Future<void> _downloadFile() async {
try {
setState(() {
_cancelDownloadToken = CancelToken();
_downloading = true;
_downloadProgress = 0.0;
});
await ConversationFilesHelper.download(
msgID: widget.messageID,
fileInfo: file,
onProgress: (p) => setState(() => _downloadProgress = p),
cancelToken: _cancelDownloadToken,
);
await _refreshKey.currentState.refresh();
} catch (e, s) {
logError(e, s);
showSimpleSnack(context, tr("Failed to download file!"));
}
setState(() {
_downloading = false;
});
}
Widget _buildFileWidget() {
switch (file.fileType) { switch (file.fileType) {
// Images // Images
case ConversationMessageFileType.IMAGE: case ConversationMessageFileType.IMAGE:
@ -172,10 +43,6 @@ class _ConversationFileWidgetState extends State<ConversationFileWidget> {
), ),
); );
// Audio player
case ConversationMessageFileType.AUDIO:
return AudioPlayerWidget(_targetFile);
// The file is not downloadable, we open it in the browser // The file is not downloadable, we open it in the browser
default: default:
return Center( return Center(

View File

@ -22,13 +22,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.5.0-nullsafety.1" version: "2.5.0-nullsafety.1"
audioplayers:
dependency: "direct main"
description:
name: audioplayers
url: "https://pub.dartlang.org"
source: hosted
version: "0.15.1"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:

View File

@ -91,9 +91,6 @@ dependencies:
# Version manager # Version manager
version: ^1.2.0 version: ^1.2.0
# Play audio files
audioplayers: ^0.15.1
# Get path to temporary files # Get path to temporary files
path_provider: ^1.6.27 path_provider: ^1.6.27