diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt index 614aed7913..387108f3a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt @@ -16,6 +16,7 @@ import org.session.libsignal.utilities.Hex import org.session.libsignal.utilities.logging.Log import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil +import org.thoughtcrime.securesms.loki.utilities.ContactUtilities import org.thoughtcrime.securesms.loki.utilities.OpenGroupUtilities import java.util.* @@ -28,7 +29,12 @@ object MultiDeviceProtocol { val lastSyncTime = TextSecurePreferences.getLastConfigurationSyncTime(context) val now = System.currentTimeMillis() if (now - lastSyncTime < 2 * 24 * 60 * 60 * 1000) return - val configurationMessage = ConfigurationMessage.getCurrent() + val contacts = ContactUtilities.getAllContacts(context).filter { recipient -> + !recipient.isBlocked && !recipient.name.isNullOrEmpty() && !recipient.isLocalNumber && recipient.address.serialize().isNotEmpty() + }.map { recipient -> + ConfigurationMessage.Contact(recipient.address.serialize(), recipient.name!!, recipient.profileAvatar, recipient.profileKey) + } + val configurationMessage = ConfigurationMessage.getCurrent(contacts) val serializedMessage = configurationMessage.toProto()!!.toByteArray() val messageSender = ApplicationContext.getInstance(context).communicationModule.provideSignalMessageSender() val address = SignalServiceAddress(userPublicKey) @@ -47,7 +53,12 @@ object MultiDeviceProtocol { // TODO: refactor this to use new message sending job fun forceSyncConfigurationNowIfNeeded(context: Context) { val userPublicKey = TextSecurePreferences.getLocalNumber(context) ?: return - val configurationMessage = ConfigurationMessage.getCurrent() + val contacts = ContactUtilities.getAllContacts(context).filter { recipient -> + !recipient.isGroupRecipient && !recipient.isBlocked && !recipient.name.isNullOrEmpty() && !recipient.isLocalNumber && recipient.address.serialize().isNotEmpty() + }.map { recipient -> + ConfigurationMessage.Contact(recipient.address.serialize(), recipient.name!!, recipient.profileAvatar, recipient.profileKey) + } + val configurationMessage = ConfigurationMessage.getCurrent(contacts) val serializedMessage = configurationMessage.toProto()!!.toByteArray() val messageSender = ApplicationContext.getInstance(context).communicationModule.provideSignalMessageSender() val address = SignalServiceAddress(userPublicKey) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt index d31c4c9d02..bab2fdfb55 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt @@ -12,12 +12,12 @@ object ContactUtilities { val cursor = threadDatabase.conversationList val result = mutableSetOf() threadDatabase.readerFor(cursor).use { reader -> - while (reader.next != null) { - val thread = reader.current - val recipient = thread.recipient - result.add(recipient) + while (reader.next != null) { + val thread = reader.current + val recipient = thread.recipient + result.add(recipient) + } } + return result } - return result - } } \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt index 4ded41b436..421c58c585 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt @@ -14,7 +14,7 @@ import org.session.libsignal.service.loki.utilities.removing05PrefixIfNeeded import org.session.libsignal.service.loki.utilities.toHexString import org.session.libsignal.utilities.Hex -class ConfigurationMessage(val closedGroups: List, val openGroups: List, val displayName: String, val profilePicture: String?, val profileKey: ByteArray): ControlMessage() { +class ConfigurationMessage(val closedGroups: List, val openGroups: List, val contacts: List, val displayName: String, val profilePicture: String?, val profileKey: ByteArray): ControlMessage() { class ClosedGroup(val publicKey: String, val name: String, val encryptionKeyPair: ECKeyPair, val members: List, val admins: List) { val isValid: Boolean get() = members.isNotEmpty() && admins.isNotEmpty() @@ -51,12 +51,39 @@ class ConfigurationMessage(val closedGroups: List, val openGroups: } } + class Contact(val publicKey: String, val name: String, val profilePicture: String?, val profileKey: ByteArray?) { + companion object { + fun fromProto(proto: SignalServiceProtos.ConfigurationMessage.Contact): Contact? { + if (!proto.hasName() || !proto.hasProfileKey()) return null + val publicKey = proto.publicKey.toByteArray().toHexString() + val name = proto.name + val profilePicture = if (proto.hasProfilePicture()) proto.profilePicture else null + val profileKey = if (proto.hasProfileKey()) proto.profileKey.toByteArray() else null + + return Contact(publicKey,name,profilePicture,profileKey) + } + } + + fun toProto(): SignalServiceProtos.ConfigurationMessage.Contact? { + val result = SignalServiceProtos.ConfigurationMessage.Contact.newBuilder() + result.name = this.name + result.publicKey = ByteString.copyFrom(Hex.fromStringCondensed(publicKey)) + if (!this.profilePicture.isNullOrEmpty()) { + result.profilePicture = this.profilePicture + } + if (this.profileKey != null) { + result.profileKey = ByteString.copyFrom(this.profileKey) + } + return result.build() + } + } + override val ttl: Long = 4 * 24 * 60 * 60 * 1000 override val isSelfSendValid: Boolean = true companion object { - fun getCurrent(): ConfigurationMessage { + fun getCurrent(contacts: List): ConfigurationMessage { val closedGroups = mutableListOf() val openGroups = mutableListOf() val sharedConfig = MessagingConfiguration.shared @@ -69,8 +96,7 @@ class ConfigurationMessage(val closedGroups: List, val openGroups: for (groupRecord in groups) { if (groupRecord.isClosedGroup) { if (!groupRecord.members.contains(Address.fromSerialized(storage.getUserPublicKey()!!))) continue - val groupPublicKey = GroupUtil.getDecodedGroupIDAsData(groupRecord.encodedId).toHexString() - if (!storage.isClosedGroup(groupPublicKey)) continue + val groupPublicKey = GroupUtil.doubleDecodeGroupID(groupRecord.encodedId).toHexString() val encryptionKeyPair = storage.getLatestClosedGroupEncryptionKeyPair(groupPublicKey) ?: continue val closedGroup = ClosedGroup(groupPublicKey, groupRecord.title, encryptionKeyPair, groupRecord.members.map { it.serialize() }, groupRecord.admins.map { it.serialize() }) closedGroups.add(closedGroup) @@ -82,7 +108,7 @@ class ConfigurationMessage(val closedGroups: List, val openGroups: } } - return ConfigurationMessage(closedGroups, openGroups, displayName, profilePicture, profileKey) + return ConfigurationMessage(closedGroups, openGroups, contacts, displayName, profilePicture, profileKey) } fun fromProto(proto: SignalServiceProtos.Content): ConfigurationMessage? { @@ -93,7 +119,7 @@ class ConfigurationMessage(val closedGroups: List, val openGroups: val displayName = configurationProto.displayName val profilePicture = configurationProto.profilePicture val profileKey = configurationProto.profileKey - return ConfigurationMessage(closedGroups, openGroups, displayName, profilePicture, profileKey.toByteArray()) + return ConfigurationMessage(closedGroups, openGroups, listOf(), displayName, profilePicture, profileKey.toByteArray()) } } @@ -101,8 +127,11 @@ class ConfigurationMessage(val closedGroups: List, val openGroups: val configurationProto = SignalServiceProtos.ConfigurationMessage.newBuilder() configurationProto.addAllClosedGroups(closedGroups.mapNotNull { it.toProto() }) configurationProto.addAllOpenGroups(openGroups) + configurationProto.addAllContacts(this.contacts.mapNotNull { it.toProto() }) configurationProto.displayName = displayName - configurationProto.profilePicture = profilePicture.orEmpty() + if (!profilePicture.isNullOrEmpty()) { + configurationProto.profilePicture = profilePicture + } configurationProto.profileKey = ByteString.copyFrom(profileKey) val contentProto = SignalServiceProtos.Content.newBuilder() contentProto.configurationMessage = configurationProto.build() diff --git a/libsignal/protobuf/SignalService.proto b/libsignal/protobuf/SignalService.proto index 3d4cd889a7..ac5d8c7092 100644 --- a/libsignal/protobuf/SignalService.proto +++ b/libsignal/protobuf/SignalService.proto @@ -223,11 +223,21 @@ message ConfigurationMessage { repeated bytes admins = 5; } + message Contact { + // @required + required bytes publicKey = 1; + // @required + required string name = 2; + optional string profilePicture = 3; + optional bytes profileKey = 4; + } + repeated ClosedGroup closedGroups = 1; repeated string openGroups = 2; optional string displayName = 3; optional string profilePicture = 4; optional bytes profileKey = 5; + repeated Contact contacts = 6; } message ReceiptMessage { diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java index 7577e904a1..2f53875e25 100644 --- a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java @@ -20156,6 +20156,31 @@ public final class SignalServiceProtos { * optional bytes profileKey = 5; */ com.google.protobuf.ByteString getProfileKey(); + + // repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + java.util.List + getContactsList(); + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact getContacts(int index); + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + int getContactsCount(); + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + java.util.List + getContactsOrBuilderList(); + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.ContactOrBuilder getContactsOrBuilder( + int index); } /** * Protobuf type {@code signalservice.ConfigurationMessage} @@ -20239,6 +20264,14 @@ public final class SignalServiceProtos { profileKey_ = input.readBytes(); break; } + case 50: { + if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) { + contacts_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000020; + } + contacts_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.PARSER, extensionRegistry)); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -20253,6 +20286,9 @@ public final class SignalServiceProtos { if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { openGroups_ = new com.google.protobuf.UnmodifiableLazyStringList(openGroups_); } + if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) { + contacts_ = java.util.Collections.unmodifiableList(contacts_); + } this.unknownFields = unknownFields.build(); makeExtensionsImmutable(); } @@ -21343,6 +21379,897 @@ public final class SignalServiceProtos { // @@protoc_insertion_point(class_scope:signalservice.ConfigurationMessage.ClosedGroup) } + public interface ContactOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required bytes publicKey = 1; + /** + * required bytes publicKey = 1; + * + *
+       * @required
+       * 
+ */ + boolean hasPublicKey(); + /** + * required bytes publicKey = 1; + * + *
+       * @required
+       * 
+ */ + com.google.protobuf.ByteString getPublicKey(); + + // required string name = 2; + /** + * required string name = 2; + * + *
+       * @required
+       * 
+ */ + boolean hasName(); + /** + * required string name = 2; + * + *
+       * @required
+       * 
+ */ + java.lang.String getName(); + /** + * required string name = 2; + * + *
+       * @required
+       * 
+ */ + com.google.protobuf.ByteString + getNameBytes(); + + // optional string profilePicture = 3; + /** + * optional string profilePicture = 3; + */ + boolean hasProfilePicture(); + /** + * optional string profilePicture = 3; + */ + java.lang.String getProfilePicture(); + /** + * optional string profilePicture = 3; + */ + com.google.protobuf.ByteString + getProfilePictureBytes(); + + // optional bytes profileKey = 4; + /** + * optional bytes profileKey = 4; + */ + boolean hasProfileKey(); + /** + * optional bytes profileKey = 4; + */ + com.google.protobuf.ByteString getProfileKey(); + } + /** + * Protobuf type {@code signalservice.ConfigurationMessage.Contact} + */ + public static final class Contact extends + com.google.protobuf.GeneratedMessage + implements ContactOrBuilder { + // Use Contact.newBuilder() to construct. + private Contact(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Contact(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Contact defaultInstance; + public static Contact getDefaultInstance() { + return defaultInstance; + } + + public Contact getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Contact( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + publicKey_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + name_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + profilePicture_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + profileKey_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ConfigurationMessage_Contact_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ConfigurationMessage_Contact_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Contact parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Contact(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required bytes publicKey = 1; + public static final int PUBLICKEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString publicKey_; + /** + * required bytes publicKey = 1; + * + *
+       * @required
+       * 
+ */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required bytes publicKey = 1; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + + // required string name = 2; + public static final int NAME_FIELD_NUMBER = 2; + private java.lang.Object name_; + /** + * required string name = 2; + * + *
+       * @required
+       * 
+ */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required string name = 2; + * + *
+       * @required
+       * 
+ */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 2; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string profilePicture = 3; + public static final int PROFILEPICTURE_FIELD_NUMBER = 3; + private java.lang.Object profilePicture_; + /** + * optional string profilePicture = 3; + */ + public boolean hasProfilePicture() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string profilePicture = 3; + */ + public java.lang.String getProfilePicture() { + java.lang.Object ref = profilePicture_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + profilePicture_ = s; + } + return s; + } + } + /** + * optional string profilePicture = 3; + */ + public com.google.protobuf.ByteString + getProfilePictureBytes() { + java.lang.Object ref = profilePicture_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + profilePicture_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bytes profileKey = 4; + public static final int PROFILEKEY_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString profileKey_; + /** + * optional bytes profileKey = 4; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes profileKey = 4; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + + private void initFields() { + publicKey_ = com.google.protobuf.ByteString.EMPTY; + name_ = ""; + profilePicture_ = ""; + profileKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasPublicKey()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, publicKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getProfilePictureBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, profileKey_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, publicKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getProfilePictureBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, profileKey_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ConfigurationMessage.Contact} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.ContactOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ConfigurationMessage_Contact_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ConfigurationMessage_Contact_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + publicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + profilePicture_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + profileKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ConfigurationMessage_Contact_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact result = new org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.publicKey_ = publicKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.profilePicture_ = profilePicture_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.profileKey_ = profileKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.getDefaultInstance()) return this; + if (other.hasPublicKey()) { + setPublicKey(other.getPublicKey()); + } + if (other.hasName()) { + bitField0_ |= 0x00000002; + name_ = other.name_; + onChanged(); + } + if (other.hasProfilePicture()) { + bitField0_ |= 0x00000004; + profilePicture_ = other.profilePicture_; + onChanged(); + } + if (other.hasProfileKey()) { + setProfileKey(other.getProfileKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasPublicKey()) { + + return false; + } + if (!hasName()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required bytes publicKey = 1; + private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes publicKey = 1; + * + *
+         * @required
+         * 
+ */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required bytes publicKey = 1; + * + *
+         * @required
+         * 
+ */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + /** + * required bytes publicKey = 1; + * + *
+         * @required
+         * 
+ */ + public Builder setPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + publicKey_ = value; + onChanged(); + return this; + } + /** + * required bytes publicKey = 1; + * + *
+         * @required
+         * 
+ */ + public Builder clearPublicKey() { + bitField0_ = (bitField0_ & ~0x00000001); + publicKey_ = getDefaultInstance().getPublicKey(); + onChanged(); + return this; + } + + // required string name = 2; + private java.lang.Object name_ = ""; + /** + * required string name = 2; + * + *
+         * @required
+         * 
+ */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required string name = 2; + * + *
+         * @required
+         * 
+ */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 2; + * + *
+         * @required
+         * 
+ */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 2; + * + *
+         * @required
+         * 
+ */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 2; + * + *
+         * @required
+         * 
+ */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 2; + * + *
+         * @required
+         * 
+ */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + // optional string profilePicture = 3; + private java.lang.Object profilePicture_ = ""; + /** + * optional string profilePicture = 3; + */ + public boolean hasProfilePicture() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string profilePicture = 3; + */ + public java.lang.String getProfilePicture() { + java.lang.Object ref = profilePicture_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + profilePicture_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string profilePicture = 3; + */ + public com.google.protobuf.ByteString + getProfilePictureBytes() { + java.lang.Object ref = profilePicture_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + profilePicture_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string profilePicture = 3; + */ + public Builder setProfilePicture( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + profilePicture_ = value; + onChanged(); + return this; + } + /** + * optional string profilePicture = 3; + */ + public Builder clearProfilePicture() { + bitField0_ = (bitField0_ & ~0x00000004); + profilePicture_ = getDefaultInstance().getProfilePicture(); + onChanged(); + return this; + } + /** + * optional string profilePicture = 3; + */ + public Builder setProfilePictureBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + profilePicture_ = value; + onChanged(); + return this; + } + + // optional bytes profileKey = 4; + private com.google.protobuf.ByteString profileKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes profileKey = 4; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes profileKey = 4; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + /** + * optional bytes profileKey = 4; + */ + public Builder setProfileKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + profileKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes profileKey = 4; + */ + public Builder clearProfileKey() { + bitField0_ = (bitField0_ & ~0x00000008); + profileKey_ = getDefaultInstance().getProfileKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ConfigurationMessage.Contact) + } + + static { + defaultInstance = new Contact(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ConfigurationMessage.Contact) + } + private int bitField0_; // repeated .signalservice.ConfigurationMessage.ClosedGroup closedGroups = 1; public static final int CLOSEDGROUPS_FIELD_NUMBER = 1; @@ -21512,12 +22439,49 @@ public final class SignalServiceProtos { return profileKey_; } + // repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + public static final int CONTACTS_FIELD_NUMBER = 6; + private java.util.List contacts_; + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public java.util.List getContactsList() { + return contacts_; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public java.util.List + getContactsOrBuilderList() { + return contacts_; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public int getContactsCount() { + return contacts_.size(); + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact getContacts(int index) { + return contacts_.get(index); + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.ContactOrBuilder getContactsOrBuilder( + int index) { + return contacts_.get(index); + } + private void initFields() { closedGroups_ = java.util.Collections.emptyList(); openGroups_ = com.google.protobuf.LazyStringArrayList.EMPTY; displayName_ = ""; profilePicture_ = ""; profileKey_ = com.google.protobuf.ByteString.EMPTY; + contacts_ = java.util.Collections.emptyList(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -21530,6 +22494,12 @@ public final class SignalServiceProtos { return false; } } + for (int i = 0; i < getContactsCount(); i++) { + if (!getContacts(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } memoizedIsInitialized = 1; return true; } @@ -21552,6 +22522,9 @@ public final class SignalServiceProtos { if (((bitField0_ & 0x00000004) == 0x00000004)) { output.writeBytes(5, profileKey_); } + for (int i = 0; i < contacts_.size(); i++) { + output.writeMessage(6, contacts_.get(i)); + } getUnknownFields().writeTo(output); } @@ -21586,6 +22559,10 @@ public final class SignalServiceProtos { size += com.google.protobuf.CodedOutputStream .computeBytesSize(5, profileKey_); } + for (int i = 0; i < contacts_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, contacts_.get(i)); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -21695,6 +22672,7 @@ public final class SignalServiceProtos { private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { getClosedGroupsFieldBuilder(); + getContactsFieldBuilder(); } } private static Builder create() { @@ -21717,6 +22695,12 @@ public final class SignalServiceProtos { bitField0_ = (bitField0_ & ~0x00000008); profileKey_ = com.google.protobuf.ByteString.EMPTY; bitField0_ = (bitField0_ & ~0x00000010); + if (contactsBuilder_ == null) { + contacts_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + } else { + contactsBuilder_.clear(); + } return this; } @@ -21772,6 +22756,15 @@ public final class SignalServiceProtos { to_bitField0_ |= 0x00000004; } result.profileKey_ = profileKey_; + if (contactsBuilder_ == null) { + if (((bitField0_ & 0x00000020) == 0x00000020)) { + contacts_ = java.util.Collections.unmodifiableList(contacts_); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.contacts_ = contacts_; + } else { + result.contacts_ = contactsBuilder_.build(); + } result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -21837,6 +22830,32 @@ public final class SignalServiceProtos { if (other.hasProfileKey()) { setProfileKey(other.getProfileKey()); } + if (contactsBuilder_ == null) { + if (!other.contacts_.isEmpty()) { + if (contacts_.isEmpty()) { + contacts_ = other.contacts_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureContactsIsMutable(); + contacts_.addAll(other.contacts_); + } + onChanged(); + } + } else { + if (!other.contacts_.isEmpty()) { + if (contactsBuilder_.isEmpty()) { + contactsBuilder_.dispose(); + contactsBuilder_ = null; + contacts_ = other.contacts_; + bitField0_ = (bitField0_ & ~0x00000020); + contactsBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getContactsFieldBuilder() : null; + } else { + contactsBuilder_.addAllMessages(other.contacts_); + } + } + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -21848,6 +22867,12 @@ public final class SignalServiceProtos { return false; } } + for (int i = 0; i < getContactsCount(); i++) { + if (!getContacts(i).isInitialized()) { + + return false; + } + } return true; } @@ -22387,6 +23412,246 @@ public final class SignalServiceProtos { return this; } + // repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + private java.util.List contacts_ = + java.util.Collections.emptyList(); + private void ensureContactsIsMutable() { + if (!((bitField0_ & 0x00000020) == 0x00000020)) { + contacts_ = new java.util.ArrayList(contacts_); + bitField0_ |= 0x00000020; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.ContactOrBuilder> contactsBuilder_; + + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public java.util.List getContactsList() { + if (contactsBuilder_ == null) { + return java.util.Collections.unmodifiableList(contacts_); + } else { + return contactsBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public int getContactsCount() { + if (contactsBuilder_ == null) { + return contacts_.size(); + } else { + return contactsBuilder_.getCount(); + } + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact getContacts(int index) { + if (contactsBuilder_ == null) { + return contacts_.get(index); + } else { + return contactsBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder setContacts( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact value) { + if (contactsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureContactsIsMutable(); + contacts_.set(index, value); + onChanged(); + } else { + contactsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder setContacts( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder builderForValue) { + if (contactsBuilder_ == null) { + ensureContactsIsMutable(); + contacts_.set(index, builderForValue.build()); + onChanged(); + } else { + contactsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder addContacts(org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact value) { + if (contactsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureContactsIsMutable(); + contacts_.add(value); + onChanged(); + } else { + contactsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder addContacts( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact value) { + if (contactsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureContactsIsMutable(); + contacts_.add(index, value); + onChanged(); + } else { + contactsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder addContacts( + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder builderForValue) { + if (contactsBuilder_ == null) { + ensureContactsIsMutable(); + contacts_.add(builderForValue.build()); + onChanged(); + } else { + contactsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder addContacts( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder builderForValue) { + if (contactsBuilder_ == null) { + ensureContactsIsMutable(); + contacts_.add(index, builderForValue.build()); + onChanged(); + } else { + contactsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder addAllContacts( + java.lang.Iterable values) { + if (contactsBuilder_ == null) { + ensureContactsIsMutable(); + super.addAll(values, contacts_); + onChanged(); + } else { + contactsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder clearContacts() { + if (contactsBuilder_ == null) { + contacts_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + } else { + contactsBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public Builder removeContacts(int index) { + if (contactsBuilder_ == null) { + ensureContactsIsMutable(); + contacts_.remove(index); + onChanged(); + } else { + contactsBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder getContactsBuilder( + int index) { + return getContactsFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.ContactOrBuilder getContactsOrBuilder( + int index) { + if (contactsBuilder_ == null) { + return contacts_.get(index); } else { + return contactsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public java.util.List + getContactsOrBuilderList() { + if (contactsBuilder_ != null) { + return contactsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(contacts_); + } + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder addContactsBuilder() { + return getContactsFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.getDefaultInstance()); + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder addContactsBuilder( + int index) { + return getContactsFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.getDefaultInstance()); + } + /** + * repeated .signalservice.ConfigurationMessage.Contact contacts = 6; + */ + public java.util.List + getContactsBuilderList() { + return getContactsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.ContactOrBuilder> + getContactsFieldBuilder() { + if (contactsBuilder_ == null) { + contactsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.Contact.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.ContactOrBuilder>( + contacts_, + ((bitField0_ & 0x00000020) == 0x00000020), + getParentForChildren(), + isClean()); + contacts_ = null; + } + return contactsBuilder_; + } + // @@protoc_insertion_point(builder_scope:signalservice.ConfigurationMessage) } @@ -31208,6 +32473,11 @@ public final class SignalServiceProtos { private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_signalservice_ConfigurationMessage_ClosedGroup_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ConfigurationMessage_Contact_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ConfigurationMessage_Contact_fieldAccessorTable; private static com.google.protobuf.Descriptors.Descriptor internal_static_signalservice_ReceiptMessage_descriptor; private static @@ -31342,46 +32612,50 @@ public final class SignalServiceProtos { "\003\022\017\n\013NAME_CHANGE\020\004\022\021\n\rMEMBERS_ADDED\020\005\022\023\n" + "\017MEMBERS_REMOVED\020\006\022\017\n\013MEMBER_LEFT\020\007\022\037\n\033E" + "NCRYPTION_KEY_PAIR_REQUEST\020\010\"$\n\005Flags\022\033\n" + - "\027EXPIRATION_TIMER_UPDATE\020\002\"\267\002\n\024Configura" + + "\027EXPIRATION_TIMER_UPDATE\020\002\"\316\003\n\024Configura" + "tionMessage\022E\n\014closedGroups\030\001 \003(\0132/.sign" + "alservice.ConfigurationMessage.ClosedGro" + "up\022\022\n\nopenGroups\030\002 \003(\t\022\023\n\013displayName\030\003 " + "\001(\t\022\026\n\016profilePicture\030\004 \001(\t\022\022\n\nprofileKe", - "y\030\005 \001(\014\032\202\001\n\013ClosedGroup\022\021\n\tpublicKey\030\001 \001" + - "(\014\022\014\n\004name\030\002 \001(\t\0221\n\021encryptionKeyPair\030\003 " + - "\001(\0132\026.signalservice.KeyPair\022\017\n\007members\030\004" + - " \003(\014\022\016\n\006admins\030\005 \003(\014\"u\n\016ReceiptMessage\0220" + - "\n\004type\030\001 \001(\0162\".signalservice.ReceiptMess" + - "age.Type\022\021\n\ttimestamp\030\002 \003(\004\"\036\n\004Type\022\014\n\010D" + - "ELIVERY\020\000\022\010\n\004READ\020\001\"\354\001\n\021AttachmentPointe" + - "r\022\n\n\002id\030\001 \001(\006\022\023\n\013contentType\030\002 \001(\t\022\013\n\003ke" + - "y\030\003 \001(\014\022\014\n\004size\030\004 \001(\r\022\021\n\tthumbnail\030\005 \001(\014" + - "\022\016\n\006digest\030\006 \001(\014\022\020\n\010fileName\030\007 \001(\t\022\r\n\005fl", - "ags\030\010 \001(\r\022\r\n\005width\030\t \001(\r\022\016\n\006height\030\n \001(\r" + - "\022\017\n\007caption\030\013 \001(\t\022\013\n\003url\030e \001(\t\"\032\n\005Flags\022" + - "\021\n\rVOICE_MESSAGE\020\001\"\243\002\n\014GroupContext\022\n\n\002i" + - "d\030\001 \001(\014\022.\n\004type\030\002 \001(\0162 .signalservice.Gr" + - "oupContext.Type\022\014\n\004name\030\003 \001(\t\022\017\n\007members" + - "\030\004 \003(\t\0220\n\006avatar\030\005 \001(\0132 .signalservice.A" + - "ttachmentPointer\022\016\n\006admins\030\006 \003(\t\022\023\n\nnewM" + - "embers\030\346\007 \003(\t\022\027\n\016removedMembers\030\347\007 \003(\t\"H" + - "\n\004Type\022\013\n\007UNKNOWN\020\000\022\n\n\006UPDATE\020\001\022\013\n\007DELIV" + - "ER\020\002\022\010\n\004QUIT\020\003\022\020\n\014REQUEST_INFO\020\004\"\356\001\n\016Con", - "tactDetails\022\016\n\006number\030\001 \001(\t\022\014\n\004name\030\002 \001(" + - "\t\0224\n\006avatar\030\003 \001(\0132$.signalservice.Contac" + - "tDetails.Avatar\022\r\n\005color\030\004 \001(\t\022\022\n\nprofil" + - "eKey\030\006 \001(\014\022\017\n\007blocked\030\007 \001(\010\022\023\n\013expireTim" + - "er\030\010 \001(\r\022\020\n\010nickname\030e \001(\t\032-\n\006Avatar\022\023\n\013" + - "contentType\030\001 \001(\t\022\016\n\006length\030\002 \001(\r\"\367\001\n\014Gr" + - "oupDetails\022\n\n\002id\030\001 \001(\014\022\014\n\004name\030\002 \001(\t\022\017\n\007" + - "members\030\003 \003(\t\0222\n\006avatar\030\004 \001(\0132\".signalse" + - "rvice.GroupDetails.Avatar\022\024\n\006active\030\005 \001(" + - "\010:\004true\022\023\n\013expireTimer\030\006 \001(\r\022\r\n\005color\030\007 ", - "\001(\t\022\017\n\007blocked\030\010 \001(\010\022\016\n\006admins\030\t \003(\t\032-\n\006" + - "Avatar\022\023\n\013contentType\030\001 \001(\t\022\016\n\006length\030\002 " + - "\001(\r\"\"\n\016PublicChatInfo\022\020\n\010serverID\030\001 \001(\004B" + - "B\n+org.session.libsignal.service.interna" + - "l.pushB\023SignalServiceProtos" + "y\030\005 \001(\014\022=\n\010contacts\030\006 \003(\0132+.signalservic" + + "e.ConfigurationMessage.Contact\032\202\001\n\013Close" + + "dGroup\022\021\n\tpublicKey\030\001 \001(\014\022\014\n\004name\030\002 \001(\t\022" + + "1\n\021encryptionKeyPair\030\003 \001(\0132\026.signalservi" + + "ce.KeyPair\022\017\n\007members\030\004 \003(\014\022\016\n\006admins\030\005 " + + "\003(\014\032V\n\007Contact\022\021\n\tpublicKey\030\001 \002(\014\022\014\n\004nam" + + "e\030\002 \002(\t\022\026\n\016profilePicture\030\003 \001(\t\022\022\n\nprofi" + + "leKey\030\004 \001(\014\"u\n\016ReceiptMessage\0220\n\004type\030\001 " + + "\001(\0162\".signalservice.ReceiptMessage.Type\022" + + "\021\n\ttimestamp\030\002 \003(\004\"\036\n\004Type\022\014\n\010DELIVERY\020\000", + "\022\010\n\004READ\020\001\"\354\001\n\021AttachmentPointer\022\n\n\002id\030\001" + + " \001(\006\022\023\n\013contentType\030\002 \001(\t\022\013\n\003key\030\003 \001(\014\022\014" + + "\n\004size\030\004 \001(\r\022\021\n\tthumbnail\030\005 \001(\014\022\016\n\006diges" + + "t\030\006 \001(\014\022\020\n\010fileName\030\007 \001(\t\022\r\n\005flags\030\010 \001(\r" + + "\022\r\n\005width\030\t \001(\r\022\016\n\006height\030\n \001(\r\022\017\n\007capti" + + "on\030\013 \001(\t\022\013\n\003url\030e \001(\t\"\032\n\005Flags\022\021\n\rVOICE_" + + "MESSAGE\020\001\"\243\002\n\014GroupContext\022\n\n\002id\030\001 \001(\014\022." + + "\n\004type\030\002 \001(\0162 .signalservice.GroupContex" + + "t.Type\022\014\n\004name\030\003 \001(\t\022\017\n\007members\030\004 \003(\t\0220\n" + + "\006avatar\030\005 \001(\0132 .signalservice.Attachment", + "Pointer\022\016\n\006admins\030\006 \003(\t\022\023\n\nnewMembers\030\346\007" + + " \003(\t\022\027\n\016removedMembers\030\347\007 \003(\t\"H\n\004Type\022\013\n" + + "\007UNKNOWN\020\000\022\n\n\006UPDATE\020\001\022\013\n\007DELIVER\020\002\022\010\n\004Q" + + "UIT\020\003\022\020\n\014REQUEST_INFO\020\004\"\356\001\n\016ContactDetai" + + "ls\022\016\n\006number\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\0224\n\006avat" + + "ar\030\003 \001(\0132$.signalservice.ContactDetails." + + "Avatar\022\r\n\005color\030\004 \001(\t\022\022\n\nprofileKey\030\006 \001(" + + "\014\022\017\n\007blocked\030\007 \001(\010\022\023\n\013expireTimer\030\010 \001(\r\022" + + "\020\n\010nickname\030e \001(\t\032-\n\006Avatar\022\023\n\013contentTy" + + "pe\030\001 \001(\t\022\016\n\006length\030\002 \001(\r\"\367\001\n\014GroupDetail", + "s\022\n\n\002id\030\001 \001(\014\022\014\n\004name\030\002 \001(\t\022\017\n\007members\030\003" + + " \003(\t\0222\n\006avatar\030\004 \001(\0132\".signalservice.Gro" + + "upDetails.Avatar\022\024\n\006active\030\005 \001(\010:\004true\022\023" + + "\n\013expireTimer\030\006 \001(\r\022\r\n\005color\030\007 \001(\t\022\017\n\007bl" + + "ocked\030\010 \001(\010\022\016\n\006admins\030\t \003(\t\032-\n\006Avatar\022\023\n" + + "\013contentType\030\001 \001(\t\022\016\n\006length\030\002 \001(\r\"\"\n\016Pu" + + "blicChatInfo\022\020\n\010serverID\030\001 \001(\004BB\n+org.se" + + "ssion.libsignal.service.internal.pushB\023S" + + "ignalServiceProtos" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -31501,13 +32775,19 @@ public final class SignalServiceProtos { internal_static_signalservice_ConfigurationMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_ConfigurationMessage_descriptor, - new java.lang.String[] { "ClosedGroups", "OpenGroups", "DisplayName", "ProfilePicture", "ProfileKey", }); + new java.lang.String[] { "ClosedGroups", "OpenGroups", "DisplayName", "ProfilePicture", "ProfileKey", "Contacts", }); internal_static_signalservice_ConfigurationMessage_ClosedGroup_descriptor = internal_static_signalservice_ConfigurationMessage_descriptor.getNestedTypes().get(0); internal_static_signalservice_ConfigurationMessage_ClosedGroup_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_ConfigurationMessage_ClosedGroup_descriptor, new java.lang.String[] { "PublicKey", "Name", "EncryptionKeyPair", "Members", "Admins", }); + internal_static_signalservice_ConfigurationMessage_Contact_descriptor = + internal_static_signalservice_ConfigurationMessage_descriptor.getNestedTypes().get(1); + internal_static_signalservice_ConfigurationMessage_Contact_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ConfigurationMessage_Contact_descriptor, + new java.lang.String[] { "PublicKey", "Name", "ProfilePicture", "ProfileKey", }); internal_static_signalservice_ReceiptMessage_descriptor = getDescriptor().getMessageTypes().get(7); internal_static_signalservice_ReceiptMessage_fieldAccessorTable = new