From 676c307412f70444fbfdcda9a40bb42c5b546669 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 26 Apr 2021 10:58:48 +1000 Subject: [PATCH] Clean --- .../database/MessageDataProvider.kt | 1 - .../messaging/avatars/AvatarHelper.java | 1 - .../messaging/avatars/ContactPhoto.java | 2 -- .../avatars/FallbackContactPhoto.java | 1 - .../avatars/GeneratedContactPhoto.java | 1 - .../avatars/GroupRecordContactPhoto.java | 1 - .../avatars/ProfileContactPhoto.java | 1 - .../messaging/avatars/SystemContactPhoto.java | 1 - .../messaging/jobs/AttachmentDownloadJob.kt | 20 ++++------- .../messaging/jobs/AttachmentUploadJob.kt | 34 ++++++------------- .../libsession/messaging/jobs/Data.java | 1 - .../session/libsession/messaging/jobs/Job.kt | 4 +-- .../libsession/messaging/jobs/JobDelegate.kt | 1 + .../libsession/messaging/jobs/JobQueue.kt | 10 +++--- .../messaging/jobs/MessageReceiveJob.kt | 6 ++-- .../messaging/jobs/MessageSendJob.kt | 12 +++---- .../messaging/jobs/NotifyPNServerJob.kt | 10 ++---- .../messaging/jobs/SessionJobInstantiator.kt | 2 -- .../jobs/SessionJobManagerFactories.kt | 2 -- .../control/ClosedGroupControlMessage.kt | 34 ++----------------- .../messaging/utilities/DotNetAPI.kt | 10 +++--- .../utilities/LinkedBlockingLifoQueue.java | 1 - .../libsession/utilities/NumberUtil.kt | 1 - .../libsession/utilities/SSKEnvironment.kt | 1 + .../concurrent/AssertedSuccessListener.java | 1 + .../DynamicLanguageContextWrapper.java | 1 - .../dynamiclanguage/LanguageString.java | 3 +- .../utilities/preferences/ProfileKeyUtil.java | 1 - .../utilities/task/SnackbarAsyncTask.java | 1 - .../libsession/utilities/views/Stub.java | 1 - 30 files changed, 44 insertions(+), 122 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt b/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt index d3065e5772..f28001cc7c 100644 --- a/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt +++ b/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt @@ -30,7 +30,6 @@ interface MessageDataProvider { fun updateAttachmentAfterUploadSucceeded(attachmentId: Long, attachmentStream: SignalServiceAttachmentStream, attachmentKey: ByteArray, uploadResult: DotNetAPI.UploadResult) fun updateAttachmentAfterUploadFailed(attachmentId: Long) - // Quotes fun getMessageForQuote(timestamp: Long, author: Address): Pair? fun getAttachmentsAndLinkPreviewFor(mmsId: Long): List fun getMessageBodyFor(timestamp: Long, author: String): String diff --git a/libsession/src/main/java/org/session/libsession/messaging/avatars/AvatarHelper.java b/libsession/src/main/java/org/session/libsession/messaging/avatars/AvatarHelper.java index b5286cd1ca..aad0051bbf 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/avatars/AvatarHelper.java +++ b/libsession/src/main/java/org/session/libsession/messaging/avatars/AvatarHelper.java @@ -1,6 +1,5 @@ package org.session.libsession.messaging.avatars; - import android.content.Context; import androidx.annotation.NonNull; diff --git a/libsession/src/main/java/org/session/libsession/messaging/avatars/ContactPhoto.java b/libsession/src/main/java/org/session/libsession/messaging/avatars/ContactPhoto.java index 93bc7957a6..e11eb5f36c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/avatars/ContactPhoto.java +++ b/libsession/src/main/java/org/session/libsession/messaging/avatars/ContactPhoto.java @@ -1,6 +1,5 @@ package org.session.libsession.messaging.avatars; - import android.content.Context; import android.net.Uri; @@ -19,5 +18,4 @@ public interface ContactPhoto extends Key { @Nullable Uri getUri(@NonNull Context context); boolean isProfilePhoto(); - } diff --git a/libsession/src/main/java/org/session/libsession/messaging/avatars/FallbackContactPhoto.java b/libsession/src/main/java/org/session/libsession/messaging/avatars/FallbackContactPhoto.java index 388266b6c8..c21c0438bd 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/avatars/FallbackContactPhoto.java +++ b/libsession/src/main/java/org/session/libsession/messaging/avatars/FallbackContactPhoto.java @@ -7,5 +7,4 @@ public interface FallbackContactPhoto { public Drawable asDrawable(Context context, int color); public Drawable asDrawable(Context context, int color, boolean inverted); - } diff --git a/libsession/src/main/java/org/session/libsession/messaging/avatars/GeneratedContactPhoto.java b/libsession/src/main/java/org/session/libsession/messaging/avatars/GeneratedContactPhoto.java index 6066db0321..d3be9cfbf3 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/avatars/GeneratedContactPhoto.java +++ b/libsession/src/main/java/org/session/libsession/messaging/avatars/GeneratedContactPhoto.java @@ -19,7 +19,6 @@ import org.session.libsession.utilities.ViewUtil; import java.util.regex.Pattern; - public class GeneratedContactPhoto implements FallbackContactPhoto { private static final Pattern PATTERN = Pattern.compile("[^\\p{L}\\p{Nd}\\p{S}]+"); diff --git a/libsession/src/main/java/org/session/libsession/messaging/avatars/GroupRecordContactPhoto.java b/libsession/src/main/java/org/session/libsession/messaging/avatars/GroupRecordContactPhoto.java index 818b6df3c6..24c2dfec93 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/avatars/GroupRecordContactPhoto.java +++ b/libsession/src/main/java/org/session/libsession/messaging/avatars/GroupRecordContactPhoto.java @@ -1,6 +1,5 @@ package org.session.libsession.messaging.avatars; - import android.content.Context; import android.net.Uri; diff --git a/libsession/src/main/java/org/session/libsession/messaging/avatars/ProfileContactPhoto.java b/libsession/src/main/java/org/session/libsession/messaging/avatars/ProfileContactPhoto.java index 164f4dd747..19109b86ad 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/avatars/ProfileContactPhoto.java +++ b/libsession/src/main/java/org/session/libsession/messaging/avatars/ProfileContactPhoto.java @@ -1,6 +1,5 @@ package org.session.libsession.messaging.avatars; - import android.content.Context; import android.net.Uri; diff --git a/libsession/src/main/java/org/session/libsession/messaging/avatars/SystemContactPhoto.java b/libsession/src/main/java/org/session/libsession/messaging/avatars/SystemContactPhoto.java index b9395b75d6..002a61de98 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/avatars/SystemContactPhoto.java +++ b/libsession/src/main/java/org/session/libsession/messaging/avatars/SystemContactPhoto.java @@ -1,6 +1,5 @@ package org.session.libsession.messaging.avatars; - import android.content.Context; import android.net.Uri; 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 1a0b9f9ef3..a1e3077de7 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 @@ -11,13 +11,10 @@ import java.io.File import java.io.FileInputStream class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long): Job { - override var delegate: JobDelegate? = null override var id: String? = null override var failureCount: Int = 0 - private val MAX_ATTACHMENT_SIZE = 10 * 1024 * 1024 - // Error internal sealed class Error(val description: String) : Exception(description) { object NoAttachment : Error("No such attachment.") @@ -28,17 +25,17 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) companion object { val KEY: String = "AttachmentDownloadJob" - //keys used for database storage purpose + // Keys used for database storage private val KEY_ATTACHMENT_ID = "attachment_id" private val KEY_TS_INCOMING_MESSAGE_ID = "tsIncoming_message_id" } override fun execute() { val handleFailure: (java.lang.Exception) -> Unit = { exception -> - if(exception is Error && exception == Error.NoAttachment) { + if (exception == Error.NoAttachment) { MessagingConfiguration.shared.messageDataProvider.setAttachmentState(AttachmentState.FAILED, attachmentID, databaseMessageID) this.handlePermanentFailure(exception) - } else if (exception is DotNetAPI.Error && exception == DotNetAPI.Error.ParsingFailed) { + } else if (exception == DotNetAPI.Error.ParsingFailed) { // No need to retry if the response is invalid. Most likely this means we (incorrectly) // got a "Cannot GET ..." error from the file server. MessagingConfiguration.shared.messageDataProvider.setAttachmentState(AttachmentState.FAILED, attachmentID, databaseMessageID) @@ -53,9 +50,7 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) messageDataProvider.setAttachmentState(AttachmentState.STARTED, attachmentID, this.databaseMessageID) val tempFile = createTempFile() - FileServerAPI.shared.downloadFile(tempFile, attachment.url, MAX_ATTACHMENT_SIZE, null) - - // DECRYPTION + FileServerAPI.shared.downloadFile(tempFile, attachment.url, null) // Assume we're retrieving an attachment for an open group server if the digest is not set val stream = if (attachment.digest?.size ?: 0 == 0 || attachment.key.isNullOrEmpty()) FileInputStream(tempFile) @@ -89,12 +84,10 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) return file } - //database functions - override fun serialize(): Data { return Data.Builder().putLong(KEY_ATTACHMENT_ID, attachmentID) - .putLong(KEY_TS_INCOMING_MESSAGE_ID, databaseMessageID) - .build(); + .putLong(KEY_TS_INCOMING_MESSAGE_ID, databaseMessageID) + .build(); } override fun getFactoryKey(): String { @@ -102,6 +95,7 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) } class Factory: Job.Factory { + override fun create(data: Data): AttachmentDownloadJob { return AttachmentDownloadJob(data.getLong(KEY_ATTACHMENT_ID), data.getLong(KEY_TS_INCOMING_MESSAGE_ID)) } 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 03c06e6f63..f05a3bcf81 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 @@ -18,7 +18,6 @@ import org.session.libsignal.service.loki.utilities.PlaintextOutputStreamFactory import org.session.libsignal.utilities.logging.Log class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val message: Message, val messageSendJobID: String) : Job { - override var delegate: JobDelegate? = null override var id: String? = null override var failureCount: Int = 0 @@ -34,9 +33,7 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess val TAG = AttachmentUploadJob::class.simpleName val KEY: String = "AttachmentUploadJob" - val maxFailureCount: Int = 20 - - //keys used for database storage purpose + // Keys used for database storage private val KEY_ATTACHMENT_ID = "attachment_id" private val KEY_THREAD_ID = "thread_id" private val KEY_MESSAGE = "message" @@ -46,16 +43,12 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess override fun execute() { try { val attachment = MessagingConfiguration.shared.messageDataProvider.getScaledSignalAttachmentStream(attachmentID) - ?: return handleFailure(Error.NoAttachment) + ?: return handleFailure(Error.NoAttachment) - var server = FileServerAPI.shared.server - var shouldEncrypt = true val usePadding = false val openGroup = MessagingConfiguration.shared.storage.getOpenGroup(threadID) - openGroup?.let { - server = it.server - shouldEncrypt = false - } + val server = if (openGroup != null) openGroup.server else FileServerAPI.shared.server + val shouldEncrypt = (openGroup == null) // Encrypt if this isn't an open group val attachmentKey = Util.getSecretBytes(64) val paddedLength = if (usePadding) PaddingInputStream.getPaddedSize(attachment.length) else attachment.length @@ -67,9 +60,8 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess val uploadResult = FileServerAPI.shared.uploadAttachment(server, attachmentData) handleSuccess(attachment, attachmentKey, uploadResult) - } catch (e: java.lang.Exception) { - if (e is Error && e == Error.NoAttachment) { + if (e == Error.NoAttachment) { this.handlePermanentFailure(e) } else if (e is DotNetAPI.Error && !e.isRetryable) { this.handlePermanentFailure(e) @@ -77,7 +69,6 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess this.handleFailure(e) } } - } private fun handleSuccess(attachment: SignalServiceAttachmentStream, attachmentKey: ByteArray, uploadResult: DotNetAPI.UploadResult) { @@ -97,7 +88,7 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess private fun handleFailure(e: Exception) { Log.w(TAG, "Attachment upload failed due to error: $this.") delegate?.handleJobFailed(this, e) - if (failureCount + 1 == AttachmentUploadJob.maxFailureCount) { + if (failureCount + 1 == maxFailureCount) { failAssociatedMessageSendJob(e) } } @@ -111,10 +102,7 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess } } - //database functions - override fun serialize(): Data { - //serialize Message property val kryo = Kryo() kryo.isRegistrationRequired = false val serializedMessage = ByteArray(4096) @@ -122,10 +110,10 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess kryo.writeObject(output, message) output.close() return Data.Builder().putLong(KEY_ATTACHMENT_ID, attachmentID) - .putString(KEY_THREAD_ID, threadID) - .putByteArray(KEY_MESSAGE, serializedMessage) - .putString(KEY_MESSAGE_SEND_JOB_ID, messageSendJobID) - .build(); + .putString(KEY_THREAD_ID, threadID) + .putByteArray(KEY_MESSAGE, serializedMessage) + .putString(KEY_MESSAGE_SEND_JOB_ID, messageSendJobID) + .build(); } override fun getFactoryKey(): String { @@ -133,9 +121,9 @@ class AttachmentUploadJob(val attachmentID: Long, val threadID: String, val mess } class Factory: Job.Factory { + override fun create(data: Data): AttachmentUploadJob { val serializedMessage = data.getByteArray(KEY_MESSAGE) - //deserialize Message property val kryo = Kryo() val input = Input(serializedMessage) val message: Message = kryo.readObject(input, Message::class.java) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/Data.java b/libsession/src/main/java/org/session/libsession/messaging/jobs/Data.java index 67c142ab3c..310cfed336 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/Data.java +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/Data.java @@ -12,7 +12,6 @@ import org.session.libsession.utilities.ParcelableUtil; import java.util.HashMap; import java.util.Map; -// TODO AC: For now parcelable objects utilize byteArrays field to store their data into. // Introduce a dedicated Map field specifically for parcelable needs. public class Data { diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/Job.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/Job.kt index 101a253b88..4693fddf4a 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/Job.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/Job.kt @@ -8,15 +8,13 @@ interface Job { val maxFailureCount: Int companion object { - //keys used for database storage purpose + // Keys used for database storage private val KEY_ID = "id" private val KEY_FAILURE_COUNT = "failure_count" } fun execute() - //database functions - fun serialize(): Data /** diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobDelegate.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobDelegate.kt index 0efe78fbda..535ea27f3c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobDelegate.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobDelegate.kt @@ -1,6 +1,7 @@ package org.session.libsession.messaging.jobs interface JobDelegate { + fun handleJobSucceeded(job: Job) fun handleJobFailed(job: Job, error: Exception) fun handleJobFailedPermanently(job: Job, error: Exception) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt index d56bdfd9b7..9e8e1374dc 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt @@ -14,19 +14,17 @@ import kotlin.math.min import kotlin.math.pow import kotlin.math.roundToLong - class JobQueue : JobDelegate { private var hasResumedPendingJobs = false // Just for debugging - private val jobTimestampMap = ConcurrentHashMap() - private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher() private val scope = GlobalScope + SupervisorJob() private val queue = Channel(UNLIMITED) + val timer = Timer() init { - // process jobs + // Process jobs scope.launch(dispatcher) { while (isActive) { queue.receive().let { job -> @@ -49,7 +47,7 @@ class JobQueue : JobDelegate { private fun addWithoutExecuting(job: Job) { // When adding multiple jobs in rapid succession, timestamps might not be good enough as a unique ID. To - // deal with this we keep track of the number of jobs with a given timestamp and that to the end of the + // deal with this we keep track of the number of jobs with a given timestamp and add that to the end of the // timestamp to make it a unique ID. We can't use a random number because we do still want to keep track // of the order in which the jobs were added. val currentTime = System.currentTimeMillis() @@ -70,7 +68,7 @@ class JobQueue : JobDelegate { val allPendingJobs = MessagingConfiguration.shared.storage.getAllPendingJobs(type) allPendingJobs.sortedBy { it.id }.forEach { job -> Log.i("Jobs", "Resuming pending job of type: ${job::class.simpleName}.") - queue.offer(job) // offer always called on unlimited capacity + queue.offer(job) // Offer always called on unlimited capacity } } } 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 143394312f..7c527bebbf 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 @@ -7,7 +7,6 @@ import org.session.libsession.messaging.sending_receiving.handle import org.session.libsignal.utilities.logging.Log class MessageReceiveJob(val data: ByteArray, val isBackgroundPoll: Boolean, val openGroupMessageServerID: Long? = null, val openGroupID: String? = null) : Job { - override var delegate: JobDelegate? = null override var id: String? = null override var failureCount: Int = 0 @@ -20,7 +19,7 @@ class MessageReceiveJob(val data: ByteArray, val isBackgroundPoll: Boolean, val private val RECEIVE_LOCK = Object() - //keys used for database storage purpose + // Keys used for database storage private val KEY_DATA = "data" private val KEY_IS_BACKGROUND_POLL = "is_background_poll" private val KEY_OPEN_GROUP_MESSAGE_SERVER_ID = "openGroupMessageServerID" @@ -68,8 +67,6 @@ class MessageReceiveJob(val data: ByteArray, val isBackgroundPoll: Boolean, val delegate?.handleJobFailed(this, e) } - //database functions - override fun serialize(): Data { val builder = Data.Builder().putByteArray(KEY_DATA, data) .putBoolean(KEY_IS_BACKGROUND_POLL, isBackgroundPoll) @@ -83,6 +80,7 @@ class MessageReceiveJob(val data: ByteArray, val isBackgroundPoll: Boolean, val } class Factory: Job.Factory { + override fun create(data: Data): MessageReceiveJob { return MessageReceiveJob(data.getByteArray(KEY_DATA), data.getBoolean(KEY_IS_BACKGROUND_POLL), data.getLong(KEY_OPEN_GROUP_MESSAGE_SERVER_ID), data.getString(KEY_OPEN_GROUP_ID)) } diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt index 1a630b55ae..066ab85b2e 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt @@ -11,7 +11,6 @@ import org.session.libsession.messaging.sending_receiving.MessageSender import org.session.libsignal.utilities.logging.Log class MessageSendJob(val message: Message, val destination: Destination) : Job { - override var delegate: JobDelegate? = null override var id: String? = null override var failureCount: Int = 0 @@ -22,7 +21,7 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { val TAG = MessageSendJob::class.simpleName val KEY: String = "MessageSendJob" - //keys used for database storage purpose + // Keys used for database storage private val KEY_MESSAGE = "message" private val KEY_DESTINATION = "destination" } @@ -77,10 +76,7 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { delegate?.handleJobFailed(this, error) } - //database functions - override fun serialize(): Data { - //serialize Message and Destination properties val kryo = Kryo() kryo.isRegistrationRequired = false val output = Output(ByteArray(4096), -1) // maxBufferSize '-1' will dynamically grow internally if we run out of room serializing the message @@ -92,8 +88,8 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { output.close() val serializedDestination = output.toBytes() return Data.Builder().putByteArray(KEY_MESSAGE, serializedMessage) - .putByteArray(KEY_DESTINATION, serializedDestination) - .build(); + .putByteArray(KEY_DESTINATION, serializedDestination) + .build(); } override fun getFactoryKey(): String { @@ -101,10 +97,10 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { } class Factory: Job.Factory { + override fun create(data: Data): MessageSendJob { val serializedMessage = data.getByteArray(KEY_MESSAGE) val serializedDestination = data.getByteArray(KEY_DESTINATION) - //deserialize Message and Destination properties val kryo = Kryo() var input = Input(serializedMessage) val message = kryo.readClassAndObject(input) as Message diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt index f78425d6e1..fb99f54f56 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt @@ -26,7 +26,7 @@ class NotifyPNServerJob(val message: SnodeMessage) : Job { companion object { val KEY: String = "NotifyPNServerJob" - //keys used for database storage purpose + // Keys used for database storage private val KEY_MESSAGE = "message" } @@ -61,18 +61,14 @@ class NotifyPNServerJob(val message: SnodeMessage) : Job { delegate?.handleJobFailed(this, error) } - //database functions - override fun serialize(): Data { - //serialize SnodeMessage property val kryo = Kryo() kryo.isRegistrationRequired = false val serializedMessage = ByteArray(4096) val output = Output(serializedMessage) kryo.writeObject(output, message) output.close() - return Data.Builder().putByteArray(KEY_MESSAGE, serializedMessage) - .build(); + return Data.Builder().putByteArray(KEY_MESSAGE, serializedMessage).build(); } override fun getFactoryKey(): String { @@ -80,9 +76,9 @@ class NotifyPNServerJob(val message: SnodeMessage) : Job { } class Factory: Job.Factory { + override fun create(data: Data): NotifyPNServerJob { val serializedMessage = data.getByteArray(KEY_MESSAGE) - //deserialize SnodeMessage property val kryo = Kryo() val input = Input(serializedMessage) val message: SnodeMessage = kryo.readObject(input, SnodeMessage::class.java) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobInstantiator.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobInstantiator.kt index ca4be31fdd..bf0a1b2f8a 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobInstantiator.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobInstantiator.kt @@ -1,7 +1,5 @@ package org.session.libsession.messaging.jobs -import java.util.* - class SessionJobInstantiator(private val jobFactories: Map>) { fun instantiate(jobFactoryKey: String, data: Data): Job { diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobManagerFactories.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobManagerFactories.kt index 6ca99c298a..e7c02361e1 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobManagerFactories.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/SessionJobManagerFactories.kt @@ -1,7 +1,5 @@ package org.session.libsession.messaging.jobs -import java.util.* - class SessionJobManagerFactories { companion object { 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 fa6544fc2a..83c223b1ac 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 @@ -28,15 +28,10 @@ class ClosedGroupControlMessage() : ControlMessage() { var kind: Kind? = null - // Kind enum sealed class Kind { class New(var publicKey: ByteString, var name: String, var encryptionKeyPair: ECKeyPair?, var members: List, var admins: List) : Kind() { internal constructor(): this(ByteString.EMPTY, "", null, listOf(), listOf()) } - /// - Note: Deprecated in favor of more explicit group updates. - class Update(var name: String, var members: List) : Kind() { - internal constructor(): this("", listOf()) - } /// An encryption key pair encrypted for each member individually. /// /// - Note: `publicKey` is only set when an encryption key pair is sent in a one-to-one context (i.e. not in a group). @@ -53,18 +48,15 @@ class ClosedGroupControlMessage() : ControlMessage() { internal constructor(): this(listOf()) } class MemberLeft() : Kind() - class EncryptionKeyPairRequest(): Kind() val description: String = when(this) { is New -> "new" - is Update -> "update" is EncryptionKeyPair -> "encryptionKeyPair" is NameChange -> "nameChange" is MembersAdded -> "membersAdded" is MembersRemoved -> "membersRemoved" is MemberLeft -> "memberLeft" - is EncryptionKeyPairRequest -> "encryptionKeyPairRequest" } } @@ -75,12 +67,11 @@ class ClosedGroupControlMessage() : ControlMessage() { if (!proto.hasDataMessage() || !proto.dataMessage.hasClosedGroupControlMessage()) return null val closedGroupControlMessageProto = proto.dataMessage?.closedGroupControlMessage!! val kind: Kind - when(closedGroupControlMessageProto.type) { + when (closedGroupControlMessageProto.type) { DataMessage.ClosedGroupControlMessage.Type.NEW -> { val publicKey = closedGroupControlMessageProto.publicKey ?: return null val name = closedGroupControlMessageProto.name ?: return null val encryptionKeyPairAsProto = closedGroupControlMessageProto.encryptionKeyPair ?: return null - try { val encryptionKeyPair = ECKeyPair(DjbECPublicKey(encryptionKeyPairAsProto.publicKey.toByteArray()), DjbECPrivateKey(encryptionKeyPairAsProto.privateKey.toByteArray())) kind = Kind.New(publicKey, name, encryptionKeyPair, closedGroupControlMessageProto.membersList, closedGroupControlMessageProto.adminsList) @@ -89,10 +80,6 @@ class ClosedGroupControlMessage() : ControlMessage() { return null } } - DataMessage.ClosedGroupControlMessage.Type.UPDATE -> { - val name = closedGroupControlMessageProto.name ?: return null - kind = Kind.Update(name, closedGroupControlMessageProto.membersList) - } DataMessage.ClosedGroupControlMessage.Type.ENCRYPTION_KEY_PAIR -> { val publicKey = closedGroupControlMessageProto.publicKey val wrappers = closedGroupControlMessageProto.wrappersList.mapNotNull { KeyPairWrapper.fromProto(it) } @@ -111,35 +98,28 @@ class ClosedGroupControlMessage() : ControlMessage() { DataMessage.ClosedGroupControlMessage.Type.MEMBER_LEFT -> { kind = Kind.MemberLeft() } - DataMessage.ClosedGroupControlMessage.Type.ENCRYPTION_KEY_PAIR_REQUEST -> { - kind = Kind.EncryptionKeyPairRequest() - } } return ClosedGroupControlMessage(kind) } } - // constructor internal constructor(kind: Kind?) : this() { this.kind = kind } - // validation override fun isValid(): Boolean { if (!super.isValid()) return false val kind = kind ?: return false return when(kind) { is Kind.New -> { !kind.publicKey.isEmpty && kind.name.isNotEmpty() && kind.encryptionKeyPair!!.publicKey != null - && kind.encryptionKeyPair!!.privateKey != null && kind.members.isNotEmpty() && kind.admins.isNotEmpty() + && kind.encryptionKeyPair!!.privateKey != null && kind.members.isNotEmpty() && kind.admins.isNotEmpty() } - is Kind.Update -> kind.name.isNotEmpty() is Kind.EncryptionKeyPair -> true is Kind.NameChange -> kind.name.isNotEmpty() is Kind.MembersAdded -> kind.members.isNotEmpty() is Kind.MembersRemoved -> kind.members.isNotEmpty() is Kind.MemberLeft -> true - is Kind.EncryptionKeyPairRequest -> true } } @@ -163,11 +143,6 @@ class ClosedGroupControlMessage() : ControlMessage() { closedGroupControlMessage.addAllMembers(kind.members) closedGroupControlMessage.addAllAdmins(kind.admins) } - is Kind.Update -> { - closedGroupControlMessage.type = DataMessage.ClosedGroupControlMessage.Type.UPDATE - closedGroupControlMessage.name = kind.name - closedGroupControlMessage.addAllMembers(kind.members) - } is Kind.EncryptionKeyPair -> { closedGroupControlMessage.type = DataMessage.ClosedGroupControlMessage.Type.ENCRYPTION_KEY_PAIR closedGroupControlMessage.publicKey = kind.publicKey @@ -188,9 +163,6 @@ class ClosedGroupControlMessage() : ControlMessage() { is Kind.MemberLeft -> { closedGroupControlMessage.type = DataMessage.ClosedGroupControlMessage.Type.MEMBER_LEFT } - is Kind.EncryptionKeyPairRequest -> { - // TODO: closedGroupControlMessage.type = SignalServiceProtos.ClosedGroupUpdateV2.Type.ENCRYPTION_KEY_PAIR_REQUEST - } } val contentProto = SignalServiceProtos.Content.newBuilder() val dataMessageProto = DataMessage.newBuilder() @@ -199,7 +171,7 @@ class ClosedGroupControlMessage() : ControlMessage() { setGroupContext(dataMessageProto) // Expiration timer // TODO: We * want * expiration timer updates to be explicit. But currently Android will disable the expiration timer for a conversation - // if it receives a message without the current expiration timer value attached to it... + // if it receives a message without the current expiration timer value attached to it... dataMessageProto.expireTimer = Recipient.from(MessagingConfiguration.shared.context, Address.fromSerialized(GroupUtil.doubleEncodeGroupID(recipient!!)), false).expireMessages contentProto.dataMessage = dataMessageProto.build() return contentProto.build() 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 7d0af36477..d18527bfe5 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 @@ -185,14 +185,14 @@ open class DotNetAPI { /** * Blocks the calling thread. */ - fun downloadFile(destination: File, url: String, maxSize: Int, listener: SignalServiceAttachment.ProgressListener?) { + fun downloadFile(destination: File, url: String, listener: SignalServiceAttachment.ProgressListener?) { val outputStream = FileOutputStream(destination) // Throws var remainingAttempts = 4 var exception: Exception? = null while (remainingAttempts > 0) { remainingAttempts -= 1 try { - downloadFile(outputStream, url, maxSize, listener) + downloadFile(outputStream, url, listener) exception = null break } catch (e: Exception) { @@ -205,7 +205,7 @@ open class DotNetAPI { /** * Blocks the calling thread. */ - fun downloadFile(outputStream: OutputStream, url: String, maxSize: Int, listener: SignalServiceAttachment.ProgressListener?) { + fun downloadFile(outputStream: OutputStream, url: String, listener: SignalServiceAttachment.ProgressListener?) { // We need to throw a PushNetworkException or NonSuccessfulResponseCodeException // because the underlying Signal logic requires these to work correctly val oldPrefixedHost = "https://" + HttpUrl.get(url).host() @@ -228,7 +228,7 @@ open class DotNetAPI { throw PushNetworkException("Missing response body.") } val body = Base64.decode(result) - if (body.size > maxSize) { + if (body.size > FileServerAPI.maxFileSize) { Log.d("Loki", "Attachment size limit exceeded.") throw PushNetworkException("Max response size exceeded.") } @@ -239,7 +239,7 @@ open class DotNetAPI { while (bytes >= 0) { outputStream.write(buffer, 0, bytes) count += bytes - if (count > maxSize) { + if (count > FileServerAPI.maxFileSize) { Log.d("Loki", "Attachment size limit exceeded.") throw PushNetworkException("Max response size exceeded.") } diff --git a/libsession/src/main/java/org/session/libsession/utilities/LinkedBlockingLifoQueue.java b/libsession/src/main/java/org/session/libsession/utilities/LinkedBlockingLifoQueue.java index 053b7d4933..993f8334fb 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/LinkedBlockingLifoQueue.java +++ b/libsession/src/main/java/org/session/libsession/utilities/LinkedBlockingLifoQueue.java @@ -1,6 +1,5 @@ package org.session.libsession.utilities; - import java.util.concurrent.LinkedBlockingDeque; public class LinkedBlockingLifoQueue extends LinkedBlockingDeque { diff --git a/libsession/src/main/java/org/session/libsession/utilities/NumberUtil.kt b/libsession/src/main/java/org/session/libsession/utilities/NumberUtil.kt index 61ed56d0fd..6a2b969479 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/NumberUtil.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/NumberUtil.kt @@ -3,7 +3,6 @@ package org.session.libsession.utilities import android.telephony.PhoneNumberUtils import android.util.Patterns - object NumberUtil { private val emailPattern = Patterns.EMAIL_ADDRESS diff --git a/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt b/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt index 081300bc96..2e2bf37de4 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt @@ -14,6 +14,7 @@ class SSKEnvironment( val notificationManager: MessageNotifier, val messageExpirationManager: MessageExpirationManagerProtocol ) { + interface TypingIndicatorsProtocol { fun didReceiveTypingStartedMessage(context: Context, threadId: Long, author: Address, device: Int) fun didReceiveTypingStoppedMessage(context: Context, threadId: Long, author: Address, device: Int, isReplacedByIncomingMessage: Boolean) diff --git a/libsession/src/main/java/org/session/libsession/utilities/concurrent/AssertedSuccessListener.java b/libsession/src/main/java/org/session/libsession/utilities/concurrent/AssertedSuccessListener.java index bda2ecc474..a23a81c412 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/concurrent/AssertedSuccessListener.java +++ b/libsession/src/main/java/org/session/libsession/utilities/concurrent/AssertedSuccessListener.java @@ -5,6 +5,7 @@ import org.session.libsignal.utilities.concurrent.ListenableFuture.Listener; import java.util.concurrent.ExecutionException; public abstract class AssertedSuccessListener implements Listener { + @Override public void onFailure(ExecutionException e) { throw new AssertionError(e); diff --git a/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/DynamicLanguageContextWrapper.java b/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/DynamicLanguageContextWrapper.java index 8350ee4f5f..4c8193bb82 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/DynamicLanguageContextWrapper.java +++ b/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/DynamicLanguageContextWrapper.java @@ -30,5 +30,4 @@ public final class DynamicLanguageContextWrapper { copy.setLocale(locale); return copy; } - } diff --git a/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/LanguageString.java b/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/LanguageString.java index 86860c4a42..7db4244fb7 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/LanguageString.java +++ b/libsession/src/main/java/org/session/libsession/utilities/dynamiclanguage/LanguageString.java @@ -7,8 +7,7 @@ import java.util.Locale; public final class LanguageString { - private LanguageString() { - } + private LanguageString() { } /** * @param languageString String in format language_REGION, e.g. en_US diff --git a/libsession/src/main/java/org/session/libsession/utilities/preferences/ProfileKeyUtil.java b/libsession/src/main/java/org/session/libsession/utilities/preferences/ProfileKeyUtil.java index 990164238c..3f7646c9ea 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/preferences/ProfileKeyUtil.java +++ b/libsession/src/main/java/org/session/libsession/utilities/preferences/ProfileKeyUtil.java @@ -1,6 +1,5 @@ package org.session.libsession.utilities.preferences; - import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.Nullable; diff --git a/libsession/src/main/java/org/session/libsession/utilities/task/SnackbarAsyncTask.java b/libsession/src/main/java/org/session/libsession/utilities/task/SnackbarAsyncTask.java index 3b899c0a2f..6ef5ca2ecb 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/task/SnackbarAsyncTask.java +++ b/libsession/src/main/java/org/session/libsession/utilities/task/SnackbarAsyncTask.java @@ -10,7 +10,6 @@ public abstract class SnackbarAsyncTask extends AsyncTask implements View.OnClickListener { - private final View view; private final String snackbarText; private final String snackbarActionText; diff --git a/libsession/src/main/java/org/session/libsession/utilities/views/Stub.java b/libsession/src/main/java/org/session/libsession/utilities/views/Stub.java index a8ab3866e1..292f051247 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/views/Stub.java +++ b/libsession/src/main/java/org/session/libsession/utilities/views/Stub.java @@ -1,6 +1,5 @@ package org.session.libsession.utilities.views; - import android.view.ViewStub; import androidx.annotation.NonNull;