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 468aae89ee..c1fe16fcd8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt @@ -2,27 +2,35 @@ package org.thoughtcrime.securesms.attachments import android.content.Context import com.google.protobuf.ByteString -import org.session.libsession.database.dto.DatabaseAttachmentDTO import org.session.libsession.database.MessageDataProvider import org.session.libsession.database.dto.AttachmentState -import org.session.libsignal.service.internal.push.SignalServiceProtos +import org.session.libsession.messaging.sending_receiving.attachments.SessionServiceAttachmentPointer +import org.session.libsession.messaging.sending_receiving.attachments.SessionServiceAttachmentStream +import org.session.libsignal.libsignal.util.guava.Optional import org.thoughtcrime.securesms.database.Database import org.thoughtcrime.securesms.database.DatabaseFactory -import org.thoughtcrime.securesms.database.SmsDatabase import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper import org.thoughtcrime.securesms.jobs.AttachmentUploadJob +import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.util.MediaUtil class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), MessageDataProvider { - override fun getAttachment(attachmentId: Long): DatabaseAttachmentDTO? { + + override fun getAttachmentStream(attachmentId: Long): SessionServiceAttachmentStream? { val attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context) val databaseAttachment = attachmentDatabase.getAttachment(AttachmentId(attachmentId, 0)) ?: return null - return databaseAttachment.toDTO() + return databaseAttachment.toAttachmentStream(context) } - override fun setAttachmentState(attachmentState: AttachmentState, attachment: DatabaseAttachmentDTO, messageID: Long) { + override fun getAttachmentPointer(attachmentId: Long): SessionServiceAttachmentPointer? { val attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context) - attachmentDatabase.setTransferState(messageID, AttachmentId(attachment.attachmentId, 0), attachmentState.value) + val databaseAttachment = attachmentDatabase.getAttachment(AttachmentId(attachmentId, 0)) ?: return null + return databaseAttachment.toAttachmentPointer() + } + + override fun setAttachmentState(attachmentState: AttachmentState, attachmentId: Long, messageID: Long) { + val attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context) + attachmentDatabase.setTransferState(messageID, AttachmentId(attachmentId, 0), attachmentState.value) } @Throws(Exception::class) @@ -38,29 +46,26 @@ class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) } -// Extension to DatabaseAttachment class +fun DatabaseAttachment.toAttachmentPointer(): SessionServiceAttachmentPointer { + return SessionServiceAttachmentPointer(attachmentId.rowId, contentType, key?.toByteArray(), Optional.fromNullable(size.toInt()), Optional.absent(), width, height, Optional.fromNullable(digest), Optional.fromNullable(fileName), isVoiceNote, Optional.fromNullable(caption), url) +} -fun DatabaseAttachment.toDTO(): DatabaseAttachmentDTO { - var databaseAttachmentDTO = DatabaseAttachmentDTO() - databaseAttachmentDTO.attachmentId = this.attachmentId.rowId - databaseAttachmentDTO.contentType = this.contentType - databaseAttachmentDTO.fileName = this.fileName - databaseAttachmentDTO.caption = this.caption +fun DatabaseAttachment.toAttachmentStream(context: Context): SessionServiceAttachmentStream { + val stream = PartAuthority.getAttachmentStream(context, this.dataUri!!) + var attachmentStream = SessionServiceAttachmentStream(stream, this.contentType, this.size, Optional.fromNullable(this.fileName), this.isVoiceNote, Optional.absent(), this.width, this.height, Optional.fromNullable(this.caption), null) + attachmentStream.attachmentId = this.attachmentId.rowId + attachmentStream.isAudio = MediaUtil.isAudio(this) + attachmentStream.isGif = MediaUtil.isGif(this) + attachmentStream.isVideo = MediaUtil.isVideo(this) + attachmentStream.isImage = MediaUtil.isImage(this) - databaseAttachmentDTO.size = this.size.toInt() - databaseAttachmentDTO.key = ByteString.copyFrom(this.key?.toByteArray()) - databaseAttachmentDTO.digest = ByteString.copyFrom(this.digest) - databaseAttachmentDTO.flags = if (this.isVoiceNote) SignalServiceProtos.AttachmentPointer.Flags.VOICE_MESSAGE.number else 0 + attachmentStream.key = ByteString.copyFrom(this.key?.toByteArray()) + attachmentStream.digest = this.digest + //attachmentStream.flags = if (this.isVoiceNote) SignalServiceProtos.AttachmentPointer.Flags.VOICE_MESSAGE.number else 0 - databaseAttachmentDTO.url = this.url + attachmentStream.url = this.url - if (this.shouldHaveImageSize()) { - databaseAttachmentDTO.shouldHaveImageSize = true - databaseAttachmentDTO.width = this.width - databaseAttachmentDTO.height = this.height - } - - return databaseAttachmentDTO + return attachmentStream } fun DatabaseAttachment.shouldHaveImageSize(): Boolean { 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 fc232cfda0..f2efdb6be6 100644 --- a/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt +++ b/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt @@ -1,14 +1,18 @@ package org.session.libsession.database -import org.session.libsession.database.dto.AttachmentState -import org.session.libsession.database.dto.DatabaseAttachmentDTO -import org.session.libsession.messaging.messages.visible.Attachment +import org.session.libsession.messaging.sending_receiving.attachments.AttachmentState +import org.session.libsession.messaging.sending_receiving.attachments.SessionServiceAttachmentPointer +import org.session.libsession.messaging.sending_receiving.attachments.SessionServiceAttachmentStream interface MessageDataProvider { - fun getAttachment(attachmentId: Long): DatabaseAttachmentDTO? + //fun getAttachment(attachmentId: Long): SignalServiceAttachmentStream? - fun setAttachmentState(attachmentState: AttachmentState, attachment: DatabaseAttachmentDTO, messageID: Long) + fun getAttachmentStream(attachmentId: Long): SessionServiceAttachmentStream? + + fun getAttachmentPointer(attachmentId: Long): SessionServiceAttachmentPointer? + + fun setAttachmentState(attachmentState: AttachmentState, attachmentId: Long, messageID: Long) fun isOutgoingMessage(timestamp: Long): Boolean 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 5d707d5e93..ff12856545 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 @@ -27,7 +27,7 @@ class MessageSendJob(val message: Message, val destination: Destination) : Job { val message = message as? VisibleMessage message?.let { if(!messageDataProvider.isOutgoingMessage(message.sentTimestamp!!)) return // The message has been deleted - val attachments = message.attachmentIDs.map { messageDataProvider.getAttachment(it) }.filterNotNull() + val attachments = message.attachmentIDs.map { messageDataProvider.getAttachmentStream(it) }.filterNotNull() val attachmentsToUpload = attachments.filter { !it.isUploaded } attachmentsToUpload.forEach { if(MessagingConfiguration.shared.storage.getAttachmentUploadJob(it.attachmentId) != null) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/LinkPreview.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/LinkPreview.kt index 3999148dff..19f9b69a10 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/LinkPreview.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/LinkPreview.kt @@ -44,7 +44,7 @@ class LinkPreview() { title?.let { linkPreviewProto.title = title } val attachmentID = attachmentID attachmentID?.let { - val attachmentProto = MessagingConfiguration.shared.messageDataProvider.getAttachment(attachmentID) + val attachmentProto = MessagingConfiguration.shared.messageDataProvider.getAttachmentStream(attachmentID) attachmentProto?.let { linkPreviewProto.image = attachmentProto.toProto() } } // Build diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/Quote.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/Quote.kt index ed6dbb29ea..178d715f66 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/Quote.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/Quote.kt @@ -60,7 +60,7 @@ class Quote() { private fun addAttachmentsIfNeeded(quoteProto: SignalServiceProtos.DataMessage.Quote.Builder, messageDataProvider: MessageDataProvider) { val attachmentID = attachmentID ?: return - val attachmentProto = messageDataProvider.getAttachment(attachmentID) + val attachmentProto = messageDataProvider.getAttachmentStream(attachmentID) if (attachmentProto == null) { Log.w(TAG, "Ignoring invalid attachment for quoted message.") return @@ -74,7 +74,7 @@ class Quote() { } val quotedAttachmentProto = SignalServiceProtos.DataMessage.Quote.QuotedAttachment.newBuilder() quotedAttachmentProto.contentType = attachmentProto.contentType - val fileName = attachmentProto.fileName + val fileName = attachmentProto.fileName?.get() fileName?.let { quotedAttachmentProto.fileName = fileName } quotedAttachmentProto.thumbnail = attachmentProto.toProto() try { diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt index b761eb2846..781c62399a 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt @@ -90,7 +90,7 @@ class VisibleMessage : Message() { } } //Attachments - val attachments = attachmentIDs.mapNotNull { MessagingConfiguration.shared.messageDataProvider.getAttachment(it) } + val attachments = attachmentIDs.mapNotNull { MessagingConfiguration.shared.messageDataProvider.getAttachmentStream(it) } if (!attachments.all { it.isUploaded }) { if (BuildConfig.DEBUG) { //TODO equivalent to iOS's preconditionFailure