X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/4a1af0786c938f887a109a17dcc879da21704a8b..be0993c5d8171aff9190e152b095677be4088112:/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 index df74cf42..83f0bb26 100644 --- a/lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java @@ -6,12 +6,16 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeoutException; import java.util.function.Consumer; -import java.util.stream.Collectors; public class MultiAccountManagerImpl implements MultiAccountManager { @@ -20,6 +24,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager { private final Set> onManagerAddedHandlers = new HashSet<>(); private final Set> onManagerRemovedHandlers = new HashSet<>(); private final Set managers = new HashSet<>(); + private final Map provisioningManagers = new HashMap<>(); private final File dataPath; private final ServiceEnvironment serviceEnvironment; private final String userAgent; @@ -31,6 +36,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager { final String userAgent ) { this.managers.addAll(managers); + managers.forEach(m -> m.addClosedListener(() -> this.removeManager(m))); this.dataPath = dataPath; this.serviceEnvironment = serviceEnvironment; this.userAgent = userAgent; @@ -39,7 +45,14 @@ public class MultiAccountManagerImpl implements MultiAccountManager { @Override public List getAccountNumbers() { synchronized (managers) { - return managers.stream().map(Manager::getSelfNumber).collect(Collectors.toList()); + return managers.stream().map(Manager::getSelfNumber).toList(); + } + } + + @Override + public List getManagers() { + synchronized (managers) { + return new ArrayList<>(managers); } } @@ -49,6 +62,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager { return; } managers.add(m); + m.addClosedListener(() -> this.removeManager(m)); } synchronized (onManagerAddedHandlers) { for (final var handler : onManagerAddedHandlers) { @@ -64,6 +78,19 @@ public class MultiAccountManagerImpl implements MultiAccountManager { } } + void removeManager(final Manager m) { + synchronized (managers) { + if (!managers.remove(m)) { + return; + } + } + synchronized (onManagerRemovedHandlers) { + for (final var handler : onManagerRemovedHandlers) { + handler.accept(m); + } + } + } + @Override public void addOnManagerRemovedHandler(final Consumer handler) { synchronized (onManagerRemovedHandlers) { @@ -79,7 +106,19 @@ public class MultiAccountManagerImpl implements MultiAccountManager { } @Override - public ProvisioningManager getNewProvisioningManager() { + public URI getNewProvisioningDeviceLinkUri() throws TimeoutException, IOException { + final var provisioningManager = getNewProvisioningManager(); + final var deviceLinkUri = provisioningManager.getDeviceLinkUri(); + provisioningManagers.put(deviceLinkUri, provisioningManager); + return deviceLinkUri; + } + + @Override + public ProvisioningManager getProvisioningManagerFor(final URI deviceLinkUri) { + return provisioningManagers.remove(deviceLinkUri); + } + + private ProvisioningManager getNewProvisioningManager() { return ProvisioningManager.init(dataPath, serviceEnvironment, userAgent, this::addManager); } @@ -91,7 +130,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager { @Override public void close() { synchronized (managers) { - for (var m : managers) { + for (var m : new ArrayList<>(managers)) { try { m.close(); } catch (IOException e) {