# Migration from 4.X to 5.X

<style>
  tr, td, th {
    text-align: left; 
    vertical-align: top;
    width: 50%;
  }
</style>

All code samples are provided in kotlin unless otherwise noted. The 5.X documentation is effective for v5.0.0. Refer to the main documentation for the most up-to-date information with the latest 5.X version.

## New Features for the 5.X Series

### Core SDK Required

The Chartboost Mediation 5.X series of SDKs introduces a new architecture centered around the Chartboost Core SDK. By moving the Mediation SDK’s consent duties to the Core SDK, the Mediation SDK is able to more rapidly keep pace with the evolving privacy and consent landscape.

Review the [Core SDK integration guide](/en/mediation/integrate/core/android/get-started/) for more information.

### Mediation API 

The public APIs have been audited so that there is better parity between all of the platforms.

- The fixed and adapter banner APIs have been merged into a singular API.
- The fullscreen ads API architecture has been updated to match that of the banner ads API.
- The old `Helium` moniker has been rebranded with `ChartboostMediation` to be consistent with the product’s marketing terms.


### Packages

| Mediation 4.X | Mediation 5.X |
|---------------|---------------|
| `com.chartboost.heliumsdk` | `com.chartboost.chartboostmediationsdk`|
| `com.chartboost.heliumsdk.ad` | `com.chartboost.chartboostmediationsdk.ad` |
| `com.chartboost.heliumsdk.domain` | `com.chartboost.chartboostmediationsdk.domain` |
| `com.chartboost.heliumsdk.network.model` | `com.chartboost.chartboostmediationsdk.network.model` |

### Classes

| Mediation 4.X | Mediation 5.X |
|---------------|---------------|
| `HeliumImpressionData` | `ChartboostMediationImpressionData` |
| `HeliumInitializationOptions` | `ChartboostMediationPreinitializationConfiguration` |
| `HeliumSdk` | `ChartboostMediationSdk` |
| `HeliumBannerAd` | `ChartboostMediationBannerAdView` |
| `HeliumBannerSize` | `ChartboostMediationBannerSize` |

### Interfaces

| Mediation 4.X | Mediation 5.X |
|---------------|---------------|
| `HeliumIlrdObserver` | `ChartboostMediationIlrdObserver` |
| `HeliumSdkListener` | <span style="color:red">Removed</span> |
| `HeliumBannerAdListener` | `ChartboostMediationBannerAdViewListener` |


## Integration

### SDK Initialization

Starting with Mediation SDK 5.0.0, the Mediation SDK can only be initialized by Chartboost Core SDK. This architectural change was made so that Core can manage the initialization sequences of the current Mediation SDK and future SDKs on the horizon.

Review the [Core SDK integration guide](/en/mediation/integrate/core/android/get-started/) for more information.


<ul class="tab" data-tab="12625292-22a6-4e47-b395-c809df5358f9" data-name="AndroidMigration4x5xIntegration">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="12625292-22a6-4e47-b395-c809df5358f9" data-name="AndroidMigration4x5xIntegration">
  
      <li class="active">
<div class="language-gradle highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">repositories</span> <span class="o">{</span>
  <span class="n">maven</span> <span class="o">{</span>
    <span class="n">name</span> <span class="s2">"Chartboost Mediation’s maven repo"</span>
    <span class="n">url</span> <span class="s2">"https://cboost.jfrog.io/artifactory/chartboost-mediation"</span>
  <span class="o">}</span>
<span class="o">}</span>
 
<span class="k">dependencies</span> <span class="o">{</span>
   <span class="n">implementation</span> <span class="s1">'com.chartboost:chartboost-mediation-sdk:4.0.0'</span>
<span class="o">}</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-gradle highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">repositories</span> <span class="o">{</span>
    <span class="n">maven</span> <span class="o">{</span>
      <span class="n">name</span> <span class="s2">"Chartboost Mediation's maven repo"</span>
      <span class="n">url</span> <span class="s2">"https://cboost.jfrog.io/artifactory/chartboost-mediation"</span>
    <span class="o">}</span>
    <span class="n">maven</span> <span class="o">{</span>
      <span class="n">name</span> <span class="s2">"Chartboost Core's maven repo"</span>
      <span class="n">url</span> <span class="s2">"https://cboost.jfrog.io/artifactory/chartboost-core"</span>
    <span class="o">}</span>
<span class="o">}</span>
 
<span class="k">dependencies</span> <span class="o">{</span>
    <span class="n">implementation</span><span class="o">(</span><span class="s2">"com.chartboost:chartboost-core-sdk:1.1.0"</span><span class="o">)</span>
    <span class="n">implementation</span><span class="o">(</span><span class="s2">"com.chartboost:chartboost-mediation-sdk:5.4.0"</span><span class="o">)</span>
<span class="o">}</span>
</code></pre></div></div>
</li>
  
</ul>


#### Network Killswitch

Since Mediation SDK initialization is now handled by the Core SDK, the network killswitch feature has been moved to the static method `ChartboostMediationSdk.setPreinitializationConfiguration()` that must be called before Core SDK initialization is initiated.


<ul class="tab" data-tab="6a7f2003-f418-4bbd-9d9e-19458a06aa2d" data-name="AndroidMigration4x5xNetworkKillswitch">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="6a7f2003-f418-4bbd-9d9e-19458a06aa2d" data-name="AndroidMigration4x5xNetworkKillswitch">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Create a listener</span>
 <span class="kd">val</span> <span class="py">heliumSdkListener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">HeliumSdk</span><span class="p">.</span><span class="nc">HeliumSdkListener</span> <span class="p">{</span> <span class="n">error</span> <span class="p">-&gt;</span> <span class="p">{</span>
    <span class="n">error</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span>
        <span class="nc">Log</span><span class="p">.</span><span class="nf">d</span><span class="p">(</span><span class="nc">TAG</span><span class="p">,</span> <span class="s">"Helium SDK failed to initialize. Reason: ${it.message}"</span><span class="p">)</span>
    <span class="p">}</span> <span class="o">?:</span> <span class="nf">run</span> <span class="p">{</span>
        <span class="c1">// SDK Initialized with no errors. </span>
        <span class="nc">Log</span><span class="p">.</span><span class="nf">d</span><span class="p">(</span><span class="nc">TAG</span><span class="p">,</span> <span class="s">"Helium SDK Initialized successfully"</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Put the partner id in this map for network kill switch</span>
<span class="kd">val</span> <span class="py">skippedPartnerIds</span> <span class="p">=</span> <span class="n">mutableSetOf</span><span class="p">&lt;</span><span class="nc">String</span><span class="p">&gt;()</span>
<span class="c1">// skippedPartnerIds.add("chartboost") // for example</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">start</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">myHeliumAppId</span><span class="p">,</span> <span class="n">myHeliumAppSignature</span><span class="p">,</span><span class="nc">HeliumInitializationOptions</span><span class="p">(</span><span class="n">skippedPartnerIds</span><span class="p">),</span> <span class="n">heliumSdkListener</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Prepare a set of partner IDs that should not be initialized</span>
<span class="nc">ChartboostMediationSdk</span><span class="p">.</span><span class="nf">setPreinitializationConfiguration</span><span class="p">(</span>
   <span class="nc">ChartboostMediationPreinitializationConfiguration</span><span class="p">(</span>
       <span class="n">skippedPartnerIds</span> <span class="p">=</span> <span class="nc">YOUR_SET_OF_PARTNER_IDS_TO_SKIP</span>
   <span class="p">),</span>
<span class="p">)</span>

<span class="c1">// Create a usercentrics module (or any other consent management platform module)</span>
<span class="kd">val</span> <span class="py">usercentrics</span> <span class="p">=</span> <span class="nc">UsercentricsAdapter</span><span class="p">()</span>

<span class="c1">// Create a module listener</span>
<span class="kd">val</span> <span class="py">listener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">ModuleObserver</span> <span class="p">{</span>
    <span class="k">override</span> <span class="k">fun</span> <span class="nf">onModuleInitializationCompleted</span><span class="p">(</span><span class="n">result</span><span class="p">:</span> <span class="nc">ModuleInitializationResult</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// Use this to action off of a specific module initialization</span>
        <span class="kd">val</span> <span class="py">moduleId</span> <span class="p">=</span> <span class="n">result</span><span class="p">.</span><span class="n">moduleId</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Make sure you're in a coroutine</span>
<span class="nc">CoroutineScope</span><span class="p">(</span><span class="nc">Main</span><span class="p">).</span><span class="nf">launch</span> <span class="p">{</span>
    <span class="c1">// Initialize ChartboostCore. You do not need to do anything additional besides providing the Chartboost app ID to initialize mediation.</span>
    <span class="nc">ChartboostCore</span><span class="p">.</span><span class="nf">initializeSdk</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="nc">SdkConfiguration</span><span class="p">(</span><span class="s">"[chartboost app id]"</span><span class="p">,</span> <span class="nf">listOf</span><span class="p">(</span><span class="n">usercentrics</span><span class="p">)),</span> <span class="n">listener</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
</ul>



### Consent

All privacy and consent related APIs have been removed from the Mediation 5.X SDK and will be handled by the Core SDK.

The Mediation SDK will continue to utilize the TCFv2 string as part of auction requests, and will forward consent changes to the partner adapters. For partners that utilize complex non-IAB compliant privacy and consent signals that cannot be extrapolated from Core SDK consent signals, last resort APIs will be exposed via that partner adapter’s `AdapterConfiguration` class and must be directly set on the adapter configuration.

For more information on supported Consent Mediation Platforms and their integration, review the [Core SDK integration guide](/en/mediation/integrate/core/android/get-started/).

#### HyprMX

```kotlin
// Set consent status directly on the adapter configuration
HyprMXAdapterConfiguration.setConsentStatusOverride(context, CONSENT_GIVEN)
```

#### Pangle

```kotlin
// Set consent status directly on the adapter configuration
PangleAdapterConfiguration.setGdprConsentOverride(consent) // this is an int
PangleAdapterConfiguration.setDoNotSellOverride(doNotSell) // this is an int
```

#### UnityAds

```kotlin
// Set consent status directly on the adapter configuration
UnityAdsAdapterConfiguration.setGdprConsentOverride(context, true)
UnityAdsAdapterConfiguration.setPrivacyConsentOverride(context, true)
```

#### Vungle

```kotlin
// Set consent status directly on the adapter configuration
VungleAdapterConfiguration.setGdprStatusOverride(true)
VungleAdapterConfiguration.setCcpaStatusOverride(true)
```

### Publisher Metadata

Publisher-specified data used to improve auction requests have been moved to the Core SDK, and will still be available to the Mediation 5.X auction requests.

| Mediation 4.X | Mediation 5.X |
|---------------|---------------|
| `Helium.userIdentifier` | `ChartboostCore.publisherMetadata.setPlayerIdentifier()` |
| `Helium.setGameEngineName(_, version:)` | `ChartboostCore.publisherMetadata.setFramework(name:, version:)` |
| `Helium.setSubjectToCoppa()` | `ChartboostCore.publisherMetadata.setIsUserUnderage()` |

### Adaptive Banner Ads

The changes to the adaptive banner ads APIs revolved around naming convention parity.

<ul class="tab" data-tab="4b060ff2-31c7-4f99-8430-c4c9f840946e" data-name="AndroidMigration4x5xAdaptiveBanner">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="4b060ff2-31c7-4f99-8430-c4c9f840946e" data-name="AndroidMigration4x5xAdaptiveBanner">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// To load an adaptive 6x1 ad (with width 300dp)</span>
<span class="n">heliumBannerAd</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="n">placement</span><span class="p">,</span> <span class="nc">HeliumBannerSize</span><span class="p">.</span><span class="nf">adaptive6x1</span><span class="p">(</span><span class="mi">300</span><span class="p">))</span>
    <span class="c1">// You can pass in another size or the old non-adaptive sizes such as HeliumBannerSize.STANDARD</span>

<span class="c1">// To listen for refreshes</span>
<span class="kd">val</span> <span class="py">listener</span><span class="p">:</span> <span class="nc">HeliumBannerAdListener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">HeliumBannerAdListener</span> <span class="p">{</span>
    <span class="k">fun</span> <span class="nf">onAdViewAdded</span><span class="p">(</span><span class="n">placementName</span><span class="p">:</span> <span class="nc">String</span><span class="p">,</span> <span class="n">child</span><span class="p">:</span> <span class="nc">View</span><span class="p">?)</span> <span class="p">{</span>
        <span class="c1">// notified that a view is added.</span>
    <span class="p">}</span>
    <span class="c1">// other callbacks didn't change</span>
<span class="p">}</span>
<span class="n">heliumBannerAd</span><span class="p">.</span><span class="n">heliumBannerAdListener</span> <span class="p">=</span> <span class="n">listener</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Make sure you're in a coroutine</span>
<span class="nc">CoroutineScope</span><span class="p">(</span><span class="nc">Main</span><span class="p">).</span><span class="nf">launch</span> <span class="p">{</span> <span class="o">..</span><span class="p">.</span>

<span class="c1">// Create a listener</span>
<span class="kd">val</span> <span class="py">listener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">ChartboostMediationBannerAdViewListener</span> <span class="p">{</span>
        <span class="k">override</span> <span class="k">fun</span> <span class="nf">onAdClicked</span><span class="p">(</span><span class="n">placement</span><span class="p">:</span> <span class="nc">String</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Fired when the banner is clicked</span>
        <span class="p">}</span>

        <span class="k">override</span> <span class="k">fun</span> <span class="nf">onAdImpressionRecorded</span><span class="p">(</span><span class="n">placement</span><span class="p">:</span> <span class="nc">String</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Fired when a banner impression has occurred</span>
        <span class="p">}</span>

        <span class="k">override</span> <span class="k">fun</span> <span class="nf">onAdViewAdded</span><span class="p">(</span>
            <span class="n">placement</span><span class="p">:</span> <span class="nc">String</span><span class="p">,</span>
            <span class="n">child</span><span class="p">:</span> <span class="nc">View</span><span class="p">?,</span>
        <span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Fired when a view has been added to the banner</span>
        <span class="p">}</span>
    <span class="p">}</span>

<span class="c1">// Create an adaptive banner ad instance. Here is an example adaptive 6x1</span>
<span class="kd">val</span> <span class="py">banner</span> <span class="p">=</span> <span class="nc">ChartboostMediationBannerAdView</span><span class="p">(</span>
        <span class="n">context</span><span class="p">,</span>
        <span class="s">"[placement]"</span><span class="p">,</span>
        <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nf">adaptive6x1</span><span class="p">(</span><span class="mi">300</span><span class="p">),</span>
        <span class="n">listener</span>
    <span class="p">)</span>

<span class="c1">// Load an adaptive banner ad. This variable has the load details.</span>
<span class="kd">val</span> <span class="py">adaptiveBannerResult</span> <span class="p">=</span> <span class="n">banner</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="nc">ChartboostMediationBannerAdLoadRequest</span><span class="p">(</span>
    <span class="s">"[placement]"</span><span class="p">,</span>
    <span class="n">keywords</span><span class="p">,</span>
    <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nf">adaptive6x1</span><span class="p">(</span><span class="mi">300</span><span class="p">)</span>
<span class="p">))</span>
</code></pre></div></div>
</li>
  
</ul>


### Resizing adaptive banners 

The changes to resizing adaptive banner ads APIs revolved around naming convention parity.

<ul class="tab" data-tab="db1e0c9e-98ff-4181-8c4b-ba3e89010a6a" data-name="AndroidMigration4x5xResizingAdaptiveBanner">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="db1e0c9e-98ff-4181-8c4b-ba3e89010a6a" data-name="AndroidMigration4x5xResizingAdaptiveBanner">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">density</span> <span class="p">=</span> <span class="n">context</span><span class="p">.</span><span class="n">resources</span><span class="p">.</span><span class="n">displayMetrics</span><span class="p">.</span><span class="n">density</span>
<span class="n">heliumBannerAd</span><span class="p">.</span><span class="n">layoutParams</span> <span class="p">=</span> <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">(</span>
                    <span class="mi">300</span> <span class="p">*</span> <span class="n">density</span><span class="p">,</span>
                    <span class="mi">50</span> <span class="p">*</span> <span class="n">density</span>
                <span class="p">)</span>
<span class="c1">// If you want this to be automatic, just use WRAP_CONTENT for</span>
<span class="c1">// both width and height.</span>
<span class="n">heliumBannerAd</span><span class="p">.</span><span class="n">layoutParams</span> <span class="p">=</span> <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">(</span>
                    <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">.</span><span class="nc">WRAP_CONTENT</span><span class="p">,</span>
                    <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">.</span><span class="nc">WRAP_CONTENT</span>
                <span class="p">)</span>
<span class="c1">// You can change this anytime. The next ad will use these sizes.</span>

<span class="c1">// To get the size of the currently showing creative, see:</span>
<span class="n">heliumBannerAd</span><span class="p">.</span><span class="nf">getCreativeSizeDips</span><span class="p">()</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">density</span> <span class="p">=</span> <span class="n">context</span><span class="p">.</span><span class="n">resources</span><span class="p">.</span><span class="n">displayMetrics</span><span class="p">.</span><span class="n">density</span>
<span class="n">chartboostMediationBannerAdView</span><span class="p">.</span><span class="n">layoutParams</span> <span class="p">=</span> <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">(</span>
                    <span class="mi">300</span> <span class="p">*</span> <span class="n">density</span><span class="p">,</span>
                    <span class="mi">50</span> <span class="p">*</span> <span class="n">density</span>
                <span class="p">)</span>
<span class="c1">// If you want this to be automatic, just use WRAP_CONTENT for</span>
<span class="c1">// both width and height.</span>
<span class="n">chartboostMediationBannerAdView</span><span class="p">.</span><span class="n">layoutParams</span> <span class="p">=</span> <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">(</span>
                    <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">.</span><span class="nc">WRAP_CONTENT</span><span class="p">,</span>
                    <span class="nc">ViewGroup</span><span class="p">.</span><span class="nc">LayoutParams</span><span class="p">.</span><span class="nc">WRAP_CONTENT</span>
                <span class="p">)</span>
<span class="c1">// You can change this anytime. The next ad will use these sizes.</span>

<span class="c1">// To get the size of the currently showing creative, see:</span>
<span class="n">chartboostMediationBannerAdView</span><span class="p">.</span><span class="nf">getCreativeSizeDips</span><span class="p">()</span>
</code></pre></div></div>
</li>
  
</ul>




### Fixed Banner Ads

The fixed banner APIs have been deprecated and removed. To create and load fixed banners in the 5.X series, use the new banner APIs with a fixed size.

<ul class="tab" data-tab="d6cdc285-406c-4066-b395-1b915fcf0583" data-name="migration4x5xFixedBanner">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="d6cdc285-406c-4066-b395-1b915fcf0583" data-name="migration4x5xFixedBanner">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
  The following Banner enum Sizes can be passed down:
  HeliumBannerAd.HeliumBannerSize.STANDARD
  HeliumBannerAd.HeliumBannerSize.MEDIUM
  HeliumBannerAd.HeliumBannerSize.LEADERBOARD
*/</span>
<span class="kd">val</span> <span class="py">bannerSize</span> <span class="p">=</span> <span class="nc">HeliumBannerAd</span><span class="p">.</span><span class="nc">HeliumBannerSize</span><span class="p">.</span><span class="nc">STANDARD</span>
<span class="kd">val</span> <span class="py">heliumBannerAd</span> <span class="p">=</span> <span class="n">new</span> <span class="nc">HeliumBannerAd</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">placementName</span><span class="p">,</span> <span class="n">bannerSize</span><span class="p">,</span> <span class="n">bannerListener</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Make sure you're in a coroutine</span>
<span class="nc">CoroutineScope</span><span class="p">(</span><span class="nc">Main</span><span class="p">).</span><span class="nf">launch</span> <span class="p">{</span>
<span class="o">..</span><span class="p">.</span>

<span class="c1">// Create a listener</span>
<span class="kd">val</span> <span class="py">listener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">ChartboostMediationBannerAdViewListener</span> <span class="p">{</span>
        <span class="k">override</span> <span class="k">fun</span> <span class="nf">onAdClicked</span><span class="p">(</span><span class="n">placement</span><span class="p">:</span> <span class="nc">String</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Fired when the banner is clicked</span>
        <span class="p">}</span>

        <span class="k">override</span> <span class="k">fun</span> <span class="nf">onAdImpressionRecorded</span><span class="p">(</span><span class="n">placement</span><span class="p">:</span> <span class="nc">String</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Fired when a banner impression has occurred</span>
        <span class="p">}</span>

        <span class="k">override</span> <span class="k">fun</span> <span class="nf">onAdViewAdded</span><span class="p">(</span>
            <span class="n">placement</span><span class="p">:</span> <span class="nc">String</span><span class="p">,</span>
            <span class="n">child</span><span class="p">:</span> <span class="nc">View</span><span class="p">?,</span>
        <span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Fired when a view has been added to the banner</span>
        <span class="p">}</span>
    <span class="p">}</span>

<span class="c1">// Create a standard banner ad instance</span>
<span class="kd">val</span> <span class="py">standardBanner</span> <span class="p">=</span> <span class="nc">ChartboostMediationBannerAdView</span><span class="p">(</span>
        <span class="n">context</span><span class="p">,</span>
        <span class="s">"[placement]"</span><span class="p">,</span>
        <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nc">STANDARD</span><span class="p">,</span>
        <span class="n">listener</span>
    <span class="p">)</span>
<span class="c1">// It is also possible to get it from the xml</span>
<span class="kd">val</span> <span class="py">standardBanner</span> <span class="p">=</span> <span class="n">activity</span><span class="p">.</span><span class="nf">findViewById</span><span class="p">(</span><span class="nc">R</span><span class="p">.</span><span class="n">id</span><span class="p">.</span><span class="n">standard_banner</span><span class="p">)</span> <span class="k">as</span> <span class="nc">ChartboostMediationBannerAdView</span>

<span class="c1">// Loading a standard banner. This variable has the load details.</span>
<span class="kd">val</span> <span class="py">bannerLoadResult</span> <span class="p">=</span> <span class="n">standardBanner</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="nc">ChartboostMediationBannerAdLoadRequest</span><span class="p">(</span>
    <span class="s">"[placement]"</span><span class="p">,</span>
    <span class="n">keywords</span><span class="p">,</span>
    <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nc">STANDARD</span>
<span class="p">))</span>

<span class="c1">// Create a medium rectangle banner ad instance</span>
<span class="kd">val</span> <span class="py">mediumRectagle</span> <span class="p">=</span> <span class="nc">ChartboostMediationBannerAdView</span><span class="p">(</span>
        <span class="n">context</span><span class="p">,</span>
        <span class="s">"[placement]"</span><span class="p">,</span>
        <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nc">MEDIUM</span><span class="p">,</span>
        <span class="n">listener</span>
    <span class="p">)</span>

<span class="c1">// Load a medium rectangle. This variable has the load details.</span>
<span class="kd">val</span> <span class="py">mediumRectangleLoadResult</span> <span class="p">=</span> <span class="n">mediumRectagle</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="nc">ChartboostMediationBannerAdLoadRequest</span><span class="p">(</span>
    <span class="s">"[placement]"</span><span class="p">,</span>
    <span class="n">keywords</span><span class="p">,</span>
    <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nc">MEDIUM</span>
<span class="p">))</span>

<span class="c1">// Create a leaderboard ad instance</span>
<span class="kd">val</span> <span class="py">leaderboard</span> <span class="p">=</span> <span class="nc">ChartboostMediationBannerAdView</span><span class="p">(</span>
        <span class="n">context</span><span class="p">,</span>
        <span class="s">"[placement]"</span><span class="p">,</span>
        <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nc">LEADERBOARD</span><span class="p">,</span>
        <span class="n">listener</span>
    <span class="p">)</span>

<span class="c1">// Load a leaderboard ad. This variable has the load details.</span>
<span class="kd">val</span> <span class="py">leaderboardResult</span> <span class="p">=</span> <span class="n">leaderboard</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="nc">ChartboostMediationBannerAdLoadRequest</span><span class="p">(</span>
    <span class="s">"[placement]"</span><span class="p">,</span>
    <span class="n">keywords</span><span class="p">,</span>
    <span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nc">ChartboostMediationBannerSize</span><span class="p">.</span><span class="nc">LEADERBOARD</span>
<span class="p">))</span>
</code></pre></div></div>
</li>
  
</ul>


### Fullscreen Ads

The changes to the fullscreen ads APIs revolved around naming convention parity and architectural alignment with the banner ads APIs.

<ul class="tab" data-tab="fc27caea-b588-42ea-bdbb-9c203fbd8c16" data-name="migration4x5xFullscreen">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="fc27caea-b588-42ea-bdbb-9c203fbd8c16" data-name="migration4x5xFullscreen">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Interstitial Ads</span>
<span class="kd">val</span> <span class="py">interstitialRequest</span> <span class="p">=</span>   
    <span class="nc">ChartboostMediationAdLoadRequest</span><span class="p">(</span>
        <span class="n">placementName</span> <span class="p">=</span> <span class="s">"YOUR_INTERSTITIAL_MEDIATION_PLACEMENT"</span><span class="p">,</span>
        <span class="n">keywords</span> <span class="p">=</span> <span class="c1">// Construct your keywords</span>
    <span class="p">)</span>

<span class="c1">// Rewarded Ads</span>
<span class="kd">val</span> <span class="py">rewardedRequest</span> <span class="p">=</span>   
    <span class="nc">ChartboostMediationAdLoadRequest</span><span class="p">(</span>
        <span class="n">placementName</span> <span class="p">=</span> <span class="s">"YOUR_REWARDED_MEDIATION_PLACEMENT"</span><span class="p">,</span>
        <span class="n">keywords</span> <span class="p">=</span> <span class="c1">// Construct your keywords</span>
    <span class="p">)</span>

<span class="c1">// Load the fullscreen ad</span>
<span class="kd">val</span> <span class="py">result</span> <span class="p">=</span>
    <span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">loadFullscreenAd</span><span class="p">(</span>
        <span class="n">context</span><span class="p">,</span>
        <span class="n">interstitialRequest</span><span class="p">,</span> <span class="c1">// or rewardedRequest</span>
        <span class="n">chartboostMediationFullscreenAdListener</span><span class="p">,</span>
    <span class="p">)</span>

<span class="c1">// Handle the ad load result</span>
<span class="n">result</span><span class="p">.</span><span class="n">ad</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span> <span class="n">ad</span> <span class="p">-&gt;</span>
    <span class="c1">// Success. Show the ad.</span>
    <span class="nc">CoroutineScope</span><span class="p">(</span><span class="nc">Main</span><span class="p">).</span><span class="nf">launch</span> <span class="p">{</span>
        <span class="n">ad</span><span class="p">.</span><span class="nf">show</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span> <span class="o">?:</span> <span class="nf">run</span> <span class="p">{</span>
    <span class="c1">// Failure</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Make sure you're in a coroutine</span>
<span class="nc">CoroutineScope</span><span class="p">(</span><span class="nc">Main</span><span class="p">).</span><span class="nf">launch</span> <span class="p">{</span>

<span class="c1">// Interstitial Ads</span>
<span class="kd">val</span> <span class="py">interstitialRequest</span> <span class="p">=</span>
   <span class="nc">ChartboostMediationFullscreenAdLoadRequest</span><span class="p">(</span>
       <span class="n">placement</span> <span class="p">=</span> <span class="s">"YOUR_INTERSTITIAL_MEDIATION_PLACEMENT"</span><span class="p">,</span>
       <span class="n">keywords</span> <span class="p">=</span> <span class="nc">Keywords</span><span class="p">()</span>
   <span class="p">)</span>

<span class="c1">// Rewarded Ads</span>
<span class="kd">val</span> <span class="py">rewardedRequest</span> <span class="p">=</span>
   <span class="nc">ChartboostMediationFullscreenAdLoadRequest</span><span class="p">(</span>
       <span class="n">placement</span> <span class="p">=</span> <span class="s">"YOUR_REWARDED_MEDIATION_PLACEMENT"</span><span class="p">,</span>
       <span class="n">keywords</span> <span class="p">=</span> <span class="nc">Keywords</span><span class="p">()</span>
   <span class="p">)</span>

<span class="c1">// Load the fullscreen ad</span>
<span class="kd">val</span> <span class="py">result</span> <span class="p">=</span>
   <span class="nc">ChartboostMediationFullscreenAd</span><span class="p">.</span><span class="nf">loadFullscreenAd</span><span class="p">(</span>
       <span class="n">context</span><span class="p">,</span>
       <span class="n">interstitialRequest</span><span class="p">,</span> <span class="c1">// or rewardedRequest</span>
       <span class="n">chartboostMediationFullscreenAdListener</span><span class="p">,</span>
   <span class="p">)</span>

<span class="c1">// Handle the ad load result</span>
<span class="n">result</span><span class="p">.</span><span class="n">ad</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span> <span class="n">ad</span> <span class="p">-&gt;</span>
    <span class="c1">// Success. Show the ad.</span>
    <span class="n">ad</span><span class="p">.</span><span class="nf">show</span><span class="p">(</span><span class="n">activity</span><span class="p">)</span>
<span class="p">}</span> <span class="o">?:</span> <span class="nf">run</span> <span class="p">{</span>
    <span class="c1">// Failure</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
</ul>


### Discarding Oversized Ads

The changes to the discarding oversized ads revolved around naming convention parity.

<ul class="tab" data-tab="a02b9488-6f68-463d-82f4-df00924c7fd4" data-name="AndroidMigration4x5xDiscardOversizedAds">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="a02b9488-6f68-463d-82f4-df00924c7fd4" data-name="AndroidMigration4x5xDiscardOversizedAds">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// To drop oversized ads</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setShouldDiscardOversizedAds</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>

<span class="c1">// To allow oversized ads</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setShouldDiscardOversizedAds</span><span class="p">(</span><span class="k">false</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// To drop oversized ads</span>
<span class="nc">ChartboostMediationSdk</span><span class="p">.</span><span class="nf">setShouldDiscardOversizedAds</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>

<span class="c1">// To allow oversized ads</span>
<span class="nc">ChartboostMediationSdk</span><span class="p">.</span><span class="nf">setShouldDiscardOversizedAds</span><span class="p">(</span><span class="k">false</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
</ul>


### Clearing Loaded Ads

The changes to clearing loaded ads revolved around naming convention parity and architectural alignment with the banner ads APIs.

<ul class="tab" data-tab="2fec45e8-cb32-4b90-b8a3-90c62b112fd3" data-name="AndroidMigration4x5xClearingLoadedAds">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="2fec45e8-cb32-4b90-b8a3-90c62b112fd3" data-name="AndroidMigration4x5xClearingLoadedAds">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">heliumInterstitialAd</span><span class="p">.</span><span class="nf">clearLoaded</span><span class="p">()</span>
<span class="n">heliumRewardedAd</span><span class="p">.</span><span class="nf">clearLoaded</span><span class="p">()</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">ChartboostMediationFullscreenAd</span><span class="p">.</span><span class="nf">invalidate</span><span class="p">()</span>
<span class="nc">ChartboostMediationBannerAdView</span><span class="p">.</span><span class="nf">clearAd</span><span class="p">()</span>
</code></pre></div></div>
</li>
  
</ul>


### Releasing Ads

The changes to releasing ads revolved around naming convention parity and architectural alignment with the banner ads APIs.

<ul class="tab" data-tab="59acbef5-19a1-402d-8f7c-1376fb6d788d" data-name="AndroidMigration4x5xClearingLoadedAds">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="59acbef5-19a1-402d-8f7c-1376fb6d788d" data-name="AndroidMigration4x5xClearingLoadedAds">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">override</span> <span class="k">fun</span> <span class="nf">onDestroy</span><span class="p">()</span> <span class="p">{</span>
  <span class="o">..</span><span class="p">.</span>
  <span class="c1">// Release interstitial ad</span>
  <span class="n">heliumInterstitialAd</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span>
      <span class="n">it</span><span class="p">.</span><span class="nf">destroy</span><span class="p">();</span>
      <span class="nc">Log</span><span class="p">(</span><span class="s">"destroyed an existing interstitial"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="c1">// Release rewarded ad</span>
  <span class="n">heliumRewardedAd</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span>
      <span class="n">it</span><span class="p">.</span><span class="nf">destroy</span><span class="p">();</span>
      <span class="nc">Log</span><span class="p">(</span><span class="s">"destroyed an existing rewarded"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="c1">// Release banner ad</span>
  <span class="n">heliumBannerAd</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span>
      <span class="n">it</span><span class="p">.</span><span class="nf">destroy</span><span class="p">();</span>
      <span class="nc">Log</span><span class="p">(</span><span class="s">"destroyed an existing banner"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="o">..</span><span class="p">.</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">override</span> <span class="k">fun</span> <span class="nf">onDestroy</span><span class="p">()</span> <span class="p">{</span>
  <span class="o">..</span><span class="p">.</span>
  <span class="c1">// Release banner ad</span>
  <span class="n">chartboostMediationBannerAdView</span><span class="o">?.</span><span class="nf">let</span> <span class="p">{</span>
      <span class="n">it</span><span class="p">.</span><span class="nf">destroy</span><span class="p">();</span>
      <span class="nc">Log</span><span class="p">(</span><span class="s">"destroyed an existing banner"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="o">..</span><span class="p">.</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
</ul>



## Winning Bid Information

The keys used to retrieve information from the dictionary have been normalized to use underscores instead of hyphens.

| Mediation 4.X | Mediation 5.X |
|---------------|---------------|
| `auction-id` | `auction_id` |
| `partner-id` | `partner_id` |
| `price` | `price` |
| `line_item_id` | `line_item_id` |
| `line_item_name` | `line_item_name` |


## Configure Mediation

### Test Mode

The changes to test mode revolved around naming convention parity.

<ul class="tab" data-tab="571eb513-cace-4d5f-9b04-40e83fac1bd3" data-name="AndroidMigration4x5xTestMode">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="571eb513-cace-4d5f-9b04-40e83fac1bd3" data-name="AndroidMigration4x5xTestMode">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setTestMode</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setTestMode</span><span class="p">(</span><span class="k">false</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">ChartboostMediationSdk</span><span class="p">.</span><span class="nf">setTestMode</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="k">true</span><span class="p">)</span>
<span class="nc">ChartboostMediationSdk</span><span class="p">.</span><span class="nf">setTestMode</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="k">false</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
</ul>


### Privacy Methods

All privacy methods have been removed from 5.X and migrated to Chartboost Core SDK.

<ul class="tab" data-tab="10698a9f-18ce-4a6c-9dc3-30f83d9a3093" data-name="AndroidMigration4x5xPrivacyMethods">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="10698a9f-18ce-4a6c-9dc3-30f83d9a3093" data-name="AndroidMigration4x5xPrivacyMethods">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// COPPA</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setSubjectToCoppa</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
<span class="c1">// or</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setSubjectToCoppa</span><span class="p">(</span><span class="k">false</span><span class="p">)</span>

<span class="c1">//- By sending `setSubjectToCoppa(true)`, you indicate that you want your content treated as child-directed for purposes of COPPA. We will take steps to disable interest-based advertising for such ad requests.</span>
<span class="c1">//- By sending `setSubjectToCoppa(false)`, you indicate that you don't want your content treated as child-directed for purposes of COPPA. You represent and warrant that your applications and services are not directed towards children and that you will not provide any information to Mediation from a user under the age of 13.</span>

<span class="c1">// GDPR</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setSubjectToGDPR</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
<span class="c1">// or</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setSubjectToGDPR</span><span class="p">(</span><span class="k">false</span><span class="p">)</span>

<span class="c1">//- By sending `setSubjectToGDPR(true)`, you indicate that GDPR is applied to this user from your application.</span>
<span class="c1">//- By sending `setSubjectToGDPR(false)`, you indicate that GDPR is not applied to this user from your application.</span>

<span class="c1">// User Given Consent</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setUserHasGivenConsent</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
<span class="c1">// or</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setUserHasGivenConsent</span><span class="p">(</span><span class="k">false</span><span class="p">)</span>

<span class="c1">//- By sending `setUserHasGivenConsent(true)`, you indicate that this user from your application has given consent to share personal data for behavior-targeted advertising.</span>
<span class="c1">//- By sending `setUserHasGivenConsent(false)`, you indicate that this user from your application has not given consent to use its personal data for behavior-targeted advertising, so only contextual advertising is allowed.</span>

<span class="c1">// CCPA</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setCCPAConsent</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
<span class="c1">// or</span>
<span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setCCPAConsent</span><span class="p">(</span><span class="k">false</span><span class="p">)</span>

<span class="c1">//- By sending `setCCPAConsent(true)`, you indicate that this user from your application has given consent to share personal data for behavior-targeted advertising under CCPA regulation.</span>
<span class="c1">//- By sending `setCCPAConsent(false)`, you indicate that this user from your application has not given consent to allow sharing personal data for behavior-targeted advertising under CCPA regulation.</span>
</code></pre></div></div>
</li>
  
</ul>


### Keywords

The changes keywords revolved around naming convention parity and architectural alignment with the banner ads APIs.

<ul class="tab" data-tab="07b3d3fc-5f28-4279-bd6b-cdf5c78481e0" data-name="AndroidMigration4x5xKeywords">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="07b3d3fc-5f28-4279-bd6b-cdf5c78481e0" data-name="AndroidMigration4x5xKeywords">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Set Keywords</span>
<span class="kd">val</span> <span class="py">interstitialAd</span> <span class="p">=</span> <span class="nc">HeliumInterstitialAd</span><span class="p">(</span><span class="n">placementName</span><span class="p">,</span> <span class="n">heliumInterstitialAdListener</span><span class="p">)</span>
  
<span class="kd">val</span> <span class="py">rewardedAd</span> <span class="p">=</span> <span class="nc">HeliumRewardedAd</span><span class="p">(</span><span class="n">placementName</span><span class="p">,</span> <span class="n">heliumRewardedAdListener</span><span class="p">)</span>
  
<span class="kd">val</span> <span class="py">bannerAd</span> <span class="p">=</span> <span class="nc">HeliumBannerAd</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">placementName</span><span class="p">,</span> <span class="n">bannerSize</span><span class="p">,</span> <span class="n">heliumBannerAdListener</span><span class="p">)</span>
  
<span class="n">interstitialAd</span><span class="p">.</span><span class="n">keywords</span><span class="p">[</span><span class="s">"i12_keyword1"</span><span class="p">]</span> <span class="p">=</span> <span class="s">"i12_value1"</span>
  
<span class="n">rewardedAd</span><span class="p">.</span><span class="n">keywords</span><span class="p">[</span><span class="s">"rwd_keyword1"</span><span class="p">]</span> <span class="p">=</span> <span class="s">"rwd_value1"</span>
  
<span class="n">bannerAd</span><span class="p">.</span><span class="n">keywords</span><span class="p">[</span><span class="s">"bnr_keyword1"</span><span class="p">]</span> <span class="p">=</span> <span class="s">"bnr_value1"</span>


<span class="c1">// Remove Keywords</span>
<span class="n">interstitialAd</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="s">"i12_keyword1"</span><span class="p">)</span>
<span class="n">rewardedAd</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="s">"rwd_keyword1"</span><span class="p">)</span>
<span class="n">bannerAd</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="s">"bnr_keyword1"</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// ChartboostMediationFullscreenAd</span>
<span class="c1">// Adding Keywords to the Keywords object</span>
<span class="kd">val</span> <span class="py">keywords</span> <span class="p">=</span> <span class="nc">Keywords</span><span class="p">()</span>
<span class="n">keywords</span><span class="p">[</span><span class="s">"keyword1"</span><span class="p">]</span> <span class="p">=</span> <span class="s">"value1"</span>

<span class="c1">// Removing Keywords.</span>
<span class="n">keywords</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="s">"keyword1"</span><span class="p">)</span>

<span class="c1">// Passing keywords to the fullscreen load request.</span>
<span class="kd">val</span> <span class="py">request</span> <span class="p">=</span> <span class="nc">ChartboostMediationFullscreenAdLoadRequest</span><span class="p">(</span>
    <span class="n">placement</span> <span class="p">=</span> <span class="s">"placement"</span><span class="p">,</span>
    <span class="n">keywords</span> <span class="p">=</span> <span class="n">keywords</span><span class="p">,</span>
<span class="p">)</span>

<span class="c1">// Make sure you're in a coroutine</span>
<span class="kd">val</span> <span class="py">result</span> <span class="p">=</span>
    <span class="nc">ChartboostMediationFullscreenAd</span><span class="p">.</span><span class="nf">loadFullscreenAd</span><span class="p">(</span>
        <span class="n">context</span><span class="p">,</span>
        <span class="n">request</span><span class="p">,</span>
        <span class="n">listener</span><span class="p">,</span>
    <span class="p">)</span>

<span class="c1">// Adding Keywords from the ad result.</span>
<span class="n">result</span><span class="p">.</span><span class="n">ad</span><span class="o">?.</span><span class="n">request</span><span class="o">?.</span><span class="n">keywords</span><span class="o">?.</span><span class="k">set</span><span class="p">(</span><span class="s">"keyword1"</span><span class="p">,</span> <span class="s">"value1"</span><span class="p">)</span>

<span class="c1">// Removing Keywords from the ad result.</span>
<span class="n">result</span><span class="p">.</span><span class="n">ad</span><span class="o">?.</span><span class="n">request</span><span class="o">?.</span><span class="n">keywords</span><span class="o">?.</span><span class="nf">remove</span><span class="p">(</span><span class="s">"keyword1"</span><span class="p">)</span>


<span class="c1">// Banners</span>
<span class="c1">// Adding Keywords to the Keywords object.</span>
<span class="kd">val</span> <span class="py">keywords</span> <span class="p">=</span> <span class="nc">Keywords</span><span class="p">()</span>
<span class="n">keywords</span><span class="p">[</span><span class="s">"banner1"</span><span class="p">]</span> <span class="p">=</span> <span class="s">"value1"</span>

<span class="kd">val</span> <span class="py">bannerRequest</span> <span class="p">=</span> <span class="nc">ChartboostMediationBannerAdLoadRequest</span><span class="p">(</span>
    <span class="s">"placement"</span><span class="p">,</span>
    <span class="n">keywords</span><span class="p">,</span>
    <span class="n">bannerSize</span><span class="p">,</span>
<span class="p">)</span>

<span class="c1">// Adding Keywords to banner request.</span>
<span class="n">bannerRequest</span><span class="p">.</span><span class="n">keywords</span><span class="p">[</span><span class="s">"banner2"</span><span class="p">]</span> <span class="p">=</span> <span class="s">"value2"</span>

<span class="c1">// Removing Keywords</span>
<span class="kd">val</span> <span class="py">bannerAdView</span> <span class="p">=</span> <span class="nc">ChartboostMediationBannerAdView</span><span class="p">(</span>
    <span class="n">context</span><span class="p">,</span>
    <span class="s">"placement"</span><span class="p">,</span>
    <span class="n">size</span><span class="p">,</span>
    <span class="n">listener</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1">// Removing a keyword from the banner ad view</span>
<span class="n">bannerAdView</span><span class="p">.</span><span class="n">keywords</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="s">"key1"</span><span class="p">)</span>

<span class="c1">// It is also possible to remove the keyword from the banner load request</span>
<span class="kd">val</span> <span class="py">keywords</span> <span class="p">=</span> <span class="nc">Keywords</span><span class="p">()</span>
<span class="n">keywords</span><span class="p">[</span><span class="s">"key1"</span><span class="p">]</span> <span class="p">=</span> <span class="s">"value1"</span>
<span class="n">keywords</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="s">"key1"</span><span class="p">)</span>
<span class="kd">val</span> <span class="py">loadRequest</span> <span class="p">=</span> <span class="nc">ChartboostMediationBannerAdLoadRequest</span><span class="p">(</span><span class="s">"placement"</span><span class="p">,</span> <span class="n">keywords</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="c1">// Can then load the banner with the keywords</span>
<span class="n">bannerAdView</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="n">loadRequest</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
</ul>




### Setting User Identifier

The user identifier property is now configured with the [Chartboost Core SDK](/en/mediation/integrate/core/android/).

<ul class="tab" data-tab="86a5878d-643d-4d03-b9a0-36d214c6a6ad" data-name="AndroidMigration4x5xSettingUserIdentifier">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="86a5878d-643d-4d03-b9a0-36d214c6a6ad" data-name="AndroidMigration4x5xSettingUserIdentifier">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">setUserIdentifier</span><span class="p">(</span><span class="s">"user"</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">ChartboostCore</span><span class="p">.</span><span class="n">publisherMetadata</span><span class="p">.</span><span class="nf">setPlayerIdentifier</span><span class="p">(</span><span class="s">"player_id"</span><span class="p">)</span>
</code></pre></div></div>
</li>
  
</ul>


### Setting Custom Data

The custom data is now set as a property with naming changes to align with the banner ads APIs.

<ul class="tab" data-tab="33e0fbe3-4e25-4c41-a3fd-437d82630ff3" data-name="AndroidMigration4x5xSettingCustomData">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="33e0fbe3-4e25-4c41-a3fd-437d82630ff3" data-name="AndroidMigration4x5xSettingCustomData">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">rewardedAd</span><span class="p">:</span> <span class="nc">HeliumRewardedAd</span> <span class="p">=</span> <span class="c1">// create your HeliumRewardedAd</span>

<span class="c1">// load ad</span>

<span class="kd">val</span> <span class="py">base64EncodedCustomData</span> <span class="p">=</span> <span class="s">"Y3VzdG9tIGRhdGE="</span>
<span class="n">rewarded</span><span class="p">.</span><span class="n">customData</span> <span class="p">=</span> <span class="n">base64EncodedCustomData</span>
<span class="c1">// show ad</span>
</code></pre></div></div>
</li>
  
</ul>


### Implementation

The changes to implementation revolved around naming convention parity.

<ul class="tab" data-tab="8de4a8a4-e48c-41a1-ae24-2f37fbabfb3e" data-name="AndroidMigration4x5xImplementation">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="8de4a8a4-e48c-41a1-ae24-2f37fbabfb3e" data-name="AndroidMigration4x5xImplementation">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">ilrdObserver</span> <span class="p">=</span> <span class="k">object</span><span class="p">:</span> <span class="nc">HeliumIlrdObserver</span> <span class="p">{</span>
  <span class="k">override</span> <span class="k">fun</span> <span class="nf">onImpression</span><span class="p">(</span><span class="n">impData</span><span class="p">:</span> <span class="nc">HeliumImpressionData</span><span class="p">)</span> <span class="p">{</span>
      <span class="c1">// Placement name</span>
      <span class="kd">val</span> <span class="py">placement</span> <span class="p">=</span> <span class="n">impData</span><span class="p">.</span><span class="n">placementId</span>
      <span class="c1">// JSON</span>
      <span class="kd">val</span> <span class="py">json</span> <span class="p">=</span> <span class="n">impData</span><span class="p">.</span><span class="n">ilrdInfo</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="k">override</span> <span class="k">fun</span> <span class="nf">onCreate</span><span class="p">(</span><span class="n">savedInstanceState</span><span class="p">:</span> <span class="nc">Bundle</span><span class="p">?)</span> <span class="p">{</span>
  <span class="o">..</span><span class="p">.</span>
  <span class="c1">// Subscribe to ILRD on app startup, e.g. in onCreate()</span>
  <span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">subscribeIlrd</span><span class="p">(</span><span class="n">ilrdObserver</span><span class="p">)</span>
  <span class="o">..</span><span class="p">.</span>
<span class="p">}</span>

<span class="k">override</span> <span class="k">fun</span> <span class="nf">onDestroy</span><span class="p">()</span> <span class="p">{</span>
  <span class="o">..</span><span class="p">.</span>
  <span class="c1">// Unsubscribe from ILRD on app terminations, e.g. in onDestroy()</span>
  <span class="nc">HeliumSdk</span><span class="p">.</span><span class="nf">unsubscribeIlrd</span><span class="p">(</span><span class="n">ilrdObserver</span><span class="p">)</span>
  <span class="o">..</span><span class="p">.</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">chartboostMediationIlrdObserver</span> <span class="p">=</span> <span class="k">object</span><span class="p">:</span> <span class="nc">ChartboostMediationIlrdObserver</span> <span class="p">{</span>
  <span class="k">override</span> <span class="k">fun</span> <span class="nf">onImpression</span><span class="p">(</span><span class="n">impData</span><span class="p">:</span> <span class="nc">ChartboostMediationImpressionData</span><span class="p">)</span> <span class="p">{</span>
      <span class="c1">// Placement name</span>
      <span class="kd">val</span> <span class="py">placement</span> <span class="p">=</span> <span class="n">impData</span><span class="p">.</span><span class="n">placementId</span>
      <span class="c1">// JSON</span>
      <span class="kd">val</span> <span class="py">json</span> <span class="p">=</span> <span class="n">impData</span><span class="p">.</span><span class="n">ilrdInfo</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="k">override</span> <span class="k">fun</span> <span class="nf">onCreate</span><span class="p">(</span><span class="n">savedInstanceState</span><span class="p">:</span> <span class="nc">Bundle</span><span class="p">?)</span> <span class="p">{</span>
  <span class="o">..</span><span class="p">.</span>
  <span class="c1">// Subscribe to ILRD on app startup, e.g. in onCreate()</span>
  <span class="nc">ChartboostMediationSdk</span><span class="p">.</span><span class="nf">subscribeIlrd</span><span class="p">(</span><span class="n">chartboostMediationIlrdObserver</span><span class="p">)</span>
  <span class="o">..</span><span class="p">.</span>
<span class="p">}</span>

<span class="k">override</span> <span class="k">fun</span> <span class="nf">onDestroy</span><span class="p">()</span> <span class="p">{</span>
  <span class="o">..</span><span class="p">.</span>
  <span class="c1">// Unsubscribe from ILRD on app terminations, e.g. in onDestroy()</span>
  <span class="nc">ChartboostMediationSdk</span><span class="p">.</span><span class="nf">unsubscribeIlrd</span><span class="p">(</span><span class="n">chartboostMediationIlrdObserver</span><span class="p">)</span>
  <span class="o">..</span><span class="p">.</span>
<span class="p">}</span>
</code></pre></div></div>
</li>
  
</ul>



## Listener Usage

The changes to the listener usage revolved around naming convention parity.

<ul class="tab" data-tab="2501dfeb-48a5-4544-a713-c6b49860683f" data-name="AndroidMigration4x5xListenerUsage">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="2501dfeb-48a5-4544-a713-c6b49860683f" data-name="AndroidMigration4x5xListenerUsage">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// HeliumFullscreenAdListener</span>
<span class="kd">val</span> <span class="py">heliumFullscreenAdListener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">HeliumFullscreenAdListener</span>

<span class="c1">// HeliumBannerAdListener</span>
<span class="kd">val</span> <span class="py">heliumBannerAdListener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">HeliumBannerAdListener</span>
</code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// ChartboostMediationFullscreenAdListener</span>
<span class="kd">val</span> <span class="py">chartboostMediationFullscreenAdListener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">ChartboostMediationFullscreenAdListener</span>

<span class="c1">// ChartboostMediationBannerAdViewListener</span>
<span class="kd">val</span> <span class="py">chartboostMediationBannerAdViewListener</span> <span class="p">=</span> <span class="kd">object</span> <span class="err">: </span><span class="nc">ChartboostMediationBannerAdViewListener</span>
</code></pre></div></div>
</li>
  
</ul>


## Error Codes

5.X will continue to use codes from 4.X with minor changes in the descriptions. Any new error codes introduced in 5.X will follow the same naming convention.

## Proguard and R8

All consent handling and Mediation initialization will be done by the [core SDK](/en/mediation/integrate/core/android/get-started/). In addition, 5.x will use the Mediation branding. 

<ul class="tab" data-tab="3cfd73b1-987b-4158-81b4-cb2df34242f9" data-name="migration4x5xFullscreen">
  
      <li class="active">
          <a href="#">Mediation 4.X </a>
      </li>
  
      <li>
          <a href="#">Mediation 5.X </a>
      </li>
  
</ul>
<ul class="tab-content" id="3cfd73b1-987b-4158-81b4-cb2df34242f9" data-name="migration4x5xFullscreen">
  
      <li class="active">
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Chartboost Mediation SDK</span>
<span class="p">-</span><span class="n">keep</span> <span class="kd">class</span> <span class="err">com.chartboost.heliumsdk.** { *; }

// </span><span class="nc">Chartboost</span> <span class="nc">Mediation</span> <span class="nc">Adapters</span>
<span class="p">-</span><span class="n">keep</span> <span class="kd">class</span> <span class="err">com.chartboost.mediation.** { *; }

// </span><span class="nc">Keep</span> <span class="n">kotlinx</span><span class="p">.</span><span class="n">serialization</span> <span class="n">annotations</span>
<span class="p">-</span><span class="n">keepattributes</span> <span class="p">*</span><span class="nc">Annotation</span><span class="p">*</span>

<span class="c1">// Keep the names of kotlinx.serialization classes</span>
<span class="p">-</span><span class="n">keep</span><span class="p">,</span><span class="n">includedescriptorclasses</span> <span class="kd">class</span> <span class="err">kotlinx.serialization.** {
    *;
}

// </span><span class="nc">Keep</span> <span class="n">the</span> <span class="n">names</span> <span class="n">of</span> <span class="n">classes</span> <span class="n">with</span> <span class="nd">@Serializable</span> <span class="k">annotation</span>
<span class="p">-</span><span class="n">keep</span><span class="p">,</span><span class="n">includedescriptorclasses</span> <span class="err">@</span><span class="n">kotlinx</span><span class="p">.</span><span class="n">serialization</span><span class="p">.</span><span class="nc">Serializable</span> <span class="kd">class</span> <span class="err">* {
    *;
}

// </span><span class="nc">Keep</span> <span class="n">kotlinx</span><span class="p">.</span><span class="n">serialization</span> <span class="k">internal</span> <span class="n">implementation</span> <span class="n">classes</span>
<span class="p">-</span><span class="n">keepclassmembers</span> <span class="kd">class</span> <span class="err">kotlinx.serialization.internal.** {
    *;
}
</span></code></pre></div></div>
</li>
  
      <li>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Chartboost Mediation SDK</span>
<span class="p">-</span><span class="n">keep</span> <span class="kd">class</span> <span class="err">com.chartboost.chartboostmediationsdk.** { *; }

// </span><span class="nc">Chartboost</span> <span class="nc">Core</span> <span class="nc">SDK</span>
<span class="p">-</span><span class="n">keep</span> <span class="kd">class</span> <span class="err">com.chartboost.core.** { *; }

// </span><span class="nc">Chartboost</span> <span class="nc">Mediation</span> <span class="nc">Adapters</span>
<span class="p">-</span><span class="n">keep</span> <span class="kd">class</span> <span class="err">com.chartboost.mediation.** { *; }

// </span><span class="nc">Keep</span> <span class="n">kotlinx</span><span class="p">.</span><span class="n">serialization</span> <span class="n">annotations</span>
<span class="p">-</span><span class="n">keepattributes</span> <span class="p">*</span><span class="nc">Annotation</span><span class="p">*</span>

<span class="c1">// Keep the names of kotlinx.serialization classes</span>
<span class="p">-</span><span class="n">keep</span><span class="p">,</span><span class="n">includedescriptorclasses</span> <span class="kd">class</span> <span class="err">kotlinx.serialization.** {
    *;
}

// </span><span class="nc">Keep</span> <span class="n">the</span> <span class="n">names</span> <span class="n">of</span> <span class="n">classes</span> <span class="n">with</span> <span class="nd">@Serializable</span> <span class="k">annotation</span>
<span class="p">-</span><span class="n">keep</span><span class="p">,</span><span class="n">includedescriptorclasses</span> <span class="err">@</span><span class="n">kotlinx</span><span class="p">.</span><span class="n">serialization</span><span class="p">.</span><span class="nc">Serializable</span> <span class="kd">class</span> <span class="err">* {
    *;
}

// </span><span class="nc">Keep</span> <span class="n">kotlinx</span><span class="p">.</span><span class="n">serialization</span> <span class="k">internal</span> <span class="n">implementation</span> <span class="n">classes</span>
<span class="p">-</span><span class="n">keepclassmembers</span> <span class="kd">class</span> <span class="err">kotlinx.serialization.internal.** {
    *;
}
</span></code></pre></div></div>
</li>
  
</ul>


