> For the complete documentation index, see [llms.txt](https://aatkit.gitbook.io/android-integration/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://aatkit.gitbook.io/android-integration/advanced/advanced-listeners/statistics-listener.md).

# Statistics Listener

Listen to placements' statistics events

### Statistics Listener

[StatisticsListener](https://gravite-sdk-releases.s3.eu-central-1.amazonaws.com/aatkit/android/docs/-a-a-t-kit/com.intentsoftware.addapptr/-a-a-t-kit/-statistics-listener/index.html) enables publishers to listen to all the placement-related statistics events. This might be useful e.g. to establish user-related analytics.

### Set Statistics Listener for Placement

Use the following code to set the statistics listener for a specific placement:

{% tabs %}
{% tab title="Java" %}

```java
placement.setStatisticsListener(this);
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
placement.statisticsListener = this
```

{% endtab %}
{% endtabs %}

### Expired Ads

Starting from AATKit 3.18, the `countedExpired` callback notifies you when a loaded ad expires and is discarded before being shown (fullscreen, rewarded video and banner cache ads - see [Ad Expiration](/android-integration/formats/fullscreen-interstitial.md#ad-expiration)). Unlike the other callbacks, it has a default (empty) implementation, so you only need to override it if you are interested in this event.

### Complete Code Example

{% hint style="info" %}
The below example can be applied to all types of placements.
{% endhint %}

{% tabs %}
{% tab title="Java" %}

```java
private void requestAd() {
    // Setting the impression delegate for the infeed-banner placement
    inFeedBannerPlacement.setStatisticsListener(this);
    BannerRequest request = new BannerRequest(this);
    inFeedBannerPlacement.requestAd(request, (layout, error) -> {
        // Display the banner or handle the error
    });
}

// StatisticsListener implementation:
@Override
public void countedAdSpace(@NonNull Placement placement) {
    // An ad space counted
}

@Override
public void countedMediationCycle(@NonNull Placement placement) {
    // An mediation cycle counted
}

@Override
public void countedRequest(@NonNull Placement placement, @NonNull AdNetwork network) {
    // An request counted
}

@Override
public void countedResponse(@NonNull Placement placement, @NonNull AdNetwork network) {
    // An response counted
}

@Override
public void countedImpression(@NonNull Placement placement, @NonNull AdNetwork network) {
    // An impression counted
}

@Override
public void countedVimpression(@NonNull Placement placement, @NonNull AdNetwork network) {
    // An viewable impression counted
}

@Override
public void countedNimpression(@NonNull Placement placement, @NonNull AdNetwork network) {
    // An network impression counted
}

@Override
public void countedDirectDealImpression(@NonNull Placement placement, @NonNull AdNetwork network) {
    // An direct deal impression counted
}

@Override
public void countedClick(@NonNull Placement placement, @NonNull AdNetwork network) {
    // An click counted
}

@Override
public void countedExpired(@NonNull Placement placement, @NonNull AdNetwork network) {
    // (Optional) An expired ad counted
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
private fun requestAd() {
    // Setting the impression delegate for the infeed-banner placement
    inFeedBannerPlacement.statisticsListener = this
    val request = BannerRequest(this)
    inFeedBannerPlacement.requestAd(request,
        object : BannerRequestCompletionListener {
            override fun onRequestCompleted(layout: BannerPlacementLayout?, error: BannerRequestError?) {
                // Display the banner or handle the error
            }
        })
}

// StatisticsListener implementation:
override fun countedAdSpace(placement: Placement) {
    // An ad space counted
}

override fun countedMediationCycle(placement: Placement) {
    // An mediation cycle counted
}

override fun countedRequest(placement: Placement, network: AdNetwork) {
    // An request counted
}

override fun countedResponse(placement: Placement, network: AdNetwork) {
    // An response counted
}

override fun countedImpression(placement: Placement, network: AdNetwork) {
    // An impression counted
}

override fun countedVimpression(placement: Placement, network: AdNetwork) {
    // An viewable impression counted
}

override fun countedNimpression(placement: Placement, network: AdNetwork) {
    // An network impression counted
}

override fun countedDirectDealImpression(placement: Placement, network: AdNetwork) {
    // An direct deal impression counted
}

override fun countedClick(placement: Placement, network: AdNetwork) {
    // An click counted
}

override fun countedExpired(placement: Placement, network: AdNetwork) {
    // (Optional) An expired ad counted
}
```

{% endtab %}
{% endtabs %}
