From b53cad2808fbeab46df507bafb0939d66f1589d1 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 20 Jul 2023 16:50:10 -0400 Subject: [PATCH] Fix various CFv2 scrolling issues. --- .../mutiselect/MultiselectItemDecoration.kt | 7 ++--- .../conversation/v2/ConversationAdapterV2.kt | 5 ---- .../conversation/v2/ConversationFragment.kt | 26 ++++++++++++------- .../conversation/v2/ConversationRepository.kt | 5 ++-- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt index c057111f0d..26e83afd6f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt @@ -35,6 +35,7 @@ import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.conversation.ConversationAdapterBridge import org.thoughtcrime.securesms.conversation.ConversationAdapterBridge.PulseRequest import org.thoughtcrime.securesms.conversation.v2.items.InteractiveConversationElement +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.ThemeUtil import org.thoughtcrime.securesms.util.ViewUtil @@ -570,7 +571,7 @@ class MultiselectItemDecoration( } private fun RecyclerView.getMultiselectableChildren(): Sequence { - return if (FeatureFlags.useConversationFragmentV2()) { + return if (SignalStore.internalValues().useConversationItemV2()) { children.map { getChildViewHolder(it) }.filterIsInstance() } else { children.filterIsInstance() @@ -578,7 +579,7 @@ class MultiselectItemDecoration( } private fun RecyclerView.getInteractableChildren(): Sequence { - return if (FeatureFlags.useConversationFragmentV2()) { + return if (SignalStore.internalValues().useConversationItemV2()) { children.map { getChildViewHolder(it) }.filterIsInstance() } else { children.filterIsInstance() @@ -586,7 +587,7 @@ class MultiselectItemDecoration( } private fun resolveMultiselectable(parent: RecyclerView, child: View): Multiselectable? { - return if (FeatureFlags.useConversationFragmentV2()) { + return if (SignalStore.internalValues().useConversationItemV2()) { parent.getChildViewHolder(child) as? Multiselectable } else { child as? Multiselectable diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt index b21d393430..cf3b137feb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt @@ -168,11 +168,6 @@ class ConversationAdapterV2( notifyItemRangeChanged(0, itemCount) } - /** [messagePosition] is one-based index and adapter is zero-based. */ - fun getAdapterPositionForMessagePosition(messagePosition: Int): Int { - return messagePosition - 1 - } - fun getLastVisibleConversationMessage(position: Int): ConversationMessage? { return try { getConversationMessage(position) ?: getConversationMessage(position - 1) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index f6ffdfccc3..fe26acec8a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -49,7 +49,6 @@ import androidx.core.app.ActivityOptionsCompat import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.view.ViewCompat -import androidx.core.view.doOnNextLayout import androidx.core.view.doOnPreDraw import androidx.core.view.isVisible import androidx.fragment.app.Fragment @@ -135,6 +134,7 @@ import org.thoughtcrime.securesms.conversation.AttachmentKeyboardButton import org.thoughtcrime.securesms.conversation.BadDecryptLearnMoreDialog import org.thoughtcrime.securesms.conversation.ConversationAdapter import org.thoughtcrime.securesms.conversation.ConversationBottomSheetCallback +import org.thoughtcrime.securesms.conversation.ConversationData import org.thoughtcrime.securesms.conversation.ConversationHeaderView import org.thoughtcrime.securesms.conversation.ConversationIntents import org.thoughtcrime.securesms.conversation.ConversationIntents.ConversationScreenType @@ -757,12 +757,7 @@ class ConversationFragment : .subscribeOn(Schedulers.io()) .doOnSuccess { state -> SignalLocalMetrics.ConversationOpen.onDataLoaded() - binding.conversationItemRecycler.doOnNextLayout { - layoutManager.scrollToPositionWithOffset( - adapter.getAdapterPositionForMessagePosition(state.meta.getStartPosition()), - binding.conversationItemRecycler.height - ) - } + moveToStartPosition(state.meta) conversationItemDecorations.setFirstUnreadCount(state.meta.unreadCount) } .flatMapObservable { it.items.data } @@ -1411,9 +1406,8 @@ class ConversationFragment : ) scrollToPositionDelegate = ScrollToPositionDelegate( - binding.conversationItemRecycler, - adapter::canJumpToPosition, - adapter::getAdapterPositionForMessagePosition + recyclerView = binding.conversationItemRecycler, + canJumpToPosition = adapter::canJumpToPosition ) adapter.setPagingController(viewModel.pagingController) @@ -2106,6 +2100,18 @@ class ConversationFragment : //region Scroll Handling + private fun moveToStartPosition(meta: ConversationData) { + scrollToPositionDelegate.requestScrollPosition( + position = meta.getStartPosition(), + smooth = true, + scrollStrategy = if (meta.shouldJumpToMessage()) { + jumpAndPulseScrollStrategy + } else { + ScrollToPositionDelegate.DefaultScrollStrategy + } + ) + } + /** * Requests a jump to the desired position, and ensures that the position desired will be visible on the screen. */ diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt index 00cf996e4c..6634661b57 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt @@ -298,16 +298,15 @@ class ConversationRepository( oldConversationRepository.markGiftBadgeRevealed(messageId) } - /** Quoted Message position is a zero-based index, so we need to convert it to 1-based */ fun getQuotedMessagePosition(threadId: Long, quote: Quote): Single { return Single.fromCallable { - SignalDatabase.messages.getQuotedMessagePosition(threadId, quote.id, quote.author) + 1 + SignalDatabase.messages.getQuotedMessagePosition(threadId, quote.id, quote.author) }.subscribeOn(Schedulers.io()) } fun getMessageResultPosition(threadId: Long, messageResult: MessageResult): Single { return Single.fromCallable { - SignalDatabase.messages.getMessagePositionInConversation(threadId, messageResult.receivedTimestampMs) + 1 + SignalDatabase.messages.getMessagePositionInConversation(threadId, messageResult.receivedTimestampMs) }.subscribeOn(Schedulers.io()) }