From 83fd99ea7037de872e2a0161e51f3ebc79e24242 Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 16 Jun 2026 00:57:56 +0200 Subject: [PATCH] print avatar warning --- lib/src/utils/avatars.dart | 46 +++++++++++-------- .../visual/components/avatar_icon.comp.dart | 7 +++ pubspec.yaml | 2 +- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/lib/src/utils/avatars.dart b/lib/src/utils/avatars.dart index 4aaefa48..aa5d0f6e 100644 --- a/lib/src/utils/avatars.dart +++ b/lib/src/utils/avatars.dart @@ -7,6 +7,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/locator.dart'; +import 'package:twonly/src/utils/log.dart'; String getAvatarSvg(Uint8List avatarSvgCompressed) { return utf8.decode(gzip.decode(avatarSvgCompressed)); @@ -16,28 +17,35 @@ Future createPushAvatars({int? forceForUserId}) async { final contacts = await twonlyDB.contactsDao.getAllContacts(); for (final contact in contacts) { - if (contact.avatarSvgCompressed == null) continue; + try { + if (contact.avatarSvgCompressed == null) continue; - if (forceForUserId == null) { - if (avatarPNGFile(contact.userId).existsSync()) { - continue; // only create the avatar in case no avatar exists yet fot this user + if (forceForUserId == null) { + if (avatarPNGFile(contact.userId).existsSync()) { + continue; // only create the avatar in case no avatar exists yet fot this user + } + } else if (contact.userId != forceForUserId) { + // only update the avatar for this specified contact + continue; } - } else if (contact.userId != forceForUserId) { - // only update the avatar for this specified contact - continue; + + final avatarSvg = getAvatarSvg(contact.avatarSvgCompressed!); + + final pictureInfo = await vg.loadPicture( + SvgStringLoader(avatarSvg), + null, + ); + + final image = await pictureInfo.picture.toImage(270, 300); + + final byteData = await image.toByteData(format: ui.ImageByteFormat.png); + final pngBytes = byteData!.buffer.asUint8List(); + + await avatarPNGFile(contact.userId).writeAsBytes(pngBytes); + pictureInfo.picture.dispose(); + } catch (e) { + Log.error(e); } - - final avatarSvg = getAvatarSvg(contact.avatarSvgCompressed!); - - final pictureInfo = await vg.loadPicture(SvgStringLoader(avatarSvg), null); - - final image = await pictureInfo.picture.toImage(270, 300); - - final byteData = await image.toByteData(format: ui.ImageByteFormat.png); - final pngBytes = byteData!.buffer.asUint8List(); - - await avatarPNGFile(contact.userId).writeAsBytes(pngBytes); - pictureInfo.picture.dispose(); } } diff --git a/lib/src/visual/components/avatar_icon.comp.dart b/lib/src/visual/components/avatar_icon.comp.dart index dbd3449e..1d3e2116 100644 --- a/lib/src/visual/components/avatar_icon.comp.dart +++ b/lib/src/visual/components/avatar_icon.comp.dart @@ -5,6 +5,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:twonly/locator.dart'; import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/utils/avatars.dart'; +import 'package:twonly/src/utils/log.dart'; import 'package:vector_graphics/vector_graphics.dart'; class AvatarIcon extends StatefulWidget { @@ -64,6 +65,12 @@ class _AvatarIconState extends State { errorBuilder: errorBuilder, ); } + + Log.warn( + 'PNG avatar file for contact ${contact.userId} does not exist. Generating in background.', + ); + unawaited(createPushAvatars(forceForUserId: contact.userId)); + if (contact.avatarSvgCompressed != null) { return SvgPicture.string( getAvatarSvg(contact.avatarSvgCompressed!), diff --git a/pubspec.yaml b/pubspec.yaml index 41dd766f..c1d91016 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec publish_to: 'none' -version: 0.3.1+140 +version: 0.3.1+141 environment: sdk: ^3.11.0