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) } } }