From 758475f0dc8444817c4ff7084af09cd26e3f995a Mon Sep 17 00:00:00 2001 From: jubb Date: Thu, 1 Jul 2021 11:06:11 +1000 Subject: [PATCH 1/3] fix: R.color.destructive on the error drawable in conversation and home adapter and handling message re-sending --- .../conversation/v2/ConversationActivityV2.kt | 54 +++++++++++++++++-- .../v2/messages/VisibleMessageView.kt | 23 ++++---- .../securesms/database/Storage.kt | 14 +++++ .../securesms/loki/views/ConversationView.kt | 7 ++- .../libsession/database/StorageProtocol.kt | 1 + .../messaging/jobs/MessageSendJob.kt | 9 +++- 6 files changed, 91 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index afe28b15ae..3065ca13cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -3,15 +3,14 @@ package org.thoughtcrime.securesms.conversation.v2 import android.Manifest import android.animation.FloatEvaluator import android.animation.ValueAnimator -import android.content.Context import android.content.ClipData import android.content.ClipboardManager +import android.content.Context import android.content.Intent import android.content.res.Resources import android.database.Cursor import android.graphics.Rect import android.graphics.Typeface -import android.os.Bundle import android.net.Uri import android.os.* import android.text.TextUtils @@ -47,13 +46,17 @@ import org.session.libsession.messaging.mentions.MentionsManager import org.session.libsession.messaging.messages.control.DataExtractionNotification import org.session.libsession.messaging.messages.signal.OutgoingMediaMessage import org.session.libsession.messaging.messages.signal.OutgoingTextMessage +import org.session.libsession.messaging.messages.visible.LinkPreview.Companion.from import org.session.libsession.messaging.messages.visible.OpenGroupInvitation +import org.session.libsession.messaging.messages.visible.Quote.Companion.from import org.session.libsession.messaging.messages.visible.VisibleMessage import org.session.libsession.messaging.open_groups.OpenGroupAPIV2 import org.session.libsession.messaging.sending_receiving.MessageSender import org.session.libsession.messaging.sending_receiving.attachments.Attachment import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel +import org.session.libsession.messaging.utilities.UpdateMessageData +import org.session.libsession.messaging.utilities.UpdateMessageData.Companion.fromJSON import org.session.libsession.utilities.Address.Companion.fromSerialized import org.session.libsession.utilities.MediaTypes import org.session.libsession.utilities.TextSecurePreferences @@ -84,11 +87,11 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel.LinkPreviewState -import org.thoughtcrime.securesms.loki.utilities.ActivityDispatcher -import org.thoughtcrime.securesms.loki.utilities.push import org.thoughtcrime.securesms.loki.activities.SelectContactsActivity import org.thoughtcrime.securesms.loki.activities.SelectContactsActivity.Companion.selectedContactsKey +import org.thoughtcrime.securesms.loki.utilities.ActivityDispatcher import org.thoughtcrime.securesms.loki.utilities.MentionUtilities +import org.thoughtcrime.securesms.loki.utilities.push import org.thoughtcrime.securesms.loki.utilities.toPx import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendActivity @@ -1034,7 +1037,48 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } override fun resendMessage(messages: Set) { - // TODO: Implement + messages.forEach { messageRecord -> + val recipient: Recipient = messageRecord.recipient + val message = VisibleMessage() + message.id = messageRecord.getId() + if (messageRecord.isOpenGroupInvitation) { + val openGroupInvitation = OpenGroupInvitation() + fromJSON(messageRecord.body)?.let { updateMessageData -> + val kind = updateMessageData.kind + if (kind is UpdateMessageData.Kind.OpenGroupInvitation) { + openGroupInvitation.name = kind.groupName + openGroupInvitation.url = kind.groupUrl + } + } + message.openGroupInvitation = openGroupInvitation + } else { + message.text = messageRecord.body + } + message.sentTimestamp = messageRecord.timestamp + if (recipient.isGroupRecipient) { + message.groupPublicKey = recipient.address.toGroupString() + } else { + message.recipient = messageRecord.recipient.address.serialize() + } + message.threadID = messageRecord.threadId + if (messageRecord.isMms) { + val mmsMessageRecord = messageRecord as MmsMessageRecord + if (mmsMessageRecord.linkPreviews.isNotEmpty()) { + message.linkPreview = from(mmsMessageRecord.linkPreviews[0]) + } + if (mmsMessageRecord.quote != null) { + message.quote = from(mmsMessageRecord.quote!!.quoteModel) + } + message.addSignalAttachments(mmsMessageRecord.slideDeck.asAttachments()) + } + val sentTimestamp = message.sentTimestamp + val sender = MessagingModuleConfiguration.shared.storage.getUserPublicKey() + if (sentTimestamp != null && sender != null) { + MessagingModuleConfiguration.shared.storage.markAsSending(sentTimestamp, sender) + } + MessageSender.send(message, recipient.address) + } + endActionMode() } override fun saveAttachment(messages: Set) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index ad74e47a61..356a9e2fbb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -14,7 +14,6 @@ import android.widget.LinearLayout import androidx.core.content.ContextCompat import androidx.core.view.isVisible import kotlinx.android.synthetic.main.view_visible_message.view.* -import kotlinx.android.synthetic.main.view_visible_message.view.profilePictureView import network.loki.messenger.R import org.session.libsession.messaging.contacts.Contact.ContactContext import org.session.libsession.messaging.open_groups.OpenGroupAPIV2 @@ -124,9 +123,13 @@ class VisibleMessageView : LinearLayout { val gravity = if (message.isOutgoing) Gravity.RIGHT else Gravity.LEFT mainContainer.gravity = gravity or Gravity.BOTTOM // Message status indicator - val iconID = getMessageStatusImage(message) + val (iconID, iconColor) = getMessageStatusImage(message) if (iconID != null) { - messageStatusImageView.setImageResource(iconID) + val drawable = ContextCompat.getDrawable(context, iconID)?.mutate() + if (iconColor != null) { + drawable?.setTint(iconColor) + } + messageStatusImageView.setImageDrawable(drawable) } if (message.isOutgoing) { val lastMessageID = DatabaseFactory.getMmsSmsDatabase(context).getLastMessageID(message.threadId) @@ -169,13 +172,13 @@ class VisibleMessageView : LinearLayout { } } - private fun getMessageStatusImage(message: MessageRecord): Int? { - when { - !message.isOutgoing -> return null - message.isFailed -> return R.drawable.ic_error - message.isPending -> return R.drawable.ic_circle_dot_dot_dot - message.isRead -> return R.drawable.ic_filled_circle_check - else -> return R.drawable.ic_circle_check + private fun getMessageStatusImage(message: MessageRecord): Pair { + return when { + !message.isOutgoing -> null to null + message.isFailed -> R.drawable.ic_error to resources.getColor(R.color.destructive, context.theme) + message.isPending -> R.drawable.ic_circle_dot_dot_dot to null + message.isRead -> R.drawable.ic_filled_circle_check to null + else -> R.drawable.ic_circle_check to null } } 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 1c67eac4e3..75db53493b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -28,6 +28,7 @@ import org.session.libsignal.utilities.KeyHelper import org.session.libsignal.utilities.guava.Optional import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper +import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob import org.thoughtcrime.securesms.loki.api.OpenGroupManager import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase @@ -304,6 +305,19 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, } } + override fun markAsSending(timestamp: Long, author: String) { + val database = DatabaseFactory.getMmsSmsDatabase(context) + val messageRecord = database.getMessageFor(timestamp, author) ?: return + if (messageRecord.isMms) { + val mmsDatabase = DatabaseFactory.getMmsDatabase(context) + mmsDatabase.markAsSending(messageRecord.getId()) + } else { + val smsDatabase = DatabaseFactory.getSmsDatabase(context) + smsDatabase.markAsSending(messageRecord.getId()) + messageRecord.isPending + } + } + override fun markUnidentified(timestamp: Long, author: String) { val database = DatabaseFactory.getMmsSmsDatabase(context) val messageRecord = database.getMessageFor(timestamp, author) ?: return diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt index cff2096de7..893c73019e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt @@ -8,6 +8,7 @@ import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.view_conversation.view.* @@ -73,7 +74,11 @@ class ConversationView : LinearLayout { statusIndicatorImageView.visibility = View.VISIBLE when { !thread.isOutgoing -> statusIndicatorImageView.visibility = View.GONE - thread.isFailed -> statusIndicatorImageView.setImageResource(R.drawable.ic_error) + thread.isFailed -> { + val drawable = ContextCompat.getDrawable(context, R.drawable.ic_error)?.mutate() + drawable?.setTint(ContextCompat.getColor(context,R.color.destructive)) + statusIndicatorImageView.setImageDrawable(drawable) + } thread.isPending -> statusIndicatorImageView.setImageResource(R.drawable.ic_circle_dot_dot_dot) thread.isRead -> statusIndicatorImageView.setImageResource(R.drawable.ic_filled_circle_check) else -> statusIndicatorImageView.setImageResource(R.drawable.ic_circle_check) diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index 94a19ff072..8a21e61513 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -89,6 +89,7 @@ interface StorageProtocol { fun persistAttachments(messageID: Long, attachments: List): List fun getAttachmentsForMessage(messageID: Long): List fun getMessageIdInDatabase(timestamp: Long, author: String): Long? // TODO: This is a weird name + fun markAsSending(timestamp: Long, author: String) fun markAsSent(timestamp: Long, author: String) fun markUnidentified(timestamp: Long, author: String) fun setErrorMessage(timestamp: Long, author: String, error: Exception) 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 87fead7c58..b4b04c9ed3 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 @@ -3,6 +3,8 @@ package org.session.libsession.messaging.jobs import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Output +import nl.komponents.kovenant.FailedException +import nl.komponents.kovenant.Promise import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.jobs.Job.Companion.MAX_BUFFER_SIZE import org.session.libsession.messaging.messages.Destination @@ -55,7 +57,7 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { return } // Wait for all attachments to upload before continuing } - MessageSender.send(this.message, this.destination).success { + val promise = MessageSender.send(this.message, this.destination).success { this.handleSuccess() }.fail { exception -> Log.e(TAG, "Couldn't send message due to error: $exception.") @@ -64,6 +66,11 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { } this.handleFailure(exception) } + try { + promise.get() + } catch (e: Exception) { + Log.d(TAG, "Promise failed to resolve successfully", e) + } } private fun handleSuccess() { From ab876ca9b84301cd72bc953a42996c78d8d70aa5 Mon Sep 17 00:00:00 2001 From: jubb Date: Thu, 1 Jul 2021 11:20:31 +1000 Subject: [PATCH 2/3] fix: MessageSendJob.kt sets message as sending before calling send so conversation adapter doesn't display as error / let users retry while send job is pending --- .../securesms/conversation/v2/ConversationActivityV2.kt | 5 ----- .../session/libsession/messaging/jobs/MessageSendJob.kt | 8 +++++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index e2abbff332..1c47e99355 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1182,11 +1182,6 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } message.addSignalAttachments(mmsMessageRecord.slideDeck.asAttachments()) } - val sentTimestamp = message.sentTimestamp - val sender = MessagingModuleConfiguration.shared.storage.getUserPublicKey() - if (sentTimestamp != null && sender != null) { - MessagingModuleConfiguration.shared.storage.markAsSending(sentTimestamp, sender) - } MessageSender.send(message, recipient.address) } endActionMode() 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 b4b04c9ed3..cd19d7f8ca 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 @@ -36,6 +36,7 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { override fun execute() { val messageDataProvider = MessagingModuleConfiguration.shared.messageDataProvider val message = message as? VisibleMessage + val storage = MessagingModuleConfiguration.shared.storage if (message != null) { if (!messageDataProvider.isOutgoingMessage(message.sentTimestamp!!)) return // The message has been deleted val attachmentIDs = mutableListOf() @@ -45,7 +46,7 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { val attachments = attachmentIDs.mapNotNull { messageDataProvider.getDatabaseAttachment(it) } val attachmentsToUpload = attachments.filter { it.url.isNullOrEmpty() } attachmentsToUpload.forEach { - if (MessagingModuleConfiguration.shared.storage.getAttachmentUploadJob(it.attachmentId.rowId) != null) { + if (storage.getAttachmentUploadJob(it.attachmentId.rowId) != null) { // Wait for it to finish } else { val job = AttachmentUploadJob(it.attachmentId.rowId, message.threadID!!.toString(), message, id!!) @@ -57,6 +58,11 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { return } // Wait for all attachments to upload before continuing } + val sentTimestamp = this.message.sentTimestamp + val sender = storage.getUserPublicKey() + if (sentTimestamp != null && sender != null) { + storage.markAsSending(sentTimestamp, sender) + } val promise = MessageSender.send(this.message, this.destination).success { this.handleSuccess() }.fail { exception -> From d98f34fa7390ae9560e2d23d24b714456a339629 Mon Sep 17 00:00:00 2001 From: jubb Date: Thu, 1 Jul 2021 11:39:18 +1000 Subject: [PATCH 3/3] fix: only show loader if the message isn't failed, fix attachment upload and message send pending states in the conversation --- .../securesms/components/AlbumThumbnailView.java | 4 ---- .../conversation/v2/ConversationActivityV2.kt | 5 +++++ .../conversation/v2/components/AlbumThumbnailView.kt | 2 +- .../conversation/v2/messages/LinkPreviewView.kt | 2 +- .../conversation/v2/utilities/KThumbnailView.kt | 12 +++++------- .../libsession/messaging/jobs/AttachmentUploadJob.kt | 2 +- .../libsession/messaging/jobs/MessageSendJob.kt | 12 +++++++----- 7 files changed, 20 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java index bda4159c9a..fde2cd6b52 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java @@ -149,9 +149,5 @@ public class AlbumThumbnailView extends FrameLayout { } private void setSlide(@NonNull GlideRequests glideRequests, @NonNull Slide slide, @IdRes int id) { - KThumbnailView cell = findViewById(id); - cell.setImageResource(glideRequests, slide, false); - cell.setThumbnailClickListener(defaultThumbnailClickListener); - cell.setOnLongClickListener(defaultLongClickListener); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 1c47e99355..e2abbff332 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1182,6 +1182,11 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } message.addSignalAttachments(mmsMessageRecord.slideDeck.asAttachments()) } + val sentTimestamp = message.sentTimestamp + val sender = MessagingModuleConfiguration.shared.storage.getUserPublicKey() + if (sentTimestamp != null && sender != null) { + MessagingModuleConfiguration.shared.storage.markAsSending(sentTimestamp, sender) + } MessageSender.send(message, recipient.address) } endActionMode() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/components/AlbumThumbnailView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/components/AlbumThumbnailView.kt index e0326723a9..33018c4c13 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/components/AlbumThumbnailView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/components/AlbumThumbnailView.kt @@ -115,7 +115,7 @@ class AlbumThumbnailView : FrameLayout { // iterate binding slides.take(5).forEachIndexed { position, slide -> val thumbnailView = getThumbnailView(position) - thumbnailView.setImageResource(glideRequests, slide, isPreview = false) + thumbnailView.setImageResource(glideRequests, slide, isPreview = false, mms = message) } albumCellBodyParent.isVisible = message.body.isNotEmpty() albumCellBodyText.text = message.body diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt index 8f0e61b381..f684152482 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt @@ -48,7 +48,7 @@ class LinkPreviewView : LinearLayout { // Thumbnail if (linkPreview.getThumbnail().isPresent) { // This internally fetches the thumbnail - thumbnailImageView.setImageResource(glide, ImageSlide(context, linkPreview.getThumbnail().get()), isPreview = false) + thumbnailImageView.setImageResource(glide, ImageSlide(context, linkPreview.getThumbnail().get()), isPreview = false, message) thumbnailImageView.loadIndicator.isVisible = false } // Title diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt index 89045be665..d432ed0f79 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt @@ -21,9 +21,9 @@ import org.session.libsignal.utilities.ListenableFuture import org.session.libsignal.utilities.SettableFuture import org.thoughtcrime.securesms.components.GlideBitmapListeningTarget import org.thoughtcrime.securesms.components.GlideDrawableListeningTarget +import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.mms.* import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri -import org.thoughtcrime.securesms.util.MediaUtil open class KThumbnailView: FrameLayout { @@ -43,8 +43,6 @@ open class KThumbnailView: FrameLayout { private val dimensDelegate = ThumbnailDimensDelegate() - var thumbnailClickListener: SlideClickListener? = null - private var slide: Slide? = null private var radius: Int = 0 @@ -84,13 +82,13 @@ open class KThumbnailView: FrameLayout { // endregion // region Interaction - fun setImageResource(glide: GlideRequests, slide: Slide, isPreview: Boolean): ListenableFuture { - return setImageResource(glide, slide, isPreview, 0, 0) + fun setImageResource(glide: GlideRequests, slide: Slide, isPreview: Boolean, mms: MmsMessageRecord): ListenableFuture { + return setImageResource(glide, slide, isPreview, 0, 0, mms) } fun setImageResource(glide: GlideRequests, slide: Slide, isPreview: Boolean, naturalWidth: Int, - naturalHeight: Int): ListenableFuture { + naturalHeight: Int, mms: MmsMessageRecord): ListenableFuture { val currentSlide = this.slide @@ -110,7 +108,7 @@ open class KThumbnailView: FrameLayout { this.slide = slide - loadIndicator.isVisible = slide.isInProgress + loadIndicator.isVisible = slide.isInProgress && !mms.isFailed dimensDelegate.setDimens(naturalWidth, naturalHeight) invalidate() 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 4f7e7ea57c..e4cc76974f 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 @@ -122,7 +122,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 == maxFailureCount) { + if (failureCount + 1 >= maxFailureCount) { failAssociatedMessageSendJob(e) } } 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 cd19d7f8ca..274f11c3e3 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 @@ -37,6 +37,13 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { val messageDataProvider = MessagingModuleConfiguration.shared.messageDataProvider val message = message as? VisibleMessage val storage = MessagingModuleConfiguration.shared.storage + + val sentTimestamp = this.message.sentTimestamp + val sender = storage.getUserPublicKey() + if (sentTimestamp != null && sender != null) { + storage.markAsSending(sentTimestamp, sender) + } + if (message != null) { if (!messageDataProvider.isOutgoingMessage(message.sentTimestamp!!)) return // The message has been deleted val attachmentIDs = mutableListOf() @@ -58,11 +65,6 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { return } // Wait for all attachments to upload before continuing } - val sentTimestamp = this.message.sentTimestamp - val sender = storage.getUserPublicKey() - if (sentTimestamp != null && sender != null) { - storage.markAsSending(sentTimestamp, sender) - } val promise = MessageSender.send(this.message, this.destination).success { this.handleSuccess() }.fail { exception ->