> For the complete documentation index, see [llms.txt](https://aatkit.gitbook.io/release-notes/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/release-notes/android/beta-release-notes.md).

# Beta Release Notes

### 3.18 Beta

<details>

<summary>3.18.2</summary>

2026-08-27

### New Features

* Added expiration handling for Fullscreen and Rewarded Video ads. A loaded ad that is not shown within one hour (20 minutes for GraviteRTB) is discarded, and a new ad is loaded automatically if autoreloading is enabled. AppOpen placements are not affected.

  * Optionally, get notified when a loaded ad expires by implementing the new `onAdExpired` callback of `FullscreenPlacementListener` (it has a default empty implementation, so existing listeners keep compiling):

  ```kotlin
  val placement = AATKit.createFullscreenPlacement("FullscreenPlacement")
  placement?.listener = object : FullscreenPlacementListener {
      override fun onHaveAd(placement: Placement) { /* ... */ }
      override fun onNoAd(placement: Placement) { /* ... */ }
      override fun onPauseForAd(placement: Placement) { /* ... */ }
      override fun onResumeAfterAd(placement: Placement) { /* ... */ }

      override fun onAdExpired(placement: Placement) {
          // The loaded ad has expired and was discarded.
          // With autoreloading enabled, a new ad is already being loaded.
      }
  }
  ```

  * Expired ads are also counted in the statistics reporting. The new `AATKit.StatisticsListener.countedExpired` callback (with a default empty implementation) reports them per network:

  ```kotlin
  override fun countedExpired(placement: Placement, network: AdNetwork) {
      // An expired ad from `network` was discarded on `placement`.
  }
  ```

### Improvements

* Improved Mintegral integration: the Mintegral SDK is now initialised only once, and ad requests wait for the initialisation to complete.
* Improved handling of Fullscreen, Rewarded Video and AppOpen ads that fail to display.
* Improved responsiveness of GraviteRTB in-app bidding.
* Optimized handling of ManagedConsent.
* Internal improvements for stability and memory management.
* Improved robustness of SDK's configuration download and lifecycle handling.

### Fixes

* Fixed duplicated AppNexus(Xandr) keyword targeting.

### Library Updates

* AppLovin to 13.6.4
* AppNexus(Xandr) to 9.13.0
* Digital Turbine to 8.4.7
* Facebook Audience Network to 6.22.0
* Google Mobile Ads (NextGen) to 1.4.0
* GraviteRTB to [1.11.1](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.11.1)
* InMobi to 11.4.1
* ironSource to 9.6.0
* Mintegral to 17.1.81
* Moloco to 4.11.1
* Prebid to 3.3.3
* PubNative to 3.9.1
* Tappx to 4.1.21
* Unity Ads to 4.20.0
* Vungle to 7.7.7
* Optional network AmazonHB to 12.0.1
* Optional network Teads to 6.2.1
* Optional library Display.io to 5.7.4

### Versions of optional libraries supported by this version

| Library                              | Version |
| ------------------------------------ | ------- |
| AmazonHB                             | 12.0.1  |
| Display.io                           | 5.7.4   |
| Teads                                | 6.2.1   |
| Google CMP (User Messaging Platform) | 4.0.0   |
| Sourcepoint CMP                      | 7.15.13 |
| SFBX CMP (AppConsent)                | 5.9.0   |

</details>

<details>

<summary>3.18.1</summary>

2026-07-31

### New Features

* Added support for passing LiveRamp envelopes to selected ad networks. Read [here for more information](https://aatkit.gitbook.io/android-integration/advanced/targeting/liveramp).

### Library Updates

* GraviteRTB to [1.11.0](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.11.0)

</details>

<details>

<summary>3.18.0</summary>

2026-07-07

### API changes

* Migrated the entire Google integration — AdMob, Google AdManager (DFP), and Google bidding — from the legacy Google Mobile Ads SDK (`play-services-ads`) to the NextGen Google Mobile Ads SDK (`ads-mobile-sdk`). This is a breaking change for existing integrations:

  * The minimum supported SDK was raised to **API 24** (was 23).
  * **Native ad layouts:** the native ad container views changed from `com.google.android.gms.ads.nativead.NativeAdView` / `MediaView` to the NextGen `com.google.android.libraries.ads.mobile.sdk.nativead.NativeAdView` / `MediaView`. Publishers using AdMob / Google AdManager native ads must update their native ad layout XML (and any code casts) accordingly.
  * **Native ad MediaView:** `NativeAdView.setMediaView(...)` no longer exists. The `MediaView` (if used) is now passed as the `mainImageView` argument of `attachToLayout(...)`:

  ```kotlin
  nativeAdData.attachToLayout(
      adContainer,   // your NativeAdView layout (ViewGroup)
      mediaView,     // NextGen com.google.android.libraries.ads.mobile.sdk.nativead.MediaView, as mainImageView
      iconView,
      ctaView,
  )
  ```

  * **Duplicate-class build errors:** because the two Google SDKs cannot coexist, AATKit now excludes the legacy `play-services-ads` / `play-services-ads-lite`. Publishers integrating AATKit alongside other mediated networks that transitively pull `play-services-ads-lite` may hit duplicate-class build errors and need to add the same global exclude:

  ```groovy
  configurations.all {
      exclude group: 'com.google.android.gms', module: 'play-services-ads'
      exclude group: 'com.google.android.gms', module: 'play-services-ads-lite'
  }
  ```

  * The AdMob application ID continues to be read from the app manifest (the `com.google.android.gms.ads.APPLICATION_ID` `<meta-data>` entry, exactly as with the legacy SDK).
  * Client-side header bidding (Prebid) for Google AdManager banners continues to work, including ad-view resizing for Prebid creatives.
* The Google mediation adapter (`AATKitGoogleMediationAdapter`) now builds against the NextGen SDK. If you use it to serve AATKit ads through Google mediation, rebuild it against this release.

### Improvements

* Google ad and bidding-signal requests now fail fast when the NextGen SDK cannot initialize (for example a missing AdMob application ID, or an initialization error), so the SDK advances the waterfall immediately instead of stalling until a timeout.

### Library Updates

* Google Mobile Ads (NextGen) to 1.2.1 (migrated from the legacy `play-services-ads` SDK to `ads-mobile-sdk`).

### Versions of optional libraries supported by this version

| Library                              | Version |
| ------------------------------------ | ------- |
| AmazonHB                             | 11.3.0  |
| Display.io                           | 5.7.1   |
| Teads                                | 6.2.0   |
| Google CMP (User Messaging Platform) | 4.0.0   |
| Sourcepoint CMP                      | 7.15.13 |
| SFBX CMP (AppConsent)                | 5.9.0   |

</details>

### 3.17 Beta

<details>

<summary>3.17.2</summary>

2026-06-19

#### Improvements

* Improved location freshness handling for reporting.

#### Fixes

* Fixed `AutoLoadBannerPlacement` auto-reloading being cancelled by a duplicate `onResume()` call. A resume while the placement is already auto-reloading no longer destroys the reload timer or pauses the banner cache.
* Fixed PubNative and Vungle load failures stalling the mediation waterfall. When these adapters failed to start a load they did not notify the SDK, leaving the slot occupied until the request timed out; the failure is now reported immediately so the waterfall continues.
* Fixed Meta bidding fullscreen and rewarded-video ads reporting a failed `show()` as a success — a show failure is now surfaced instead of silently displaying nothing. The Meta bidding adapters also no longer use the activity before a null check, and now report a precise error per missing input instead of a misleading "bidder token is empty" message.
* Fixed the viewable-impression tracker permanently stopping after a pause/resume cycle, which affected viewable-impression tracking for banner and native ads.
* Fixed cached Tappx banners being destroyed when the user expanded them to fullscreen (the expand event was incorrectly treated as an expiration).

### Changes

* AppLovin now requires Android 7.0 (API 24). On older devices the SDK automatically disables AppLovin at runtime so the rest of the mediation stack keeps working.
* Unity is now registered under the TCF framework and reads the IAB consent string directly. The SDK only sets Unity's GDPR consent flag manually when no TCF consent string is present or when consent for Unity was explicitly obtained.

#### Library Updates

* GraviteRTB to [1.10.2](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.10.2)

{% hint style="warning" %}
This release is on new Maven repository. Please remove old repository declarations for AATKit and RTBSDK (GraviteRTB)

```groovy
maven {
    url 'https://android-sdk.aatkit.com/maven/'
}
maven { //GraviteRTB repository
    url 'https://android-sdk-rtb.gravite.net/maven'
}
```

and replace them with new ones:

```groovy
maven { //AATKit repository
    url 'https://gravite-sdk-releases.s3.eu-central-1.amazonaws.com/aatkit/android/maven' 
    content { includeGroupByRegex "com\\.intentsoftware\\..*" }
}

maven { //GraviteRTB repository
    url 'https://gravite-sdk-releases.s3.eu-central-1.amazonaws.com/rtbsdk/android/maven'
    content { includeGroupByRegex "com\\.rtb\\..*" }
}
```

{% endhint %}

</details>

<details>

<summary>3.17.1</summary>

2026-05-28

### Fixes

* Fixed a potential race condition when multiple ad formats triggered bidding signal collection concurrently at app start.

### Library Updates

* ironSource to 9.4.2

{% hint style="info" %}
ironSource migrated to Maven Central, changing artifact name to `com.unity3d.ads-mediation:mediation-sdk`. Legacy `android-sdk.is.com` maven repository is no longer required.
{% endhint %}

* PubNative to 3.8.1
* Optional network Display.io to 5.7.1
* Optional CMP SFBX AppConsent to 5.9.0

</details>

<details>

<summary>3.17.0</summary>

2026-05-25

### New Features

* Added support for Digital Turbine bidding through GraviteRTB, supporting:
  * Banner
  * Fullscreen
  * Rewarded Video

### API changes

* Removed support for Huawei as a separate platform, thus `AATKitConfiguration.platform` and the `AATKitConfiguration.Platform` enum are removed. All requests now use the default Android platform prefix and model.

### Improvements

* Implemented win/loss auction notifications for GraviteRTB and Display.io.
  * In in-app auction scenario, the SDK can now forward auction loss event to the networks.

### Library Updates

* AppLovin to 13.6.2
* AppNexus to 9.12.0
* GraviteRTB to [1.10.0](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.10.0)
* InMobi to 11.3.0
* Meta Audience Network to 6.21.0
* Mintegral to 17.1.61
* Moloco to 4.8.1
* Prebid Mobile to 3.3.1
* Tappx to 4.1.20
* Unity Ads to 4.18.0
* Vungle to 7.7.4
* Optional network AmazonHB to 11.3.0
* Optional network Teads to 6.0.4
* Optional CMP Google User Messaging Platform to 4.0.0
* Optional CMP SourcePoint to 7.15.13
* Optional library Utiq to 0.1.75.3

### Removed Networks

* Facebook Audience Network (mediation; Meta Bidding remains supported)
* Equativ (`SMARTAD` and `SMARTADSERVERDIRECT`)
* FeedAd
* Kidoz
* Ogury
* SuperAwesome
* YOC
* AdX (`RTB2`)

</details>

### 3.16 Beta

<details>

<summary>3.16.1</summary>

2026-02-20

### New Features

* Shake debug new features:
  * Added the app version to the home screen.
  * Added display of configured banner placement sizes.
* Added RTA support for IronSource.

</details>

<details>

<summary>3.16.0</summary>

2026-01-20

### **New Features**

* Introduced client-side header bidding for DFP, enabling custom targeting values to be passed for specific price points.

  * Set up AATKit configuration first:

  ```kotlin
  val conf = AATKitConfiguration(application)
  // set up AATKit configuration
  // [...]
  AATKit.init(conf)
  ```

  * Pass custom targeting values for given prices, e.g.:

  ```kotlin
  AATKit.setDFPBiddingValues(
      listOf(
          DFPBiddingValue(lowerValue = 16.00, mappedValue = "hbpb_16.00+"),
          DFPBiddingValue(lowerValue = 2.00, mappedValue = "hbpb_2.00-16.00"),
          DFPBiddingValue(lowerValue = 1.80, mappedValue = "hbpb_1.80-2.00"),
          DFPBiddingValue(lowerValue = 1.60, mappedValue = "hbpb_1.60-1.80"),
          DFPBiddingValue(lowerValue = 1.40, mappedValue = "hbpb_1.40-1.60"),
          DFPBiddingValue(lowerValue = 1.00, mappedValue = "hbpb_1.00-1.40"),
          DFPBiddingValue(lowerValue = 0.90, mappedValue = "hbpb_0.90-1.00"),
          DFPBiddingValue(lowerValue = 0.80, mappedValue = "hbpb_0.80-0.90"),
          DFPBiddingValue(lowerValue = 0.70, mappedValue = "hbpb_0.70-0.80"),
          DFPBiddingValue(lowerValue = 0.02, mappedValue = "hbpb_0.02-0.70"),
          DFPBiddingValue(lowerValue = 0.00, mappedValue = "hbpb_0.00-0.02"),
      )
  )
  ```

  * Pass custom key if needed instead of default `ghb_pb`:

    ```kotlin
    AATKit.setDFPBiddingTargetingKey("hb_price_bucket")
    ```
  * Create placements and start requesting ads.
* Ad network dependencies are now set to use ranges rather than fixed versions. It means that for each build it will automatically try to get the latest patch of given network SDK, for example Unity dependency is now defined as

  ```groovy
  'com.unity3d.ads:unity-ads:[4.16.5, 4.17.0)'
  ```

### **API Changes**

* Due to change in InMobi native ads implementation, `mainImageView` passed to `attachToLayout(layout: ViewGroup, mainImageView: View?, iconView: View?, ctaView: View?)` method (if not null) is now expected to be a ViewGroup instance (for example FrameLayout) that later will be filled by view provided by InMobi SDK. Please note that this requirement ONLY applies to InMobi native ads.

### **Deprecations**

* Deprecated the [rule skipping feature](https://aatkit.gitbook.io/android-integration/start/consent/general-handling#rule-skipping).

### **Library Updates**

* AppLovin to 13.5.1
* AppNexus to 9.10.0
* Equativ (SmartAd) to 8.5.5
* FacebookAds to 6.21.0.0
* Google Ads to 24.9.0
* IronSource to 9.2.0
* InMobi to 11.1.0
* Mintegral to 17.0.61
* Moloco to 4.4.0
* Ogury to 6.2.1
* PubNative to 3.7.1
* Tappx to 4.1.17
* Unity to 4.16.5
* Vungle to 7.6.3
* Optional network AmazonHB to 11.1.1
* Optional network DisplayIO to 5.5.5
* Optional network Kidoz to 10.1.6
* Optional network Teads to 6.0.2
* Optional CMP SourcePoint to 7.15.11

### Versions of optional libraries supported by this version

| Library                              | Version    |
| ------------------------------------ | ---------- |
| AmazonHB                             | 11.1.1     |
| Display.io                           | 5.5.5      |
| Huawei Ads                           | 3.4.81.300 |
| Kidoz                                | 10.1.6     |
| Superawesome                         | 9.4.0      |
| Teads                                | 6.0.2      |
| Google CMP (User Messaging Platform) | 3.2.0      |
| Sourcepoint CMP                      | 7.15.11    |
| SFBX CMP (AppConsent)                | 5.6.0      |

</details>

### 3.15 Beta

<details>

<summary>3.15.1</summary>

2025-10-24

### **New Features**

* AppOpen is now a separate format with separate statistics on the Gravite dashboard.
* Fullscreen and banner caches now dynamically respond to frequency cap changes when new rules are downloaded.
* Added a self-adjusting mechanism for banner cache size optimization.

  * To use the new mechanism, initialise `BannerCacheConfiguration` without passing a fixed size and use it to create the banner cache:

  ```kotlin
  val configuration = BannerCacheConfiguration("<PLACEMENT_NAME>")
  val bannerCache = AATKit.createBannerCache(configuration)
  ```
* Reduced the minimum auto-reload interval for banner and sticky banner placements to 10 seconds.
* Introduced the new API for fullscreen and rewarded video placements to allow forced ad reloads (clearing currently loaded ad) when needed:
  * `fun reload(forceLoad: Boolean): Boolean`
* Fullscreen and rewarded video placements now trigger the `onHaveAd` listener method if an ad is already loaded when calling `startAutoReload()`.
* Added support for Moloco bidding v4.1.1 through GraviteRTB, supporting:
  * Banner
  * Fullscreen
  * Rewarded Video
* Updated the ad networks stop list to include only Ogury and AmazonHB when no consent is granted.

### **Library Updates**

* AppLovin to 13.4.0
* AppNexus to 9.9.0
* Equativ (SmartAd) to 8.5.4
* FacebookAds to 6.20.0.1
* Google Ads to 24.6.0
* GraviteRTB to 1.9.1
* InMobi to 10.8.8
* Mintegral to 16.9.91
* Ogury to 6.1.0
* PubNative to 3.6.2
* Tappx to 4.1.14
* Unity Ads to 4.16.2
* Vungle to 7.6.0
* Optional network AmazonHB to 11.1.0
* Optional network Display.io do 5.5.4
* Optional network Huawei to 3.4.81.300
* Optional network Kidoz to 10.1.2
* Optional network Teads to 5.1.14
* Optional CMP SFBX (AppConsent) to 5.6.0
* Optional CMP Sourcepoint to 7.15.8

### Versions of optional libraries supported by this version

| Library                              | Version    |
| ------------------------------------ | ---------- |
| AmazonHB                             | 11.1.0     |
| Display.io                           | 5.5.4      |
| Huawei Ads                           | 3.4.81.300 |
| Kidoz                                | 10.1.2     |
| Superawesome                         | 9.4.0      |
| Teads                                | 5.1.14     |
| Google CMP (User Messaging Platform) | 3.2.0      |
| Sourcepoint CMP                      | 7.15.8     |
| SFBX CMP (AppConsent)                | 5.6.0      |

</details>

### 3.14 Beta

<details>

<summary>3.14.0</summary>

2025-07-25

### **New Features**

* Integrate the [UTIQ SDK](https://docs.utiq.com/docs/android-sdk) to support privacy-first user identification.
  * UTIQ SDK is optional, see linked documentation on how to add it to your app
  * You will have to initialise UTIQ SDK, passing your UTIQ SDK token as documented [here](https://docs.utiq.com/docs/android-sdk#AndroidSDK-InitializingtheSDK).
  * You will have to handle the UTIQ-specific user consent as documented [here](https://docs.utiq.com/docs/consent-experience-on-mobile-app).
* Implement automatic generation of publisher-provided IDs (PPID). This improves tracking.

  * PPID automatic generation is disabled by default. To enable it:

  ```kotlin
  val configuration = AATKitConfiguration(appInstance)
  configuration.useAutomaticPPID = true
  AATKit.init(configuration)
  ```
* Implement a dynamic reload interval for failed waterfall attempts in the banner cache. For each consecutive failure, progressively increase the retry interval to reduce request frequency and minimise device strain.
* Implement [the Global Placement ID](https://partner.thetradedesk.com/v3/portal/ssp/doc/InventoryBestPractices#gpid) (GPID), a consistent identifier used to uniquely track and identify individual ad placements.

  * AATKit creates an identifier for each placement.
  * You can pass a specific identifier per request to the infeed banner placement:

  ```kotlin
  val request = BannerRequest(null)
  request.gpidExtension = "<IDENTIFIER>"
  // request infeed banner ad
  ```

  * AATKit will forward the specified GPID to networks that support it — currently Gravite RTBSDK and Xandr (AppNexus).

### **Deprecations**

* `StickyBannerPlacement` is deprecated and will be removed in a future release. Please use `AutoLoadBannerPlacement` as its replacement.
* `MultiSizeBannerPlacement` is deprecated and will be removed in a future release. Please use `AutoLoadMultiSizeBannerPlacement` as its replacement.

### Removed Libraries

* CriteoSDK
* Smaato

### **Library Updates**

* AppLovin to 13.3.1
* AppNexus to 9.6.0
* Equativ (SmartAdServer) to 8.5.1
* Google Ads to 24.4.0
* GraviteRTB to [1.8.2](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.8.2)
* IronSource to 8.9.1
* Mintegral to 16.9.81
* Prebid to 3.0.2
* PubNative to 3.6.0
* Tappx to 4.1.13
* UnityAds to 4.15.1
* optional network display.io to 5.5.1
* optional network Kidoz to 10.0.4
* optional network Teads to 5.1.13
* optional CMP sfbx to 5.5.6
* optional CMP SourcePoint to 7.15.1

### Versions of optional libraries supported by this version

| Library                              | Version    |
| ------------------------------------ | ---------- |
| AmazonHB                             | 11.0.1     |
| Display.io                           | 5.5.1      |
| Huawei Ads                           | 3.4.78.301 |
| Kidoz                                | 10.0.4     |
| Superawesome                         | 9.4.0      |
| Teads                                | 5.1.13     |
| Google CMP (User Messaging Platform) | 3.2.0      |
| Sourcepoint CMP                      | 7.15.1     |
| SFBX CMP (AppConsent)                | 5.5.6      |

</details>

### 3.13 Beta

<details>

<summary>3.13.4</summary>

2025-06-06

### Fixes

* Fixed an issue with optional network AmazonHB, where testing mode was enabled by default.

</details>

<details>

<summary>3.13.3</summary>

2025-05-28

### Notice

* Due to update of Google Play Services ads, your project may now need [core library desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring) to be enabled to build. Please follow the linked documentation in case of issues.

### Improvements

* Redesigned the content layout of the shake-debug email for better readability.
* Added new configuration options to `AATDebugScreenConfiguration` for enhanced control over the debug screen:
  * `showDebugLogsToggle`: Toggles the display of debug logs. *(Default: true)*
  * `showDeviceFilteredRulesToggle`: Toggles the display of device-filtered rules. *(Default: true)*
  * `showCloseButton`: Toggles the display of the close button. *(Default: true)*

### **Library Updates**

* AppLovin to 13.2.0
* FacebookAds to 6.20.0.0
* FeedAd to 1.7.1
* Google Ads to 24.3.0
* GraviteRTB to [1.7.3](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.7.3)
* InMobi to 10.8.3
* IronSource to 8.8.0
* Mintegral to 16.9.71
* Equativ (SmartAdServer) to 8.4.0
* Smaato to 22.7.2
* Tappx to 4.1.11
* Unity to 4.14.2
* Vungle to 7.5.0
* optional network AmazonHB to 11.0.0
* optional network display.io to 5.4.9
* optional network Huawei to 3.4.78.301
* optional network Teads to 5.1.12
* optional CMP Google User Messaging Platform to 3.2.0
* optional CMP SourcePoint to 7.13.0

### **Removed Libraries**

* AppLovinMAX has been removed.

### **Fixes**

* Fixed an issue with muting of rewarded video ads

### Versions of optional libraries supported by this version

| Library                              | Version    |
| ------------------------------------ | ---------- |
| AmazonHB                             | 11.0.0     |
| Display.io                           | 5.4.9      |
| Huawei Ads                           | 3.4.78.301 |
| Kidoz                                | 9.1.2      |
| Superawesome                         | 9.4.0      |
| Google CMP (User Messaging Platform) | 3.2.0      |
| Sourcepoint CMP                      | 7.13.0     |
| SFBX CMP (AppConsent)                | 5.5.4      |

</details>

<details>

<summary>3.13.2</summary>

2025-05-15

### Improvements

* Introduced new API in `BannerRequest` allowing to perform dynamic ad key replacement for infeed banner ads.
  * ```kotlin
    bannerRequest.networkKeyReplacements = mapOf(
                "key1" to "value1",
                "key2" to "value2",
                "anotherKey" to "anotherValue"
            )
    ```
  * This feature is only intended for very specific use cases. Please contact your Account Manager before using it.
  * It replaces placeholders entered in curly brackets (`{}`) in ad network key or extraInfo part to provided mapping value, for example:
    * adId `1234:{key1}-{anotherKey}` would be transformed to `1234:value1-anotherValue`
* Implemented handling of Xandr (AppNexus) memberId:inventoryCode type of ad keys.
* Added creativeId information for Verve (PubNative) ads to debug-shake screen.

### **Library Updates**

* Xandr (AppNexus) to 9.5.0

</details>

<details>

<summary>3.13.1</summary>

2025-05-09

### Improvements

* Added support for GraviteRTB Rewarded Video ads format.

### **Library Updates**

* GraviteRTB to [1.7.1](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.7.1)

</details>

### 3.12 Beta

<details>

<summary>3.12.3</summary>

2025-02-27

#### Fixes

* Fixed presentation of debug-shake screen when device is in landscape orientation.

</details>

<details>

<summary>3.12.2</summary>

2025-02-21

#### **Library Updates**

* Ogury to 6.0.1.
* Verve (PubNative) to 3.3.0

#### Fixes

* Fixed loading of Ogury ads.

</details>

<details>

<summary>3.12.1</summary>

2025-02-19

### API changes

* Removed AATKit.setPublisherProvidedId(publisherProvidedId: String) method. Please use newly introduced UserTargeting to pass this identifier.

### **Improvements**

* Provide user targeting API and pass it to ad networks.

  * `setUserTargeting(userTargeting: AATKitUserTargeting)`
  * **Usage**:

  ```kotlin
  AATKit.setUserTargeting(AATKitUserTargeting(
              userID = "<USER_ID>",
              gender = <GENDER>,
              yearOfBirth = <YearOfBirth>,
              keywords = listOf("keyword1", "keyword2")
          ))
  ```
* Provide default consent implementation where TCF and CCPA will be checked if no specific Consent is used.
* Improve consent handling for non-IAB networks in non-EU countries when ManagedConsent is used.

### **New Libraries**

* Implemented new optional Display.IO ad network, which includes Interscroller, Classic banners (320x50, 300x250) and inline banners.

  To use it, first add the needed maven repository to your list:

  ```gradle
  maven {
      url "https://maven.display.io/"
  }
  ```

  Followed by the dependency:

  ```gradle
  implementation 'com.brandio.ads:sdk:5.4.0'
  ```

### **Library Updates**

* GraviteRTB to [1.6.0](https://aatkit.gitbook.io/rtbsdk-release-notes/android/beta-release-notes#id-1.6.0)

</details>

### 3.11 Beta

<details>

<summary>3.11.0</summary>

2024-11-28

### Improvements

* Implemented a completely new shake debug screen.
  * **Creative Timestamp** Added the creative timestamp to the placement-loaded ads screen.
  * **Shake Debug Info Sharing** You can now share a summary of the shake debug information via email using the share button in the new shake debug screen.
* Introduced a new API for retrieving creative history across all banner formats, that is also available in shake-debug screen.

  Steps to Implement:

  1. Enable creative history by calling:

     ```
     placement.enableCreativeHistory(size)
     ```
  2. Retrieve the creative history for a placement:

     ```
     placement.getCreativeHistory()
     ```
* Implemented a new hybrid RTB/Mayo auction.
* Rework Vungle Banner integration using the new APIs

### **Library Updates**

* AppLovin to 13.0.1
* AppNexus to 9.2.0
* CriteSDK to 7.1.0
* FacebookAds to 6.18.0.0
* Feedad to 1.6.1
* Google Ads to 23.5.0
* InMobi to 10.8.0
* IronSource to 8.5.0
* Ogury to 6.0.0
* Pubnative to 3.2.1
* Smaato to 22.7.1
* SmartAdServer to 7.25.0
* Tappx to 4.1.6
* Unity to 4.12.5
* Vungle to 7.4.2
* optional network AmazonHB to 9.10.3
* optional network Huawei to 3.4.75.301
* optional network Teads to 5.1.9
* optional CMP SFBX to 5.5.4

</details>

### 3.10 Beta

<details>

<summary>3.10.0</summary>

2024-09-05

### Improvements

* Added support for GraviteRTB native ads format.
* Added support for Vungle AppOpen ads format.
* Added `AATAdInfo` object across multiple ad formats, including Fullscreen, Rewarded, Native Ads, and Infeed Banners:

  * Fullscreen/Rewarded Video:

    ```kotlin
    val info = placement?.adInfo
    ```
  * Native Ads:

    ```kotlin
    val nativeAd = placement.getNativeAd()
    val info = nativeAd.adInfo
    ```
  * Infeed Banners:

    ```kotlin
    val info = loadedBannerView.adInfo
    ```

  The `AATAdInfo` class provides detailed price information:

<pre class="language-kotlin"><code class="lang-kotlin">class AdInfo (val priceInfo: PriceInfo?)
class PriceInfo (
<strong>    val price: Double,
</strong>    val currency: Currency,
    val precisionType: PrecisionType)
</code></pre>

* Added support for passing the user ID to ad networks for server-side verification of rewarded videos.

  **Usage:**

  ```kotlin
  AATKit.setRewardedAdSSVInfo(RewardedAdSSVInfo("<USER_ID>"))
  ```

### **Library Updates**

* AppLovin to 12.6.1
* Google Ads to 23.3.0
* GraviteRTB to 1.4.3
* InMobi to 10.7.7
* IronSource to 8.3.0
* Mintegral to 16.8.41
* PubNative to 3.0.4
* Smaato to 22.6.3
* Tappx to 4.1.5
* YOC to 4.1.3
* optional network AmazonHB to 9.10.2
* optional network Huawei to 3.4.74.300
* optional network Superawesome to 9.4.0
* optional network Teads to 5.1.5
* optional CMP GoogleUserMessagingPlatform to 3.0.0
* optional CMP SourcepointCMP to 7.10.1

### **Removed Ad Networks**

* Bluestack

</details>

### 3.9 Beta

<details>

<summary>3.9.2</summary>

2024-07-16

#### Library Updates

* GraviteRTB to 1.3.1

</details>

<details>

<summary>3.9.1</summary>

2024-07-09

#### API Changes

* Changes in `AATKitImpression` object returned by `ImpressionListener:`
  * Removed mediationType, price, currencyCode and precision fields
  * Added priceInfo field of type PriceInfo, containing information about
    * price, currency and precision type

#### Library Updates

* AppLovin to 12.5.0
* Google ads to 23.2.0
* InMobi to 10.7.4
* IronSource to 8.1.0
* Mintegral to 16.7.71
* Ogury to 5.8.0
* PubNative to 3.0.2
* Smaato to 22.6.2
* SmartAdServer to 7.24.0
* Tappx to 4.1.3
* Vungle to 7.3.2
* Optional network AmazonHB to 9.10.1
* Optional network Huawei to 3.4.72.301
* Optional CMP SourcePointCMP to 7.8.4

</details>

<details>

<summary>3.9.0</summary>

2024-06-26

**Improvements**

* Enhanced the internal loading logic in AATKit to report failures instead of issuing warning logs when the Activity is unavailable.
  * The above enhancement fixed a bug in the AATKidGoogleMediationAdapter where failures were not reported immediately, previously being reported as timeout failures.
* Enhanced the shake debug screen to include the following details:
  * Type of the placement.
  * Active frequency capping settings.
  * Banner auto-reload intervals.
  * Initial delay and remaining time.
  * Display of the bidder (DSP name) for the GraviteRTB marketplace.
* Introduced a network option to enforce the RTBSDK close button for MRAID fullscreen ads.
  * Note: If the MRAID creative already includes a close button and `forceCloseButtonForMraid` is set to true, the MRAID creative will display two close buttons.

```kotlin
val config = AATKitConfiguration(this)
...
val networkOptions = AATKitAdNetworkOptions()
networkOptions.graviteRTBOptions = GraviteRTBOptions(false)
...
AATKit.init(config)
```

* The `ImpressionListener` now delivers precise price information for all mediation types, for ad networks that support pricing data.

**Library Updates**

* GraviteRTB to 1.3.0

**New Libraries**

* Integrated the new CMP: SFBX (AppConsent) version 5.3.0. To use it, first add the needed maven repository to your list:

```gradle
maven { // SFBX CMP
        url "https://artifactory.datalf.chat/artifactory/app-consent-v2-release"
}
```

Followed by the dependency:

```gradle
implementation 'com.sfbx.appconsent:appconsent-ui-v3:5.3.0'
```

* Usage:

```kotlin
val cmp: CMP = CMPAppConsent(activity, "<APP_KEY>")
val managedConsent = ManagedConsent(cmp, activity, delegate)
val newConf = AATKitRuntimeConfiguration()
newConf.consent = managedConsent
AATKit.reconfigure(newConf)
```

</details>

### 3.8 Beta

<details>

<summary>3.8.0</summary>

2024-04-17

#### Library Updates

* AppLovin to 12.4.2
* AppNexus to 8.11
* FacebookAds to 6.17.0.0
* FeedAd to 1.6.0
* InMobi to 10.6.7
* IronSource to 8.0.0
* Pubnative to 3.0.0
* Smaato to 22.6.0
* Tappx to 4.0.8
* UnityAds to 4.10.0
* Vungle to 7.3.1
* Optional network AmazonHB to 9.9.4
* Optional network Bluestack to 4.3.2
* Optional network Huawei to 3.4.70.300
* Optional network Kidoz to 9.1.2
* Optional CMP Sourcepoint to 7.8.1

#### Improvements

* Added "initial rules" feature, where placement can be set to use a subset of ad rules for the first load. This is intended to allow placement first load to happen faster.
* Optimized initializing of Google Ads and InMobi SDKs for faster ad loading.
* Changing consent state will now trigger rule download - to pick optimal set of rules for given consent setting.

</details>

### 3.7 Beta

<details>

<summary>3.7.0</summary>

2024-02-23

* Update GraviteRTB to 1.1.0

</details>

### 3.6 Beta

<details>

<summary>3.6.1</summary>

2024-02-20

#### API Changes

* Removed Pubnative offset options for interstitial and rewarded video formats.
  * Removed the deprecated PubNativeOptions from AATKitAdNetworkOptions.

#### Library Updates

* Appnexus to 8.10
* CriteoSDK to 6.0.0
* GoogleAds to 22.6.0
* InMobi to 10.6.3
* Mintegral to 16.6.34
* Ogury to 5.6.2
* GraviteRTB to 1.0.4
* Pubnative to 2.21.1
* Smaato to 22.5.1
* SmartAdServer to 7.24.0
* TappX to 4.0.7
* UnityAds to 4.9.2
* Vungle to 7.1.0
* optional network AmazonHB to 9.9.1
* optional network Huawei to 3.4.69.300
* optional network Kidoz to 9.0.2
* optional network Superawesome to 9.3.2
* optional network Teads to 5.1.4
* optional CMP SourcePoint to 7.7.0

#### c

* Added support for IronSourceNew banner ads

</details>

<details>

<summary>3.6.0</summary>

2024-02-02

#### New Ad Networks

* Integrate the new ad network IronSourceNew using instanceIDs (Interstitial / Rewarded Videos).
  * Version 7.5.1

#### Removed Ad Networks

* Remove the old IronSource integration (Interstitial / Rewarded Videos).

#### Library Updates

* GraviteRTB SDK to 1.0.3.

</details>

### 3.5 Beta

<details>

<summary>3.5.0</summary>

2023-12-28

#### New Ad Networks

* Optional Ad Network SuperAwesome, supporting Banner, Fullscreen and RewardedVideo ads

  * It is needed to add SuperAwesome repository to main build.gradle:

  ```gradle
  maven { url "https://aa-sdk.s3-eu-west-1.amazonaws.com/android_repo" }
  ```

  * Additionally, add the following dependency:

  ```gradle
  implementation 'tv.superawesome.sdk.publisher:superawesome:9.3.0'
  ```

#### Library Updates

* GraviteRTB SDK to 1.0.2.

#### Other Changes

* Removed deprecated CMPOgury.

</details>

### 3.4 Beta

<details>

<summary>3.4.4</summary>

2023-11-17

#### Improvements

* Add CCPA support.
  * AATKit now supports CCPA only if the CCPA consent string is found. AATKit will read and react automatically to the CCPA changes in SharedPreferences.
  * If both TCF and CCPA consent strings are present, the TCF settings will be used.
  * For more information, please visit the [IAB CCPA compliance framework](https://github.com/InteractiveAdvertisingBureau/USPrivacy/blob/master/CCPA/US%20Privacy%20String.md#about-iab-ccpa-compliance-framework).

#### Library Updates

* GraviteRTB SDK to 1.0.1.

</details>

<details>

<summary>3.4.3</summary>

2023-11-10

### API Changes

* Remove deprecated `AATKit.setInitialRules`. Please use `AATKitConfiguration.initialRules` instead.
* Remove deprecated `AATKit.setRuleCachingEnabled`. Please use `AATKitConfiguration.isShouldCacheRules` instead.
* Introduce new BannerCache delegate called `CacheStatusDelegate` representing the cache status.

```kotlin
/**
* Optional delegate representing the cache status.
*/
interface CacheStatusDelegate {
    /**
     * Will be called when the cache was empty and has been filled with at least one ad.
     */
    fun cacheIsNoLongerEmpty()

    /**
     * Will be called when the las ad from cache has been consumed and cache became (temporarily) empty.
     */
    fun cacheIsEmpty()
}
```

### Library Updates

* AppLovin to 11.11.3
* AppNexus to 8.9
* Facebook to 6.16.0.0
* GoogleAds to 22.5.0
* InMobi to 10.6.1
* IronSource to 7.5.2
* MintegralAds to 16.5.41
* Ogury to 5.6.1
* Pubnative to 2.20.0
* Smaato to 22.4.0
* SmartAd to 7.23.0
* YOC to 4.1.1
* Optional GoogleUserMessagingPlatform (CMP) to 2.1.0
* Optional network AmazonHB to 9.8.7
* Optional network Teads to 5.1.1
* Optional network Huawei to 3.4.66.303

</details>

<details>

<summary>3.4.2</summary>

2023-10-25

### New Ad Networks

* GraviteRTB SDK (version 1.0.0) supporting banner and fullscreen formats.

</details>

<details>

<summary>3.4.1</summary>

2023-10-18

### New Ad Networks

* Optional network Kidoz (version 8.9.9), supporting banner, fullscreen and rewarded video ads
  * for banners, only multisize is supported
  * To add Kidoz, add the following dependencies:

```
implementation 'net.kidoz.sdk:kidoz-android-native:8.9.9'
implementation 'org.greenrobot:eventbus:3.3.1'
```

### Library Updates <a href="#markdown-header-library-updates_3" id="markdown-header-library-updates_3"></a>

* Unity to 4.9.1.
* Vungle to 7.0.0.

</details>

<details>

<summary>3.4.0</summary>

2023-09-26

* Introduce a new public API `getDebugInfoObject(): AATKitDebugInfo` for obtaining the debug information that will be presented if the shake debug screen is enabled.
  * Usage: `val debugObject = AATKit.getDebugInfoObject()`.
* AATKit will not use the AndroidManifest.xml configurations anymore. Instead, you can use the new `AATKitAdNetworkOptions` object while initialising AATKit.

```kotlin
val config = AATKitConfiguration(this)
...
config.adNetworkOptions = AATKitAdNetworkOptions(
    appNexusOptions = AppNexusOptions(5, true, false),
    adMobOptions = AdMobOptions(75)
)
...
AATKit.init(config)
```

```kotlin
/**
 * Allows to pass network-specific configurations to AATKit.
 */
class AATKitAdNetworkOptions(
    var appNexusOptions: AppNexusOptions? = null,
    var feedAdOptions: FeedAdOptions? = null,
    var pubNativeOptions: PubNativeOptions? = null,
    var adMobOptions: AdMobOptions? = null,
    var dfpOptions: DFPOptions? = null
)

/**
 * PubNative specific configurations
 */
class PubNativeOptions(
    /**
     * Minimum offset in seconds required before skipping an HTML Interstitial ad. Null by default.
     */
    var skipOffsetForHTMLInterstitial: Int? = null,

    /**
     * Minimum offset in seconds required before skipping an Video Interstitial ad. Null by default.
     */
    var skipOffsetForVideoInterstitial: Int? = null
)

/**
 * FeedAd specific configurations
 */
class FeedAdOptions(
    /**
     * Desired color-int (as obtained from [android.graphics.Color.parseColor]) to be used for shutter. Default is null.
     */
    var shutterColor: Int? = null,

    /**
     * Boolean that describes if spinner should be disabled, default is false.
     */
    var disableSpinner: Boolean = false
)

/**
 * AppNexus specific configuration
 */
class AppNexusOptions (
    /**
     * A delay in seconds after which  a full-screen ad will be dismissed. Default value is null.
     */
    var autoCloseTime: Int? = null,

    /**
     * A Boolean that describes if Banner Ad can serve a Native Ad, default is false.
     */
    var supportNativeBanner: Boolean = false,

    /**
     * A Boolean that describes if Banner Ad can serve Video Ads, default is false.
     */
    var supportVideoBanner: Boolean = false
)

/**
 * AdMob specific configuration
 */
class AdMobOptions (
    /**
     * Maximum height for AdMob inline adaptive banners
     */
    var inlineBannerMaxHeight: Int?
)

/**
 * AdMob specific configuration
 */
class DFPOptions (
    /**
     * Maximum height for DFP inline adaptive banners
     */
    var inlineBannerMaxHeight: Int?
)
```

* Setting the banner cache retry intervals moved to the `BannerCacheConfiguration` instead of the Manifest
  * Usage:

```kotlin
val conf = BannerCacheConfiguration("<PLACEMENT_NAME>", 5)
conf.retryInterval = 10
val cache = AATKit.createBannerCache(conf)
```

* Publishers can pass the collapsible banner options (`CollapsibleBannerOptions`) to all banner placements using available APIs instead of using the Manifest declaration:

```kotlin
class CollapsibleBannerOptions(val position: CollapsiblePosition, val minDelayInSeconds: Int) {

    constructor(position: CollapsiblePosition) : this(position, 0)

    enum class CollapsiblePosition(val value: String) {
        TOP("top"),
        BOTTOM("bottom")
    }
}
```

#### Improvements

* Allow passing max height of inline adaptive Google banners (GAM and AdMob) using `AATKitAdNetworkOptions` passing `AdMobOptions` or `DFPOptions` instances.

```kotlin
val conf = AATKitConfiguration(this)
...
conf.adNetworkOptions = AATKitAdNetworkOptions(
    adMobOptions = AdMobOptions(inlineBannerMaxHeight = 50),
    dfpOptions = DFPOptions(inlineBannerMaxHeight = 50)
)
...
AATKit.init(conf)
```

* AATKit now provides a completely new shake debug screen. Publishers can customise it by using the new public API `configureDebugScreen(configuration: AATDebugScreenConfiguration)`.

```kotlin
val aatKitDebugScreenConfiguration = AATKitDebugScreenConfiguration(R.drawable.ic_launcher, "<APP_NAME>")
AATKit.configureDebugScreen(aatKitDebugScreenConfiguration)
```

```kotlin
class AATKitDebugScreenConfiguration {

    internal enum class AATKitShakeScreenLogoAlignment {
        Center,
        Left,
        Right
    }

    var appLogoDrawable: Drawable? = null
        private set

    @DrawableRes
    var appLogoFromResources: Int? = null
        private set

    var title: String
        private set

    /**
     * Show bundle identifier. Default value is true
     */
    var showBundleId: Boolean = true

    /**
     * Show test mode data. Default value is true
     */
    var showTestMode: Boolean = true

    /**
     * Show loaded/loading ads. Default value is true
     */
    var showLoadedAndLoadingAds: Boolean = true

    /**
     * Show available ad networks. Default value is true
     */
    var showAvailableNetworks: Boolean = true

    /**
     * Show disabled ad networks. Default value is true
     */
    var showDisabledNetworks: Boolean = true

    /**
     * Show removed ad networks. Default value is true
     */
    var showRemovedNetworkSDKs: Boolean = true

    /**
     * Show unsupported ad networks. Default value is true
     */
    var showUnsupportedNetworks: Boolean = true

    /**
     * Show extra SDKs available. Default value is true
     */
    var showExtraSDKs: Boolean = true

    /**
     * Show information about used consent. Default value is true
     */
    var showConsent: Boolean = true

    /**
     * Show Advertising ID. Default value is true
     */
    var showAdvertisingId: Boolean = true

    /**
     * Logo alignment of type [AATKitShakeScreenLogoAlignment]. Default value is left
     */
    internal var logoAlignment: AATKitShakeScreenLogoAlignment = AATKitShakeScreenLogoAlignment.Left

    /**
     * Show device type. Default value is true
     */
    var showDeviceType: Boolean = true

    /**
     * Create an AATDebugScreenConfiguration instance.
     *
     * @param appLogo - App Logo, as [Drawable].
     * @param title - Shake debug screen title
     */
    constructor(
        appLogo: Drawable,
        title: String
    ) {
        this.appLogoDrawable = appLogo
        this.title = title
    }

    /**
     * Create an AATDebugScreenConfiguration instance.
     *
     * @param appLogo - App Logo, as the drawable resource reference.
     * @param title - Shake debug screen title
     */
    constructor(
        @DrawableRes appLogo: Int,
        title: String
    ) {
        this.appLogoFromResources = appLogo
        this.title = title
    }
}
```

#### New Ad Networks

* Tappx SDK (version 4.0.4), supporting Banner, Fullscreen, and Rewarded Video formats.

</details>

### 3.3 Beta

<details>

<summary>3.3.1</summary>

2023-07-17

### Improvements

* Improved logging.

### Library Updates <a href="#markdown-header-library-updates_3" id="markdown-header-library-updates_3"></a>

* AppLovin to 11.10.1
* AppNexus to 8.7
* Criteo to 5.0.1
* Facebook to 6.14.0.0
* FeedAd to 1.5.5
* Google ads to 22.2.0
* InMobi to 10.5.7
* IronSource to 7.3.1.1
* Minteral to 16.4.71
* Ogury to 5.6.0
* Pubnative to 2.18.1
* Smaato to 22.2.0
* SmartAdServer to 7.21.0
* Unity to 4.8.0
* Vungle to 6.12.1
* Optional network AmazonHB to 9.8.3
* Optional network Huawei to 3.4.64.302

</details>

<details>

<summary>3.3.0</summary>

2023-06-06

### API Changes

* Introduce a new factory method for creating the banner cache.
  * Instead of calling `BannerCache(configuration: BannerCacheConfiguration)` use `AATKit.createBannerCache(configuration: BannerCacheConfiguration)`.
* Deprecate `AATKit.setInitialRules`. Please use `AATKitConfiguration.initialRules` instead.
* Deprecate `AATKit.setRuleCachingEnabled`. Please use `AATKitConfiguration.isShouldCacheRules` instead.
* Introduce a new way to Opt-out from showing the CMP
  * ManagedConsent can be initialized by passing a new parameter `showIfNeededSetting`
  * `showIfNeededSetting` can be one of the following:
    * `ALWAYS`: always show the CMP.
    * `NEVER`: never show the CMP. However, the publisher can still call the `editConsent` API.
    * `SERVER_SIDE_CONTROL`: showing the CMP will be based on the dashboard configurations.
  * It has a default value of: `serverSideControl.`
* Introduce new method `AATKit.isConsentOptIn()`, returning "consent opt-in status" returned by our server rules. Only returns meaningful information after the rules are downloaded.
* Added support for Google Collapsible Banners.
  * For them to work, it is necessary to add meta-data nodes in manifest, indicating desired position of collapsible banners for given placement (either "top" or "bottom"), like:

    ```
        <meta-data
            android:name="BannerPlacementName.collapsiblePosition"
            android:value="bottom" />
    ```
* Added support for frequency capping for Collapsible Banners.
  * The desired capping is set per-placement, using manifest metadata. Code sample below means that for placement named "BannerPlacementName" Collapsible Banners can be presented not more often than every 60 seconds.

    ```
        <meta-data
            android:name="BannerPlacementName.minDelayBetweenCollapsibleBannersInSeconds"
            android:value="60" />
    ```

### New Ad Networks

* Mintegral (version 16.4.11), supporting Banner, Fullscreen and RewardedVideo ads
  * It is needed to add Mintegral repository to main build.gradle:<br>

    ```
        maven {
            url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea"
        }
    ```
* Integrate the new CMP: SourcePoint (version 7.1.1).

  * You can add it by adding the following dependency:

  ```
  implementation 'com.sourcepoint.cmplibrary:cmplibrary:7.1.1'
  ```

  * To use it:

  ```kotlin
  val configuration = AATKitConfiguration(this)
  val cmp = CMPSourcePoint(activity, <YourAccountID>, <YourPropertyId>, "YourPropertyName", "YourPMId")
  val consent = ManagedConsent(cmp, activity, this)
  // other configurations
  AATKit.init(configuration)
  ```

### Removed Ad Networks

* Rubicon

### Improvements

* Implement Frequency Capping for the banner cache.
* Implement weekly and monthly frequency capping.
* Enhance the logic for waterfall failure scenarios for the sticky banner placement.
* Improve AATKit logs.

</details>

### 3.2 Beta

<details>

<summary>3.2.3</summary>

2023-05-16

### Fixes <a href="#markdown-header-fixes" id="markdown-header-fixes"></a>

* Fix timeout handling for Prebid requests.

</details>

<details>

<summary>3.2.2</summary>

2023-04-17

### Changes <a href="#markdown-header-changes" id="markdown-header-changes"></a>

* Updated logic for automatically disabling networks on devices without Google Play Services.

### Fixes <a href="#markdown-header-fixes" id="markdown-header-fixes"></a>

* Fixed ad key parsing for InMobi Fullscreen and Rewarded Video ads.

</details>

<details>

<summary>3.2.1</summary>

2023-03-22

### Fixes

* Fix an issue with Google impression-level revenue data where the price was passed as the single impression price, not the CPM.

### Library Updates <a href="#markdown-header-library-updates" id="markdown-header-library-updates"></a>

* SmartAdServer to 7.20.2.

</details>

<details>

<summary>3.2.0</summary>

2023-03-08

**If you did not add your Google appID to the Manifest until now, make sure to do so. The old declaration of `AD_MANAGER_APP` will no longer work.**

### API Changes <a href="#markdown-header-api-changes" id="markdown-header-api-changes"></a>

* Placements will pass themselves to `StatisticsListener` listener methods as a parameter called placement of type Placement. This parameter will enable the delegates to know which placement triggered the delegate method. The placement name can be checked by using the method: `placement.getName()`.
  * Changed APIs:
    * `fun countedAdSpace(placement: Placement)`
    * `fun countedMediationCycle(placement: Placement)`
    * `fun countedRequest(placement: Placement, network: AdNetwork)`
    * `fun countedResponse(placement: Placement, network: AdNetwork)`
    * `fun countedImpression(placement: Placement, network: AdNetwork)`
    * `fun countedVimpression(placement: Placement, network: AdNetwork)`
    * `fun countedNimpression(placement: Placement, network: AdNetwork)`
    * `fun countedDirectDealImpression(placement: Placement, network: AdNetwork)`
    * `fun countedClick(placement: Placement, network: AdNetwork)`
* Placements will pass themselves to `ImpressionListener` listener methods as a parameter called placement of type Placement. This parameter will enable the delegates to know which placement triggered the delegate method. The placement name can be checked by using the method: `placement.getName()`.
  * Changed APIs:
    * `fun didCountImpression(placement: Placement, impression: AATKitImpression)`
* Add child-directed support that enables publishers to treat their content as child-directed while requesting ads. **Note: if an AdNetwork doesn't support child-directed Requests, AATKit will skip this network while requesting Ads.**
  * Networks providing child-directed requests:
    * AdMmob
    * Google AdManager (DFP)
    * AdX
    * Digital Turbine (AdColony)
    * AppLovin
    * AppLovin MAX
    * Criteo SDK
    * Huawei
    * IronSource
    * Verve (PubNative)
    * Smaato
    * Unity
    * Vungle
  * Networks that will be skipped:
    * Amazon HB
    * Xandr (AppNexus)
    * Bluestack (Madvertise)
    * Facebook
    * FeedAd
    * InMobi
    * Ogury
    * Magnite (Rubicon)
    * Equativ (SmartAdServer)
    * Teads
    * YOC
  * API: `fun setIsChildDirected(isChildDirected: Boolean)`
  * Usage: `AATSDK.setIsChildDirected(true)`
* Provide impression-level revenue data via the `AATKitImpression` object
  * Add `currencyCode` and `precision` properties to the `AATImpression` object.
  * If the ad network provides impression-level revenue data, AATKit will use this information during the AATKitImpression instantiation and pass it to ImpressionListener via the `fun didCountImpression(placement: Placement, impression: AATKitImpression)` callback. Otherwise, AATKit will detect and collect the impression-level information internally and provide it to the impression delegate via the same `fun didCountImpression(placement: Placement, impression: AATKitImpression)` callback.
  * Currently, only Google Mobile Ads supports impression-level revenue data.
* Introduce new banner placement type: `AutoLoadBannerPlacement` and `AutoLoadMultiSizeBannerPlacement` which are based on `BannerCache`. They are intended to replace both `StickyBannerPlacement` and `MultiSizeBannerPlacement` hence, they have exactly the same functionality and provide the same APIs.
  * Creating the placement:
    * Java: `AutoLoadBannerPlacement placement = AATKit.createAutoLoadBannerPlacement("<PLACEMENT_NAME>", BannerPlacementSize.Banner320x53);`
    * Java: `AutoLoadMultiSizeBannerPlacement placement = AATKit.createAutoLoadMultiSizeBannerPlacement("<PLACEMENT_NAME>");`
    * Kotlin: `val placement = AATKit.createAutoLoadBannerPlacement("<PLACEMENT_NAME>", BannerPlacementSize.Banner320x53)`
    * Kotlin: `val placement = AATKit.createAutoLoadMultiSizeBannerPlacement("<PLACEMENT_NAME>")`
  * Public Interfaces:

```
interface AutoLoadBannerPlacement : Placement {
    /**
     * Set the [placement listener][AutoLoadBannerPlacementListener] that will listen to ad loading and display events.
     */
    var listener: AutoLoadBannerPlacementListener?

    /**
     * Sets the [statistics listener][AATKit.StatisticsListener] that will be notified about placement reporting events, like counted adspace, request etc.
     */
    var statisticsListener: AATKit.StatisticsListener?

    /**
     * Sets the [impression listener][ImpressionListener] for the given placement.
     */
    var impressionListener: ImpressionListener?

    /**
     * Enables automatic reloading of placement. Autoreloader will use reload time configured on addapptr.com account or fallback to default {@value #BANNER_DEFAULT_RELOAD_INTERVAL_IN_SECONDS} seconds.
     */
    fun startAutoReload()

    /**
     * Disables automatic reloading of placement.
     */
    fun stopAutoReload()

    /**
     * Returns true if there is an ad loaded for given placementId.
     *
     * @return True if there is an ad loaded for given placementId.
     */
    fun hasAd(): Boolean

    /**
     * Returns placement view. Works only for banner placements.
     *
     * @return Placement view or null.
     */
    fun getPlacementView(): View?

    /**
     * Sets placement default image. This image will be shown in placement when no ad is available.
     *
     * @param image       The bitmap to set.
     */
    fun setDefaultImage(image: Bitmap?)

    /**
     * Sets placement default image. This image will be shown in placement when no ad is available.
     *
     * @param resId       The identifier of the resource.
     */
    fun setDefaultImage(resId: Int)

    /**
     * Sets gravity for ads that don't fill entire placement area. Works only for banner placements.
     *
     * @param gravity     The [android.view.Gravity] to set.
     */
    fun setContentGravity(gravity: Int)

    /**
     * Sets the targeting information for the given placement. Information provided for placement overrides targeting information for application set by the [setTargetingInfo].
     */
    var targetingInfo: Map<String, List<String>>?

    /**
     * Sets the content targeting url for the application. This information will be used only if no placement-specific targeting is available.
     *
     * @see .setContentTargetingUrl
     */
    var contentTargetingUrl: String?

}
```

```
interface AutoLoadMultiSizeBannerPlacement : Placement {
    /**
     * Set the [placement listener][AutoLoadMultiSizeBannerPlacementListener] that will listen to ad loading and display events.
     */
    var listener: AutoLoadMultiSizeBannerPlacementListener?

    /**
     * Sets the [statistics listener][AATKit.StatisticsListener] that will be notified about placement reporting events, like counted adspace, request etc.
     */
    var statisticsListener: AATKit.StatisticsListener?

    /**
     * Sets the [impression listener][ImpressionListener] for the given placement.
     */
    var impressionListener: ImpressionListener?

    /**
     * Enables automatic reloading of placement. Autoreloader will use reload time configured on addapptr.com account or fallback to default {@value #BANNER_DEFAULT_RELOAD_INTERVAL_IN_SECONDS} seconds.
     */
    fun startAutoReload()

    /**
     * Disables automatic reloading of placement.
     */
    fun stopAutoReload()

    /**
     * Sets the targeting information for the given placement. Information provided for placement overrides targeting information for application set by the [setTargetingInfo].
     */
    var targetingInfo: Map<String, List<String>>?

    /**
     * Sets the content targeting url for the application. This information will be used only if no placement-specific targeting is available.
     *
     * @see .setContentTargetingUrl
     */
    var contentTargetingUrl: String?
}
```

### Improvements <a href="#markdown-header-improvements" id="markdown-header-improvements"></a>

* Implement Google Mobile Ads Fluid banners.
* Extend cached rules lifetime.
* Throttle download rules request when failed.
* Add internal custom timeout for Prebid requests (3.5 seconds).

### Library Updates <a href="#markdown-header-library-updates_3" id="markdown-header-library-updates_3"></a>

* AppLovin to 11.8.0.
* AppNexus to 8.4.
* Criteo to 4.9.1.
* FeedAd to 1.5.4.
* Google Play Services Ads to 21.5.0.
* InMobi to 10.5.4.
* IronSource to 7.2.7.
* Smaato to 22.0.2.
* SmartAdServer to 7.20.0.
* UnityAds to 4.6.0.
* YOC to 3.2.0.
* Optional network AmazonHB to 9.7.0.
* Optional network Huawei to 3.4.61.302.
* Optional network Teads to 5.0.22.

</details>

### 3.1 Beta

<details>

<summary>3.1.5</summary>

2022-11-24

* Fixed potential crash in optional AmazonHB network.

</details>

<details>

<summary>3.1.4</summary>

2022-11-18

* Updated FeedAd to 1.5.2.
* Fixed issue with Vungle banner implementation.

</details>

<details>

<summary>3.1.3</summary>

2022-11-09

* Updated Prebid SDK (Header Bidding solution used together with DFP) to 2.0.4.

</details>

<details>

<summary>3.1.2</summary>

2022-10-28

### Updated ad networks <a href="#markdown-header-updated-a-d-networks_3" id="markdown-header-updated-a-d-networks_3"></a>

* AppLovin to 11.5.3
* AppNexus to 8.1
* CriteoSDK to 4.8.1
* FeedAd to 1.4.14
* Google Facebook mediation adapter to 6.11.0.1
* GooglePlayServicesAds to 21.3.0
* InMobi to 10.5.2
* IronSource 7.2.5
* PubNative to 2.16.0
* SmartAdServer to 7.19.1
* UnityAds to 4.4.1
* Vungle to 6.12.0
* Optional network AmazonHB to 9.6.0
* Optional network Huawei to 3.4.56.300

</details>

<details>

<summary>3.1.1</summary>

2022-10-18

* Fix rare issue preventing Google (AdMob, AdX, DFP) fullscreen ads from being presented.

</details>

<details>

<summary>3.1.0</summary>

2022-10-12

* Implement the “Placements initial delay” feature for all ad formats.
  * This feature allows publishers to delay the provision of ads for a configurable amount of seconds after the first app fresh install.
  * Publishers can control the initial delay for each placement using the AddApptr dashboard in the create/edit placements popup.
* Provide the "supply chain object" to SmartAd Server ad requests.
* Placements will pass themselves to all placements-specific listener methods as a parameter called Placement to their listeners. This parameter will enable the listeners to know which placement triggered the listener method. The placement name can be checked by using method: `placement.getName()`.
  * Changed APIs:
    * `public void onHaveAd(@NonNull Placement placement)`
    * `public void onNoAd(@NonNull Placement placement)`
    * `public void onPauseForAd(@NonNull Placement placement)`
    * `public void onResumeAfterAd(@NonNull Placement placement)`
    * `public void onUserEarnedIncentive(@NonNull Placement placement, @Nullable AATKitReward aatKitReward)`
    * `public void onHaveAdWithBannerView(@NonNull Placement placement, @NonNull BannerPlacementLayout bannerView)`

</details>

### 3.0 Beta

<details>

<summary>3.0.1</summary>

2022-07-25

* Move interfaces for placement listeners and consent away from AATKit class to solve issue with AndroidStudio and Java interoperability.

</details>

<details>

<summary>3.0.0</summary>

2022-07-22

### First beta of AATKit 3 <a href="#markdown-header-first-beta-of-aatkit-3" id="markdown-header-first-beta-of-aatkit-3"></a>

AATKit 3 comes with the following improvements:

* New object-oriented APIs for all placement types.
* Each placement now uses a separate delegate (as opposed to general delegate used by AATKit 2).
* Some method names have changed for improved consistency across platforms.

To learn more about the changes, please refer to our [AATKit 3 Migration Guide](https://bitbucket.org/addapptr/showcase-android/wiki/AATKit_3/AATKit%203%20%20-%20Migration%20Guide).

</details>
