Signal-Android/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesViewModel.kt

72 wiersze
3.0 KiB
Kotlin

package org.thoughtcrime.securesms.conversation.quotes
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.schedulers.Schedulers
import org.thoughtcrime.securesms.conversation.ConversationMessage
import org.thoughtcrime.securesms.conversation.colors.GroupAuthorNameColorHelper
import org.thoughtcrime.securesms.conversation.colors.NameColor
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.model.MessageId
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
class MessageQuotesViewModel(
application: Application,
private val messageId: MessageId,
private val conversationRecipientId: RecipientId
) : AndroidViewModel(application) {
private val groupAuthorNameColorHelper = GroupAuthorNameColorHelper()
fun getMessages(): Observable<List<ConversationMessage>> {
return Observable.create<List<ConversationMessage>> { emitter ->
val quotes: List<ConversationMessage> = SignalDatabase
.mmsSms
.getAllMessagesThatQuote(messageId)
.map { ConversationMessage.ConversationMessageFactory.createWithUnresolvedData(getApplication(), it) }
val originalRecord: MessageRecord? = if (messageId.mms) {
SignalDatabase.mms.getMessageRecordOrNull(messageId.id)
} else {
SignalDatabase.sms.getMessageRecordOrNull(messageId.id)
}
if (originalRecord != null) {
val originalMessage: ConversationMessage = ConversationMessage.ConversationMessageFactory.createWithUnresolvedData(getApplication(), originalRecord, originalRecord.getDisplayBody(getApplication()), 0)
emitter.onNext(quotes + listOf(originalMessage))
} else {
emitter.onNext(quotes)
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
fun getNameColorsMap(): Observable<Map<RecipientId, NameColor>> {
return Observable.just(conversationRecipientId)
.map { conversationRecipientId ->
val conversationRecipient = Recipient.resolved(conversationRecipientId)
if (conversationRecipient.groupId.isPresent) {
groupAuthorNameColorHelper.getColorMap(conversationRecipient.groupId.get())
} else {
emptyMap()
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
class Factory(private val application: Application, private val messageId: MessageId, private val conversationRecipientId: RecipientId) : ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return modelClass.cast(MessageQuotesViewModel(application, messageId, conversationRecipientId)) as T
}
}
}