Skip to main content
FieldValue
ComponentsCometChatMessageHeader, CometChatMessageList, CometChatMessageComposer
LayoutSingle chat window — no conversation list
PrerequisiteComplete Kotlin Integration or Jetpack Compose Integration Steps 1–3 first
PatternSupport chat, embedded widgets, focused messaging
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).

What You’re Building

Three components stacked vertically:
  1. Message header — displays user/group name, avatar, and status
  2. Message list — real-time chat history with scrolling
  3. Message composer — text input with media and attachments

Step 1: Set Up the Message Screen

Create an Activity — MessageActivity to display the full-screen 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() }
    }
}
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: Launch a One-to-One Chat

To open a direct chat with a specific user, pass the User object when launching the screen.
// From any Activity — pass the User object via Intent
val intent = Intent(this, MessageActivity::class.java)
intent.putExtra("user", user) // User is Serializable
startActivity(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}")
        }
    })
}

Step 3: Launch a Group Chat

To open a group chat, pass the Group object instead.
// From any Activity — pass the Group object via Intent
val intent = Intent(this, MessageActivity::class.java)
intent.putExtra("group", group) // Group is Serializable
startActivity(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}")
        }
    })
}

Step 4: Register Activity & Permissions

Add the activity to your AndroidManifest.xml:
AndroidManifest.xml
<application ...>
    <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