> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-docs-llms-scoped-indexes.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Block/Unblock User

> Block and unblock users in CometChat Android UI Kit with user relationship checks, SDK methods, and composer UI updates.

<Accordion title="AI Integration Quick Reference">
  | Field | Value |
  | - | - |
  | Package | `com.cometchat:chat-uikit-android` |
  | Key components | `CometChatMessageComposer`, `CometChat.blockUsers()`, `CometChat.unblockUsers()`, `User.isBlockedByMe()` |
  | Purpose | Let users block and unblock others directly within chat to control unwanted communication. |
  | Related | [Message Composer](/ui-kit/android/v5/message-composer), [Message List](/ui-kit/android/v5/message-list), [All Guides](/ui-kit/android/v5/guide-overview) |
</Accordion>

Enable users to block and unblock others directly within chat using CometChat’s Android UI Kit v5+, preventing unwanted communication and giving users more control.

## Overview

Blocking a user stops them from sending messages to the blocker. The CometChat UIKit handles most behaviors internally:

* **Composer Hidden:** The message composer is hidden when chatting with a blocked user.
* **Unblock Prompt:** An “Unblock” button is displayed to reverse the block.
* **Message Restrictions:** Blocked users cannot send messages to the blocker.

## Prerequisites

* Android Studio project with CometChat Android UI Kit v5 added to `build.gradle`.
* CometChat **App ID**, **Auth Key**, and **Region** configured and initialized.
* `<uses-permission android:name="android.permission.INTERNET"/>` in `AndroidManifest.xml`.
* Logged-in user via `CometChat.login()`.
* Existing one-on-one chat screen using `CometChatMessageList` and `CometChatMessageComposer`.

## Components

| Component / Class | Role |
| :- | :- |
| `UserDetailActivity.java` | Displays user profile and provides block/unblock options. |
| `MessagesActivity.java` | Hosts the chat screen and toggles UI based on block state. |
| `CometChat.blockUsers()` | SDK API to block one or more users by UID. |
| `CometChat.unblockUsers()` | SDK API to unblock one or more users by UID. |
| `User.isBlockedByMe()` | Checks if the current user has blocked this user. |
| `unblockLayout` (View) | Layout shown when a user is blocked, containing unblock. |
| `CometChatMessageComposer` | Hidden when chatting with a blocked user. |

## Integration Steps

### 1. Detect Block Status

Update UI when block state changes.

<Tabs>
  <Tab title="Kotlin">
    ```kotlin lines theme={null}
    // In MessagesActivity.kt
    private fun updateUserBlockStatus(user: User) {
        val blocked = user.isBlockedByMe
        binding.messageComposer.visibility = if (blocked) View.GONE else View.VISIBLE
        binding.unblockLayout.visibility = if (blocked) View.VISIBLE else View.GONE
    }
    ```
  </Tab>

  <Tab title="Java">
    ```java lines theme={null}
    // In MessagesActivity.java
    private void updateUserBlockStatus(User user) {
        boolean blocked = user.isBlockedByMe();
        binding.messageComposer.setVisibility(blocked ? View.GONE : View.VISIBLE);
        binding.unblockLayout.setVisibility(blocked ? View.VISIBLE : View.GONE);
    }
    ```
  </Tab>
</Tabs>

**File reference:**\
[`MessagesActivity.java`](https://github.com/cometchat/cometchat-uikit-android/blob/v5/sample-app-java/src/main/java/com/cometchat/sampleapp/java/ui/activity/MessagesActivity.java)

Ensures the composer and unblock UI reflect the current block state.

### 2. Hide Composer & Show Unblock UI

Define layout elements and their visibility toggles.

```xml activity_messages.xml lines theme={null}
<!-- In activity_messages.xml -->
<com.cometchat.chatuikit.messagecomposer.CometChatMessageComposer
    android:id="@+id/messageComposer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<LinearLayout
    android:id="@+id/unblockLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:padding="12dp"
    android:visibility="gone">

    <Button
        android:id="@+id/unblockBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Unblock" />
</LinearLayout>
```

**File reference:**\
[`activity_messages.xml`](https://github.com/cometchat/cometchat-uikit-android/blob/v5/sample-app-java/src/main/res/layout/activity_messages.xml)

Prepares the UI containers for dynamic show/hide operations.

### 3. Trigger Unblock Action

Call the unblock API and observe status updates.

<Tabs>
  <Tab title="Kotlin">
    ```kotlin lines theme={null}
    // In MessagesActivity.kt
    binding.unblockBtn.setOnClickListener { viewModel.unblockUser() }

    // In MessagesViewModel.kt
    fun unblockUser() {
        CometChat.unblockUsers(listOf(currentUser.uid), object : CometChat.CallbackListener<HashMap<String, String>>() {
            override fun onSuccess(resultMap: HashMap<String, String>) {
                unblockButtonState.postValue(false)
            }
            override fun onError(e: CometChatException?) {
                // Handle error
            }
        })
    }
    ```
  </Tab>

  <Tab title="Java">
    ```java lines theme={null}
    // In MessagesActivity.java
    binding.unblockBtn.setOnClickListener(v -> viewModel.unblockUser());

    // In MessagesViewModel.java
    public void unblockUser() {
        CometChat.unblockUsers(Collections.singletonList(currentUser.getUid()), new CometChat.CallbackListener<HashMap<String, String>>() {
            @Override
            public void onSuccess(HashMap<String, String> resultMap) {
                unblockButtonState.postValue(false);
            }
            @Override
            public void onError(CometChatException e) {
                // Handle error
            }
        });
    }
    ```
  </Tab>
</Tabs>

**File references:**

* [`MessagesActivity.java`](https://github.com/cometchat/cometchat-uikit-android/blob/v5/sample-app-java/src/main/java/com/cometchat/sampleapp/java/ui/activity/MessagesActivity.java)
* [`MessagesViewModel.java`](https://github.com/cometchat/cometchat-uikit-android/blob/v5/sample-app-java/src/main/java/com/cometchat/sampleapp/java/viewmodels/MessagesViewModel.java)

Executes unblock logic and updates LiveData to refresh UI.

### 4. Trigger Block from Detail Screen

Allow blocking directly from a user’s profile.

<Tabs>
  <Tab title="Kotlin">
    ```kotlin lines theme={null}
    // In UserDetailActivity.kt
    binding.blockMenuItem.setOnClickListener {
        CometChat.blockUsers(listOf(user.uid), object : CometChat.CallbackListener<HashMap<String, String>>() {
            override fun onSuccess(resultMap: HashMap<String, String>) {
                viewModel.refreshUser()
            }
            override fun onError(e: CometChatException?) {
                // Handle error
            }
        })
    }
    ```
  </Tab>

  <Tab title="Java">
    ```java lines theme={null}
    // In UserDetailActivity.java
    binding.blockMenuItem.setOnClickListener(v -> {
        CometChat.blockUsers(Collections.singletonList(user.getUid()), new CometChat.CallbackListener<HashMap<String, String>>() {
            @Override
            public void onSuccess(HashMap<String, String> resultMap) {
                viewModel.refreshUser();
            }
            @Override
            public void onError(CometChatException e) {
                // Handle error
            }
        });
    });
    ```
  </Tab>
</Tabs>

**File reference:**\
[`UserDetailActivity.java`](https://github.com/cometchat/cometchat-uikit-android/blob/v5/sample-app-java/src/main/java/com/cometchat/sampleapp/java/ui/activity/UserDetailsActivity.java)

Integrates block action into the profile menu, triggering the UI toggle via LiveData.

## Implementation Flow

| Step | Action | Location |
| :- | :- | :- |
| 1 | Check block status | `updateUserBlockStatus()` in `MessagesActivity.java` fileciteturn9file0 |
| 2 | Show/hide composer and unblock layout | `activity_messages.xml` fileciteturn9file0 |
| 3 | Unblock API call and LiveData update | `MessagesViewModel.unblockUser()` |
| 4 | Block API call from profile | `UserDetailActivity.blockMenuItem` |

## Customization Options

* **Feedback UI:** Show a Toast or Snackbar upon success/failure.
* **Menu Icons/Text:** Toggle icon and text dynamically after block/unblock.
* **Disable History:** Optionally gray out or hide past messages when blocked.

## Filtering & Edge Cases

| Case | Behavior |
| :- | :- |
| Blocked User | Composer hidden; unblock layout shown. |
| Block Self | SDK ignores request; ensure menu is disabled. |
| Group Chat | Blocking affects only 1:1 communication. |
| Network Failure | Observe error callbacks and retry as needed. |

## Error Handling

* Handle errors from `blockUsers` and `unblockUsers` callbacks by showing alerts or retry prompts.
* Ensure UI LiveData states revert on failure.

## Group vs. User-Level Differences

| Scenario | UI Behavior |
| :- | :- |
| `ReceiverType.USER` | Block/unblock enabled. |
| `ReceiverType.GROUP` | Block option ignored; chat continues. |

## Summary / Feature Matrix

| Feature | Component / Method |
| :- | :- |
| Check block state | `User.isBlockedByMe()` |
| Block user | `CometChat.blockUsers()` |
| Unblock user | `CometChat.unblockUsers()` |
| Update UI | `updateUserBlockStatus()` |
| Profile block menu | `UserDetailActivity.blockMenuItem` |

## Next Steps & Further Reading

<CardGroup>
  <Card title="Android Sample App (Java)">
    Explore this feature in the CometChat SampleApp:
    [GitHub → SampleApp](https://github.com/cometchat/cometchat-uikit-android/tree/v5/sample-app-java)
  </Card>

  <Card title="Android Sample App (Kotlin)">
    Explore this feature in the CometChat SampleApp:
    [GitHub → SampleApp](https://github.com/cometchat/cometchat-uikit-android/tree/v5/sample-app-kotlin)
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.