> For the complete documentation index, see [llms.txt](https://docs.luciq.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.luciq.ai/android/set-up-luciq-for-android/set-up-bug-reporting/bug-reporting-callbacks.md).

# Bug Reporting Callbacks

Covered here are callbacks that you can use to have a block of code executed when a certain action is triggered for your Android apps.

{% hint style="warning" %}

#### Avoiding Memory Leaks

These APIs hold the callbacks in a strong reference, so we strongly suggest to avoid registering callbacks without unregistering them when needed, as it may cause a memory leak.
{% endhint %}

### Before Invoking Luciq

This block is executed on the UI thread. You can use it to perform any UI changes before the SDK's UI is shown.

{% tabs %}
{% tab title="Kotlin" %}
{% code overflow="wrap" %}

```kotlin
BugReporting.setOnInvokeCallback {
					 //do something
 }
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code overflow="wrap" %}

```java
BugReporting.setOnInvokeCallback(new OnInvokeCallback() {
            @Override
            public void onInvoke() {
               //do something
            }
});
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Before Sending a Report

{% hint style="warning" %}
`Luciq.onReportSubmitHandler` is deprecated as of SDK version 19.14.0. Use `Luciq.setOnBeforeSendHandler`, available from 19.14.0, instead.
{% endhint %}

This handler runs in the background before each bug report and crash report is sent, including non-fatal errors, ANRs and fatal hangs. It doesn't run for NDK crashes, surveys, feature requests or chat replies. You can use it to add tags, user attributes, user data and file attachments to the report. Return the event you received to send the report.

{% tabs %}
{% tab title="Kotlin" %}
{% code overflow="wrap" %}

```kotlin
Luciq.setOnBeforeSendHandler { event ->
    event.appendTags(listOf("checkout"))
    event.appendUserAttributes(mapOf("plan" to "premium"))
    event.setUserData("Cart: 3 items")
    // fileUri: a Uri your app can read
    event.addFileAttachment(fileUri, "cart.json")
    event
}
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code overflow="wrap" %}

```java
Luciq.setOnBeforeSendHandler(event -> {
    event.appendTags(Arrays.asList("checkout"));
    event.appendUserAttributes(Collections.singletonMap("plan", "premium"));
    event.setUserData("Cart: 3 items");
    // fileUri: a Uri your app can read
    event.addFileAttachment(fileUri, "cart.json");
    return event;
});
```

{% endcode %}
{% endtab %}
{% endtabs %}

We recommend registering the handler when you build the SDK. It is then in place from the first report, including a crash from the previous app launch, which a handler set later at runtime can't see.

{% tabs %}
{% tab title="Kotlin" %}
{% code overflow="wrap" %}

```kotlin
Luciq.Builder(this, "APP_TOKEN")
    .setOnBeforeSendHandler { event -> event }
    .build()
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code overflow="wrap" %}

```java
new Luciq.Builder(this, "APP_TOKEN")
    .setOnBeforeSendHandler(event -> event)
    .build();
```

{% endcode %}
{% endtab %}
{% endtabs %}

Unlike the deprecated `onReportSubmitHandler`, the handler receives a `LuciqEvent` rather than a `Report`: it adds data to the report, but it can't read the report's existing data or append console logs. Both APIs share one handler, so registering one replaces the other.

### After Dismissing Luciq

This block is executed on the UI thread. You can use it to perform any UI changes after the SDK's UI has been dismissed.

{% tabs %}
{% tab title="Kotlin" %}
{% code overflow="wrap" %}

```kotlin
BugReporting.setOnDismissCallback { issueState, reportType -> }
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code overflow="wrap" %}

```java
BugReporting.setOnDismissCallback(new OnSdkDismissCallback() {
            @Override
            public void call(DismissType issueState, OnSdkDismissCallback.ReportType reportType) {
                
            }
});
```

{% endcode %}
{% endtab %}
{% endtabs %}

You can find the following parameters within the `setOnDismissCallback` callback.

#### `DismissType`

Returns how the SDK was dismissed. It can be set to one of the three following possibilities:

* `SUBMIT`: Indicates that the issue was submitted and will be uploaded
* `CANCEL`: Indicates that the user closed the Luciq view without report submission
* `ADD_ATTACHMENT`: Indicates that the issue is in the process of being reported (for example, user is taking another screenshot)

#### `ReportType`

The type of report that was sent. If the SDK was dismissed without selecting a report type, it will be set to `bug`, so you might need to check `issueState` before `ReportType`. The possible different types are `bug`, `feedback`, `question`, and `other`.

## Disabling Callbacks

To disable any previously created callbacks, you'll simply need to set the method to `null` as shown below:

{% tabs %}
{% tab title="Kotlin" %}
{% code overflow="wrap" %}

```kotlin
BugReporting.setOnInvokeCallback(null)
Luciq.setOnBeforeSendHandler(null)
BugReporting.setOnDismissCallback(null)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code overflow="wrap" %}

```java
BugReporting.setOnInvokeCallback(null);
Luciq.setOnBeforeSendHandler(null);
BugReporting.setOnDismissCallback(null);
```

{% endcode %}
{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.luciq.ai/android/set-up-luciq-for-android/set-up-bug-reporting/bug-reporting-callbacks.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
