Skip to content

Commit 1482a30

Browse files
authored
Rewrite Timeline View to improve performance (#258)
1 parent 2005595 commit 1482a30

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2205
-1572
lines changed

commet/lib/client/components/push_notification/android/firebase_push_notifier.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Future<void> onForegroundMessage(dynamic message) async {
3232
var room = client.getRoom(roomId);
3333
var event = await room!.getEvent(eventId);
3434

35-
var user = room.getMemberOrFallback(event!.senderId)!;
35+
var user = room.getMemberOrFallback(event!.senderId);
3636

3737
Log.i("Dispatching notification");
3838

commet/lib/client/components/push_notification/android/unified_push_notifier.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class UnifiedPushNotifier implements Notifier {
9999
var room = client.getRoom(roomId);
100100
var event = await room!.getEvent(eventId);
101101

102-
var user = room.getMemberOrFallback(event!.senderId)!;
102+
var user = room.getMemberOrFallback(event!.senderId);
103103

104104
NotificationManager.notify(MessageNotificationContent(
105105
senderName: user.displayName,

commet/lib/client/matrix/components/url_preview/matrix_url_preview_component.dart

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import 'package:commet/client/room.dart';
66
import 'package:commet/client/timeline.dart';
77
import 'package:commet/debug/log.dart';
88
import 'package:commet/main.dart';
9+
import 'package:commet/utils/mime.dart';
910
import 'package:flutter/widgets.dart';
1011
import 'package:matrix/matrix.dart' as matrix;
1112
import 'package:encrypted_url_preview/encrypted_url_preview.dart';
13+
import 'package:matrix/matrix_api_lite.dart';
1214

1315
class MatrixUrlPreviewComponent implements UrlPreviewComponent<MatrixClient> {
1416
@override
@@ -20,6 +22,8 @@ class MatrixUrlPreviewComponent implements UrlPreviewComponent<MatrixClient> {
2022

2123
EncryptedUrlPreview? privatePreviewGetter;
2224

25+
bool? serverSupportsUrlPreview;
26+
2327
void createPrivatePreviewGetter() {
2428
privatePreviewGetter = EncryptedUrlPreview(
2529
proxyServerUrl: Uri.https("telescope.commet.chat"),
@@ -62,7 +66,10 @@ pQIDAQAB
6266
return null;
6367
}
6468

65-
cache[uri.toString()] = data!;
69+
if (data != null) {
70+
cache[uri.toString()] = data;
71+
}
72+
6673
return data;
6774
}
6875

@@ -82,6 +89,10 @@ pQIDAQAB
8289
return false;
8390
}
8491

92+
if (serverSupportsUrlPreview == false) {
93+
return false;
94+
}
95+
8596
return event.links?.isNotEmpty == true;
8697
}
8798

@@ -137,20 +148,46 @@ pQIDAQAB
137148

138149
Future<UrlPreviewData?> fetchPreviewData(
139150
matrix.Client client, Uri url) async {
140-
var response = await client.request(
141-
matrix.RequestType.GET, "/media/v3/preview_url",
142-
query: {"url": url.toString()});
151+
late Map<String, Object?> response;
152+
try {
153+
response = await client.request(
154+
matrix.RequestType.GET, "/media/v3/preview_url",
155+
query: {"url": url.toString()});
156+
} catch (e, s) {
157+
if (e is MatrixException) {
158+
if (e.error == MatrixError.M_UNRECOGNIZED) {
159+
serverSupportsUrlPreview = false;
160+
}
161+
}
162+
163+
Log.onError(e, s);
164+
165+
return null;
166+
}
143167

168+
serverSupportsUrlPreview = true;
144169
var title = response['og:title'] as String?;
145170
var siteName = response['og:site_name'] as String?;
146171
var imageUrl = response['og:image'] as String?;
147172
var description = response['og:description'] as String?;
148173

174+
var type = response["og:image:type"] as String?;
175+
if (type != null) {
176+
if (Mime.displayableTypes.contains(type) == false) {
177+
imageUrl = null;
178+
}
179+
}
180+
149181
ImageProvider? image;
150182
if (imageUrl != null) {
151183
var imageUri = Uri.parse(imageUrl);
152184
if (imageUri.scheme == "mxc") {
153-
image = MatrixMxcImage(imageUri, client, doThumbnail: false);
185+
try {
186+
image = MatrixMxcImage(imageUri, client, doThumbnail: false);
187+
} catch (exception, stack) {
188+
Log.onError(exception, stack);
189+
Log.w("Failed to get mxc image");
190+
}
154191
}
155192
}
156193

commet/lib/client/matrix/matrix_client.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ class MatrixClient extends Client {
6565
: matrix.NativeImplementationsIsolate(compute);
6666

6767
MatrixClient({required String identifier}) {
68-
if (preferences.developerMode) {
69-
matrix.Logs().level = matrix.Level.verbose;
70-
}
71-
7268
_id = identifier;
7369
_matrixClient = _createMatrixClient(identifier);
7470
_matrixClient.onSync.stream.listen(onMatrixClientSync);
@@ -231,7 +227,6 @@ class MatrixClient extends Client {
231227
}
232228

233229
void onMatrixClientSync(matrix.SyncUpdate update) {
234-
Log.d("On Matrix Sync!");
235230
_onSync.add(null);
236231
_updateRoomslist();
237232
_updateSpacesList();
@@ -257,8 +252,6 @@ class MatrixClient extends Client {
257252
legacyDatabaseBuilder: (client) =>
258253
getLegacyMatrixDatabase(client.clientName),
259254
databaseBuilder: (client) => getMatrixDatabase(client.clientName),
260-
logLevel:
261-
BuildConfig.RELEASE ? matrix.Level.warning : matrix.Level.verbose,
262255
);
263256

264257
client.onSyncStatus.stream.listen(onSyncStatusChanged);

commet/lib/client/matrix/matrix_room.dart

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,13 @@ class MatrixRoom extends Room {
179179
}
180180
}
181181

182-
_onUpdateSubscription =
183-
_matrixRoom.onUpdate.stream.listen(onMatrixRoomUpdate);
182+
_onUpdateSubscription = _matrixRoom.client.onRoomState.stream
183+
.where((event) => event.roomId == _matrixRoom.id)
184+
.listen(onRoomStateUpdated);
184185

185-
_matrixRoom.client.onEvent.stream.listen(onEvent);
186+
_matrixRoom.client.onEvent.stream
187+
.where((event) => event.roomID == _matrixRoom.id)
188+
.listen(onEvent);
186189

187190
_permissions = MatrixRoomPermissions(_matrixRoom);
188191
}
@@ -238,10 +241,6 @@ class MatrixRoom extends Room {
238241

239242
var sender = getMemberOrFallback(event.senderId);
240243

241-
if (sender == null) {
242-
return;
243-
}
244-
245244
var notification = MessageNotificationContent(
246245
senderName: sender.displayName,
247246
senderId: sender.identifier,
@@ -371,9 +370,11 @@ class MatrixRoom extends Room {
371370
await _matrixRoom.enableEncryption();
372371
}
373372

374-
void onMatrixRoomUpdate(String event) async {
373+
void onRoomStateUpdated(matrix.Event event) async {
375374
_displayName = _matrixRoom.getLocalizedDisplayname();
376-
_onUpdate.add(null);
375+
if (event.type == "m.room.name") {
376+
_onUpdate.add(null);
377+
}
377378
}
378379

379380
@override
@@ -509,7 +510,7 @@ class MatrixRoom extends Room {
509510
bool get isMembersListComplete => _matrixRoom.participantListComplete;
510511

511512
@override
512-
Member? getMemberOrFallback(String id) {
513+
Member getMemberOrFallback(String id) {
513514
return MatrixMember(
514515
_matrixRoom.client, _matrixRoom.unsafeGetUserFromMemoryOrFallback(id));
515516
}
@@ -522,9 +523,8 @@ class MatrixRoom extends Room {
522523
var roles = (state.content["users"] as Map<String, dynamic>);
523524
var ids = roles.keys;
524525

525-
var result = ids
526-
.map((e) => (getMemberOrFallback(e)!, MatrixRole(roles[e])))
527-
.toList();
526+
var result =
527+
ids.map((e) => (getMemberOrFallback(e), MatrixRole(roles[e]))).toList();
528528

529529
result.removeWhere((element) => element.$2.rank == 0);
530530

commet/lib/client/matrix/matrix_timeline_event.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,11 @@ class MatrixTimelineEvent implements TimelineEvent {
256256
}
257257

258258
@override
259-
Widget buildFormattedContent() {
259+
Widget? buildFormattedContent() {
260+
if (formattedBody == null) {
261+
return null;
262+
}
263+
260264
return MatrixHtmlParser.parse(formattedBody!, event.room.client);
261265
}
262266

commet/lib/client/room.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ abstract class Room {
142142

143143
Future<TimelineEvent?> getEvent(String eventId);
144144

145-
Member? getMemberOrFallback(String id);
145+
Member getMemberOrFallback(String id);
146146

147147
@override
148148
bool operator ==(Object other) {

commet/lib/client/timeline.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ abstract class TimelineEvent {
106106
/// If you want to display the same message twice, use `buildFormattedContent()` to create a new widget
107107
Widget? get formattedContent;
108108

109-
Widget buildFormattedContent();
109+
Widget? buildFormattedContent();
110110

111111
String? get relatedEventId;
112112
String? get stateKey;

commet/lib/service/background_service_notifications/background_service_task_notification.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class BackgroundNotificationsManager {
102102
Log.i("Found room: ${room?.displayName}");
103103

104104
var event = await room!.getEvent(eventId);
105-
var user = room.getMemberOrFallback(event!.senderId)!;
105+
var user = room.getMemberOrFallback(event!.senderId);
106106

107107
Log.i("Got user: $user ($user)");
108108
Log.i("Got event: ${event.body}");

commet/lib/ui/atoms/emoji_reaction.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class EmojiReaction extends StatelessWidget {
2020
final int numReactions;
2121
final bool highlighted;
2222

23-
BorderRadius get borderRadius => BorderRadius.circular(12);
23+
BorderRadius get borderRadius => BorderRadius.circular(8);
2424

2525
@override
2626
Widget build(BuildContext context) {

0 commit comments

Comments
 (0)