Skip to main content
FieldValue
ComponentsCometChatConversations, CometChatMessageHeader, CometChatMessageList, CometChatMessageComposer
LayoutSequential navigation — conversation list → full-screen message view
PrerequisiteComplete Kotlin Integration or Jetpack Compose Integration Steps 1–3 first
PatternWhatsApp, Slack, Telegram
This guide builds a sequential navigation chat layout — conversation list as the entry point, tap a conversation to open a full-screen message view. This assumes you’ve already completed the integration guide for your chosen UI toolkit (project created, dependencies installed, init + login working).

What You’re Building

Three sections working together:
  1. Conversation list — shows all active conversations (users and groups)
  2. Message header — displays user/group name, avatar, and status
  3. Message list + composer — chat history with real-time updates and text input
This implementation uses Android’s standard Activity navigation: ConversationActivity displays the list, user taps a conversation, MessageActivity launches with the selected user/group data via Intent extras.

Step 1: Set Up the Conversation List

Create a new Activity called ConversationActivity to display the list of conversations.Layoutactivity_conversation.xml:
activity_conversation.xml
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.cometchat.uikit.kotlin.presentation.conversations.ui.CometChatConversations
        android:id="@+id/conversations"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
ActivityConversationActivity.kt:
ConversationActivity.kt
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import com.cometchat.chat.models.Group
import com.cometchat.chat.models.User
import com.cometchat.uikit.kotlin.presentation.conversations.ui.CometChatConversations

class ConversationActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_conversation)

        val conversations = findViewById<CometChatConversations>(R.id.conversations)

        conversations.setTitle("Chats")
        conversations.setOnItemClick { conversation ->
            val intent = Intent(this, MessageActivity::class.java)
            when (val entity = conversation.conversationWith) {
                is User -> intent.putExtra("user", entity)
                is Group -> intent.putExtra("group", entity)
                else -> Log.e("ConversationActivity", "Unknown conversation type")
            }
            startActivity(intent)
        }
    }
}
You must use an activity that supports the lifecycle API (AppCompatActivity, ComponentActivity, or FragmentActivity) to properly manage the UI Kit’s lifecycle events.

Step 2: Set Up the Message Screen

Create a new Activity — MessageActivity to display the chat interface.Layoutactivity_message.xml:
activity_message.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeader
        android:id="@+id/message_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <com.cometchat.uikit.kotlin.presentation.messagelist.ui.CometChatMessageList
        android:id="@+id/message_list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <com.cometchat.uikit.kotlin.presentation.messagecomposer.ui.CometChatMessageComposer
        android:id="@+id/message_composer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
ActivityMessageActivity.kt:
MessageActivity.kt
import android.os.Bundle
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import com.cometchat.chat.models.Group
import com.cometchat.chat.models.User
import com.cometchat.uikit.kotlin.presentation.messagecomposer.ui.CometChatMessageComposer
import com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeader
import com.cometchat.uikit.kotlin.presentation.messagelist.ui.CometChatMessageList

class 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() }
    }
}

Step 3: Update MainActivity

Update your MainActivity to launch ConversationActivity after successful 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}")

            // Launch Conversation List + Message View
            startActivity(Intent(this@MainActivity, ConversationActivity::class.java))
        }

        override fun onError(e: CometChatException) {
            Log.e(TAG, "Login failed: ${e.message}")
        }
    })
}

Step 4: Register Activities & Permissions

Add the new activities to your AndroidManifest.xml:
AndroidManifest.xml
<application ...>
    <activity android:name=".MainActivity" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ConversationActivity" />
    <activity android:name=".MessageActivity" />
</application>
Ensure you’ve added the required permissions in your AndroidManifest.xml:
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Next Steps

Components Overview

Explore all available UI Kit components and their customization options

Theming

Customize colors, fonts, and styles to match your brand

Integration

Back to the main integration guide

Feature Guides

Add capabilities like threaded messages, blocking, and group management