This commit is contained in:
otsmr 2025-05-11 14:25:37 +02:00
parent 30a3668eec
commit 98078c5220
8 changed files with 66 additions and 26 deletions

View file

@ -171,7 +171,10 @@ class MessagesDao extends DatabaseAccessor<TwonlyDatabase>
} }
Future deleteMessagesByContactId(int contactId) { Future deleteMessagesByContactId(int contactId) {
return (delete(messages)..where((t) => t.contactId.equals(contactId))).go(); return (delete(messages)
..where((t) =>
t.contactId.equals(contactId) & t.mediaStored.equals(false)))
.go();
} }
Future<bool> containsOtherMessageId( Future<bool> containsOtherMessageId(

View file

@ -137,7 +137,7 @@
"contactNicknameNew": "Neuer Spitzname", "contactNicknameNew": "Neuer Spitzname",
"contactBlock": "Blockieren", "contactBlock": "Blockieren",
"deleteAllContactMessages": "Alle Nachrichten löschen", "deleteAllContactMessages": "Alle Nachrichten löschen",
"deleteAllContactMessagesBody": "Dadurch werden alle Nachrichten in deinem Chat mit {username} gelöscht. Dies löscht NICHT die auf dem Gerät von {username} gespeicherten Nachrichten!", "deleteAllContactMessagesBody": "Dadurch werden alle Nachrichten, ausgenommen gespeicherte Mediendateien, in deinem Chat mit {username} gelöscht. Dies löscht NICHT die auf dem Gerät von {username} gespeicherten Nachrichten!",
"contactBlockTitle": "Blockiere {username}", "contactBlockTitle": "Blockiere {username}",
"contactBlockBody": "Ein blockierter Benutzer kann dir keine Nachrichten mehr senden, und sein Profil ist nicht mehr sichtbar. Um die Blockierung eines Benutzers aufzuheben, navigiere einfach zu Einstellungen > Datenschutz > Blockierte Benutzer.", "contactBlockBody": "Ein blockierter Benutzer kann dir keine Nachrichten mehr senden, und sein Profil ist nicht mehr sichtbar. Um die Blockierung eines Benutzers aufzuheben, navigiere einfach zu Einstellungen > Datenschutz > Blockierte Benutzer.",
"undo": "Rückgängig", "undo": "Rückgängig",

View file

@ -247,7 +247,7 @@
"@contactNicknameNew": {}, "@contactNicknameNew": {},
"deleteAllContactMessages": "Delete all messages", "deleteAllContactMessages": "Delete all messages",
"@deleteAllContactMessages": {}, "@deleteAllContactMessages": {},
"deleteAllContactMessagesBody": "This will remove all messages in your chat with {username}. This will NOT delete the messages stored at {username}s device!", "deleteAllContactMessagesBody": "This will remove all messages, except stored media files, in your chat with {username}. This will NOT delete the messages stored at {username}s device!",
"@deleteAllContactMessagesBody": { "@deleteAllContactMessagesBody": {
"placeholders": { "placeholders": {
"username": {} "username": {}

View file

@ -818,7 +818,7 @@ abstract class AppLocalizations {
/// No description provided for @deleteAllContactMessagesBody. /// No description provided for @deleteAllContactMessagesBody.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'This will remove all messages in your chat with {username}. This will NOT delete the messages stored at {username}s device!'** /// **'This will remove all messages, except stored media files, in your chat with {username}. This will NOT delete the messages stored at {username}s device!'**
String deleteAllContactMessagesBody(Object username); String deleteAllContactMessagesBody(Object username);
/// No description provided for @contactBlock. /// No description provided for @contactBlock.

View file

@ -376,7 +376,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String deleteAllContactMessagesBody(Object username) { String deleteAllContactMessagesBody(Object username) {
return 'Dadurch werden alle Nachrichten in deinem Chat mit $username gelöscht. Dies löscht NICHT die auf dem Gerät von $username gespeicherten Nachrichten!'; return 'Dadurch werden alle Nachrichten, ausgenommen gespeicherte Mediendateien, in deinem Chat mit $username gelöscht. Dies löscht NICHT die auf dem Gerät von $username gespeicherten Nachrichten!';
} }
@override @override

View file

@ -376,7 +376,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String deleteAllContactMessagesBody(Object username) { String deleteAllContactMessagesBody(Object username) {
return 'This will remove all messages in your chat with $username. This will NOT delete the messages stored at ${username}s device!'; return 'This will remove all messages, except stored media files, in your chat with $username. This will NOT delete the messages stored at ${username}s device!';
} }
@override @override

View file

@ -129,9 +129,9 @@ Future handleSingleMediaFile(
} }
try { try {
// delete non compressed media files // delete non compressed media files
await deleteMediaFile(media, "orginal.png"); await deleteMediaFile(media.mediaUploadId, "orginal.png");
await deleteMediaFile(media, "orginal.mp4"); await deleteMediaFile(media.mediaUploadId, "orginal.mp4");
await deleteMediaFile(media, "encrypted"); await deleteMediaFile(media.mediaUploadId, "encrypted");
} catch (e) { } catch (e) {
Logger("media_send.dart").shout("$e"); Logger("media_send.dart").shout("$e");
} }
@ -512,8 +512,8 @@ Future<void> writeMediaFile(
await file.writeAsBytes(data); await file.writeAsBytes(data);
} }
Future<void> deleteMediaFile(MediaUpload media, String type) async { Future<void> deleteMediaFile(int mediaUploadId, String type) async {
String basePath = await getMediaFilePath(media.mediaUploadId, "send"); String basePath = await getMediaFilePath(mediaUploadId, "send");
File file = File("$basePath.$type"); File file = File("$basePath.$type");
if (await file.exists()) { if (await file.exists()) {
await file.delete(); await file.delete();

View file

@ -6,7 +6,7 @@ import 'package:drift/drift.dart' show Value;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';
import 'package:twonly/src/providers/api/media_send.dart'; import 'package:twonly/src/providers/api/media_send.dart' as send;
import 'package:twonly/src/views/components/animate_icon.dart'; import 'package:twonly/src/views/components/animate_icon.dart';
import 'package:twonly/src/views/components/better_text.dart'; import 'package:twonly/src/views/components/better_text.dart';
import 'package:twonly/src/views/components/initialsavatar.dart'; import 'package:twonly/src/views/components/initialsavatar.dart';
@ -17,7 +17,7 @@ import 'package:twonly/src/database/twonly_database.dart';
import 'package:twonly/src/database/tables/messages_table.dart'; import 'package:twonly/src/database/tables/messages_table.dart';
import 'package:twonly/src/model/json/message.dart'; import 'package:twonly/src/model/json/message.dart';
import 'package:twonly/src/providers/api/api.dart'; import 'package:twonly/src/providers/api/api.dart';
import 'package:twonly/src/providers/api/media_received.dart'; import 'package:twonly/src/providers/api/media_received.dart' as received;
import 'package:twonly/src/services/notification_service.dart'; import 'package:twonly/src/services/notification_service.dart';
import 'package:twonly/src/views/camera/camera_send_to_view.dart'; import 'package:twonly/src/views/camera/camera_send_to_view.dart';
import 'package:twonly/src/views/chats/media_viewer_view.dart'; import 'package:twonly/src/views/chats/media_viewer_view.dart';
@ -67,7 +67,7 @@ class _InChatMediaViewerState extends State<InChatMediaViewer> {
Future initAsync() async { Future initAsync() async {
if (!widget.message.mediaStored) return; if (!widget.message.mediaStored) return;
bool isSend = widget.message.messageOtherId == null; bool isSend = widget.message.messageOtherId == null;
final basePath = await getMediaFilePath( final basePath = await send.getMediaFilePath(
isSend ? widget.message.mediaUploadId! : widget.message.messageId, isSend ? widget.message.mediaUploadId! : widget.message.messageId,
isSend ? "send" : "received", isSend ? "send" : "received",
); );
@ -108,18 +108,39 @@ class _InChatMediaViewerState extends State<InChatMediaViewer> {
videoController?.dispose(); videoController?.dispose();
} }
Future deleteFiles() async {
await twonlyDatabase.messagesDao.updateMessageByMessageId(
widget.message.messageId,
MessagesCompanion(mediaStored: Value(false)),
);
await send.purgeSendMediaFiles();
await received.purgeReceivedMediaFiles();
if (context.mounted) {
Navigator.pop(context, true);
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GestureDetector( return GestureDetector(
onTap: () { onTap: (image == null && videoController == null)
if (widget.isInFullscreen) return; ? null
Navigator.push( : () async {
context, if (widget.isInFullscreen) return;
MaterialPageRoute(builder: (context) { bool? removed = await Navigator.push(
return ChatMediaViewerFullScreen(message: widget.message); context,
}), MaterialPageRoute(builder: (context) {
); return ChatMediaViewerFullScreen(message: widget.message);
}, }),
);
if (removed != null && removed) {
image = null;
videoController?.dispose();
videoController = null;
setState(() {});
}
},
child: Stack( child: Stack(
children: [ children: [
if (image != null) Image.file(image!), if (image != null) Image.file(image!),
@ -137,7 +158,23 @@ class _InChatMediaViewerState extends State<InChatMediaViewer> {
[widget.message], [widget.message],
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
), ),
) ),
if (widget.isInFullscreen)
Positioned(
bottom: 10,
left: 0,
right: 0,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
OutlinedButton.icon(
onPressed: deleteFiles,
icon: FaIcon(FontAwesomeIcons.trashCan),
label: Text("Delete media file"),
)
],
),
),
], ],
), ),
); );
@ -348,7 +385,7 @@ class ChatListEntry extends StatelessWidget {
message.mediaStored) { message.mediaStored) {
return; return;
} }
if (await existsMediaFile(message.messageId, "png")) { if (await received.existsMediaFile(message.messageId, "png")) {
encryptAndSendMessage( encryptAndSendMessage(
null, null,
contact.userId, contact.userId,
@ -379,7 +416,7 @@ class ChatListEntry extends StatelessWidget {
}), }),
); );
} else if (message.downloadState == DownloadState.pending) { } else if (message.downloadState == DownloadState.pending) {
startDownloadMedia(message, true); received.startDownloadMedia(message, true);
} }
} }
}, },