diff --git a/ThirdPartyAdapters/ironsource/CHANGELOG.md b/ThirdPartyAdapters/ironsource/CHANGELOG.md index 944f0ef14..0f7ead5be 100644 --- a/ThirdPartyAdapters/ironsource/CHANGELOG.md +++ b/ThirdPartyAdapters/ironsource/CHANGELOG.md @@ -1,5 +1,8 @@ ## IronSource Android Mediation Adapter Changelog +#### Next Version +- Maps `AgeRestrictedTreatment` to IronSource's `is_child_directed` metadata. + #### Version 9.4.2.0 - Verified compatibility with ironSource SDK version 9.4.2. diff --git a/ThirdPartyAdapters/ironsource/build.gradle b/ThirdPartyAdapters/ironsource/build.gradle index 65d76997c..5b2de4a40 100644 --- a/ThirdPartyAdapters/ironsource/build.gradle +++ b/ThirdPartyAdapters/ironsource/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - kotlinVersion = '2.1.10' + kotlinVersion = '2.3.0' } repositories { google() diff --git a/ThirdPartyAdapters/ironsource/gradle.properties b/ThirdPartyAdapters/ironsource/gradle.properties index 709151edc..ceffa7888 100644 --- a/ThirdPartyAdapters/ironsource/gradle.properties +++ b/ThirdPartyAdapters/ironsource/gradle.properties @@ -1,3 +1,4 @@ android.useAndroidX=true android.enableJetifier=true org.gradle.jvmargs=-Xmx1g -Xms1g +android.jetifier.ignorelist=adquality-sdk diff --git a/ThirdPartyAdapters/ironsource/ironsource/build.gradle b/ThirdPartyAdapters/ironsource/ironsource/build.gradle index ed2caf321..3f3e02b56 100644 --- a/ThirdPartyAdapters/ironsource/ironsource/build.gradle +++ b/ThirdPartyAdapters/ironsource/ironsource/build.gradle @@ -125,14 +125,14 @@ dependencies { implementation 'androidx.annotation:annotation:1.5.0' // Check for a 'useNextGenGma' flag to use the next generation GMA SDK. if (project.hasProperty('useNextGenGma')) { - implementation 'com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk:1.0.1' + implementation 'com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk:1.1.0' } else { - implementation 'com.google.android.gms:play-services-ads:25.2.0' + implementation 'com.google.android.gms:play-services-ads:25.3.0' } testImplementation "org.jacoco:org.jacoco.core:$jacocoVersion" testImplementation 'junit:junit:4.13.2' - testImplementation 'org.jetbrains.kotlin:kotlin-stdlib:2.1.10' + testImplementation 'org.jetbrains.kotlin:kotlin-stdlib:2.3.0' testImplementation 'com.google.truth:truth:1.1.5' testImplementation 'androidx.test.ext:truth:1.6.0' testImplementation 'androidx.test:core:1.5.0' @@ -142,7 +142,7 @@ dependencies { testImplementation 'androidx.test.ext:junit:1.1.5' testImplementation 'org.mockito.kotlin:mockito-kotlin:5.1.0' testImplementation project(':adaptertestkit') - testImplementation 'org.jetbrains.kotlin:kotlin-test:2.1.10' + testImplementation 'org.jetbrains.kotlin:kotlin-test:2.3.0' } /** diff --git a/ThirdPartyAdapters/ironsource/ironsource/src/main/java/com/google/ads/mediation/ironsource/IronSourceMediationAdapter.java b/ThirdPartyAdapters/ironsource/ironsource/src/main/java/com/google/ads/mediation/ironsource/IronSourceMediationAdapter.java index 525b4aff2..9c39441b6 100644 --- a/ThirdPartyAdapters/ironsource/ironsource/src/main/java/com/google/ads/mediation/ironsource/IronSourceMediationAdapter.java +++ b/ThirdPartyAdapters/ironsource/ironsource/src/main/java/com/google/ads/mediation/ironsource/IronSourceMediationAdapter.java @@ -30,6 +30,7 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.AgeRestrictedTreatment; import com.google.android.gms.ads.MobileAds; import com.google.android.gms.ads.RequestConfiguration; import com.google.android.gms.ads.VersionInfo; @@ -382,7 +383,8 @@ private void configureIronSourcePrivacy() { RequestConfiguration requestConfiguration = MobileAds.getRequestConfiguration(); if (requestConfiguration.getTagForChildDirectedTreatment() == TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE - || requestConfiguration.getTagForUnderAgeOfConsent() == TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE) { + || requestConfiguration.getTagForUnderAgeOfConsent() == TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE + || requestConfiguration.getAgeRestrictedTreatment() == AgeRestrictedTreatment.CHILD) { LevelPlay.setMetaData("is_child_directed", "true"); } else if (requestConfiguration.getTagForChildDirectedTreatment() == TAG_FOR_CHILD_DIRECTED_TREATMENT_FALSE diff --git a/ThirdPartyAdapters/ironsource/ironsource/src/test/kotlin/com/google/ads/mediation/ironsource/IronSourceMediationAdapterTest.kt b/ThirdPartyAdapters/ironsource/ironsource/src/test/kotlin/com/google/ads/mediation/ironsource/IronSourceMediationAdapterTest.kt index dff5fee17..5168adcbe 100644 --- a/ThirdPartyAdapters/ironsource/ironsource/src/test/kotlin/com/google/ads/mediation/ironsource/IronSourceMediationAdapterTest.kt +++ b/ThirdPartyAdapters/ironsource/ironsource/src/test/kotlin/com/google/ads/mediation/ironsource/IronSourceMediationAdapterTest.kt @@ -32,6 +32,7 @@ import com.google.ads.mediation.ironsource.IronSourceMediationAdapter.IRONSOURCE import com.google.android.gms.ads.AdError import com.google.android.gms.ads.AdFormat import com.google.android.gms.ads.AdSize +import com.google.android.gms.ads.AgeRestrictedTreatment import com.google.android.gms.ads.MobileAds import com.google.android.gms.ads.RequestConfiguration import com.google.android.gms.ads.mediation.InitializationCompleteCallback @@ -96,6 +97,7 @@ class IronSourceMediationAdapterTest { RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED ) .setTagForUnderAgeOfConsent(RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED) + .setAgeRestrictedTreatment(AgeRestrictedTreatment.UNSPECIFIED) .build() MobileAds.setRequestConfiguration(requestConfiguration) adapter = IronSourceMediationAdapter(mediationUtils) @@ -279,6 +281,57 @@ class IronSourceMediationAdapterTest { mockStaticLevelPlay.close() } + @Test + fun initialize_withAgeRestrictedTreatmentChild_setsLevelPlayMetaDataToTrue() { + val requestConfiguration = + RequestConfiguration.Builder().setAgeRestrictedTreatment(AgeRestrictedTreatment.CHILD).build() + MobileAds.setRequestConfiguration(requestConfiguration) + val mockStaticLevelPlay = mockStatic(LevelPlay::class.java) + mockStatic(IronSourceAds::class.java).use { _ -> + val mediationConfiguration = + createMediationConfiguration( + AdFormat.BANNER, + serverParameters = bundleOf(KEY_APP_KEY to TEST_APP_ID_1), + ) + + adapter.initialize( + context, + mockInitializationCompleteCallback, + listOf(mediationConfiguration), + ) + + mockStaticLevelPlay.verify { LevelPlay.setMetaData("is_child_directed", "true") } + } + mockStaticLevelPlay.close() + } + + @Test + fun initialize_withAgeRestrictedTreatmentTeen_doesNotChangeLevelPlayMetaData() { + val requestConfiguration = + RequestConfiguration.Builder().setAgeRestrictedTreatment(AgeRestrictedTreatment.TEEN).build() + MobileAds.setRequestConfiguration(requestConfiguration) + val mockStaticLevelPlay = mockStatic(LevelPlay::class.java) + mockStatic(IronSourceAds::class.java).use { _ -> + val mediationConfiguration = + createMediationConfiguration( + AdFormat.BANNER, + serverParameters = bundleOf(KEY_APP_KEY to TEST_APP_ID_1), + ) + + adapter.initialize( + context, + mockInitializationCompleteCallback, + listOf(mediationConfiguration), + ) + + mockStaticLevelPlay.verify( + { LevelPlay.setMetaData(eq("is_child_directed"), any()) }, + never(), + ) + } + mockStaticLevelPlay.close() + } + @Test fun initialize_withMediationConfigurations_invokesOnInitializationSucceeded() { val mockStaticLevelPlay = mockStatic(LevelPlay::class.java)