Skip to content

Commit 30de714

Browse files
authored
Merge pull request #5187 from nextcloud/feature/3074/messageThreads2
hide thread messages in normal chat / include threadId in fieldMap ...
2 parents 479bbc8 + 7fda688 commit 30de714

File tree

8 files changed

+115
-21
lines changed

8 files changed

+115
-21
lines changed

app/src/androidTest/java/com/nextcloud/talk/data/database/dao/ChatBlocksDaoTest.kt

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.junit.Assert.assertEquals
2525
import org.junit.Before
2626
import org.junit.Test
2727
import org.junit.runner.RunWith
28+
import java.lang.Boolean
2829

2930
@RunWith(AndroidJUnit4::class)
3031
class ChatBlocksDaoTest {
@@ -49,6 +50,73 @@ class ChatBlocksDaoTest {
4950
@After
5051
fun closeDb() = db.close()
5152

53+
@Test
54+
fun testGetChatBlocksContainingMessageId() =
55+
runTest {
56+
val user = createUserEntity("account1", "Account 1")
57+
usersDao.saveUser(user)
58+
val account1 = usersDao.getUserWithUserId("account1").blockingGet()
59+
60+
conversationsDao.upsertConversations(
61+
listOf(
62+
createConversationEntity(
63+
accountId = account1.id,
64+
"abc",
65+
roomName = "Conversation One"
66+
),
67+
createConversationEntity(
68+
accountId = account1.id,
69+
"def",
70+
roomName = "Conversation Two"
71+
)
72+
)
73+
)
74+
75+
val conversation1 = conversationsDao.getConversationsForUser(account1.id).first()[0]
76+
77+
val chatBlock1 = ChatBlockEntity(
78+
internalConversationId = conversation1.internalId,
79+
accountId = conversation1.accountId,
80+
token = conversation1.token,
81+
threadId = 123,
82+
oldestMessageId = 50,
83+
newestMessageId = 60,
84+
hasHistory = true
85+
)
86+
87+
val chatBlock2 = ChatBlockEntity(
88+
internalConversationId = conversation1.internalId,
89+
accountId = conversation1.accountId,
90+
token = conversation1.token,
91+
threadId = 123,
92+
oldestMessageId = 10,
93+
newestMessageId = 20,
94+
hasHistory = true
95+
)
96+
97+
val chatBlock3 = ChatBlockEntity(
98+
internalConversationId = conversation1.internalId,
99+
accountId = conversation1.accountId,
100+
token = conversation1.token,
101+
threadId = null,
102+
oldestMessageId = 50,
103+
newestMessageId = 60,
104+
hasHistory = true
105+
)
106+
107+
chatBlocksDao.upsertChatBlock(chatBlock1)
108+
chatBlocksDao.upsertChatBlock(chatBlock2)
109+
chatBlocksDao.upsertChatBlock(chatBlock3)
110+
111+
val chatBlocksOfThread = chatBlocksDao.getChatBlocksContainingMessageId(
112+
internalConversationId = conversation1.internalId,
113+
threadId = 123,
114+
messageId = 55
115+
)
116+
117+
assertEquals(1, chatBlocksOfThread.first().size)
118+
}
119+
52120
@Test
53121
fun testGetConnectedChatBlocks() =
54122
runTest {
@@ -266,8 +334,8 @@ class ChatBlocksDaoTest {
266334
serverVersion = null,
267335
clientCertificate = null,
268336
externalSignalingServer = null,
269-
current = java.lang.Boolean.FALSE,
270-
scheduledForDeletion = java.lang.Boolean.FALSE
337+
current = Boolean.FALSE,
338+
scheduledForDeletion = Boolean.FALSE
271339
)
272340

273341
private fun createConversationEntity(accountId: Long, token: String, roomName: String) =

app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
168168
binding.messageQuote.quotedChatMessageView.visibility =
169169
if (!message.isDeleted &&
170170
message.parentMessageId != null &&
171-
message.parentMessageId != chatActivity.threadId
171+
message.parentMessageId != chatActivity.conversationThreadId
172172
) {
173173
processParentMessage(message)
174174
View.VISIBLE

app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class OutcomingTextMessageViewHolder(itemView: View) :
183183
binding.messageQuote.quotedChatMessageView.visibility =
184184
if (!message.isDeleted &&
185185
message.parentMessageId != null &&
186-
message.parentMessageId != chatActivity.threadId
186+
message.parentMessageId != chatActivity.conversationThreadId
187187
) {
188188
processParentMessage(message)
189189
View.VISIBLE

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

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,8 @@ class ChatActivity :
353353

354354
var sessionIdAfterRoomJoined: String? = null
355355
lateinit var roomToken: String
356-
var threadId: Long? = null
357-
var threadInfo: ThreadInfo? = null
356+
var conversationThreadId: Long? = null
357+
var conversationThreadInfo: ThreadInfo? = null
358358
var conversationUser: User? = null
359359
lateinit var spreedCapabilities: SpreedCapability
360360
var chatApiVersion: Int = 1
@@ -506,10 +506,10 @@ class ChatActivity :
506506
credentials!!,
507507
urlForChatting,
508508
roomToken,
509-
threadId
509+
conversationThreadId
510510
)
511511

512-
threadId?.let {
512+
conversationThreadId?.let {
513513
val threadUrl = ApiUtils.getUrlForThread(
514514
version = 1,
515515
baseUrl = conversationUser!!.baseUrl,
@@ -571,7 +571,7 @@ class ChatActivity :
571571

572572
roomToken = extras?.getString(KEY_ROOM_TOKEN).orEmpty()
573573

574-
threadId = if (extras?.containsKey(KEY_THREAD_ID) == true) {
574+
conversationThreadId = if (extras?.containsKey(KEY_THREAD_ID) == true) {
575575
extras.getLong(KEY_THREAD_ID)
576576
} else {
577577
null
@@ -966,6 +966,7 @@ class ChatActivity :
966966
var chatMessageList = triple.third
967967

968968
chatMessageList = handleSystemMessages(chatMessageList)
969+
chatMessageList = handleThreadMessages(chatMessageList)
969970
if (chatMessageList.isEmpty()) {
970971
return@onEach
971972
}
@@ -1296,7 +1297,7 @@ class ChatActivity :
12961297
}
12971298

12981299
is ChatViewModel.ThreadRetrieveUiState.Success -> {
1299-
threadInfo = uiState.thread
1300+
conversationThreadInfo = uiState.thread
13001301
}
13011302
}
13021303
}
@@ -2668,7 +2669,7 @@ class ChatActivity :
26682669

26692670
title.text =
26702671
if (isChatThread()) {
2671-
threadInfo?.first?.message
2672+
conversationThreadInfo?.first?.message
26722673
} else if (currentConversation?.displayName != null) {
26732674
try {
26742675
EmojiCompat.get().process(currentConversation?.displayName as CharSequence).toString()
@@ -2683,7 +2684,7 @@ class ChatActivity :
26832684
if (isChatThread()) {
26842685
val repliesAmountTitle = String.format(
26852686
resources.getString(R.string.thread_replies_amount),
2686-
threadInfo?.thread?.numReplies
2687+
conversationThreadInfo?.thread?.numReplies
26872688
)
26882689
statusMessageViewContents(repliesAmountTitle)
26892690
} else if (currentConversation?.type == ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) {
@@ -3455,7 +3456,7 @@ class ChatActivity :
34553456
}
34563457

34573458
private fun handleSystemMessages(chatMessageList: List<ChatMessage>): List<ChatMessage> {
3458-
val chatMessageMap = chatMessageList.map { it.id to it }.toMap().toMutableMap()
3459+
val chatMessageMap = chatMessageList.associateBy { it.id }.toMutableMap()
34593460

34603461
val chatMessageIterator = chatMessageMap.iterator()
34613462
while (chatMessageIterator.hasNext()) {
@@ -3464,7 +3465,8 @@ class ChatActivity :
34643465
if (isInfoMessageAboutDeletion(currentMessage) ||
34653466
isReactionsMessage(currentMessage) ||
34663467
isPollVotedMessage(currentMessage) ||
3467-
isEditMessage(currentMessage)
3468+
isEditMessage(currentMessage) ||
3469+
isThreadCreatedMessage(currentMessage)
34683470
) {
34693471
chatMessageIterator.remove()
34703472
}
@@ -3473,7 +3475,7 @@ class ChatActivity :
34733475
}
34743476

34753477
private fun handleExpandableSystemMessages(chatMessageList: List<ChatMessage>): List<ChatMessage> {
3476-
val chatMessageMap = chatMessageList.map { it.id to it }.toMap().toMutableMap()
3478+
val chatMessageMap = chatMessageList.associateBy { it.id }.toMutableMap()
34773479
val chatMessageIterator = chatMessageMap.iterator()
34783480
while (chatMessageIterator.hasNext()) {
34793481
val currentMessage = chatMessageIterator.next()
@@ -3496,6 +3498,23 @@ class ChatActivity :
34963498
return chatMessageMap.values.toList()
34973499
}
34983500

3501+
private fun handleThreadMessages(chatMessageList: List<ChatMessage>): List<ChatMessage> {
3502+
val chatMessageMap = chatMessageList.associateBy { it.id }.toMutableMap()
3503+
3504+
if (conversationThreadId == null) {
3505+
val chatMessageIterator = chatMessageMap.iterator()
3506+
while (chatMessageIterator.hasNext()) {
3507+
val currentMessage = chatMessageIterator.next()
3508+
3509+
if (currentMessage.value.isThread) {
3510+
chatMessageIterator.remove()
3511+
}
3512+
}
3513+
}
3514+
3515+
return chatMessageMap.values.toList()
3516+
}
3517+
34993518
private fun isInfoMessageAboutDeletion(currentMessage: MutableMap.MutableEntry<String, ChatMessage>): Boolean =
35003519
currentMessage.value.parentMessageId != null &&
35013520
currentMessage.value.systemMessageType == ChatMessage
@@ -3506,6 +3525,9 @@ class ChatActivity :
35063525
currentMessage.value.systemMessageType == ChatMessage.SystemMessageType.REACTION_DELETED ||
35073526
currentMessage.value.systemMessageType == ChatMessage.SystemMessageType.REACTION_REVOKED
35083527

3528+
private fun isThreadCreatedMessage(currentMessage: MutableMap.MutableEntry<String, ChatMessage>): Boolean =
3529+
currentMessage.value.systemMessageType == ChatMessage.SystemMessageType.THREAD_CREATED
3530+
35093531
private fun isEditMessage(currentMessage: MutableMap.MutableEntry<String, ChatMessage>): Boolean =
35103532
currentMessage.value.parentMessageId != null &&
35113533
currentMessage.value.systemMessageType == ChatMessage
@@ -4202,7 +4224,7 @@ class ChatActivity :
42024224
}
42034225
}
42044226

4205-
private fun isChatThread(): Boolean = threadId != null && threadId!! > 0
4227+
private fun isChatThread(): Boolean = conversationThreadId != null && conversationThreadId!! > 0
42064228

42074229
fun openThread(messageId: Long) {
42084230
val bundle = Bundle()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ class MessageInputFragment : Fragment() {
860860
.findViewById<RelativeLayout>(R.id.quotedChatMessageView)?.tag as Int? ?: 0
861861

862862
if (replyMessageId == 0) {
863-
replyMessageId = chatActivity.threadInfo?.thread?.id ?: 0
863+
replyMessageId = chatActivity.conversationThreadInfo?.thread?.id ?: 0
864864
}
865865

866866
sendMessage(

app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,11 @@ class OfflineFirstChatRepository @Inject constructor(
465465
fieldMap["lastCommonReadId"] = it
466466
}
467467

468+
threadId?.let { fieldMap["threadId"] = it.toInt() }
469+
468470
fieldMap["timeout"] = timeout
469471
fieldMap["limit"] = limit
472+
470473
fieldMap["lookIntoFuture"] = if (lookIntoFuture) 1 else 0
471474
fieldMap["setReadMarker"] = if (setReadMarker) 1 else 0
472475

app/src/main/java/com/nextcloud/talk/threadsoverview/ThreadsOverviewActivity.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ class ThreadsOverviewActivity : BaseActivity() {
6969

7070
lateinit var threadsOverviewViewModel: ThreadsOverviewViewModel
7171

72+
var roomToken: String = ""
73+
7274
override fun onCreate(savedInstanceState: Bundle?) {
7375
super.onCreate(savedInstanceState)
7476
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
@@ -80,9 +82,7 @@ class ThreadsOverviewActivity : BaseActivity() {
8082
val colorScheme = viewThemeUtils.getColorScheme(this)
8183

8284
val extras: Bundle? = intent.extras
83-
val roomToken = extras?.getString(KEY_ROOM_TOKEN).orEmpty()
84-
85-
threadsOverviewViewModel.init(roomToken)
85+
roomToken = extras?.getString(KEY_ROOM_TOKEN).orEmpty()
8686

8787
setContent {
8888
val backgroundColor = colorResource(id = R.color.bg_default)
@@ -136,6 +136,7 @@ class ThreadsOverviewActivity : BaseActivity() {
136136
override fun onResume() {
137137
super.onResume()
138138
supportActionBar?.show()
139+
threadsOverviewViewModel.init(roomToken)
139140
}
140141

141142
companion object {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class MessageActionsDialog(
152152
isOnline
153153
)
154154
initMenuStartThread(!message.isThread)
155-
initMenuOpenThread(message.isThread && chatActivity.threadId == null)
155+
initMenuOpenThread(message.isThread && chatActivity.conversationThreadId == null)
156156
initMenuEditMessage(isMessageEditable)
157157
initMenuDeleteMessage(showMessageDeletionButton && isOnline)
158158
initMenuForwardMessage(

0 commit comments

Comments
 (0)