@@ -61,8 +61,11 @@ import androidx.activity.viewModels
6161import androidx.appcompat.app.AlertDialog
6262import androidx.appcompat.view.ContextThemeWrapper
6363import androidx.cardview.widget.CardView
64+ import androidx.compose.foundation.lazy.LazyListState
65+ import androidx.compose.foundation.lazy.rememberLazyListState
6466import androidx.compose.material3.MaterialTheme
6567import androidx.compose.runtime.CompositionLocalProvider
68+ import androidx.compose.runtime.SideEffect
6669import androidx.compose.runtime.getValue
6770import androidx.compose.runtime.mutableStateOf
6871import androidx.compose.runtime.setValue
@@ -149,6 +152,7 @@ import com.nextcloud.talk.signaling.SignalingMessageReceiver
149152import com.nextcloud.talk.signaling.SignalingMessageSender
150153import com.nextcloud.talk.threadsoverview.ThreadsOverviewActivity
151154import com.nextcloud.talk.translate.ui.TranslateActivity
155+ import com.nextcloud.talk.ui.PinnedMessageView
152156import com.nextcloud.talk.ui.PlaybackSpeed
153157import com.nextcloud.talk.ui.StatusDrawable
154158import com.nextcloud.talk.ui.chat.ChatView
@@ -510,6 +514,7 @@ class ChatActivity :
510514 if (useJetpackCompose) {
511515 setChatListContent()
512516 }
517+ setPinnedMessageContent()
513518
514519 lifecycleScope.launch {
515520 currentUserProvider.getCurrentUser()
@@ -557,13 +562,50 @@ class ChatActivity :
557562 onBackPressedDispatcher.addCallback(this , onBackPressedCallback)
558563 }
559564
565+ private fun setPinnedMessageContent () {
566+ binding.pinnedMessageComposeView.setContent {
567+ val uiState by chatViewModel.uiState.collectAsStateWithLifecycle()
568+ val pinnedMessage = uiState.pinnedMessage
569+ binding.pinnedMessageContainer.visibility = if (pinnedMessage != null ) View .VISIBLE else View .GONE
570+ if (pinnedMessage != null ) {
571+ PinnedMessageView (
572+ message = pinnedMessage,
573+ viewThemeUtils = viewThemeUtils,
574+ currentConversation = uiState.conversation,
575+ scrollToMessageWithIdWithOffset = { messageId ->
576+ scrollToMessageById(messageId.toLong())
577+ },
578+ hidePinnedMessage = ::hidePinnedMessage,
579+ unPinMessage = ::unPinMessage
580+ )
581+ }
582+ }
583+ }
584+
585+ private var chatListState: LazyListState ? = null
586+
587+ private fun scrollToMessageById (messageId : Long ) {
588+ val items = chatViewModel.uiState.value.items
589+ val targetIndex = items.indexOfFirst { item ->
590+ (item as ? ChatViewModel .ChatItem .MessageItem )?.uiMessage?.id == messageId.toInt()
591+ }
592+ if (targetIndex >= 0 ) {
593+ lifecycleScope.launch {
594+ chatListState?.scrollToItem(targetIndex)
595+ }
596+ }
597+ }
598+
560599 private fun setChatListContent () {
561600 binding.messagesListViewCompose.setContent {
562601 val uiState by chatViewModel.uiState.collectAsStateWithLifecycle()
563602 currentConversation = uiState.conversation
564603
565604 binding.messagesListViewCompose.visibility = View .VISIBLE
566605
606+ val listState = rememberLazyListState()
607+ SideEffect { chatListState = listState }
608+
567609 CompositionLocalProvider (
568610 LocalViewThemeUtils provides viewThemeUtils,
569611 LocalMessageUtils provides messageUtils,
@@ -588,7 +630,8 @@ class ChatActivity :
588630 onReactionClick = { messageId, emoji -> handleReactionClick(messageId, emoji) },
589631 onReactionLongClick = { messageId -> openReactionsDialog(messageId) },
590632 onOpenThreadClick = { messageId -> openThread(messageId.toLong()) },
591- onLoadQuotedMessageClick = { messageId -> onLoadQuotedMessage(messageId) }
633+ onLoadQuotedMessageClick = { messageId -> onLoadQuotedMessage(messageId) },
634+ listState = listState
592635 )
593636 }
594637 }
0 commit comments