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

# User Presence

> Track and subscribe to user online/offline status and presence updates in your Android app

<Accordion title="AI Integration Quick Reference">
  <Tabs>
    <Tab title="Kotlin">
      ```kotlin theme={null}
      // Subscribe to presence during init
      val appSettings = AppSettings.AppSettingsBuilder()
          .subscribePresenceForAllUsers()
          .setRegion("REGION")
          .build()
      CometChat.init(context, "APP_ID", appSettings, callback)

      // Add user listener
      CometChat.addUserListener("LISTENER_ID", object : CometChat.UserListener() {
          override fun onUserOnline(user: User?) {
              Log.d(TAG, "${user?.name} is online")
          }
          override fun onUserOffline(user: User?) {
              Log.d(TAG, "${user?.name} is offline")
          }
      })

      // Remove listener (important!)
      CometChat.removeUserListener("LISTENER_ID")
      ```
    </Tab>

    <Tab title="Java">
      ```java theme={null}
      // Subscribe to presence during init
      AppSettings appSettings = new AppSettings.AppSettingsBuilder()
          .subscribePresenceForAllUsers()
          .setRegion("REGION")
          .build();
      CometChat.init(context, "APP_ID", appSettings, callback);

      // Add user listener
      CometChat.addUserListener("LISTENER_ID", new CometChat.UserListener() {
          @Override public void onUserOnline(User user) {
              Log.d(TAG, user.getName() + " is online");
          }
          @Override public void onUserOffline(User user) {
              Log.d(TAG, user.getName() + " is offline");
          }
      });

      // Remove listener (important!)
      CometChat.removeUserListener("LISTENER_ID");
      ```
    </Tab>
  </Tabs>
</Accordion>

User Presence lets you know if a user is available to chat. Configure presence subscription during `init()`, then listen for online/offline events via `UserListener`.

## Real-time Presence

Based on the `AppSettings` configured during `init()`, the logged-in user receives presence updates for other users.

`AppSettingsBuilder` provides three subscription options:

* `subscribePresenceForAllUsers()` — Receive presence for all users in the app.
* `subscribePresenceForRoles(List<String> roles)` — Receive presence only for users with specified roles.
* `subscribePresenceForFriends()` — Receive presence only for friends.

If none are set, no presence events are sent.

Register `UserListener` in `onResume()` and remove it in `onPause()`.

<Tabs>
  <Tab title="Java">
    ```java theme={null}
    private String listenerID = "UNIQUE_LISTENER_ID";

    CometChat.addUserListener(listenerID, new CometChat.UserListener() {
      @Override public void onUserOnline(User user) {
        Log.d(TAG, user.getName() + "is online.");
      }
      @Override public void onUserOffline(User user) {
        Log.d(TAG, user.getName() + "is offline.");
      }
    });   
    ```
  </Tab>

  <Tab title="Kotlin">
    ```kotlin theme={null}
    val listenerID:String = "UNIQUE_LISTENER_ID"

    CometChat.addUserListener(listenerID,object :CometChat.UserListener(){
      override fun onUserOffline(user: User?) {
        Log.d(TAG, user?.name + "is offline.")
      }
      override fun onUserOnline(user: User?) {
        Log.d(TAG, user?.name + "is online.")
      }
    })
    ```
  </Tab>
</Tabs>

| Parameter    | Description                                                                                     |
| ------------ | ----------------------------------------------------------------------------------------------- |
| `listenerID` | An ID that uniquely identifies that listener. We recommend using the activity or fragment name. |

Remove the listener in `onPause()` when the activity or fragment is no longer in use.

<Tabs>
  <Tab title="Java">
    ```java theme={null}
    private String listenerID = "UNIQUE_LISTENER_ID";

    CometChat.removeUserListener(listenerID);     
    ```
  </Tab>

  <Tab title="Kotlin">
    ```kotlin theme={null}
    val listenerID:String = "UNIQUE_LISTENER_ID"

    CometChat.removeUserListener(listenerID)   
    ```
  </Tab>
</Tabs>

<Warning>
  Always remove listeners when they're no longer needed (e.g., in `onPause()` or `onDestroy()`). Failing to remove listeners can cause memory leaks and duplicate event handling.
</Warning>

## User List Presence

When you [retrieve the list of users](/sdk/android/retrieve-users), each [`User`](/sdk/reference/entities#user) object includes:

* `status` — `"online"` or `"offline"`
* `lastActiveAt` — Unix timestamp of when the user was last online (useful for "Last seen" indicators)

***

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Retrieve Users" icon="users" href="/sdk/android/retrieve-users">
    Fetch user lists with presence information
  </Card>

  <Card title="Connection Status" icon="wifi" href="/sdk/android/connection-status">
    Monitor SDK connection state and handle reconnection
  </Card>

  <Card title="User Management" icon="user-gear" href="/sdk/android/user-management">
    Learn about user objects and properties
  </Card>

  <Card title="Real-Time Listeners" icon="bell" href="/sdk/android/real-time-listeners">
    Understand all available event listeners
  </Card>
</CardGroup>
