From 6191e003fce4e071eb3439520998009fce97696f Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 21 Jul 2023 16:03:41 -0300 Subject: [PATCH] Ensure edit history always starts scrolled to top. --- .../OriginalMessageSeparatorDecoration.kt | 22 +++++++++++-------- .../ui/edit/EditMessageHistoryDialog.kt | 4 ++-- .../ui/edit/EditMessageHistoryRepository.kt | 1 + 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/OriginalMessageSeparatorDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/OriginalMessageSeparatorDecoration.kt index 87578d3724..57ca2335f9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/OriginalMessageSeparatorDecoration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/OriginalMessageSeparatorDecoration.kt @@ -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) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt index cea4e8cac6..a7313d2fa6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt @@ -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)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryRepository.kt index f480fd5d47..8bca75f5f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryRepository.kt @@ -35,6 +35,7 @@ object EditMessageHistoryRepository { .messages .getMessageEditHistory(messageId) .toList() + .reversed() if (records.isEmpty()) { return emptyList()