1 package org
.asamk
.signal
.manager
;
3 import org
.asamk
.signal
.manager
.config
.ServiceEnvironment
;
4 import org
.slf4j
.Logger
;
5 import org
.slf4j
.LoggerFactory
;
8 import java
.io
.IOException
;
10 import java
.util
.ArrayList
;
11 import java
.util
.Collection
;
12 import java
.util
.HashMap
;
13 import java
.util
.HashSet
;
14 import java
.util
.List
;
17 import java
.util
.concurrent
.TimeoutException
;
18 import java
.util
.function
.Consumer
;
20 class MultiAccountManagerImpl
implements MultiAccountManager
{
22 private final static Logger logger
= LoggerFactory
.getLogger(MultiAccountManagerImpl
.class);
24 private final Set
<Consumer
<Manager
>> onManagerAddedHandlers
= new HashSet
<>();
25 private final Set
<Consumer
<Manager
>> onManagerRemovedHandlers
= new HashSet
<>();
26 private final Set
<Manager
> managers
= new HashSet
<>();
27 private final Map
<URI
, ProvisioningManager
> provisioningManagers
= new HashMap
<>();
28 private final File settingsPath
;
29 private final ServiceEnvironment serviceEnvironment
;
30 private final String userAgent
;
32 public MultiAccountManagerImpl(
33 final Collection
<Manager
> managers
,
34 final File settingsPath
,
35 final ServiceEnvironment serviceEnvironment
,
36 final String userAgent
38 this.managers
.addAll(managers
);
39 managers
.forEach(m
-> m
.addClosedListener(() -> this.removeManager(m
)));
40 this.settingsPath
= settingsPath
;
41 this.serviceEnvironment
= serviceEnvironment
;
42 this.userAgent
= userAgent
;
46 public List
<String
> getAccountNumbers() {
47 synchronized (managers
) {
48 return managers
.stream().map(Manager
::getSelfNumber
).toList();
53 public List
<Manager
> getManagers() {
54 synchronized (managers
) {
55 return new ArrayList
<>(managers
);
59 void addManager(final Manager m
) {
60 synchronized (managers
) {
61 if (managers
.contains(m
)) {
65 m
.addClosedListener(() -> this.removeManager(m
));
67 synchronized (onManagerAddedHandlers
) {
68 for (final var handler
: onManagerAddedHandlers
) {
75 public void addOnManagerAddedHandler(final Consumer
<Manager
> handler
) {
76 synchronized (onManagerAddedHandlers
) {
77 onManagerAddedHandlers
.add(handler
);
81 void removeManager(final Manager m
) {
82 synchronized (managers
) {
83 if (!managers
.remove(m
)) {
87 synchronized (onManagerRemovedHandlers
) {
88 for (final var handler
: onManagerRemovedHandlers
) {
95 public void addOnManagerRemovedHandler(final Consumer
<Manager
> handler
) {
96 synchronized (onManagerRemovedHandlers
) {
97 onManagerRemovedHandlers
.add(handler
);
102 public Manager
getManager(final String account
) {
103 synchronized (managers
) {
104 return managers
.stream().filter(m
-> m
.getSelfNumber().equals(account
)).findFirst().orElse(null);
109 public URI
getNewProvisioningDeviceLinkUri() throws TimeoutException
, IOException
{
110 final var provisioningManager
= getNewProvisioningManager();
111 final var deviceLinkUri
= provisioningManager
.getDeviceLinkUri();
112 provisioningManagers
.put(deviceLinkUri
, provisioningManager
);
113 return deviceLinkUri
;
117 public ProvisioningManager
getProvisioningManagerFor(final URI deviceLinkUri
) {
118 return provisioningManagers
.remove(deviceLinkUri
);
121 private ProvisioningManager
getNewProvisioningManager() {
122 return ProvisioningManager
.init(settingsPath
, serviceEnvironment
, userAgent
, this::addManager
);
126 public RegistrationManager
getNewRegistrationManager(String account
) throws IOException
{
127 return RegistrationManager
.init(account
, settingsPath
, serviceEnvironment
, userAgent
, this::addManager
);
131 public void close() {
132 synchronized (managers
) {
133 for (var m
: new ArrayList
<>(managers
)) {
136 } catch (IOException e
) {
137 logger
.warn("Cleanup failed", e
);