diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/avatar/MemoryAvatarMetadataStore.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/avatar/MemoryAvatarMetadataStore.java new file mode 100644 index 000000000..ebe80de2e --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/avatar/MemoryAvatarMetadataStore.java @@ -0,0 +1,68 @@ +package org.jivesoftware.smackx.avatar; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.jivesoftware.smack.util.HashCode; +import org.jivesoftware.smack.util.Objects; + +import org.jxmpp.jid.EntityBareJid; + +public class MemoryAvatarMetadataStore implements AvatarMetadataStore { + + private Map, Boolean> availabilityMap = new ConcurrentHashMap<>(); + + @Override + public boolean hasAvatarAvailable(EntityBareJid jid, String itemId) { + Boolean available = availabilityMap.get(new Tuple<>(jid, itemId)); + return available != null && available; + } + + @Override + public void setAvatarAvailable(EntityBareJid jid, String itemId) { + availabilityMap.put(new Tuple<>(jid, itemId), Boolean.TRUE); + } + + private static class Tuple { + private final A first; + private final B second; + + public Tuple(A first, B second) { + this.first = first; + this.second = second; + } + + public A getFirst() { + return first; + } + + public B getSecond() { + return second; + } + + @Override + public int hashCode() { + return HashCode.builder() + .append(first) + .append(second) + .build(); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (obj == this) { + return true; + } + if (!(obj instanceof Tuple)) { + return false; + } + + @SuppressWarnings("unchecked") Tuple other = (Tuple) obj; + return Objects.equals(getFirst(), other.getFirst()) + && Objects.equals(getSecond(), other.getSecond()); + } + } +}