From cdff0a61f29145359fec9cde3237311977080915 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 17 Nov 2022 15:26:06 -0500 Subject: [PATCH] Change chat badge to show total unread message count. --- .../securesms/database/ThreadDatabase.kt | 36 +++++++++++++++++++ .../tabs/ConversationListTabRepository.kt | 7 ++-- .../tabs/ConversationListTabsFragment.kt | 4 +-- .../stories/tabs/ConversationListTabsState.kt | 2 +- .../tabs/ConversationListTabsViewModel.kt | 4 +-- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.kt index 617a9cc7fe..9e01fac2c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.kt @@ -512,6 +512,42 @@ class ThreadDatabase(context: Context, databaseHelper: SignalDatabase) : Databas } } + /** + * Returns the number of unread messages across all threads. + * Threads that are forced-unread count as 1. + */ + fun getUnreadMessageCount(): Long { + val allCount: Long = readableDatabase + .select("SUM($UNREAD_COUNT)") + .from(TABLE_NAME) + .run() + .use { cursor -> + if (cursor.moveToFirst()) { + cursor.getLong(0) + } else { + 0 + } + } + + val forcedUnreadCount: Long = readableDatabase + .select("COUNT(*)") + .from(TABLE_NAME) + .where("$READ = ?", ReadStatus.FORCED_UNREAD.serialize()) + .run() + .use { cursor -> + if (cursor.moveToFirst()) { + cursor.getLong(0) + } else { + 0 + } + } + + return allCount + forcedUnreadCount + } + + /** + * Returns the number of unread messages in a given thread. + */ fun getUnreadMessageCount(threadId: Long): Long { return readableDatabase .select(UNREAD_COUNT) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabRepository.kt index 8792e600df..904f4162c1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabRepository.kt @@ -14,13 +14,10 @@ class ConversationListTabRepository { private val TAG = Log.tag(ConversationListTabRepository::class.java) } - fun getNumberOfUnreadConversations(): Observable { + fun getNumberOfUnreadMessages(): Observable { return Observable.create { fun refresh() { - it.onNext(SignalDatabase.threads.getUnreadThreadCount()) - - val ids = SignalDatabase.threads.getUnreadThreadIdList() - Log.d(TAG, "Unread threads: { $ids }") + it.onNext(SignalDatabase.threads.getUnreadMessageCount()) } val listener = DatabaseObserver.Observer { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt index 0ed6e824d8..6eb586dcea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt @@ -91,8 +91,8 @@ class ConversationListTabsFragment : Fragment(R.layout.conversation_list_tabs) { runPillAnimation(150, chatsPill, storiesPill) } - chatsUnreadIndicator.visible = state.unreadChatsCount > 0 - chatsUnreadIndicator.text = formatCount(state.unreadChatsCount) + chatsUnreadIndicator.visible = state.unreadMessagesCount > 0 + chatsUnreadIndicator.text = formatCount(state.unreadMessagesCount) storiesUnreadIndicator.visible = state.unreadStoriesCount > 0 storiesUnreadIndicator.text = formatCount(state.unreadStoriesCount) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsState.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsState.kt index fb6cb538c4..daf944eff9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsState.kt @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.stories.tabs data class ConversationListTabsState( val tab: ConversationListTab = ConversationListTab.CHATS, val prevTab: ConversationListTab = ConversationListTab.STORIES, - val unreadChatsCount: Long = 0L, + val unreadMessagesCount: Long = 0L, val unreadStoriesCount: Long = 0L, val visibilityState: VisibilityState = VisibilityState() ) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt index 5c24a90e3f..9d27929163 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt @@ -23,8 +23,8 @@ class ConversationListTabsViewModel(repository: ConversationListTabRepository) : val tabClickEvents: Observable = internalTabClickEvents.filter { Stories.isFeatureEnabled() } init { - disposables += repository.getNumberOfUnreadConversations().subscribe { unreadChats -> - store.update { it.copy(unreadChatsCount = unreadChats) } + disposables += repository.getNumberOfUnreadMessages().subscribe { unreadChats -> + store.update { it.copy(unreadMessagesCount = unreadChats) } } disposables += repository.getNumberOfUnseenStories().subscribe { unseenStories ->