]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
add JsonPayment (#808)
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusManagerImpl.java
index 0d5ed98e5a662be69821dc4090993d9a457ecd6f..d2b1bec754189cb2d1ed919caa060f1810320157 100644 (file)
@@ -6,7 +6,7 @@ import org.asamk.signal.manager.AttachmentInvalidException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.NotMasterDeviceException;
 import org.asamk.signal.manager.StickerPackInvalidException;
-import org.asamk.signal.manager.UntrustedIdentityException;
+import org.asamk.signal.manager.api.Configuration;
 import org.asamk.signal.manager.api.Device;
 import org.asamk.signal.manager.api.Group;
 import org.asamk.signal.manager.api.Identity;
@@ -54,6 +54,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * This class implements the Manager interface using the DBus Signal interface, where possible.
@@ -64,7 +65,9 @@ public class DbusManagerImpl implements Manager {
     private final Signal signal;
     private final DBusConnection connection;
 
+    private final Set<ReceiveMessageHandler> weakHandlers = new HashSet<>();
     private final Set<ReceiveMessageHandler> messageHandlers = new HashSet<>();
+    private final List<Runnable> closedListeners = new ArrayList<>();
     private DBusSigHandler<Signal.MessageReceivedV2> dbusMsgHandler;
     private DBusSigHandler<Signal.ReceiptReceivedV2> dbusRcptHandler;
     private DBusSigHandler<Signal.SyncMessageReceivedV2> dbusSyncHandler;
@@ -106,12 +109,12 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void updateConfiguration(
-            final Boolean readReceipts,
-            final Boolean unidentifiedDeliveryIndicators,
-            final Boolean typingIndicators,
-            final Boolean linkPreviews
-    ) throws IOException {
+    public Configuration getConfiguration() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void updateConfiguration(Configuration configuration) throws IOException {
         throw new UnsupportedOperationException();
     }
 
@@ -294,31 +297,34 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void sendTypingMessage(
+    public SendMessageResults sendTypingMessage(
             final TypingAction action, final Set<RecipientIdentifier> recipients
-    ) throws IOException, UntrustedIdentityException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException {
-        for (final var recipient : recipients) {
-            if (recipient instanceof RecipientIdentifier.Single) {
-                signal.sendTyping(((RecipientIdentifier.Single) recipient).getIdentifier(),
-                        action == TypingAction.STOP);
-            } else if (recipient instanceof RecipientIdentifier.Group) {
-                throw new UnsupportedOperationException();
-            }
-        }
+    ) throws IOException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException {
+        return handleMessage(recipients, numbers -> {
+            numbers.forEach(n -> signal.sendTyping(n, action == TypingAction.STOP));
+            return 0L;
+        }, () -> {
+            signal.sendTyping(signal.getSelfNumber(), action == TypingAction.STOP);
+            return 0L;
+        }, groupId -> {
+            throw new UnsupportedOperationException();
+        });
     }
 
     @Override
-    public void sendReadReceipt(
+    public SendMessageResults sendReadReceipt(
             final RecipientIdentifier.Single sender, final List<Long> messageIds
-    ) throws IOException, UntrustedIdentityException {
+    ) {
         signal.sendReadReceipt(sender.getIdentifier(), messageIds);
+        return new SendMessageResults(0, Map.of());
     }
 
     @Override
-    public void sendViewedReceipt(
+    public SendMessageResults sendViewedReceipt(
             final RecipientIdentifier.Single sender, final List<Long> messageIds
-    ) throws IOException, UntrustedIdentityException {
+    ) {
         signal.sendViewedReceipt(sender.getIdentifier(), messageIds);
+        return new SendMessageResults(0, Map.of());
     }
 
     @Override
@@ -423,27 +429,26 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void addReceiveHandler(final ReceiveMessageHandler handler) {
+    public void addReceiveHandler(final ReceiveMessageHandler handler, final boolean isWeakListener) {
         synchronized (messageHandlers) {
-            if (messageHandlers.size() == 0) {
-                installMessageHandlers();
+            if (isWeakListener) {
+                weakHandlers.add(handler);
+            } else {
+                if (messageHandlers.size() == 0) {
+                    installMessageHandlers();
+                }
+                messageHandlers.add(handler);
             }
-            messageHandlers.add(handler);
         }
     }
 
     @Override
     public void removeReceiveHandler(final ReceiveMessageHandler handler) {
         synchronized (messageHandlers) {
+            weakHandlers.remove(handler);
             messageHandlers.remove(handler);
             if (messageHandlers.size() == 0) {
-                try {
-                    connection.removeSigHandler(Signal.MessageReceivedV2.class, signal, this.dbusMsgHandler);
-                    connection.removeSigHandler(Signal.ReceiptReceivedV2.class, signal, this.dbusRcptHandler);
-                    connection.removeSigHandler(Signal.SyncMessageReceivedV2.class, signal, this.dbusSyncHandler);
-                } catch (DBusException e) {
-                    e.printStackTrace();
-                }
+                uninstallMessageHandlers();
             }
         }
     }
@@ -581,8 +586,29 @@ public class DbusManagerImpl implements Manager {
         throw new UnsupportedOperationException();
     }
 
+    @Override
+    public void addClosedListener(final Runnable listener) {
+        synchronized (closedListeners) {
+            closedListeners.add(listener);
+        }
+    }
+
     @Override
     public void close() throws IOException {
+        synchronized (this) {
+            this.notify();
+        }
+        synchronized (messageHandlers) {
+            if (messageHandlers.size() > 0) {
+                uninstallMessageHandlers();
+            }
+            weakHandlers.clear();
+            messageHandlers.clear();
+        }
+        synchronized (closedListeners) {
+            closedListeners.forEach(Runnable::run);
+            closedListeners.clear();
+        }
     }
 
     private SendMessageResults handleMessage(
@@ -654,6 +680,7 @@ public class DbusManagerImpl implements Manager {
                                 false,
                                 Optional.empty(),
                                 Optional.empty(),
+                                Optional.empty(),
                                 getAttachments(extras),
                                 Optional.empty(),
                                 Optional.empty(),
@@ -662,11 +689,7 @@ public class DbusManagerImpl implements Manager {
                                 List.of())),
                         Optional.empty(),
                         Optional.empty());
-                synchronized (messageHandlers) {
-                    for (final var messageHandler : messageHandlers) {
-                        messageHandler.handleMessage(envelope, null);
-                    }
-                }
+                notifyMessageHandlers(envelope);
             };
             connection.addSigHandler(Signal.MessageReceivedV2.class, signal, this.dbusMsgHandler);
 
@@ -691,11 +714,7 @@ public class DbusManagerImpl implements Manager {
                         Optional.empty(),
                         Optional.empty(),
                         Optional.empty());
-                synchronized (messageHandlers) {
-                    for (final var messageHandler : messageHandlers) {
-                        messageHandler.handleMessage(envelope, null);
-                    }
-                }
+                notifyMessageHandlers(envelope);
             };
             connection.addSigHandler(Signal.ReceiptReceivedV2.class, signal, this.dbusRcptHandler);
 
@@ -731,6 +750,7 @@ public class DbusManagerImpl implements Manager {
                                         false,
                                         Optional.empty(),
                                         Optional.empty(),
+                                        Optional.empty(),
                                         getAttachments(extras),
                                         Optional.empty(),
                                         Optional.empty(),
@@ -745,16 +765,32 @@ public class DbusManagerImpl implements Manager {
                                 Optional.empty(),
                                 Optional.empty())),
                         Optional.empty());
-                synchronized (messageHandlers) {
-                    for (final var messageHandler : messageHandlers) {
-                        messageHandler.handleMessage(envelope, null);
-                    }
-                }
+                notifyMessageHandlers(envelope);
             };
             connection.addSigHandler(Signal.SyncMessageReceivedV2.class, signal, this.dbusSyncHandler);
         } catch (DBusException e) {
             e.printStackTrace();
         }
+        signal.subscribeReceive();
+    }
+
+    private void notifyMessageHandlers(final MessageEnvelope envelope) {
+        synchronized (messageHandlers) {
+            Stream.concat(messageHandlers.stream(), weakHandlers.stream()).forEach(h -> {
+                h.handleMessage(envelope, null);
+            });
+        }
+    }
+
+    private void uninstallMessageHandlers() {
+        try {
+            signal.unsubscribeReceive();
+            connection.removeSigHandler(Signal.MessageReceivedV2.class, signal, this.dbusMsgHandler);
+            connection.removeSigHandler(Signal.ReceiptReceivedV2.class, signal, this.dbusRcptHandler);
+            connection.removeSigHandler(Signal.SyncMessageReceivedV2.class, signal, this.dbusSyncHandler);
+        } catch (DBusException e) {
+            e.printStackTrace();
+        }
     }
 
     private List<MessageEnvelope.Data.Attachment> getAttachments(final Map<String, Variant<?>> extras) {