> ## Documentation Index
> Fetch the complete documentation index at: https://www.cometchat.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Call Logs

> CometChat Calling SDK v5 - Call Logs for Android

Retrieve call history for your application. Call logs provide detailed information about past calls including duration, participants, recordings, and status.

## Fetch Call Logs

Use `CallLogRequest` to fetch call logs with pagination support. The builder pattern allows you to filter results by various criteria.

<Tabs>
  <Tab title="Kotlin">
    ```kotlin theme={null}
    val callLogRequest = CallLogRequest.CallLogRequestBuilder()
        .setLimit(30)
        .build()

    callLogRequest.fetchNext(object : CometChatCalls.CallbackListener<List<CallLog>>() {
        override fun onSuccess(callLogs: List<CallLog>) {
            for (callLog in callLogs) {
                Log.d(TAG, "Session: ${callLog.sessionID}")
                Log.d(TAG, "Duration: ${callLog.totalDuration}")
                Log.d(TAG, "Status: ${callLog.status}")
            }
        }

        override fun onError(e: CometChatException) {
            Log.e(TAG, "Error: ${e.message}")
        }
    })
    ```
  </Tab>

  <Tab title="Java">
    ```java theme={null}
    CallLogRequest callLogRequest = new CallLogRequest.CallLogRequestBuilder()
        .setLimit(30)
        .build();

    callLogRequest.fetchNext(new CometChatCalls.CallbackListener<List<CallLog>>() {
        @Override
        public void onSuccess(List<CallLog> callLogs) {
            for (CallLog callLog : callLogs) {
                Log.d(TAG, "Session: " + callLog.getSessionID());
                Log.d(TAG, "Duration: " + callLog.getTotalDuration());
                Log.d(TAG, "Status: " + callLog.getStatus());
            }
        }

        @Override
        public void onError(CometChatException e) {
            Log.e(TAG, "Error: " + e.getMessage());
        }
    });
    ```
  </Tab>
</Tabs>

## CallLogRequestBuilder

Configure the request using the builder methods:

| Method                     | Type    | Description                                                      |
| -------------------------- | ------- | ---------------------------------------------------------------- |
| `setLimit(int)`            | int     | Number of call logs to fetch per request (default: 30, max: 100) |
| `setSessionType(String)`   | String  | Filter by call type: `video` or `audio`                          |
| `setCallStatus(String)`    | String  | Filter by call status                                            |
| `setHasRecording(boolean)` | boolean | Filter calls that have recordings                                |
| `setCallCategory(String)`  | String  | Filter by category: `call` or `meet`                             |
| `setCallDirection(String)` | String  | Filter by direction: `incoming` or `outgoing`                    |
| `setUid(String)`           | String  | Filter calls with a specific user                                |
| `setGuid(String)`          | String  | Filter calls with a specific group                               |

### Filter Examples

<Tabs>
  <Tab title="Kotlin">
    ```kotlin theme={null}
    // Fetch only video calls
    val videoCallsRequest = CallLogRequest.CallLogRequestBuilder()
        .setSessionType("video")
        .setLimit(20)
        .build()

    // Fetch calls with recordings
    val recordedCallsRequest = CallLogRequest.CallLogRequestBuilder()
        .setHasRecording(true)
        .build()

    // Fetch missed incoming calls
    val missedCallsRequest = CallLogRequest.CallLogRequestBuilder()
        .setCallStatus("missed")
        .setCallDirection("incoming")
        .build()

    // Fetch calls with a specific user
    val userCallsRequest = CallLogRequest.CallLogRequestBuilder()
        .setUid("user_id")
        .build()
    ```
  </Tab>

  <Tab title="Java">
    ```java theme={null}
    // Fetch only video calls
    CallLogRequest videoCallsRequest = new CallLogRequest.CallLogRequestBuilder()
        .setSessionType("video")
        .setLimit(20)
        .build();

    // Fetch calls with recordings
    CallLogRequest recordedCallsRequest = new CallLogRequest.CallLogRequestBuilder()
        .setHasRecording(true)
        .build();

    // Fetch missed incoming calls
    CallLogRequest missedCallsRequest = new CallLogRequest.CallLogRequestBuilder()
        .setCallStatus("missed")
        .setCallDirection("incoming")
        .build();

    // Fetch calls with a specific user
    CallLogRequest userCallsRequest = new CallLogRequest.CallLogRequestBuilder()
        .setUid("user_id")
        .build();
    ```
  </Tab>
</Tabs>

## Pagination

Use `fetchNext()` and `fetchPrevious()` for pagination:

<Tabs>
  <Tab title="Kotlin">
    ```kotlin theme={null}
    // Fetch next page
    callLogRequest.fetchNext(object : CometChatCalls.CallbackListener<List<CallLog>>() {
        override fun onSuccess(callLogs: List<CallLog>) {
            // Handle next page
        }

        override fun onError(e: CometChatException) {
            Log.e(TAG, "Error: ${e.message}")
        }
    })

    // Fetch previous page
    callLogRequest.fetchPrevious(object : CometChatCalls.CallbackListener<List<CallLog>>() {
        override fun onSuccess(callLogs: List<CallLog>) {
            // Handle previous page
        }

        override fun onError(e: CometChatException) {
            Log.e(TAG, "Error: ${e.message}")
        }
    })
    ```
  </Tab>

  <Tab title="Java">
    ```java theme={null}
    // Fetch next page
    callLogRequest.fetchNext(new CometChatCalls.CallbackListener<List<CallLog>>() {
        @Override
        public void onSuccess(List<CallLog> callLogs) {
            // Handle next page
        }

        @Override
        public void onError(CometChatException e) {
            Log.e(TAG, "Error: " + e.getMessage());
        }
    });

    // Fetch previous page
    callLogRequest.fetchPrevious(new CometChatCalls.CallbackListener<List<CallLog>>() {
        @Override
        public void onSuccess(List<CallLog> callLogs) {
            // Handle previous page
        }

        @Override
        public void onError(CometChatException e) {
            Log.e(TAG, "Error: " + e.getMessage());
        }
    });
    ```
  </Tab>
</Tabs>

## CallLog Object

Each `CallLog` object contains detailed information about a call:

| Property                 | Type                   | Description                            |
| ------------------------ | ---------------------- | -------------------------------------- |
| `sessionID`              | String                 | Unique identifier for the call session |
| `initiator`              | CallEntity             | User who initiated the call            |
| `receiver`               | CallEntity             | User or group that received the call   |
| `receiverType`           | String                 | `user` or `group`                      |
| `type`                   | String                 | Call type: `video` or `audio`          |
| `status`                 | String                 | Final status of the call               |
| `callCategory`           | String                 | Category: `call` or `meet`             |
| `initiatedAt`            | long                   | Timestamp when call was initiated      |
| `endedAt`                | long                   | Timestamp when call ended              |
| `totalDuration`          | String                 | Human-readable duration (e.g., "5:30") |
| `totalDurationInMinutes` | double                 | Duration in minutes                    |
| `totalAudioMinutes`      | double                 | Audio duration in minutes              |
| `totalVideoMinutes`      | double                 | Video duration in minutes              |
| `totalParticipants`      | int                    | Number of participants                 |
| `hasRecording`           | boolean                | Whether the call was recorded          |
| `recordings`             | List\<Recording>       | List of recording objects              |
| `participantInfoList`    | List\<ParticipantInfo> | List of participant details            |

## Access Recordings

If a call has recordings, access them through the `recordings` property:

<Tabs>
  <Tab title="Kotlin">
    ```kotlin theme={null}
    callLogRequest.fetchNext(object : CometChatCalls.CallbackListener<List<CallLog>>() {
        override fun onSuccess(callLogs: List<CallLog>) {
            for (callLog in callLogs) {
                if (callLog.isHasRecording) {
                    callLog.recordings?.forEach { recording ->
                        Log.d(TAG, "Recording ID: ${recording.rid}")
                        Log.d(TAG, "Recording URL: ${recording.recordingURL}")
                        Log.d(TAG, "Duration: ${recording.duration} seconds")
                    }
                }
            }
        }

        override fun onError(e: CometChatException) {
            Log.e(TAG, "Error: ${e.message}")
        }
    })
    ```
  </Tab>

  <Tab title="Java">
    ```java theme={null}
    callLogRequest.fetchNext(new CometChatCalls.CallbackListener<List<CallLog>>() {
        @Override
        public void onSuccess(List<CallLog> callLogs) {
            for (CallLog callLog : callLogs) {
                if (callLog.isHasRecording()) {
                    for (Recording recording : callLog.getRecordings()) {
                        Log.d(TAG, "Recording ID: " + recording.getRid());
                        Log.d(TAG, "Recording URL: " + recording.getRecordingURL());
                        Log.d(TAG, "Duration: " + recording.getDuration() + " seconds");
                    }
                }
            }
        }

        @Override
        public void onError(CometChatException e) {
            Log.e(TAG, "Error: " + e.getMessage());
        }
    });
    ```
  </Tab>
</Tabs>

<Accordion title="Call Status Values">
  | Status       | Description                         |
  | ------------ | ----------------------------------- |
  | `ongoing`    | Call is currently in progress       |
  | `busy`       | Receiver was busy                   |
  | `rejected`   | Call was rejected                   |
  | `cancelled`  | Call was cancelled by initiator     |
  | `ended`      | Call ended normally                 |
  | `missed`     | Call was missed                     |
  | `initiated`  | Call was initiated but not answered |
  | `unanswered` | Call was not answered               |
</Accordion>

<Accordion title="Call Category Values">
  | Category | Description               |
  | -------- | ------------------------- |
  | `call`   | Direct call between users |
  | `meet`   | Meeting/conference call   |
</Accordion>

<Accordion title="Call Direction Values">
  | Direction  | Description                |
  | ---------- | -------------------------- |
  | `incoming` | Call received by the user  |
  | `outgoing` | Call initiated by the user |
</Accordion>
