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
MessagesActivityusingCometChatMessageList.
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.
IntentlaunchesThreadMessageActivitywithmessage_id.- ViewModel fetches parent message details.
- Header &
MessageListrender 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