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