diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt index 4775bb0c..2203902f 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt @@ -40,6 +40,7 @@ class RoomDetailFragment : RiotFragment() { private var eventId: String? by FragmentArgumentDelegate() private val timelineEventController by inject(parameters = { ParameterList(roomId) }) private lateinit var room: Room + private lateinit var scrollOnNewMessageCallback: ScrollOnNewMessageCallback override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_room_detail, container, false) @@ -71,9 +72,9 @@ class RoomDetailFragment : RiotFragment() { private fun setupRecyclerView() { val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true) - val listUpdateCallback = ScrollOnNewMessageCallback(layoutManager) + scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager) recyclerView.layoutManager = layoutManager - timelineEventController.addModelBuildListener { it.dispatchTo(listUpdateCallback) } + timelineEventController.addModelBuildListener { it.dispatchTo(scrollOnNewMessageCallback) } recyclerView.setController(timelineEventController) } @@ -91,6 +92,7 @@ class RoomDetailFragment : RiotFragment() { } private fun renderEvents(events: PagedList?) { + scrollOnNewMessageCallback.hasBeenUpdated.set(true) timelineEventController.timeline = events } diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/ScrollOnNewMessageCallback.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/ScrollOnNewMessageCallback.kt index 38b4570f..aec98efe 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/ScrollOnNewMessageCallback.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/ScrollOnNewMessageCallback.kt @@ -2,11 +2,14 @@ package im.vector.riotredesign.features.home.room.detail import android.support.v7.widget.LinearLayoutManager import im.vector.riotredesign.core.platform.DefaultListUpdateCallback +import java.util.concurrent.atomic.AtomicBoolean class ScrollOnNewMessageCallback(private val layoutManager: LinearLayoutManager) : DefaultListUpdateCallback { + val hasBeenUpdated = AtomicBoolean(false) + override fun onInserted(position: Int, count: Int) { - if (position == 0 && layoutManager.findFirstVisibleItemPosition() == 0) { + if (hasBeenUpdated.compareAndSet(true, false) && position == 0 && layoutManager.findFirstVisibleItemPosition() == 0) { layoutManager.scrollToPosition(0) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt index e14869e4..5f24e155 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt @@ -16,7 +16,7 @@ import im.vector.matrix.android.internal.session.events.interceptor.MessageEvent import io.realm.Realm import io.realm.RealmQuery -private const val PAGE_SIZE = 60 +private const val PAGE_SIZE = 30 internal class DefaultTimelineHolder(private val roomId: String, private val monarchy: Monarchy, @@ -26,7 +26,7 @@ internal class DefaultTimelineHolder(private val roomId: String, private val eventInterceptors = ArrayList() init { - boundaryCallback.limit = PAGE_SIZE / 2 + boundaryCallback.limit = 30 eventInterceptors.add(MessageEventInterceptor(monarchy, roomId)) } @@ -54,8 +54,6 @@ internal class DefaultTimelineHolder(private val roomId: String, val pagedListConfig = PagedList.Config.Builder() .setEnablePlaceholders(false) .setPageSize(PAGE_SIZE) - .setInitialLoadSizeHint(PAGE_SIZE) - .setPrefetchDistance(PAGE_SIZE / 2) .build() val livePagedListBuilder = LivePagedListBuilder(domainSourceFactory, pagedListConfig).setBoundaryCallback(boundaryCallback)