]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/MultiAccountManagerImpl.java
Extract RecipientHelper
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / MultiAccountManagerImpl.java
index 26f8b961b089b80c34e71179a1f9d8be37ccdd17..1a5ea266484b0d1bd90aa91b1a9a0da85da67786 100644 (file)
@@ -7,6 +7,7 @@ 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;
@@ -15,7 +16,6 @@ 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 {
 
@@ -36,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;
@@ -44,7 +45,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager {
     @Override
     public List<String> getAccountNumbers() {
         synchronized (managers) {
-            return managers.stream().map(Manager::getSelfNumber).collect(Collectors.toList());
+            return managers.stream().map(Manager::getSelfNumber).toList();
         }
     }
 
@@ -54,6 +55,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager {
                 return;
             }
             managers.add(m);
+            m.addClosedListener(() -> this.removeManager(m));
         }
         synchronized (onManagerAddedHandlers) {
             for (final var handler : onManagerAddedHandlers) {
@@ -69,6 +71,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<Manager> handler) {
         synchronized (onManagerRemovedHandlers) {
@@ -109,7 +124,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) {