1package eu.siacs.conversations.xmpp.manager;
2
3import android.util.Log;
4import androidx.annotation.NonNull;
5import com.google.common.collect.ImmutableMap;
6import com.google.common.util.concurrent.FutureCallback;
7import com.google.common.util.concurrent.Futures;
8import com.google.common.util.concurrent.ListenableFuture;
9import com.google.common.util.concurrent.MoreExecutors;
10import eu.siacs.conversations.Config;
11import eu.siacs.conversations.entities.Bookmark;
12import eu.siacs.conversations.services.XmppConnectionService;
13import eu.siacs.conversations.xml.Namespace;
14import eu.siacs.conversations.xmpp.Jid;
15import eu.siacs.conversations.xmpp.XmppConnection;
16import im.conversations.android.xmpp.NodeConfiguration;
17import im.conversations.android.xmpp.model.bookmark2.Conference;
18import im.conversations.android.xmpp.model.bookmark2.Nick;
19import im.conversations.android.xmpp.model.pubsub.Items;
20import java.util.Map;
21
22public class BookmarkManager extends AbstractBookmarkManager {
23
24 public BookmarkManager(final XmppConnectionService service, XmppConnection connection) {
25 super(service, connection);
26 }
27
28 public void fetch() {
29 final var future = getManager(PepManager.class).fetchItems(Conference.class);
30 Futures.addCallback(
31 future,
32 new FutureCallback<>() {
33 @Override
34 public void onSuccess(final Map<String, Conference> bookmarks) {
35 final var builder = new ImmutableMap.Builder<Jid, Bookmark>();
36 for (final var entry : bookmarks.entrySet()) {
37 final Bookmark bookmark =
38 Bookmark.parseFromItem(
39 entry.getKey(), entry.getValue(), getAccount());
40 if (bookmark == null) {
41 continue;
42 }
43 builder.put(bookmark.getJid(), bookmark);
44 }
45 processBookmarksInitial(builder.buildKeepingLast(), true);
46 }
47
48 @Override
49 public void onFailure(@NonNull final Throwable throwable) {
50 Log.d(Config.LOGTAG, "Could not fetch bookmarks", throwable);
51 }
52 },
53 MoreExecutors.directExecutor());
54 }
55
56 public void handleItems(final Items items) {
57 final var retractions = items.getRetractions();
58 final var itemMap = items.getItemMap(Conference.class);
59 if (!retractions.isEmpty()) {
60 // deleteItems(retractions);
61 }
62 if (!itemMap.isEmpty()) {
63 // updateItems(itemMap);
64 }
65 }
66
67 public ListenableFuture<Void> publishBookmark(final Jid address, final boolean autoJoin) {
68 return publishBookmark(address, autoJoin, null);
69 }
70
71 public ListenableFuture<Void> publishBookmark(
72 final Jid address, final boolean autoJoin, final String nick) {
73 final var itemId = address.toString();
74 final var conference = new Conference();
75 conference.setAutoJoin(autoJoin);
76 if (nick != null) {
77 conference.addExtension(new Nick()).setContent(nick);
78 }
79 return Futures.transform(
80 getManager(PepManager.class)
81 .publish(conference, itemId, NodeConfiguration.WHITELIST_MAX_ITEMS),
82 result -> null,
83 MoreExecutors.directExecutor());
84 }
85
86 public ListenableFuture<Void> retractBookmark(final Jid address) {
87 final var itemId = address.toString();
88 return Futures.transform(
89 getManager(PepManager.class).retract(itemId, Namespace.BOOKMARKS2),
90 result -> null,
91 MoreExecutors.directExecutor());
92 }
93
94 public void deleteAllItems() {}
95}