import org.asamk.signal.manager.api.Device;
import org.asamk.signal.manager.api.Group;
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.Message;
+import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.Pair;
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.TypingAction;
+import org.asamk.signal.manager.api.UpdateGroup;
import org.asamk.signal.manager.config.ServiceConfig;
import org.asamk.signal.manager.config.ServiceEnvironment;
import org.asamk.signal.manager.groups.GroupId;
import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
-import org.asamk.signal.manager.groups.GroupLinkState;
import org.asamk.signal.manager.groups.GroupNotFoundException;
-import org.asamk.signal.manager.groups.GroupPermission;
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.Contact;
import org.asamk.signal.manager.storage.recipients.Profile;
import org.asamk.signal.manager.storage.recipients.RecipientAddress;
-import org.whispersystems.libsignal.IdentityKey;
-import org.whispersystems.libsignal.InvalidKeyException;
-import org.whispersystems.libsignal.util.Pair;
-import org.whispersystems.libsignal.util.guava.Optional;
-import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException;
-import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId;
-import org.whispersystems.signalservice.api.messages.SignalServiceContent;
-import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
-import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
-import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedResponseException;
import java.io.Closeable;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
) throws IOException, NotRegisteredException {
var pathConfig = PathConfig.createDefault(settingsPath);
- if (!SignalAccount.userExists(pathConfig.getDataPath(), number)) {
+ if (!SignalAccount.userExists(pathConfig.dataPath(), number)) {
throw new NotRegisteredException();
}
- var account = SignalAccount.load(pathConfig.getDataPath(), number, true, trustNewIdentity);
+ var account = SignalAccount.load(pathConfig.dataPath(), number, true, trustNewIdentity);
if (!account.isRegistered()) {
throw new NotRegisteredException();
return new ManagerImpl(account, pathConfig, serviceEnvironmentConfig, userAgent);
}
+ static void initLogger() {
+ LibSignalLogger.initLogger();
+ }
+
+ static boolean isValidNumber(final String e164Number, final String countryCode) {
+ return PhoneNumberFormatter.isValidNumber(e164Number, countryCode);
+ }
+
static List<String> getAllLocalNumbers(File settingsPath) {
var pathConfig = PathConfig.createDefault(settingsPath);
- final var dataPath = pathConfig.getDataPath();
+ final var dataPath = pathConfig.dataPath();
final var files = dataPath.listFiles();
if (files == null) {
List<Device> getLinkedDevices() throws IOException;
- void removeLinkedDevices(int deviceId) throws IOException;
+ void removeLinkedDevices(long deviceId) throws IOException;
- void addDeviceLink(URI linkUri) throws IOException, InvalidKeyException;
+ void addDeviceLink(URI linkUri) throws IOException, InvalidDeviceLinkException;
- void setRegistrationLockPin(Optional<String> pin) throws IOException, UnauthenticatedResponseException;
+ void setRegistrationLockPin(Optional<String> pin) throws IOException;
- Profile getRecipientProfile(RecipientIdentifier.Single recipient) throws UnregisteredUserException;
+ Profile getRecipientProfile(RecipientIdentifier.Single recipient) throws IOException;
List<Group> getGroups();
) throws IOException, AttachmentInvalidException;
SendGroupMessageResults updateGroup(
- GroupId groupId,
- String name,
- String description,
- Set<RecipientIdentifier.Single> members,
- Set<RecipientIdentifier.Single> removeMembers,
- Set<RecipientIdentifier.Single> admins,
- Set<RecipientIdentifier.Single> removeAdmins,
- boolean resetGroupLink,
- GroupLinkState groupLinkState,
- GroupPermission addMemberPermission,
- GroupPermission editDetailsPermission,
- File avatarFile,
- Integer expirationTimer,
- Boolean isAnnouncementGroup
+ final GroupId groupId, final UpdateGroup updateGroup
) throws IOException, GroupNotFoundException, AttachmentInvalidException, NotAGroupMemberException, GroupSendingNotAllowedException;
Pair<GroupId, SendGroupMessageResults> joinGroup(
GroupInviteLinkUrl inviteLinkUrl
- ) throws IOException, GroupLinkNotActiveException;
+ ) throws IOException, InactiveGroupLinkException;
void sendTypingMessage(
TypingAction action, Set<RecipientIdentifier> recipients
void setContactName(
RecipientIdentifier.Single recipient, String name
- ) throws NotMasterDeviceException, UnregisteredUserException;
+ ) throws NotMasterDeviceException, IOException;
void setContactBlocked(
RecipientIdentifier.Single recipient, boolean blocked
void setGroupBlocked(
GroupId groupId, boolean blocked
- ) throws GroupNotFoundException, IOException;
+ ) throws GroupNotFoundException, IOException, NotMasterDeviceException;
void setExpirationTimer(
RecipientIdentifier.Single recipient, int messageExpirationTimer
void requestAllSyncData() throws IOException;
- void receiveMessages(
- long timeout,
- TimeUnit unit,
- boolean returnOnTimeout,
- boolean ignoreAttachments,
- ReceiveMessageHandler handler
- ) throws IOException;
+ /**
+ * Add a handler to receive new messages.
+ * Will start receiving messages from server, if not already started.
+ */
+ void addReceiveHandler(ReceiveMessageHandler handler);
+
+ /**
+ * Remove a handler to receive new messages.
+ * Will stop receiving messages from server, if this was the last registered receiver.
+ */
+ void removeReceiveHandler(ReceiveMessageHandler handler);
+
+ boolean isReceiving();
+
+ /**
+ * Receive new messages from server, returns if no new message arrive in a timespan of timeout.
+ */
+ void receiveMessages(long timeout, TimeUnit unit, ReceiveMessageHandler handler) throws IOException;
+
+ /**
+ * Receive new messages from server, returns only if the thread is interrupted.
+ */
+ void receiveMessages(ReceiveMessageHandler handler) throws IOException;
+
+ void setIgnoreAttachments(boolean ignoreAttachments);
boolean hasCaughtUpWithOldMessages();
boolean isContactBlocked(RecipientIdentifier.Single recipient);
- File getAttachmentFile(SignalServiceAttachmentRemoteId attachmentId);
-
void sendContacts() throws IOException;
List<Pair<RecipientAddress, Contact>> getContacts();
boolean trustIdentityAllKeys(RecipientIdentifier.Single recipient);
- String computeSafetyNumber(SignalServiceAddress theirAddress, IdentityKey theirIdentityKey);
-
- SignalServiceAddress resolveSignalServiceAddress(SignalServiceAddress address);
-
@Override
void close() throws IOException;
interface ReceiveMessageHandler {
- void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent decryptedContent, Throwable e);
+ void handleMessage(MessageEnvelope envelope, Throwable e);
}
}