This guide builds a single chat window — no sidebar, no conversation list. Users go directly into a one-to-one or group chat. Good for support chat, dating apps, or notification-driven flows.This assumes you’ve already completed the integration guide for your chosen UI toolkit (project created, dependencies installed, init + login working).
import android.os.Bundleimport android.widget.Toastimport androidx.activity.enableEdgeToEdgeimport androidx.appcompat.app.AppCompatActivityimport com.cometchat.chat.models.Groupimport com.cometchat.chat.models.Userimport com.cometchat.uikit.kotlin.presentation.messagecomposer.ui.CometChatMessageComposerimport com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeaderimport com.cometchat.uikit.kotlin.presentation.messagelist.ui.CometChatMessageListclass MessageActivity : AppCompatActivity() { private lateinit var messageHeader: CometChatMessageHeader private lateinit var messageList: CometChatMessageList private lateinit var messageComposer: CometChatMessageComposer override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_message) messageHeader = findViewById(R.id.message_header) messageList = findViewById(R.id.message_list) messageComposer = findViewById(R.id.message_composer) val user = intent.getSerializableExtra("user") as? User val group = intent.getSerializableExtra("group") as? Group when { user != null -> { messageHeader.setUser(user) messageList.setUser(user) messageComposer.setUser(user) } group != null -> { messageHeader.setGroup(group) messageList.setGroup(group) messageComposer.setGroup(group) } else -> { Toast.makeText(this, "Missing user or group data", Toast.LENGTH_SHORT).show() finish() } } messageHeader.setOnBackPress { finish() } }}
You must use an activity that supports the lifecycle API (AppCompatActivity, ComponentActivity, or FragmentActivity) to properly manage the UI Kit’s lifecycle events.
Create a MessageScreen composable with header, list, and composer stacked vertically:
To open a direct chat with a specific user, pass the User object when launching the screen.
Kotlin (XML Views)
Jetpack Compose
// From any Activity — pass the User object via Intentval intent = Intent(this, MessageActivity::class.java)intent.putExtra("user", user) // User is SerializablestartActivity(intent)
Full example after login:
MainActivity.kt
private fun loginUser() { CometChatUIKit.login("cometchat-uid-1", object : CometChat.CallbackListener<User>() { override fun onSuccess(user: User) { Log.d(TAG, "Login successful: ${user.uid}") // Fetch the target user, then launch the chat CometChat.getUser("cometchat-uid-2", object : CometChat.CallbackListener<User>() { override fun onSuccess(targetUser: User) { val intent = Intent(this@MainActivity, MessageActivity::class.java) intent.putExtra("user", targetUser) startActivity(intent) } override fun onError(e: CometChatException?) { Log.e(TAG, "Error fetching user: ${e?.message}") } }) } override fun onError(e: CometChatException) { Log.e(TAG, "Login failed: ${e.message}") } })}
// Pass the User object directly to the composableMessageScreen( user = targetUser, onBack = { /* navigate back */ })
To open a group chat, pass the Group object instead.
Kotlin (XML Views)
Jetpack Compose
// From any Activity — pass the Group object via Intentval intent = Intent(this, MessageActivity::class.java)intent.putExtra("group", group) // Group is SerializablestartActivity(intent)
Full example after login:
MainActivity.kt
private fun loginUser() { CometChatUIKit.login("cometchat-uid-1", object : CometChat.CallbackListener<User>() { override fun onSuccess(user: User) { Log.d(TAG, "Login successful: ${user.uid}") // Fetch the target group, then launch the chat CometChat.getGroup("cometchat-guid-1", object : CometChat.CallbackListener<Group>() { override fun onSuccess(group: Group) { val intent = Intent(this@MainActivity, MessageActivity::class.java) intent.putExtra("group", group) startActivity(intent) } override fun onError(e: CometChatException?) { Log.e(TAG, "Error fetching group: ${e?.message}") } }) } override fun onError(e: CometChatException) { Log.e(TAG, "Login failed: ${e.message}") } })}
// Pass the Group object directly to the composableMessageScreen( group = targetGroup, onBack = { /* navigate back */ })