package org.asamk.signal.manager;
+import org.asamk.signal.manager.api.AlreadyReceivingException;
import org.asamk.signal.manager.api.AttachmentInvalidException;
import org.asamk.signal.manager.api.Configuration;
import org.asamk.signal.manager.api.Device;
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.InactiveGroupLinkException;
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.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.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.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.asamk.signal.manager.storage.recipients.Profile;
-import org.asamk.signal.manager.storage.recipients.Recipient;
+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;
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();
/**
*/
void updateProfile(UpdateProfile updateProfile) throws IOException;
+ /**
+ * Set a username for the account.
+ * If the username is null, it will be deleted.
+ */
+ String setUsername(String username) throws IOException, InvalidUsernameException;
+
+ /**
+ * Set a username for the account.
+ * If the username is null, it will be deleted.
+ */
+ void deleteUsername() throws IOException;
+
void unregister() throws IOException;
void deleteAccount() throws IOException;
void setRegistrationLockPin(Optional<String> pin) throws IOException, NotPrimaryDeviceException;
- Profile getRecipientProfile(RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException;
-
List<Group> getGroups();
SendGroupMessageResults quitGroup(
void deleteGroup(GroupId groupId) throws IOException;
Pair<GroupId, SendGroupMessageResults> createGroup(
- String name, Set<RecipientIdentifier.Single> members, File avatarFile
+ String name, Set<RecipientIdentifier.Single> members, String avatarFile
) throws IOException, AttachmentInvalidException, UnregisteredRecipientException;
SendGroupMessageResults updateGroup(
Pair<GroupId, SendGroupMessageResults> joinGroup(
GroupInviteLinkUrl inviteLinkUrl
- ) throws IOException, InactiveGroupLinkException;
+ ) throws IOException, InactiveGroupLinkException, PendingAdminApprovalException;
SendMessageResults sendTypingMessage(
TypingAction action, Set<RecipientIdentifier> recipients
Message message, Set<RecipientIdentifier> recipients
) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException, InvalidStickerException;
+ SendMessageResults sendEditMessage(
+ Message message, Set<RecipientIdentifier> recipients, long editTargetTimestamp
+ ) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException, InvalidStickerException;
+
SendMessageResults sendRemoteDeleteMessage(
long targetSentTimestamp, Set<RecipientIdentifier> recipients
) throws IOException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException;
boolean remove,
RecipientIdentifier.Single targetAuthor,
long targetSentTimestamp,
- Set<RecipientIdentifier> recipients
+ Set<RecipientIdentifier> recipients,
+ final boolean isStory
) throws IOException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException;
SendMessageResults sendPaymentNotificationMessage(
void deleteContact(RecipientIdentifier.Single recipient);
void setContactName(
- RecipientIdentifier.Single recipient, String name
+ RecipientIdentifier.Single recipient, String givenName, final String familyName
) throws NotPrimaryDeviceException, IOException, UnregisteredRecipientException;
void setContactsBlocked(
/**
* Receive new messages from server, returns if no new message arrive in a timespan of timeout.
*/
- void receiveMessages(Duration timeout, ReceiveMessageHandler handler) throws IOException;
-
- /**
- * Receive new messages from server, returns only if the thread is interrupted.
- */
- void receiveMessages(ReceiveMessageHandler handler) throws IOException;
+ void receiveMessages(
+ Optional<Duration> timeout, Optional<Integer> maxMessages, ReceiveMessageHandler handler
+ ) throws IOException, AlreadyReceivingException;
- void setIgnoreAttachments(boolean ignoreAttachments);
-
- boolean hasCaughtUpWithOldMessages();
+ void setReceiveConfig(ReceiveConfig receiveConfig);
boolean isContactBlocked(RecipientIdentifier.Single recipient);
void addClosedListener(Runnable listener);
+ InputStream retrieveAttachment(final String id) throws IOException;
+
@Override
void close() throws IOException;