Read marker: fix some issues with jump to unread visibility.

This commit is contained in:
ganfra 2021-06-22 19:41:10 +02:00
parent 121fd9a19d
commit c3ef036dca
2 changed files with 14 additions and 13 deletions

View File

@ -1,4 +1,3 @@
/* /*
* Copyright 2019 New Vector Ltd * Copyright 2019 New Vector Ltd
* *
@ -355,6 +354,10 @@ class RoomDetailFragment @Inject constructor(
renderTombstoneEventHandling(it) renderTombstoneEventHandling(it)
} }
roomDetailViewModel.selectSubscribe(RoomDetailViewState::canShowJumpToReadMarker, RoomDetailViewState::unreadState) { _, _ ->
updateJumpToReadMarkerViewVisibility()
}
roomDetailViewModel.selectSubscribe(RoomDetailViewState::sendMode, RoomDetailViewState::canSendMessage) { mode, canSend -> roomDetailViewModel.selectSubscribe(RoomDetailViewState::sendMode, RoomDetailViewState::canSendMessage) { mode, canSend ->
if (!canSend) { if (!canSend) {
return@selectSubscribe return@selectSubscribe
@ -728,8 +731,7 @@ class RoomDetailFragment @Inject constructor(
onJumpToReadMarkerClicked() onJumpToReadMarkerClicked()
} }
views.jumpToReadMarkerView.setOnCloseIconClickListener { views.jumpToReadMarkerView.setOnCloseIconClickListener {
views.jumpToReadMarkerView.isVisible = false roomDetailViewModel.handle(RoomDetailAction.MarkAllAsRead)
onClearReadMarkerClicked()
} }
} }
@ -1059,7 +1061,13 @@ class RoomDetailFragment @Inject constructor(
timelineEventController.timeline = roomDetailViewModel.timeline timelineEventController.timeline = roomDetailViewModel.timeline
views.timelineRecyclerView.trackItemsVisibilityChange() 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() val stateRestorer = LayoutManagerStateRestorer(layoutManager).register()
scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager, timelineEventController) scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager, timelineEventController)
scrollOnHighlightedEventCallback = ScrollOnHighlightedEventCallback(views.timelineRecyclerView, layoutManager, timelineEventController) scrollOnHighlightedEventCallback = ScrollOnHighlightedEventCallback(views.timelineRecyclerView, layoutManager, timelineEventController)
@ -1070,8 +1078,6 @@ class RoomDetailFragment @Inject constructor(
it.dispatchTo(stateRestorer) it.dispatchTo(stateRestorer)
it.dispatchTo(scrollOnNewMessageCallback) it.dispatchTo(scrollOnNewMessageCallback)
it.dispatchTo(scrollOnHighlightedEventCallback) it.dispatchTo(scrollOnHighlightedEventCallback)
updateJumpToReadMarkerViewVisibility()
jumpToBottomViewVisibilityManager.maybeShowJumpToBottomViewVisibilityWithDelay()
} }
timelineEventController.addModelBuildListener(modelBuildListener) timelineEventController.addModelBuildListener(modelBuildListener)
views.timelineRecyclerView.adapter = timelineEventController.adapter views.timelineRecyclerView.adapter = timelineEventController.adapter
@ -1127,7 +1133,7 @@ class RoomDetailFragment @Inject constructor(
is UnreadState.ReadMarkerNotLoaded -> true is UnreadState.ReadMarkerNotLoaded -> true
is UnreadState.HasUnread -> { is UnreadState.HasUnread -> {
if (it.canShowJumpToReadMarker) { if (it.canShowJumpToReadMarker) {
val lastVisibleItem = layoutManager.findLastVisibleItemPosition() val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition()
val positionOfReadMarker = timelineEventController.getPositionOfReadMarker() val positionOfReadMarker = timelineEventController.getPositionOfReadMarker()
if (positionOfReadMarker == null) { if (positionOfReadMarker == null) {
false false
@ -1704,7 +1710,6 @@ class RoomDetailFragment @Inject constructor(
} }
override fun onReadMarkerVisible() { override fun onReadMarkerVisible() {
updateJumpToReadMarkerViewVisibility()
roomDetailViewModel.handle(RoomDetailAction.EnterTrackingUnreadMessagesState) roomDetailViewModel.handle(RoomDetailAction.EnterTrackingUnreadMessagesState)
} }
@ -1974,10 +1979,6 @@ class RoomDetailFragment @Inject constructor(
} }
} }
private fun onClearReadMarkerClicked() {
roomDetailViewModel.handle(RoomDetailAction.MarkAllAsRead)
}
// AttachmentTypeSelectorView.Callback // AttachmentTypeSelectorView.Callback
private val typeSelectedActivityResultLauncher = registerForPermissionsResult { allGranted -> private val typeSelectedActivityResultLauncher = registerForPermissionsResult { allGranted ->

View File

@ -1244,6 +1244,7 @@ class RoomDetailViewModel @AssistedInject constructor(
} }
private fun handleMarkAllAsRead() { private fun handleMarkAllAsRead() {
setState { copy(unreadState = UnreadState.HasNoUnread) }
viewModelScope.launch { viewModelScope.launch {
tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.BOTH) } tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.BOTH) }
} }
@ -1380,7 +1381,6 @@ class RoomDetailViewModel @AssistedInject constructor(
} }
} }
.subscribe { .subscribe {
Timber.v("Unread state: $it")
setState { copy(unreadState = it) } setState { copy(unreadState = it) }
} }
.disposeOnClear() .disposeOnClear()