Ensure edit history always starts scrolled to top.

This commit is contained in:
Alex Hart
2023-07-21 16:03:41 -03:00
committed by GitHub
parent fad401941e
commit 6191e003fc
3 changed files with 16 additions and 11 deletions

View File

@@ -8,6 +8,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.view.children
import androidx.core.view.marginLeft
import androidx.recyclerview.widget.RecyclerView
@@ -17,29 +18,32 @@ import org.thoughtcrime.securesms.util.ViewUtil
/**
* Serves as the separator between the original message and other messages. Used in [MessageQuotesBottomSheet] and [EditMessageHistoryDialog]
*/
class OriginalMessageSeparatorDecoration(context: Context, val titleRes: Int) : RecyclerView.ItemDecoration() {
class OriginalMessageSeparatorDecoration(
context: Context,
private val titleRes: Int,
private val getOriginalMessagePosition: (RecyclerView.State) -> Int = { it.itemCount - 1 }
) : RecyclerView.ItemDecoration() {
private val dividerMargin = ViewUtil.dpToPx(context, 32)
private val dividerHeight = ViewUtil.dpToPx(context, 2)
private val dividerRect = Rect()
private val dividerPaint: Paint = Paint().apply {
style = Paint.Style.FILL
color = context.resources.getColor(R.color.signal_colorSurfaceVariant)
color = ContextCompat.getColor(context, R.color.signal_colorSurfaceVariant)
}
private var cachedHeader: View? = null
private val headerMargin = ViewUtil.dpToPx(24)
override fun onDrawOver(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
val lastItem: View = parent.children.firstOrNull { child ->
parent.getChildAdapterPosition(child) == state.itemCount - 1
val originalItem: View = parent.children.firstOrNull { child ->
parent.getChildAdapterPosition(child) == getOriginalMessagePosition(state)
} ?: return
dividerRect.apply {
left = parent.left
top = lastItem.bottom + dividerMargin
top = originalItem.bottom + dividerMargin
right = parent.right
bottom = lastItem.bottom + dividerMargin + dividerHeight
bottom = originalItem.bottom + dividerMargin + dividerHeight
}
canvas.drawRect(dividerRect, dividerPaint)
@@ -86,9 +90,9 @@ class OriginalMessageSeparatorDecoration(context: Context, val titleRes: Int) :
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
val currentPosition = parent.getChildAdapterPosition(view)
val lastPosition = state.itemCount - 1
val originalMessagePosition = getOriginalMessagePosition(state)
if (currentPosition == lastPosition) {
if (currentPosition == originalMessagePosition) {
outRect.bottom = ViewUtil.dpToPx(view.context, 110)
}
}

View File

@@ -88,10 +88,10 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() {
}
binding.editHistoryList.apply {
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, true)
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
adapter = messageAdapter
itemAnimator = null
addItemDecoration(OriginalMessageSeparatorDecoration(context, R.string.EditMessageHistoryDialog_title))
addItemDecoration(OriginalMessageSeparatorDecoration(context, R.string.EditMessageHistoryDialog_title) { 0 })
doOnNextLayout {
// Adding this without waiting for a layout pass would result in an indeterminate amount of padding added to the top of the view
addItemDecoration(StickyHeaderDecoration(messageAdapter, false, false, ConversationAdapter.HEADER_TYPE_INLINE_DATE))

View File

@@ -35,6 +35,7 @@ object EditMessageHistoryRepository {
.messages
.getMessageEditHistory(messageId)
.toList()
.reversed()
if (records.isEmpty()) {
return emptyList()