import org.asamk.signal.manager.api.AlreadyReceivingException;
import org.asamk.signal.manager.api.AttachmentInvalidException;
+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.Group;
+import org.asamk.signal.manager.api.GroupId;
+import org.asamk.signal.manager.api.GroupInviteLinkUrl;
+import org.asamk.signal.manager.api.GroupNotFoundException;
+import org.asamk.signal.manager.api.GroupSendingNotAllowedException;
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.UpdateGroup;
import org.asamk.signal.manager.api.UpdateProfile;
import org.asamk.signal.manager.api.UserStatus;
-import org.asamk.signal.manager.groups.GroupId;
-import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
-import org.asamk.signal.manager.groups.GroupNotFoundException;
-import org.asamk.signal.manager.groups.GroupSendingNotAllowedException;
-import org.asamk.signal.manager.groups.LastGroupAdminException;
-import org.asamk.signal.manager.groups.NotAGroupMemberException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.net.URI;
import java.time.Duration;
import java.util.Collection;
import java.util.List;
return PhoneNumberFormatter.isValidNumber(e164Number, countryCode);
}
+ static boolean isSignalClientAvailable() {
+ final Logger logger = LoggerFactory.getLogger(Manager.class);
+ try {
+ try {
+ org.signal.libsignal.internal.Native.UuidCiphertext_CheckValidContents(new byte[0]);
+ } catch (Exception e) {
+ logger.trace("Expected exception when checking libsignal-client: {}", e.getMessage());
+ }
+ return true;
+ } catch (UnsatisfiedLinkError e) {
+ logger.warn("Failed to call libsignal-client: {}", e.getMessage());
+ return false;
+ }
+ }
+
String getSelfNumber();
/**
* @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;
Configuration getConfiguration();
- void updateConfiguration(Configuration configuration) throws IOException, NotPrimaryDeviceException;
+ void updateConfiguration(Configuration configuration) throws NotPrimaryDeviceException;
/**
* Update the user's profile.
*/
void deleteUsername() throws IOException;
+ void startChangeNumber(
+ String newNumber, boolean voiceVerification, String captcha
+ ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException;
+
+ void finishChangeNumber(
+ String newNumber, String verificationCode, String pin
+ ) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException;
+
void unregister() throws IOException;
void deleteAccount() throws IOException;
void removeLinkedDevices(int deviceId) throws IOException;
- void addDeviceLink(URI 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
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
*/
StickerPackUrl uploadStickerPack(File path) throws IOException, StickerPackInvalidException;
+ void installStickerPack(StickerPackUrl url) throws IOException;
+
List<StickerPack> getStickerPacks();
void requestAllSyncData() throws IOException;
List<Identity> getIdentities(RecipientIdentifier.Single recipient);
/**
- * Trust this the identity with this fingerprint
+ * Trust this the identity with this fingerprint/safetyNumber
*
- * @param recipient account of the identity
- * @param fingerprint Fingerprint
+ * @param recipient account of the identity
*/
boolean trustIdentityVerified(
- RecipientIdentifier.Single recipient, byte[] fingerprint
- ) throws UnregisteredRecipientException;
-
- /**
- * Trust this the identity with this safety number
- *
- * @param recipient account of the identity
- * @param safetyNumber Safety number
- */
- boolean trustIdentityVerifiedSafetyNumber(
- RecipientIdentifier.Single recipient, String safetyNumber
- ) throws UnregisteredRecipientException;
-
- /**
- * Trust this the identity with this scannable safety number
- *
- * @param recipient account of the identity
- * @param safetyNumber Scannable safety number
- */
- boolean trustIdentityVerifiedSafetyNumber(
- RecipientIdentifier.Single recipient, byte[] safetyNumber
+ RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode
) throws UnregisteredRecipientException;
/**
InputStream retrieveAttachment(final String id) throws IOException;
@Override
- void close() throws IOException;
+ void close();
interface ReceiveMessageHandler {