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 46a47f9be6..ddde469f2c 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 @@ -1,4 +1,3 @@ - /* * Copyright 2019 New Vector Ltd * @@ -355,6 +354,10 @@ class RoomDetailFragment @Inject constructor( renderTombstoneEventHandling(it) } + roomDetailViewModel.selectSubscribe(RoomDetailViewState::canShowJumpToReadMarker, RoomDetailViewState::unreadState) { _, _ -> + updateJumpToReadMarkerViewVisibility() + } + roomDetailViewModel.selectSubscribe(RoomDetailViewState::sendMode, RoomDetailViewState::canSendMessage) { mode, canSend -> if (!canSend) { return@selectSubscribe @@ -728,8 +731,7 @@ class RoomDetailFragment @Inject constructor( onJumpToReadMarkerClicked() } views.jumpToReadMarkerView.setOnCloseIconClickListener { - views.jumpToReadMarkerView.isVisible = false - onClearReadMarkerClicked() + roomDetailViewModel.handle(RoomDetailAction.MarkAllAsRead) } } @@ -1059,7 +1061,13 @@ class RoomDetailFragment @Inject constructor( timelineEventController.timeline = roomDetailViewModel.timeline views.timelineRecyclerView.trackItemsVisibilityChange() - layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, true) + layoutManager = object : LinearLayoutManager(context, RecyclerView.VERTICAL, true) { + override fun onLayoutCompleted(state: RecyclerView.State?) { + super.onLayoutCompleted(state) + updateJumpToReadMarkerViewVisibility() + jumpToBottomViewVisibilityManager.maybeShowJumpToBottomViewVisibilityWithDelay() + } + } val stateRestorer = LayoutManagerStateRestorer(layoutManager).register() scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager, timelineEventController) scrollOnHighlightedEventCallback = ScrollOnHighlightedEventCallback(views.timelineRecyclerView, layoutManager, timelineEventController) @@ -1070,8 +1078,6 @@ class RoomDetailFragment @Inject constructor( it.dispatchTo(stateRestorer) it.dispatchTo(scrollOnNewMessageCallback) it.dispatchTo(scrollOnHighlightedEventCallback) - updateJumpToReadMarkerViewVisibility() - jumpToBottomViewVisibilityManager.maybeShowJumpToBottomViewVisibilityWithDelay() } timelineEventController.addModelBuildListener(modelBuildListener) views.timelineRecyclerView.adapter = timelineEventController.adapter @@ -1127,7 +1133,7 @@ class RoomDetailFragment @Inject constructor( is UnreadState.ReadMarkerNotLoaded -> true is UnreadState.HasUnread -> { if (it.canShowJumpToReadMarker) { - val lastVisibleItem = layoutManager.findLastVisibleItemPosition() + val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition() val positionOfReadMarker = timelineEventController.getPositionOfReadMarker() if (positionOfReadMarker == null) { false @@ -1704,7 +1710,6 @@ class RoomDetailFragment @Inject constructor( } override fun onReadMarkerVisible() { - updateJumpToReadMarkerViewVisibility() roomDetailViewModel.handle(RoomDetailAction.EnterTrackingUnreadMessagesState) } @@ -1974,10 +1979,6 @@ class RoomDetailFragment @Inject constructor( } } - private fun onClearReadMarkerClicked() { - roomDetailViewModel.handle(RoomDetailAction.MarkAllAsRead) - } - // AttachmentTypeSelectorView.Callback private val typeSelectedActivityResultLauncher = registerForPermissionsResult { allGranted -> diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 751114c2d9..bc407d3deb 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -1244,6 +1244,7 @@ class RoomDetailViewModel @AssistedInject constructor( } private fun handleMarkAllAsRead() { + setState { copy(unreadState = UnreadState.HasNoUnread) } viewModelScope.launch { tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.BOTH) } } @@ -1380,7 +1381,6 @@ class RoomDetailViewModel @AssistedInject constructor( } } .subscribe { - Timber.v("Unread state: $it") setState { copy(unreadState = it) } } .disposeOnClear()