Overview
Threaded replies allow users to respond directly to a specific message in one-on-one or group chats, improving context and readability:- Organizes related replies into a dedicated thread view.
- Mirrors functionality in Slack, Discord, and WhatsApp.
- Maintains clarity in active conversations.
Prerequisites
- Android project in Android Studio.
- CometChat Android UI Kit v5 added to your
build.gradle
. - Valid CometChat App ID, Auth Key, and Region initialized.
<uses-permission android:name="android.permission.INTERNET"/>
inAndroidManifest.xml
.- Logged-in user via
CometChat.login()
. - Existing
MessagesActivity
usingCometChatMessageList
.
Components
Component | Role |
---|---|
activity_thread_message.xml | Defines thread UI: header, message list, composer, unblock. |
ThreadMessageActivity | Hosts thread screen; initializes UI & ViewModel. |
ThreadMessageViewModel | Fetches parent message & thread replies; manages state. |
CometChatMessageList | Displays threaded replies when given parent message ID. |
CometChatMessageComposer | Composes and sends replies with parentMessageId . |
CometChatMessageOption | Defines “Message Privately” in message context menus. |
UserDetailActivity | Handles blocked-user UI; hides composer & shows unblock. |
Integration Steps
Step 1: Add Thread Layout
Createres/layout/activity_thread_message.xml
:
activity_thread_message.xml
Step 2: Set up ThreadMessageActivity
Initialize UI & handle blocked-user flows:ThreadMessageActivity.java
Step 3: Create ThreadMessageViewModel
Fetch parent message and expose LiveData:ThreadMessageViewModel.java
Step 4: Hook Thread Entry from Message List
InMessagesActivity.java
, capture thread icon taps:
MessagesActivity.java
Implementation Flow
- User taps thread icon on a message.
Intent
launchesThreadMessageActivity
withmessage_id
.- ViewModel fetches parent message details.
- Header &
MessageList
render parent + replies. - Composer sends new replies under the parent message.
- Live updates flow automatically via UI Kit.
Customization Options
- Styling: Override theme attributes or call setter methods on views.
- Header Height:
threadHeader.setMaxHeight(...)
. - Hide Reactions:
threadHeader.setReactionVisibility(View.GONE)
.
Filtering & Edge Cases
- Group Membership: Verify membership before enabling composer.
- Empty Thread: Show placeholder if no replies.
- Blocked Users: Composer hidden; use unblock layout.
Blocked-User Handling
InUserDetailActivity
, detect and toggle UI:
UserDetailActivity.java
Group vs. User-Level Differences
Scenario | Behavior |
---|---|
ReceiverType.USER | Direct replies allowed if not blocked. |
ReceiverType.GROUP | Checks membership before thread access. |
Blocked User | Composer hidden; unblock layout shown. |
Not in Group | Show option to join group first. |
Summary / Feature Matrix
Feature | Component / Method |
---|---|
Show thread option | setOnThreadRepliesClick() |
Display thread messages | messageList.setParentMessage(messageId) |
Show parent message | header.setMessage(parentMessage) |
Compose reply | composer.setParentMessageId(messageId) |
Handle blocked users | isBlockedByMe() , hide composer + show unblock UI |
Next Steps & Further Reading
Android Sample App (Java)
Explore this feature in the CometChat SampleApp:
GitHub → SampleApp
Android Sample App (Kotlin)
Explore this feature in the CometChat SampleApp:
GitHub → SampleApp