From 53c6511d007280747e89635c2ce45f9e30567c1f Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Fri, 18 Jul 2025 09:17:56 -0500 Subject: [PATCH] updated tests + make logic async + removed old code Signed-off-by: rapterjet2004 --- .../data/database/dao/ChatBlocksDaoTest.kt | 2 + .../data/database/dao/ChatMessagesDaoTest.kt | 1 + .../talk/chat/MessageInputFragment.kt | 44 +++++++++---------- .../talk/chat/viewmodels/ChatViewModel.kt | 4 +- .../ConversationsListActivity.kt | 10 ----- .../data/database/dao/ConversationsDao.kt | 6 +-- .../utils/preview/ComposePreviewUtilsDaos.kt | 2 +- 7 files changed, 27 insertions(+), 42 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt b/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt index 4f2f39971..284b33912 100644 --- a/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt +++ b/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt @@ -57,6 +57,7 @@ class ChatBlocksDaoTest { val account1 = usersDao.getUserWithUserId("account1").blockingGet() conversationsDao.upsertConversations( + account1.id, listOf( createConversationEntity( accountId = account1.id, @@ -182,6 +183,7 @@ class ChatBlocksDaoTest { val account1 = usersDao.getUserWithUserId("account1").blockingGet() conversationsDao.upsertConversations( + account1.id, listOf( createConversationEntity( accountId = account1.id, diff --git a/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatMessagesDaoTest.kt b/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatMessagesDaoTest.kt index 424b932b0..6bcce26f8 100644 --- a/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatMessagesDaoTest.kt +++ b/app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatMessagesDaoTest.kt @@ -66,6 +66,7 @@ class ChatMessagesDaoTest { // Problem: lets say we want to update the conv list -> We don#t know the primary keys! // with account@token that would be easier! conversationsDao.upsertConversations( + account1.id, listOf( createConversationEntity( accountId = account1.id, diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index fb15c9ad5..859138292 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -81,10 +81,12 @@ import com.nextcloud.talk.utils.message.MessageUtils import com.nextcloud.talk.utils.text.Spans import com.otaliastudios.autocomplete.Autocomplete import com.vanniktech.emoji.EmojiPopup +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext import java.util.Objects import javax.inject.Inject @@ -111,10 +113,6 @@ class MessageInputFragment : Fragment() { private const val CONNECTION_ESTABLISHED_ANIM_DURATION: Long = 3000 private const val FULLY_OPAQUE: Float = 1.0f private const val FULLY_TRANSPARENT: Float = 0.0f - const val QUOTED_MESSAGE_TEXT = "QUOTED_MESSAGE_TEXT" - const val QUOTED_MESSAGE_ID = "QUOTED_MESSAGE_ID" - const val QUOTED_MESSAGE_URL = "QUOTED_MESSAGE_URL" - const val QUOTED_MESSAGE_NAME = "QUOTED_MESSAGE_NAME" } @Inject @@ -164,10 +162,6 @@ class MessageInputFragment : Fragment() { return binding.root } - override fun onPause() { - super.onPause() - } - override fun onDestroyView() { super.onDestroyView() if (mentionAutocomplete != null && mentionAutocomplete!!.isPopupShowing) { @@ -306,24 +300,26 @@ class MessageInputFragment : Fragment() { } private fun restoreState() { - runBlocking { + CoroutineScope(Dispatchers.IO).launch { chatActivity.chatViewModel.updateMessageDraft() - } - val draft = chatActivity.chatViewModel.messageDraft - binding.fragmentMessageInputView.messageInput.setText(draft.messageText) - binding.fragmentMessageInputView.messageInput.setSelection(draft.messageCursor) - if (draft.messageText != "") { - binding.fragmentMessageInputView.messageInput.requestFocus() - } + withContext(Dispatchers.Main) { + val draft = chatActivity.chatViewModel.messageDraft + binding.fragmentMessageInputView.messageInput.setText(draft.messageText) + binding.fragmentMessageInputView.messageInput.setSelection(draft.messageCursor) + if (draft.messageText != "") { + binding.fragmentMessageInputView.messageInput.requestFocus() + } - if (isInReplyState()) { - replyToMessage( - chatActivity.chatViewModel.messageDraft.quotedMessageText, - chatActivity.chatViewModel.messageDraft.quotedDisplayName, - chatActivity.chatViewModel.messageDraft.quotedImageUrl, - chatActivity.chatViewModel.messageDraft.quotedJsonId ?: 0 - ) + if (isInReplyState()) { + replyToMessage( + chatActivity.chatViewModel.messageDraft.quotedMessageText, + chatActivity.chatViewModel.messageDraft.quotedDisplayName, + chatActivity.chatViewModel.messageDraft.quotedImageUrl, + chatActivity.chatViewModel.messageDraft.quotedJsonId ?: 0 + ) + } + } } } diff --git a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt index 5e652dc2f..e0c97381b 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt @@ -61,7 +61,6 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import java.io.File import javax.inject.Inject @@ -113,7 +112,7 @@ class ChatViewModel @Inject constructor( chatRepository.handleOnPause() mediaPlayerManager.handleOnPause() - runBlocking(Dispatchers.IO) { + CoroutineScope(Dispatchers.IO).launch { val model = conversationRepository.getLocallyStoredConversation(chatRoomToken) model?.let { it.messageDraft = messageDraft @@ -295,6 +294,7 @@ class ChatViewModel @Inject constructor( fun initData(credentials: String, urlForChatting: String, roomToken: String, threadId: Long?) { chatRepository.initData(credentials, urlForChatting, roomToken, threadId) + chatRoomToken = roomToken } fun updateConversation(currentConversation: ConversationModel) { diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index e9665f444..4cb7e1951 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -307,16 +307,6 @@ class ConversationsListActivity : showNotificationWarning() showShareToScreen = hasActivityActionSendIntent() - // context.getSharedPreferences( - // CHAT_ACTIVITY_LOCAL_NAME, - // MODE_PRIVATE - // ).edit().apply { - // putInt(QUOTED_MESSAGE_ID, -1) - // putString(QUOTED_MESSAGE_NAME, null) - // putString(QUOTED_MESSAGE_TEXT, "") - // putString(QUOTED_MESSAGE_URL, null) - // apply() - // } if (!eventBus.isRegistered(this)) { eventBus.register(this) diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/ConversationsDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/ConversationsDao.kt index ef3681d22..621207ccc 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/ConversationsDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/ConversationsDao.kt @@ -13,7 +13,6 @@ import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.Query import androidx.room.Transaction import androidx.room.Update -import androidx.room.Upsert import com.nextcloud.talk.data.database.model.ConversationEntity import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first @@ -26,15 +25,12 @@ interface ConversationsDao { @Query("SELECT * FROM Conversations where accountId = :accountId AND token = :token") fun getConversationForUser(accountId: Long, token: String): Flow - @Upsert() - fun upsertConversations(conversationEntities: List) - @Transaction suspend fun upsertConversations(accountId: Long, serverItems: List) { serverItems.forEach { serverItem -> val existingItem = getConversationForUser(accountId, serverItem.token).first() if (existingItem != null) { - val mergedItem = serverItem + val mergedItem = serverItem.copy() mergedItem.messageDraft = existingItem.messageDraft updateConversation(mergedItem) } else { diff --git a/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtilsDaos.kt b/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtilsDaos.kt index d605b68c1..2ee67c08d 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtilsDaos.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/preview/ComposePreviewUtilsDaos.kt @@ -192,7 +192,7 @@ class DummyConversationDaoImpl : ConversationsDao { override fun getConversationForUser(accountId: Long, token: String): Flow = flowOf() - override fun upsertConversations(conversationEntities: List) { /* */ } + override suspend fun upsertConversations(accountId: Long, serverItems: List) { /* */ } override fun deleteConversations(conversationIds: List) { /* */ }