From f2cf771d5924b133168e2d4456e56cdbd00c485f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 12 Jul 2025 10:40:32 +0200 Subject: [PATCH 1/4] build: Fix wrong android namespace --- android/app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 74f05879b..12375cbae 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -17,7 +17,7 @@ dependencies { } android { - namespace = "im.fluffychat.fluffychat" + namespace = "chat.fluffy.fluffychat" compileSdk = flutter.compileSdkVersion ndkVersion = "27.0.12077973" From 4a9efddf15508eb20c2bdb293b17b67e30b6a939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 12 Jul 2025 10:44:52 +0200 Subject: [PATCH 2/4] build: Update release ios script --- scripts/release-ios-testflight.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/release-ios-testflight.sh b/scripts/release-ios-testflight.sh index 22ab6f382..f34f6c826 100755 --- a/scripts/release-ios-testflight.sh +++ b/scripts/release-ios-testflight.sh @@ -1,5 +1,6 @@ #!/bin/sh -ve -./scripts/add-firebase-messaging.sh +flutter pub add fcm_shared_isolate:0.1.0 +sed -i '' 's,//,,g' lib/utils/background_push.dart yq eval '.dependencies.fcm_shared_isolate = "0.1.0"' -i pubspec.yaml # Workaround: 0.2.0 does not work on iOS flutter clean flutter pub get From f798421dd2885fa856dbcf0017c13d2db75f62a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 12 Jul 2025 11:28:43 +0200 Subject: [PATCH 3/4] build: Add missing incomment fcm push service --- scripts/add-firebase-messaging.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/add-firebase-messaging.sh b/scripts/add-firebase-messaging.sh index 321e60c00..af7ce0259 100755 --- a/scripts/add-firebase-messaging.sh +++ b/scripts/add-firebase-messaging.sh @@ -5,6 +5,8 @@ flutter pub get if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' 's,//,,g' lib/utils/background_push.dart + sed -i '' -e 's,^/\*,,' -e 's,\*/$,,' android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt else sed -i 's,//,,g' lib/utils/background_push.dart -fi \ No newline at end of file + sed -i -e 's,^/\*,,' -e 's,\*/$,,' android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt +fi From 9643242cc80d906534a4658ab3a7207c5907274d Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sat, 12 Jul 2025 15:38:04 +0200 Subject: [PATCH 4/4] refactor: Make notification avatars rounded --- .../client_download_content_extension.dart | 51 +++++++++++++++++-- .../local_notifications_extension.dart | 4 +- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/lib/utils/client_download_content_extension.dart b/lib/utils/client_download_content_extension.dart index 65e7e023c..3da8a1c51 100644 --- a/lib/utils/client_download_content_extension.dart +++ b/lib/utils/client_download_content_extension.dart @@ -1,6 +1,7 @@ +import 'dart:math' show min; import 'dart:typed_data'; +import 'dart:ui'; -import 'package:image/image.dart'; import 'package:matrix/matrix.dart'; extension ClientDownloadContentExtension on Client { @@ -49,10 +50,10 @@ extension ClientDownloadContentExtension on Client { var imageData = response.bodyBytes; if (rounded) { - final image = decodeImage(imageData); - if (image != null) { - imageData = encodePng(copyCropCircle(image)); - } + imageData = await _convertToCircularImage( + imageData, + min(width ?? 64, height ?? 64).round(), + ); } await database.storeFile(cacheKey, imageData, 0); @@ -60,3 +61,43 @@ extension ClientDownloadContentExtension on Client { return imageData; } } + +Future _convertToCircularImage( + Uint8List imageBytes, + int size, +) async { + final codec = await instantiateImageCodec(imageBytes); + final frame = await codec.getNextFrame(); + final originalImage = frame.image; + + final recorder = PictureRecorder(); + final canvas = Canvas(recorder); + + final paint = Paint(); + final rect = Rect.fromLTWH(0, 0, size.toDouble(), size.toDouble()); + + final clipPath = Path() + ..addOval( + Rect.fromCircle(center: Offset(size / 2, size / 2), radius: size / 2), + ); + + canvas.clipPath(clipPath); + + canvas.drawImageRect( + originalImage, + Rect.fromLTWH( + 0, + 0, + originalImage.width.toDouble(), + originalImage.height.toDouble(), + ), + rect, + paint, + ); + + final picture = recorder.endRecording(); + final circularImage = await picture.toImage(size, size); + + final byteData = await circularImage.toByteData(format: ImageByteFormat.png); + return byteData!.buffer.asUint8List(); +} diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index ceee364f5..0cdc291ef 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -50,7 +50,7 @@ extension LocalNotificationsExtension on MatrixState { Uri? thumbnailUri; if (avatarUrl != null) { - const size = 64; + const size = 128; const thumbnailMethod = ThumbnailMethod.crop; // Pre-cache so that we can later just set the thumbnail uri as icon: await client.downloadMxcCached( @@ -59,6 +59,7 @@ extension LocalNotificationsExtension on MatrixState { height: size, thumbnailMethod: thumbnailMethod, isThumbnail: true, + rounded: true, ); thumbnailUri = @@ -92,6 +93,7 @@ extension LocalNotificationsExtension on MatrixState { height: size, thumbnailMethod: thumbnailMethod, isThumbnail: true, + rounded: true, ); final image = decodeImage(data);