introduce 'PepManager' to unify what pubsub service we talk to

This commit is contained in:
Daniel Gultsch 2023-02-07 12:31:51 +01:00
parent e2ea1f9437
commit 870393df8e
No known key found for this signature in database
GPG key ID: F43D18AD2A0982C2
5 changed files with 69 additions and 19 deletions

View file

@ -11,6 +11,7 @@ import im.conversations.android.xmpp.manager.BookmarkManager;
import im.conversations.android.xmpp.manager.CarbonsManager; import im.conversations.android.xmpp.manager.CarbonsManager;
import im.conversations.android.xmpp.manager.DiscoManager; import im.conversations.android.xmpp.manager.DiscoManager;
import im.conversations.android.xmpp.manager.NickManager; import im.conversations.android.xmpp.manager.NickManager;
import im.conversations.android.xmpp.manager.PepManager;
import im.conversations.android.xmpp.manager.PresenceManager; import im.conversations.android.xmpp.manager.PresenceManager;
import im.conversations.android.xmpp.manager.PubSubManager; import im.conversations.android.xmpp.manager.PubSubManager;
import im.conversations.android.xmpp.manager.RosterManager; import im.conversations.android.xmpp.manager.RosterManager;
@ -29,6 +30,7 @@ public final class Managers {
.put(CarbonsManager.class, new CarbonsManager(context, connection)) .put(CarbonsManager.class, new CarbonsManager(context, connection))
.put(DiscoManager.class, new DiscoManager(context, connection)) .put(DiscoManager.class, new DiscoManager(context, connection))
.put(NickManager.class, new NickManager(context, connection)) .put(NickManager.class, new NickManager(context, connection))
.put(PepManager.class, new PepManager(context, connection))
.put(PresenceManager.class, new PresenceManager(context, connection)) .put(PresenceManager.class, new PresenceManager(context, connection))
.put(PubSubManager.class, new PubSubManager(context, connection)) .put(PubSubManager.class, new PubSubManager(context, connection))
.put(RosterManager.class, new RosterManager(context, connection)) .put(RosterManager.class, new RosterManager(context, connection))

View file

@ -2298,6 +2298,10 @@ public class XmppConnection implements Runnable {
return this.streamFeatures != null && this.streamFeatures.clientStateIndication(); return this.streamFeatures != null && this.streamFeatures.clientStateIndication();
} }
public Jid getBoundAddress() {
return this.connectionAddress;
}
private static class MyKeyManager implements X509KeyManager { private static class MyKeyManager implements X509KeyManager {
private final Context context; private final Context context;

View file

@ -194,7 +194,13 @@ public class AxolotlManager extends AbstractManager {
} }
private ListenableFuture<Void> publishDeviceId() { private ListenableFuture<Void> publishDeviceId() {
final var currentDeviceIdsFuture = fetchDeviceIds(getAccount().address); final var currentDeviceIdsFuture =
Futures.transform(
getManager(PepManager.class)
.fetchMostRecentItem(
Namespace.AXOLOTL_DEVICE_LIST, DeviceList.class),
DeviceList::getDeviceIds,
MoreExecutors.directExecutor());
final ListenableFuture<Set<Integer>> currentDeviceIdsWithFallback = final ListenableFuture<Set<Integer>> currentDeviceIdsWithFallback =
Futures.catching( Futures.catching(
currentDeviceIdsFuture, currentDeviceIdsFuture,
@ -226,12 +232,9 @@ public class AxolotlManager extends AbstractManager {
private ListenableFuture<Void> publishDeviceIds(final Collection<Integer> deviceIds) { private ListenableFuture<Void> publishDeviceIds(final Collection<Integer> deviceIds) {
final var deviceList = new DeviceList(); final var deviceList = new DeviceList();
deviceList.setDeviceIds(deviceIds); deviceList.setDeviceIds(deviceIds);
return getManager(PubSubManager.class) return getManager(PepManager.class)
.publishSingleton( .publishSingleton(
getAccount().address, deviceList, Namespace.AXOLOTL_DEVICE_LIST, NodeConfiguration.OPEN);
deviceList,
Namespace.AXOLOTL_DEVICE_LIST,
NodeConfiguration.OPEN);
} }
private ListenableFuture<Void> publishBundle() { private ListenableFuture<Void> publishBundle() {
@ -246,9 +249,8 @@ public class AxolotlManager extends AbstractManager {
"%s:%d", "%s:%d",
Namespace.AXOLOTL_BUNDLES, Namespace.AXOLOTL_BUNDLES,
signalProtocolStore.getLocalRegistrationId()); signalProtocolStore.getLocalRegistrationId());
return getManager(PubSubManager.class) return getManager(PepManager.class)
.publishSingleton( .publishSingleton(bundle, node, NodeConfiguration.OPEN);
getAccount().address, bundle, node, NodeConfiguration.OPEN);
}, },
MoreExecutors.directExecutor()); MoreExecutors.directExecutor());
} }

View file

@ -30,8 +30,7 @@ public class BookmarkManager extends AbstractManager {
} }
public void fetch() { public void fetch() {
final var future = final var future = getManager(PepManager.class).fetchItems(Conference.class);
getManager(PubSubManager.class).fetchItems(getAccount().address, Conference.class);
Futures.addCallback( Futures.addCallback(
future, future,
new FutureCallback<>() { new FutureCallback<>() {
@ -79,12 +78,8 @@ public class BookmarkManager extends AbstractManager {
final var itemId = address.toEscapedString(); final var itemId = address.toEscapedString();
final var conference = new Conference(); final var conference = new Conference();
return Futures.transform( return Futures.transform(
getManager(PubSubManager.class) getManager(PepManager.class)
.publish( .publish(conference, itemId, NodeConfiguration.WHITELIST_MAX_ITEMS),
getAccount().address,
conference,
itemId,
NodeConfiguration.WHITELIST_MAX_ITEMS),
result -> null, result -> null,
MoreExecutors.directExecutor()); MoreExecutors.directExecutor());
} }
@ -92,8 +87,7 @@ public class BookmarkManager extends AbstractManager {
public ListenableFuture<Void> retractBookmark(final Jid address) { public ListenableFuture<Void> retractBookmark(final Jid address) {
final var itemId = address.toEscapedString(); final var itemId = address.toEscapedString();
return Futures.transform( return Futures.transform(
getManager(PubSubManager.class) getManager(PepManager.class).retract(itemId, Namespace.BOOKMARKS2),
.retract(getAccount().address, itemId, Namespace.BOOKMARKS2),
result -> null, result -> null,
MoreExecutors.directExecutor()); MoreExecutors.directExecutor());
} }

View file

@ -0,0 +1,48 @@
package im.conversations.android.xmpp.manager;
import android.content.Context;
import com.google.common.util.concurrent.ListenableFuture;
import eu.siacs.conversations.xmpp.Jid;
import im.conversations.android.xmpp.NodeConfiguration;
import im.conversations.android.xmpp.XmppConnection;
import im.conversations.android.xmpp.model.Extension;
import im.conversations.android.xmpp.model.stanza.Iq;
import java.util.Map;
public class PepManager extends AbstractManager {
public PepManager(Context context, XmppConnection connection) {
super(context, connection);
}
public <T extends Extension> ListenableFuture<Map<String, T>> fetchItems(final Class<T> clazz) {
return pubSubManager().fetchItems(pepService(), clazz);
}
public <T extends Extension> ListenableFuture<T> fetchMostRecentItem(
final String node, final Class<T> clazz) {
return pubSubManager().fetchMostRecentItem(pepService(), node, clazz);
}
public ListenableFuture<Void> publish(
Extension item, final String itemId, final NodeConfiguration nodeConfiguration) {
return pubSubManager().publish(pepService(), item, itemId, nodeConfiguration);
}
public ListenableFuture<Void> publishSingleton(
Extension item, final String node, final NodeConfiguration nodeConfiguration) {
return pubSubManager().publishSingleton(pepService(), item, node, nodeConfiguration);
}
public ListenableFuture<Iq> retract(final String itemId, final String node) {
return pubSubManager().retract(pepService(), itemId, node);
}
private PubSubManager pubSubManager() {
return getManager(PubSubManager.class);
}
private Jid pepService() {
return connection.getBoundAddress().asBareJid();
}
}