From 6f5ebe468102ddd38649c13a1b5152eb17e40b7b Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Fri, 24 Apr 2020 09:24:06 +0200 Subject: [PATCH] [MxContent] Switch to Uri Extension --- lib/famedlysdk.dart | 2 +- lib/src/event.dart | 8 +++--- lib/src/presence.dart | 8 +++--- lib/src/room.dart | 10 +++---- lib/src/timeline.dart | 2 +- lib/src/user.dart | 7 +++-- lib/src/utils/profile.dart | 8 +++--- .../{mx_content.dart => uri_extension.dart} | 27 +++++++------------ test/client_test.dart | 4 +-- ..._test.dart => mxc_uri_extension_test.dart} | 13 +++------ test/presence_test.dart | 4 +-- test/room_test.dart | 6 ++--- test/user_test.dart | 2 +- 13 files changed, 42 insertions(+), 59 deletions(-) rename lib/src/utils/{mx_content.dart => uri_extension.dart} (65%) rename test/{mx_content_test.dart => mxc_uri_extension_test.dart} (80%) diff --git a/lib/famedlysdk.dart b/lib/famedlysdk.dart index bfeee5f..a3cd2a1 100644 --- a/lib/famedlysdk.dart +++ b/lib/famedlysdk.dart @@ -30,7 +30,7 @@ export 'package:famedlysdk/src/utils/device_keys_list.dart'; export 'package:famedlysdk/src/utils/matrix_exception.dart'; export 'package:famedlysdk/src/utils/matrix_file.dart'; export 'package:famedlysdk/src/utils/matrix_id_string_extension.dart'; -export 'package:famedlysdk/src/utils/mx_content.dart'; +export 'package:famedlysdk/src/utils/uri_extension.dart'; export 'package:famedlysdk/src/utils/open_id_credentials.dart'; export 'package:famedlysdk/src/utils/profile.dart'; export 'package:famedlysdk/src/utils/public_rooms_response.dart'; diff --git a/lib/src/event.dart b/lib/src/event.dart index 87d4ccd..08bf2a8 100644 --- a/lib/src/event.dart +++ b/lib/src/event.dart @@ -459,10 +459,10 @@ class Event { throw ('Encryption is not enabled in your Client.'); } var mxContent = getThumbnail - ? MxContent(isEncrypted + ? Uri.parse(isEncrypted ? content['info']['thumbnail_file']['url'] : content['info']['thumbnail_url']) - : MxContent(isEncrypted ? content['file']['url'] : content['url']); + : Uri.parse(isEncrypted ? content['file']['url'] : content['url']); Uint8List uint8list; @@ -475,7 +475,7 @@ class Event { infoMap['size'] <= ExtendedStoreAPI.MAX_FILE_SIZE; if (storeable) { - uint8list = await room.client.store.getFile(mxContent.mxc); + uint8list = await room.client.store.getFile(mxContent.toString()); } // Download the file @@ -483,7 +483,7 @@ class Event { uint8list = (await http.get(mxContent.getDownloadLink(room.client))).bodyBytes; if (storeable) { - await room.client.store.storeFile(uint8list, mxContent.mxc); + await room.client.store.storeFile(uint8list, mxContent.toString()); } } diff --git a/lib/src/presence.dart b/lib/src/presence.dart index bf5a95d..08b2d0b 100644 --- a/lib/src/presence.dart +++ b/lib/src/presence.dart @@ -21,8 +21,6 @@ * along with famedlysdk. If not, see . */ -import 'package:famedlysdk/famedlysdk.dart'; - enum PresenceType { online, offline, unavailable } /// Informs the client of a user's presence state change. @@ -34,7 +32,7 @@ class Presence { final String displayname; /// The current avatar URL for this user, if any. - final MxContent avatarUrl; + final Uri avatarUrl; final bool currentlyActive; final int lastActiveAgo; final PresenceType presence; @@ -44,7 +42,9 @@ class Presence { Presence.fromJson(Map json) : sender = json['sender'], displayname = json['content']['displayname'], - avatarUrl = MxContent(json['content']['avatar_url'] ?? ''), + avatarUrl = json['content']['avatar_url'] != null + ? Uri.parse(json['content']['avatar_url']) + : null, currentlyActive = json['content']['currently_active'], lastActiveAgo = json['content']['last_active_ago'], time = DateTime.fromMillisecondsSinceEpoch( diff --git a/lib/src/room.dart b/lib/src/room.dart index 965ffe3..4717926 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -32,7 +32,6 @@ import 'package:famedlysdk/src/sync/event_update.dart'; import 'package:famedlysdk/src/sync/room_update.dart'; import 'package:famedlysdk/src/utils/matrix_exception.dart'; import 'package:famedlysdk/src/utils/matrix_file.dart'; -import 'package:famedlysdk/src/utils/mx_content.dart'; import 'package:famedlysdk/src/utils/session_key.dart'; import 'package:image/image.dart'; import 'package:matrix_file_e2ee/matrix_file_e2ee.dart'; @@ -286,9 +285,10 @@ class Room { : ''; /// The avatar of the room if set by a participant. - MxContent get avatar { - if (states['m.room.avatar'] != null) { - return MxContent(states['m.room.avatar'].content['url']); + Uri get avatar { + if (states['m.room.avatar'] != null && + states['m.room.avatar'].content['url'] != null) { + return Uri.parse(states['m.room.avatar'].content['url']); } if (mHeroes != null && mHeroes.length == 1 && states[mHeroes[0]] != null) { return states[mHeroes[0]].asUser.avatarUrl; @@ -297,7 +297,7 @@ class Room { getState('m.room.member', client.userID) != null) { return getState('m.room.member', client.userID).sender.avatarUrl; } - return MxContent(''); + return null; } /// The address in the format: #roomname:homeserver.org. diff --git a/lib/src/timeline.dart b/lib/src/timeline.dart index 6c7fffb..74c66fa 100644 --- a/lib/src/timeline.dart +++ b/lib/src/timeline.dart @@ -146,7 +146,7 @@ class Timeline { ?.getUser(matrixID: eventUpdate.content['sender'], room: room); if (senderUser != null) { eventUpdate.content['displayname'] = senderUser.displayName; - eventUpdate.content['avatar_url'] = senderUser.avatarUrl.mxc; + eventUpdate.content['avatar_url'] = senderUser.avatarUrl.toString(); } newEvent = Event.fromJson(eventUpdate.content, room); diff --git a/lib/src/user.dart b/lib/src/user.dart index 4d4216e..f333e0f 100644 --- a/lib/src/user.dart +++ b/lib/src/user.dart @@ -24,7 +24,6 @@ import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/src/room.dart'; import 'package:famedlysdk/src/event.dart'; -import 'package:famedlysdk/src/utils/mx_content.dart'; enum Membership { join, invite, leave, ban } @@ -96,9 +95,9 @@ class User extends Event { }, orElse: () => Membership.join); /// The avatar if the user has one. - MxContent get avatarUrl => content != null && content['avatar_url'] is String - ? MxContent(content['avatar_url']) - : MxContent(''); + Uri get avatarUrl => content != null && content['avatar_url'] is String + ? Uri.parse(content['avatar_url']) + : null; /// Returns the displayname or the local part of the Matrix ID if the user /// has no displayname. If [formatLocalpart] is true, then the localpart will diff --git a/lib/src/utils/profile.dart b/lib/src/utils/profile.dart index f9737c8..85651ea 100644 --- a/lib/src/utils/profile.dart +++ b/lib/src/utils/profile.dart @@ -1,9 +1,7 @@ -import 'package:famedlysdk/src/utils/mx_content.dart'; - /// Represents a user profile returned by a /profile request. class Profile { /// The user's avatar URL if they have set one, otherwise null. - final MxContent avatarUrl; + final Uri avatarUrl; /// The user's display name if they have set one, otherwise null. final String displayname; @@ -12,11 +10,11 @@ class Profile { final Map content; Profile.fromJson(Map json) - : avatarUrl = MxContent(json['avatar_url']), + : avatarUrl = Uri.parse(json['avatar_url']), displayname = json['displayname'], content = json; @override bool operator ==(dynamic other) => - avatarUrl.mxc == other.avatarUrl.mxc && displayname == other.displayname; + avatarUrl == other.avatarUrl && displayname == other.displayname; } diff --git a/lib/src/utils/mx_content.dart b/lib/src/utils/uri_extension.dart similarity index 65% rename from lib/src/utils/mx_content.dart rename to lib/src/utils/uri_extension.dart index 00ea77d..4540600 100644 --- a/lib/src/utils/mx_content.dart +++ b/lib/src/utils/uri_extension.dart @@ -24,32 +24,25 @@ import 'package:famedlysdk/src/client.dart'; import 'dart:core'; -/// A file in Matrix presented by a mxc:// uri scheme. -class MxContent { - final String _mxc; - - /// Insert a mxc:// uri here. - MxContent(String mxcUrl) : _mxc = mxcUrl ?? ''; - - /// Returns the mxc uri. - String get mxc => _mxc; - +extension MxcUriExtension on Uri { /// Returns a download Link to this content. - String getDownloadLink(Client matrix) => matrix.homeserver != null - ? "${matrix.homeserver}/_matrix/media/r0/download/${_mxc.replaceFirst("mxc://", "")}" - : ''; + String getDownloadLink(Client matrix) => isScheme('mxc') + ? matrix.homeserver != null + ? '${matrix.homeserver}/_matrix/media/r0/download/$host$path' + : '' + : toString(); /// Returns a scaled thumbnail link to this content with the given [width] and /// [height]. [method] can be [ThumbnailMethod.crop] or /// [ThumbnailMethod.scale] and defaults to [ThumbnailMethod.scale]. String getThumbnail(Client matrix, - {num width, num height, ThumbnailMethod method}) { - var methodStr = 'crop'; - if (method == ThumbnailMethod.scale) methodStr = 'scale'; + {num width, num height, ThumbnailMethod method = ThumbnailMethod.crop}) { + if (!isScheme('mxc')) return toString(); + final methodStr = method.toString().split('.').last; width = width.round(); height = height.round(); return matrix.homeserver != null - ? "${matrix.homeserver}/_matrix/media/r0/thumbnail/${_mxc.replaceFirst("mxc://", "")}?width=$width&height=$height&method=$methodStr" + ? '${matrix.homeserver}/_matrix/media/r0/thumbnail/$host$path?width=$width&height=$height&method=$methodStr' : ''; } } diff --git a/test/client_test.dart b/test/client_test.dart index ac175a3..9693f4f 100644 --- a/test/client_test.dart +++ b/test/client_test.dart @@ -470,9 +470,9 @@ void main() { test('getProfileFromUserId', () async { final profile = await matrix.getProfileFromUserId('@getme:example.com'); - expect(profile.avatarUrl.mxc, 'mxc://test'); + expect(profile.avatarUrl.toString(), 'mxc://test'); expect(profile.displayname, 'You got me'); - expect(profile.content['avatar_url'], profile.avatarUrl.mxc); + expect(profile.content['avatar_url'], profile.avatarUrl.toString()); expect(profile.content['displayname'], profile.displayname); }); diff --git a/test/mx_content_test.dart b/test/mxc_uri_extension_test.dart similarity index 80% rename from test/mx_content_test.dart rename to test/mxc_uri_extension_test.dart index 5161737..5d5afdb 100644 --- a/test/mx_content_test.dart +++ b/test/mxc_uri_extension_test.dart @@ -23,7 +23,7 @@ import 'package:test/test.dart'; import 'package:famedlysdk/src/client.dart'; -import 'package:famedlysdk/src/utils/mx_content.dart'; +import 'package:famedlysdk/src/utils/uri_extension.dart'; import 'fake_matrix_api.dart'; @@ -35,7 +35,8 @@ void main() { client.httpClient = FakeMatrixApi(); await client.checkServer('https://fakeserver.notexisting'); final mxc = 'mxc://exampleserver.abc/abcdefghijklmn'; - final content = MxContent(mxc); + final content = Uri.parse(mxc); + expect(content.isScheme('mxc'), true); expect(content.getDownloadLink(client), '${client.homeserver}/_matrix/media/r0/download/exampleserver.abc/abcdefghijklmn'); @@ -46,13 +47,5 @@ void main() { width: 50, height: 50, method: ThumbnailMethod.scale), '${client.homeserver}/_matrix/media/r0/thumbnail/exampleserver.abc/abcdefghijklmn?width=50&height=50&method=scale'); }); - test('Not crashing if null', () async { - var client = Client('testclient'); - client.httpClient = FakeMatrixApi(); - await client.checkServer('https://fakeserver.notexisting'); - final content = MxContent(null); - expect(content.getDownloadLink(client), - '${client.homeserver}/_matrix/media/r0/download/'); - }); }); } diff --git a/test/presence_test.dart b/test/presence_test.dart index 788936e..a24c3ce 100644 --- a/test/presence_test.dart +++ b/test/presence_test.dart @@ -30,7 +30,7 @@ void main() { test('fromJson', () async { var rawPresence = { 'content': { - 'avatar_url': 'mxc://localhost:wefuiwegh8742w', + 'avatar_url': 'mxc://example.org/wefuiwegh8742w', 'currently_active': false, 'last_active_ago': 2478593, 'presence': 'online', @@ -41,7 +41,7 @@ void main() { }; var presence = Presence.fromJson(rawPresence); expect(presence.sender, '@example:localhost'); - expect(presence.avatarUrl.mxc, 'mxc://localhost:wefuiwegh8742w'); + expect(presence.avatarUrl.toString(), 'mxc://example.org/wefuiwegh8742w'); expect(presence.currentlyActive, false); expect(presence.lastActiveAgo, 2478593); expect(presence.presence, PresenceType.online); diff --git a/test/room_test.dart b/test/room_test.dart index 8ee9b8b..64936a5 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -145,7 +145,7 @@ void main() { stateKey: ''); expect(room.topic, 'testtopic'); - expect(room.avatar.mxc, ''); + expect(room.avatar, null); room.states['m.room.avatar'] = Event( senderId: '@test:example.com', typeKey: 'm.room.avatar', @@ -154,7 +154,7 @@ void main() { eventId: '123', content: {'url': 'mxc://testurl'}, stateKey: ''); - expect(room.avatar.mxc, 'mxc://testurl'); + expect(room.avatar.toString(), 'mxc://testurl'); room.states['m.room.message'] = Event( senderId: '@test:example.com', typeKey: 'm.room.message', @@ -180,7 +180,7 @@ void main() { expect(user.id, '@alice:example.org'); expect(user.displayName, 'Alice Margatroid'); expect(user.membership, Membership.join); - expect(user.avatarUrl.mxc, 'mxc://example.org/SEsfnsuifSDFSSEF'); + expect(user.avatarUrl.toString(), 'mxc://example.org/SEsfnsuifSDFSSEF'); expect(user.room.id, '!localpart:server.abc'); }); diff --git a/test/user_test.dart b/test/user_test.dart index bc5b1ae..0d56f43 100644 --- a/test/user_test.dart +++ b/test/user_test.dart @@ -54,7 +54,7 @@ void main() { expect(user.id, id); expect(user.membership, membership); expect(user.displayName, displayName); - expect(user.avatarUrl.mxc, avatarUrl); + expect(user.avatarUrl.toString(), avatarUrl); expect(user.calcDisplayname(), displayName); });