From 7f84057b86fcc36379d72a72bb96c0d68df7bbf2 Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Fri, 20 May 2022 18:32:21 +0400 Subject: [PATCH] android: add "mark read" action to chat link dropdown menu (#675) * android: add "mark read" action to chat link dropdown menu * Update apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> --- .../java/chat/simplex/app/model/ChatModel.kt | 14 ++++--- .../chat/simplex/app/views/chat/ChatView.kt | 4 +- .../app/views/chatlist/ChatListNavLinkView.kt | 37 +++++++++++++++++-- .../app/src/main/res/values-ru/strings.xml | 1 + .../app/src/main/res/values/strings.xml | 1 + apps/ios/Shared/Views/Chat/ChatView.swift | 2 +- 6 files changed, 46 insertions(+), 13 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt index 797fafc81..7f7c8ec89 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt @@ -200,7 +200,15 @@ class ChatModel(val controller: ChatController) { } fun markChatItemsRead(cInfo: ChatInfo) { + // update preview val chatIdx = getChatIndex(cInfo.id) + if (chatIdx >= 0) { + val chat = chats[chatIdx] + val lastId = chat.chatItems.lastOrNull()?.id + if (lastId != null) { + chats[chatIdx] = chat.copy(chatStats = chat.chatStats.copy(unreadCount = 0, minUnreadItemId = lastId + 1)) + } + } // update current chat if (chatId.value == cInfo.id) { var i = 0 @@ -211,12 +219,6 @@ class ChatModel(val controller: ChatController) { } i += 1 } - val chat = chats[chatIdx] - val pItem = chat.chatItems.lastOrNull() - chats[chatIdx] = chat.copy( - chatItems = if (pItem == null) arrayListOf() else arrayListOf(pItem.withStatus(CIStatus.RcvRead())), - chatStats = chat.chatStats.copy(unreadCount = 0, minUnreadItemId = chat.chatItems.last().id + 1) - ) } } diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt index 583029e35..5570d792e 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatView.kt @@ -57,8 +57,8 @@ fun ChatView(chatModel: ChatModel) { // TODO a more advanced version would mark as read only if in view LaunchedEffect(chat.chatItems) { Log.d(TAG, "ChatView ${chatModel.chatId.value}: LaunchedEffect") - delay(1000L) - if (chat.chatItems.count() > 0) { + delay(750L) + if (chat.chatItems.isNotEmpty()) { chatModel.markChatItemsRead(chat.chatInfo) chatModel.controller.cancelNotificationsForChat(chat.id) withApi { diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListNavLinkView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListNavLinkView.kt index be1e79fb7..7d7832993 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListNavLinkView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chatlist/ChatListNavLinkView.kt @@ -28,14 +28,14 @@ fun ChatListNavLinkView(chat: Chat, chatModel: ChatModel) { ChatListNavLinkLayout( chatLinkPreview = { ChatPreviewView(chat) }, click = { openOrPendingChat(chat.chatInfo, chatModel) }, - dropdownMenuItems = { ContactMenuItems(chat.chatInfo, chatModel, showMenu) }, + dropdownMenuItems = { ContactMenuItems(chat.chatInfo, chatModel, showMenu, markRead = { markChatRead(chat, chatModel) }) }, showMenu ) is ChatInfo.Group -> ChatListNavLinkLayout( chatLinkPreview = { ChatPreviewView(chat) }, click = { openOrPendingChat(chat.chatInfo, chatModel) }, - dropdownMenuItems = { GroupMenuItems(chat.chatInfo, chatModel, showMenu) }, + dropdownMenuItems = { GroupMenuItems(chat.chatInfo, chatModel, showMenu, markRead = { markChatRead(chat, chatModel) }) }, showMenu ) is ChatInfo.ContactRequest -> @@ -73,7 +73,15 @@ suspend fun openChat(chatInfo: ChatInfo, chatModel: ChatModel) { } @Composable -fun ContactMenuItems(chatInfo: ChatInfo.Direct, chatModel: ChatModel, showMenu: MutableState) { +fun ContactMenuItems(chatInfo: ChatInfo.Direct, chatModel: ChatModel, showMenu: MutableState, markRead: () -> Unit) { + ItemAction( + stringResource(R.string.mark_read), + Icons.Outlined.Check, + onClick = { + markRead() + showMenu.value = false + } + ) ItemAction( stringResource(R.string.clear_verb), Icons.Outlined.Restore, @@ -94,7 +102,15 @@ fun ContactMenuItems(chatInfo: ChatInfo.Direct, chatModel: ChatModel, showMenu: } @Composable -fun GroupMenuItems(chatInfo: ChatInfo.Group, chatModel: ChatModel, showMenu: MutableState) { +fun GroupMenuItems(chatInfo: ChatInfo.Group, chatModel: ChatModel, showMenu: MutableState, markRead: () -> Unit) { + ItemAction( + stringResource(R.string.mark_read), + Icons.Outlined.Check, + onClick = { + markRead() + showMenu.value = false + } + ) ItemAction( stringResource(R.string.clear_verb), Icons.Outlined.Restore, @@ -139,6 +155,19 @@ fun ContactConnectionMenuItems(chatInfo: ChatInfo.ContactConnection, chatModel: ) } +fun markChatRead(chat: Chat, chatModel: ChatModel) { + if (chat.chatItems.isNotEmpty()) { + chatModel.markChatItemsRead(chat.chatInfo) + withApi { + chatModel.controller.apiChatRead( + chat.chatInfo.chatType, + chat.chatInfo.apiId, + CC.ItemRange(chat.chatStats.minUnreadItemId, chat.chatItems.last().id) + ) + } + } +} + fun deleteContactDialog(contact: ChatInfo.Direct, chatModel: ChatModel) { AlertManager.shared.showAlertMsg( title = generalGetString(R.string.delete_contact__question), diff --git a/apps/android/app/src/main/res/values-ru/strings.xml b/apps/android/app/src/main/res/values-ru/strings.xml index 5c1769341..78a24fe24 100644 --- a/apps/android/app/src/main/res/values-ru/strings.xml +++ b/apps/android/app/src/main/res/values-ru/strings.xml @@ -173,6 +173,7 @@ Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для вас. Очистить Очистить разговор + Прочитано Вы пригласили ваш контакт diff --git a/apps/android/app/src/main/res/values/strings.xml b/apps/android/app/src/main/res/values/strings.xml index 6ed5cad3f..0bb3c800b 100644 --- a/apps/android/app/src/main/res/values/strings.xml +++ b/apps/android/app/src/main/res/values/strings.xml @@ -174,6 +174,7 @@ All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you. Clear Clear conversation + Mark read You invited your contact diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index cbfee48a9..d19cb4baf 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -230,7 +230,7 @@ struct ChatView: View { } func markAllRead() { - DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.75) { if chatModel.chatId == chat.id { Task { await markChatRead(chat) } }