Skip to content

Commit 23d4e96

Browse files
authored
Merge pull request #5843 from nextcloud/fix/filterMessages
More improvements to scheduled messages
2 parents 5256a44 + c14b50b commit 23d4e96

3 files changed

Lines changed: 117 additions & 20 deletions

File tree

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3503,6 +3503,10 @@ class ChatActivity :
35033503
val intent = Intent(this, ScheduledMessagesActivity::class.java).apply {
35043504
putExtra(ScheduledMessagesActivity.ROOM_TOKEN, roomToken)
35053505
putExtra(ScheduledMessagesActivity.CONVERSATION_NAME, currentConversation?.displayName.orEmpty())
3506+
if (conversationThreadId != null && conversationThreadId!! > 0) {
3507+
putExtra(ScheduledMessagesActivity.THREAD_ID, conversationThreadId)
3508+
putExtra(ScheduledMessagesActivity.THREAD_TITLE, conversationThreadInfo?.thread?.title.orEmpty())
3509+
}
35063510
}
35073511
startActivity(intent)
35083512
}
@@ -3548,12 +3552,20 @@ class ChatActivity :
35483552
if (!this::spreedCapabilities.isInitialized) {
35493553
return
35503554
}
3551-
chatViewModel.loadScheduledMessages(
3552-
conversationUser.getCredentials(),
3555+
val scheduledMessagesUrl = if (isChatThread()) {
3556+
ApiUtils.getUrlForScheduledMessages(
3557+
conversationUser.baseUrl!!,
3558+
roomToken
3559+
) + "?threadId=${conversationThreadId ?: 0L}"
3560+
} else {
35533561
ApiUtils.getUrlForScheduledMessages(
35543562
conversationUser.baseUrl!!,
35553563
roomToken
35563564
)
3565+
}
3566+
chatViewModel.loadScheduledMessages(
3567+
conversationUser.getCredentials(),
3568+
scheduledMessagesUrl
35573569
)
35583570
}
35593571

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,18 @@ class MessageInputFragment : Fragment() {
220220
}
221221

222222
chatActivity.chatViewModel.scheduledMessagesCount.observe(viewLifecycleOwner) { count ->
223-
updateScheduledMessagesAvailability(count > 0)
223+
if (chatActivity.conversationThreadId != null && chatActivity.conversationThreadId!! > 0) {
224+
val threadId = chatActivity.conversationThreadId
225+
val scheduledState = chatActivity.chatViewModel.scheduledMessagesViewState.value
226+
val threadCount = if (scheduledState is ChatViewModel.ScheduledMessagesSuccessState) {
227+
scheduledState.messages.count { it.threadId == threadId }
228+
} else {
229+
0
230+
}
231+
updateScheduledMessagesAvailability(threadCount > 0)
232+
} else {
233+
updateScheduledMessagesAvailability(count > 0)
234+
}
224235
}
225236

226237
viewLifecycleOwner.lifecycleScope.launch {

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

Lines changed: 91 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,22 @@ class ScheduledMessagesActivity : BaseActivity() {
146146
intent.getStringExtra(CONVERSATION_NAME).orEmpty()
147147
}
148148

149+
private val threadId: Long? by lazy {
150+
if (intent.hasExtra(THREAD_ID)) {
151+
intent.getLongExtra(THREAD_ID, 0L)
152+
} else {
153+
null
154+
}
155+
}
156+
157+
private val threadTitle: String by lazy {
158+
intent.getStringExtra(THREAD_TITLE).orEmpty()
159+
}
160+
161+
private val isThreadView: Boolean by lazy {
162+
(threadId ?: 0L) > 0
163+
}
164+
149165
override fun onCreate(savedInstanceState: Bundle?) {
150166
super.onCreate(savedInstanceState)
151167
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
@@ -183,6 +199,8 @@ class ScheduledMessagesActivity : BaseActivity() {
183199
onOpenThread = { threadId ->
184200
openThread(threadId)
185201
},
202+
threadTitle = threadTitle,
203+
isThreadView = isThreadView,
186204
onCopyScheduledMessage = { message ->
187205
copyScheduledMessage(message)
188206
}
@@ -201,9 +219,14 @@ class ScheduledMessagesActivity : BaseActivity() {
201219
}
202220

203221
private fun loadScheduledMessages(user: User) {
222+
val scheduledMessagesUrl = if (isThreadView) {
223+
ApiUtils.getUrlForScheduledMessages(user.baseUrl, roomToken) + "?threadId=${threadId ?: 0L}"
224+
} else {
225+
ApiUtils.getUrlForScheduledMessages(user.baseUrl, roomToken)
226+
}
204227
scheduledMessagesViewModel.loadScheduledMessages(
205228
user.getCredentials(),
206-
ApiUtils.getUrlForScheduledMessages(user.baseUrl, roomToken)
229+
scheduledMessagesUrl
207230
)
208231
}
209232

@@ -294,6 +317,8 @@ class ScheduledMessagesActivity : BaseActivity() {
294317
onDeleteScheduledMessage: (ChatMessage) -> Unit,
295318
onOpenParentMessage: (Long?) -> Unit,
296319
onOpenThread: (Long) -> Unit,
320+
threadTitle: String,
321+
isThreadView: Boolean,
297322
onCopyScheduledMessage: (ChatMessage) -> Unit
298323
) {
299324
val snackBarHostState = remember { SnackbarHostState() }
@@ -378,10 +403,11 @@ class ScheduledMessagesActivity : BaseActivity() {
378403
style = MaterialTheme.typography.titleMedium,
379404
fontWeight = FontWeight.Bold
380405
)
406+
val title = if (isThreadView) threadTitle else conversationName
381407
Text(
382408
text = stringResource(
383409
R.string.nc_in_conversation,
384-
conversationName
410+
title
385411
),
386412
style = MaterialTheme.typography.titleMedium
387413
)
@@ -415,7 +441,15 @@ class ScheduledMessagesActivity : BaseActivity() {
415441
.linkPreviews
416442
.collectAsStateWithLifecycle()
417443

418-
if (state.messages.isEmpty()) {
444+
val visibleMessages = remember(state.messages, isThreadView, threadId) {
445+
if (isThreadView) {
446+
state.messages.filter { it.threadId == threadId }
447+
} else {
448+
state.messages
449+
}
450+
}
451+
452+
if (visibleMessages.isEmpty()) {
419453
Box(
420454
modifier = Modifier.fillMaxSize(),
421455
contentAlignment = Alignment.Center
@@ -429,8 +463,8 @@ class ScheduledMessagesActivity : BaseActivity() {
429463
val zone = remember { ZoneId.systemDefault() }
430464
val today = remember { LocalDate.now(zone) }
431465

432-
val sortedMessages = remember(state.messages) {
433-
state.messages
466+
val sortedMessages = remember(visibleMessages) {
467+
visibleMessages
434468
.sortedBy { it.sendAt?.toLong() ?: Long.MAX_VALUE }
435469
}
436470

@@ -471,17 +505,22 @@ class ScheduledMessagesActivity : BaseActivity() {
471505
}
472506

473507
val parentId = message.parentMessageId
474-
LaunchedEffect(parentId) {
475-
if (parentId != null) {
508+
val shouldShowParentPreview = !isThreadView ||
509+
(parentId != null && parentId != message.threadId)
510+
LaunchedEffect(parentId, shouldShowParentPreview) {
511+
if (parentId != null && shouldShowParentPreview) {
476512
scheduledMessagesViewModel.requestParentMessage(
477513
token = roomToken,
478514
parentMessageId = parentId,
479515
threadId = message.threadId
480516
)
481517
}
482518
}
483-
484-
val parentMessage = parentId?.let { parentMessages[it] }
519+
val parentMessage = if (shouldShowParentPreview) {
520+
parentId?.let { parentMessages[it] }
521+
} else {
522+
null
523+
}
485524

486525
val linkPreview = message.token?.let { linkPreviews[it] }
487526
ScheduledMessageBubble(
@@ -492,14 +531,25 @@ class ScheduledMessagesActivity : BaseActivity() {
492531
viewThemeUtils = viewThemeUtils,
493532
onClick = {
494533
val parentId = message.parentMessageId
495-
if (parentId != null) {
534+
val isThreadMessage = (message.threadId ?: 0L) > 0
535+
536+
if (isThreadMessage && !isThreadView) {
537+
return@ScheduledMessageBubble
538+
}
539+
540+
if (isThreadView && parentId != null) {
541+
openThreadParentMessage(parentId, message.threadId)
542+
}
543+
544+
if (parentId != null && !isThreadView) {
496545
onOpenParentMessage(parentId)
497546
}
498547
},
499548
onLongPress = {
500549
selectedMessage = message
501550
showActionsSheet = true
502-
}
551+
},
552+
isThreadView = isThreadView
503553
)
504554
}
505555
}
@@ -586,6 +636,9 @@ class ScheduledMessagesActivity : BaseActivity() {
586636
showOpenThreadAction = selectedMessage?.threadId != null && selectedMessage?.threadId!! > 0,
587637
onOpenThread = {
588638
val threadId = selectedMessage?.threadId ?: return@ScheduledMessageActionsSheet
639+
if (isThreadView) {
640+
return@ScheduledMessageActionsSheet
641+
}
589642
onOpenThread(threadId)
590643
showActionsSheet = false
591644
},
@@ -709,20 +762,26 @@ class ScheduledMessagesActivity : BaseActivity() {
709762
dateUtils: DateUtils,
710763
viewThemeUtils: com.nextcloud.talk.ui.theme.ViewThemeUtils,
711764
onClick: () -> Unit,
712-
onLongPress: () -> Unit
765+
onLongPress: () -> Unit,
766+
isThreadView: Boolean
713767
) {
714768
val context = LocalContext.current
715769
val scheduledAt = message.sendAt?.toLong() ?: message.timestamp
716770
val timeText = dateUtils.getLocalTimeStringFromTimestamp(scheduledAt)
717771
val text = ChatUtils.getParsedMessage(message.message, message.messageParameters).orEmpty()
718772

719773
val messageTextColor = LocalContentColor.current.toArgb()
774+
720775
val bubbleColor = remember(context, message.isDeleted, viewThemeUtils) {
721776
Color(viewThemeUtils.talk.getOutgoingMessageBubbleColor(context, message.isDeleted, false))
722777
}
723778

724-
val isClickable = remember(parentMessage) {
725-
parentMessage != null
779+
val isClickable = remember(message.threadTitle, parentMessage, message.threadId, isThreadView) {
780+
val isThreadMessage = (message.threadId ?: 0L) > 0
781+
when {
782+
isThreadMessage -> isThreadView
783+
else -> !message.threadTitle.isNullOrBlank() || parentMessage != null
784+
}
726785
}
727786

728787
Row(
@@ -754,8 +813,7 @@ class ScheduledMessagesActivity : BaseActivity() {
754813
val strokeColor = MaterialTheme.colorScheme.primary
755814
Column(modifier = Modifier.padding(8.dp)) {
756815
parentMessage?.let { parent ->
757-
758-
if (!message.threadTitle.isNullOrBlank()) {
816+
if (!isThreadView && !message.threadTitle.isNullOrBlank()) {
759817
Row(
760818
verticalAlignment = Alignment.CenterVertically,
761819
modifier = Modifier.padding(bottom = 4.dp)
@@ -804,6 +862,11 @@ class ScheduledMessagesActivity : BaseActivity() {
804862
AndroidView(
805863
factory = { androidContext ->
806864
TextView(androidContext).apply {
865+
setOnClickListener {
866+
if (isClickable) {
867+
onClick()
868+
}
869+
}
807870
setOnLongClickListener {
808871
onLongPress()
809872
true
@@ -1112,7 +1175,7 @@ class ScheduledMessagesActivity : BaseActivity() {
11121175
text = stringResource(R.string.nc_send_now),
11131176
onClick = onSendNow
11141177
)
1115-
if (showOpenThreadAction) {
1178+
if (showOpenThreadAction && !isThreadView) {
11161179
ActionRow(
11171180
icon = Icons.Outlined.Forum,
11181181
text = stringResource(R.string.open_thread),
@@ -1133,6 +1196,15 @@ class ScheduledMessagesActivity : BaseActivity() {
11331196
startActivity(intent)
11341197
}
11351198

1199+
private fun openThreadParentMessage(messageId: Long?, threadId: Long?) {
1200+
val intent = Intent(this, ChatActivity::class.java).apply {
1201+
putExtra(KEY_ROOM_TOKEN, roomToken)
1202+
threadId?.let { putExtra(BundleKeys.KEY_THREAD_ID, it) }
1203+
messageId?.let { putExtra(BundleKeys.KEY_MESSAGE_ID, it.toString()) }
1204+
}
1205+
startActivity(intent)
1206+
}
1207+
11361208
@Composable
11371209
private fun ActionRow(icon: ImageVector, text: String, onClick: () -> Unit) {
11381210
TextButton(
@@ -1185,6 +1257,8 @@ class ScheduledMessagesActivity : BaseActivity() {
11851257
companion object {
11861258
const val ROOM_TOKEN = "room_token"
11871259
const val CONVERSATION_NAME = "conversation_name"
1260+
const val THREAD_ID = "thread_id"
1261+
const val THREAD_TITLE = "thread_title"
11881262
const val INT_2: Int = 2
11891263
const val INT_6: Int = 6
11901264
const val INT_0: Int = 0

0 commit comments

Comments
 (0)