]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
Update hypfvieh dbus-java 4.0 beta which uses native java unix sockets
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / ManagerImpl.java
index 756c0a9474894ff8ca770c6b7b8b62f727f74fe9..81c18683acf8256e2e9dfc93c81c8f48ec429d5c 100644 (file)
@@ -95,6 +95,7 @@ import java.net.URISyntaxException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.security.SignatureException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -142,6 +143,7 @@ public class ManagerImpl implements Manager {
     private Thread receiveThread;
     private final Set<ReceiveMessageHandler> weakHandlers = new HashSet<>();
     private final Set<ReceiveMessageHandler> messageHandlers = new HashSet<>();
+    private final List<Runnable> closedListeners = new ArrayList<>();
     private boolean isReceivingSynchronous;
 
     ManagerImpl(
@@ -154,7 +156,7 @@ public class ManagerImpl implements Manager {
         this.serviceEnvironmentConfig = serviceEnvironmentConfig;
 
         final var credentialsProvider = new DynamicCredentialsProvider(account.getAci(),
-                account.getUsername(),
+                account.getAccount(),
                 account.getPassword(),
                 account.getDeviceId());
         final var sessionLock = new SignalSessionLock() {
@@ -249,7 +251,7 @@ public class ManagerImpl implements Manager {
 
     @Override
     public String getSelfNumber() {
-        return account.getUsername();
+        return account.getAccount();
     }
 
     @Override
@@ -283,7 +285,7 @@ public class ManagerImpl implements Manager {
     public Map<String, Pair<String, UUID>> areUsersRegistered(Set<String> numbers) throws IOException {
         Map<String, String> canonicalizedNumbers = numbers.stream().collect(Collectors.toMap(n -> n, n -> {
             try {
-                return PhoneNumberFormatter.formatNumber(n, account.getUsername());
+                return PhoneNumberFormatter.formatNumber(n, account.getAccount());
             } catch (InvalidNumberException e) {
                 return "";
             }
@@ -385,6 +387,7 @@ public class ManagerImpl implements Manager {
         dependencies.getAccountManager().setGcmId(Optional.absent());
 
         account.setRegistered(false);
+        close();
     }
 
     @Override
@@ -399,6 +402,7 @@ public class ManagerImpl implements Manager {
         dependencies.getAccountManager().deleteAccount();
 
         account.setRegistered(false);
+        close();
     }
 
     @Override
@@ -679,6 +683,16 @@ public class ManagerImpl implements Manager {
         if (attachments != null) {
             messageBuilder.withAttachments(attachmentHelper.uploadAttachments(attachments));
         }
+        if (message.mentions().size() > 0) {
+            final var mentions = new ArrayList<SignalServiceDataMessage.Mention>();
+            for (final var m : message.mentions()) {
+                final var recipientId = resolveRecipient(m.recipient());
+                mentions.add(new SignalServiceDataMessage.Mention(resolveSignalServiceAddress(recipientId).getAci(),
+                        m.start(),
+                        m.length()));
+            }
+            messageBuilder.withMentions(mentions);
+        }
     }
 
     @Override
@@ -1041,7 +1055,10 @@ public class ManagerImpl implements Manager {
         while (!Thread.interrupted()) {
             SignalServiceEnvelope envelope;
             final CachedMessage[] cachedMessage = {null};
-            account.setLastReceiveTimestamp(System.currentTimeMillis());
+            final var nowMillis = System.currentTimeMillis();
+            if (nowMillis - account.getLastReceiveTimestamp() > 60000) {
+                account.setLastReceiveTimestamp(nowMillis);
+            }
             logger.debug("Checking for new message from server");
             try {
                 var result = signalWebSocket.readOrEmpty(unit.toMillis(timeout), envelope1 -> {
@@ -1261,7 +1278,7 @@ public class ManagerImpl implements Manager {
     /**
      * Trust this the identity with this fingerprint
      *
-     * @param recipient   username of the identity
+     * @param recipient   account of the identity
      * @param fingerprint Fingerprint
      */
     @Override
@@ -1278,7 +1295,7 @@ public class ManagerImpl implements Manager {
     /**
      * Trust this the identity with this safety number
      *
-     * @param recipient    username of the identity
+     * @param recipient    account of the identity
      * @param safetyNumber Safety number
      */
     @Override
@@ -1295,7 +1312,7 @@ public class ManagerImpl implements Manager {
     /**
      * Trust this the identity with this scannable safety number
      *
-     * @param recipient    username of the identity
+     * @param recipient    account of the identity
      * @param safetyNumber Scannable safety number
      */
     @Override
@@ -1312,7 +1329,7 @@ public class ManagerImpl implements Manager {
     /**
      * Trust all keys of this identity without verification
      *
-     * @param recipient username of the identity
+     * @param recipient account of the identity
      */
     @Override
     public boolean trustIdentityAllKeys(RecipientIdentifier.Single recipient) {
@@ -1325,6 +1342,13 @@ public class ManagerImpl implements Manager {
         return identityHelper.trustIdentityAllKeys(recipientId);
     }
 
+    @Override
+    public void addClosedListener(final Runnable listener) {
+        synchronized (closedListeners) {
+            closedListeners.add(listener);
+        }
+    }
+
     private void handleIdentityFailure(
             final RecipientId recipientId,
             final org.whispersystems.signalservice.api.messages.SendMessageResult.IdentityFailure identityFailure
@@ -1390,10 +1414,6 @@ public class ManagerImpl implements Manager {
 
     @Override
     public void close() throws IOException {
-        close(true);
-    }
-
-    private void close(boolean closeAccount) throws IOException {
         Thread thread;
         synchronized (messageHandlers) {
             weakHandlers.clear();
@@ -1408,7 +1428,12 @@ public class ManagerImpl implements Manager {
 
         dependencies.getSignalWebSocket().disconnect();
 
-        if (closeAccount && account != null) {
+        synchronized (closedListeners) {
+            closedListeners.forEach(Runnable::run);
+            closedListeners.clear();
+        }
+
+        if (account != null) {
             account.close();
         }
         account = null;