Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/ParcelableMessageConversati...

138 lines
5.2 KiB
Kotlin

package org.mariotaku.twidere.extension.model
import android.content.Context
import org.mariotaku.ktextension.mapToArray
import org.mariotaku.twidere.R
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableMessage
import org.mariotaku.twidere.model.ParcelableMessageConversation
import org.mariotaku.twidere.model.ParcelableMessageConversation.ConversationType
import org.mariotaku.twidere.model.ParcelableMessageConversation.ExtrasType
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.conversation.DefaultConversationExtras
import org.mariotaku.twidere.model.message.conversation.TwitterOfficialConversationExtras
import org.mariotaku.twidere.util.UserColorNameManager
import java.util.*
fun ParcelableMessageConversation.applyFrom(message: ParcelableMessage, details: AccountDetails) {
account_key = details.key
account_color = details.color
message_type = message.message_type
message_timestamp = message.message_timestamp
local_timestamp = message.local_timestamp
sort_id = message.sort_id
text_unescaped = message.text_unescaped
media = message.media
spans = message.spans
message_extras = message.extras
sender_key = message.sender_key
recipient_key = message.recipient_key
is_outgoing = message.is_outgoing
request_cursor = message.request_cursor
}
val ParcelableMessageConversation.timestamp: Long
get() = if (message_timestamp > 0) message_timestamp else local_timestamp
val ParcelableMessageConversation.user: ParcelableUser?
get() {
val userKey = if (is_outgoing) recipient_key else sender_key
return participants?.firstOrNull { it.key == userKey }
}
val ParcelableMessageConversation.readOnly: Boolean
get() {
when (conversation_extras_type) {
ExtrasType.TWITTER_OFFICIAL -> {
return (conversation_extras as? TwitterOfficialConversationExtras)?.readOnly ?: false
}
}
return false
}
var ParcelableMessageConversation.notificationDisabled: Boolean
get() {
return when (conversation_extras_type) {
ExtrasType.TWITTER_OFFICIAL -> {
(conversation_extras as? TwitterOfficialConversationExtras)?.notificationsDisabled ?: false
}
else -> {
(conversation_extras as? DefaultConversationExtras)?.notificationsDisabled ?: false
}
}
}
set(value) {
when (conversation_extras_type) {
ExtrasType.TWITTER_OFFICIAL -> {
val extras = conversation_extras as? TwitterOfficialConversationExtras ?: run {
val obj = TwitterOfficialConversationExtras()
conversation_extras = obj
return@run obj
}
extras.notificationsDisabled = value
}
else -> {
val extras = conversation_extras as? DefaultConversationExtras ?: run {
val obj = DefaultConversationExtras()
conversation_extras = obj
return@run obj
}
extras.notificationsDisabled = value
}
}
}
fun ParcelableMessageConversation.getTitle(context: Context, manager: UserColorNameManager,
nameFirst: Boolean): Pair<String, String?> {
if (conversation_type == ConversationType.ONE_TO_ONE) {
val user = this.user ?: return Pair(context.getString(R.string.title_direct_messages), null)
return Pair(user.name, "@${user.screen_name}")
}
if (conversation_name != null) {
return Pair(conversation_name, null)
}
return Pair(participants.joinToString(separator = ", ") { manager.getDisplayName(it, nameFirst) }, null)
}
fun ParcelableMessageConversation.getSubtitle(context: Context): String? {
if (conversation_type == ConversationType.ONE_TO_ONE) {
val user = this.user ?: return null
return "@${user.screen_name}"
}
val resources = context.resources
return resources.getQuantityString(R.plurals.N_message_participants, participants.size,
participants.size)
}
fun ParcelableMessageConversation.getSummaryText(context: Context, manager: UserColorNameManager,
nameFirst: Boolean): CharSequence? {
return getSummaryText(context, manager, nameFirst, message_type, message_extras, sender_key,
text_unescaped, this)
}
fun ParcelableMessageConversation.addParticipants(users: Collection<ParcelableUser>) {
val participants: Array<ParcelableUser?>? = this.participants
if (participants == null) {
if (user != null) {
this.participants = arrayOf(user)
} else {
this.participants = emptyArray()
}
} else {
val addingUsers = ArrayList<ParcelableUser>()
users.forEach { user ->
val index = participants.indexOfFirst { it?.key == user.key }
if (index >= 0) {
participants[index] = user
} else {
addingUsers += user
}
}
this.participants += addingUsers
}
this.participant_keys = this.participants.mapToArray(ParcelableUser::key)
this.participants.sortBy(ParcelableUser::screen_name)
}