1package eu.siacs.conversations.xmpp.manager;
2
3import android.util.Log;
4import androidx.annotation.NonNull;
5import com.google.common.util.concurrent.FutureCallback;
6import com.google.common.util.concurrent.Futures;
7import com.google.common.util.concurrent.ListenableFuture;
8import com.google.common.util.concurrent.MoreExecutors;
9import eu.siacs.conversations.Config;
10import eu.siacs.conversations.entities.Bookmark;
11import eu.siacs.conversations.services.XmppConnectionService;
12import eu.siacs.conversations.xmpp.Jid;
13import eu.siacs.conversations.xmpp.XmppConnection;
14import im.conversations.android.xmpp.model.bookmark.Storage;
15import im.conversations.android.xmpp.model.stanza.Iq;
16import im.conversations.android.xmpp.model.storage.PrivateStorage;
17import java.util.Collection;
18import java.util.Map;
19
20public class PrivateStorageManager extends AbstractBookmarkManager {
21
22 public PrivateStorageManager(final XmppConnectionService service, XmppConnection connection) {
23 super(service, connection);
24 }
25
26 public void fetchBookmarks() {
27 final var iq = new Iq(Iq.Type.GET);
28 final var privateStorage = iq.addExtension(new PrivateStorage());
29 privateStorage.addExtension(new Storage());
30 final var future = this.connection.sendIqPacket(iq);
31 Futures.addCallback(
32 future,
33 new FutureCallback<Iq>() {
34 @Override
35 public void onSuccess(Iq result) {
36 final var privateStorage = result.getExtension(PrivateStorage.class);
37 if (privateStorage == null) {
38 return;
39 }
40 final var bookmarkStorage = privateStorage.getExtension(Storage.class);
41 final Map<Jid, Bookmark> bookmarks =
42 Bookmark.parseFromStorage(bookmarkStorage, getAccount());
43 processBookmarksInitial(bookmarks, false);
44 }
45
46 @Override
47 public void onFailure(@NonNull Throwable t) {
48 Log.d(
49 Config.LOGTAG,
50 getAccount().getJid().asBareJid()
51 + ": could not fetch bookmark from private storage",
52 t);
53 }
54 },
55 MoreExecutors.directExecutor());
56 }
57
58 public ListenableFuture<Void> publishBookmarks(Collection<Bookmark> bookmarks) {
59 final var iq = new Iq(Iq.Type.SET);
60 final var privateStorage = iq.addExtension(new PrivateStorage());
61 final var storage = privateStorage.addExtension(new Storage());
62 for (final var bookmark : bookmarks) {
63 storage.addChild(bookmark);
64 }
65 return Futures.transform(
66 connection.sendIqPacket(iq), result -> null, MoreExecutors.directExecutor());
67 }
68}