]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
Use java.util.Optional in Manager interface
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusSignalImpl.java
index 56ecdc55a9b3a6b5c91b0487f65e0baaae665dce..25c80ffbfb926ae2e907d49691293e854b6eee80 100644 (file)
@@ -31,7 +31,6 @@ import org.freedesktop.dbus.exceptions.DBusExecutionException;
 import org.freedesktop.dbus.types.Variant;
 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.SendMessageResult;
 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
@@ -50,6 +49,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
@@ -78,6 +78,7 @@ public class DbusSignalImpl implements Signal {
 
     public void close() {
         unExportDevices();
+        unExportGroups();
     }
 
     @Override
@@ -152,12 +153,12 @@ public class DbusSignalImpl implements Signal {
                             .map(RecipientIdentifier.class::cast)
                             .collect(Collectors.toSet()));
 
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
-            return results.getTimestamp();
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
         } catch (AttachmentInvalidException e) {
             throw new Error.AttachmentInvalid(e.getMessage());
         } catch (IOException e) {
-            throw new Error.Failure(e.getMessage());
+            throw new Error.Failure(e);
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
             throw new Error.GroupNotFound(e.getMessage());
         }
@@ -181,8 +182,8 @@ public class DbusSignalImpl implements Signal {
                     getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
                             .map(RecipientIdentifier.class::cast)
                             .collect(Collectors.toSet()));
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
-            return results.getTimestamp();
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
@@ -197,8 +198,8 @@ public class DbusSignalImpl implements Signal {
         try {
             final var results = m.sendRemoteDeleteMessage(targetSentTimestamp,
                     Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
-            return results.getTimestamp();
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
@@ -235,8 +236,8 @@ public class DbusSignalImpl implements Signal {
                     getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
                             .map(RecipientIdentifier.class::cast)
                             .collect(Collectors.toSet()));
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
-            return results.getTimestamp();
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
@@ -277,6 +278,19 @@ public class DbusSignalImpl implements Signal {
         }
     }
 
+    @Override
+    public void sendViewedReceipt(
+            final String recipient, final List<Long> messageIds
+    ) throws Error.Failure, Error.UntrustedIdentity {
+        try {
+            m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
+        } catch (IOException e) {
+            throw new Error.Failure(e.getMessage());
+        } catch (UntrustedIdentityException e) {
+            throw new Error.UntrustedIdentity(e.getMessage());
+        }
+    }
+
     @Override
     public void sendContacts() {
         try {
@@ -302,8 +316,8 @@ public class DbusSignalImpl implements Signal {
         try {
             final var results = m.sendMessage(new Message(message, attachments),
                     Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
-            return results.getTimestamp();
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
         } catch (AttachmentInvalidException e) {
             throw new Error.AttachmentInvalid(e.getMessage());
         } catch (IOException e) {
@@ -317,7 +331,7 @@ public class DbusSignalImpl implements Signal {
     public void sendEndSessionMessage(final List<String> recipients) {
         try {
             final var results = m.sendEndSessionMessage(getSingleRecipientIdentifiers(recipients, m.getSelfNumber()));
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
+            checkSendMessageResults(results.timestamp(), results.results());
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
         }
@@ -328,8 +342,8 @@ public class DbusSignalImpl implements Signal {
         try {
             var results = m.sendMessage(new Message(message, attachments),
                     Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
-            return results.getTimestamp();
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
@@ -353,8 +367,8 @@ public class DbusSignalImpl implements Signal {
                     getSingleRecipientIdentifier(targetAuthor, m.getSelfNumber()),
                     targetSentTimestamp,
                     Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
-            checkSendMessageResults(results.getTimestamp(), results.getResults());
-            return results.getTimestamp();
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
@@ -405,6 +419,8 @@ public class DbusSignalImpl implements Signal {
     public void setGroupBlocked(final byte[] groupId, final boolean blocked) {
         try {
             m.setGroupBlocked(getGroupId(groupId), blocked);
+        } catch (NotMasterDeviceException e) {
+            throw new Error.Failure("This command doesn't work on linked devices.");
         } catch (GroupNotFoundException e) {
             throw new Error.GroupNotFound(e.getMessage());
         } catch (IOException e) {
@@ -417,7 +433,7 @@ public class DbusSignalImpl implements Signal {
         var groups = m.getGroups();
         var ids = new ArrayList<byte[]>(groups.size());
         for (var group : groups) {
-            ids.add(group.getGroupId().serialize());
+            ids.add(group.groupId().serialize());
         }
         return ids;
     }
@@ -441,10 +457,10 @@ public class DbusSignalImpl implements Signal {
     @Override
     public String getGroupName(final byte[] groupId) {
         var group = m.getGroup(getGroupId(groupId));
-        if (group == null || group.getTitle() == null) {
+        if (group == null || group.title() == null) {
             return "";
         } else {
-            return group.getTitle();
+            return group.title();
         }
     }
 
@@ -454,7 +470,7 @@ public class DbusSignalImpl implements Signal {
         if (group == null) {
             return List.of();
         } else {
-            final var members = group.getMembers();
+            final var members = group.members();
             return getRecipientStrings(members);
         }
     }
@@ -475,7 +491,7 @@ public class DbusSignalImpl implements Signal {
             final var memberIdentifiers = getSingleRecipientIdentifiers(members, m.getSelfNumber());
             if (groupId == null) {
                 final var results = m.createGroup(name, memberIdentifiers, avatar == null ? null : new File(avatar));
-                checkSendMessageResults(results.second().getTimestamp(), results.second().getResults());
+                checkSendMessageResults(results.second().timestamp(), results.second().results());
                 return results.first().serialize();
             } else {
                 final var results = m.updateGroup(getGroupId(groupId),
@@ -485,7 +501,7 @@ public class DbusSignalImpl implements Signal {
                                 .withAvatarFile(avatar == null ? null : new File(avatar))
                                 .build());
                 if (results != null) {
-                    checkSendMessageResults(results.getTimestamp(), results.getResults());
+                    checkSendMessageResults(results.timestamp(), results.results());
                 }
                 return groupId;
             }
@@ -545,7 +561,7 @@ public class DbusSignalImpl implements Signal {
             aboutEmoji = nullIfEmpty(aboutEmoji);
             avatarPath = nullIfEmpty(avatarPath);
             Optional<File> avatarFile = removeAvatar
-                    ? Optional.absent()
+                    ? Optional.empty()
                     : avatarPath == null ? null : Optional.of(new File(avatarPath));
             m.setProfile(givenName, familyName, about, aboutEmoji, avatarFile);
         } catch (IOException e) {
@@ -567,7 +583,7 @@ public class DbusSignalImpl implements Signal {
     @Override
     public void removePin() {
         try {
-            m.setRegistrationLockPin(Optional.absent());
+            m.setRegistrationLockPin(Optional.empty());
         } catch (UnauthenticatedResponseException e) {
             throw new Error.Failure("Remove pin failed with unauthenticated response: " + e.getMessage());
         } catch (IOException e) {
@@ -597,8 +613,8 @@ public class DbusSignalImpl implements Signal {
     // all numbers the system knows
     @Override
     public List<String> listNumbers() {
-        return Stream.concat(m.getIdentities().stream().map(Identity::getRecipient),
-                m.getContacts().stream().map(Pair::first))
+        return Stream.concat(m.getIdentities().stream().map(Identity::recipient),
+                        m.getContacts().stream().map(Pair::first))
                 .map(a -> a.getNumber().orElse(null))
                 .filter(Objects::nonNull)
                 .distinct()
@@ -617,7 +633,7 @@ public class DbusSignalImpl implements Signal {
         }
         // Try profiles if no contact name was found
         for (var identity : m.getIdentities()) {
-            final var address = identity.getRecipient();
+            final var address = identity.recipient();
             var number = address.getNumber().orElse(null);
             if (number != null) {
                 Profile profile = null;
@@ -832,7 +848,7 @@ public class DbusSignalImpl implements Signal {
             if (d.isThisDevice()) {
                 thisDevice = new DBusPath(deviceObjectPath);
             }
-            this.devices.add(new StructDevice(new DBusPath(deviceObjectPath), d.getId(), emptyIfNull(d.getName())));
+            this.devices.add(new StructDevice(new DBusPath(deviceObjectPath), d.id(), emptyIfNull(d.name())));
         });
     }
 
@@ -859,15 +875,15 @@ public class DbusSignalImpl implements Signal {
         unExportGroups();
 
         groups.forEach(g -> {
-            final var object = new DbusSignalGroupImpl(g.getGroupId());
+            final var object = new DbusSignalGroupImpl(g.groupId());
             try {
                 connection.exportObject(object);
             } catch (DBusException e) {
                 e.printStackTrace();
             }
             this.groups.add(new StructGroup(new DBusPath(object.getObjectPath()),
-                    g.getGroupId().serialize(),
-                    emptyIfNull(g.getTitle())));
+                    g.groupId().serialize(),
+                    emptyIfNull(g.title())));
         });
     }
 
@@ -882,22 +898,22 @@ public class DbusSignalImpl implements Signal {
 
         public DbusSignalDeviceImpl(final org.asamk.signal.manager.api.Device device) {
             super.addPropertiesHandler(new DbusInterfacePropertiesHandler("org.asamk.Signal.Device",
-                    List.of(new DbusProperty<>("Id", device::getId),
-                            new DbusProperty<>("Name", () -> emptyIfNull(device.getName()), this::setDeviceName),
-                            new DbusProperty<>("Created", device::getCreated),
-                            new DbusProperty<>("LastSeen", device::getLastSeen))));
+                    List.of(new DbusProperty<>("Id", device::id),
+                            new DbusProperty<>("Name", () -> emptyIfNull(device.name()), this::setDeviceName),
+                            new DbusProperty<>("Created", device::created),
+                            new DbusProperty<>("LastSeen", device::lastSeen))));
             this.device = device;
         }
 
         @Override
         public String getObjectPath() {
-            return getDeviceObjectPath(objectPath, device.getId());
+            return getDeviceObjectPath(objectPath, device.id());
         }
 
         @Override
         public void removeDevice() throws Error.Failure {
             try {
-                m.removeLinkedDevices(device.getId());
+                m.removeLinkedDevices(device.id());
                 updateDevices();
             } catch (IOException e) {
                 throw new Error.Failure(e.getMessage());
@@ -926,36 +942,36 @@ public class DbusSignalImpl implements Signal {
             this.groupId = groupId;
             super.addPropertiesHandler(new DbusInterfacePropertiesHandler("org.asamk.Signal.Group",
                     List.of(new DbusProperty<>("Id", groupId::serialize),
-                            new DbusProperty<>("Name", () -> emptyIfNull(getGroup().getTitle()), this::setGroupName),
+                            new DbusProperty<>("Name", () -> emptyIfNull(getGroup().title()), this::setGroupName),
                             new DbusProperty<>("Description",
-                                    () -> emptyIfNull(getGroup().getDescription()),
+                                    () -> emptyIfNull(getGroup().description()),
                                     this::setGroupDescription),
                             new DbusProperty<>("Avatar", this::setGroupAvatar),
                             new DbusProperty<>("IsBlocked", () -> getGroup().isBlocked(), this::setIsBlocked),
                             new DbusProperty<>("IsMember", () -> getGroup().isMember()),
                             new DbusProperty<>("IsAdmin", () -> getGroup().isAdmin()),
                             new DbusProperty<>("MessageExpirationTimer",
-                                    () -> getGroup().getMessageExpirationTimer(),
+                                    () -> getGroup().messageExpirationTimer(),
                                     this::setMessageExpirationTime),
                             new DbusProperty<>("Members",
-                                    () -> new Variant<>(getRecipientStrings(getGroup().getMembers()), "as")),
+                                    () -> new Variant<>(getRecipientStrings(getGroup().members()), "as")),
                             new DbusProperty<>("PendingMembers",
-                                    () -> new Variant<>(getRecipientStrings(getGroup().getPendingMembers()), "as")),
+                                    () -> new Variant<>(getRecipientStrings(getGroup().pendingMembers()), "as")),
                             new DbusProperty<>("RequestingMembers",
-                                    () -> new Variant<>(getRecipientStrings(getGroup().getRequestingMembers()), "as")),
+                                    () -> new Variant<>(getRecipientStrings(getGroup().requestingMembers()), "as")),
                             new DbusProperty<>("Admins",
-                                    () -> new Variant<>(getRecipientStrings(getGroup().getAdminMembers()), "as")),
+                                    () -> new Variant<>(getRecipientStrings(getGroup().adminMembers()), "as")),
                             new DbusProperty<>("PermissionAddMember",
-                                    () -> getGroup().getPermissionAddMember().name(),
+                                    () -> getGroup().permissionAddMember().name(),
                                     this::setGroupPermissionAddMember),
                             new DbusProperty<>("PermissionEditDetails",
-                                    () -> getGroup().getPermissionEditDetails().name(),
+                                    () -> getGroup().permissionEditDetails().name(),
                                     this::setGroupPermissionEditDetails),
                             new DbusProperty<>("PermissionSendMessage",
-                                    () -> getGroup().getPermissionSendMessage().name(),
+                                    () -> getGroup().permissionSendMessage().name(),
                                     this::setGroupPermissionSendMessage),
                             new DbusProperty<>("GroupInviteLink", () -> {
-                                final var groupInviteLinkUrl = getGroup().getGroupInviteLinkUrl();
+                                final var groupInviteLinkUrl = getGroup().groupInviteLinkUrl();
                                 return groupInviteLinkUrl == null ? "" : groupInviteLinkUrl.getUrl();
                             }))));
         }
@@ -1060,6 +1076,8 @@ public class DbusSignalImpl implements Signal {
         private void setIsBlocked(final boolean isBlocked) {
             try {
                 m.setGroupBlocked(groupId, isBlocked);
+            } catch (NotMasterDeviceException e) {
+                throw new Error.Failure("This command doesn't work on linked devices.");
             } catch (GroupNotFoundException e) {
                 throw new Error.GroupNotFound(e.getMessage());
             } catch (IOException e) {