X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/ffcda46c31b586c786bae46ddddb405b5e7855cd..badbb55ef2151d7396c23be5a827c40712cd645a:/lib/src/main/java/org/asamk/signal/manager/Manager.java diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index bc26d87c..4bc4019c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -1,33 +1,37 @@ package org.asamk.signal.manager; +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.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.Message; import org.asamk.signal.manager.api.MessageEnvelope; +import org.asamk.signal.manager.api.NotPrimaryDeviceException; import org.asamk.signal.manager.api.Pair; +import org.asamk.signal.manager.api.ReceiveConfig; 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.StickerPackInvalidException; +import org.asamk.signal.manager.api.StickerPackUrl; import org.asamk.signal.manager.api.TypingAction; import org.asamk.signal.manager.api.UnregisteredRecipientException; 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.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.SignalAccount; -import org.asamk.signal.manager.storage.identities.TrustNewIdentity; -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.asamk.signal.manager.storage.recipients.Recipient; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import java.io.Closeable; @@ -35,68 +39,20 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.time.Duration; -import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.UUID; public interface Manager extends Closeable { - static Manager init( - String number, - File settingsPath, - ServiceEnvironment serviceEnvironment, - String userAgent, - TrustNewIdentity trustNewIdentity - ) throws IOException, NotRegisteredException { - var pathConfig = PathConfig.createDefault(settingsPath); - - if (!SignalAccount.userExists(pathConfig.dataPath(), number)) { - throw new NotRegisteredException(); - } - - var account = SignalAccount.load(pathConfig.dataPath(), number, true, trustNewIdentity); - - if (!account.isRegistered()) { - account.close(); - throw new NotRegisteredException(); - } - - final var serviceEnvironmentConfig = ServiceConfig.getServiceEnvironmentConfig(serviceEnvironment, userAgent); - - 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 getAllLocalAccountNumbers(File settingsPath) { - var pathConfig = PathConfig.createDefault(settingsPath); - final var dataPath = pathConfig.dataPath(); - final var files = dataPath.listFiles(); - - if (files == null) { - return List.of(); - } - - return Arrays.stream(files) - .filter(File::isFile) - .map(File::getName) - .filter(file -> PhoneNumberFormatter.isValidNumber(file, null)) - .toList(); - } - String getSelfNumber(); - void checkAccountState() throws IOException; - /** * This is used for checking a set of phone numbers for registration on Signal * @@ -104,24 +60,19 @@ public interface Manager extends Closeable { * @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> areUsersRegistered(Set numbers) throws IOException; + Map getUserStatus(Set numbers) throws IOException; void updateAccountAttributes(String deviceName) throws IOException; Configuration getConfiguration(); - void updateConfiguration(Configuration configuration) throws IOException, NotMasterDeviceException; + void updateConfiguration(Configuration configuration) throws IOException, NotPrimaryDeviceException; /** - * @param givenName if null, the previous givenName will be kept - * @param familyName if null, the previous familyName will be kept - * @param about if null, the previous about text will be kept - * @param aboutEmoji if null, the previous about emoji will be kept - * @param avatar if avatar is null the image from the local avatar store is used (if present), + * Update the user's profile. + * If a field is null, the previous value will be kept. */ - void setProfile( - String givenName, String familyName, String about, String aboutEmoji, Optional avatar - ) throws IOException; + void updateProfile(UpdateProfile updateProfile) throws IOException; void unregister() throws IOException; @@ -131,11 +82,11 @@ public interface Manager extends Closeable { List getLinkedDevices() throws IOException; - void removeLinkedDevices(long deviceId) throws IOException; + void removeLinkedDevices(int deviceId) throws IOException; void addDeviceLink(URI linkUri) throws IOException, InvalidDeviceLinkException; - void setRegistrationLockPin(Optional pin) throws IOException, NotMasterDeviceException; + void setRegistrationLockPin(Optional pin) throws IOException, NotPrimaryDeviceException; Profile getRecipientProfile(RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException; @@ -173,7 +124,7 @@ public interface Manager extends Closeable { SendMessageResults sendMessage( Message message, Set recipients - ) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException; + ) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException, InvalidStickerException; SendMessageResults sendRemoteDeleteMessage( long targetSentTimestamp, Set recipients @@ -187,6 +138,10 @@ public interface Manager extends Closeable { Set recipients ) throws IOException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException; + SendMessageResults sendPaymentNotificationMessage( + byte[] receipt, String note, RecipientIdentifier.Single recipient + ) throws IOException; + SendMessageResults sendEndSessionMessage(Set recipients) throws IOException; void deleteRecipient(RecipientIdentifier.Single recipient); @@ -194,16 +149,16 @@ public interface Manager extends Closeable { void deleteContact(RecipientIdentifier.Single recipient); void setContactName( - RecipientIdentifier.Single recipient, String name - ) throws NotMasterDeviceException, IOException, UnregisteredRecipientException; + RecipientIdentifier.Single recipient, String givenName, final String familyName + ) throws NotPrimaryDeviceException, IOException, UnregisteredRecipientException; - void setContactBlocked( - RecipientIdentifier.Single recipient, boolean blocked - ) throws NotMasterDeviceException, IOException, UnregisteredRecipientException; + void setContactsBlocked( + Collection recipient, boolean blocked + ) throws NotPrimaryDeviceException, IOException, UnregisteredRecipientException; - void setGroupBlocked( - GroupId groupId, boolean blocked - ) throws GroupNotFoundException, IOException, NotMasterDeviceException; + void setGroupsBlocked( + Collection groupId, boolean blocked + ) throws GroupNotFoundException, IOException, NotPrimaryDeviceException; /** * Change the expiration timer for a contact @@ -218,7 +173,9 @@ public interface Manager extends Closeable { * @param path Path can be a path to a manifest.json file or to a zip file that contains a manifest.json file * @return if successful, returns the URL to install the sticker pack in the signal app */ - URI uploadStickerPack(File path) throws IOException, StickerPackInvalidException; + StickerPackUrl uploadStickerPack(File path) throws IOException, StickerPackInvalidException; + + List getStickerPacks(); void requestAllSyncData() throws IOException; @@ -250,7 +207,7 @@ public interface Manager extends Closeable { */ void receiveMessages(ReceiveMessageHandler handler) throws IOException; - void setIgnoreAttachments(boolean ignoreAttachments); + void setReceiveConfig(ReceiveConfig receiveConfig); boolean hasCaughtUpWithOldMessages(); @@ -258,7 +215,12 @@ public interface Manager extends Closeable { void sendContacts() throws IOException; - List> getContacts(); + List getRecipients( + boolean onlyContacts, + Optional blocked, + Collection address, + Optional name + ); String getContactOrProfileName(RecipientIdentifier.Single recipient); @@ -305,6 +267,8 @@ public interface Manager extends Closeable { */ boolean trustIdentityAllKeys(RecipientIdentifier.Single recipient) throws UnregisteredRecipientException; + void addAddressChangedListener(Runnable listener); + void addClosedListener(Runnable listener); @Override