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>
This commit is contained in:
JRoberts
2022-05-20 18:32:21 +04:00
committed by GitHub
parent 718c8f826a
commit 7f84057b86
6 changed files with 46 additions and 13 deletions

View File

@@ -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)
)
}
}

View File

@@ -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 {

View File

@@ -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<Boolean>) {
fun ContactMenuItems(chatInfo: ChatInfo.Direct, chatModel: ChatModel, showMenu: MutableState<Boolean>, 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<Boolean>) {
fun GroupMenuItems(chatInfo: ChatInfo.Group, chatModel: ChatModel, showMenu: MutableState<Boolean>, 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),

View File

@@ -173,6 +173,7 @@
<string name="clear_chat_warning">Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для вас.</string>
<string name="clear_verb">Очистить</string>
<string name="clear_chat_button">Очистить разговор</string>
<string name="mark_read">Прочитано</string>
<!-- Pending contact connection alert dialogues -->
<string name="you_invited_your_contact">Вы пригласили ваш контакт</string>

View File

@@ -174,6 +174,7 @@
<string name="clear_chat_warning">All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.</string>
<string name="clear_verb">Clear</string>
<string name="clear_chat_button">Clear conversation</string>
<string name="mark_read">Mark read</string>
<!-- Pending contact connection alert dialogues -->
<string name="you_invited_your_contact">You invited your contact</string>

View File

@@ -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) }
}