From 774ab15c7de51e3e909d3bc0af69408457068e12 Mon Sep 17 00:00:00 2001 From: sherlock Date: Thu, 26 Oct 2023 14:58:44 +0700 Subject: [PATCH 1/6] TW-746: support get and store fileEntity in database --- lib/src/database/database_api.dart | 5 +++++ lib/src/database/hive_collections_database.dart | 11 +++++++++++ lib/src/database/hive_database.dart | 11 +++++++++++ lib/src/event.dart | 16 ++++++++++------ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/lib/src/database/database_api.dart b/lib/src/database/database_api.dart index 549265597..d6e99be70 100644 --- a/lib/src/database/database_api.dart +++ b/lib/src/database/database_api.dart @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import 'dart:io'; import 'dart:typed_data'; import 'package:matrix/encryption/utils/olm_session.dart'; @@ -97,8 +98,12 @@ abstract class DatabaseApi { Future getFile(Uri mxcUri); + Future getFileEntity(Uri mxcUri); + Future storeFile(Uri mxcUri, Uint8List bytes, int time); + Future storeFileEntity(Uri mxcUri, File file, int time); + Future storeSyncFilterId( String syncFilterId, ); diff --git a/lib/src/database/hive_collections_database.dart b/lib/src/database/hive_collections_database.dart index 9fdbf0b5e..3c214ed77 100644 --- a/lib/src/database/hive_collections_database.dart +++ b/lib/src/database/hive_collections_database.dart @@ -18,6 +18,7 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; @@ -461,6 +462,11 @@ class HiveCollectionsDatabase extends DatabaseApi { return null; } + @override + Future getFileEntity(Uri mxcUri) async { + return null; + } + @override Future getInboundGroupSession( String roomId, @@ -1203,6 +1209,11 @@ class HiveCollectionsDatabase extends DatabaseApi { return; } + @override + Future storeFileEntity(Uri mxcUri, File file, int time) async { + return; + } + @override Future storeInboundGroupSession( String roomId, diff --git a/lib/src/database/hive_database.dart b/lib/src/database/hive_database.dart index 388633d6a..c9dbc0e51 100644 --- a/lib/src/database/hive_database.dart +++ b/lib/src/database/hive_database.dart @@ -18,6 +18,7 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; @@ -1135,6 +1136,11 @@ class FamedlySdkHiveDatabase extends DatabaseApi { return; } + @override + Future storeFileEntity(Uri mxcUri, File file, int time) async { + + } + @override Future storeInboundGroupSession( String roomId, @@ -1466,6 +1472,11 @@ class FamedlySdkHiveDatabase extends DatabaseApi { // see no need to implement this in a deprecated part throw UnimplementedError(); } + + @override + Future getFileEntity(Uri mxcUri) { + throw UnimplementedError(); + } } dynamic _castValue(dynamic value) { diff --git a/lib/src/event.dart b/lib/src/event.dart index 01445e4f5..ca82e8e40 100644 --- a/lib/src/event.dart +++ b/lib/src/event.dart @@ -588,6 +588,14 @@ class Event extends MatrixEvent { return uint8list != null; } + bool isFileStoreable({bool getThumbnail = false}) { + final database = room.client.database; + final thisInfoMap = getThumbnail ? thumbnailInfoMap : infoMap; + return database != null && + thisInfoMap['size'] is int && + thisInfoMap['size'] <= database.maxFileSize; + } + /// Downloads (and decrypts if necessary) the attachment of this /// event and returns it as a [MatrixFile]. If this event doesn't /// contain an attachment, this throws an error. Set [getThumbnail] to @@ -613,12 +621,8 @@ class Event extends MatrixEvent { if (isEncrypted && !room.client.encryptionEnabled) { throw ('Encryption is not enabled in your Client.'); } - - // Is this file storeable? - final thisInfoMap = getThumbnail ? thumbnailInfoMap : infoMap; - var storeable = database != null && - thisInfoMap['size'] is int && - thisInfoMap['size'] <= database.maxFileSize; + + var storeable = isFileStoreable(getThumbnail: getThumbnail); Uint8List? uint8list; if (storeable) { From e07f744e999385d334ce359407c5fa34c742cab1 Mon Sep 17 00:00:00 2001 From: sherlock Date: Fri, 27 Oct 2023 15:42:28 +0700 Subject: [PATCH 2/6] TW-746: add progressCallback for File --- lib/src/utils/models/file_info.dart | 11 ++++++++++- lib/src/utils/models/image_file_info.dart | 4 +++- lib/src/utils/models/video_file_info.dart | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/src/utils/models/file_info.dart b/lib/src/utils/models/file_info.dart index 0d636fc9e..178c93cc9 100644 --- a/lib/src/utils/models/file_info.dart +++ b/lib/src/utils/models/file_info.dart @@ -5,13 +5,22 @@ import 'package:equatable/equatable.dart'; import 'package:matrix/matrix.dart'; import 'package:mime/mime.dart'; +typedef ProgressCallback = void Function(int count, int total); + class FileInfo with EquatableMixin { final String fileName; final String filePath; final int fileSize; final Stream>? readStream; + final ProgressCallback? progressCallback; - FileInfo(this.fileName, this.filePath, this.fileSize, {this.readStream}); + FileInfo( + this.fileName, + this.filePath, + this.fileSize,{ + this.readStream, + this.progressCallback, + }); factory FileInfo.empty() { return FileInfo('', '', 0); diff --git a/lib/src/utils/models/image_file_info.dart b/lib/src/utils/models/image_file_info.dart index 279669eac..a3098ed05 100644 --- a/lib/src/utils/models/image_file_info.dart +++ b/lib/src/utils/models/image_file_info.dart @@ -3,8 +3,10 @@ import 'package:matrix/matrix.dart'; class ImageFileInfo extends FileInfo { ImageFileInfo( super.fileName, - super.filePath, + super.filePath, super.fileSize, { + super.readStream, + super.progressCallback, this.width, this.height, } diff --git a/lib/src/utils/models/video_file_info.dart b/lib/src/utils/models/video_file_info.dart index 5b67cfa88..a6f731a98 100644 --- a/lib/src/utils/models/video_file_info.dart +++ b/lib/src/utils/models/video_file_info.dart @@ -15,6 +15,8 @@ class VideoFileInfo extends FileInfo { super.fileName, super.filePath, super.fileSize, { + super.progressCallback, + super.readStream, required this.imagePlaceholderBytes, this.width, this.height, From b9502e1193226f0b1d60f97979921c2d7061e9a2 Mon Sep 17 00:00:00 2001 From: sherlock Date: Tue, 31 Oct 2023 09:50:50 +0700 Subject: [PATCH 3/6] fix crash app when decrypt files --- lib/src/utils/crypto/native.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/utils/crypto/native.dart b/lib/src/utils/crypto/native.dart index 8b713eeb8..675717983 100644 --- a/lib/src/utils/crypto/native.dart +++ b/lib/src/utils/crypto/native.dart @@ -217,7 +217,7 @@ abstract class Cipher { final intPointer = memNeeded.cast(); final keyPointer = memNeeded.elementAt(sizeOf()); final initialVectorPointer = keyPointer.elementAt(keyDecoded.length); - final hashValuePointer = initialVectorPointer.elementAt(maxHashSize); + final hashValuePointer = initialVectorPointer.elementAt(initialVectorDecoded.length); final hashSizePointer = hashValuePointer.elementAt(maxHashSize); IOSink? outIoSink; From 7655bab485acc05b240125f2f334cf1eb6f60c85 Mon Sep 17 00:00:00 2001 From: sherlock Date: Wed, 1 Nov 2023 10:36:01 +0700 Subject: [PATCH 4/6] TW-746: remove double in image, video resolution --- lib/src/utils/matrix_file.dart | 8 ++++---- lib/src/utils/models/image_file_info.dart | 4 ++-- lib/src/utils/models/video_file_info.dart | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/src/utils/matrix_file.dart b/lib/src/utils/matrix_file.dart index ffb17c164..04d54cc6f 100644 --- a/lib/src/utils/matrix_file.dart +++ b/lib/src/utils/matrix_file.dart @@ -77,8 +77,8 @@ class MatrixFile { mimeType: fileInfo.mimeType, filePath: fileInfo.filePath, bytes: null, - width: (fileInfo.metadata['w'] as double?)?.toInt(), - height: (fileInfo.metadata['h'] as double?)?.toInt(), + width: fileInfo.metadata['w'], + height: fileInfo.metadata['h'], ); } if (msgType == MessageTypes.Video) { @@ -89,8 +89,8 @@ class MatrixFile { name: fileInfo.fileName, mimeType: fileInfo.mimeType, filePath: fileInfo.filePath, - width: (fileInfo.metadata['w'] as double?)?.toInt(), - height: (fileInfo.metadata['h'] as double?)?.toInt(), + width: fileInfo.metadata['w'], + height: fileInfo.metadata['h'], duration: fileInfo.metadata['duration'], ); } diff --git a/lib/src/utils/models/image_file_info.dart b/lib/src/utils/models/image_file_info.dart index a3098ed05..cab4b4037 100644 --- a/lib/src/utils/models/image_file_info.dart +++ b/lib/src/utils/models/image_file_info.dart @@ -20,8 +20,8 @@ class ImageFileInfo extends FileInfo { Map get metadata => ({ 'mimetype': mimeType, 'size': fileSize, - 'w': width?.toDouble(), - 'h': height?.toDouble(), + 'w': width, + 'h': height, }); @override diff --git a/lib/src/utils/models/video_file_info.dart b/lib/src/utils/models/video_file_info.dart index a6f731a98..fb7cd0ad7 100644 --- a/lib/src/utils/models/video_file_info.dart +++ b/lib/src/utils/models/video_file_info.dart @@ -27,8 +27,8 @@ class VideoFileInfo extends FileInfo { Map get metadata => ({ 'mimetype': mimeType, 'size': fileSize, - 'w': width?.toDouble(), - 'h': height?.toDouble(), + 'w': width, + 'h': height, if (duration != null) 'duration': duration!.inMilliseconds, }); From 8a73d0a0278e3f37afc246122ebe4bccec038798 Mon Sep 17 00:00:00 2001 From: sherlock Date: Wed, 1 Nov 2023 17:53:48 +0700 Subject: [PATCH 5/6] remove unused method --- lib/src/database/database_api.dart | 2 -- lib/src/database/hive_collections_database.dart | 5 ----- lib/src/database/hive_database.dart | 5 ----- 3 files changed, 12 deletions(-) diff --git a/lib/src/database/database_api.dart b/lib/src/database/database_api.dart index d6e99be70..bb05b16c6 100644 --- a/lib/src/database/database_api.dart +++ b/lib/src/database/database_api.dart @@ -102,8 +102,6 @@ abstract class DatabaseApi { Future storeFile(Uri mxcUri, Uint8List bytes, int time); - Future storeFileEntity(Uri mxcUri, File file, int time); - Future storeSyncFilterId( String syncFilterId, ); diff --git a/lib/src/database/hive_collections_database.dart b/lib/src/database/hive_collections_database.dart index 3c214ed77..123e90470 100644 --- a/lib/src/database/hive_collections_database.dart +++ b/lib/src/database/hive_collections_database.dart @@ -1209,11 +1209,6 @@ class HiveCollectionsDatabase extends DatabaseApi { return; } - @override - Future storeFileEntity(Uri mxcUri, File file, int time) async { - return; - } - @override Future storeInboundGroupSession( String roomId, diff --git a/lib/src/database/hive_database.dart b/lib/src/database/hive_database.dart index c9dbc0e51..dbf46ee90 100644 --- a/lib/src/database/hive_database.dart +++ b/lib/src/database/hive_database.dart @@ -1136,11 +1136,6 @@ class FamedlySdkHiveDatabase extends DatabaseApi { return; } - @override - Future storeFileEntity(Uri mxcUri, File file, int time) async { - - } - @override Future storeInboundGroupSession( String roomId, From c4d139570f8126d4cd8b6f24fcae5f09f70a1329 Mon Sep 17 00:00:00 2001 From: sherlock Date: Wed, 1 Nov 2023 18:10:33 +0700 Subject: [PATCH 6/6] fixup! remove unused method --- lib/src/utils/models/file_info.dart | 4 ---- lib/src/utils/models/image_file_info.dart | 1 - lib/src/utils/models/video_file_info.dart | 1 - 3 files changed, 6 deletions(-) diff --git a/lib/src/utils/models/file_info.dart b/lib/src/utils/models/file_info.dart index 178c93cc9..fc50697e6 100644 --- a/lib/src/utils/models/file_info.dart +++ b/lib/src/utils/models/file_info.dart @@ -5,21 +5,17 @@ import 'package:equatable/equatable.dart'; import 'package:matrix/matrix.dart'; import 'package:mime/mime.dart'; -typedef ProgressCallback = void Function(int count, int total); - class FileInfo with EquatableMixin { final String fileName; final String filePath; final int fileSize; final Stream>? readStream; - final ProgressCallback? progressCallback; FileInfo( this.fileName, this.filePath, this.fileSize,{ this.readStream, - this.progressCallback, }); factory FileInfo.empty() { diff --git a/lib/src/utils/models/image_file_info.dart b/lib/src/utils/models/image_file_info.dart index cab4b4037..05423ad0b 100644 --- a/lib/src/utils/models/image_file_info.dart +++ b/lib/src/utils/models/image_file_info.dart @@ -6,7 +6,6 @@ class ImageFileInfo extends FileInfo { super.filePath, super.fileSize, { super.readStream, - super.progressCallback, this.width, this.height, } diff --git a/lib/src/utils/models/video_file_info.dart b/lib/src/utils/models/video_file_info.dart index fb7cd0ad7..8eeb430a2 100644 --- a/lib/src/utils/models/video_file_info.dart +++ b/lib/src/utils/models/video_file_info.dart @@ -15,7 +15,6 @@ class VideoFileInfo extends FileInfo { super.fileName, super.filePath, super.fileSize, { - super.progressCallback, super.readStream, required this.imagePlaceholderBytes, this.width,