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