diff --git a/compose-custom-attachments/build.gradle b/compose-custom-attachments/build.gradle index b26ba230..1a1f6743 100644 --- a/compose-custom-attachments/build.gradle +++ b/compose-custom-attachments/build.gradle @@ -30,7 +30,9 @@ android { dependencies { // Stream SDK - implementation "io.getstream:stream-chat-android-compose:5.17.0" + implementation "io.getstream:stream-chat-android-compose:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-state:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-offline:6.0.0-beta2" implementation libs.androidxCoreKtx implementation libs.androidxAppCompat diff --git a/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/CustomAttachmentsApp.kt b/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/CustomAttachmentsApp.kt index 8aa8a9c9..2940a968 100644 --- a/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/CustomAttachmentsApp.kt +++ b/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/CustomAttachmentsApp.kt @@ -27,10 +27,11 @@ package io.getstream.chat.android.compose.customattachments import android.app.Application import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.logger.ChatLogLevel -import io.getstream.chat.android.client.models.User -import io.getstream.chat.android.offline.model.message.attachments.UploadAttachmentsNetworkType -import io.getstream.chat.android.offline.plugin.configuration.Config +import io.getstream.chat.android.models.UploadAttachmentsNetworkType +import io.getstream.chat.android.models.User import io.getstream.chat.android.offline.plugin.factory.StreamOfflinePluginFactory +import io.getstream.chat.android.state.plugin.config.StatePluginConfig +import io.getstream.chat.android.state.plugin.factory.StreamStatePluginFactory class CustomAttachmentsApp : Application() { override fun onCreate() { @@ -40,18 +41,18 @@ class CustomAttachmentsApp : Application() { } private fun setupStreamSdk() { - val offlinePluginFactory = StreamOfflinePluginFactory( - config = Config( + val offlinePluginFactory = StreamOfflinePluginFactory(appContext = applicationContext) + val statePluginFactory = StreamStatePluginFactory( + config = StatePluginConfig( backgroundSyncEnabled = true, userPresence = true, - persistenceEnabled = true, - uploadAttachmentsNetworkType = UploadAttachmentsNetworkType.NOT_ROAMING ), - appContext = applicationContext + appContext = applicationContext, ) ChatClient.Builder("qx5us2v6xvmh", applicationContext) .logLevel(ChatLogLevel.ALL) - .withPlugin(offlinePluginFactory) + .uploadAttachmentsNetworkType(UploadAttachmentsNetworkType.NOT_ROAMING) + .withPlugins(offlinePluginFactory, statePluginFactory) .build() } diff --git a/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/CustomMessagesScreen.kt b/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/CustomMessagesScreen.kt index 833c4583..8de43b86 100644 --- a/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/CustomMessagesScreen.kt +++ b/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/CustomMessagesScreen.kt @@ -46,9 +46,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.google.android.material.datepicker.MaterialDatePicker -import io.getstream.chat.android.client.models.Attachment -import io.getstream.chat.android.common.state.MessageMode -import io.getstream.chat.android.common.state.Reply import io.getstream.chat.android.compose.customattachments.R import io.getstream.chat.android.compose.ui.messages.MessagesScreen import io.getstream.chat.android.compose.ui.messages.composer.MessageComposer @@ -58,6 +55,9 @@ import io.getstream.chat.android.compose.ui.theme.ChatTheme import io.getstream.chat.android.compose.viewmodel.messages.MessageComposerViewModel import io.getstream.chat.android.compose.viewmodel.messages.MessageListViewModel import io.getstream.chat.android.compose.viewmodel.messages.MessagesViewModelFactory +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.ui.common.state.messages.MessageMode +import io.getstream.chat.android.ui.common.state.messages.Reply import java.text.DateFormat import java.util.Date diff --git a/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/DateAttachmentFactory.kt b/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/DateAttachmentFactory.kt index 408ec13d..f5dec19d 100644 --- a/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/DateAttachmentFactory.kt +++ b/compose-custom-attachments/src/main/java/io/getstream/chat/android/compose/customattachments/ui/DateAttachmentFactory.kt @@ -42,12 +42,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import io.getstream.chat.android.client.models.Attachment import io.getstream.chat.android.compose.customattachments.R import io.getstream.chat.android.compose.state.messages.attachments.AttachmentState import io.getstream.chat.android.compose.ui.attachments.AttachmentFactory import io.getstream.chat.android.compose.ui.components.CancelIcon import io.getstream.chat.android.compose.ui.theme.ChatTheme +import io.getstream.chat.android.models.Attachment /** * A custom [AttachmentFactory] that adds support for date attachments. diff --git a/custom-attachments-message-composer/build.gradle b/custom-attachments-message-composer/build.gradle index 376052aa..4b2f9a3a 100644 --- a/custom-attachments-message-composer/build.gradle +++ b/custom-attachments-message-composer/build.gradle @@ -21,7 +21,9 @@ android { dependencies { // Stream SDK dependency - implementation "io.getstream:stream-chat-android-ui-components:5.17.0" + implementation "io.getstream:stream-chat-android-ui-components:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-state:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-offline:6.0.0-beta2" implementation libs.androidxCoreKtx implementation libs.androidxActivityKtx diff --git a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/App.kt b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/App.kt index e97c5571..190ddbfa 100644 --- a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/App.kt +++ b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/App.kt @@ -27,19 +27,19 @@ package io.getstream.chat.android.customattachments import android.app.Application import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.logger.ChatLogLevel -import io.getstream.chat.android.client.models.User import io.getstream.chat.android.customattachments.factory.DateAttachmentFactory import io.getstream.chat.android.customattachments.factory.DateAttachmentPreviewFactory import io.getstream.chat.android.customattachments.factory.QuotedDateAttachmentFactory -import io.getstream.chat.android.offline.plugin.configuration.Config +import io.getstream.chat.android.models.User import io.getstream.chat.android.offline.plugin.factory.StreamOfflinePluginFactory +import io.getstream.chat.android.state.plugin.config.StatePluginConfig +import io.getstream.chat.android.state.plugin.factory.StreamStatePluginFactory import io.getstream.chat.android.ui.ChatUI -import io.getstream.chat.android.ui.message.composer.attachment.AttachmentPreviewFactoryManager -import io.getstream.chat.android.ui.message.composer.attachment.factory.FileAttachmentPreviewFactory -import io.getstream.chat.android.ui.message.composer.attachment.factory.ImageAttachmentPreviewFactory -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.AttachmentFactoryManager -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.DefaultQuotedAttachmentMessageFactory -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.QuotedAttachmentFactoryManager +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.AttachmentPreviewFactoryManager +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.factory.FileAttachmentPreviewFactory +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.AttachmentFactoryManager +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.DefaultQuotedAttachmentMessageFactory +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.QuotedAttachmentFactoryManager class App : Application() { override fun onCreate() { @@ -49,28 +49,33 @@ class App : Application() { } private fun setupStreamSdk() { - val offlinePluginFactory = StreamOfflinePluginFactory( - config = Config(), - appContext = applicationContext + val offlinePluginFactory = StreamOfflinePluginFactory(appContext = applicationContext) + val statePluginFactory = StreamStatePluginFactory( + config = StatePluginConfig(), + appContext = applicationContext, ) ChatClient.Builder("qx5us2v6xvmh", applicationContext) .logLevel(ChatLogLevel.ALL) - .withPlugin(offlinePluginFactory) + .withPlugins(offlinePluginFactory, statePluginFactory) .build() - ChatUI.attachmentFactoryManager = AttachmentFactoryManager(listOf(DateAttachmentFactory())) + ChatUI.attachmentFactoryManager = AttachmentFactoryManager( + attachmentFactories = listOf( + DateAttachmentFactory() + ) + ) ChatUI.attachmentPreviewFactoryManager = AttachmentPreviewFactoryManager( listOf( DateAttachmentPreviewFactory(), - ImageAttachmentPreviewFactory(), FileAttachmentPreviewFactory() ) ) ChatUI.quotedAttachmentFactoryManager = QuotedAttachmentFactoryManager( - listOf( + quotedAttachmentFactories = listOf( QuotedDateAttachmentFactory(), + // The default factory DefaultQuotedAttachmentMessageFactory() ) ) diff --git a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt index 69cf21a7..9aca70ad 100644 --- a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt +++ b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt @@ -24,9 +24,9 @@ package io.getstream.chat.android.customattachments.activity -import io.getstream.chat.android.client.models.Channel -import io.getstream.chat.android.ui.channel.ChannelListActivity -import io.getstream.chat.android.ui.channel.ChannelListFragment +import io.getstream.chat.android.models.Channel +import io.getstream.chat.android.ui.feature.channels.ChannelListActivity +import io.getstream.chat.android.ui.feature.channels.ChannelListFragment class ChannelsActivity : ChannelListActivity(), ChannelListFragment.ChannelListItemClickListener { diff --git a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt index dd71dee8..b6d8757a 100644 --- a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt +++ b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt @@ -34,30 +34,27 @@ import androidx.activity.addCallback import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible -import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel import com.google.android.material.datepicker.MaterialDatePicker -import io.getstream.chat.android.client.models.Attachment -import io.getstream.chat.android.client.models.ChannelCapabilities -import io.getstream.chat.android.common.composer.MessageComposerState -import io.getstream.chat.android.common.state.Edit -import io.getstream.chat.android.common.state.MessageMode -import io.getstream.chat.android.common.state.Reply import io.getstream.chat.android.core.ExperimentalStreamChatApi import io.getstream.chat.android.customattachments.databinding.ActivityMessagesBinding import io.getstream.chat.android.customattachments.databinding.CustomMessageComposerLeadingContentBinding -import io.getstream.chat.android.ui.message.composer.MessageComposerContext -import io.getstream.chat.android.ui.message.composer.MessageComposerViewStyle -import io.getstream.chat.android.ui.message.composer.content.MessageComposerContent -import io.getstream.chat.android.ui.message.composer.viewmodel.MessageComposerViewModel -import io.getstream.chat.android.ui.message.composer.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.header.viewmodel.MessageListHeaderViewModel -import io.getstream.chat.android.ui.message.list.header.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.viewmodel.factory.MessageListViewModelFactory +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.models.ChannelCapabilities +import io.getstream.chat.android.ui.common.state.messages.Edit +import io.getstream.chat.android.ui.common.state.messages.MessageMode +import io.getstream.chat.android.ui.common.state.messages.Reply +import io.getstream.chat.android.ui.common.state.messages.composer.MessageComposerState +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerContext +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerViewStyle +import io.getstream.chat.android.ui.feature.messages.composer.content.MessageComposerContent +import io.getstream.chat.android.ui.viewmodel.messages.MessageComposerViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListHeaderViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.messages.bindView import java.text.DateFormat import java.util.Date -@OptIn(ExperimentalStreamChatApi::class) class MessagesActivity : AppCompatActivity() { private lateinit var binding: ActivityMessagesBinding @@ -80,11 +77,11 @@ class MessagesActivity : AppCompatActivity() { messageListViewModel.mode.observe(this) { when (it) { - is MessageListViewModel.Mode.Thread -> { + is MessageMode.MessageThread -> { messageListHeaderViewModel.setActiveThread(it.parentMessage) messageComposerViewModel.setMessageMode(MessageMode.MessageThread(it.parentMessage)) } - is MessageListViewModel.Mode.Normal -> { + is MessageMode.Normal -> { messageListHeaderViewModel.resetThread() messageComposerViewModel.leaveThread() } diff --git a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt index d9c72c9a..bee455aa 100644 --- a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt +++ b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt @@ -26,11 +26,11 @@ package io.getstream.chat.android.customattachments.factory import android.view.LayoutInflater import android.view.ViewGroup -import io.getstream.chat.android.client.models.Message import io.getstream.chat.android.customattachments.databinding.ItemDateAttachmentBinding -import io.getstream.chat.android.ui.message.list.adapter.MessageListListenerContainer -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.AttachmentFactory -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.InnerAttachmentViewHolder +import io.getstream.chat.android.models.Message +import io.getstream.chat.android.ui.feature.messages.list.adapter.MessageListListenerContainer +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.AttachmentFactory +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.InnerAttachmentViewHolder class DateAttachmentFactory : AttachmentFactory { diff --git a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt index ae91d62f..3c767a9d 100644 --- a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt +++ b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt @@ -26,10 +26,11 @@ package io.getstream.chat.android.customattachments.factory import android.view.LayoutInflater import android.view.ViewGroup -import io.getstream.chat.android.client.models.Attachment import io.getstream.chat.android.customattachments.databinding.ItemDateAttachmentPreviewBinding -import io.getstream.chat.android.ui.message.composer.attachment.AttachmentPreviewViewHolder -import io.getstream.chat.android.ui.message.composer.attachment.factory.AttachmentPreviewFactory +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerViewStyle +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.AttachmentPreviewViewHolder +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.factory.AttachmentPreviewFactory class DateAttachmentPreviewFactory : AttachmentPreviewFactory { @@ -39,7 +40,8 @@ class DateAttachmentPreviewFactory : AttachmentPreviewFactory { override fun onCreateViewHolder( parentView: ViewGroup, - attachmentRemovalListener: (Attachment) -> Unit + attachmentRemovalListener: (Attachment) -> Unit, + style: MessageComposerViewStyle? ): AttachmentPreviewViewHolder { return ItemDateAttachmentPreviewBinding .inflate(LayoutInflater.from(parentView.context), parentView, false) diff --git a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt index 4c2d2c7b..fbf1b86c 100644 --- a/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt +++ b/custom-attachments-message-composer/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt @@ -29,10 +29,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import io.getstream.chat.android.client.models.Attachment -import io.getstream.chat.android.client.models.Message import io.getstream.chat.android.customattachments.databinding.ViewQuotedDateAttachmentBinding -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.QuotedAttachmentFactory +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.models.Message +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.QuotedAttachmentFactory import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale diff --git a/custom-attachments-message-composer/src/main/res/layout/activity_messages.xml b/custom-attachments-message-composer/src/main/res/layout/activity_messages.xml index 6d75ac35..05fec8c8 100644 --- a/custom-attachments-message-composer/src/main/res/layout/activity_messages.xml +++ b/custom-attachments-message-composer/src/main/res/layout/activity_messages.xml @@ -27,7 +27,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - ?attr/colorPrimaryVariant - - - - \ No newline at end of file diff --git a/custom-attachments-message-input/build.gradle b/custom-attachments-message-input/build.gradle index 2ab477cf..c0c35355 100644 --- a/custom-attachments-message-input/build.gradle +++ b/custom-attachments-message-input/build.gradle @@ -21,7 +21,9 @@ android { dependencies { // Stream SDK dependency - implementation "io.getstream:stream-chat-android-ui-components:5.17.0" + implementation "io.getstream:stream-chat-android-ui-components:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-state:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-offline:6.0.0-beta2" implementation libs.androidxCoreKtx implementation libs.androidxActivityKtx diff --git a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/App.kt b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/App.kt index d45a5fd6..fc0a4280 100644 --- a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/App.kt +++ b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/App.kt @@ -27,15 +27,20 @@ package io.getstream.chat.android.customattachments import android.app.Application import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.logger.ChatLogLevel -import io.getstream.chat.android.client.models.User import io.getstream.chat.android.customattachments.factory.DateAttachmentFactory +import io.getstream.chat.android.customattachments.factory.DateAttachmentPreviewFactory import io.getstream.chat.android.customattachments.factory.QuotedDateAttachmentFactory -import io.getstream.chat.android.offline.plugin.configuration.Config +import io.getstream.chat.android.models.User import io.getstream.chat.android.offline.plugin.factory.StreamOfflinePluginFactory +import io.getstream.chat.android.state.plugin.config.StatePluginConfig +import io.getstream.chat.android.state.plugin.factory.StreamStatePluginFactory import io.getstream.chat.android.ui.ChatUI -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.AttachmentFactoryManager -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.DefaultQuotedAttachmentMessageFactory -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.QuotedAttachmentFactoryManager +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.AttachmentPreviewFactoryManager +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.factory.FileAttachmentPreviewFactory +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.factory.MediaAttachmentPreviewFactory +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.AttachmentFactoryManager +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.DefaultQuotedAttachmentMessageFactory +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.QuotedAttachmentFactoryManager class App : Application() { override fun onCreate() { @@ -45,20 +50,33 @@ class App : Application() { } private fun setupStreamSdk() { - val offlinePluginFactory = StreamOfflinePluginFactory( - config = Config(), - appContext = applicationContext + val offlinePluginFactory = StreamOfflinePluginFactory(appContext = applicationContext) + val statePluginFactory = StreamStatePluginFactory( + config = StatePluginConfig(), + appContext = applicationContext, ) ChatClient.Builder("qx5us2v6xvmh", applicationContext) .logLevel(ChatLogLevel.ALL) - .withPlugin(offlinePluginFactory) + .withPlugins(offlinePluginFactory, statePluginFactory) .build() - ChatUI.attachmentFactoryManager = AttachmentFactoryManager(listOf(DateAttachmentFactory())) - + ChatUI.attachmentFactoryManager = AttachmentFactoryManager( + attachmentFactories = listOf( + DateAttachmentFactory() + ) + ) + ChatUI.attachmentPreviewFactoryManager = AttachmentPreviewFactoryManager( + attachmentPreviewFactories = listOf( + DateAttachmentPreviewFactory(), + // The default factories + MediaAttachmentPreviewFactory(), + FileAttachmentPreviewFactory(), + ) + ) ChatUI.quotedAttachmentFactoryManager = QuotedAttachmentFactoryManager( - listOf( + quotedAttachmentFactories = listOf( QuotedDateAttachmentFactory(), + // The default factory DefaultQuotedAttachmentMessageFactory() ) ) diff --git a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt index 69cf21a7..9aca70ad 100644 --- a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt +++ b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/ChannelsActivity.kt @@ -24,9 +24,9 @@ package io.getstream.chat.android.customattachments.activity -import io.getstream.chat.android.client.models.Channel -import io.getstream.chat.android.ui.channel.ChannelListActivity -import io.getstream.chat.android.ui.channel.ChannelListFragment +import io.getstream.chat.android.models.Channel +import io.getstream.chat.android.ui.feature.channels.ChannelListActivity +import io.getstream.chat.android.ui.feature.channels.ChannelListFragment class ChannelsActivity : ChannelListActivity(), ChannelListFragment.ChannelListItemClickListener { diff --git a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt index 1e1cec9d..937fb39d 100644 --- a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt +++ b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/activity/MessagesActivity.kt @@ -26,14 +26,23 @@ package io.getstream.chat.android.customattachments.activity import android.content.Context import android.content.Intent +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import androidx.core.view.isVisible import com.google.android.material.datepicker.MaterialDatePicker -import io.getstream.chat.android.client.models.Attachment -import io.getstream.chat.android.customattachments.R -import io.getstream.chat.android.customattachments.factory.DateAttachmentPreviewFactory -import io.getstream.chat.android.ui.message.MessageListActivity -import io.getstream.chat.android.ui.message.MessageListFragment -import io.getstream.chat.android.ui.message.input.MessageInputView -import java.text.DateFormat +import io.getstream.chat.android.customattachments.databinding.CustomMessageComposerLeadingContentBinding +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.models.ChannelCapabilities +import io.getstream.chat.android.ui.common.state.messages.Edit +import io.getstream.chat.android.ui.common.state.messages.composer.MessageComposerState +import io.getstream.chat.android.ui.feature.messages.MessageListActivity +import io.getstream.chat.android.ui.feature.messages.MessageListFragment +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerContext +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerView +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerViewStyle +import io.getstream.chat.android.ui.feature.messages.composer.content.MessageComposerContent +import java.text.SimpleDateFormat import java.util.Date class MessagesActivity : MessageListActivity() { @@ -41,7 +50,6 @@ class MessagesActivity : MessageListActivity() { override fun createMessageListFragment(cid: String, messageId: String?): MessageListFragment { return MessageListFragment.newInstance(cid) { setFragment(CustomMessageListFragment()) - customTheme(R.style.CustomStreamUiTheme) showHeader(true) messageId(messageId) } @@ -49,36 +57,87 @@ class MessagesActivity : MessageListActivity() { class CustomMessageListFragment : MessageListFragment() { - override fun setupMessageInput(messageInputView: MessageInputView) { - super.setupMessageInput(messageInputView) - - // Create an instance of a date picker dialog - val datePickerDialog = MaterialDatePicker.Builder - .datePicker() - .build() - - // Add an attachment to the message input when the user selects a date - datePickerDialog.addOnPositiveButtonClickListener { - val date = DateFormat - .getDateInstance(DateFormat.LONG) - .format(Date(it)) - val attachment = Attachment( - type = "date", - extraData = mutableMapOf("payload" to date) - ) - messageInputView.submitCustomAttachments( - attachments = listOf(attachment), - viewHolderFactory = DateAttachmentPreviewFactory() - ) - } + override fun setupMessageComposer(messageComposerView: MessageComposerView) { + super.setupMessageComposer(messageComposerView) + messageComposerView.setLeadingContent( + CustomMessageComposerLeadingContent(messageComposerView.context).also { + it.attachmentsButtonClickListener = { binding.messageComposerView.attachmentsButtonClickListener() } + it.commandsButtonClickListener = { binding.messageComposerView.commandsButtonClickListener() } + it.calendarButtonClickListener = { + // Create an instance of a date picker dialog + val datePickerDialog = MaterialDatePicker.Builder + .datePicker() + .build() - // Show the date picker dialog when the attachment button is clicked - messageInputView.setAttachmentButtonClickListener { - datePickerDialog.show(requireActivity().supportFragmentManager, null) - } + // Add an attachment to the message input when the user selects a date + datePickerDialog.addOnPositiveButtonClickListener { date -> + val payload = SimpleDateFormat("MMMM dd, yyyy").format(Date(date)) + val attachment = Attachment( + type = "date", + extraData = mutableMapOf("payload" to payload) + ) + messageComposerViewModel.addSelectedAttachments(listOf(attachment)) + } + + // Show the date picker dialog at the click of the calendar button + datePickerDialog.show(requireActivity().supportFragmentManager, null) + } + } + ) } } + private class CustomMessageComposerLeadingContent : FrameLayout, MessageComposerContent { + + private val binding: CustomMessageComposerLeadingContentBinding + private lateinit var style: MessageComposerViewStyle + + var attachmentsButtonClickListener: () -> Unit = {} + var commandsButtonClickListener: () -> Unit = {} + + // Click listener for the date picker button + var calendarButtonClickListener: () -> Unit = {} + + constructor(context: Context) : this(context, null) + + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) { + binding = CustomMessageComposerLeadingContentBinding.inflate(LayoutInflater.from(context), this) + binding.attachmentsButton.setOnClickListener { attachmentsButtonClickListener() } + binding.commandsButton.setOnClickListener { commandsButtonClickListener() } + // Set click listener for the date picker button + binding.calendarButton.setOnClickListener { calendarButtonClickListener() } + } + + override fun attachContext(messageComposerContext: MessageComposerContext) { + this.style = messageComposerContext.style + } + + override fun renderState(state: MessageComposerState) { + val canSendMessage = state.ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE) + val canUploadFile = state.ownCapabilities.contains(ChannelCapabilities.UPLOAD_FILE) + val hasTextInput = state.inputValue.isNotEmpty() + val hasAttachments = state.attachments.isNotEmpty() + val hasCommandInput = state.inputValue.startsWith("/") + val hasCommandSuggestions = state.commandSuggestions.isNotEmpty() + val hasMentionSuggestions = state.mentionSuggestions.isNotEmpty() + val isInEditMode = state.action is Edit + + binding.attachmentsButton.isEnabled = + !hasCommandInput && !hasCommandSuggestions && !hasMentionSuggestions + binding.attachmentsButton.isVisible = + style.attachmentsButtonVisible && canSendMessage && canUploadFile && !isInEditMode + + binding.commandsButton.isEnabled = !hasTextInput && !hasAttachments + binding.commandsButton.isVisible = style.commandsButtonVisible && canSendMessage && !isInEditMode + binding.commandsButton.isSelected = hasCommandSuggestions + } + } companion object { private const val EXTRA_CID: String = "extra_cid" private const val EXTRA_MESSAGE_ID: String = "extra_message_id" diff --git a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt index d9c72c9a..bee455aa 100644 --- a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt +++ b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentFactory.kt @@ -26,11 +26,11 @@ package io.getstream.chat.android.customattachments.factory import android.view.LayoutInflater import android.view.ViewGroup -import io.getstream.chat.android.client.models.Message import io.getstream.chat.android.customattachments.databinding.ItemDateAttachmentBinding -import io.getstream.chat.android.ui.message.list.adapter.MessageListListenerContainer -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.AttachmentFactory -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.InnerAttachmentViewHolder +import io.getstream.chat.android.models.Message +import io.getstream.chat.android.ui.feature.messages.list.adapter.MessageListListenerContainer +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.AttachmentFactory +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.InnerAttachmentViewHolder class DateAttachmentFactory : AttachmentFactory { diff --git a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt index b91f4664..787edb76 100644 --- a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt +++ b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/DateAttachmentPreviewFactory.kt @@ -26,31 +26,45 @@ package io.getstream.chat.android.customattachments.factory import android.view.LayoutInflater import android.view.ViewGroup -import io.getstream.chat.android.client.models.Attachment import io.getstream.chat.android.customattachments.databinding.ItemDateAttachmentPreviewBinding -import io.getstream.chat.android.ui.message.input.attachment.selected.internal.BaseSelectedCustomAttachmentViewHolder -import io.getstream.chat.android.ui.message.input.attachment.selected.internal.SelectedCustomAttachmentViewHolderFactory +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerViewStyle +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.AttachmentPreviewViewHolder +import io.getstream.chat.android.ui.feature.messages.composer.attachment.preview.factory.AttachmentPreviewFactory -class DateAttachmentPreviewFactory : SelectedCustomAttachmentViewHolderFactory { +class DateAttachmentPreviewFactory : AttachmentPreviewFactory { - override fun createAttachmentViewHolder( - attachments: List, - parent: ViewGroup - ): BaseSelectedCustomAttachmentViewHolder { + override fun canHandle(attachment: Attachment): Boolean { + return attachment.type == "date" + } + + override fun onCreateViewHolder( + parentView: ViewGroup, + attachmentRemovalListener: (Attachment) -> Unit, + style: MessageComposerViewStyle?, + ): AttachmentPreviewViewHolder { return ItemDateAttachmentPreviewBinding - .inflate(LayoutInflater.from(parent.context), parent, false) - .let(::DateAttachmentPreviewViewHolder) + .inflate(LayoutInflater.from(parentView.context), parentView, false) + .let { DateAttachmentPreviewViewHolder(it, attachmentRemovalListener) } } class DateAttachmentPreviewViewHolder( - private val binding: ItemDateAttachmentPreviewBinding - ) : BaseSelectedCustomAttachmentViewHolder(binding.root) { + private val binding: ItemDateAttachmentPreviewBinding, + private val attachmentRemovalListener: (Attachment) -> Unit, + ) : AttachmentPreviewViewHolder(binding.root) { - override fun bind(attachment: Attachment, onAttachmentCancelled: (Attachment) -> Unit) { - binding.dateTextView.text = attachment.extraData["payload"].toString() + private lateinit var attachment: Attachment + + init { binding.deleteButton.setOnClickListener { - onAttachmentCancelled(attachment) + attachmentRemovalListener(attachment) } } + + override fun bind(attachment: Attachment) { + this.attachment = attachment + + binding.dateTextView.text = attachment.extraData["payload"].toString() + } } } diff --git a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt index 4c2d2c7b..fbf1b86c 100644 --- a/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt +++ b/custom-attachments-message-input/src/main/java/io/getstream/chat/android/customattachments/factory/QuotedDateAttachmentFactory.kt @@ -29,10 +29,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import io.getstream.chat.android.client.models.Attachment -import io.getstream.chat.android.client.models.Message import io.getstream.chat.android.customattachments.databinding.ViewQuotedDateAttachmentBinding -import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.QuotedAttachmentFactory +import io.getstream.chat.android.models.Attachment +import io.getstream.chat.android.models.Message +import io.getstream.chat.android.ui.feature.messages.list.adapter.viewholder.attachment.QuotedAttachmentFactory import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale diff --git a/custom-attachments-message-input/src/main/res/layout/custom_message_composer_leading_content.xml b/custom-attachments-message-input/src/main/res/layout/custom_message_composer_leading_content.xml new file mode 100644 index 00000000..e6236937 --- /dev/null +++ b/custom-attachments-message-input/src/main/res/layout/custom_message_composer_leading_content.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + diff --git a/custom-attachments-message-input/src/main/res/values/themes.xml b/custom-attachments-message-input/src/main/res/values/themes.xml index 18663419..5b8552e9 100644 --- a/custom-attachments-message-input/src/main/res/values/themes.xml +++ b/custom-attachments-message-input/src/main/res/values/themes.xml @@ -37,12 +37,4 @@ ?attr/colorPrimaryVariant - - - - \ No newline at end of file diff --git a/video-chat-sample/build.gradle b/video-chat-sample/build.gradle index 22346cf2..f949a4e0 100644 --- a/video-chat-sample/build.gradle +++ b/video-chat-sample/build.gradle @@ -41,7 +41,7 @@ android { dependencies { // Stream SDK dependency - implementation 'io.getstream:stream-chat-android-client:5.17.0' + implementation "io.getstream:stream-chat-android-client:6.0.0-beta2" implementation libs.materialComponents implementation libs.kotlinStdLib diff --git a/video-chat-sample/src/main/kotlin/io/getstream/videochat/VideoChatApp.kt b/video-chat-sample/src/main/kotlin/io/getstream/videochat/VideoChatApp.kt index cd5926bd..4c866628 100644 --- a/video-chat-sample/src/main/kotlin/io/getstream/videochat/VideoChatApp.kt +++ b/video-chat-sample/src/main/kotlin/io/getstream/videochat/VideoChatApp.kt @@ -27,7 +27,7 @@ package io.getstream.videochat import android.app.Application import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.logger.ChatLogLevel -import io.getstream.chat.android.client.models.User +import io.getstream.chat.android.models.User class VideoChatApp : Application() { diff --git a/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/MessageListAdapter.kt b/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/MessageListAdapter.kt index caae586a..3ce91ade 100644 --- a/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/MessageListAdapter.kt +++ b/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/MessageListAdapter.kt @@ -31,7 +31,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import coil.load import coil.transform.CircleCropTransformation -import io.getstream.chat.android.client.models.Message +import io.getstream.chat.android.models.Message import io.getstream.videochat.databinding.ItemMessageBinding class MessageListAdapter : diff --git a/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/VideoDetailViewModel.kt b/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/VideoDetailViewModel.kt index 9ef74c3c..2b95375d 100644 --- a/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/VideoDetailViewModel.kt +++ b/video-chat-sample/src/main/kotlin/io/getstream/videochat/ui/detail/VideoDetailViewModel.kt @@ -33,8 +33,8 @@ import io.getstream.chat.android.client.api.models.QueryChannelRequest import io.getstream.chat.android.client.channel.ChannelClient import io.getstream.chat.android.client.channel.subscribeFor import io.getstream.chat.android.client.events.NewMessageEvent -import io.getstream.chat.android.client.models.Message import io.getstream.chat.android.client.utils.observable.Disposable +import io.getstream.chat.android.models.Message import io.getstream.videochat.YoutubeVideo class VideoDetailViewModel( @@ -55,9 +55,7 @@ class VideoDetailViewModel( .withMessages(30) .withWatch() channelClient.query(query).enqueue { - if (it.isSuccess) { - _messages.value = it.data().messages - } + it.onSuccess { _messages.value = it.messages } } channelClient.subscribeFor { event -> diff --git a/virtual-event-sample/build.gradle b/virtual-event-sample/build.gradle index c9a1663a..a5d2fb76 100644 --- a/virtual-event-sample/build.gradle +++ b/virtual-event-sample/build.gradle @@ -71,7 +71,9 @@ android { dependencies { // Stream SDK dependency - implementation "io.getstream:stream-chat-android-ui-components:5.17.0" + implementation "io.getstream:stream-chat-android-ui-components:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-state:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-offline:6.0.0-beta2" implementation libs.androidxCoreKtx implementation libs.androidxAppCompat diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainActivity.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainActivity.kt index f521ba48..7be0645a 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainActivity.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainActivity.kt @@ -54,7 +54,7 @@ class MainActivity : AppCompatActivity() { private fun setupToolbar() { viewModel.currentUser.observe(this) { user -> if (user != null) { - binding.userAvatarView.setUserData(user) + binding.userAvatarView.setUser(user) } } binding.userAvatarView.setOnClickListener { diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainViewModel.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainViewModel.kt index 3ab6ffd5..56302cff 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainViewModel.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/MainViewModel.kt @@ -28,12 +28,13 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.asLiveData import io.getstream.chat.android.client.ChatClient -import io.getstream.chat.android.client.models.User -import io.getstream.chat.android.client.setup.state.ClientState +import io.getstream.chat.android.models.User +import io.getstream.chat.android.state.extensions.globalState +import io.getstream.chat.android.state.plugin.state.global.GlobalState class MainViewModel( - clientState: ClientState = ChatClient.instance().clientState, + globalState: GlobalState = ChatClient.instance().globalState, ) : ViewModel() { - val currentUser: LiveData = clientState.user.asLiveData() + val currentUser: LiveData = globalState.user.asLiveData() } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/VirtualEventApp.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/VirtualEventApp.kt index c989db7b..95c4cb49 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/VirtualEventApp.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/VirtualEventApp.kt @@ -27,20 +27,22 @@ package io.getstream.chat.virtualevent import android.app.Application import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.logger.ChatLogLevel -import io.getstream.chat.android.client.models.User -import io.getstream.chat.android.offline.plugin.configuration.Config +import io.getstream.chat.android.models.User import io.getstream.chat.android.offline.plugin.factory.StreamOfflinePluginFactory +import io.getstream.chat.android.state.plugin.config.StatePluginConfig +import io.getstream.chat.android.state.plugin.factory.StreamStatePluginFactory class VirtualEventApp : Application() { override fun onCreate() { super.onCreate() - val offlinePluginFactory = StreamOfflinePluginFactory( - config = Config(), - appContext = this + val offlinePluginFactory = StreamOfflinePluginFactory(appContext = this) + val statePluginFactory = StreamStatePluginFactory( + config = StatePluginConfig(), + appContext = this, ) ChatClient.Builder("7de6n9dsyzjx", applicationContext) - .withPlugin(offlinePluginFactory) + .withPlugins(offlinePluginFactory, statePluginFactory) .logLevel(ChatLogLevel.ALL) .build() diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/DirectChatActivity.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/DirectChatActivity.kt index ecd62bc6..53cf7bdb 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/DirectChatActivity.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/DirectChatActivity.kt @@ -33,16 +33,16 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.descendants import androidx.core.view.setPadding -import com.getstream.sdk.chat.viewmodel.MessageInputViewModel -import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel -import io.getstream.chat.android.ui.message.input.MessageInputView -import io.getstream.chat.android.ui.message.input.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.MessageListView -import io.getstream.chat.android.ui.message.list.header.MessageListHeaderView -import io.getstream.chat.android.ui.message.list.header.viewmodel.MessageListHeaderViewModel -import io.getstream.chat.android.ui.message.list.header.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.viewmodel.factory.MessageListViewModelFactory +import io.getstream.chat.android.ui.common.state.messages.Edit +import io.getstream.chat.android.ui.common.state.messages.MessageMode +import io.getstream.chat.android.ui.feature.messages.composer.MessageComposerView +import io.getstream.chat.android.ui.feature.messages.header.MessageListHeaderView +import io.getstream.chat.android.ui.feature.messages.list.MessageListView +import io.getstream.chat.android.ui.viewmodel.messages.MessageComposerViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListHeaderViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.messages.bindView import io.getstream.chat.virtualevent.databinding.ActivityDirectChatBinding class DirectChatActivity : AppCompatActivity() { @@ -54,7 +54,7 @@ class DirectChatActivity : AppCompatActivity() { private val factory: MessageListViewModelFactory by lazy { MessageListViewModelFactory(cid) } private val messageListViewModel: MessageListViewModel by viewModels { factory } private val messageListHeaderViewModel: MessageListHeaderViewModel by viewModels { factory } - private val messageInputViewModel: MessageInputViewModel by viewModels { factory } + private val messageInputViewModel: MessageComposerViewModel by viewModels { factory } private lateinit var binding: ActivityDirectChatBinding @@ -107,23 +107,24 @@ class DirectChatActivity : AppCompatActivity() { } } - private fun setupMessageInput(messageInputView: MessageInputView) { + private fun setupMessageInput(messageInputView: MessageComposerView) { messageInputViewModel.apply { messageInputViewModel.bindView(messageInputView, this@DirectChatActivity) messageListViewModel.mode.observe(this@DirectChatActivity) { when (it) { - is MessageListViewModel.Mode.Thread -> { + is MessageMode.MessageThread -> { messageListHeaderViewModel.setActiveThread(it.parentMessage) - messageInputViewModel.setActiveThread(it.parentMessage) } - is MessageListViewModel.Mode.Normal -> { + is MessageMode.Normal -> { messageListHeaderViewModel.resetThread() - messageInputViewModel.resetThread() } } + messageInputViewModel.setMessageMode(it) + } + binding.messageListView.setMessageEditHandler { + performMessageAction(Edit(it)) } - binding.messageListView.setMessageEditHandler(::postMessageToEdit) } } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/list/DirectChatsFragment.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/list/DirectChatsFragment.kt index 68dc2c1f..44ff07fb 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/list/DirectChatsFragment.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/list/DirectChatsFragment.kt @@ -31,9 +31,9 @@ import android.view.ViewGroup import android.widget.FrameLayout import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import io.getstream.chat.android.ui.channel.list.viewmodel.ChannelListViewModel -import io.getstream.chat.android.ui.channel.list.viewmodel.bindView -import io.getstream.chat.android.ui.channel.list.viewmodel.factory.ChannelListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.channels.ChannelListViewModel +import io.getstream.chat.android.ui.viewmodel.channels.ChannelListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.channels.bindView import io.getstream.chat.virtualevent.databinding.FragmentDirectChatsBinding import io.getstream.chat.virtualevent.databinding.ViewDmEmptyBinding import io.getstream.chat.virtualevent.feature.dm.DirectChatActivity diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/ParticipantListAdapter.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/ParticipantListAdapter.kt index e85f8d31..34cbb288 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/ParticipantListAdapter.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/ParticipantListAdapter.kt @@ -27,7 +27,7 @@ package io.getstream.chat.virtualevent.feature.dm.new import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import io.getstream.chat.android.client.models.User +import io.getstream.chat.android.models.User import io.getstream.chat.virtualevent.databinding.ItemParticipantBinding class ParticipantListAdapter( @@ -70,7 +70,7 @@ class ParticipantListAdapter( fun bind(participants: User) { this.participants = participants with(binding) { - userAvatarView.setUserData(participants) + userAvatarView.setUser(participants) nameTextView.text = participants.name companyTextView.text = participants.extraData[EXTRA_COMPANY] as? String } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantActivity.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantActivity.kt index 945fade1..e4c2454b 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantActivity.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantActivity.kt @@ -29,7 +29,7 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity -import io.getstream.chat.android.livedata.utils.EventObserver +import androidx.lifecycle.Observer import io.getstream.chat.virtualevent.databinding.ActivitySelectParticipantBinding import io.getstream.chat.virtualevent.feature.dm.DirectChatActivity import io.getstream.chat.virtualevent.util.setupToolbar @@ -56,7 +56,7 @@ class SelectParticipantActivity : AppCompatActivity() { binding.participantsRecyclerView.adapter = adapter with(viewModel) { state.observe(this@SelectParticipantActivity, ::renderParticipantsState) - events.observe(this@SelectParticipantActivity, EventObserver(::handleEvent)) + events.observe(this@SelectParticipantActivity, Observer(::handleEvent)) } } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantViewModel.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantViewModel.kt index ac1e5597..f7427300 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantViewModel.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/dm/new/SelectParticipantViewModel.kt @@ -31,9 +31,8 @@ import androidx.lifecycle.viewModelScope import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.api.models.QueryUsersRequest import io.getstream.chat.android.client.errors.ChatError -import io.getstream.chat.android.client.models.Filters -import io.getstream.chat.android.client.models.User -import io.getstream.chat.android.livedata.utils.Event +import io.getstream.chat.android.models.Filters +import io.getstream.chat.android.models.User import io.getstream.chat.virtualevent.util.currentUserId import kotlinx.coroutines.launch @@ -48,14 +47,14 @@ class SelectParticipantViewModel( ) : ViewModel() { private val _state: MutableLiveData = MutableLiveData() - private val _events: MutableLiveData> = MutableLiveData() + private val _events: MutableLiveData = MutableLiveData() val state: LiveData = _state - val events: LiveData> = _events + val events: LiveData = _events init { _state.postValue(State.Loading) viewModelScope.launch { - val result = chatClient.queryUsers( + chatClient.queryUsers( QueryUsersRequest( filter = Filters.and( Filters.ne("id", currentUserId()), @@ -64,12 +63,10 @@ class SelectParticipantViewModel( offset = 0, limit = 30, ) - ).await() - if (result.isSuccess) { - _state.postValue(State.Content(result.data())) - } else { - _state.postValue(State.Error(result.error())) - } + ) + .await() + .onSuccess { _state.postValue(State.Content(it)) } + .onError { _state.postValue(State.Error(it)) } } } @@ -81,10 +78,7 @@ class SelectParticipantViewModel( memberIds = listOf(user.id, currentUserId()), extraData = mapOf() ).await() - if (result.isSuccess) { - val cid = result.data().cid - _events.postValue(Event(UiEvent.NavigateToChat(cid))) - } + .onSuccess { _events.postValue(UiEvent.NavigateToChat(it.cid)) } } } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/EventDetailsActivity.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/EventDetailsActivity.kt index f38a8797..b8fb1985 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/EventDetailsActivity.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/EventDetailsActivity.kt @@ -30,14 +30,13 @@ import android.net.Uri import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager -import com.getstream.sdk.chat.viewmodel.MessageInputViewModel -import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.Player import com.google.android.exoplayer2.SimpleExoPlayer -import io.getstream.chat.android.ui.message.input.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.viewmodel.factory.MessageListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.messages.MessageComposerViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.messages.bindView import io.getstream.chat.virtualevent.databinding.ActivityEventDetailsBinding import io.getstream.chat.virtualevent.util.setupToolbar @@ -48,7 +47,7 @@ import io.getstream.chat.virtualevent.util.setupToolbar class EventDetailsActivity : AppCompatActivity() { private lateinit var messageListViewModel: MessageListViewModel - private lateinit var messageInputViewModel: MessageInputViewModel + private lateinit var messageInputViewModel: MessageComposerViewModel private lateinit var binding: ActivityEventDetailsBinding private var player: SimpleExoPlayer? = null @@ -61,7 +60,7 @@ class EventDetailsActivity : AppCompatActivity() { val cid = intent.getStringExtra(KEY_EXTRA_CID)!! val factory = MessageListViewModelFactory(cid = cid) messageListViewModel = factory.create(MessageListViewModel::class.java) - messageInputViewModel = factory.create(MessageInputViewModel::class.java) + messageInputViewModel = factory.create(MessageComposerViewModel::class.java) setupToolbar() setupMessageListView() diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/LivestreamMessageItemVhFactory.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/LivestreamMessageItemVhFactory.kt index 62242838..f3fce4a9 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/LivestreamMessageItemVhFactory.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/event/detail/LivestreamMessageItemVhFactory.kt @@ -26,11 +26,11 @@ package io.getstream.chat.virtualevent.feature.event.detail import android.view.LayoutInflater import android.view.ViewGroup -import com.getstream.sdk.chat.adapter.MessageListItem -import io.getstream.chat.android.ui.message.list.adapter.BaseMessageItemViewHolder -import io.getstream.chat.android.ui.message.list.adapter.MessageListItemPayloadDiff -import io.getstream.chat.android.ui.message.list.adapter.MessageListItemViewHolderFactory -import io.getstream.chat.android.ui.message.list.adapter.MessageListItemViewType.PLAIN_TEXT +import io.getstream.chat.android.ui.feature.messages.list.adapter.BaseMessageItemViewHolder +import io.getstream.chat.android.ui.feature.messages.list.adapter.MessageListItem +import io.getstream.chat.android.ui.feature.messages.list.adapter.MessageListItemPayloadDiff +import io.getstream.chat.android.ui.feature.messages.list.adapter.MessageListItemViewHolderFactory +import io.getstream.chat.android.ui.feature.messages.list.adapter.MessageListItemViewType.PLAIN_TEXT import io.getstream.chat.virtualevent.databinding.ItemMessagePlainTextBinding class LivestreamMessageItemVhFactory : MessageListItemViewHolderFactory() { @@ -58,7 +58,7 @@ class PlainTextViewHolder( override fun bindData(data: MessageListItem.MessageItem, diff: MessageListItemPayloadDiff?) { binding.messageTextView.text = data.message.text binding.usernameTextView.text = data.message.user.name - binding.avatarView.setUserData(data.message.user) + binding.avatarView.setUser(data.message.user) // TODO: check if we can push back on this binding.messageTimeTextView.text = "2 mins" } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserActivity.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserActivity.kt index 6ae5e79e..f72fd9b6 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserActivity.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserActivity.kt @@ -29,7 +29,7 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity -import io.getstream.chat.android.livedata.utils.EventObserver +import androidx.lifecycle.Observer import io.getstream.chat.virtualevent.MainActivity import io.getstream.chat.virtualevent.databinding.ActivitySwitchUserBinding import io.getstream.chat.virtualevent.util.setupToolbar @@ -52,7 +52,7 @@ class SwitchUserActivity : AppCompatActivity() { binding.usersRecyclerView.adapter = adapter with(viewModel) { state.observe(this@SwitchUserActivity, ::renderUsersState) - events.observe(this@SwitchUserActivity, EventObserver(::handleEvent)) + events.observe(this@SwitchUserActivity, Observer(::handleEvent)) } } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserViewModel.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserViewModel.kt index a3d8ed02..0f1f1afe 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserViewModel.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/SwitchUserViewModel.kt @@ -29,8 +29,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import io.getstream.chat.android.client.ChatClient -import io.getstream.chat.android.client.models.User -import io.getstream.chat.android.livedata.utils.Event +import io.getstream.chat.android.models.User import io.getstream.chat.virtualevent.AppConfig import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -38,9 +37,9 @@ import kotlinx.coroutines.launch class SwitchUserViewModel : ViewModel() { private val _state: MutableLiveData = MutableLiveData() - private val _events: MutableLiveData> = MutableLiveData() + private val _events: MutableLiveData = MutableLiveData() val state: LiveData = _state - val events: LiveData> = _events + val events: LiveData = _events init { val users = AppConfig.availableUsers @@ -72,7 +71,7 @@ class SwitchUserViewModel : ViewModel() { .connectUser(user, token) .enqueue { result -> if (result.isSuccess) { - _events.postValue(Event(UiEvent.NavigateToHomeScreen)) + _events.postValue(UiEvent.NavigateToHomeScreen) } } } diff --git a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/UserListAdapter.kt b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/UserListAdapter.kt index 28137bfa..bdeec95c 100644 --- a/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/UserListAdapter.kt +++ b/virtual-event-sample/src/main/java/io/getstream/chat/virtualevent/feature/user/UserListAdapter.kt @@ -27,7 +27,7 @@ package io.getstream.chat.virtualevent.feature.user import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import io.getstream.chat.android.client.models.User +import io.getstream.chat.android.models.User import io.getstream.chat.virtualevent.databinding.ItemUserBinding class UserListAdapter( @@ -70,7 +70,7 @@ class UserListAdapter( fun bind(user: User) { this.user = user with(binding) { - userAvatarView.setUserData(user) + userAvatarView.setUser(user) nameTextView.text = user.name } } diff --git a/virtual-event-sample/src/main/res/layout/activity_direct_chat.xml b/virtual-event-sample/src/main/res/layout/activity_direct_chat.xml index 6a428461..8b92797e 100644 --- a/virtual-event-sample/src/main/res/layout/activity_direct_chat.xml +++ b/virtual-event-sample/src/main/res/layout/activity_direct_chat.xml @@ -22,12 +22,15 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - + android:layout_height="match_parent" + > - + app:streamUiMessageListHeaderShowUserAvatar="false" + /> - + app:streamUiPinMessageEnabled="false" + /> - - + app:layout_constraintTop_toBottomOf="@+id/messageListView" + /> diff --git a/virtual-event-sample/src/main/res/layout/activity_event_details.xml b/virtual-event-sample/src/main/res/layout/activity_event_details.xml index a92dfed9..526c5a62 100644 --- a/virtual-event-sample/src/main/res/layout/activity_event_details.xml +++ b/virtual-event-sample/src/main/res/layout/activity_event_details.xml @@ -22,10 +22,13 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - + android:layout_height="match_parent" + > + app:navigationIcon="@drawable/ic_left" + > - + android:textColor="@color/static_white" + /> + app:layout_constraintTop_toBottomOf="@id/toolbar" + > + android:background="@color/static_dark_grey" + /> + app:use_controller="false" + /> + android:textColor="@color/static_white" + /> - + app:lottie_rawRes="@raw/mic_on" + /> - + android:src="@drawable/ic_connection" + /> - + app:streamUiPinMessageEnabled="true" + /> - - + /> diff --git a/virtual-event-sample/src/main/res/layout/activity_main.xml b/virtual-event-sample/src/main/res/layout/activity_main.xml index db57ff7e..8e599478 100644 --- a/virtual-event-sample/src/main/res/layout/activity_main.xml +++ b/virtual-event-sample/src/main/res/layout/activity_main.xml @@ -26,7 +26,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + > + app:layout_constraintTop_toTopOf="parent" + > + android:layout_height="match_parent" + > + app:layout_constraintTop_toTopOf="parent" + /> + app:layout_constraintTop_toTopOf="parent" + /> - - + tools:src="@tools:sample/avatars" + /> - + app:navGraph="@navigation/nav_graph" + /> - + app:menu="@menu/bottom_nav_menu" + /> diff --git a/virtual-event-sample/src/main/res/layout/fragment_direct_chats.xml b/virtual-event-sample/src/main/res/layout/fragment_direct_chats.xml index f0b15f08..f4e3d644 100644 --- a/virtual-event-sample/src/main/res/layout/fragment_direct_chats.xml +++ b/virtual-event-sample/src/main/res/layout/fragment_direct_chats.xml @@ -27,9 +27,10 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".feature.dm.list.DirectChatsFragment"> + tools:context=".feature.dm.list.DirectChatsFragment" + > - + app:streamUiForegroundLayoutColor="@color/app_canvas" + /> - + app:layout_constraintStart_toStartOf="parent" + /> diff --git a/virtual-event-sample/src/main/res/layout/item_message_plain_text.xml b/virtual-event-sample/src/main/res/layout/item_message_plain_text.xml index 9de6dd27..349c7a32 100644 --- a/virtual-event-sample/src/main/res/layout/item_message_plain_text.xml +++ b/virtual-event-sample/src/main/res/layout/item_message_plain_text.xml @@ -28,9 +28,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/margin_tiny" - android:paddingBottom="@dimen/margin_small"> + android:paddingBottom="@dimen/margin_small" + > - + tools:src="@tools:sample/avatars" + /> + tools:text="Lincoln Culhane" + /> + tools:text="2 mins" + /> + tools:text="You can't transmit the alarm without quantifying the haptic AGP card!" + /> + app:layout_constraintGuide_begin="8dp" + /> - + app:layout_constraintGuide_end="8dp" + /> diff --git a/virtual-event-sample/src/main/res/layout/item_participant.xml b/virtual-event-sample/src/main/res/layout/item_participant.xml index 4df2b09a..9d9b0276 100644 --- a/virtual-event-sample/src/main/res/layout/item_participant.xml +++ b/virtual-event-sample/src/main/res/layout/item_participant.xml @@ -29,9 +29,10 @@ android:layout_height="48dp" android:background="?attr/selectableItemBackground" android:paddingHorizontal="@dimen/margin_small" - android:paddingVertical="@dimen/margin_tiny"> + android:paddingVertical="@dimen/margin_tiny" + > - + /> + tools:text="Jerome Abbadi" + /> - + tools:text="Harvey Inc" + /> \ No newline at end of file diff --git a/virtual-event-sample/src/main/res/layout/item_user.xml b/virtual-event-sample/src/main/res/layout/item_user.xml index 2df0ece7..6ebbca80 100644 --- a/virtual-event-sample/src/main/res/layout/item_user.xml +++ b/virtual-event-sample/src/main/res/layout/item_user.xml @@ -28,9 +28,10 @@ android:layout_width="match_parent" android:layout_height="72dp" android:background="?selectableItemBackground" - android:paddingHorizontal="@dimen/margin_small"> + android:paddingHorizontal="@dimen/margin_small" + > - + tools:src="@tools:sample/avatars" + /> + tools:text="Jerome Abbadi" + /> + app:layout_constraintTop_toBottomOf="@+id/nameTextView" + /> - + app:layout_constraintTop_toTopOf="parent" + /> \ No newline at end of file diff --git a/whatsapp-clone-sample/build.gradle b/whatsapp-clone-sample/build.gradle index d94e5a5e..7fea5ae9 100644 --- a/whatsapp-clone-sample/build.gradle +++ b/whatsapp-clone-sample/build.gradle @@ -36,7 +36,9 @@ android { dependencies { // Stream SDK dependency - implementation "io.getstream:stream-chat-android-ui-components:5.17.0" + implementation "io.getstream:stream-chat-android-ui-components:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-state:6.0.0-beta2" + implementation "io.getstream:stream-chat-android-offline:6.0.0-beta2" implementation libs.kotlinStdLib implementation libs.androidxViewPager2 diff --git a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/WhatsApp.kt b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/WhatsApp.kt index bd03be82..d2c758cd 100644 --- a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/WhatsApp.kt +++ b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/WhatsApp.kt @@ -26,9 +26,10 @@ package io.getstream.whatsappclone import android.app.Application import io.getstream.chat.android.client.ChatClient -import io.getstream.chat.android.client.models.User -import io.getstream.chat.android.offline.plugin.configuration.Config +import io.getstream.chat.android.models.User import io.getstream.chat.android.offline.plugin.factory.StreamOfflinePluginFactory +import io.getstream.chat.android.state.plugin.config.StatePluginConfig +import io.getstream.chat.android.state.plugin.factory.StreamStatePluginFactory class WhatsApp : Application() { @@ -36,11 +37,14 @@ class WhatsApp : Application() { super.onCreate() val offlinePluginFactory = StreamOfflinePluginFactory( - config = Config(), appContext = this ) + val statePluginFactory = StreamStatePluginFactory( + config = StatePluginConfig(), + appContext = this, + ) ChatClient.Builder("qx5us2v6xvmh", this) - .withPlugin(offlinePluginFactory) + .withPlugins(offlinePluginFactory, statePluginFactory) .build() val user = User().apply { diff --git a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/channels/ChannelListFragment.kt b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/channels/ChannelListFragment.kt index bb198dc8..7f472ff4 100644 --- a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/channels/ChannelListFragment.kt +++ b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/channels/ChannelListFragment.kt @@ -31,9 +31,9 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController -import io.getstream.chat.android.ui.channel.list.viewmodel.ChannelListViewModel -import io.getstream.chat.android.ui.channel.list.viewmodel.bindView -import io.getstream.chat.android.ui.channel.list.viewmodel.factory.ChannelListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.channels.ChannelListViewModel +import io.getstream.chat.android.ui.viewmodel.channels.ChannelListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.channels.bindView import io.getstream.whatsappclone.databinding.FragmentChannelListBinding import io.getstream.whatsappclone.ui.home.HomeFragmentDirections @@ -62,8 +62,9 @@ class ChannelListFragment : Fragment() { super.onViewCreated(view, savedInstanceState) viewModel.bindView(binding.channelList, viewLifecycleOwner) - binding.channelList.setChannelItemClickListener { (cid) -> - findNavController().navigate(HomeFragmentDirections.navHomeToChannel(cid)) + binding.channelList.setChannelItemClickListener { channel -> + println("JcLog: cid -> ${channel.cid}") + findNavController().navigate(HomeFragmentDirections.navHomeToChannel(channel.cid)) } } } diff --git a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageInputView.kt b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageInputView.kt index d3cb4998..7e6dbb44 100644 --- a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageInputView.kt +++ b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageInputView.kt @@ -52,17 +52,16 @@ class MessageInputView @JvmOverloads constructor( private var binding: ViewMessageInputBinding = ViewMessageInputBinding.inflate(LayoutInflater.from(context), this, true) - fun initViews(sendMessage: (String) -> Unit, keystroke: () -> Unit) { + fun initViews(sendMessage: () -> Unit, keystroke: (String) -> Unit) { binding.voiceRecordingOrSend.setOnClickListener { - - sendMessage.invoke(binding.messageInput.text.toString()) + sendMessage() binding.messageInput.setText("") } // listen to typing events and connect to the view model binding.messageInput.doAfterTextChanged { if (it.toString().isNotEmpty()) { - keystroke.invoke() + keystroke.invoke(it.toString()) binding.takePicture.isVisible = false binding.voiceRecordingOrSend.setImageResource(R.drawable.ic_send_black_24dp) } else { diff --git a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageListFragment.kt b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageListFragment.kt index ae8e3f77..34f4a589 100644 --- a/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageListFragment.kt +++ b/whatsapp-clone-sample/src/main/kotlin/io/getstream/whatsappclone/ui/messages/MessageListFragment.kt @@ -36,13 +36,14 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import com.getstream.sdk.chat.viewmodel.MessageInputViewModel -import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel import io.getstream.chat.android.client.ChatClient +import io.getstream.chat.android.state.extensions.globalState import io.getstream.chat.android.ui.ChatUI -import io.getstream.chat.android.ui.message.list.header.viewmodel.MessageListHeaderViewModel -import io.getstream.chat.android.ui.message.list.viewmodel.bindView -import io.getstream.chat.android.ui.message.list.viewmodel.factory.MessageListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.messages.MessageComposerViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListHeaderViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModel +import io.getstream.chat.android.ui.viewmodel.messages.MessageListViewModelFactory +import io.getstream.chat.android.ui.viewmodel.messages.bindView import io.getstream.whatsappclone.R import io.getstream.whatsappclone.databinding.FragmentMessageListBinding @@ -53,7 +54,7 @@ class MessageListFragment : Fragment() { private val factory: MessageListViewModelFactory by lazy { MessageListViewModelFactory(args.cid) } private val messageListHeaderViewModel: MessageListHeaderViewModel by viewModels { factory } private val messageListViewModel: MessageListViewModel by viewModels { factory } - private val messageInputViewModel: MessageInputViewModel by viewModels { factory } + private val messageInputViewModel: MessageComposerViewModel by viewModels { factory } private var _binding: FragmentMessageListBinding? = null private val binding get() = _binding!! @@ -102,10 +103,10 @@ class MessageListFragment : Fragment() { } messageListHeaderViewModel.channel.observe(viewLifecycleOwner) { channel -> - val user = ChatClient.instance().clientState.user.value + val user = ChatClient.instance().globalState.user.value binding.channelNameTextView.text = ChatUI.channelNameFormatter.formatChannelName(channel, user) - binding.avatarView.setChannelData(channel) + binding.avatarView.setChannel(channel) } } @@ -115,8 +116,8 @@ class MessageListFragment : Fragment() { private fun setupMessageInput() { binding.messageInputView.initViews( - sendMessage = { message -> messageInputViewModel.sendMessage(message) }, - keystroke = { messageInputViewModel.keystroke() } + sendMessage = messageInputViewModel::sendMessage, + keystroke = messageInputViewModel::setMessageInput ) } diff --git a/whatsapp-clone-sample/src/main/res/layout/fragment_channel_list.xml b/whatsapp-clone-sample/src/main/res/layout/fragment_channel_list.xml index 25eba0ee..e99d1cb1 100644 --- a/whatsapp-clone-sample/src/main/res/layout/fragment_channel_list.xml +++ b/whatsapp-clone-sample/src/main/res/layout/fragment_channel_list.xml @@ -27,7 +27,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - -