Refactor MessageDetailsViewModel
parent
7cd2bd0e0d
commit
d6b1440217
@ -0,0 +1,87 @@
|
||||
package org.thoughtcrime.securesms.conversation.v2
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment
|
||||
import org.session.libsession.utilities.Util
|
||||
import org.session.libsession.utilities.recipients.Recipient
|
||||
import org.thoughtcrime.securesms.database.AttachmentDatabase
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord
|
||||
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
|
||||
import org.thoughtcrime.securesms.mms.Slide
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.inject.Inject
|
||||
|
||||
data class TitledText(val title: String, val value: String)
|
||||
|
||||
data class MessageDetails(
|
||||
val attachments: List<Attachment> = emptyList(),
|
||||
val mmsRecord: MmsMessageRecord? = null,
|
||||
val sent: TitledText? = null,
|
||||
val received: TitledText? = null,
|
||||
val error: TitledText? = null,
|
||||
val senderInfo: TitledText? = null,
|
||||
val sender: Recipient? = null
|
||||
)
|
||||
|
||||
data class Attachment(
|
||||
val slide: Slide,
|
||||
val fileDetails: List<TitledText>
|
||||
)
|
||||
|
||||
class MessageDetailsViewModel : ViewModel() {
|
||||
@Inject
|
||||
lateinit var attachmentDb: AttachmentDatabase
|
||||
|
||||
fun setMessageRecord(value: MessageRecord?, error: String?) {
|
||||
val mmsRecord = value as? MmsMessageRecord
|
||||
|
||||
val slides: List<Slide> = mmsRecord?.slideDeck?.thumbnailSlides?.toList() ?: emptyList()
|
||||
|
||||
_details.value = value?.run {
|
||||
MessageDetails(
|
||||
mmsRecord = mmsRecord,
|
||||
attachments = slides.map { Attachment(it, it.details) },
|
||||
sent = dateSent.let(::Date).toString().let { TitledText("Sent:", it) },
|
||||
received = dateReceived.let(::Date).toString().let { TitledText("Received:", it) },
|
||||
error = error?.let { TitledText("Error:", it) },
|
||||
senderInfo = individualRecipient.run {
|
||||
name?.let { TitledText(it, address.serialize()) }
|
||||
},
|
||||
sender = individualRecipient
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private var _details = MutableLiveData(MessageDetails())
|
||||
val details: LiveData<MessageDetails> = _details
|
||||
|
||||
private val Slide.details: List<TitledText>
|
||||
get() = listOfNotNull(
|
||||
fileName.orNull()?.let { TitledText("File Id:", it) },
|
||||
TitledText("File Type:", asAttachment().contentType),
|
||||
TitledText("File Size:", Util.getPrettyFileSize(fileSize)),
|
||||
takeIf { it.hasImage() }
|
||||
.run { asAttachment().run { "${width}x$height" } }
|
||||
.let { TitledText("Resolution:", it) },
|
||||
attachmentDb.duration(this)?.let { TitledText("Duration:", it) },
|
||||
)
|
||||
|
||||
private fun AttachmentDatabase.duration(slide: Slide): String? =
|
||||
slide.takeIf { it.hasAudio() }
|
||||
?.run { asAttachment() as? DatabaseAttachment }
|
||||
?.run {
|
||||
getAttachmentAudioExtras(attachmentId)
|
||||
?.let { audioExtras ->
|
||||
audioExtras.durationMs.takeIf { it > 0 }?.let {
|
||||
String.format(
|
||||
"%01d:%02d",
|
||||
TimeUnit.MILLISECONDS.toMinutes(it),
|
||||
TimeUnit.MILLISECONDS.toSeconds(it) % 60
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue