diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt index 12a76739cf..beb5eb4aa8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt @@ -60,9 +60,9 @@ class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) return databaseAttachment.toSignalAttachmentPointer() } - override fun setAttachmentState(attachmentState: AttachmentState, attachmentId: Long, messageID: Long) { + override fun setAttachmentState(attachmentState: AttachmentState, attachmentId: AttachmentId, messageID: Long) { val attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context) - attachmentDatabase.setTransferState(messageID, AttachmentId(attachmentId, 0), attachmentState.value) + attachmentDatabase.setTransferState(messageID, attachmentId, attachmentState.value) } override fun getMessageForQuote(timestamp: Long, author: Address): Pair? { 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 33018c4c13..553d061650 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 @@ -13,6 +13,9 @@ import androidx.core.view.children import androidx.core.view.isVisible import kotlinx.android.synthetic.main.album_thumbnail_view.view.* import network.loki.messenger.R +import org.session.libsession.messaging.jobs.AttachmentDownloadJob +import org.session.libsession.messaging.jobs.JobQueue +import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment import org.session.libsession.utilities.ViewUtil import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.MediaPreviewActivity @@ -23,6 +26,7 @@ import org.thoughtcrime.securesms.loki.utilities.ActivityDispatcher import org.thoughtcrime.securesms.longmessage.LongMessageActivity import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.mms.Slide +import org.thoughtcrime.securesms.video.exo.AttachmentDataSource import kotlin.math.roundToInt class AlbumThumbnailView : FrameLayout { @@ -82,6 +86,13 @@ class AlbumThumbnailView : FrameLayout { // hit intersects with this particular child val slide = slides.getOrNull(index) ?: return // only open to downloaded images + if (slide.isPendingDownload) { + // restart download here + (slide.asAttachment() as? DatabaseAttachment)?.let { attachment -> + val attachmentId = attachment.attachmentId.rowId + JobQueue.shared.add(AttachmentDownloadJob(attachmentId, mms.getId())) + } + } if (slide.isInProgress) return ActivityDispatcher.get(context)?.dispatchIntent { context -> 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 d432ed0f79..031aea1bad 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 @@ -40,6 +40,7 @@ open class KThumbnailView: FrameLayout { private val image by lazy { thumbnail_image } private val playOverlay by lazy { play_overlay } val loadIndicator: View by lazy { thumbnail_load_indicator } + val downloadIndicator: View by lazy { thumbnail_download_icon } private val dimensDelegate = ThumbnailDimensDelegate() @@ -108,7 +109,8 @@ open class KThumbnailView: FrameLayout { this.slide = slide - loadIndicator.isVisible = slide.isInProgress && !mms.isFailed + loadIndicator.isVisible = slide.isInProgress && !slide.isPendingDownload + downloadIndicator.isVisible = slide.isPendingDownload dimensDelegate.setDimens(naturalWidth, naturalHeight) invalidate() diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionContactDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionContactDatabase.kt index 7d5e93b502..5ccb58df92 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionContactDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SessionContactDatabase.kt @@ -47,6 +47,14 @@ class SessionContactDatabase(context: Context, helper: SQLCipherOpenHelper) : Da }.toSet() } + fun setContactIsTrusted(contact: Contact, isTrusted: Boolean) { + val database = databaseHelper.writableDatabase + val contentValues = ContentValues(1) + contentValues.put(Companion.isTrusted, if (isTrusted) 1 else 0) + database.insertOrUpdate(sessionContactTable, contentValues, "$sessionID = ?", arrayOf( contact.sessionID )) + notifyConversationListListeners() + } + fun setContact(contact: Contact) { val database = databaseHelper.writableDatabase val contentValues = ContentValues(8) diff --git a/app/src/main/res/layout/thumbnail_view.xml b/app/src/main/res/layout/thumbnail_view.xml index 8922112823..eaa98cce65 100644 --- a/app/src/main/res/layout/thumbnail_view.xml +++ b/app/src/main/res/layout/thumbnail_view.xml @@ -22,6 +22,15 @@ android:visibility="gone" tools:visibility="visible" /> + + + android:visibility="gone"> Unit = { exception -> + val handleFailure: (java.lang.Exception, attachmentId: AttachmentId?) -> Unit = { exception, attachment -> if (exception == Error.NoAttachment || (exception is OnionRequestAPI.HTTPRequestFailedAtDestinationException && exception.statusCode == 400)) { - messageDataProvider.setAttachmentState(AttachmentState.FAILED, attachmentID, databaseMessageID) + attachment?.let { id -> + messageDataProvider.setAttachmentState(AttachmentState.FAILED, id, databaseMessageID) + } ?: run { + messageDataProvider.setAttachmentState(AttachmentState.FAILED, AttachmentId(attachmentID,0), databaseMessageID) + } this.handlePermanentFailure(exception) } else { this.handleFailure(exception) @@ -53,8 +58,8 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) var tempFile: File? = null try { val attachment = messageDataProvider.getDatabaseAttachment(attachmentID) - ?: return handleFailure(Error.NoAttachment) - messageDataProvider.setAttachmentState(AttachmentState.STARTED, attachmentID, this.databaseMessageID) + ?: return handleFailure(Error.NoAttachment, null) + messageDataProvider.setAttachmentState(AttachmentState.STARTED, attachment.attachmentId, this.databaseMessageID) tempFile = createTempFile() val threadID = storage.getThreadIdForMms(databaseMessageID) val openGroupV2 = storage.getV2OpenGroup(threadID) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index cfbd5605bd..6c11a23415 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -221,10 +221,17 @@ fun MessageReceiver.handleVisibleMessage(message: VisibleMessage, proto: SignalS val messageID = storage.persist(message, quoteModel, linkPreviews, message.groupPublicKey, openGroupID, attachments) ?: throw MessageReceiver.Error.DuplicateMessage // Parse & persist attachments // Start attachment downloads if needed + val contact = message.sender?.let { address -> storage.getContactWithSessionID(address) } storage.getAttachmentsForMessage(messageID).forEach { attachment -> attachment.attachmentId?.let { id -> - val downloadJob = AttachmentDownloadJob(id.rowId, messageID) - JobQueue.shared.add(downloadJob) + // if open group or self-send, then always download attachment + val immediatelyDownload = !openGroupID.isNullOrEmpty() // open group + || userPublicKey == message.sender // self-send + || contact?.isTrusted == true // trusted contact + if (immediatelyDownload) { + val downloadJob = AttachmentDownloadJob(id.rowId, messageID) + JobQueue.shared.add(downloadJob) + } } } val openGroupServerID = message.openGroupServerMessageID