]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
Paralellize profile fetching
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / ManagerImpl.java
index cb9e473052fbb0572f0315ad480146e7c11b6332..dd74d22c48f0296cf9029a495ddcf764fb8eb655 100644 (file)
@@ -78,6 +78,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
 import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
+import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
 import org.whispersystems.signalservice.api.util.DeviceNameUtil;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
@@ -151,6 +152,7 @@ public class ManagerImpl implements Manager {
     private final Set<ReceiveMessageHandler> messageHandlers = new HashSet<>();
     private final List<Runnable> closedListeners = new ArrayList<>();
     private boolean isReceivingSynchronous;
+    private boolean needsToRetryFailedMessages = false;
 
     ManagerImpl(
             SignalAccount account,
@@ -195,8 +197,7 @@ public class ManagerImpl implements Manager {
                 avatarStore,
                 unidentifiedAccessHelper::getAccessFor,
                 this::resolveSignalServiceAddress);
-        final GroupV2Helper groupV2Helper = new GroupV2Helper(profileHelper::getRecipientProfileKeyCredential,
-                profileHelper::getRecipientProfile,
+        final GroupV2Helper groupV2Helper = new GroupV2Helper(profileHelper,
                 account::getSelfRecipientId,
                 dependencies.getGroupsV2Operations(),
                 dependencies.getGroupsV2Api(),
@@ -208,7 +209,7 @@ public class ManagerImpl implements Manager {
                 account.getRecipientStore(),
                 this::handleIdentityFailure,
                 this::getGroupInfo,
-                profileHelper::getRecipientProfile,
+                profileHelper,
                 this::refreshRegisteredUser);
         this.groupHelper = new GroupHelper(account,
                 dependencies,
@@ -910,11 +911,11 @@ public class ManagerImpl implements Manager {
         try {
             aciMap = getRegisteredUsers(Set.of(number));
         } catch (NumberFormatException e) {
-            throw new IOException(number, e);
+            throw new UnregisteredUserException(number, e);
         }
         final var uuid = aciMap.get(number);
         if (uuid == null) {
-            throw new IOException(number, null);
+            throw new UnregisteredUserException(number, null);
         }
         return uuid;
     }
@@ -1102,7 +1103,7 @@ public class ManagerImpl implements Manager {
     private void receiveMessagesInternal(
             Duration timeout, boolean returnOnTimeout, ReceiveMessageHandler handler
     ) throws IOException {
-        retryFailedReceivedMessages(handler);
+        needsToRetryFailedMessages = true;
 
         // Use a Map here because java Set doesn't have a get method ...
         Map<HandleAction, HandleAction> queuedActions = new HashMap<>();
@@ -1121,6 +1122,10 @@ public class ManagerImpl implements Manager {
         final var MAX_BACKOFF_COUNTER = 9;
 
         while (!Thread.interrupted()) {
+            if (needsToRetryFailedMessages) {
+                retryFailedReceivedMessages(handler);
+                needsToRetryFailedMessages = false;
+            }
             SignalServiceEnvelope envelope;
             final CachedMessage[] cachedMessage = {null};
             final var nowMillis = System.currentTimeMillis();
@@ -1247,6 +1252,7 @@ public class ManagerImpl implements Manager {
         logger.debug("Handling message actions");
         var interrupted = false;
         for (var action : queuedActions) {
+            logger.debug("Executing action {}", action.getClass().getSimpleName());
             try {
                 action.execute(context);
             } catch (Throwable e) {
@@ -1365,7 +1371,11 @@ public class ManagerImpl implements Manager {
         } catch (IOException e) {
             return false;
         }
-        return identityHelper.trustIdentityVerified(recipientId, fingerprint);
+        final var updated = identityHelper.trustIdentityVerified(recipientId, fingerprint);
+        if (updated && this.isReceiving()) {
+            needsToRetryFailedMessages = true;
+        }
+        return updated;
     }
 
     /**
@@ -1382,7 +1392,11 @@ public class ManagerImpl implements Manager {
         } catch (IOException e) {
             return false;
         }
-        return identityHelper.trustIdentityVerifiedSafetyNumber(recipientId, safetyNumber);
+        final var updated = identityHelper.trustIdentityVerifiedSafetyNumber(recipientId, safetyNumber);
+        if (updated && this.isReceiving()) {
+            needsToRetryFailedMessages = true;
+        }
+        return updated;
     }
 
     /**
@@ -1399,7 +1413,11 @@ public class ManagerImpl implements Manager {
         } catch (IOException e) {
             return false;
         }
-        return identityHelper.trustIdentityVerifiedSafetyNumber(recipientId, safetyNumber);
+        final var updated = identityHelper.trustIdentityVerifiedSafetyNumber(recipientId, safetyNumber);
+        if (updated && this.isReceiving()) {
+            needsToRetryFailedMessages = true;
+        }
+        return updated;
     }
 
     /**
@@ -1415,7 +1433,11 @@ public class ManagerImpl implements Manager {
         } catch (IOException e) {
             return false;
         }
-        return identityHelper.trustIdentityAllKeys(recipientId);
+        final var updated = identityHelper.trustIdentityAllKeys(recipientId);
+        if (updated && this.isReceiving()) {
+            needsToRetryFailedMessages = true;
+        }
+        return updated;
     }
 
     @Override