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;
private final Set<ReceiveMessageHandler> messageHandlers = new HashSet<>();
private final List<Runnable> closedListeners = new ArrayList<>();
private boolean isReceivingSynchronous;
+ private boolean needsToRetryFailedMessages = false;
ManagerImpl(
SignalAccount account,
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(),
account.getRecipientStore(),
this::handleIdentityFailure,
this::getGroupInfo,
- profileHelper::getRecipientProfile,
+ profileHelper,
this::refreshRegisteredUser);
this.groupHelper = new GroupHelper(account,
dependencies,
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;
}
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<>();
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();
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) {
} 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;
}
/**
} 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;
}
/**
} 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;
}
/**
} catch (IOException e) {
return false;
}
- return identityHelper.trustIdentityAllKeys(recipientId);
+ final var updated = identityHelper.trustIdentityAllKeys(recipientId);
+ if (updated && this.isReceiving()) {
+ needsToRetryFailedMessages = true;
+ }
+ return updated;
}
@Override