import org.asamk.signal.manager.api.AlreadyReceivingException;
import org.asamk.signal.manager.api.AttachmentInvalidException;
+import org.asamk.signal.manager.api.CaptchaRejectedException;
+import org.asamk.signal.manager.api.CaptchaRequiredException;
import org.asamk.signal.manager.api.Configuration;
import org.asamk.signal.manager.api.Device;
import org.asamk.signal.manager.api.DeviceLinkUrl;
import org.asamk.signal.manager.api.Identity;
import org.asamk.signal.manager.api.IdentityVerificationCode;
import org.asamk.signal.manager.api.InactiveGroupLinkException;
+import org.asamk.signal.manager.api.IncorrectPinException;
import org.asamk.signal.manager.api.InvalidDeviceLinkException;
import org.asamk.signal.manager.api.InvalidStickerException;
import org.asamk.signal.manager.api.InvalidUsernameException;
import org.asamk.signal.manager.api.LastGroupAdminException;
import org.asamk.signal.manager.api.Message;
import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
import org.asamk.signal.manager.api.NotAGroupMemberException;
import org.asamk.signal.manager.api.NotPrimaryDeviceException;
import org.asamk.signal.manager.api.Pair;
import org.asamk.signal.manager.api.PendingAdminApprovalException;
+import org.asamk.signal.manager.api.PinLockedException;
+import org.asamk.signal.manager.api.RateLimitException;
import org.asamk.signal.manager.api.ReceiveConfig;
import org.asamk.signal.manager.api.Recipient;
import org.asamk.signal.manager.api.RecipientIdentifier;
import org.asamk.signal.manager.api.SendGroupMessageResults;
import org.asamk.signal.manager.api.SendMessageResults;
import org.asamk.signal.manager.api.StickerPack;
+import org.asamk.signal.manager.api.StickerPackId;
import org.asamk.signal.manager.api.StickerPackInvalidException;
import org.asamk.signal.manager.api.StickerPackUrl;
import org.asamk.signal.manager.api.TypingAction;
import org.asamk.signal.manager.api.UpdateGroup;
import org.asamk.signal.manager.api.UpdateProfile;
import org.asamk.signal.manager.api.UserStatus;
+import org.asamk.signal.manager.api.UsernameLinkUrl;
+import org.asamk.signal.manager.api.VerificationMethodNotAvailableException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
* @return A map of numbers to canonicalized number and uuid. If a number is not registered the uuid is null.
* @throws IOException if it's unable to get the contacts to check if they're registered
*/
- Map<String, UserStatus> getUserStatus(Set<String> numbers) throws IOException;
+ Map<String, UserStatus> getUserStatus(Set<String> numbers) throws IOException, RateLimitException;
- void updateAccountAttributes(String deviceName) throws IOException;
+ void updateAccountAttributes(
+ String deviceName,
+ Boolean unrestrictedUnidentifiedSender,
+ final Boolean discoverableByNumber,
+ final Boolean numberSharing
+ ) throws IOException;
Configuration getConfiguration();
- void updateConfiguration(Configuration configuration) throws IOException, NotPrimaryDeviceException;
+ void updateConfiguration(Configuration configuration) throws NotPrimaryDeviceException;
/**
* Update the user's profile.
*/
void updateProfile(UpdateProfile updateProfile) throws IOException;
+ String getUsername();
+
+ UsernameLinkUrl getUsernameLink();
+
/**
* Set a username for the account.
* If the username is null, it will be deleted.
*/
- String setUsername(String username) throws IOException, InvalidUsernameException;
+ void setUsername(String username) throws IOException, InvalidUsernameException;
/**
* Set a username for the account.
*/
void deleteUsername() throws IOException;
+ void startChangeNumber(
+ String newNumber, boolean voiceVerification, String captcha
+ ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException, VerificationMethodNotAvailableException;
+
+ void finishChangeNumber(
+ String newNumber, String verificationCode, String pin
+ ) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException;
+
void unregister() throws IOException;
void deleteAccount() throws IOException;
- void submitRateLimitRecaptchaChallenge(String challenge, String captcha) throws IOException;
+ void submitRateLimitRecaptchaChallenge(
+ String challenge, String captcha
+ ) throws IOException, CaptchaRejectedException;
List<Device> getLinkedDevices() throws IOException;
- void removeLinkedDevices(int deviceId) throws IOException;
+ void removeLinkedDevices(int deviceId) throws IOException, NotPrimaryDeviceException;
- void addDeviceLink(DeviceLinkUrl linkUri) throws IOException, InvalidDeviceLinkException;
+ void addDeviceLink(DeviceLinkUrl linkUri) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException;
void setRegistrationLockPin(Optional<String> pin) throws IOException, NotPrimaryDeviceException;
SendMessageResults sendReadReceipt(
RecipientIdentifier.Single sender, List<Long> messageIds
- ) throws IOException;
+ );
SendMessageResults sendViewedReceipt(
RecipientIdentifier.Single sender, List<Long> messageIds
- ) throws IOException;
+ );
SendMessageResults sendMessage(
- Message message, Set<RecipientIdentifier> recipients
+ Message message, Set<RecipientIdentifier> recipients, boolean notifySelf
) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException, InvalidStickerException;
SendMessageResults sendEditMessage(
SendMessageResults sendEndSessionMessage(Set<RecipientIdentifier.Single> recipients) throws IOException;
+ SendMessageResults sendMessageRequestResponse(
+ MessageEnvelope.Sync.MessageRequestResponse.Type type, Set<RecipientIdentifier> recipientIdentifiers
+ );
+
+ void hideRecipient(RecipientIdentifier.Single recipient);
+
void deleteRecipient(RecipientIdentifier.Single recipient);
void deleteContact(RecipientIdentifier.Single recipient);
void setContactName(
RecipientIdentifier.Single recipient, String givenName, final String familyName
- ) throws NotPrimaryDeviceException, IOException, UnregisteredRecipientException;
+ ) throws NotPrimaryDeviceException, UnregisteredRecipientException;
void setContactsBlocked(
Collection<RecipientIdentifier.Single> recipient, boolean blocked
Optional<Duration> timeout, Optional<Integer> maxMessages, ReceiveMessageHandler handler
) throws IOException, AlreadyReceivingException;
+ void stopReceiveMessages();
+
void setReceiveConfig(ReceiveConfig receiveConfig);
boolean isContactBlocked(RecipientIdentifier.Single recipient);
InputStream retrieveAttachment(final String id) throws IOException;
+ InputStream retrieveContactAvatar(final RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException;
+
+ InputStream retrieveProfileAvatar(final RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException;
+
+ InputStream retrieveGroupAvatar(final GroupId groupId) throws IOException;
+
+ InputStream retrieveSticker(final StickerPackId stickerPackId, final int stickerId) throws IOException;
+
@Override
- void close() throws IOException;
+ void close();
interface ReceiveMessageHandler {