mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-01-15 16:48:41 +00:00
fix #147
This commit is contained in:
parent
30a3668eec
commit
98078c5220
8 changed files with 66 additions and 26 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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": {}
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue