From 77ecdc1cb538c2986ed05b3cd0154bac4238e138 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 30 May 2025 13:52:50 +0200 Subject: [PATCH] support avatar node deletion and purge --- .../xmpp/manager/AvatarManager.java | 26 ++++++++----------- .../xmpp/manager/PubSubManager.java | 4 +++ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java index b2eb0183ee2fa45ebc6cbc445f1fd6c13cccb1d4..6b236d29dd051c9d662a3069c54d0d05e44d67bd 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java @@ -4,6 +4,7 @@ import android.graphics.Bitmap; import android.net.Uri; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.heifwriter.AvifWriter; import androidx.heifwriter.HeifWriter; import com.google.common.base.Preconditions; @@ -234,11 +235,11 @@ public class AvatarManager extends AbstractManager { throw new IOException("Could not move avatar to avatar location"); } - private void setAvatar(final Jid address, final Info info) { + private void setAvatarInfo(final Jid address, @NonNull final Info info) { setAvatar(address, info.getId()); } - private void setAvatar(final Jid from, final String id) { + private void setAvatar(final Jid from, @Nullable final String id) { Log.d(Config.LOGTAG, "setting avatar for " + from + " to " + id); if (from.isBareJid()) { setAvatarContact(from, id); @@ -247,7 +248,7 @@ public class AvatarManager extends AbstractManager { } } - private void setAvatarContact(final Jid from, final String id) { + private void setAvatarContact(final Jid from, @Nullable final String id) { final var account = getAccount(); if (account.getJid().asBareJid().equals(from)) { if (account.setAvatar(id)) { @@ -308,7 +309,7 @@ public class AvatarManager extends AbstractManager { final var cache = FileBackend.getAvatarFile(context, avatar.preferred.getId()); if (cache.exists()) { - setAvatar(from, avatar.preferred); + setAvatarInfo(from, avatar.preferred); } else if (service.isDataSaverDisabled()) { final var future = this.fetchAndStoreWithFallback(from, avatar.preferred, avatar.fallback); @@ -317,7 +318,7 @@ public class AvatarManager extends AbstractManager { new FutureCallback() { @Override public void onSuccess(Info result) { - setAvatar(from, result); + setAvatarInfo(from, result); Log.d( Config.LOGTAG, account.getJid().asBareJid() @@ -407,14 +408,9 @@ public class AvatarManager extends AbstractManager { } public void handleDelete(final Jid from) { - final var account = getAccount(); - final boolean isAccount = account.getJid().asBareJid().equals(from); - if (isAccount) { - account.setAvatar(null); - getDatabase().updateAccount(account); - service.getAvatarService().clear(account); - Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": deleted avatar metadata node"); - } + Preconditions.checkArgument( + from.isBareJid(), "node deletion can only be triggered from bare JIDs"); + setAvatar(from, null); } private Info resizeAndStoreAvatar( @@ -668,7 +664,7 @@ public class AvatarManager extends AbstractManager { Log.d( Config.LOGTAG, "fetchAndStore. file existed " + cache.getAbsolutePath()); - setAvatar(address, avatar.preferred); + setAvatarInfo(address, avatar.preferred); return Futures.immediateVoidFuture(); } else { final var future = @@ -677,7 +673,7 @@ public class AvatarManager extends AbstractManager { return Futures.transform( future, info -> { - setAvatar(address, info); + setAvatarInfo(address, info); return null; }, MoreExecutors.directExecutor()); diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/PubSubManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/PubSubManager.java index 0dfd2637f34c4241cd83e75f559bcae08b7e39ad..08bf5ab92fac05016c81450d1bea169a47691edb 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/PubSubManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/PubSubManager.java @@ -207,6 +207,10 @@ public class PubSubManager extends AbstractManager { if (connection.fromAccount(message) && Namespace.BOOKMARKS2.equals(node)) { getManager(BookmarkManager.class).handlePurge(); } + if (isFromBare && Namespace.AVATAR_METADATA.equals(node)) { + // purge (delete all items in a node) is functionally equivalent to delete + getManager(AvatarManager.class).handleDelete(from); + } } private void handleDelete(final Message message, final Delete delete) {