diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt index 48475f7d..3e8e5b8d 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt @@ -89,6 +89,7 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, private fun handleEventDisplayed(action: RoomDetailActions.EventDisplayed) { displayedEventsObservable.accept(action) + } private fun handleIsDisplayed() { @@ -102,6 +103,18 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, .buffer(1, TimeUnit.SECONDS) .filter { it.isNotEmpty() } .subscribeBy(onNext = { actions -> + val eventIds = actions.mapNotNull { it.event.root.eventId } + withState { state -> + val newMapOfReadReceipts = HashMap(state.readReceiptsForEventId) + eventIds.forEach { + if (newMapOfReadReceipts.containsKey(it).not()) { + val readReceipts = room.readReceipts(it) + newMapOfReadReceipts[it] = readReceipts + } + } + setState { copy(readReceiptsForEventId = newMapOfReadReceipts) } + } + val mostRecentEvent = actions.lastMinBy { it.index } mostRecentEvent?.event?.root?.eventId?.let { eventId -> room.setReadReceipt(eventId, callback = object : MatrixCallback {}) diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt index ca2f39b7..a8c3e9ac 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt @@ -19,12 +19,14 @@ package im.vector.riotredesign.features.home.room.detail import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized +import im.vector.matrix.android.api.session.room.model.ReadReceipt import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.timeline.TimelineData data class RoomDetailViewState( val roomId: String, val eventId: String?, + val readReceiptsForEventId: Map> = emptyMap(), val asyncRoomSummary: Async = Uninitialized, val asyncTimelineData: Async = Uninitialized ) : MvRxState { diff --git a/app/src/main/res/layout/item_timeline_event_text_message.xml b/app/src/main/res/layout/item_timeline_event_text_message.xml index 986c9e1a..87dd601e 100644 --- a/app/src/main/res/layout/item_timeline_event_text_message.xml +++ b/app/src/main/res/layout/item_timeline_event_text_message.xml @@ -60,13 +60,4 @@ app:layout_constraintTop_toBottomOf="@+id/messageMemberNameView" tools:text="Alright finished work, heading there in about 20 mins…
Ping me when you’re outside" /> - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/read/ReadService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/read/ReadService.kt index 5bdfe2f6..59fe8e33 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/read/ReadService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/read/ReadService.kt @@ -46,10 +46,10 @@ interface ReadService { fun readReceipts(): LiveData> /** - * @param eventId to look for receipt. - * * @return the receipt associated or null + * @param eventId to look for receipts. + * * @return the list of receipts associated with the eventId */ - fun readReceipt(eventId: String): ReadReceipt? + fun readReceipts(eventId: String): List /** * A listener defined at the room level to listen for some read events. diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadReceiptEntityQueries.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadReceiptEntityQueries.kt index 44359675..450fcc5f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadReceiptEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/query/ReadReceiptEntityQueries.kt @@ -31,4 +31,4 @@ internal fun ReadReceiptEntity.Companion.where(realm: Realm, roomId: String, use internal fun ReadReceiptEntity.Companion.where(realm: Realm, roomId: String): RealmQuery { return realm.where() .equalTo(ReadReceiptEntityFields.ROOM_ID, roomId) -} \ No newline at end of file +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt index 5763bc5e..754ab63c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt @@ -24,6 +24,7 @@ import im.vector.matrix.android.api.session.room.model.ReadReceipt import im.vector.matrix.android.api.session.room.read.ReadService import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.model.ReadReceiptEntity +import im.vector.matrix.android.internal.database.model.ReadReceiptEntityFields import im.vector.matrix.android.internal.database.query.latestEvent import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.task.TaskExecutor @@ -62,10 +63,16 @@ internal class DefaultReadService(private val roomId: String, ) } - override fun readReceipt(eventId: String): ReadReceipt? { - val readReceipt = monarchy.fetchCopied { ReadReceiptEntity.where(it, roomId).findFirst() } - ?: return null - val roomMember = roomMembersService.getRoomMember(readReceipt.userId) - return ReadReceipt(roomMember, readReceipt.eventId, readReceipt.originServerTs.toLong()) + override fun readReceipts(eventId: String): List { + return monarchy.fetchAllMappedSync( + { realm -> + ReadReceiptEntity.where(realm, roomId) + .equalTo(ReadReceiptEntityFields.EVENT_ID, eventId) + }, + { + val roomMember = roomMembersService.getRoomMember(it.userId) + ReadReceipt(roomMember, it.eventId, it.originServerTs.toLong()) + } + ) } } \ No newline at end of file