diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt index c501553f52..7e61333933 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt @@ -51,6 +51,11 @@ interface ReadService { */ suspend fun setMarkedUnread(markedUnread: Boolean) + /** + * Change the explicitly set unread marker flag + */ + suspend fun setMarkedUnreadFlag(markedUnread: Boolean) + /** * Check if an event is already read, ie. your read receipt is set on a more recent event. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt index 6cb269fa5e..29ef957df8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt @@ -80,7 +80,7 @@ internal class DefaultReadService @AssistedInject constructor( } } - private suspend fun setMarkedUnreadFlag(markedUnread: Boolean) { + override suspend fun setMarkedUnreadFlag(markedUnread: Boolean) { val params = SetMarkedUnreadTask.Params(roomId, markedUnread = markedUnread) setMarkedUnreadTask.execute(params) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt index 2165b6dba4..9734ec6097 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt @@ -195,10 +195,14 @@ class TimelineViewModel @AssistedInject constructor( setupPreviewUrlObservers() room.getRoomSummaryLive() viewModelScope.launch(Dispatchers.IO) { - if (!loadRoomAtFirstUnread()) { - tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.READ_RECEIPT) } + if (loadRoomAtFirstUnread()) { + if (vectorPreferences.readReceiptFollowsReadMarker()) { + tryOrNull { room.setMarkedUnreadFlag(false) } + } else { + tryOrNull { room.setMarkedUnread(false) } + } } else { - tryOrNull { room.setMarkedUnread(false) } + tryOrNull { room.markAsRead(ReadService.MarkAsReadParams.READ_RECEIPT) } } } // Inform the SDK that the room is displayed diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index d21076a4b9..d04988a2d7 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -217,6 +217,7 @@ class VectorPreferences @Inject constructor(private val context: Context, privat private const val SETTINGS_ENABLE_SPACE_PAGER = "SETTINGS_ENABLE_SPACE_PAGER" private const val SETTINGS_NOTIF_ONLY_ALERT_ONCE = "SETTINGS_NOTIF_ONLY_ALERT_ONCE" private const val SETTINGS_HIDE_CALL_BUTTONS = "SETTINGS_HIDE_CALL_BUTTONS" + private const val SETTINGS_READ_RECEIPT_FOLLOWS_READ_MARKER = "SETTINGS_READ_RECEIPT_FOLLOWS_READ_MARKER" private const val DID_ASK_TO_ENABLE_SESSION_PUSH = "DID_ASK_TO_ENABLE_SESSION_PUSH" @@ -1089,6 +1090,11 @@ class VectorPreferences @Inject constructor(private val context: Context, privat return defaultPrefs.getBoolean(SETTINGS_HIDE_CALL_BUTTONS, false) } + // SC addition + fun readReceiptFollowsReadMarker(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_READ_RECEIPT_FOLLOWS_READ_MARKER, false) + } + /** * I likely do more fresh installs of the app than anyone else, so a shortcut to change some of the default settings to * my preferred values can safe me some time @@ -1112,6 +1118,7 @@ class VectorPreferences @Inject constructor(private val context: Context, privat .putBoolean(SETTINGS_UNIFIED_PUSH_FORCE_CUSTOM_GATEWAY, true) .putBoolean(SETTINGS_AGGREGATE_UNREAD_COUNTS, false) .putBoolean(SETTINGS_ENABLE_SPACE_PAGER, true) + .putBoolean(SETTINGS_READ_RECEIPT_FOLLOWS_READ_MARKER, true) .apply() } diff --git a/vector/src/main/res/values/strings_sc.xml b/vector/src/main/res/values/strings_sc.xml index 26dd0ef67d..0025119d86 100644 --- a/vector/src/main/res/values/strings_sc.xml +++ b/vector/src/main/res/values/strings_sc.xml @@ -183,4 +183,7 @@ Element features Room list Timeline + + Only mark chats as read if fully read + Do not update your read receipt when opening the room, but only gradually while reading diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index f2403593c3..ad53514dc8 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -29,6 +29,13 @@ android:title="@string/settings_open_chats_at_first_unread" android:summary="@string/settings_open_chats_at_first_unread_summary" /> + +