@@ -6,24 +6,24 @@ import android.os.Bundle
66import androidx.activity.addCallback
77import androidx.activity.viewModels
88import androidx.appcompat.app.AppCompatActivity
9+ import androidx.lifecycle.Lifecycle
910import androidx.lifecycle.lifecycleScope
11+ import androidx.lifecycle.repeatOnLifecycle
1012import com.example.chattutorial.databinding.ActivityChannel3Binding
11- import com.getstream.sdk.chat.viewmodel.MessageInputViewModel
12- import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel
13- import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel.Mode.Normal
14- import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel.Mode.Thread
15- import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel.State.NavigateUp
1613import io.getstream.chat.android.client.ChatClient
17- import io.getstream.chat.android.client.models.Channel
18- import io.getstream.chat.android.offline.extensions.watchChannelAsState
19- import io.getstream.chat.android.ui.message.input.viewmodel.bindView
20- import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.AttachmentFactoryManager
21- import io.getstream.chat.android.ui.message.list.header.viewmodel.MessageListHeaderViewModel
22- import io.getstream.chat.android.ui.message.list.header.viewmodel.bindView
23- import io.getstream.chat.android.ui.message.list.viewmodel.bindView
24- import io.getstream.chat.android.ui.message.list.viewmodel.factory.MessageListViewModelFactory
14+ import io.getstream.chat.android.models.Channel
15+ import io.getstream.chat.android.state.extensions.watchChannelAsState
16+ import io.getstream.chat.android.ui.common.state.messages.Edit
17+ import io.getstream.chat.android.ui.common.state.messages.MessageMode
18+ import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.AttachmentFactoryManager
19+ import io.getstream.chat.android.ui.viewmodel.messages.MessageComposerViewModel
20+ import io.getstream.chat.android.ui.viewmodel.messages.MessageListHeaderViewModel
21+ import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModel
22+ import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModelFactory
23+ import io.getstream.chat.android.ui.viewmodel.messages.bindView
2524import kotlinx.coroutines.flow.filterNotNull
2625import kotlinx.coroutines.flow.flatMapLatest
26+ import kotlinx.coroutines.launch
2727
2828class ChannelActivity3 : AppCompatActivity () {
2929
@@ -42,10 +42,10 @@ class ChannelActivity3 : AppCompatActivity() {
4242
4343 // Step 1 - Create three separate ViewModels for the views so it's easy
4444 // to customize them individually
45- val factory = MessageListViewModelFactory (cid)
45+ val factory = MessageListViewModelFactory (this , cid)
4646 val messageListHeaderViewModel: MessageListHeaderViewModel by viewModels { factory }
4747 val messageListViewModel: MessageListViewModel by viewModels { factory }
48- val messageInputViewModel : MessageInputViewModel by viewModels { factory }
48+ val messageComposerViewModel : MessageComposerViewModel by viewModels { factory }
4949
5050 // Set a view factory manager for Imgur attachments
5151 val imgurAttachmentViewFactory = ImgurAttachmentFactory ()
@@ -55,28 +55,31 @@ class ChannelActivity3 : AppCompatActivity() {
5555 // Step 2 - Bind the view and ViewModels, they are loosely coupled so it's easy to customize
5656 messageListHeaderViewModel.bindView(binding.messageListHeaderView, this )
5757 messageListViewModel.bindView(binding.messageListView, this )
58- messageInputViewModel .bindView(binding.messageInputView , this )
58+ messageComposerViewModel .bindView(binding.messageComposerView , this )
5959
6060 // Step 3 - Let both MessageListHeaderView and MessageInputView know when we open a thread
6161 messageListViewModel.mode.observe(this ) { mode ->
6262 when (mode) {
63- is Thread -> {
63+ is MessageMode . MessageThread -> {
6464 messageListHeaderViewModel.setActiveThread(mode.parentMessage)
65- messageInputViewModel.setActiveThread( mode.parentMessage)
65+ messageComposerViewModel.setMessageMode( MessageMode . MessageThread ( mode.parentMessage) )
6666 }
67- Normal -> {
67+
68+ is MessageMode .Normal -> {
6869 messageListHeaderViewModel.resetThread()
69- messageInputViewModel.resetThread ()
70+ messageComposerViewModel.leaveThread ()
7071 }
7172 }
7273 }
7374
7475 // Step 4 - Let the message input know when we are editing a message
75- binding.messageListView.setMessageEditHandler(messageInputViewModel::postMessageToEdit)
76+ binding.messageListView.setMessageEditHandler { message ->
77+ messageComposerViewModel.performMessageAction(Edit (message))
78+ }
7679
7780 // Step 5 - Handle navigate up state
7881 messageListViewModel.state.observe(this ) { state ->
79- if (state is NavigateUp ) {
82+ if (state is MessageListViewModel . State . NavigateUp ) {
8083 finish()
8184 }
8285 }
@@ -95,15 +98,18 @@ class ChannelActivity3 : AppCompatActivity() {
9598 binding.typingHeaderView.text = nobodyTyping
9699
97100 // Observe typing events and update typing header depending on its state.
98- lifecycleScope.launchWhenStarted {
99- ChatClient .instance().watchChannelAsState(cid, 30 )
100- .filterNotNull()
101- .flatMapLatest { it.typing }
102- .collect {
103- binding.typingHeaderView.text = when {
104- it.users.isNotEmpty() -> it.users.joinToString(prefix = " typing: " ) { user -> user.name }
105- else -> nobodyTyping
106- }
101+
102+ lifecycleScope.launch {
103+ repeatOnLifecycle(Lifecycle .State .STARTED ) {
104+ ChatClient .instance().watchChannelAsState(cid, 30 )
105+ .filterNotNull()
106+ .flatMapLatest { it.typing }
107+ .collect {
108+ binding.typingHeaderView.text = when {
109+ it.users.isNotEmpty() -> it.users.joinToString(prefix = " typing: " ) { user -> user.name }
110+ else -> nobodyTyping
111+ }
112+ }
107113 }
108114 }
109115 }
0 commit comments