Use smarter scrolling for group story replies.

fork-5.53.8
Cody Henthorne 2022-04-05 14:27:31 -04:00
rodzic 73f32868a2
commit 1746f37276
3 zmienionych plików z 28 dodań i 8 usunięć

Wyświetl plik

@ -44,6 +44,7 @@ import org.thoughtcrime.securesms.util.DeleteDialog
import org.thoughtcrime.securesms.util.FragmentDialogs.displayInDialogAboveAnchor
import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.thoughtcrime.securesms.util.ServiceUtil
import org.thoughtcrime.securesms.util.SnapToTopDataObserver
import org.thoughtcrime.securesms.util.adapter.mapping.PagingMappingAdapter
import org.thoughtcrime.securesms.util.fragments.findListener
import org.thoughtcrime.securesms.util.fragments.requireListener
@ -97,6 +98,8 @@ class StoryGroupReplyFragment :
get() = requireArguments().getParcelable(ARG_GROUP_RECIPIENT_ID)!!
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: PagingMappingAdapter<StoryGroupReplyItemData.Key>
private lateinit var snapToTopDataObserver: SnapToTopDataObserver
private lateinit var composer: StoryReplyComposer
private var currentChild: StoryViewsAndRepliesPagerParent.Child? = null
@ -112,7 +115,7 @@ class StoryGroupReplyFragment :
val emptyNotice: View = requireView().findViewById(R.id.empty_notice)
val adapter = PagingMappingAdapter<StoryGroupReplyItemData.Key>()
adapter = PagingMappingAdapter<StoryGroupReplyItemData.Key>()
val layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, true)
recyclerView.layoutManager = layoutManager
recyclerView.adapter = adapter
@ -133,15 +136,24 @@ class StoryGroupReplyFragment :
}
viewModel.pageData.observe(viewLifecycleOwner) { pageData ->
adapter.submitList(getConfiguration(pageData).toMappingModelList()) {
recyclerView.post {
if (recyclerView.canScrollVertically(1)) {
recyclerView.smoothScrollToPosition(0)
}
}
}
adapter.submitList(getConfiguration(pageData).toMappingModelList())
}
snapToTopDataObserver = SnapToTopDataObserver(
recyclerView,
object : SnapToTopDataObserver.ScrollRequestValidator {
override fun isPositionStillValid(position: Int): Boolean {
return position >= 0 && position < adapter.itemCount
}
override fun isItemAtPositionLoaded(position: Int): Boolean {
return adapter.hasItem(position)
}
},
null
)
adapter.registerAdapterDataObserver(snapToTopDataObserver)
initializeMentions()
}
@ -364,6 +376,9 @@ class StoryGroupReplyFragment :
Toast.makeText(context, R.string.message_details_recipient__failed_to_send, Toast.LENGTH_SHORT).show()
}
}
},
onComplete = {
snapToTopDataObserver.requestScrollPosition(0)
}
)
}

Wyświetl plik

@ -55,6 +55,10 @@ public class PagingMappingAdapter<Key> extends MappingAdapter {
throw new AssertionError("No view holder factory for type: " + item.getClass());
}
public boolean hasItem(int position) {
return getItem(position) != null;
}
private static class Placeholder implements MappingModel<Placeholder> {
@Override
public boolean areItemsTheSame(@NonNull Placeholder newItem) {

Wyświetl plik

@ -38,6 +38,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="7dp"
android:layout_marginEnd="12dp"
android:textAppearance="@style/TextAppearance.Signal.Subtitle.Bold"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"