diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index e2bacc48..9cbd20b7 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -26,14 +26,14 @@
+
+
+
-
-
-
@@ -52,6 +52,7 @@
+
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
index 31de50e0..c12ad0a4 100644
--- a/lib/build.gradle.kts
+++ b/lib/build.gradle.kts
@@ -15,6 +15,7 @@ repositories {
dependencies {
api("com.github.turasa:signal-service-java:2.15.3_unofficial_31")
+ api("com.fasterxml.jackson.core", "jackson-databind", "2.13.0")
implementation("com.google.protobuf:protobuf-javalite:3.10.0")
implementation("org.bouncycastle:bcprov-jdk15on:1.69")
implementation("org.slf4j:slf4j-api:1.7.32")
diff --git a/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java b/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java
index 3ba1ef20..3e35aced 100644
--- a/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java
+++ b/lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java
@@ -15,10 +15,7 @@ import java.util.Map;
import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
-public class DeviceLinkInfo {
-
- final String deviceIdentifier;
- final ECPublicKey deviceKey;
+public record DeviceLinkInfo(String deviceIdentifier, ECPublicKey deviceKey) {
public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws InvalidKeyException {
final var rawQuery = linkUri.getRawQuery();
@@ -57,11 +54,6 @@ public class DeviceLinkInfo {
return map;
}
- public DeviceLinkInfo(final String deviceIdentifier, final ECPublicKey deviceKey) {
- this.deviceIdentifier = deviceIdentifier;
- this.deviceKey = deviceKey;
- }
-
public URI createDeviceLinkUri() {
final var deviceKeyString = Base64.getEncoder().encodeToString(deviceKey.serialize()).replace("=", "");
try {
diff --git a/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java b/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java
index 74ee6d02..89114426 100644
--- a/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java
+++ b/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java
@@ -1,55 +1,8 @@
package org.asamk.signal.manager;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
import java.util.List;
-public class JsonStickerPack {
+public record JsonStickerPack(String title, String author, JsonSticker cover, List stickers) {
- @JsonProperty
- public String title;
-
- @JsonProperty
- public String author;
-
- @JsonProperty
- public JsonSticker cover;
-
- @JsonProperty
- public List stickers;
-
- // For deserialization
- private JsonStickerPack() {
- }
-
- public JsonStickerPack(
- final String title, final String author, final JsonSticker cover, final List stickers
- ) {
- this.title = title;
- this.author = author;
- this.cover = cover;
- this.stickers = stickers;
- }
-
- public static class JsonSticker {
-
- @JsonProperty
- public String emoji;
-
- @JsonProperty
- public String file;
-
- @JsonProperty
- public String contentType;
-
- // For deserialization
- private JsonSticker() {
- }
-
- public JsonSticker(final String emoji, final String file, final String contentType) {
- this.emoji = emoji;
- this.file = file;
- this.contentType = contentType;
- }
- }
+ public record JsonSticker(String emoji, String file, String contentType) {}
}
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 0a8762d9..2cb68d20 100644
--- a/lib/src/main/java/org/asamk/signal/manager/Manager.java
+++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java
@@ -57,11 +57,11 @@ public interface Manager extends Closeable {
) 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();
@@ -74,7 +74,7 @@ public interface Manager extends Closeable {
static List 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) {
diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
index 1a1e735e..fe26e9b4 100644
--- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
+++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
@@ -169,9 +169,9 @@ public class ManagerImpl implements Manager {
account.getSignalProtocolStore(),
executor,
sessionLock);
- final var avatarStore = new AvatarStore(pathConfig.getAvatarsPath());
- final var attachmentStore = new AttachmentStore(pathConfig.getAttachmentsPath());
- final var stickerPackStore = new StickerPackStore(pathConfig.getStickerPacksPath());
+ final var avatarStore = new AvatarStore(pathConfig.avatarsPath());
+ final var attachmentStore = new AttachmentStore(pathConfig.attachmentsPath());
+ final var stickerPackStore = new StickerPackStore(pathConfig.stickerPacksPath());
this.attachmentHelper = new AttachmentHelper(dependencies, attachmentStore);
this.pinHelper = new PinHelper(dependencies.getKeyBackupService());
@@ -426,7 +426,7 @@ public class ManagerImpl implements Manager {
public void addDeviceLink(URI linkUri) throws IOException, InvalidKeyException {
var info = DeviceLinkInfo.parseDeviceLinkUri(linkUri);
- addDevice(info.deviceIdentifier, info.deviceKey);
+ addDevice(info.deviceIdentifier(), info.deviceKey());
}
private void addDevice(String deviceIdentifier, ECPublicKey deviceKey) throws IOException, InvalidKeyException {
@@ -642,8 +642,8 @@ public class ManagerImpl implements Manager {
private void applyMessage(
final SignalServiceDataMessage.Builder messageBuilder, final Message message
) throws AttachmentInvalidException, IOException {
- messageBuilder.withBody(message.getMessageText());
- final var attachments = message.getAttachments();
+ messageBuilder.withBody(message.messageText());
+ final var attachments = message.attachments();
if (attachments != null) {
messageBuilder.withAttachments(attachmentHelper.uploadAttachments(attachments));
}
diff --git a/lib/src/main/java/org/asamk/signal/manager/PathConfig.java b/lib/src/main/java/org/asamk/signal/manager/PathConfig.java
index 2c851080..d045ac4a 100644
--- a/lib/src/main/java/org/asamk/signal/manager/PathConfig.java
+++ b/lib/src/main/java/org/asamk/signal/manager/PathConfig.java
@@ -2,12 +2,9 @@ package org.asamk.signal.manager;
import java.io.File;
-public class PathConfig {
-
- private final File dataPath;
- private final File attachmentsPath;
- private final File avatarsPath;
- private final File stickerPacksPath;
+public record PathConfig(
+ File dataPath, File attachmentsPath, File avatarsPath, File stickerPacksPath
+) {
public static PathConfig createDefault(final File settingsPath) {
return new PathConfig(new File(settingsPath, "data"),
@@ -15,29 +12,4 @@ public class PathConfig {
new File(settingsPath, "avatars"),
new File(settingsPath, "stickers"));
}
-
- private PathConfig(
- final File dataPath, final File attachmentsPath, final File avatarsPath, final File stickerPacksPath
- ) {
- this.dataPath = dataPath;
- this.attachmentsPath = attachmentsPath;
- this.avatarsPath = avatarsPath;
- this.stickerPacksPath = stickerPacksPath;
- }
-
- public File getDataPath() {
- return dataPath;
- }
-
- public File getAttachmentsPath() {
- return attachmentsPath;
- }
-
- public File getAvatarsPath() {
- return avatarsPath;
- }
-
- public File getStickerPacksPath() {
- return stickerPacksPath;
- }
}
diff --git a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java
index c7876569..8855e062 100644
--- a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java
+++ b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java
@@ -95,8 +95,8 @@ public class ProvisioningManager {
logger.info("Received link information from {}, linking in progress ...", number);
- if (SignalAccount.userExists(pathConfig.getDataPath(), number) && !canRelinkExistingAccount(number)) {
- throw new UserAlreadyExists(number, SignalAccount.getFileName(pathConfig.getDataPath(), number));
+ if (SignalAccount.userExists(pathConfig.dataPath(), number) && !canRelinkExistingAccount(number)) {
+ throw new UserAlreadyExists(number, SignalAccount.getFileName(pathConfig.dataPath(), number));
}
var encryptedDeviceName = deviceName == null
@@ -115,7 +115,7 @@ public class ProvisioningManager {
SignalAccount account = null;
try {
- account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.getDataPath(),
+ account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.dataPath(),
number,
ret.getUuid(),
password,
@@ -165,7 +165,7 @@ public class ProvisioningManager {
private boolean canRelinkExistingAccount(final String number) throws IOException {
final SignalAccount signalAccount;
try {
- signalAccount = SignalAccount.load(pathConfig.getDataPath(), number, false, TrustNewIdentity.ON_FIRST_USE);
+ signalAccount = SignalAccount.load(pathConfig.dataPath(), number, false, TrustNewIdentity.ON_FIRST_USE);
} catch (IOException e) {
logger.debug("Account in use or failed to load.", e);
return false;
diff --git a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java
index c42782f7..8a96dad0 100644
--- a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java
+++ b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java
@@ -96,12 +96,12 @@ public class RegistrationManager implements Closeable {
var pathConfig = PathConfig.createDefault(settingsPath);
final var serviceConfiguration = ServiceConfig.getServiceEnvironmentConfig(serviceEnvironment, userAgent);
- if (!SignalAccount.userExists(pathConfig.getDataPath(), number)) {
+ if (!SignalAccount.userExists(pathConfig.dataPath(), number)) {
var identityKey = KeyUtils.generateIdentityKeyPair();
var registrationId = KeyHelper.generateRegistrationId(false);
var profileKey = KeyUtils.createProfileKey();
- var account = SignalAccount.create(pathConfig.getDataPath(),
+ var account = SignalAccount.create(pathConfig.dataPath(),
number,
identityKey,
registrationId,
@@ -111,7 +111,7 @@ public class RegistrationManager implements Closeable {
return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent);
}
- var account = SignalAccount.load(pathConfig.getDataPath(), number, true, TrustNewIdentity.ON_FIRST_USE);
+ var account = SignalAccount.load(pathConfig.dataPath(), number, true, TrustNewIdentity.ON_FIRST_USE);
return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent);
}
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/Device.java b/lib/src/main/java/org/asamk/signal/manager/api/Device.java
index 9ee0d36a..bd67052d 100644
--- a/lib/src/main/java/org/asamk/signal/manager/api/Device.java
+++ b/lib/src/main/java/org/asamk/signal/manager/api/Device.java
@@ -1,38 +1,3 @@
package org.asamk.signal.manager.api;
-public class Device {
-
- private final long id;
- private final String name;
- private final long created;
- private final long lastSeen;
- private final boolean thisDevice;
-
- public Device(long id, String name, long created, long lastSeen, final boolean thisDevice) {
- this.id = id;
- this.name = name;
- this.created = created;
- this.lastSeen = lastSeen;
- this.thisDevice = thisDevice;
- }
-
- public long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public long getCreated() {
- return created;
- }
-
- public long getLastSeen() {
- return lastSeen;
- }
-
- public boolean isThisDevice() {
- return thisDevice;
- }
-}
+public record Device(long id, String name, long created, long lastSeen, boolean isThisDevice) {}
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/Group.java b/lib/src/main/java/org/asamk/signal/manager/api/Group.java
index 4787ef95..88be3539 100644
--- a/lib/src/main/java/org/asamk/signal/manager/api/Group.java
+++ b/lib/src/main/java/org/asamk/signal/manager/api/Group.java
@@ -7,116 +7,20 @@ import org.asamk.signal.manager.storage.recipients.RecipientAddress;
import java.util.Set;
-public class Group {
-
- private final GroupId groupId;
- private final String title;
- private final String description;
- private final GroupInviteLinkUrl groupInviteLinkUrl;
- private final Set members;
- private final Set pendingMembers;
- private final Set requestingMembers;
- private final Set adminMembers;
- private final boolean isBlocked;
- private final int messageExpirationTimer;
-
- private final GroupPermission permissionAddMember;
- private final GroupPermission permissionEditDetails;
- private final GroupPermission permissionSendMessage;
- private final boolean isMember;
- private final boolean isAdmin;
-
- public Group(
- final GroupId groupId,
- final String title,
- final String description,
- final GroupInviteLinkUrl groupInviteLinkUrl,
- final Set members,
- final Set pendingMembers,
- final Set requestingMembers,
- final Set adminMembers,
- final boolean isBlocked,
- final int messageExpirationTimer,
- final GroupPermission permissionAddMember,
- final GroupPermission permissionEditDetails,
- final GroupPermission permissionSendMessage,
- final boolean isMember,
- final boolean isAdmin
- ) {
- this.groupId = groupId;
- this.title = title;
- this.description = description;
- this.groupInviteLinkUrl = groupInviteLinkUrl;
- this.members = members;
- this.pendingMembers = pendingMembers;
- this.requestingMembers = requestingMembers;
- this.adminMembers = adminMembers;
- this.isBlocked = isBlocked;
- this.messageExpirationTimer = messageExpirationTimer;
- this.permissionAddMember = permissionAddMember;
- this.permissionEditDetails = permissionEditDetails;
- this.permissionSendMessage = permissionSendMessage;
- this.isMember = isMember;
- this.isAdmin = isAdmin;
- }
-
- public GroupId getGroupId() {
- return groupId;
- }
-
- public String getTitle() {
- return title;
- }
-
- public String getDescription() {
- return description;
- }
-
- public GroupInviteLinkUrl getGroupInviteLinkUrl() {
- return groupInviteLinkUrl;
- }
-
- public Set getMembers() {
- return members;
- }
-
- public Set getPendingMembers() {
- return pendingMembers;
- }
-
- public Set getRequestingMembers() {
- return requestingMembers;
- }
-
- public Set getAdminMembers() {
- return adminMembers;
- }
-
- public boolean isBlocked() {
- return isBlocked;
- }
-
- public int getMessageExpirationTimer() {
- return messageExpirationTimer;
- }
-
- public GroupPermission getPermissionAddMember() {
- return permissionAddMember;
- }
-
- public GroupPermission getPermissionEditDetails() {
- return permissionEditDetails;
- }
-
- public GroupPermission getPermissionSendMessage() {
- return permissionSendMessage;
- }
-
- public boolean isMember() {
- return isMember;
- }
-
- public boolean isAdmin() {
- return isAdmin;
- }
-}
+public record Group(
+ GroupId groupId,
+ String title,
+ String description,
+ GroupInviteLinkUrl groupInviteLinkUrl,
+ Set members,
+ Set pendingMembers,
+ Set requestingMembers,
+ Set adminMembers,
+ boolean isBlocked,
+ int messageExpirationTimer,
+ GroupPermission permissionAddMember,
+ GroupPermission permissionEditDetails,
+ GroupPermission permissionSendMessage,
+ boolean isMember,
+ boolean isAdmin
+) {}
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/Identity.java b/lib/src/main/java/org/asamk/signal/manager/api/Identity.java
index 4f6f21f6..37d298f9 100644
--- a/lib/src/main/java/org/asamk/signal/manager/api/Identity.java
+++ b/lib/src/main/java/org/asamk/signal/manager/api/Identity.java
@@ -6,60 +6,16 @@ import org.whispersystems.libsignal.IdentityKey;
import java.util.Date;
-public class Identity {
-
- private final RecipientAddress recipient;
- private final IdentityKey identityKey;
- private final String safetyNumber;
- private final byte[] scannableSafetyNumber;
- private final TrustLevel trustLevel;
- private final Date dateAdded;
-
- public Identity(
- final RecipientAddress recipient,
- final IdentityKey identityKey,
- final String safetyNumber,
- final byte[] scannableSafetyNumber,
- final TrustLevel trustLevel,
- final Date dateAdded
- ) {
- this.recipient = recipient;
- this.identityKey = identityKey;
- this.safetyNumber = safetyNumber;
- this.scannableSafetyNumber = scannableSafetyNumber;
- this.trustLevel = trustLevel;
- this.dateAdded = dateAdded;
- }
-
- public RecipientAddress getRecipient() {
- return recipient;
- }
-
- public IdentityKey getIdentityKey() {
- return this.identityKey;
- }
-
- public TrustLevel getTrustLevel() {
- return this.trustLevel;
- }
-
- boolean isTrusted() {
- return trustLevel == TrustLevel.TRUSTED_UNVERIFIED || trustLevel == TrustLevel.TRUSTED_VERIFIED;
- }
-
- public Date getDateAdded() {
- return this.dateAdded;
- }
+public record Identity(
+ RecipientAddress recipient,
+ IdentityKey identityKey,
+ String safetyNumber,
+ byte[] scannableSafetyNumber,
+ TrustLevel trustLevel,
+ Date dateAdded
+) {
public byte[] getFingerprint() {
return identityKey.getPublicKey().serialize();
}
-
- public String getSafetyNumber() {
- return safetyNumber;
- }
-
- public byte[] getScannableSafetyNumber() {
- return scannableSafetyNumber;
- }
}
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/Message.java b/lib/src/main/java/org/asamk/signal/manager/api/Message.java
index dee18524..83666003 100644
--- a/lib/src/main/java/org/asamk/signal/manager/api/Message.java
+++ b/lib/src/main/java/org/asamk/signal/manager/api/Message.java
@@ -2,21 +2,4 @@ package org.asamk.signal.manager.api;
import java.util.List;
-public class Message {
-
- private final String messageText;
- private final List attachments;
-
- public Message(final String messageText, final List attachments) {
- this.messageText = messageText;
- this.attachments = attachments;
- }
-
- public String getMessageText() {
- return messageText;
- }
-
- public List getAttachments() {
- return attachments;
- }
-}
+public record Message(String messageText, List attachments) {}
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/SendGroupMessageResults.java b/lib/src/main/java/org/asamk/signal/manager/api/SendGroupMessageResults.java
index d5c9ef91..54f55b92 100644
--- a/lib/src/main/java/org/asamk/signal/manager/api/SendGroupMessageResults.java
+++ b/lib/src/main/java/org/asamk/signal/manager/api/SendGroupMessageResults.java
@@ -4,23 +4,4 @@ import org.whispersystems.signalservice.api.messages.SendMessageResult;
import java.util.List;
-public class SendGroupMessageResults {
-
- private final long timestamp;
- private final List results;
-
- public SendGroupMessageResults(
- final long timestamp, final List results
- ) {
- this.timestamp = timestamp;
- this.results = results;
- }
-
- public long getTimestamp() {
- return timestamp;
- }
-
- public List getResults() {
- return results;
- }
-}
+public record SendGroupMessageResults(long timestamp, List results) {}
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java b/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java
index ff323919..064532c0 100644
--- a/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java
+++ b/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResults.java
@@ -5,23 +5,4 @@ import org.whispersystems.signalservice.api.messages.SendMessageResult;
import java.util.List;
import java.util.Map;
-public class SendMessageResults {
-
- private final long timestamp;
- private final Map> results;
-
- public SendMessageResults(
- final long timestamp, final Map> results
- ) {
- this.timestamp = timestamp;
- this.results = results;
- }
-
- public long getTimestamp() {
- return timestamp;
- }
-
- public Map> getResults() {
- return results;
- }
-}
+public record SendMessageResults(long timestamp, Map> results) {}
diff --git a/lib/src/main/java/org/asamk/signal/manager/configuration/ConfigurationStore.java b/lib/src/main/java/org/asamk/signal/manager/configuration/ConfigurationStore.java
index e7e1b5f5..09d5162e 100644
--- a/lib/src/main/java/org/asamk/signal/manager/configuration/ConfigurationStore.java
+++ b/lib/src/main/java/org/asamk/signal/manager/configuration/ConfigurationStore.java
@@ -62,29 +62,9 @@ public class ConfigurationStore {
return new Storage(readReceipts, unidentifiedDeliveryIndicators, typingIndicators, linkPreviews);
}
- public static final class Storage {
-
- public Boolean readReceipts;
- public Boolean unidentifiedDeliveryIndicators;
- public Boolean typingIndicators;
- public Boolean linkPreviews;
-
- // For deserialization
- private Storage() {
- }
-
- public Storage(
- final Boolean readReceipts,
- final Boolean unidentifiedDeliveryIndicators,
- final Boolean typingIndicators,
- final Boolean linkPreviews
- ) {
- this.readReceipts = readReceipts;
- this.unidentifiedDeliveryIndicators = unidentifiedDeliveryIndicators;
- this.typingIndicators = typingIndicators;
- this.linkPreviews = linkPreviews;
- }
- }
+ public record Storage(
+ Boolean readReceipts, Boolean unidentifiedDeliveryIndicators, Boolean typingIndicators, Boolean linkPreviews
+ ) {}
public interface Saver {
diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java
index 5cef1b33..cfa39bc9 100644
--- a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java
+++ b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java
@@ -262,7 +262,7 @@ public class GroupStore {
g1.blocked,
g1.archived,
g1.members.stream()
- .map(m -> new Storage.GroupV1.Member(m.getId(), null, null))
+ .map(m -> new Storage.GroupV1.Member(m.id(), null, null))
.collect(Collectors.toList()));
}
@@ -274,91 +274,22 @@ public class GroupStore {
}).collect(Collectors.toList()));
}
- public static class Storage {
+ public record Storage(@JsonDeserialize(using = GroupsDeserializer.class) List