2021-05-31 06:06:02 +02:00
|
|
|
package org.thoughtcrime.securesms.conversation.v2
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.database.Cursor
|
2021-06-07 06:04:55 +02:00
|
|
|
import android.graphics.drawable.ColorDrawable
|
2021-05-31 06:06:02 +02:00
|
|
|
import android.view.ViewGroup
|
2021-06-08 06:06:16 +02:00
|
|
|
import androidx.core.view.isVisible
|
2021-06-01 01:48:02 +02:00
|
|
|
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
2021-06-08 06:06:16 +02:00
|
|
|
import kotlinx.android.synthetic.main.view_visible_message.view.*
|
2021-06-07 06:04:55 +02:00
|
|
|
import network.loki.messenger.R
|
2021-06-01 01:48:02 +02:00
|
|
|
import org.thoughtcrime.securesms.conversation.v2.messages.ControlMessageView
|
|
|
|
import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageView
|
2021-05-31 06:06:02 +02:00
|
|
|
import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter
|
|
|
|
import org.thoughtcrime.securesms.database.DatabaseFactory
|
|
|
|
import org.thoughtcrime.securesms.database.model.MessageRecord
|
2021-06-07 06:04:55 +02:00
|
|
|
import org.thoughtcrime.securesms.loki.utilities.getColorWithID
|
2021-06-21 07:26:09 +02:00
|
|
|
import org.thoughtcrime.securesms.mms.GlideRequests
|
2021-06-01 01:48:02 +02:00
|
|
|
import java.lang.IllegalStateException
|
2021-05-31 06:06:02 +02:00
|
|
|
|
2021-06-21 06:48:27 +02:00
|
|
|
class ConversationAdapter(context: Context, cursor: Cursor, private val onItemPress: (MessageRecord, Int, VisibleMessageView) -> Unit,
|
2021-06-21 07:26:09 +02:00
|
|
|
private val onItemSwipeToReply: (MessageRecord, Int) -> Unit, private val onItemLongPress: (MessageRecord, Int) -> Unit,
|
|
|
|
private val glide: GlideRequests)
|
2021-06-09 03:37:50 +02:00
|
|
|
: CursorRecyclerViewAdapter<ViewHolder>(context, cursor) {
|
2021-05-31 06:06:02 +02:00
|
|
|
private val messageDB = DatabaseFactory.getMmsSmsDatabase(context)
|
2021-06-07 06:04:55 +02:00
|
|
|
var selectedItems = mutableSetOf<MessageRecord>()
|
2021-05-31 06:06:02 +02:00
|
|
|
|
2021-06-01 01:48:02 +02:00
|
|
|
sealed class ViewType(val rawValue: Int) {
|
|
|
|
object Visible : ViewType(0)
|
|
|
|
object Control : ViewType(1)
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
|
|
|
val allValues: Map<Int, ViewType> get() = mapOf(
|
|
|
|
Visible.rawValue to Visible,
|
|
|
|
Control.rawValue to Control
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class VisibleMessageViewHolder(val view: VisibleMessageView) : ViewHolder(view)
|
|
|
|
class ControlMessageViewHolder(val view: ControlMessageView) : ViewHolder(view)
|
|
|
|
|
|
|
|
override fun getItemViewType(cursor: Cursor): Int {
|
|
|
|
val message = getMessage(cursor)!!
|
2021-06-01 02:02:20 +02:00
|
|
|
if (message.isControlMessage) { return ViewType.Control.rawValue }
|
2021-06-01 01:48:02 +02:00
|
|
|
return ViewType.Visible.rawValue
|
|
|
|
}
|
2021-05-31 06:06:02 +02:00
|
|
|
|
|
|
|
override fun onCreateItemViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
2021-06-01 01:48:02 +02:00
|
|
|
@Suppress("NAME_SHADOWING")
|
|
|
|
val viewType = ViewType.allValues[viewType]
|
|
|
|
when (viewType) {
|
|
|
|
ViewType.Visible -> {
|
|
|
|
val view = VisibleMessageView(context)
|
|
|
|
return VisibleMessageViewHolder(view)
|
|
|
|
}
|
|
|
|
ViewType.Control -> {
|
|
|
|
val view = ControlMessageView(context)
|
|
|
|
return ControlMessageViewHolder(view)
|
|
|
|
}
|
|
|
|
else -> throw IllegalStateException("Unexpected view type: $viewType.")
|
|
|
|
}
|
2021-05-31 06:06:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onBindItemViewHolder(viewHolder: ViewHolder, cursor: Cursor) {
|
|
|
|
val message = getMessage(cursor)!!
|
2021-06-01 01:48:02 +02:00
|
|
|
when (viewHolder) {
|
2021-06-04 07:10:58 +02:00
|
|
|
is VisibleMessageViewHolder -> {
|
|
|
|
val view = viewHolder.view
|
2021-06-08 06:06:16 +02:00
|
|
|
val isSelected = selectedItems.contains(message)
|
2021-06-09 04:04:50 +02:00
|
|
|
view.snIsSelected = isSelected
|
2021-06-08 06:06:16 +02:00
|
|
|
view.messageTimestampTextView.isVisible = isSelected
|
2021-06-07 07:37:21 +02:00
|
|
|
val position = viewHolder.adapterPosition
|
2021-06-21 07:26:09 +02:00
|
|
|
view.bind(message, getMessageBefore(position, cursor), getMessageAfter(position, cursor), glide)
|
2021-06-21 06:48:27 +02:00
|
|
|
view.onPress = { onItemPress(message, viewHolder.adapterPosition, view) }
|
2021-06-09 03:37:50 +02:00
|
|
|
view.onSwipeToReply = { onItemSwipeToReply(message, viewHolder.adapterPosition) }
|
|
|
|
view.onLongPress = { onItemLongPress(message, viewHolder.adapterPosition) }
|
2021-06-04 07:10:58 +02:00
|
|
|
}
|
2021-06-01 01:48:02 +02:00
|
|
|
is ControlMessageViewHolder -> viewHolder.view.bind(message)
|
|
|
|
}
|
2021-05-31 06:06:02 +02:00
|
|
|
}
|
|
|
|
|
2021-06-01 01:48:02 +02:00
|
|
|
override fun onItemViewRecycled(viewHolder: ViewHolder?) {
|
|
|
|
when (viewHolder) {
|
|
|
|
is VisibleMessageViewHolder -> viewHolder.view.recycle()
|
|
|
|
is ControlMessageViewHolder -> viewHolder.view.recycle()
|
|
|
|
}
|
|
|
|
super.onItemViewRecycled(viewHolder)
|
2021-05-31 06:06:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun getMessage(cursor: Cursor): MessageRecord? {
|
|
|
|
return messageDB.readerFor(cursor).current
|
|
|
|
}
|
2021-06-07 06:04:55 +02:00
|
|
|
|
2021-06-07 07:37:21 +02:00
|
|
|
private fun getMessageBefore(position: Int, cursor: Cursor): MessageRecord? {
|
2021-06-07 08:36:05 +02:00
|
|
|
// The message that's visually before the current one is actually after the current
|
|
|
|
// one for the cursor because the layout is reversed
|
|
|
|
if (!cursor.moveToPosition(position + 1)) { return null }
|
2021-06-07 07:37:21 +02:00
|
|
|
return messageDB.readerFor(cursor).current
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun getMessageAfter(position: Int, cursor: Cursor): MessageRecord? {
|
2021-06-07 08:36:05 +02:00
|
|
|
// The message that's visually after the current one is actually before the current
|
|
|
|
// one for the cursor because the layout is reversed
|
|
|
|
if (!cursor.moveToPosition(position - 1)) { return null }
|
2021-06-07 07:37:21 +02:00
|
|
|
return messageDB.readerFor(cursor).current
|
|
|
|
}
|
|
|
|
|
2021-06-07 06:04:55 +02:00
|
|
|
fun toggleSelection(message: MessageRecord, position: Int) {
|
|
|
|
if (selectedItems.contains(message)) selectedItems.remove(message) else selectedItems.add(message)
|
|
|
|
notifyItemChanged(position)
|
|
|
|
}
|
2021-05-31 06:06:02 +02:00
|
|
|
}
|