---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ads.yandex.com/helpcenter/en/easy/integration/android/8-0-0-migration.md
  - https://ads.yandex.com/helpcenter/ru/easy/integration/android/8-0-0-migration.md
  - href: en/easy/integration/android/8-0-0-migration.md
    type: text/markdown
    title: Markdown version
  - href: llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/en/llms.txt

<!--
Используется в Boost: boost/ru/ad-monetization/dev/android
-->

# Guide for migrating to version 8

Version 8 of the Yandex Mobile Ads SDK introduces multiple API changes aimed at improving the developer experience.

## Key changes

### 1. Changes to AdRequest

The `AdRequestConfiguration` and `NativeAdRequestConfiguration` classes have been removed. Use `AdRequest` for all ad formats.

#|
|| **Class** | **Status** ||
|| `AdRequestConfiguration` | Removed. Use `AdRequest` ||
|| `NativeAdRequestConfiguration` | Removed. Use `AdRequest` and `NativeAdOptions`. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // Fullscreen & Native Ads, e.g. InterstitialAdLoader
  val loader = InterstitialAdLoader(this)
  val config = AdRequestConfiguration.Builder("R-M-XXXXX-YY").build()
  loader.loadAd(config)

  // Banner ads
  val bannerView = findViewById<R.id.view_banner>(BannerAdView)
  bannerView.setAdUnitId("R-M-XXXXX-YY")
  val request = AdRequest.Builder().build()
  bannerView.loadAd(request)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // Fullscreen & Native Ads, e.g. InterstitialAdLoader
  val loader = InterstitialAdLoader(this)
  val request = AdRequest.Builder("R-M-XXXXX-YY").build()
  loader.loadAd(adRequest, listener)

  // Banner ads
  val bannerView = findViewById<R.id.view_banner>(BannerAdView)
  val request = AdRequest.Builder("R-M-XXXXX-YY").build()
  bannerView.loadAd(request)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      // Fullscreen & Native Ads, e.g. InterstitialAdLoader
      InterstitialAdLoader loader = new InterstitialAdLoader(this);
      AdRequestConfiguration config = new AdRequestConfiguration.Builder("R-M-XXXXX-YY")
              .build();
      loader.loadAd(config);

      // Banner ads
      BannerAdView bannerView = findViewById(R.id.view_banner);
      bannerView.setAdUnitId("R-M-XXXXX-YY");
      AdRequest request = AdRequest.Builder().build();
      bannerView.loadAd(request);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      // Fullscreen & Native Ads, e.g. InterstitialAdLoader
      InterstitialAdLoader loader = new InterstitialAdLoader(this);
      AdRequest request = new AdRequest.Builder("R-M-XXXXX-YY")
              .build();
      loader.loadAd(request, listener);

      // Banner ads
      BannerAdView bannerView = findViewById(R.id.view_banner);
      AdRequest request = new AdRequest.Builder("R-M-XXXXX-YY").build();
      bannerView.loadAd(request);
  }
  ```
  ||
  |#

{% endlist %}

### 2. Changes to the Targeting API

- The fields `age`, `gender`, `location`, `contextQuery`, and `contextTags` have been removed from `AdRequest.Builder`.
- To manage the targeting parameters, use the new `AdTargeting` class.

#|
|| **Class** | **Status** ||
|| `AdTargeting` | Added ||
|| `AdTargeting.Builder` | Added ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `AdRequest.Builder` | `setAge(String)` | Removed. Use `AdTargeting.Builder.setAge(String)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setGender(String)` | Removed. Use `AdTargeting.Builder.setGender(String)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setLocation(Location)` | Removed. Use `AdTargeting.Builder.setLocation(Location)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setContextQuery(String)` | Removed. Use `AdTargeting.Builder.setContextQuery(String)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setContextTags(List<String>)` | Removed. Use `AdTargeting.Builder.setContextTags(List<String>)` and `AdRequest.Builder.setTargeting(AdTargeting)`. ||
|| ^ | `setTargeting(AdTargeting)` | Added ||
|| `AdTargeting.Builder` | `setAge(String)` | Added ||
|| ^ | `setGender(String)` | Added ||
|| ^ | `setLocation(Location)` | Added ||
|| ^ | `setContextQuery(String)` | Added ||
|| ^ | `setContextTags(List<String>)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val adRequest = AdRequest.Builder()
      .setAge("25")
      .setGender(Gender.MALE)
      .setContextTags(listOf("news"))
      .build()
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val targeting = AdTargeting.Builder()
      .setAge("25")
      .setGender(Gender.MALE)
      .setContextTags(listOf("news"))
      .build()

  val adRequest = AdRequest.Builder(adUnitId)
      .setTargeting(targeting)
      .build()
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      AdRequest adRequest = AdRequest.Builder()
              .setAge("25")
              .setGender(Gender.MALE)
              .setContextTags(listOf("news"))
              .build();
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      AdTargeting targeting = new AdTargeting.Builder()
              .setAge("25")
              .setGender(Gender.MALE)
              .setContextTags(listOf("news"))
              .build();

      AdRequest adRequest = new AdRequest.Builder(adUnitId)
              .setTargeting(targeting)
              .build();
  }
  ```
  ||
  |#

{% endlist %}

### 3. Changes to the ad loading API

The methods for registering callback and ad load listeners have been updated.

#|
|| **Class** | **Method** | **Status** ||
|| InterstitialAdLoader | `setAdLoadListener(InterstitialAdLoadListener)` | Removed. Pass `InterstitialAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, InterstitialAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, InterstitialAdLoadListener)` | Added ||
|| RewardedAdLoader | `setAdLoadListener(RewardedAdLoadListener)` | Removed. Pass `RewardedAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, RewardedAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, RewardedAdLoadListener)` | Added ||
|| AppOpenAdLoader | `setAdLoadListener(AppOpenAdLoadListener)` | Removed. Pass the `AppOpenAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(AdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, AppOpenAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, AppOpenAdLoadListener)` | Added ||
|| NativeAdLoader | `setNativeAdLoadListener(NativeAdLoadListener)` | Removed. Pass `NativeAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(NativeAdRequestConfiguration)` | Removed. Use `loadAd(AdRequest, NativeAdLoadListener)`. ||
|| ^ | `loadAd(AdRequest, NativeAdOptions, NativeAdLoadListener)` | Added ||
|| ^ | `loadAd(AdRequest, NativeAdLoadListener)` | Added ||
|| ^ | `loadAd(AdRequest, NativeAdLoadListener)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // Interstitial Ads
  val interstitialAdLoader = InterstitialAdLoader(this)
  interstitialAdLoader.setAdLoadListener(object : InterstitialAdLoadListener { /* ... */ })
  interstitialAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // Rewarded Ads
  val rewardedAdLoader = RewardedAdLoader(this)
  rewardedAdLoader.setAdLoadListener(object : RewardedAdLoadListener { /* ... */ })
  rewardedAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // AppOpen Ads
  val appOpenAdLoader = AppOpenAdLoader(this)
  appOpenAdLoader.setAdLoadListener(object : AppOpenAdLoadListener { /* ... */ })
  appOpenAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

  // Native Ads
  val nativeAdLoader = NativeAdLoader(this)
  nativeAdLoader.setNativeAdLoadListener(object : NativeAdLoadListener { /* ... */ })
  nativeAdLoader.loadAd(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build())
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // Interstitial Ads
  val interstitialAdLoader = InterstitialAdLoader(this)
  interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : InterstitialAdLoadListener { /* ... */ })

  // Rewarded Ads
  val rewardedAdLoader = RewardedAdLoader(this)
  rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : RewardedAdLoadListener { /* ... */ })

  // AppOpen Ads
  val appOpenAdLoader = AppOpenAdLoader(this)
  appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : AppOpenAdLoadListener { /* ... */ })

  // Native Ads
  val nativeAdLoader = NativeAdLoader(this)
  nativeAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : NativeAdLoadListener { /* ... */ })
  // Or with NativeAdOptions
  nativeAdLoader.loadAd(
      AdRequest.Builder("R-M-XXXXX-YY").build(),
      NativeAdOptions.Builder().build(),
      object : NativeAdLoadListener { /* ... */ })
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      // Interstitial Ads
      InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
      interstitialAdLoader.setAdLoadListener(new InterstitialAdLoadListener() { /* ... */ });
      interstitialAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // Rewarded Ads
      RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
      rewardedAdLoader.setAdLoadListener(new RewardedAdLoadListener() { /* ... */ });
      rewardedAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // AppOpen Ads
      AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
      appOpenAdLoader.setAdLoadListener(new AppOpenAdLoadListener() { /* ... */ });
      appOpenAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

      // Native Ads
      NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
      nativeAdLoader.setNativeAdLoadListener(new NativeAdLoadListener() { /* ... */ });
      nativeAdLoader.loadAd(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build());
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      // Interstitial Ads
      InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
      interstitialAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new InterstitialAdLoadListener() { /* ... */ }
      );

      // Rewarded Ads
      RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
      rewardedAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new RewardedAdLoadListener() { /* ... */ }
      );

      // AppOpen Ads
      AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
      appOpenAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new AppOpenAdLoadListener() { /* ... */ }
      );

      // Native Ads
      NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
      nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new NativeAdLoadListener() { /* ... */ }
      );
      // Or with NativeAdOptions
      nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
              new NativeAdOptions.Builder().build(),
              new NativeAdLoadListener() { /* ... */ }
      );
  }
  ```
  ||
  |#

{% endlist %}

### 3.1 Support for Kotlin Coroutines

The API now includes `suspend` overloads for ad loading methods:

#|
|| **Class** | **Method** | **Status** ||
|| InterstitialAdLoader | `suspend fun loadAd(AdRequest): InterstitialAdLoadResult` | Added ||
|| RewardedAdLoader | `suspend fun loadAd(AdRequest): RewardedAdLoadResult` | Added ||
|| AppOpenAdLoader | `suspend fun loadAd(AdRequest): AppOpenAdLoadResult` | Added ||
|| NativeAdLoader | `suspend fun loadAd(AdRequest, NativeAdOptions): NativeAdLoadResult` | Added ||
|| ^ | `suspend fun loadAd(AdRequest): NativeAdLoadResult` | Added ||
|#

#### Examples

```kotlin
lifecycleScope.launch {
    // Interstitial Ads
    val interstitialAdLoader = InterstitialAdLoader(applicationContext)
    when(val result = interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is InterstitialAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InterstitialAdLoadResult.Success -> TODO("Show interstitial ad: ${result.ad}")
    }

    // Rewarded Ads
    val rewardedAdLoader = RewardedAdLoader(applicationContext)
    when(val result = rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is RewardedAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is RewardedAdLoadResult.Success -> TODO("Show rewarded ad: ${result.ad}")
    }

    // AppOpen Ads
    val appOpenAdLoader = AppOpenAdLoader(applicationContext)
    when(val result = appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is AppOpenAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is AppOpenAdLoadResult.Success -> TODO("Show appOpen ad: ${result.ad}")
    }

    // Native Ads
    val nativeAdLoader = NativeAdLoader(applicationContext)
    val nativeAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = nativeAdLoader.loadAd(nativeAdRequest)) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }

    // Or with NativeAdOptions
    when(val result = nativeAdLoader.loadAd(nativeAdRequest, NativeAdOptions.Builder().build())) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }
}
```

### 4. Changes to the Banner API

The `setAdUnitId` method has been removed from `BannerAdView`. The `adUnitId` is now set for each ad load.
Factory methods for creating `BannerAdSize` have been renamed.

#|
|| **Class** | **Method** | **Status** ||
|| `BannerAdView` | `setAdUnitId(String)` | Removed. Pass the `adUnitId` property to the `AdRequest` builder before loading an ad. ||
|| `BannerAdSize` | `stickySize` | Removed. Use `BannerAdSize.sticky`. ||
|| ^ | `inlineSize` | Removed. Use `BannerAdSize.inline`. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val banner = findViewById<R.id.banner>(BannerAdView)
  val stickySize = BannerAdSize.stickySize(this, screenWidth)
  val inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300)
  banner.setAdUnitId("R-M-XXXXX-YY")
  banner.setAdSize(stickySize)
  banner.loadAd(AdRequest.Builder().build())
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val banner = findViewById<R.id.banner>(BannerAdView)
  val stickySize = BannerAdSize.sticky(this, screenWidth)
  val inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300)
  banner.setAdSize(stickySize)
  banner.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      BannerAdView banner = findViewById(R.id.banner);
      BannerAdSize stickySize = BannerAdSize.stickySize(this, screenWidth);
      BannerAdSize inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300);
      banner.setAdUnitId("R-M-XXXXX-YY");
      banner.setAdSize(stickySize);
      banner.loadAd(new AdRequest.Builder().build());
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      BannerAdView banner = findViewById(R.id.banner);
      BannerAdSize stickySize = BannerAdSize.sticky(this, screenWidth);
      BannerAdSize inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300);
      banner.setAdSize(stickySize);
      banner.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build());
  }
  ```
  ||
  |#

{% endlist %}

### 5. Changes to the AdInfo API

We've changed the methods for retrieving data on ad creatives to properties and removed additional information:

#|
|| **Class** | **Method/Field** | **Status** ||
|| `BannerAdView`, `InsterstitialAd`, `RewardedAd`, `AppOpenAd`, `NativeAd` | `info` | Removed. Use `adInfo` ||
|| ^ | `adAttributes` | Removed. Use `adInfo` ||
|| `NativeAd` | `creativeId` | Removed. Use `Creative.creativeId`. ||
|| ^ | `campaignId` | Removed. Use `Creative.campaignId`. ||
|| `AdInfo` | `data` | Removed ||
|| ^ | `adSize` | Removed ||
|| ^ | `creatives` | Added ||
|| ^ | `extraData` | Added ||
|| ^ | `partnerText` | Added ||
|| `Creative` | `placeId` | Added ||
|| ^ | `offerId` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // BannerAdView
  val extraData = banner.info
  val adUnitId = banner.adInfo.adUnitId
  val extraData2 = banner.adInfo.data
  val width = banner.adInfo.adSize?.width
  val height = banner.adInfo.adSize?.height
  val creativeId = banner.adInfo.creatives.first().creativeId
  val campaignId = banner.adInfo.creatives.first().campaignId
  val creativeId2 = banner.adAttributes.first().bannerId
  val campaignId2 = banner.adAttributes.first().campaignId
  val placeId = banner.adAttributes.first().placeId

  // InterstitialAd, RewardedAd, AppOpenAd
  val extraData = fullscreenAd.info.data
  val adUnitId = fullscreenAd.info.adUnitId
  val width = fullscreenAd.info.adSize?.width
  val height = fullscreenAd.info.adSize?.height
  val creativeId = fullscreenAd.info.creatives.first().creativeId
  val campaignId = fullscreenAd.info.creatives.first().campaignId
  val creativeId2 = fullscreenAd.adAttributes.first().bannerId
  val campaignId2 = fullscreenAd.adAttributes.first().campaignId
  val placeId = fullscreenAd.adAttributes.first().placeId

  // NativeAd
  val extraData = nativeAd.info
  val creativeId = nativeAd.creativeId
  val campaignId = nativeAd.campaignId
  val creativeId2 = nativeAd.adAttributes?.bannerId
  val campaignId2 = nativeAd.adAttributes?.campaignId
  val placeId = nativeAd.adAttributes?.placeId
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // BannerAdView
  val extraData = banner.adInfo.extraData
  val partnerText = banner.adInfo.partnerText
  val creativeId = banner.adInfo.creatives.first().creativeId
  val campaignId = banner.adInfo.creatives.first().campaignId
  val placeId = banner.adInfo.creatives.first().placeId
  val adUnitId = banner.adInfo.adUnitId
  val width = banner.adSize?.width
  val height = banner.adSize?.height

  // InterstitialAd, RewardedAd, AppOpenAd
  val extraData = fullscreenAd.adInfo.extraData
  val partnerText = fullscreenAd.adInfo.partnerText
  val adUnitId = fullscreenAd.adInfo.adUnitId
  val creativeId = fullscreenAd.adInfo.creatives.first().creativeId
  val campaignId = fullscreenAd.adInfo.creatives.first().campaignId
  val placeId = fullscreenAd.adInfo.creatives.first().placeId

  // NativeAd
  val extraData = nativeAd.adInfo.extraData
  val partnerText = nativeAd.adInfo.partnerText
  val adUnitId = nativeAd.adInfo.adUnitId
  val creativeId = nativeAd.adInfo.creatives.first().creativeId
  val campaignId = nativeAd.adInfo.creatives.first().campaignId
  val placeId = nativeAd.adInfo.creatives.first().placeId
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  // BannerAdView
  String extraData = banner.getInfo();
  String adUnitId = banner.getAdInfo().getAdUnitId();
  String extraData2 = banner.getAdInfo().getData();
  int width = banner.getAdInfo().getAdSize().getWidth();
  int height = banner.getAdInfo().getAdSize().getHeight();
  String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
  String creativeId2 = banner.getAdAttributes().get(0).getBannerId();
  String campaignId2 = banner.getAdAttributes().get(0).getCampaignId();
  String placeId = banner.getAdAttributes().get(0).getPlaceId();

  // InterstitialAd, RewardedAD, AppOpenAd
  String extraData = fullscreenAd.getInfo().getData();
  String adUnitId = fullscreenAd.getInfo().getAdUnitId();
  int width = fullscreenAd.getInfo().getAdSize().getWidth();
  int height = fullscreenAd.getInfo().getAdSize().getHeight();
  String creativeId = fullscreenAd.getInfo().getCreatives().get(0).getCreativeId();
  String campaignId = fullscreenAd.getInfo().getCreatives().get(0).getCampaignId();
  String creativeId2 = fullscreenAd.getAdAttributes().get(0).getBannerId();
  String campaignId2 = fullscreenAd.getAdAttributes().get(0).getCampaignId();
  String placeId = fullscreenAd.getAdAttributes().get(0).getPlaceId();

  // NativeAd
  String extraData = nativeAd.getInfo();
  String creativeId = nativeAd.getCreativeId();
  String campaignId = nativeAd.getCampaignId();
  String creativeId2 = nativeAd.getAdAttributes().getBannerId();
  String campaignId2 = nativeAd.getAdAttributes().getCampaignId();
  String placeId = nativeAd.getAdAttributes().getPlaceId();
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  // BannerAdView
  String extraData = banner.getAdInfo().getExtraData();
  String partnerText = banner.getAdInfo().getPartnerText();
  String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
  String placeId = banner.getAdInfo().getCreatives().get(0).getPlaceId();
  String adUnitId = banner.getAdInfo().getAdUnitId();
  int width = banner.getAdSize().getWidth();
  int height = banner.getAdSize().getHeight();

  // InterstitialAd, RewardedAd, AppOpenAd
  String extraData = fullscreenAd.getAdInfo().getExtraData();
  String partnerText = fullscreenAd.getAdInfo().getPartnerText();
  String adUnitId = fullscreenAd.getAdInfo().getAdUnitId();
  String creativeId = fullscreenAd.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = fullscreenAd.getAdInfo().getCreatives().get(0).getCampaignId();
  String placeId = fullscreenAd.getAdInfo().getCreatives().get(0).getPlaceId();

  // NativeAd
  String extraData = nativeAd.getAdInfo().getExtraData();
  String partnerText = nativeAd.getAdInfo().getPartnerText();
  String adUnitId = nativeAd.getAdInfo().getAdUnitId();
  String creativeId = nativeAd.getAdInfo().getCreatives().get(0).getCreativeId();
  String campaignId = nativeAd.getAdInfo().getCreatives().get(0).getCampaignId();
  String placeId = nativeAd.getAdInfo().getCreatives().get(0).getPlaceId();
  ```
  ||
  |#

{% endlist %}


### 6. Changes to the Native Ads API

- The `NativeAd.bindNativeAd` method now return `AdBindingResult` and no longer throw exceptions.
- The `warning` field type has been changed from `String?` to `NativeAdWarning?`. To comply with the Federal Law "On Advertising", apart from the `warning` asset's content, the new class also contains the `warning` asset's minimum required size as a percentage of the total ad area.
- The `NativeAdMedia` class now contains the `hasVideo` field to indicate whether the selected ad includes a video creative.

#|
|| **Class** | **Status** ||
|| `AdBindingResult` |  Added ||
|| `NativeAdWarning` |  Added ||
|#

#|
|| **Class** | **Method/Field** | **Status** ||
|| `NativeAd` | `bindNativeAd` | The method now returns an `AdBindingResult` value. It no longer throws exceptions. ||
|| `NativeAdAssets` | `warning` | Type changed: `String` -> `NativeAdWarning` ||
|| `NativeAdWarning` | `value` | Added ||
|| ^ | `minimumRequiredArea` | Added ||
|| `NativeAdMedia` | `hasVideo` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val warning = nativeAd.adAssets.warning
  try {
      nativeAd.bindNativeAd(binder)
  } catch (e: NativeAdException) {
      val message = e.message
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val warningAsset = nativeAd.adAssets.warning
  val warning = warningAsset?.value
  val warningMinArea = warningAsset?.minimumRequiredArea
  val hasVideo = nativeAd.adAssets.media?.hasVideo
  when (val result = nativeAd.bindNativeAd(binder)) {
      is AdBindingResult.Failure -> {
          val missingAssetName = result.missingAssetName
          val message = result.exception.message
      }
      AdBindingResult.Success -> Unit
  }
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void bindAd(NativeAd nativeAd) {
      String warning = nativeAd.getAdAssets().getWarning();
      try {
          nativeAd.bindNativeAd(binder);
      } catch (NativeAdException e) {
          String message = e.getMessage();
      }
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void bindNativeAd(NativeAd nativeAd) {
      NativeAdWarning warningAsset = nativeAd.getAdAssets().getWarning();
      String warning = warningAsset.getValue();
      float minWarningArea = warningAsset.getMinimumRequiredArea();
      boolean hasVideo = nativeAd.getAdAssets().getMedia().getHasVideo();
      AdBindingResult result = nativeAd.bindNativeAd(binder);
      if (result instanceof AdBindingResult.Failure) {
          String missingAssetName = ((AdBindingResult.Failure) result).getMissingAssetName();
          String message = ((AdBindingResult.Failure) result).getException().getMessage();
      }
  }
  ```
  ||
  |#

{% endlist %}

### 6.1 API for native ad templates

Tools for native ad integration via templates have been removed. Use standard native ad
assets for integration.

#|
|| **Class** | **Status** ||
|| `NativeBannerView` | Removed ||
|| `SizeConstraint` | ^ ||
|| `HorizontalOffset` | ^ ||
|| `NativeTemplateAppearance` | ^ ||
|| `TextAppearance` | ^ ||
|| `BannerAppearance` | ^ ||
|| `ButtonAppearance` | ^ ||
|| `RatingAppearance` | ^ ||
|#

### 7. Some callback methods for ad objects were removed

- The `ClosableBannerAdEventListener` and `ClosableNativeAdEventListener` interfaces have been removed.
- The methods `onLeftApplication` and `onReturnToApplication` have been removed.

#|
|| **Class** | **Status** ||
|| `ClosableBannerAdEventListener` |  Removed ||
|| `ClosableNativeAdEventListener` |  Removed ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `BannerAdEventListener`, `NativeAdEventListener` | `onLeftApplication` | Removed ||
|| ^ | `onReturnToApplication` | Removed ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  bannerAd?.setBannerAdEventListener(object : ClosableBannerAdEventListener {
      override fun closeBannerAd() { /* ... */ }
      override fun onAdClicked() { /* ... */ }
      override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
      override fun onAdLoaded() { /* ... */ }
      override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
      override fun onLeftApplication() { /* ... */ }
      override fun onReturnedToApplication() { /* ... */ }
  })
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // ClosableAdEventListener as well as
  // onAdClosed callback are not available anymore
  bannerAdView?.setBannerAdEventListener(object : BannerAdEventListener {
      override fun onAdClicked() { /* ... */ }
      override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
      override fun onAdLoaded() { /* ... */ }
      override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
  })
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void setEventListener(BannerAdView bannerView) {
      bannerView.setBannerAdEventListener(
      new ClosableBannerAdEventListener() {
              @Override
              public void closeBannerAd() { /* ... */ }
              @Override
              public void onAdLoaded() { /* ... */ }
              @Override
              public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
              @Override
              public void onAdClicked() { /* ... */ }
              @Override
              public void onLeftApplication() { /* ... */ }
              @Override
              public void onReturnedToApplication() { /* ... */ }
              @Override
              public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
          }
      );
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void setEventListener(BannerAdView bannerView) {
  // ClosableAdEventListener as well as
  // onAdClosed callback are not available anymore
      bannerView.setBannerAdEventListener(
          new BannerAdEventListener() {
              @Override
              public void onAdLoaded() { /* ... */ }
              @Override
              public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
              @Override
              public void onAdClicked() { /* ... */ }
              @Override
              public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
          }
      );
  }
  ```
  ||
  |#

{% endlist %}

### 8. Changes to the main SDK class

- The main SDK class has been renamed to `YandexAds`.
- We've also renamed some methods for configuring privacy settings.

#|
|| **Class** |  **Status** ||
|| `YandexAds` |  Added ||
|| `MobileAds` | Removed. Use `YandexAds`. ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `MobileAds` | `setAgeRestrictedUser(Boolean)` | Removed. Use `YandexAds.setAgeRestricted(Boolean)`. ||
|| ^ | `setLocationConsent(Boolean)` | Removed. Use `YandexAds.setLocationTracking(Boolean)`. ||
|| `YandexAds` | `setAgeRestricted(Boolean)` | Added ||
|| ^ | `setLocationTracking(Boolean)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.common.MobileAds

  MobileAds.setUserConsent(true)
  MobileAds.setAgeRestrictedUser(false)
  MobileAds.setLocationConsent(true)
  MobileAds.initialize(context) { /* ... */ }
  MobileAds.enableDebugErrorIndicator(true)
  MobileAds.enableLogging(true)
  MobileAds.setAppAdAnalyticsReporting(true)
  MobileAds.showDebugPanel(this)
  MobileAds.libraryVersion
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.common.YandexAds

  YandexAds.setUserConsent(true)
  YandexAds.setAgeRestricted(false)
  YandexAds.setLocationTracking(true)
  YandexAds.initialize(context) { /* ... */ }
  YandexAds.enableDebugErrorIndicator(true)
  YandexAds.enableLogging(true)
  YandexAds.setAppAdAnalyticsReporting(true)
  YandexAds.showDebugPanel(this)
  YandexAds.libraryVersion
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  import com.yandex.mobile.ads.common.MobileAds;

  void initSdk() {
      MobileAds.setUserConsent(true);
      MobileAds.setAgeRestrictedUser(false);
      MobileAds.setLocationConsent(true);
      MobileAds.initialize(this, () -> { /* ... */ });
      MobileAds.getLibraryVersion();
      MobileAds.enableDebugErrorIndicator(true);
      MobileAds.enableLogging(true);
      MobileAds.setAppAdAnalyticsReporting(true);
      MobileAds.showDebugPanel(this);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  import com.yandex.mobile.ads.common.YandexAds;

  void initSdk() {
      YandexAds.setUserConsent(true);
      YandexAds.setAgeRestricted(false);
      YandexAds.setLocationTracking(true);
      YandexAds.initialize(this, () -> { /* ... */ });
      YandexAds.getLibraryVersion();
      YandexAds.enableDebugErrorIndicator(true);
      YandexAds.enableLogging(true);
      YandexAds.setAppAdAnalyticsReporting(true);
      YandexAds.showDebugPanel(this);
  }
  ```
  ||
  |#

{% endlist %}

## Changes to the InStream API

### 1. Changes to the packages and dependency structure

Core classes have been renamed to match the new SDK structure.

#|
|| **Class** | **Status** ||
|| `com.yandex.mobile.ads.instream.InstreamAdBinder` | Moved to `com.yandex.mobile.ads.instream.binder.InstreamAdBinder` ||
|| `com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration` | Renamed to `com.yandex.mobile.ads.instream.InstreamAdRequest` ||
|| `com.yandex.mobile.ads.instream.InstreamAdBreak` | Renamed to `com.yandex.mobile.ads.instream.adbreak.AdBreakData` ||
|| `com.yandex.mobile.ads.instream.inroll.Inroll`, `com.yandex.mobile.ads.instream.pauseroll.Pauseroll` | Replaced with `com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak` ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.instream.InstreamAdBinder
  import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration
  import com.yandex.mobile.ads.instream.InstreamAdBreak
  import com.yandex.mobile.ads.instream.inroll.Inroll
  import com.yandex.mobile.ads.instream.pauseroll.Pauseroll
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  import com.yandex.mobile.ads.instream.binder.InstreamAdBinder
  import com.yandex.mobile.ads.instream.InstreamAdRequest
  import com.yandex.mobile.ads.instream.adbreak.AdBreakData
  import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  import com.yandex.mobile.ads.instream.InstreamAdBinder;
  import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration;
  import com.yandex.mobile.ads.instream.InstreamAdBreak;
  import com.yandex.mobile.ads.instream.inroll.Inroll;
  import com.yandex.mobile.ads.instream.pauseroll.Pauseroll;
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  import com.yandex.mobile.ads.instream.binder.InstreamAdBinder;
  import com.yandex.mobile.ads.instream.InstreamAdRequest;
  import com.yandex.mobile.ads.instream.adbreak.AdBreakData;
  import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak;
  ```
  ||
  |#

{% endlist %}

### 2. Changes to AdRequest

The `InstreamAdRequestConfiguration` class has been renamed to `InstreamAdRequest`.

#|
|| **Class** | **Status** ||
|| `InstreamAdRequestConfiguration` | Removed. Use `InstreamAdRequest`. ||
|| `InstreamAdRequest` | Added ||
|| `InstreamAdBreakRequest` | Added ||
|#


#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val loader = InstreamAdLoader(this)
  val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
  loader.loadInstreamAd(this, config)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val loader = InstreamAdLoader(this)
  val config = InstreamAdRequest.Builder("XXXXXX").build()
  loader.loadInstreamAd(this, config)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      InstreamAdLoader loader = new InstreamAdLoader(this);
      InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
      loader.loadInstreamAd(this, config);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      InstreamAdLoader loader = new InstreamAdLoader(this);
      InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
      loader.loadInstreamAd(this, config);
  }
  ```
  ||
  |#

{% endlist %}

### 3. Changes to the ad loading API

- The methods for registering callback and ad load listeners have been updated.
- The API now includes the `InstreamAdBreakLoader` class for loading ad breaks.
- The `onInstreamAdFailedToLoad` method signature has changed: an `InstreamAdRequestError` object is now passed instead of a `reason` string.

#|
|| **Class**  | **Status** ||
|| `InstreamAdBreakLoadListener`  | Added ||
|| `InstreamAdBreakLoader` | Added ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdLoader` | `setInstreamAdLoadListener(InstreamAdLoadListener)` | Removed. Pass `InstreamAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(InstreamAdRequestConfiguration)` | Removed. Pass `InstreamAdLoadListener` to the `loadAd` method. ||
|| ^ | `loadAd(InstreamAdRequest, InstreamAdLoadListener)` | Removed. Pass `InstreamAdLoadListener` to the `loadAd` method. ||
|| `InstreamAdLoadListener` | `onInstreamAdFailedToLoad(String)` | Removed. Use `onInstreamAdFailedToLoad(InstreamAdRequestError)`. ||
|| ^ | `onInstreamAdFailedToLoad(InstreamAdRequestError)` | Added ||
|| `InstreamAdBreakLoader` | `loadAd(InstreamAdBreakRequest, InstreamAdBreakLoadListener)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val instreamAdLoader = InstreamAdLoader(this)
  instreamAdLoader.setInstreamAdLoadListener(object : InstreamAdLoadListener {
      override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
          // ...
      }

      override fun onInstreamAdFailedToLoad(reason: String) {
          println("Instream ad failed to load: $reason")
      }
  })
  val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
  instreamAdLoader.loadInstreamAd(this, config)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val instreamAdLoader = InstreamAdLoader(this)
  val config = InstreamAdRequest.Builder("XXXXXX").build()
  instreamAdLoader.loadAd(config, object : InstreamAdLoadListener {
      override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
          // ...
      }

      override fun onInstreamAdFailedToLoad(error: InstreamAdRequestError) {
          println("Instream ad failed to load: ${error.reason}")
      }
  })
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadInstreamAd() {
      InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
      instreamAdLoader.setInstreamAdLoadListener(new InstreamAdLoadListener() {
          @Override
          public void onInstreamAdLoaded(InstreamAd instreamAd) {
              // ...
          }

          @Override
          public void onInstreamAdFailedToLoad(String reason) {
              System.out.println("Instream ad failed to load: " + reason);
          }
      });
      InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
      instreamAdLoader.loadInstreamAd(this, config);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadInstreamAd() {
      InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
      InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
      instreamAdLoader.loadAd(config, new InstreamAdLoadListener() {
          @Override
          public void onInstreamAdLoaded(InstreamAd instreamAd) {
              // ...
          }

          @Override
          public void onInstreamAdFailedToLoad(InstreamAdRequestError error) {
              System.out.println("Instream ad failed to load: " + error.getReason());
          }
      });
  }
  ```
  ||
  |#

{% endlist %}

### 3.1 Support for Kotlin Coroutines

We've added `suspend` overloads for ad loading methods to `InstreamAdLoader` and `InstreamAdBreakAdLoader`.

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdLoader` | `suspend fun loadAd(InstreamAdRequest): InstreamAdLoadResult` | Added ||
|| `InstreamAdBreakLoader` | `suspend fun loadAd(InstreamAdBreakRequest): InstreamAdBreakLoadResult` | Added||
|#

#### For example:

```kotlin
lifecycleScope.launch {
    val instreamAdLoader = InstreamAdLoader(applicationContext)
    when(val result = instreamAdLoader.loadAd(InstreamAdRequest.Builder("XXXXXX").build())) {
        is InstreamAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdLoadResult.Success -> TODO("Show instream ad: ${result.ad}")
    }

    val adBreakLoader = InstreamAdBreakLoader(applicationContext)
    when (val result = adBreakLoader.loadAd(InstreamAdBreakRequest.Builder("XXXXXX", "YY").build())) {
        is InstreamAdBreakLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdBreakLoadResult.Success -> TODO("Show adBreak : ${result.adBreak}")
    }
}
```

### 4. Using in-roll and pause-roll

- The logic for managing ad breaks has become more flexible.
- The specialized queue providers, `InrollQueueProvider` and `PauserollQueueProvider`, have been removed. Ad breaks are now accessible directly from the `InstreamAd` object and can be filtered by type.

{% note info "" %}

If you're using automatic rendering via `InstreamAdBinder`, select only `INROLL` and `PAUSEROLL` ad breaks from the `instreamAdBreaks` collection.

{% endnote %}

#|
|| **Class** | **Status** ||
|| `InrollQueueProvider` | Removed. Use `instreamAd.instreamAdBreaks` filtered by `InstreamAdBreakType.INROLL`. ||
|| `PauserollQueueProvider` | Removed. Use `instreamAd.instreamAdBreaks` filtered by `InstreamAdBreakType.PAUSEROLL`. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // 1. Get In-roll queue from loaded ad
  val inrollQueueProvider = InrollQueueProvider(context, instreamAd)
  val instreamAdBreakQueue = inrollQueueProvider.queue

  // 2. Prepare specific ad break
  val currentInroll = instreamAdBreakQueue.poll()
  currentInroll?.setListener(object : InstreamAdBreakEventListener {
      override fun onInstreamAdBreakPrepared() {
          // 3. Show prepared ad break
          currentInroll.play(instreamAdView)
      }
      // ... other listener methods
  })
  currentInroll?.prepare(instreamAdPlayer)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // 1. Get list of all ad breaks directly from InstreamAd
  val inrolls = instreamAd.instreamAdBreaks.filter {
      it.adBreakData.type == InstreamAdBreakType.INROLL
  }

  // 2. Prepare and show
  val inrollIndex = 0 // Manage the index yourself
  val currentInroll = inrolls.getOrNull(inrollIndex)

  currentInroll?.setListener(object : InstreamAdBreakEventListener {
      override fun onInstreamAdBreakPrepared() {
          // 3. Show prepared ad break
          currentInroll.play(instreamAdView)
      }
  })
  currentInroll?.prepare(instreamAdPlayer)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAdBreak() {
  // 1. Get In-roll queue from loaded ad
      InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd);
      Queue<Inroll> instreamAdBreakQueue = inrollQueueProvider.getQueue();

  // 2. Prepare specific ad break
      Inroll currentInroll = instreamAdBreakQueue.poll();
      if (currentInroll != null) {
          currentInroll.setListener(new InstreamAdBreakEventListener() {
              @Override
              public void onInstreamAdBreakPrepared() {
                  // 3. Show prepared ad break
                  currentInroll.play(instreamAdView);
              }
              // ... other listener methods
          });
          currentInroll.prepare(instreamAdPlayer);
      }
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAdBreak() {
      // 1. Get list of all ad breaks directly from InstreamAd
      List<InstreamAdBreak> inrolls = new ArrayList<>();
      for (InstreamAdBreak adBreak : instreamAd.getInstreamAdBreaks()) {
          if (adBreak.getAdBreakData().getType() == InstreamAdBreakType.INROLL) {
              inrolls.add(adBreak);
          }
      }

      // 2. Prepare and show
      int inrollIndex = 0; // Manage the index yourself
      InstreamAdBreak currentInroll = inrollIndex < inrolls.size() ? inrolls.get(inrollIndex) : null;

      if (currentInroll != null) {
          currentInroll.setListener(new InstreamAdBreakEventListener() {
              @Override
              public void onInstreamAdBreakPrepared() {
                  // 3. Show prepared ad break
                  currentInroll.play(instreamAdView);
              }
          });
          currentInroll.prepare(instreamAdPlayer);
      }
  }
  ```
  ||
  |#

{% endlist %}

### 5. Default player

Passing player info for video rendering is now optional. If `null` is passed, the SDK takes full control over video rendering.

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdBinder` | Builder | The `instreamAdPlayer` parameter is now optional and can be set to `null`. ||
|| `InstreamAdBreak` | `prepare(instreamAdPlayer)` | Removed. Use `prepare()` with no parameter. ||
|| ^ | `prepare()` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  // Automatic launch (InstreamAdBinder)
  val instreamAdBinder = InstreamAdBinder(
      context,
      instreamAd,
      instreamAdPlayer, // Player was required
      contentPlayer
  )

  // Manual launch (InstreamAdBreak)
  val adBreak: InstreamAdBreak
  adBreak.prepare(instreamAdPlayer)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  // Automatic launch (InstreamAdBinder)
  val instreamAdBinder = InstreamAdBinder(
      context,
      instreamAd,
      null, // Pass null to use default player
      contentPlayer
  )

  // Manual launch (InstreamAdBreak)
  val adBreak: InstreamAdBreak
  adBreak.prepare()
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void showAd() {
      // Automatic launch (InstreamAdBinder)
      InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
              context,
              instreamAd,
              instreamAdPlayer, // Player was required
              contentPlayer
      );

      // Manual launch (InstreamAdBreak)
      InstreamAdBreak adBreak;
      adBreak.prepare(instreamAdPlayer);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void showAd() {
      // Automatic launch (InstreamAdBinder)
      InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
              context,
              instreamAd,
              null, // Pass null to use default player
              contentPlayer
      );

      // Manual launch (InstreamAdBreak)
      InstreamAdBreak adBreak;
      adBreak.prepare();
  }
  ```
  ||
  |#

{% endlist %}

### 6. Changes to the InstreamAdPlayer interface

The `InstreamAdPlayer` interface has been updated to include the `supportedMimeTypes` property for optimized video format selection and the `bindPlayerView` method for correct positioning of ad elements on top of a video.

#|
|| **Class** | **Method** | **Status** ||
|| `InstreamAdPlayer` | `supportedMimeTypes: List<String>` | Added. Allows the SDK to select the most suitable video format, such as DASH instead of MP4. ||
|| ^ | `bindPlayerView(container: FrameLayout)` | Added. The `videoPlayerView` must be placed inside the provided container and set to fill the entire space. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  class InstreamAdPlayerImpl : InstreamAdPlayer {
      // ... methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  class InstreamAdPlayerImpl : InstreamAdPlayer {

      // 1. List of MIME types supported by the player
      override val supportedMimeTypes: List<String>
          get() = listOf(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM)

      // 2. The videoPlayerView must be placed inside the container and set to fill the entire space
      override fun bindPlayerView(container: FrameLayout) {
          container.addView(playerView)
      }

      // ... other methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  public class InstreamAdPlayerImpl implements InstreamAdPlayer {
      // ... methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  public class InstreamAdPlayerImpl implements InstreamAdPlayer {

      // 1. List of MIME types supported by the player
      @Override
      public List<String> getSupportedMimeTypes() {
          return Arrays.asList(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM);
      }

      // 2. The videoPlayerView must be placed inside the container and set to fill the entire space
      @Override
      public void bindPlayerView(FrameLayout container) {
          container.addView(playerView);
      }

      // ... other methods (prepareAd, playAd, pauseAd, etc.)
  }
  ```
  ||
  |#

{% endlist %}

## Changes to the mediation networks API.

### 1. New API for passing mediation network data

Identification of mediation adapters is now part of a separate method.

#|
|| **Class** | **Status** ||
|| `AdapterIdentity` | Added ||
|#

#|
|| **Class** | **Method** | **Status** ||
|| `YandexAds` | `setAdapterIdentity(AdapterIdentity)` | Added. Call this method before calling `YandexAds.initialize` instead of passing adapter data as additional parameters in ad requests. ||
|#

#### Examples

{% list tabs group=instructions %}

- Kotlin

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  YandexAds.initialize(context, listener)

  val parameters = mapOf(
      "adapter_network_name" to "AdNetwork",
      "adapter_network_version" to "1.2.3",
      "adapter_version" to "1.0.0"
  )

  val adRequest = AdRequest.Builder()
      .setParameters(parameters)
      .build()

  bannerAd.loadAd(adRequest)
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val identity = AdapterIdentity("AdNetwork", "1.0.0", "1.2.3")
  YandexAds.setAdapterIdentity(identity) // Call before initialize()
  YandexAds.initialize(context, listener)

  // No need to pass additional parameters
  val adRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
  bannerAd.loadAd(adRequest)
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadAd() {
      Map<String, String> parameters = new HashMap<>();
      parameters.put("adapter_network_name", "AdNetwork");
      parameters.put("adapter_network_version", "1.2.3");
      parameters.put("adapter_version", "1.0.0");

      AdRequest adRequest = new AdRequest.Builder()
              .setParameters(parameters)
              .build();

      bannerView.loadAd(adRequest);
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadAd() {
      AdapterIdentity adapterIdentity = new AdapterIdentity("AdNetwork", "1.0.0", "1.2.3");
      YandexAds.setAdapterIdentity(adapterIdentity); // Call before initialize()
      YandexAds.initialize(this, () -> { /* ... */ });

      // No need to pass additional parameters
      AdRequest adRequest = new AdRequest.Builder("R-M-XXXXX-YY").build();

      bannerView.loadAd(adRequest);
  }
  ```
  ||
  |#

{% endlist %}

### 2. Renaming and simplifying the BidderTokenRequest class

- The `BidderTokenLoader` class now has a builder, and the `loadBidderToken` static method is now an instance method.
- The `BidderTokenRequestConfiguration` class has been renamed to `BidderTokenRequest` and updated.
- To create an instance, use the `banner`, `interstitial`, `rewarded`, `appOpenAd`, and `native` factory methods instead of `Builder(AdType)`.

#|
|| **Class** | **Status** ||
|| `BidderTokenRequestConfiguration` | Removed. Use `BidderTokenRequest`. ||
|| `BidderTokenRequestConfiguration.Builder` | Removed. Use factory methods in `BidderTokenRequest`. ||
|| `BidderTokenRequest` | Added ||
|#

#|
|| **Class** | **Builder/Method** | **Status** ||
|| `BidderTokenLoader` | `BidderTokenLoader(Context)` | Now has a builder ||
|| ^ | `loadBidderToken` | Updated. The static method is now an instance method of the `BidderTokenLoader` class. ||

|| `BidderTokenRequestConfiguration.Builder` | `setBannerAdSize(BannerAdSize)` | Removed. Pass `BannerAdSize` to the `BidderTokenRequest.banner(BannerAdSize)` method parameters. ||
|| ^ | `setParameters(Map<String, String>)` | Removed. Pass parameters to the arguments of factory methods. ||
|| `BidderTokenRequest` | `banner(BannerAdSize)` | Added ||
|| ^ | `banner(BannerAdSize, AdTargeting)` | Added ||
|| ^ | `banner(BannerAdSize, AdTargeting, Map<String, String>)` | Added ||
|| ^ | `interstitial()` | Added ||
|| ^ | `interstitial(AdTargeting)` | Added ||
|| ^ | `interstitial(AdTargeting, Map<String, String>)` | Added ||
|| ^ | `rewarded()` | Added ||
|| ^ | `rewarded(AdTargeting)` | Added ||
|| ^ | `rewarded(AdTargeting, Map<String, String>)` | Added ||
|| ^ | `appOpenAd()` | Added ||
|| ^ | `appOpenAd(AdTargeting)` | Added ||
|| ^ | `appOpenAd(AdTargeting, Map<String, String>)` | Added ||
|| ^ | `native()` | Added ||
|| ^ | `native(AdTargeting)` | Added ||
|| ^ | `native(AdTargeting, Map<String, String>)` | Added ||
|#

#### Examples

{% list tabs group=instructions %}

  #|
  || **SDK 7** ||
  ||
  ```kotlin
  val bidderTokenRequest = BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
      .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
      .setParameters(mapOf("a" to "b"))
      .build()

  BidderTokenLoader.loadBidderToken(
      this,
      bidderTokenRequest,
      object : BidderTokenLoadListener { /* ... */ }
  )
  ```
  ||
  || **SDK 8** ||
  ||
  ```kotlin
  val bidderTokenLoader = BidderTokenLoader(this);
  bidderTokenLoader.loadBidderToken(
      BidderTokenRequest.banner(BannerAdSize.sticky(this, screenWidth), parameters = mapOf("a" to "b")),
      object : BidderTokenLoadListener { /* ... */ }
  )

  bidderTokenLoader.loadBidderToken(
      BidderTokenRequest.interstitial(),
      object : BidderTokenLoadListener { /* ... */ }
  )
  ```
  ||
  |#

- Java

  #|
  || **SDK 7** ||
  ||
  ```java
  void loadToken() {
      Map<String, String> parameters = new HashMap<>();
      parameters.put("a", "b");

      BidderTokenRequestConfiguration bidderTokenRequest =
              new BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
                      .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
                      .setParameters(parameters)
                      .build();

      BidderTokenLoader.loadBidderToken(
              this,
              bidderTokenRequest,
              new BidderTokenLoadListener() { /* ... */ }
      );
  }
  ```
  ||
  || **SDK 8** ||
  ||
  ```java
  void loadToken() {
      Map<String, String> parameters = new HashMap<>();
      parameters.put("a", "b");

      BidderTokenLoader bidderTokenLoader = new BidderTokenLoader(this);
      bidderTokenLoader.loadBidderToken(
              BidderTokenRequest.banner(BannerAdSize.inline(this, screenWidth), null, parameters),
              new BidderTokenLoadListener() { /* ... */ }
      );

      bidderTokenLoader.loadBidderToken(BidderTokenRequest.interstitial(),
              new BidderTokenLoadListener() { /* ... */ }
      );
  }
  ```
  ||
  |#

{% endlist %}

## Requirements

- **Gradle**: 7.0 or later
- **Android Gradle plugin**: 8.3.2 or later
- **Android SDK**: 21 (Android 5.0) or later
- **Kotlin**: 1.9.0 or later
- **Java**: 8 or later


