X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/6261934ddaf715b30f99ef2f3339c2709aeee4c9..4a1af0786c938f887a109a17dcc879da21704a8b:/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 index 00000000..df74cf42 --- /dev/null +++ b/lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java @@ -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> onManagerAddedHandlers = new HashSet<>(); + private final Set> onManagerRemovedHandlers = new HashSet<>(); + private final Set managers = new HashSet<>(); + private final File dataPath; + private final ServiceEnvironment serviceEnvironment; + private final String userAgent; + + public MultiAccountManagerImpl( + final Collection 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 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 handler) { + synchronized (onManagerAddedHandlers) { + onManagerAddedHandlers.add(handler); + } + } + + @Override + public void addOnManagerRemovedHandler(final Consumer 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(); + } + } +}