import org.asamk.signal.manager.NotMasterDeviceException;
import org.asamk.signal.manager.StickerPackInvalidException;
import org.asamk.signal.manager.UntrustedIdentityException;
+import org.asamk.signal.manager.api.Device;
import org.asamk.signal.manager.api.Message;
import org.asamk.signal.manager.api.RecipientIdentifier;
import org.asamk.signal.manager.api.TypingAction;
import org.asamk.signal.util.ErrorUtils;
import org.asamk.signal.util.Util;
import org.freedesktop.dbus.exceptions.DBusExecutionException;
+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 java.io.File;
import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
return objectPath;
}
+ @Override
+ public void addDevice(String uri) {
+ try {
+ m.addDeviceLink(new URI(uri));
+ } catch (IOException | InvalidKeyException e) {
+ throw new Error.Failure(e.getClass().getSimpleName() + " Add device link failed. " + e.getMessage());
+ } catch (URISyntaxException e) {
+ throw new Error.InvalidUri(e.getClass().getSimpleName()
+ + " Device link uri has invalid format: "
+ + e.getMessage());
+ }
+ }
+
+ @Override
+ public void removeDevice(int deviceId) {
+ try {
+ m.removeLinkedDevices(deviceId);
+ } catch (IOException e) {
+ throw new Error.Failure(e.getClass().getSimpleName() + ": Error while removing device: " + e.getMessage());
+ }
+ }
+
+ @Override
+ public List<String> listDevices() {
+ List<Device> devices;
+ List<String> results = new ArrayList<String>();
+
+ try {
+ devices = m.getLinkedDevices();
+ } catch (IOException | Error.Failure e) {
+ throw new Error.Failure("Failed to get linked devices: " + e.getMessage());
+ }
+
+ return devices.stream().map(d -> d.getName() == null ? "" : d.getName()).collect(Collectors.toList());
+ }
+
+ @Override
+ public void updateDeviceName(String deviceName) {
+ try {
+ m.updateAccountAttributes(deviceName);
+ } catch (IOException | Signal.Error.Failure e) {
+ throw new Error.Failure("UpdateAccount error: " + e.getMessage());
+ }
+ }
+
@Override
public long sendMessage(final String message, final List<String> attachments, final String recipient) {
var recipients = new ArrayList<String>(1);
) throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity {
try {
final var results = m.sendMessage(new Message(message, attachments),
- Set.of(new RecipientIdentifier.NoteToSelf()));
+ Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
checkSendMessageResults(results.getTimestamp(), results.getResults());
return results.getTimestamp();
} catch (AttachmentInvalidException e) {
return true;
}
+ @Override
+ public boolean isRegistered(String number) {
+ var result = isRegistered(List.of(number));
+ return result.get(0);
+ }
+
+ @Override
+ public List<Boolean> isRegistered(List<String> numbers) {
+ var results = new ArrayList<Boolean>();
+ if (numbers.isEmpty()) {
+ return results;
+ }
+
+ Map<String, Pair<String, UUID>> registered;
+ try {
+ registered = m.areUsersRegistered(new HashSet<>(numbers));
+ } catch (IOException e) {
+ throw new Error.Failure(e.getMessage());
+ }
+
+ return numbers.stream().map(number -> {
+ var uuid = registered.get(number).second();
+ return uuid != null;
+ }).collect(Collectors.toList());
+ }
+
+ @Override
+ public void updateProfile(
+ final String givenName,
+ final String familyName,
+ final String about,
+ final String aboutEmoji,
+ String avatarPath,
+ final boolean removeAvatar
+ ) {
+ try {
+ if (avatarPath.isEmpty()) {
+ avatarPath = null;
+ }
+ Optional<File> avatarFile = removeAvatar
+ ? Optional.absent()
+ : avatarPath == null ? null : Optional.of(new File(avatarPath));
+ m.setProfile(givenName, familyName, about, aboutEmoji, avatarFile);
+ } catch (IOException e) {
+ throw new Error.Failure(e.getMessage());
+ }
+ }
+
@Override
public void updateProfile(
final String name,