From 6c9c2eaef58f0046add88783a7e6165ce3bf30b5 Mon Sep 17 00:00:00 2001 From: SpiritCroc <dev@spiritcroc.de> Date: Sun, 1 Aug 2021 12:07:21 +0200 Subject: [PATCH] Fix scrolling to bottom if it's not far and it wasn't at bottom initially Change-Id: Ifaf2395140d30b456acd9130bd058ed573888423 --- .../sdk/api/session/room/timeline/Timeline.kt | 5 +++++ .../session/room/timeline/DefaultTimeline.kt | 4 ++++ .../home/room/detail/RoomDetailFragment.kt | 1 + .../room/detail/ScrollOnNewMessageCallback.kt | 17 ++++++++++++----- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt index ee1bd477fb..3b9ba39c1e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt @@ -61,6 +61,11 @@ interface Timeline { */ fun getInitialEventId(): String? + /** + * Change initial event id + */ + fun setInitialEventId(eventId: String?) + /** * Check if the timeline can be enriched by paginating. * @param direction the direction to check in diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt index c77edadaa0..19ba826ad5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt @@ -225,6 +225,10 @@ internal class DefaultTimeline( return initialEventId } + override fun setInitialEventId(eventId: String?) { + initialEventId = eventId + } + override fun getTimelineEventAtIndex(index: Int): TimelineEvent? { return builtEvents.getOrNull(index) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index d8b0d5bd8c..c2f9c42d84 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -796,6 +796,7 @@ class RoomDetailFragment @Inject constructor( scrollOnNewMessageCallback.forceScrollOnNextUpdate() roomDetailViewModel.timeline.restartWithEventId(null) } else { + roomDetailViewModel.timeline.setInitialEventId(null) layoutManager.scrollToPosition(0) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnNewMessageCallback.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnNewMessageCallback.kt index 372257e9f9..25d862e4c8 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnNewMessageCallback.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/ScrollOnNewMessageCallback.kt @@ -54,8 +54,16 @@ class ScrollOnNewMessageCallback(private val layoutManager: LinearLayoutManager, override fun onInserted(position: Int, count: Int) { if (initialForceScroll) { - timelineEventController.searchPositionOfEvent(initialForceScrollEventId)?.let { - layoutManager.scrollToPosition(it) + var scrollToEvent = initialForceScrollEventId + if (initialForceScrollEventId == null) { + scrollToEvent = timelineEventController.timeline?.getInitialEventId() + } + if (scrollToEvent == null) { + layoutManager.scrollToPositionWithOffset(0, 0) + } else { + timelineEventController.searchPositionOfEvent(scrollToEvent)?.let { + layoutManager.scrollToPosition(it) + } } return } @@ -64,7 +72,7 @@ class ScrollOnNewMessageCallback(private val layoutManager: LinearLayoutManager, } if (forceScroll) { forceScroll = false - layoutManager.scrollToPosition(0) + layoutManager.scrollToPositionWithOffset(0, 0) return } if (layoutManager.findFirstVisibleItemPosition() > 1) { @@ -79,8 +87,7 @@ class ScrollOnNewMessageCallback(private val layoutManager: LinearLayoutManager, while (newTimelineEventIds.lastOrNull() != firstNewItemIds) { newTimelineEventIds.removeLastOrNull() } - //layoutManager.scrollToPosition(0) - layoutManager.scrollToPositionWithOffset(0, Integer.MAX_VALUE) + layoutManager.scrollToPositionWithOffset(0, 0) } } }