Skip to content

Commit 0ad1258

Browse files
Mobile Ads Developer Relationscopybara-github
authored andcommitted
Filter age-restricted requests for Pangle SDK when new AgeRestrictedTreatment is set to CHILD.
PiperOrigin-RevId: 922333598
1 parent 60f2167 commit 0ad1258

5 files changed

Lines changed: 93 additions & 5 deletions

File tree

ThirdPartyAdapters/pangle/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
## Pangle Android Mediation Adapter Changelog
22

3+
#### Next Version
4+
- Filter age-restricted requests for Pangle SDK when new `AgeRestrictedTreatment` is set to `CHILD`.
5+
36
#### Version 8.0.0.5.0
47
- Verified compatibility with Pangle SDK version 8.0.0.5.
58

ThirdPartyAdapters/pangle/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
buildscript {
44
ext {
5-
kotlinVersion = '2.1.10'
5+
kotlinVersion = '2.3.0'
66
}
77
repositories {
88
google()

ThirdPartyAdapters/pangle/pangle/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ dependencies {
122122
implementation 'androidx.annotation:annotation:1.5.0'
123123
// Check for a 'useNextGenGma' flag to use the next generation GMA SDK.
124124
if (project.hasProperty('useNextGenGma')) {
125-
implementation 'com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk:1.0.1'
125+
implementation 'com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk:1.1.0'
126126
} else {
127-
implementation 'com.google.android.gms:play-services-ads:25.2.0'
127+
implementation 'com.google.android.gms:play-services-ads:25.3.0'
128128
}
129129

130130
testImplementation 'androidx.core:core-ktx:1.8.0'
@@ -135,7 +135,7 @@ dependencies {
135135
testImplementation "com.google.truth:truth:1.2.0"
136136
testImplementation 'junit:junit:4.13.2'
137137
testImplementation 'com.google.testparameterinjector:test-parameter-injector:1.18'
138-
testImplementation 'org.jetbrains.kotlin:kotlin-stdlib:2.1.10'
138+
testImplementation 'org.jetbrains.kotlin:kotlin-stdlib:2.3.0'
139139
testImplementation 'org.mockito.kotlin:mockito-kotlin:5.1.0'
140140
testImplementation 'org.robolectric:robolectric:4.14'
141141
}

ThirdPartyAdapters/pangle/pangle/src/main/java/com/google/ads/mediation/pangle/PangleConstants.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import androidx.annotation.IntDef;
1818
import androidx.annotation.NonNull;
1919
import com.google.android.gms.ads.AdError;
20+
import com.google.android.gms.ads.AgeRestrictedTreatment;
2021
import com.google.android.gms.ads.MobileAds;
2122
import com.google.android.gms.ads.RequestConfiguration;
2223
import java.lang.annotation.Retention;
@@ -94,7 +95,8 @@ public static boolean isChildUser() {
9495
return requestConfiguration.getTagForChildDirectedTreatment()
9596
== RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE
9697
|| requestConfiguration.getTagForUnderAgeOfConsent()
97-
== RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE;
98+
== RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE
99+
|| requestConfiguration.getAgeRestrictedTreatment() == AgeRestrictedTreatment.CHILD;
98100
}
99101

100102
/** A private constructor since this is a utility class which should not be instantiated. */

ThirdPartyAdapters/pangle/pangle/src/test/kotlin/com/google/ads/mediation/pangle/PangleMediationAdapterTest.kt

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import com.google.ads.mediation.pangle.utils.mockPangleSdkInitializationSuccess
2121
import com.google.android.gms.ads.AdError
2222
import com.google.android.gms.ads.AdFormat
2323
import com.google.android.gms.ads.AdSize
24+
import com.google.android.gms.ads.AgeRestrictedTreatment
25+
import com.google.android.gms.ads.MobileAds
26+
import com.google.android.gms.ads.RequestConfiguration
2427
import com.google.android.gms.ads.mediation.InitializationCompleteCallback
2528
import com.google.android.gms.ads.mediation.MediationAdLoadCallback
2629
import com.google.android.gms.ads.mediation.MediationAppOpenAd
@@ -104,6 +107,16 @@ class PangleMediationAdapterTest {
104107
// Resetting the PA Consent Information to their default value.
105108
PangleMediationAdapter.setPAConsent(PAGPAConsentType.PAG_PA_CONSENT_TYPE_CONSENT)
106109

110+
val requestConfiguration =
111+
RequestConfiguration.Builder()
112+
.setTagForChildDirectedTreatment(
113+
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED
114+
)
115+
.setTagForUnderAgeOfConsent(RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED)
116+
.setAgeRestrictedTreatment(AgeRestrictedTreatment.UNSPECIFIED)
117+
.build()
118+
MobileAds.setRequestConfiguration(requestConfiguration)
119+
107120
pangleMediationAdapter =
108121
PangleMediationAdapter(pangleInitializer, pangleSdkWrapper, pangleFactory)
109122
}
@@ -161,6 +174,32 @@ class PangleMediationAdapterTest {
161174
assertThat(error.domain).isEqualTo(PANGLE_SDK_ERROR_DOMAIN)
162175
}
163176

177+
@Test
178+
fun collectSignals_withAgeRestrictedTreatmentChild_callsOnFailure() {
179+
val requestConfiguration =
180+
RequestConfiguration.Builder()
181+
.setTagForChildDirectedTreatment(
182+
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED
183+
)
184+
.setTagForUnderAgeOfConsent(RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED)
185+
.setAgeRestrictedTreatment(AgeRestrictedTreatment.CHILD)
186+
.build()
187+
MobileAds.setRequestConfiguration(requestConfiguration)
188+
val signalCallbacks: SignalCallbacks = mock()
189+
190+
pangleMediationAdapter.collectSignals(
191+
RtbSignalData(context, emptyList(), bundleOf(), AdSize(1, 1)),
192+
signalCallbacks,
193+
)
194+
195+
val errorCaptor = argumentCaptor<AdError>()
196+
verify(signalCallbacks).onFailure(errorCaptor.capture())
197+
val error = errorCaptor.firstValue
198+
assertThat(error.code).isEqualTo(PangleConstants.ERROR_CHILD_USER)
199+
assertThat(error.domain).isEqualTo(PangleConstants.ERROR_DOMAIN)
200+
assertThat(error.message).isEqualTo(PangleConstants.ERROR_MSG_CHILD_USER)
201+
}
202+
164203
@Test
165204
fun initialize_ifAppIdsAreMissing_callsFailureCallback() {
166205
// Create server parameters without app ID.
@@ -220,6 +259,28 @@ class PangleMediationAdapterTest {
220259
verify(initializationCompleteCallback).onInitializationFailed(PANGLE_INIT_FAILURE_MESSAGE)
221260
}
222261

262+
@Test
263+
fun initialize_withAgeRestrictedTreatmentChild_callsFailureCallback() {
264+
val requestConfiguration =
265+
RequestConfiguration.Builder()
266+
.setTagForChildDirectedTreatment(
267+
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED
268+
)
269+
.setTagForUnderAgeOfConsent(RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED)
270+
.setAgeRestrictedTreatment(AgeRestrictedTreatment.CHILD)
271+
.build()
272+
MobileAds.setRequestConfiguration(requestConfiguration)
273+
274+
pangleMediationAdapter.initialize(
275+
context,
276+
initializationCompleteCallback,
277+
listOf(buildProperMediationConfig()),
278+
)
279+
280+
verify(initializationCompleteCallback)
281+
.onInitializationFailed(PangleConstants.ERROR_MSG_CHILD_USER)
282+
}
283+
223284
@Test
224285
fun getVersionInfo_ifAdapterVersionHasLessThanFourParts_returnsZeros() {
225286
// "3.1.4" is invalid because adapter version should contain at least four parts delimited by
@@ -285,6 +346,28 @@ class PangleMediationAdapterTest {
285346
verify(bannerAd).render(bannerAdConfig)
286347
}
287348

349+
@Test
350+
fun loadBannerAd_withAgeRestrictedTreatmentChild_callsOnFailure() {
351+
val requestConfiguration =
352+
RequestConfiguration.Builder()
353+
.setTagForChildDirectedTreatment(
354+
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED
355+
)
356+
.setTagForUnderAgeOfConsent(RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED)
357+
.setAgeRestrictedTreatment(AgeRestrictedTreatment.CHILD)
358+
.build()
359+
MobileAds.setRequestConfiguration(requestConfiguration)
360+
361+
pangleMediationAdapter.loadBannerAd(bannerAdConfig, bannerAdLoadCallback)
362+
363+
val errorCaptor = argumentCaptor<AdError>()
364+
verify(bannerAdLoadCallback).onFailure(errorCaptor.capture())
365+
val error = errorCaptor.firstValue
366+
assertThat(error.code).isEqualTo(PangleConstants.ERROR_CHILD_USER)
367+
assertThat(error.domain).isEqualTo(PangleConstants.ERROR_DOMAIN)
368+
assertThat(error.message).isEqualTo(PangleConstants.ERROR_MSG_CHILD_USER)
369+
}
370+
288371
@Test
289372
fun loadInterstitialAd_rendersInterstitialAd() {
290373
pangleMediationAdapter.loadInterstitialAd(interstitialAdConfig, interstitialAdLoadCallback)

0 commit comments

Comments
 (0)