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}