]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java
Add MultiAccountManager
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / MultiAccountManagerImpl.java
diff --git a/lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java
new file mode 100644 (file)
index 0000000..df74cf4
--- /dev/null
@@ -0,0 +1,104 @@
+package org.asamk.signal.manager;
+
+import org.asamk.signal.manager.config.ServiceEnvironment;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+public class MultiAccountManagerImpl implements MultiAccountManager {
+
+    private final static Logger logger = LoggerFactory.getLogger(MultiAccountManagerImpl.class);
+
+    private final Set<Consumer<Manager>> onManagerAddedHandlers = new HashSet<>();
+    private final Set<Consumer<Manager>> onManagerRemovedHandlers = new HashSet<>();
+    private final Set<Manager> managers = new HashSet<>();
+    private final File dataPath;
+    private final ServiceEnvironment serviceEnvironment;
+    private final String userAgent;
+
+    public MultiAccountManagerImpl(
+            final Collection<Manager> managers,
+            final File dataPath,
+            final ServiceEnvironment serviceEnvironment,
+            final String userAgent
+    ) {
+        this.managers.addAll(managers);
+        this.dataPath = dataPath;
+        this.serviceEnvironment = serviceEnvironment;
+        this.userAgent = userAgent;
+    }
+
+    @Override
+    public List<String> getAccountNumbers() {
+        synchronized (managers) {
+            return managers.stream().map(Manager::getSelfNumber).collect(Collectors.toList());
+        }
+    }
+
+    void addManager(final Manager m) {
+        synchronized (managers) {
+            if (managers.contains(m)) {
+                return;
+            }
+            managers.add(m);
+        }
+        synchronized (onManagerAddedHandlers) {
+            for (final var handler : onManagerAddedHandlers) {
+                handler.accept(m);
+            }
+        }
+    }
+
+    @Override
+    public void addOnManagerAddedHandler(final Consumer<Manager> handler) {
+        synchronized (onManagerAddedHandlers) {
+            onManagerAddedHandlers.add(handler);
+        }
+    }
+
+    @Override
+    public void addOnManagerRemovedHandler(final Consumer<Manager> handler) {
+        synchronized (onManagerRemovedHandlers) {
+            onManagerRemovedHandlers.add(handler);
+        }
+    }
+
+    @Override
+    public Manager getManager(final String account) {
+        synchronized (managers) {
+            return managers.stream().filter(m -> m.getSelfNumber().equals(account)).findFirst().orElse(null);
+        }
+    }
+
+    @Override
+    public ProvisioningManager getNewProvisioningManager() {
+        return ProvisioningManager.init(dataPath, serviceEnvironment, userAgent, this::addManager);
+    }
+
+    @Override
+    public RegistrationManager getNewRegistrationManager(String account) throws IOException {
+        return RegistrationManager.init(account, dataPath, serviceEnvironment, userAgent, this::addManager);
+    }
+
+    @Override
+    public void close() {
+        synchronized (managers) {
+            for (var m : managers) {
+                try {
+                    m.close();
+                } catch (IOException e) {
+                    logger.warn("Cleanup failed", e);
+                }
+            }
+            managers.clear();
+        }
+    }
+}