From 6bc832f50a41cdffce9eb09c7867767c5466d779 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Tue, 9 Mar 2021 16:27:12 +1100 Subject: [PATCH 1/9] DataExtractionNotification type created and added to proto --- .../DataExtractionNotificationManager.kt | 4 + .../messaging/jobs/MessageReceiveJob.kt | 2 +- .../control/DataExtractionNotification.kt | 81 ++ .../sending_receiving/MessageReceiver.kt | 1 + libsignal/protobuf/SignalService.proto | 21 +- .../internal/push/SignalServiceProtos.java | 1085 +++++++++++++++-- 6 files changed, 1065 insertions(+), 129 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/sskenvironment/DataExtractionNotificationManager.kt create mode 100644 libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/sskenvironment/DataExtractionNotificationManager.kt b/app/src/main/java/org/thoughtcrime/securesms/sskenvironment/DataExtractionNotificationManager.kt new file mode 100644 index 0000000000..0c8fa779d4 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/sskenvironment/DataExtractionNotificationManager.kt @@ -0,0 +1,4 @@ +package org.thoughtcrime.securesms.sskenvironment + +class DataExtractionNotificationManager { +} \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt index d6b2bfff8f..a69e9162ea 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt @@ -16,7 +16,7 @@ class MessageReceiveJob(val data: ByteArray, val isBackgroundPoll: Boolean, val override val maxFailureCount: Int = 10 companion object { val TAG = MessageReceiveJob::class.qualifiedName - val KEY: String = "AttachmentUploadJob" + val KEY: String = "MessageReceiveJob" //keys used for database storage purpose private val KEY_DATA = "data" diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt new file mode 100644 index 0000000000..a612584af8 --- /dev/null +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt @@ -0,0 +1,81 @@ +package org.session.libsession.messaging.messages.control + +import com.google.protobuf.ByteString +import org.session.libsignal.libsignal.ecc.ECKeyPair +import org.session.libsignal.service.internal.push.SignalServiceProtos +import org.session.libsignal.utilities.logging.Log +import java.lang.Exception + +class DataExtractionNotification(): ControlMessage() { + var kind: Kind? = null + + // Kind enum + sealed class Kind { + class Screenshot() : Kind() + class MediaSaved(val timestanp: Long) : Kind() + + val description: String = run { + when(this) { + is Screenshot -> "screenshot" + is MediaSaved -> "mediaSaved" + } + } + } + + companion object { + const val TAG = "DataExtractionNotification" + + fun fromProto(proto: SignalServiceProtos.Content): DataExtractionNotification? { + val dataExtractionNotification = proto.dataExtractionNotification ?: return null + val kind: Kind + when(dataExtractionNotification.type) { + SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT -> kind = Kind.Screenshot() + SignalServiceProtos.DataExtractionNotification.Type.MEDIA_SAVED -> { + val timestamp = if (dataExtractionNotification.hasTimestamp()) dataExtractionNotification.timestamp else 0 + kind = Kind.MediaSaved(timestamp) + } + } + return DataExtractionNotification(kind) + } + } + + //constructor + internal constructor(kind: Kind) : this() { + this.kind = kind + } + + // MARK: Validation + override fun isValid(): Boolean { + if (!super.isValid()) return false + val kind = kind ?: return false + return when(kind) { + is Kind.Screenshot -> true + is Kind.MediaSaved -> kind.timestanp > 0 + } + } + + override fun toProto(): SignalServiceProtos.Content? { + val kind = kind + if (kind == null) { + Log.w(TAG, "Couldn't construct data extraction notification proto from: $this") + return null + } + try { + val dataExtractionNotification = SignalServiceProtos.DataExtractionNotification.newBuilder() + when(kind) { + is Kind.Screenshot -> dataExtractionNotification.type = SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT + is Kind.MediaSaved -> { + dataExtractionNotification.type = SignalServiceProtos.DataExtractionNotification.Type.MEDIA_SAVED + dataExtractionNotification.timestamp = kind.timestanp + } + } + val contentProto = SignalServiceProtos.Content.newBuilder() + contentProto.dataExtractionNotification = dataExtractionNotification.build() + return contentProto.build() + } catch (e: Exception) { + Log.w(TAG, "Couldn't construct data extraction notification proto from: $this") + return null + } + } + +} \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt index 5b661327cb..27e03fbfc9 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt @@ -120,6 +120,7 @@ object MessageReceiver { val message: Message = ReadReceipt.fromProto(proto) ?: TypingIndicator.fromProto(proto) ?: ClosedGroupControlMessage.fromProto(proto) ?: + DataExtractionNotification.fromProto(proto) ?: ExpirationTimerUpdate.fromProto(proto) ?: ConfigurationMessage.fromProto(proto) ?: VisibleMessage.fromProto(proto) ?: throw Error.UnknownMessage diff --git a/libsignal/protobuf/SignalService.proto b/libsignal/protobuf/SignalService.proto index ac5d8c7092..614b5e65f2 100644 --- a/libsignal/protobuf/SignalService.proto +++ b/libsignal/protobuf/SignalService.proto @@ -36,10 +36,11 @@ message TypingMessage { } message Content { - optional DataMessage dataMessage = 1; - optional ReceiptMessage receiptMessage = 5; - optional TypingMessage typingMessage = 6; - optional ConfigurationMessage configurationMessage = 7; + optional DataMessage dataMessage = 1; + optional ReceiptMessage receiptMessage = 5; + optional TypingMessage typingMessage = 6; + optional ConfigurationMessage configurationMessage = 7; + optional DataExtractionNotification dataExtractionNotification = 82; } message ClosedGroupCiphertextMessageWrapper { @@ -56,6 +57,18 @@ message KeyPair { required bytes privateKey = 2; } +message DataExtractionNotification { + + enum Type { + SCREENSHOT = 1; + MEDIA_SAVED = 2; // timestamp + } + + // @required + required Type type = 1; + optional uint64 timestamp = 2; +} + message DataMessage { enum Flags { 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 2f53875e25..0e4feba1ed 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 @@ -1740,6 +1740,20 @@ public final class SignalServiceProtos { * optional .signalservice.ConfigurationMessage configurationMessage = 7; */ org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessageOrBuilder getConfigurationMessageOrBuilder(); + + // optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + boolean hasDataExtractionNotification(); + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification getDataExtractionNotification(); + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotificationOrBuilder getDataExtractionNotificationOrBuilder(); } /** * Protobuf type {@code signalservice.Content} @@ -1844,6 +1858,19 @@ public final class SignalServiceProtos { bitField0_ |= 0x00000008; break; } + case 658: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = dataExtractionNotification_.toBuilder(); + } + dataExtractionNotification_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(dataExtractionNotification_); + dataExtractionNotification_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -1972,11 +1999,34 @@ public final class SignalServiceProtos { return configurationMessage_; } + // optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + public static final int DATAEXTRACTIONNOTIFICATION_FIELD_NUMBER = 82; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification dataExtractionNotification_; + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public boolean hasDataExtractionNotification() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification getDataExtractionNotification() { + return dataExtractionNotification_; + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotificationOrBuilder getDataExtractionNotificationOrBuilder() { + return dataExtractionNotification_; + } + private void initFields() { dataMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); receiptMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); typingMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance(); configurationMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ConfigurationMessage.getDefaultInstance(); + dataExtractionNotification_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDefaultInstance(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -1995,6 +2045,12 @@ public final class SignalServiceProtos { return false; } } + if (hasDataExtractionNotification()) { + if (!getDataExtractionNotification().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } memoizedIsInitialized = 1; return true; } @@ -2014,6 +2070,9 @@ public final class SignalServiceProtos { if (((bitField0_ & 0x00000008) == 0x00000008)) { output.writeMessage(7, configurationMessage_); } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(82, dataExtractionNotification_); + } getUnknownFields().writeTo(output); } @@ -2039,6 +2098,10 @@ public final class SignalServiceProtos { size += com.google.protobuf.CodedOutputStream .computeMessageSize(7, configurationMessage_); } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(82, dataExtractionNotification_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -2151,6 +2214,7 @@ public final class SignalServiceProtos { getReceiptMessageFieldBuilder(); getTypingMessageFieldBuilder(); getConfigurationMessageFieldBuilder(); + getDataExtractionNotificationFieldBuilder(); } } private static Builder create() { @@ -2183,6 +2247,12 @@ public final class SignalServiceProtos { configurationMessageBuilder_.clear(); } bitField0_ = (bitField0_ & ~0x00000008); + if (dataExtractionNotificationBuilder_ == null) { + dataExtractionNotification_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDefaultInstance(); + } else { + dataExtractionNotificationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); return this; } @@ -2243,6 +2313,14 @@ public final class SignalServiceProtos { } else { result.configurationMessage_ = configurationMessageBuilder_.build(); } + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + if (dataExtractionNotificationBuilder_ == null) { + result.dataExtractionNotification_ = dataExtractionNotification_; + } else { + result.dataExtractionNotification_ = dataExtractionNotificationBuilder_.build(); + } result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -2271,6 +2349,9 @@ public final class SignalServiceProtos { if (other.hasConfigurationMessage()) { mergeConfigurationMessage(other.getConfigurationMessage()); } + if (other.hasDataExtractionNotification()) { + mergeDataExtractionNotification(other.getDataExtractionNotification()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -2288,6 +2369,12 @@ public final class SignalServiceProtos { return false; } } + if (hasDataExtractionNotification()) { + if (!getDataExtractionNotification().isInitialized()) { + + return false; + } + } return true; } @@ -2778,6 +2865,123 @@ public final class SignalServiceProtos { return configurationMessageBuilder_; } + // optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification dataExtractionNotification_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotificationOrBuilder> dataExtractionNotificationBuilder_; + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public boolean hasDataExtractionNotification() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification getDataExtractionNotification() { + if (dataExtractionNotificationBuilder_ == null) { + return dataExtractionNotification_; + } else { + return dataExtractionNotificationBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public Builder setDataExtractionNotification(org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification value) { + if (dataExtractionNotificationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + dataExtractionNotification_ = value; + onChanged(); + } else { + dataExtractionNotificationBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public Builder setDataExtractionNotification( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder builderForValue) { + if (dataExtractionNotificationBuilder_ == null) { + dataExtractionNotification_ = builderForValue.build(); + onChanged(); + } else { + dataExtractionNotificationBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public Builder mergeDataExtractionNotification(org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification value) { + if (dataExtractionNotificationBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + dataExtractionNotification_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDefaultInstance()) { + dataExtractionNotification_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.newBuilder(dataExtractionNotification_).mergeFrom(value).buildPartial(); + } else { + dataExtractionNotification_ = value; + } + onChanged(); + } else { + dataExtractionNotificationBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public Builder clearDataExtractionNotification() { + if (dataExtractionNotificationBuilder_ == null) { + dataExtractionNotification_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDefaultInstance(); + onChanged(); + } else { + dataExtractionNotificationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder getDataExtractionNotificationBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getDataExtractionNotificationFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotificationOrBuilder getDataExtractionNotificationOrBuilder() { + if (dataExtractionNotificationBuilder_ != null) { + return dataExtractionNotificationBuilder_.getMessageOrBuilder(); + } else { + return dataExtractionNotification_; + } + } + /** + * optional .signalservice.DataExtractionNotification dataExtractionNotification = 82; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotificationOrBuilder> + getDataExtractionNotificationFieldBuilder() { + if (dataExtractionNotificationBuilder_ == null) { + dataExtractionNotificationBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotificationOrBuilder>( + dataExtractionNotification_, + getParentForChildren(), + isClean()); + dataExtractionNotification_ = null; + } + return dataExtractionNotificationBuilder_; + } + // @@protoc_insertion_point(builder_scope:signalservice.Content) } @@ -3899,6 +4103,622 @@ public final class SignalServiceProtos { // @@protoc_insertion_point(class_scope:signalservice.KeyPair) } + public interface DataExtractionNotificationOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required .signalservice.DataExtractionNotification.Type type = 1; + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+     * @required
+     * 
+ */ + boolean hasType(); + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+     * @required
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type getType(); + + // optional uint64 timestamp = 2; + /** + * optional uint64 timestamp = 2; + */ + boolean hasTimestamp(); + /** + * optional uint64 timestamp = 2; + */ + long getTimestamp(); + } + /** + * Protobuf type {@code signalservice.DataExtractionNotification} + */ + public static final class DataExtractionNotification extends + com.google.protobuf.GeneratedMessage + implements DataExtractionNotificationOrBuilder { + // Use DataExtractionNotification.newBuilder() to construct. + private DataExtractionNotification(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private DataExtractionNotification(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final DataExtractionNotification defaultInstance; + public static DataExtractionNotification getDefaultInstance() { + return defaultInstance; + } + + public DataExtractionNotification getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DataExtractionNotification( + 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 8: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + case 16: { + bitField0_ |= 0x00000002; + timestamp_ = input.readUInt64(); + 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_DataExtractionNotification_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataExtractionNotification_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public DataExtractionNotification parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DataExtractionNotification(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.DataExtractionNotification.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * SCREENSHOT = 1; + */ + SCREENSHOT(0, 1), + /** + * MEDIA_SAVED = 2; + * + *
+       * timestamp
+       * 
+ */ + MEDIA_SAVED(1, 2), + ; + + /** + * SCREENSHOT = 1; + */ + public static final int SCREENSHOT_VALUE = 1; + /** + * MEDIA_SAVED = 2; + * + *
+       * timestamp
+       * 
+ */ + public static final int MEDIA_SAVED_VALUE = 2; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 1: return SCREENSHOT; + case 2: return MEDIA_SAVED; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.DataExtractionNotification.Type) + } + + private int bitField0_; + // required .signalservice.DataExtractionNotification.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type type_; + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+     * @required
+     * 
+ */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+     * @required
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type getType() { + return type_; + } + + // optional uint64 timestamp = 2; + public static final int TIMESTAMP_FIELD_NUMBER = 2; + private long timestamp_; + /** + * optional uint64 timestamp = 2; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint64 timestamp = 2; + */ + public long getTimestamp() { + return timestamp_; + } + + private void initFields() { + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT; + timestamp_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasType()) { + 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.writeEnum(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt64(2, timestamp_); + } + 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 + .computeEnumSize(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(2, timestamp_); + } + 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.DataExtractionNotification parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification 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.DataExtractionNotification parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification 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.DataExtractionNotification parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification 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.DataExtractionNotification parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification 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.DataExtractionNotification parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification 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.DataExtractionNotification 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.DataExtractionNotification} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotificationOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataExtractionNotification_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataExtractionNotification_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.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(); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT; + bitField0_ = (bitField0_ & ~0x00000001); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + 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_DataExtractionNotification_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.timestamp_ = timestamp_; + 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.DataExtractionNotification) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasType()) { + + 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.DataExtractionNotification parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required .signalservice.DataExtractionNotification.Type type = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT; + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type getType() { + return type_; + } + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * required .signalservice.DataExtractionNotification.Type type = 1; + * + *
+       * @required
+       * 
+ */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT; + onChanged(); + return this; + } + + // optional uint64 timestamp = 2; + private long timestamp_ ; + /** + * optional uint64 timestamp = 2; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint64 timestamp = 2; + */ + public long getTimestamp() { + return timestamp_; + } + /** + * optional uint64 timestamp = 2; + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000002; + timestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 timestamp = 2; + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000002); + timestamp_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataExtractionNotification) + } + + static { + defaultInstance = new DataExtractionNotification(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataExtractionNotification) + } + public interface DataMessageOrBuilder extends com.google.protobuf.MessageOrBuilder { @@ -32398,6 +33218,11 @@ public final class SignalServiceProtos { private static com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_signalservice_KeyPair_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataExtractionNotification_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataExtractionNotification_fieldAccessorTable; private static com.google.protobuf.Descriptors.Descriptor internal_static_signalservice_DataMessage_descriptor; private static @@ -32536,126 +33361,132 @@ public final class SignalServiceProtos { "P_CIPHERTEXT\020\007\"{\n\rTypingMessage\022\021\n\ttimes" + "tamp\030\001 \001(\004\0223\n\006action\030\002 \001(\0162#.signalservi" + "ce.TypingMessage.Action\"\"\n\006Action\022\013\n\007STA" + - "RTED\020\000\022\013\n\007STOPPED\020\001\"\351\001\n\007Content\022/\n\013dataM", + "RTED\020\000\022\013\n\007STOPPED\020\001\"\270\002\n\007Content\022/\n\013dataM", "essage\030\001 \001(\0132\032.signalservice.DataMessage" + "\0225\n\016receiptMessage\030\005 \001(\0132\035.signalservice" + ".ReceiptMessage\0223\n\rtypingMessage\030\006 \001(\0132\034" + ".signalservice.TypingMessage\022A\n\024configur" + "ationMessage\030\007 \001(\0132#.signalservice.Confi" + - "gurationMessage\"U\n#ClosedGroupCiphertext" + - "MessageWrapper\022\022\n\nciphertext\030\001 \001(\014\022\032\n\022ep" + - "hemeralPublicKey\030\002 \001(\014\"0\n\007KeyPair\022\021\n\tpub" + - "licKey\030\001 \002(\014\022\022\n\nprivateKey\030\002 \002(\014\"\357\024\n\013Dat" + - "aMessage\022\014\n\004body\030\001 \001(\t\0225\n\013attachments\030\002 ", - "\003(\0132 .signalservice.AttachmentPointer\022*\n" + - "\005group\030\003 \001(\0132\033.signalservice.GroupContex" + - "t\022\r\n\005flags\030\004 \001(\r\022\023\n\013expireTimer\030\005 \001(\r\022\022\n" + - "\nprofileKey\030\006 \001(\014\022\021\n\ttimestamp\030\007 \001(\004\022/\n\005" + - "quote\030\010 \001(\0132 .signalservice.DataMessage." + - "Quote\0223\n\007contact\030\t \003(\0132\".signalservice.D" + - "ataMessage.Contact\0223\n\007preview\030\n \003(\0132\".si" + - "gnalservice.DataMessage.Preview\0227\n\007profi" + - "le\030e \001(\0132&.signalservice.DataMessage.Lok" + - "iProfile\022W\n\031closedGroupControlMessage\030h ", - "\001(\01324.signalservice.DataMessage.ClosedGr" + - "oupControlMessage\022\022\n\nsyncTarget\030i \001(\t\0226\n" + - "\016publicChatInfo\030\347\007 \001(\0132\035.signalservice.P" + - "ublicChatInfo\032\225\002\n\005Quote\022\n\n\002id\030\001 \001(\004\022\016\n\006a" + - "uthor\030\002 \001(\t\022\014\n\004text\030\003 \001(\t\022F\n\013attachments" + - "\030\004 \003(\01321.signalservice.DataMessage.Quote" + - ".QuotedAttachment\032\231\001\n\020QuotedAttachment\022\023" + - "\n\013contentType\030\001 \001(\t\022\020\n\010fileName\030\002 \001(\t\0223\n" + - "\tthumbnail\030\003 \001(\0132 .signalservice.Attachm" + - "entPointer\022\r\n\005flags\030\004 \001(\r\"\032\n\005Flags\022\021\n\rVO", - "ICE_MESSAGE\020\001\032\304\010\n\007Contact\0225\n\004name\030\001 \001(\0132" + - "\'.signalservice.DataMessage.Contact.Name" + - "\0228\n\006number\030\003 \003(\0132(.signalservice.DataMes" + - "sage.Contact.Phone\0227\n\005email\030\004 \003(\0132(.sign" + - "alservice.DataMessage.Contact.Email\022A\n\007a" + - "ddress\030\005 \003(\01320.signalservice.DataMessage" + - ".Contact.PostalAddress\0229\n\006avatar\030\006 \001(\0132)" + - ".signalservice.DataMessage.Contact.Avata" + - "r\022\024\n\014organization\030\007 \001(\t\032v\n\004Name\022\021\n\tgiven" + - "Name\030\001 \001(\t\022\022\n\nfamilyName\030\002 \001(\t\022\016\n\006prefix", - "\030\003 \001(\t\022\016\n\006suffix\030\004 \001(\t\022\022\n\nmiddleName\030\005 \001" + - "(\t\022\023\n\013displayName\030\006 \001(\t\032\226\001\n\005Phone\022\r\n\005val" + - "ue\030\001 \001(\t\022;\n\004type\030\002 \001(\0162-.signalservice.D" + - "ataMessage.Contact.Phone.Type\022\r\n\005label\030\003" + - " \001(\t\"2\n\004Type\022\010\n\004HOME\020\001\022\n\n\006MOBILE\020\002\022\010\n\004WO" + - "RK\020\003\022\n\n\006CUSTOM\020\004\032\226\001\n\005Email\022\r\n\005value\030\001 \001(" + - "\t\022;\n\004type\030\002 \001(\0162-.signalservice.DataMess" + - "age.Contact.Email.Type\022\r\n\005label\030\003 \001(\t\"2\n" + - "\004Type\022\010\n\004HOME\020\001\022\n\n\006MOBILE\020\002\022\010\n\004WORK\020\003\022\n\n" + - "\006CUSTOM\020\004\032\201\002\n\rPostalAddress\022C\n\004type\030\001 \001(", - "\01625.signalservice.DataMessage.Contact.Po" + - "stalAddress.Type\022\r\n\005label\030\002 \001(\t\022\016\n\006stree" + - "t\030\003 \001(\t\022\r\n\005pobox\030\004 \001(\t\022\024\n\014neighborhood\030\005" + - " \001(\t\022\014\n\004city\030\006 \001(\t\022\016\n\006region\030\007 \001(\t\022\020\n\010po" + - "stcode\030\010 \001(\t\022\017\n\007country\030\t \001(\t\"&\n\004Type\022\010\n" + - "\004HOME\020\001\022\010\n\004WORK\020\002\022\n\n\006CUSTOM\020\003\032M\n\006Avatar\022" + - "0\n\006avatar\030\001 \001(\0132 .signalservice.Attachme" + - "ntPointer\022\021\n\tisProfile\030\002 \001(\010\032V\n\007Preview\022" + - "\013\n\003url\030\001 \001(\t\022\r\n\005title\030\002 \001(\t\022/\n\005image\030\003 \001" + - "(\0132 .signalservice.AttachmentPointer\032:\n\013", - "LokiProfile\022\023\n\013displayName\030\001 \001(\t\022\026\n\016prof" + - "ilePicture\030\002 \001(\t\032\221\004\n\031ClosedGroupControlM" + - "essage\022G\n\004type\030\001 \002(\01629.signalservice.Dat" + - "aMessage.ClosedGroupControlMessage.Type\022" + - "\021\n\tpublicKey\030\002 \001(\014\022\014\n\004name\030\003 \001(\t\0221\n\021encr" + - "yptionKeyPair\030\004 \001(\0132\026.signalservice.KeyP" + - "air\022\017\n\007members\030\005 \003(\014\022\016\n\006admins\030\006 \003(\014\022U\n\010" + - "wrappers\030\007 \003(\0132C.signalservice.DataMessa" + - "ge.ClosedGroupControlMessage.KeyPairWrap" + - "per\032=\n\016KeyPairWrapper\022\021\n\tpublicKey\030\001 \002(\014", - "\022\030\n\020encryptedKeyPair\030\002 \002(\014\"\237\001\n\004Type\022\007\n\003N" + - "EW\020\001\022\n\n\006UPDATE\020\002\022\027\n\023ENCRYPTION_KEY_PAIR\020" + - "\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\"\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\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" + "gurationMessage\022M\n\032dataExtractionNotific" + + "ation\030R \001(\0132).signalservice.DataExtracti" + + "onNotification\"U\n#ClosedGroupCiphertextM" + + "essageWrapper\022\022\n\nciphertext\030\001 \001(\014\022\032\n\022eph" + + "emeralPublicKey\030\002 \001(\014\"0\n\007KeyPair\022\021\n\tpubl", + "icKey\030\001 \002(\014\022\022\n\nprivateKey\030\002 \002(\014\"\226\001\n\032Data" + + "ExtractionNotification\022<\n\004type\030\001 \002(\0162..s" + + "ignalservice.DataExtractionNotification." + + "Type\022\021\n\ttimestamp\030\002 \001(\004\"\'\n\004Type\022\016\n\nSCREE" + + "NSHOT\020\001\022\017\n\013MEDIA_SAVED\020\002\"\357\024\n\013DataMessage" + + "\022\014\n\004body\030\001 \001(\t\0225\n\013attachments\030\002 \003(\0132 .si" + + "gnalservice.AttachmentPointer\022*\n\005group\030\003" + + " \001(\0132\033.signalservice.GroupContext\022\r\n\005fla" + + "gs\030\004 \001(\r\022\023\n\013expireTimer\030\005 \001(\r\022\022\n\nprofile" + + "Key\030\006 \001(\014\022\021\n\ttimestamp\030\007 \001(\004\022/\n\005quote\030\010 ", + "\001(\0132 .signalservice.DataMessage.Quote\0223\n" + + "\007contact\030\t \003(\0132\".signalservice.DataMessa" + + "ge.Contact\0223\n\007preview\030\n \003(\0132\".signalserv" + + "ice.DataMessage.Preview\0227\n\007profile\030e \001(\013" + + "2&.signalservice.DataMessage.LokiProfile" + + "\022W\n\031closedGroupControlMessage\030h \001(\01324.si" + + "gnalservice.DataMessage.ClosedGroupContr" + + "olMessage\022\022\n\nsyncTarget\030i \001(\t\0226\n\016publicC" + + "hatInfo\030\347\007 \001(\0132\035.signalservice.PublicCha" + + "tInfo\032\225\002\n\005Quote\022\n\n\002id\030\001 \001(\004\022\016\n\006author\030\002 ", + "\001(\t\022\014\n\004text\030\003 \001(\t\022F\n\013attachments\030\004 \003(\01321" + + ".signalservice.DataMessage.Quote.QuotedA" + + "ttachment\032\231\001\n\020QuotedAttachment\022\023\n\013conten" + + "tType\030\001 \001(\t\022\020\n\010fileName\030\002 \001(\t\0223\n\tthumbna" + + "il\030\003 \001(\0132 .signalservice.AttachmentPoint" + + "er\022\r\n\005flags\030\004 \001(\r\"\032\n\005Flags\022\021\n\rVOICE_MESS" + + "AGE\020\001\032\304\010\n\007Contact\0225\n\004name\030\001 \001(\0132\'.signal" + + "service.DataMessage.Contact.Name\0228\n\006numb" + + "er\030\003 \003(\0132(.signalservice.DataMessage.Con" + + "tact.Phone\0227\n\005email\030\004 \003(\0132(.signalservic", + "e.DataMessage.Contact.Email\022A\n\007address\030\005" + + " \003(\01320.signalservice.DataMessage.Contact" + + ".PostalAddress\0229\n\006avatar\030\006 \001(\0132).signals" + + "ervice.DataMessage.Contact.Avatar\022\024\n\014org" + + "anization\030\007 \001(\t\032v\n\004Name\022\021\n\tgivenName\030\001 \001" + + "(\t\022\022\n\nfamilyName\030\002 \001(\t\022\016\n\006prefix\030\003 \001(\t\022\016" + + "\n\006suffix\030\004 \001(\t\022\022\n\nmiddleName\030\005 \001(\t\022\023\n\013di" + + "splayName\030\006 \001(\t\032\226\001\n\005Phone\022\r\n\005value\030\001 \001(\t" + + "\022;\n\004type\030\002 \001(\0162-.signalservice.DataMessa" + + "ge.Contact.Phone.Type\022\r\n\005label\030\003 \001(\t\"2\n\004", + "Type\022\010\n\004HOME\020\001\022\n\n\006MOBILE\020\002\022\010\n\004WORK\020\003\022\n\n\006" + + "CUSTOM\020\004\032\226\001\n\005Email\022\r\n\005value\030\001 \001(\t\022;\n\004typ" + + "e\030\002 \001(\0162-.signalservice.DataMessage.Cont" + + "act.Email.Type\022\r\n\005label\030\003 \001(\t\"2\n\004Type\022\010\n" + + "\004HOME\020\001\022\n\n\006MOBILE\020\002\022\010\n\004WORK\020\003\022\n\n\006CUSTOM\020" + + "\004\032\201\002\n\rPostalAddress\022C\n\004type\030\001 \001(\01625.sign" + + "alservice.DataMessage.Contact.PostalAddr" + + "ess.Type\022\r\n\005label\030\002 \001(\t\022\016\n\006street\030\003 \001(\t\022" + + "\r\n\005pobox\030\004 \001(\t\022\024\n\014neighborhood\030\005 \001(\t\022\014\n\004" + + "city\030\006 \001(\t\022\016\n\006region\030\007 \001(\t\022\020\n\010postcode\030\010", + " \001(\t\022\017\n\007country\030\t \001(\t\"&\n\004Type\022\010\n\004HOME\020\001\022" + + "\010\n\004WORK\020\002\022\n\n\006CUSTOM\020\003\032M\n\006Avatar\0220\n\006avata" + + "r\030\001 \001(\0132 .signalservice.AttachmentPointe" + + "r\022\021\n\tisProfile\030\002 \001(\010\032V\n\007Preview\022\013\n\003url\030\001" + + " \001(\t\022\r\n\005title\030\002 \001(\t\022/\n\005image\030\003 \001(\0132 .sig" + + "nalservice.AttachmentPointer\032:\n\013LokiProf" + + "ile\022\023\n\013displayName\030\001 \001(\t\022\026\n\016profilePictu" + + "re\030\002 \001(\t\032\221\004\n\031ClosedGroupControlMessage\022G" + + "\n\004type\030\001 \002(\01629.signalservice.DataMessage" + + ".ClosedGroupControlMessage.Type\022\021\n\tpubli", + "cKey\030\002 \001(\014\022\014\n\004name\030\003 \001(\t\0221\n\021encryptionKe" + + "yPair\030\004 \001(\0132\026.signalservice.KeyPair\022\017\n\007m" + + "embers\030\005 \003(\014\022\016\n\006admins\030\006 \003(\014\022U\n\010wrappers" + + "\030\007 \003(\0132C.signalservice.DataMessage.Close" + + "dGroupControlMessage.KeyPairWrapper\032=\n\016K" + + "eyPairWrapper\022\021\n\tpublicKey\030\001 \002(\014\022\030\n\020encr" + + "yptedKeyPair\030\002 \002(\014\"\237\001\n\004Type\022\007\n\003NEW\020\001\022\n\n\006" + + "UPDATE\020\002\022\027\n\023ENCRYPTION_KEY_PAIR\020\003\022\017\n\013NAM" + + "E_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\033ENCRYPTIO", + "N_KEY_PAIR_REQUEST\020\010\"$\n\005Flags\022\033\n\027EXPIRAT" + + "ION_TIMER_UPDATE\020\002\"\316\003\n\024ConfigurationMess" + + "age\022E\n\014closedGroups\030\001 \003(\0132/.signalservic" + + "e.ConfigurationMessage.ClosedGroup\022\022\n\nop" + + "enGroups\030\002 \003(\t\022\023\n\013displayName\030\003 \001(\t\022\026\n\016p" + + "rofilePicture\030\004 \001(\t\022\022\n\nprofileKey\030\005 \001(\014\022" + + "=\n\010contacts\030\006 \003(\0132+.signalservice.Config" + + "urationMessage.Contact\032\202\001\n\013ClosedGroup\022\021" + + "\n\tpublicKey\030\001 \001(\014\022\014\n\004name\030\002 \001(\t\0221\n\021encry" + + "ptionKeyPair\030\003 \001(\0132\026.signalservice.KeyPa", + "ir\022\017\n\007members\030\004 \003(\014\022\016\n\006admins\030\005 \003(\014\032V\n\007C" + + "ontact\022\021\n\tpublicKey\030\001 \002(\014\022\014\n\004name\030\002 \002(\t\022" + + "\026\n\016profilePicture\030\003 \001(\t\022\022\n\nprofileKey\030\004 " + + "\001(\014\"u\n\016ReceiptMessage\0220\n\004type\030\001 \001(\0162\".si" + + "gnalservice.ReceiptMessage.Type\022\021\n\ttimes" + + "tamp\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\013" + + "contentType\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\006digest\030\006 \001(\014\022" + + "\020\n\010fileName\030\007 \001(\t\022\r\n\005flags\030\010 \001(\r\022\r\n\005widt", + "h\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\002id\030\001 \001(\014\022.\n\004type\030\002" + + " \001(\0162 .signalservice.GroupContext.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.AttachmentPointer\022" + + "\016\n\006admins\030\006 \003(\t\022\023\n\nnewMembers\030\346\007 \003(\t\022\027\n\016" + + "removedMembers\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\004QUIT\020\003\022\020\n" + + "\014REQUEST_INFO\020\004\"\356\001\n\016ContactDetails\022\016\n\006nu", + "mber\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\0224\n\006avatar\030\003 \001(\013" + + "2$.signalservice.ContactDetails.Avatar\022\r" + + "\n\005color\030\004 \001(\t\022\022\n\nprofileKey\030\006 \001(\014\022\017\n\007blo" + + "cked\030\007 \001(\010\022\023\n\013expireTimer\030\010 \001(\r\022\020\n\010nickn" + + "ame\030e \001(\t\032-\n\006Avatar\022\023\n\013contentType\030\001 \001(\t" + + "\022\016\n\006length\030\002 \001(\r\"\367\001\n\014GroupDetails\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\006" + + "avatar\030\004 \001(\0132\".signalservice.GroupDetail" + + "s.Avatar\022\024\n\006active\030\005 \001(\010:\004true\022\023\n\013expire" + + "Timer\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\006Avatar\022\023\n\013content" + + "Type\030\001 \001(\t\022\016\n\006length\030\002 \001(\r\"\"\n\016PublicChat" + + "Info\022\020\n\010serverID\030\001 \001(\004BB\n+org.session.li" + + "bsignal.service.internal.pushB\023SignalSer" + + "viceProtos" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -32679,7 +33510,7 @@ public final class SignalServiceProtos { internal_static_signalservice_Content_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_Content_descriptor, - new java.lang.String[] { "DataMessage", "ReceiptMessage", "TypingMessage", "ConfigurationMessage", }); + new java.lang.String[] { "DataMessage", "ReceiptMessage", "TypingMessage", "ConfigurationMessage", "DataExtractionNotification", }); internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_descriptor = getDescriptor().getMessageTypes().get(3); internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_fieldAccessorTable = new @@ -32692,8 +33523,14 @@ public final class SignalServiceProtos { com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_KeyPair_descriptor, new java.lang.String[] { "PublicKey", "PrivateKey", }); - internal_static_signalservice_DataMessage_descriptor = + internal_static_signalservice_DataExtractionNotification_descriptor = getDescriptor().getMessageTypes().get(5); + internal_static_signalservice_DataExtractionNotification_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataExtractionNotification_descriptor, + new java.lang.String[] { "Type", "Timestamp", }); + internal_static_signalservice_DataMessage_descriptor = + getDescriptor().getMessageTypes().get(6); internal_static_signalservice_DataMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_DataMessage_descriptor, @@ -32771,7 +33608,7 @@ public final class SignalServiceProtos { internal_static_signalservice_DataMessage_ClosedGroupControlMessage_KeyPairWrapper_descriptor, new java.lang.String[] { "PublicKey", "EncryptedKeyPair", }); internal_static_signalservice_ConfigurationMessage_descriptor = - getDescriptor().getMessageTypes().get(6); + getDescriptor().getMessageTypes().get(7); internal_static_signalservice_ConfigurationMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_ConfigurationMessage_descriptor, @@ -32789,25 +33626,25 @@ public final class SignalServiceProtos { internal_static_signalservice_ConfigurationMessage_Contact_descriptor, new java.lang.String[] { "PublicKey", "Name", "ProfilePicture", "ProfileKey", }); internal_static_signalservice_ReceiptMessage_descriptor = - getDescriptor().getMessageTypes().get(7); + getDescriptor().getMessageTypes().get(8); internal_static_signalservice_ReceiptMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_ReceiptMessage_descriptor, new java.lang.String[] { "Type", "Timestamp", }); internal_static_signalservice_AttachmentPointer_descriptor = - getDescriptor().getMessageTypes().get(8); + getDescriptor().getMessageTypes().get(9); internal_static_signalservice_AttachmentPointer_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_AttachmentPointer_descriptor, new java.lang.String[] { "Id", "ContentType", "Key", "Size", "Thumbnail", "Digest", "FileName", "Flags", "Width", "Height", "Caption", "Url", }); internal_static_signalservice_GroupContext_descriptor = - getDescriptor().getMessageTypes().get(9); + getDescriptor().getMessageTypes().get(10); internal_static_signalservice_GroupContext_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_GroupContext_descriptor, new java.lang.String[] { "Id", "Type", "Name", "Members", "Avatar", "Admins", "NewMembers", "RemovedMembers", }); internal_static_signalservice_ContactDetails_descriptor = - getDescriptor().getMessageTypes().get(10); + getDescriptor().getMessageTypes().get(11); internal_static_signalservice_ContactDetails_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_ContactDetails_descriptor, @@ -32819,7 +33656,7 @@ public final class SignalServiceProtos { internal_static_signalservice_ContactDetails_Avatar_descriptor, new java.lang.String[] { "ContentType", "Length", }); internal_static_signalservice_GroupDetails_descriptor = - getDescriptor().getMessageTypes().get(11); + getDescriptor().getMessageTypes().get(12); internal_static_signalservice_GroupDetails_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_GroupDetails_descriptor, @@ -32831,7 +33668,7 @@ public final class SignalServiceProtos { internal_static_signalservice_GroupDetails_Avatar_descriptor, new java.lang.String[] { "ContentType", "Length", }); internal_static_signalservice_PublicChatInfo_descriptor = - getDescriptor().getMessageTypes().get(12); + getDescriptor().getMessageTypes().get(13); internal_static_signalservice_PublicChatInfo_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_signalservice_PublicChatInfo_descriptor, From 95646ed04eb9da9a9af6cbf2f2c9a622150d5f49 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Tue, 16 Mar 2021 16:31:52 +1100 Subject: [PATCH 2/9] make error description show in the message detail activity --- .../thoughtcrime/securesms/database/Storage.kt | 6 ++++++ .../messaging/jobs/AttachmentDownloadJob.kt | 2 +- .../messaging/jobs/AttachmentUploadJob.kt | 2 +- .../sending_receiving/MessageReceiver.kt | 2 +- .../messaging/sending_receiving/MessageSender.kt | 16 +++++++--------- .../libsession/messaging/utilities/DotNetAPI.kt | 2 +- .../messaging/utilities/MessageWrapper.kt | 2 +- .../org/session/libsession/snode/SnodeAPI.kt | 2 +- .../service/loki/crypto/MnemonicCodec.kt | 2 +- 9 files changed, 20 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 6a0d42777d..3cb1887381 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -44,6 +44,7 @@ import org.session.libsession.messaging.messages.signal.IncomingGroupMessage import org.session.libsession.messaging.messages.signal.IncomingTextMessage import org.session.libsession.messaging.messages.signal.OutgoingTextMessage import org.session.libsession.utilities.preferences.ProfileKeyUtil +import org.session.libsignal.service.loki.utilities.prettifiedDescription class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), StorageProtocol { override fun getUserPublicKey(): String? { @@ -368,6 +369,11 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, val smsDatabase = DatabaseFactory.getSmsDatabase(context) smsDatabase.markAsSentFailed(messageRecord.getId()) } + if (error.localizedMessage != null) { + DatabaseFactory.getLokiMessageDatabase(context).setErrorMessage(messageRecord.getId(), error.localizedMessage!!) + } else { + DatabaseFactory.getLokiMessageDatabase(context).setErrorMessage(messageRecord.getId(), error.javaClass.simpleName) + } } override fun getGroup(groupID: String): GroupRecord? { diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt index 37eafe8b1b..f46a124ca8 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt @@ -17,7 +17,7 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) private val MAX_ATTACHMENT_SIZE = 10 * 1024 * 1024 // Error - internal sealed class Error(val description: String) : Exception() { + internal sealed class Error(val description: String) : Exception(description) { object NoAttachment : Error("No such attachment.") } diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentUploadJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentUploadJob.kt index 847d4a3b88..94b7a9d26a 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentUploadJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentUploadJob.kt @@ -25,7 +25,7 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess override var failureCount: Int = 0 // Error - internal sealed class Error(val description: String) : Exception() { + internal sealed class Error(val description: String) : Exception(description) { object NoAttachment : Error("No such attachment.") } diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt index 5b661327cb..8412ddcc61 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt @@ -11,7 +11,7 @@ object MessageReceiver { private val lastEncryptionKeyPairRequest = mutableMapOf() - internal sealed class Error(val description: String) : Exception() { + internal sealed class Error(val description: String) : Exception(description) { object DuplicateMessage: Error("Duplicate message.") object InvalidMessage: Error("Invalid message.") object UnknownMessage: Error("Unknown message type.") diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt index 39a0237000..ebab94b9aa 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt @@ -34,7 +34,7 @@ import org.session.libsignal.utilities.logging.Log object MessageSender { // Error - sealed class Error(val description: String) : Exception() { + sealed class Error(val description: String) : Exception(description) { object InvalidMessage : Error("Invalid message.") object ProtoConversionFailed : Error("Couldn't convert message to proto.") object ProofOfWorkCalculationFailed : Error("Proof of work calculation failed.") @@ -202,6 +202,11 @@ object MessageSender { val preconditionFailure = Exception("Destination should not be contacts or closed groups!") message.sentTimestamp ?: run { message.sentTimestamp = System.currentTimeMillis() } message.sender = storage.getUserPublicKey() + // Set the failure handler (need it here already for precondition failure handling) + fun handleFailure(error: Exception) { + handleFailedMessageSend(message, error) + deferred.reject(error) + } try { val server: String val channel: Long @@ -214,19 +219,12 @@ object MessageSender { channel = destination.channel } } - // Set the failure handler (need it here already for precondition failure handling) - fun handleFailure(error: Exception) { - handleFailedMessageSend(message, error) - deferred.reject(error) - } // Validate the message if (message !is VisibleMessage || !message.isValid()) { - handleFailure(Error.InvalidMessage) throw Error.InvalidMessage } // Convert the message to an open group message val openGroupMessage = OpenGroupMessage.from(message, server) ?: kotlin.run { - handleFailure(Error.InvalidMessage) throw Error.InvalidMessage } // Send the result @@ -238,7 +236,7 @@ object MessageSender { handleFailure(it) } } catch (exception: Exception) { - deferred.reject(exception) + handleFailure(exception) } return deferred.promise } diff --git a/libsession/src/main/java/org/session/libsession/messaging/utilities/DotNetAPI.kt b/libsession/src/main/java/org/session/libsession/messaging/utilities/DotNetAPI.kt index 49853b33e2..0856e43862 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/utilities/DotNetAPI.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/utilities/DotNetAPI.kt @@ -42,7 +42,7 @@ open class DotNetAPI { internal enum class HTTPVerb { GET, PUT, POST, DELETE, PATCH } // Error - internal sealed class Error(val description: String) : Exception() { + internal sealed class Error(val description: String) : Exception(description) { object Generic : Error("An error occurred.") object InvalidURL : Error("Invalid URL.") object ParsingFailed : Error("Invalid file server response.") diff --git a/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt b/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt index 9305852258..b11cbe1774 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt @@ -10,7 +10,7 @@ import java.security.SecureRandom object MessageWrapper { // region Types - sealed class Error(val description: String) : Exception() { + sealed class Error(val description: String) : Exception(description) { object FailedToWrapData : Error("Failed to wrap data.") object FailedToWrapMessageInEnvelope : Error("Failed to wrap message in envelope.") object FailedToWrapEnvelopeInWebSocketMessage : Error("Failed to wrap envelope in web socket message.") diff --git a/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt b/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt index 1b17a02211..98b711af60 100644 --- a/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt +++ b/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt @@ -45,7 +45,7 @@ object SnodeAPI { internal var powDifficulty = 1 // Error - internal sealed class Error(val description: String) : Exception() { + internal sealed class Error(val description: String) : Exception(description) { object Generic : Error("An error occurred.") object ClockOutOfSync : Error("The user's clock is out of sync with the service node network.") object RandomSnodePoolUpdatingFailed : Error("Failed to update random service node pool.") diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/MnemonicCodec.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/MnemonicCodec.kt index 192218d399..b3c15dd132 100644 --- a/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/MnemonicCodec.kt +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/MnemonicCodec.kt @@ -50,7 +50,7 @@ class MnemonicCodec(private val loadFileContents: (String) -> String) { } } - sealed class DecodingError(val description: String) : Exception() { + sealed class DecodingError(val description: String) : Exception(description) { object Generic : DecodingError("Something went wrong. Please check your mnemonic and try again.") object InputTooShort : DecodingError("Looks like you didn't enter enough words. Please check your mnemonic and try again.") object MissingLastWord : DecodingError("You seem to be missing the last word of your mnemonic. Please check what you entered and try again.") From 39aef68b0428813b4775318099031b89480d10f9 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 17 Mar 2021 10:48:20 +1100 Subject: [PATCH 3/9] refactor precondition failure error --- .../messaging/sending_receiving/MessageSender.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt index ff07ae0ddc..9ccd58fc72 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt @@ -50,6 +50,9 @@ object MessageSender { object NoPrivateKey : Error("Couldn't find a private key associated with the given group public key.") object InvalidClosedGroupUpdate : Error("Invalid group update.") + // Precondition + class PreconditionFailure(val reason: String): Error(reason) + internal val isRetryable: Boolean = when (this) { is InvalidMessage -> false is ProtoConversionFailed -> false @@ -73,7 +76,6 @@ object MessageSender { val promise = deferred.promise val storage = MessagingConfiguration.shared.storage val userPublicKey = storage.getUserPublicKey() - val preconditionFailure = Exception("Destination should not be open groups!") // Set the timestamp, sender and recipient message.sentTimestamp ?: run { message.sentTimestamp = System.currentTimeMillis() } /* Visible messages will already have their sent timestamp set */ message.sender = userPublicKey @@ -90,7 +92,7 @@ object MessageSender { when (destination) { is Destination.Contact -> message.recipient = destination.publicKey is Destination.ClosedGroup -> message.recipient = destination.groupPublicKey - is Destination.OpenGroup -> throw preconditionFailure + is Destination.OpenGroup -> throw Error.PreconditionFailure("Destination should not be open groups!") } // Validate the message if (!message.isValid()) { throw Error.InvalidMessage } @@ -128,7 +130,7 @@ object MessageSender { val encryptionKeyPair = MessagingConfiguration.shared.storage.getLatestClosedGroupEncryptionKeyPair(destination.groupPublicKey)!! ciphertext = MessageSenderEncryption.encryptWithSessionProtocol(plaintext, encryptionKeyPair.hexEncodedPublicKey) } - is Destination.OpenGroup -> throw preconditionFailure + is Destination.OpenGroup -> throw Error.PreconditionFailure("Destination should not be open groups!") } // Wrap the result val kind: SignalServiceProtos.Envelope.Type @@ -142,7 +144,7 @@ object MessageSender { kind = SignalServiceProtos.Envelope.Type.CLOSED_GROUP_CIPHERTEXT senderPublicKey = destination.groupPublicKey } - is Destination.OpenGroup -> throw preconditionFailure + is Destination.OpenGroup -> throw Error.PreconditionFailure("Destination should not be open groups!") } val wrappedMessage = MessageWrapper.wrap(kind, message.sentTimestamp!!, senderPublicKey, ciphertext) // Calculate proof of work @@ -200,7 +202,6 @@ object MessageSender { private fun sendToOpenGroupDestination(destination: Destination, message: Message): Promise { val deferred = deferred() val storage = MessagingConfiguration.shared.storage - val preconditionFailure = Exception("Destination should not be contacts or closed groups!") message.sentTimestamp ?: run { message.sentTimestamp = System.currentTimeMillis() } message.sender = storage.getUserPublicKey() // Set the failure handler (need it here already for precondition failure handling) @@ -212,8 +213,8 @@ object MessageSender { val server: String val channel: Long when (destination) { - is Destination.Contact -> throw preconditionFailure - is Destination.ClosedGroup -> throw preconditionFailure + is Destination.Contact -> throw Error.PreconditionFailure("Destination should not be contacts!") + is Destination.ClosedGroup -> throw Error.PreconditionFailure("Destination should not be closed groups!") is Destination.OpenGroup -> { message.recipient = "${destination.server}.${destination.channel}" server = destination.server From 436598a80b91db390406bb3be7e06f33473c56ac Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 17 Mar 2021 11:30:03 +1100 Subject: [PATCH 4/9] resume pending jobs on app starting --- .../org/thoughtcrime/securesms/loki/activities/HomeActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index bcbdc18ef8..281d42b552 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -30,6 +30,7 @@ import org.session.libsession.messaging.sending_receiving.MessageSender import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.session.libsession.messaging.jobs.JobQueue import org.session.libsession.utilities.* import org.session.libsignal.service.loki.utilities.mentions.MentionsManager import org.session.libsignal.service.loki.utilities.toHexString @@ -139,6 +140,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), if (userPublicKey != null) { MentionsManager.configureIfNeeded(userPublicKey, threadDB, userDB) application.publicChatManager.startPollersIfNeeded() + JobQueue.shared.resumePendingJobs() } IP2Country.configureIfNeeded(this) application.registerForFCMIfNeeded(false) From 1e9e580a2ffadd92e209a097e7ab0171b6dd4df1 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 17 Mar 2021 12:06:44 +1100 Subject: [PATCH 5/9] minor refactor --- .../securesms/loki/database/SessionJobDatabase.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt index 9ae1659ca0..1d4b81486c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt @@ -85,10 +85,7 @@ class SessionJobDatabase(context: Context, helper: SQLCipherOpenHelper) : Databa } } -class SessionJobHelper() { - - companion object { - val dataSerializer: Data.Serializer = JsonDataSerializer() - val sessionJobInstantiator: SessionJobInstantiator = SessionJobInstantiator(SessionJobManagerFactories.getSessionJobFactories()) - } +object SessionJobHelper { + val dataSerializer: Data.Serializer = JsonDataSerializer() + val sessionJobInstantiator: SessionJobInstantiator = SessionJobInstantiator(SessionJobManagerFactories.getSessionJobFactories()) } \ No newline at end of file From 80382cc454685d71e38a446acbd75d750e74fb17 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 17 Mar 2021 16:09:01 +1100 Subject: [PATCH 6/9] minor refactor --- .../securesms/loki/database/SessionJobDatabase.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt index 1d4b81486c..dda3b7d7eb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionJobDatabase.kt @@ -12,11 +12,11 @@ import org.thoughtcrime.securesms.loki.utilities.* class SessionJobDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper) { companion object { - private val sessionJobTable = "session_job_database" - val jobID = "job_id" - val jobType = "job_type" - val failureCount = "failure_count" - val serializedData = "serialized_data" + private const val sessionJobTable = "session_job_database" + const val jobID = "job_id" + const val jobType = "job_type" + const val failureCount = "failure_count" + const val serializedData = "serialized_data" @JvmStatic val createSessionJobTableCommand = "CREATE TABLE $sessionJobTable ($jobID INTEGER PRIMARY KEY, $jobType STRING, $failureCount INTEGER DEFAULT 0, $serializedData TEXT);" } From 333533785bfb2a31ca66a64ccf2a6115f7c15246 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 17 Mar 2021 16:22:43 +1100 Subject: [PATCH 7/9] fix crash on attachment send failure --- .../messaging/sending_receiving/MessageSender.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt index 9ccd58fc72..7344b3f17c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt @@ -246,7 +246,8 @@ object MessageSender { // Result Handling fun handleSuccessfulMessageSend(message: Message, destination: Destination, isSyncMessage: Boolean = false) { val storage = MessagingConfiguration.shared.storage - val messageId = storage.getMessageIdInDatabase(message.sentTimestamp!!, message.sender!!) ?: return + val userPublicKey = storage.getUserPublicKey()!! + val messageId = storage.getMessageIdInDatabase(message.sentTimestamp!!, message.sender?:userPublicKey) ?: return // Ignore future self-sends storage.addReceivedMessageTimestamp(message.sentTimestamp!!) // Track the open group server message ID @@ -254,17 +255,16 @@ object MessageSender { storage.setOpenGroupServerMessageID(messageId, message.openGroupServerMessageID!!) } // Mark the message as sent - storage.markAsSent(message.sentTimestamp!!, message.sender!!) - storage.markUnidentified(message.sentTimestamp!!, message.sender!!) + storage.markAsSent(message.sentTimestamp!!, message.sender?:userPublicKey) + storage.markUnidentified(message.sentTimestamp!!, message.sender?:userPublicKey) // Start the disappearing messages timer if needed if (message is VisibleMessage && !isSyncMessage) { - SSKEnvironment.shared.messageExpirationManager.startAnyExpiration(message.sentTimestamp!!, message.sender!!) + SSKEnvironment.shared.messageExpirationManager.startAnyExpiration(message.sentTimestamp!!, message.sender?:userPublicKey) } // Sync the message if: // • it's a visible message // • the destination was a contact // • we didn't sync it already - val userPublicKey = storage.getUserPublicKey()!! if (destination is Destination.Contact && !isSyncMessage) { if (message is VisibleMessage) { message.syncTarget = destination.publicKey } if (message is ExpirationTimerUpdate) { message.syncTarget = destination.publicKey } @@ -274,7 +274,8 @@ object MessageSender { fun handleFailedMessageSend(message: Message, error: Exception) { val storage = MessagingConfiguration.shared.storage - storage.setErrorMessage(message.sentTimestamp!!, message.sender!!, error) + val userPublicKey = storage.getUserPublicKey()!! + storage.setErrorMessage(message.sentTimestamp!!, message.sender?:userPublicKey, error) } // Convenience From e378d11692e3439ed22cf179e8226a0bc9e5522e Mon Sep 17 00:00:00 2001 From: Brice-W Date: Tue, 23 Mar 2021 10:11:10 +1100 Subject: [PATCH 8/9] few little fixes --- .../messages/control/ClosedGroupControlMessage.kt | 3 +-- .../messages/control/DataExtractionNotification.kt | 12 +++++------- .../messaging/messages/control/ReadReceipt.kt | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt index d7e440fe98..70c75ddce3 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt @@ -38,7 +38,7 @@ class ClosedGroupControlMessage() : ControlMessage() { object MemberLeft : Kind() object EncryptionKeyPairRequest: Kind() - val description: String = run { + val description: String = when(this) { is New -> "new" is Update -> "update" @@ -49,7 +49,6 @@ class ClosedGroupControlMessage() : ControlMessage() { MemberLeft -> "memberLeft" EncryptionKeyPairRequest -> "encryptionKeyPairRequest" } - } } companion object { diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt index a612584af8..1888f66a49 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt @@ -14,12 +14,11 @@ class DataExtractionNotification(): ControlMessage() { class Screenshot() : Kind() class MediaSaved(val timestanp: Long) : Kind() - val description: String = run { + val description: String = when(this) { is Screenshot -> "screenshot" is MediaSaved -> "mediaSaved" } - } } companion object { @@ -27,12 +26,11 @@ class DataExtractionNotification(): ControlMessage() { fun fromProto(proto: SignalServiceProtos.Content): DataExtractionNotification? { val dataExtractionNotification = proto.dataExtractionNotification ?: return null - val kind: Kind - when(dataExtractionNotification.type) { - SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT -> kind = Kind.Screenshot() + val kind: Kind = when(dataExtractionNotification.type) { + SignalServiceProtos.DataExtractionNotification.Type.SCREENSHOT -> Kind.Screenshot() SignalServiceProtos.DataExtractionNotification.Type.MEDIA_SAVED -> { - val timestamp = if (dataExtractionNotification.hasTimestamp()) dataExtractionNotification.timestamp else 0 - kind = Kind.MediaSaved(timestamp) + val timestamp = if (dataExtractionNotification.hasTimestamp()) dataExtractionNotification.timestamp else return null + Kind.MediaSaved(timestamp) } } return DataExtractionNotification(kind) diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt index 0ee1f0acf9..b430f09c41 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt @@ -35,7 +35,7 @@ class ReadReceipt() : ControlMessage() { override fun toProto(): SignalServiceProtos.Content? { val timestamps = timestamps if (timestamps == null) { - Log.w(ExpirationTimerUpdate.TAG, "Couldn't construct read receipt proto from: $this") + Log.w(TAG, "Couldn't construct read receipt proto from: $this") return null } val receiptProto = SignalServiceProtos.ReceiptMessage.newBuilder() @@ -46,7 +46,7 @@ class ReadReceipt() : ControlMessage() { contentProto.receiptMessage = receiptProto.build() return contentProto.build() } catch (e: Exception) { - Log.w(ExpirationTimerUpdate.TAG, "Couldn't construct read receipt proto from: $this") + Log.w(TAG, "Couldn't construct read receipt proto from: $this") return null } } From 0bea7fa56d1d1349f32992719bcbeabe5354bbd1 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Tue, 23 Mar 2021 10:43:32 +1100 Subject: [PATCH 9/9] clean --- .../org/session/libsession/messaging/jobs/MessageReceiveJob.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt index d11bc2d3d2..4ce46b4577 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt @@ -15,7 +15,6 @@ class MessageReceiveJob(val data: ByteArray, val isBackgroundPoll: Boolean, val // Settings override val maxFailureCount: Int = 10 companion object { - val TAG = MessageReceiveJob::class.simpleName val KEY: String = "MessageReceiveJob"