Skip to content

Commit d01e2ce

Browse files
Merge pull request #6107 from nextcloud/feat/6058/markMessageAsRead
Add: mark message as read
2 parents 5dcb580 + adb2fda commit d01e2ce

5 files changed

Lines changed: 36 additions & 25 deletions

File tree

app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3451,21 +3451,27 @@ class ChatActivity :
34513451
)
34523452
}
34533453

3454-
fun markAsUnread(chatMessage: ChatMessage?) {
3455-
if (chatMessage!!.previousMessageId > NO_PREVIOUS_MESSAGE_ID) {
3456-
// previousMessageId is taken to mark chat as unread even when "chat-unread" capability is not available
3457-
// It should be checked if "chat-unread" capability is available and then use
3458-
// https://nextcloud-talk.readthedocs.io/en/latest/chat/#mark-chat-as-unread
3459-
chatViewModel.setChatReadMessage(
3460-
credentials!!,
3461-
ApiUtils.getUrlForChatReadMarker(
3462-
ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(ApiUtils.API_V1)),
3463-
conversationUser?.baseUrl!!,
3464-
roomToken
3465-
),
3466-
chatMessage.previousMessageId
3467-
)
3454+
fun markAsUnread(chatMessage: ChatMessage) {
3455+
val items = chatViewModel.uiState.value.items
3456+
val selectedIndex = items.indexOfFirst {
3457+
(it as? ChatViewModel.ChatItem.MessageItem)?.uiMessage?.id == chatMessage.jsonMessageId
3458+
}
3459+
val lastReadMessage = if (selectedIndex in 0 until items.size - 1) {
3460+
(selectedIndex + 1 until items.size)
3461+
.firstNotNullOfOrNull { (items[it] as? ChatViewModel.ChatItem.MessageItem)?.uiMessage?.id }
3462+
?: 0
3463+
} else {
3464+
0
34683465
}
3466+
chatViewModel.setChatReadMessage(
3467+
credentials!!,
3468+
ApiUtils.getUrlForChatReadMarker(
3469+
ApiUtils.getChatApiVersion(spreedCapabilities, intArrayOf(ApiUtils.API_V1)),
3470+
conversationUser.baseUrl!!,
3471+
roomToken
3472+
),
3473+
lastReadMessage
3474+
)
34693475
}
34703476

34713477
fun copyMessage(message: ChatMessage?) {
@@ -3712,10 +3718,7 @@ class ChatActivity :
37123718
// delete
37133719
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() ||
37143720
// forward
3715-
message.previousMessageId > NO_PREVIOUS_MESSAGE_ID &&
3716-
// mark as unread
3717-
ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType() &&
3718-
BuildConfig.DEBUG
3721+
ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType()
37193722

37203723
private fun isShowMessageDeletionButton(message: ChatMessage): Boolean {
37213724
val isUserAllowedByPrivileges = userAllowedByPrivilages(message)
@@ -3975,7 +3978,6 @@ class ChatActivity :
39753978
private const val FULLY_OPAQUE_INT: Int = 255
39763979
private const val SEMI_TRANSPARENT_INT: Int = 99
39773980
private const val VOICE_MESSAGE_SEEKBAR_BASE = 1000
3978-
private const val NO_PREVIOUS_MESSAGE_ID: Int = -1
39793981
private const val TOOLBAR_AVATAR_RATIO = 1.5
39803982
private const val STATUS_SIZE_IN_DP = 9f
39813983
private const val HTTP_BAD_REQUEST = 400

app/src/main/java/com/nextcloud/talk/conversationlist/viewmodels/ConversationsListViewModel.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import androidx.lifecycle.MutableLiveData
1313
import androidx.lifecycle.ViewModel
1414
import androidx.lifecycle.viewModelScope
1515
import com.nextcloud.talk.R
16-
import com.nextcloud.talk.api.NcApiCoroutines
1716
import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager
1817
import com.nextcloud.talk.contacts.ContactsRepository
1918
import com.nextcloud.talk.conversationlist.data.OfflineConversationsRepository
@@ -29,6 +28,7 @@ import com.nextcloud.talk.models.json.conversations.ConversationEnums
2928
import com.nextcloud.talk.models.json.converters.EnumActorTypeConverter
3029
import com.nextcloud.talk.models.json.participants.Participant
3130
import com.nextcloud.talk.openconversations.data.OpenConversationsRepository
31+
import com.nextcloud.talk.repositories.conversations.ConversationsRepository
3232
import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository
3333
import com.nextcloud.talk.threadsoverview.data.ThreadsRepository
3434
import com.nextcloud.talk.ui.dialog.FilterConversationFragment.Companion.ARCHIVE
@@ -76,7 +76,7 @@ class ConversationsListViewModel @Inject constructor(
7676
private val invitationsRepository: InvitationsRepository,
7777
private val arbitraryStorageManager: ArbitraryStorageManager,
7878
var userManager: UserManager,
79-
private val ncApiCoroutines: NcApiCoroutines
79+
private val conversationsRepository: ConversationsRepository
8080
) : ViewModel() {
8181

8282
private val _currentUser = currentUserProvider.currentUser.blockingGet()
@@ -584,7 +584,7 @@ class ConversationsListViewModel @Inject constructor(
584584
viewModelScope.launch {
585585
try {
586586
withContext(Dispatchers.IO) {
587-
withRetry(1) { ncApiCoroutines.setChatReadMarker(credentials, url, messageId) }
587+
withRetry(1) { conversationsRepository.markConversationAsRead(credentials, url, messageId) }
588588
}
589589
_readUnreadState.value = ConversationReadUnreadUiState.Success(conversation.displayName, true)
590590
} catch (e: Exception) {
@@ -603,7 +603,7 @@ class ConversationsListViewModel @Inject constructor(
603603
viewModelScope.launch {
604604
try {
605605
withContext(Dispatchers.IO) {
606-
withRetry(1) { ncApiCoroutines.markRoomAsUnread(credentials, url) }
606+
withRetry(1) { conversationsRepository.markConversationAsUnread(credentials, url) }
607607
}
608608
_readUnreadState.value = ConversationReadUnreadUiState.Success(conversation.displayName, false)
609609
} catch (e: Exception) {

app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepository.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,8 @@ interface ConversationsRepository {
5454
suspend fun markConversationAsImportant(credentials: String, baseUrl: String, roomToken: String): GenericOverall
5555

5656
suspend fun markConversationAsUnImportant(credentials: String, baseUrl: String, roomToken: String): GenericOverall
57+
58+
suspend fun markConversationAsRead(credentials: String, url: String, messageId: Int?): GenericOverall
59+
60+
suspend fun markConversationAsUnread(credentials: String, url: String): GenericOverall
5761
}

app/src/main/java/com/nextcloud/talk/repositories/conversations/ConversationsRepositoryImpl.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ class ConversationsRepositoryImpl(private val api: NcApi, private val coroutineA
147147
override suspend fun unbanActor(credentials: String, url: String): GenericOverall =
148148
coroutineApi.unbanActor(credentials, url)
149149

150+
override suspend fun markConversationAsRead(credentials: String, url: String, messageId: Int?): GenericOverall =
151+
coroutineApi.setChatReadMarker(credentials, url, messageId)
152+
153+
override suspend fun markConversationAsUnread(credentials: String, url: String): GenericOverall =
154+
coroutineApi.markRoomAsUnread(credentials, url)
155+
150156
companion object {
151157
const val STATUS_CODE_OK = 200
152158
}

app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ class MessageActionsDialog(
175175
canPin
176176
)
177177
initMenuMarkAsUnread(
178-
message.previousMessageId > NO_PREVIOUS_MESSAGE_ID &&
178+
hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.CHAT_READ_MARKER) &&
179179
ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType() &&
180180
isOnline
181181
)
@@ -638,7 +638,6 @@ class MessageActionsDialog(
638638
companion object {
639639
private val TAG = MessageActionsDialog::class.java.simpleName
640640
private const val ACTOR_LENGTH = 6
641-
private const val NO_PREVIOUS_MESSAGE_ID: Int = -1
642641
private const val DELAY: Long = 200
643642
private const val AGE_THRESHOLD_FOR_EDIT_MESSAGE: Long = 86400000
644643
private const val ACTOR_BOTS = "bots"

0 commit comments

Comments
 (0)