AvatarManager.java

 1package eu.siacs.conversations.xmpp.manager;
 2
 3import android.util.Log;
 4import eu.siacs.conversations.Config;
 5import eu.siacs.conversations.entities.Contact;
 6import eu.siacs.conversations.services.XmppConnectionService;
 7import eu.siacs.conversations.xml.Namespace;
 8import eu.siacs.conversations.xmpp.Jid;
 9import eu.siacs.conversations.xmpp.XmppConnection;
10import eu.siacs.conversations.xmpp.pep.Avatar;
11import im.conversations.android.xmpp.model.avatar.Metadata;
12import im.conversations.android.xmpp.model.pubsub.Items;
13
14public class AvatarManager extends AbstractManager {
15
16    private final XmppConnectionService service;
17
18    public AvatarManager(final XmppConnectionService service, XmppConnection connection) {
19        super(service.getApplicationContext(), connection);
20        this.service = service;
21    }
22
23    public void handleItems(final Jid from, final Items items) {
24        final var account = getAccount();
25        // TODO support retract
26        final var entry = items.getFirstItemWithId(Metadata.class);
27        final var avatar =
28                entry == null ? null : Avatar.parseMetadata(entry.getKey(), entry.getValue());
29        if (avatar != null) {
30            avatar.owner = from.asBareJid();
31            if (service.getFileBackend().isAvatarCached(avatar)) {
32                if (account.getJid().asBareJid().equals(from)) {
33                    if (account.setAvatar(avatar.getFilename())) {
34                        service.databaseBackend.updateAccount(account);
35                        service.notifyAccountAvatarHasChanged(account);
36                    }
37                    service.getAvatarService().clear(account);
38                    service.updateConversationUi();
39                    service.updateAccountUi();
40                } else {
41                    final Contact contact = account.getRoster().getContact(from);
42                    if (contact.setAvatar(avatar)) {
43                        connection.getManager(RosterManager.class).writeToDatabaseAsync();
44                        service.getAvatarService().clear(contact);
45                        service.updateConversationUi();
46                        service.updateRosterUi();
47                    }
48                }
49            } else if (service.isDataSaverDisabled()) {
50                service.fetchAvatar(account, avatar);
51            }
52        }
53    }
54
55    public void handleDelete(final Jid from) {
56        final var account = getAccount();
57        final boolean isAccount = account.getJid().asBareJid().equals(from);
58        if (isAccount) {
59            account.setAvatar(null);
60            getDatabase().updateAccount(account);
61            service.getAvatarService().clear(account);
62            Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": deleted avatar metadata node");
63        }
64    }
65
66    public boolean hasPepToVCardConversion() {
67        return getManager(DiscoManager.class).hasAccountFeature(Namespace.AVATAR_CONVERSION);
68    }
69}