diff --git a/lib/src/client.dart b/lib/src/client.dart index 45ae727d..686177be 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -688,9 +688,9 @@ class Client extends MatrixApi { } /// Uploads a file and automatically caches it in the database, if it is small enough - /// and returns the mxc url as a string. + /// and returns the mxc url. @override - Future uploadContent(Uint8List file, + Future uploadContent(Uint8List file, {String filename, String contentType}) async { final mxc = await super .uploadContent(file, filename: filename, contentType: contentType); @@ -721,7 +721,7 @@ class Client extends MatrixApi { /// Uploads a new user avatar for this user. Future setAvatar(MatrixFile file) async { final uploadResp = await uploadContent(file.bytes, filename: file.name); - await setAvatarUrl(userID, Uri.parse(uploadResp)); + await setAvatarUrl(userID, uploadResp); return; } diff --git a/lib/src/database/database_api.dart b/lib/src/database/database_api.dart index d1065ad3..fa7c2266 100644 --- a/lib/src/database/database_api.dart +++ b/lib/src/database/database_api.dart @@ -81,9 +81,9 @@ abstract class DatabaseApi { Future> getEventList(int clientId, Room room); - Future getFile(String mxcUri); + Future getFile(Uri mxcUri); - Future storeFile(String mxcUri, Uint8List bytes, int time); + Future storeFile(Uri mxcUri, Uint8List bytes, int time); Future storeSyncFilterId(String syncFilterId, int clientId); diff --git a/lib/src/database/hive_database.dart b/lib/src/database/hive_database.dart index 92c2f030..5752caa6 100644 --- a/lib/src/database/hive_database.dart +++ b/lib/src/database/hive_database.dart @@ -329,7 +329,7 @@ class FamedlySdkHiveDatabase extends DatabaseApi { } @override - Future getFile(String mxcUri) async { + Future getFile(Uri mxcUri) async { return null; } @@ -869,7 +869,7 @@ class FamedlySdkHiveDatabase extends DatabaseApi { } @override - Future storeFile(String mxcUri, Uint8List bytes, int time) async { + Future storeFile(Uri mxcUri, Uint8List bytes, int time) async { return; } diff --git a/lib/src/event.dart b/lib/src/event.dart index ffdb006c..0d3c478b 100644 --- a/lib/src/event.dart +++ b/lib/src/event.dart @@ -401,16 +401,16 @@ class Event extends MatrixEvent { : ''); /// Gets the underyling mxc url of an attachment of a file event, or null if not present - String get attachmentMxcUrl => - isAttachmentEncrypted ? content['file']['url'] : content['url']; + Uri get attachmentMxcUrl => Uri.parse( + isAttachmentEncrypted ? content['file']['url'] : content['url']); /// Gets the underyling mxc url of a thumbnail of a file event, or null if not present - String get thumbnailMxcUrl => isThumbnailEncrypted + Uri get thumbnailMxcUrl => Uri.parse(isThumbnailEncrypted ? infoMap['thumbnail_file']['url'] - : infoMap['thumbnail_url']; + : infoMap['thumbnail_url']); /// Gets the mxc url of an attachemnt/thumbnail of a file event, taking sizes into account, or null if not present - String attachmentOrThumbnailMxcUrl({bool getThumbnail = false}) { + Uri attachmentOrThumbnailMxcUrl({bool getThumbnail = false}) { if (getThumbnail && infoMap['size'] is int && thumbnailInfoMap['size'] is int && @@ -479,8 +479,8 @@ class Event extends MatrixEvent { throw ("This event has the type '$type' and so it can't contain an attachment."); } final mxcUrl = attachmentOrThumbnailMxcUrl(getThumbnail: getThumbnail); - if (!(mxcUrl is String)) { - throw ("This event hasn't any attachment or thumbnail."); + if (mxcUrl == null) { + throw "This event hasn't any attachment or thumbnail."; } getThumbnail = mxcUrl != attachmentMxcUrl; // Is this file storeable? @@ -507,8 +507,8 @@ class Event extends MatrixEvent { throw ("This event has the type '$type' and so it can't contain an attachment."); } final mxcUrl = attachmentOrThumbnailMxcUrl(getThumbnail: getThumbnail); - if (!(mxcUrl is String)) { - throw ("This event hasn't any attachment or thumbnail."); + if (mxcUrl == null) { + throw "This event hasn't any attachment or thumbnail."; } getThumbnail = mxcUrl != attachmentMxcUrl; final isEncrypted = @@ -517,7 +517,6 @@ class Event extends MatrixEvent { if (isEncrypted && !room.client.encryptionEnabled) { throw ('Encryption is not enabled in your Client.'); } - final mxContent = Uri.parse(mxcUrl); Uint8List uint8list; @@ -528,7 +527,7 @@ class Event extends MatrixEvent { thisInfoMap['size'] <= room.client.database.maxFileSize; if (storeable) { - uint8list = await room.client.database.getFile(mxContent.toString()); + uint8list = await room.client.database.getFile(mxcUrl); } // Download the file @@ -536,13 +535,12 @@ class Event extends MatrixEvent { downloadCallback ??= (Uri url) async { return (await http.get(url)).bodyBytes; }; - uint8list = - await downloadCallback(mxContent.getDownloadLink(room.client)); + uint8list = await downloadCallback(mxcUrl.getDownloadLink(room.client)); storeable = storeable && uint8list.lengthInBytes < room.client.database.maxFileSize; if (storeable) { - await room.client.database.storeFile(mxContent.toString(), uint8list, - DateTime.now().millisecondsSinceEpoch); + await room.client.database.storeFile( + mxcUrl, uint8list, DateTime.now().millisecondsSinceEpoch); } } diff --git a/lib/src/room.dart b/lib/src/room.dart index 09d5a5da..2284f5de 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -630,7 +630,7 @@ class Room { /// the message event has received the server. Otherwise the future will only /// wait until the file has been uploaded. /// Optionally specify [extraContent] to tack on to the event. - Future sendFileEvent( + Future sendFileEvent( MatrixFile file, { String txid, Event inReplyTo, @@ -670,10 +670,10 @@ class Room { 'msgtype': file.msgType, 'body': file.name, 'filename': file.name, - if (encryptedFile == null) 'url': uploadResp, + if (encryptedFile == null) 'url': uploadResp.toString(), if (encryptedFile != null) 'file': { - 'url': uploadResp, + 'url': uploadResp.toString(), 'mimetype': file.mimeType, 'v': 'v2', 'key': { @@ -692,7 +692,7 @@ class Room { 'thumbnail_url': thumbnailUploadResp, if (thumbnail != null && encryptedThumbnail != null) 'thumbnail_file': { - 'url': thumbnailUploadResp, + 'url': thumbnailUploadResp.toString(), 'mimetype': thumbnail.mimeType, 'v': 'v2', 'key': { @@ -1322,7 +1322,7 @@ class Room { id, EventTypes.RoomAvatar, '', - {'url': uploadResp}, + {'url': uploadResp.toString()}, ); } diff --git a/pubspec.yaml b/pubspec.yaml index 7b2caa3c..f52b1fff 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: crypto: ^3.0.0 base58check: ^2.0.0 olm: ^2.0.0 - matrix_api_lite: ^0.4.1 + matrix_api_lite: ^0.4.2 hive: ^2.0.4 ffi: ^1.0.0 js: ^0.6.3 diff --git a/test/client_test.dart b/test/client_test.dart index 88e14d7a..a8010055 100644 --- a/test/client_test.dart +++ b/test/client_test.dart @@ -645,7 +645,7 @@ void main() { final client = await getClient(); final response = await client.uploadContent(Uint8List(0), filename: 'file.jpeg'); - expect(response, 'mxc://example.com/AQwafuaFswefuhsfAFAgsw'); + expect(response.toString(), 'mxc://example.com/AQwafuaFswefuhsfAFAgsw'); expect(await client.database.getFile(response) != null, client.database.supportsFileStoring); await client.dispose(closeDatabase: true); diff --git a/test/database_api_test.dart b/test/database_api_test.dart index 94fe12c0..12fc5a4d 100644 --- a/test/database_api_test.dart +++ b/test/database_api_test.dart @@ -67,16 +67,17 @@ void testDatabase(Future futureDatabase, int clientId) { expect(toDeviceQueue.isEmpty, true); }); test('storeFile', () async { - await database.storeFile('mxc://test', Uint8List.fromList([0]), 0); - final file = await database.getFile('mxc://test'); + await database.storeFile( + Uri.parse('mxc://test'), Uint8List.fromList([0]), 0); + final file = await database.getFile(Uri.parse('mxc://test')); expect(file != null, database.supportsFileStoring); }); test('getFile', () async { - await database.getFile('mxc://test'); + await database.getFile(Uri.parse('mxc://test')); }); test('deleteOldFiles', () async { await database.deleteOldFiles(1); - final file = await database.getFile('mxc://test'); + final file = await database.getFile(Uri.parse('mxc://test')); expect(file == null, true); }); test('storeRoomUpdate', () async { diff --git a/test/event_test.dart b/test/event_test.dart index 73160904..7349c60a 100644 --- a/test/event_test.dart +++ b/test/event_test.dart @@ -1090,8 +1090,9 @@ void main() { var buffer = await event.downloadAndDecryptAttachment( downloadCallback: downloadCallback); expect(buffer.bytes, FILE_BUFF); - expect(event.attachmentOrThumbnailMxcUrl(), 'mxc://example.org/file'); - expect(event.attachmentOrThumbnailMxcUrl(getThumbnail: true), + expect(event.attachmentOrThumbnailMxcUrl().toString(), + 'mxc://example.org/file'); + expect(event.attachmentOrThumbnailMxcUrl(getThumbnail: true).toString(), 'mxc://example.org/file'); event = Event.fromJson({ @@ -1118,10 +1119,11 @@ void main() { expect(event.isThumbnailEncrypted, false); expect(event.attachmentMimetype, 'application/octet-stream'); expect(event.thumbnailMimetype, 'thumbnail/mimetype'); - expect(event.attachmentMxcUrl, 'mxc://example.org/file'); - expect(event.thumbnailMxcUrl, 'mxc://example.org/thumb'); - expect(event.attachmentOrThumbnailMxcUrl(), 'mxc://example.org/file'); - expect(event.attachmentOrThumbnailMxcUrl(getThumbnail: true), + expect(event.attachmentMxcUrl.toString(), 'mxc://example.org/file'); + expect(event.thumbnailMxcUrl.toString(), 'mxc://example.org/thumb'); + expect(event.attachmentOrThumbnailMxcUrl().toString(), + 'mxc://example.org/file'); + expect(event.attachmentOrThumbnailMxcUrl(getThumbnail: true).toString(), 'mxc://example.org/thumb'); expect(event.getAttachmentUrl().toString(), 'https://fakeserver.notexisting/_matrix/media/r0/download/example.org/file'); @@ -1238,8 +1240,8 @@ void main() { expect(event.isThumbnailEncrypted, true); expect(event.attachmentMimetype, 'text/plain'); expect(event.thumbnailMimetype, 'text/plain'); - expect(event.attachmentMxcUrl, 'mxc://example.com/file'); - expect(event.thumbnailMxcUrl, 'mxc://example.com/thumb'); + expect(event.attachmentMxcUrl.toString(), 'mxc://example.com/file'); + expect(event.thumbnailMxcUrl.toString(), 'mxc://example.com/thumb'); buffer = await event.downloadAndDecryptAttachment( downloadCallback: downloadCallback); expect(buffer.bytes, FILE_BUFF_DEC); diff --git a/test/room_test.dart b/test/room_test.dart index c3956cb3..28fb6777 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -587,7 +587,7 @@ void main() { test('sendFileEvent', () async { final testFile = MatrixFile(bytes: Uint8List(0), name: 'file.jpeg'); final dynamic resp = await room.sendFileEvent(testFile, txid: 'testtxid'); - expect(resp, 'mxc://example.com/AQwafuaFswefuhsfAFAgsw'); + expect(resp.toString(), 'mxc://example.com/AQwafuaFswefuhsfAFAgsw'); }); test('pushRuleState', () async {