Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions ThirdPartyAdapters/inmobi/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
## InMobi Android Mediation Adapter Changelog

#### Next Version
- Maps `AgeRestrictedTreatment` to InMobi's COPPA API.

#### Version 11.3.0.0
- Verified compatibility with InMobi Kotlin SDK version 11.3.0.

Expand Down
2 changes: 1 addition & 1 deletion ThirdPartyAdapters/inmobi/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

buildscript {
ext {
kotlinVersion = '2.1.10'
kotlinVersion = '2.3.0'
}
repositories {
google()
Expand Down
8 changes: 4 additions & 4 deletions ThirdPartyAdapters/inmobi/inmobi/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,9 @@ dependencies {
// Mobile Ads SDK
// 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'
}

// inMobi SDK
Expand All @@ -133,14 +133,14 @@ dependencies {

// Unit tests
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:core:1.6.1'
testImplementation 'org.mockito:mockito-core:5.5.0'
testImplementation 'org.robolectric:robolectric:4.9'
testImplementation 'androidx.test.ext:junit:1.2.1'
testImplementation 'org.mockito.kotlin:mockito-kotlin:5.1.0'
testImplementation 'org.jetbrains.kotlin:kotlin-test:2.1.10'
testImplementation 'org.jetbrains.kotlin:kotlin-test:2.3.0'
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import androidx.annotation.VisibleForTesting;
import com.google.android.gms.ads.AdError;
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.inmobi.ads.InMobiAdRequestStatus;
Expand Down Expand Up @@ -145,7 +146,8 @@ static void setIsAgeRestricted(InMobiSdkWrapper inMobiSdkWrapper) {
if (requestConfiguration.getTagForChildDirectedTreatment()
== RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE
|| requestConfiguration.getTagForUnderAgeOfConsent()
== RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE) {
== RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE
|| requestConfiguration.getAgeRestrictedTreatment() == AgeRestrictedTreatment.CHILD) {
inMobiSdkWrapper.setIsAgeRestricted(true);
} else if (requestConfiguration.getTagForChildDirectedTreatment()
== RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_FALSE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.gms.ads.AgeRestrictedTreatment;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.RequestConfiguration;
import com.inmobi.compliance.InMobiPrivacyCompliance;

import java.util.HashMap;

public class InMobiExtrasBuilder {
Expand Down Expand Up @@ -45,7 +45,9 @@ public static InMobiExtras build(@NonNull Context context, @Nullable Bundle medi
// If the COPPA value isn't specified by the publisher, InMobi SDK expects the default value to
// be `0`.
if (MobileAds.getRequestConfiguration().getTagForChildDirectedTreatment()
== RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE) {
== RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE
|| MobileAds.getRequestConfiguration().getAgeRestrictedTreatment()
== AgeRestrictedTreatment.CHILD) {
map.put(COPPA, "1");
} else {
map.put(COPPA, "0");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.google.ads.mediation.inmobi

import android.os.Bundle
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.android.gms.ads.AgeRestrictedTreatment
import com.google.android.gms.ads.MobileAds
import com.google.android.gms.ads.RequestConfiguration
import com.google.common.truth.Truth.assertThat
Expand Down Expand Up @@ -113,6 +114,35 @@ class InMobiAdapterUtilsTest {
setCOPPAAndUnderAgeOnMobileAdsRequestConfiguration(
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED,
RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED,
AgeRestrictedTreatment.UNSPECIFIED,
)

InMobiAdapterUtils.setIsAgeRestricted(inMobiSdkWrapper)

verify(inMobiSdkWrapper, never()).setIsAgeRestricted(any())
}

@Test
fun setIsAgeRestricted_whenAgeRestrictedTreatmentChild_setsAgeRestrictedTrueOnInMobiSDK() {
val inMobiSdkWrapper = mock<InMobiSdkWrapper>()
setCOPPAAndUnderAgeOnMobileAdsRequestConfiguration(
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED,
RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED,
AgeRestrictedTreatment.CHILD,
)

InMobiAdapterUtils.setIsAgeRestricted(inMobiSdkWrapper)

verify(inMobiSdkWrapper).setIsAgeRestricted(true)
}

@Test
fun setIsAgeRestricted_whenAgeRestrictedTreatmentTeen_setIsAgeRestrictedIsNeverInvoked() {
val inMobiSdkWrapper = mock<InMobiSdkWrapper>()
setCOPPAAndUnderAgeOnMobileAdsRequestConfiguration(
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED,
RequestConfiguration.TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED,
AgeRestrictedTreatment.TEEN,
)

InMobiAdapterUtils.setIsAgeRestricted(inMobiSdkWrapper)
Expand Down Expand Up @@ -270,12 +300,17 @@ class InMobiAdapterUtilsTest {
assertThat(adError).isNull()
}

private fun setCOPPAAndUnderAgeOnMobileAdsRequestConfiguration(coppa: Int, underAgeConsent: Int) {
private fun setCOPPAAndUnderAgeOnMobileAdsRequestConfiguration(
coppa: Int,
underAgeConsent: Int,
ageRestrictedTreatment: AgeRestrictedTreatment = AgeRestrictedTreatment.UNSPECIFIED,
) {
val requestConfiguration =
MobileAds.getRequestConfiguration()
.toBuilder()
.setTagForChildDirectedTreatment(coppa)
.setTagForUnderAgeOfConsent(underAgeConsent)
.setAgeRestrictedTreatment(ageRestrictedTreatment)
.build()
MobileAds.setRequestConfiguration(requestConfiguration)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.google.ads.mediation.inmobi
import android.content.Context
import android.os.Bundle
import androidx.test.core.app.ApplicationProvider
import com.google.android.gms.ads.AgeRestrictedTreatment
import com.google.android.gms.ads.MobileAds
import com.google.android.gms.ads.RequestConfiguration
import com.google.common.truth.Truth.assertThat
Expand All @@ -13,7 +14,7 @@ import org.robolectric.ParameterizedRobolectricTestRunner
@RunWith(ParameterizedRobolectricTestRunner::class)
class InMobiExtrasBuilderTest(
private val mediationExtras: Map<String, String>?,
private val protocol: String
private val protocol: String,
) {
private val context = ApplicationProvider.getApplicationContext<Context>()

Expand Down Expand Up @@ -56,6 +57,44 @@ class InMobiExtrasBuilderTest(
assertThat(inMobiExtras.parameterMap[InMobiAdapterUtils.COPPA]).isEqualTo("1")
}

@Test
fun buildInMobiExtras_whenAgeRestrictedTreatmentChild_returnsInMobiExtrasWithCoppaTrue() {
val requestConfiguration =
MobileAds.getRequestConfiguration()
.toBuilder()
.setTagForChildDirectedTreatment(
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED
)
.setAgeRestrictedTreatment(AgeRestrictedTreatment.CHILD)
.build()
MobileAds.setRequestConfiguration(requestConfiguration)

val inMobiExtras = InMobiExtrasBuilder.build(context, mapToBundle(mediationExtras), protocol)

assertThat(inMobiExtras).isNotNull()
assertThat(inMobiExtras.parameterMap).isNotEmpty()
assertThat(inMobiExtras.parameterMap[InMobiAdapterUtils.COPPA]).isEqualTo("1")
}

@Test
fun buildInMobiExtras_whenAgeRestrictedTreatmentTeen_returnsInMobiExtrasWithCoppaFalse() {
val requestConfiguration =
MobileAds.getRequestConfiguration()
.toBuilder()
.setTagForChildDirectedTreatment(
RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_UNSPECIFIED
)
.setAgeRestrictedTreatment(AgeRestrictedTreatment.TEEN)
.build()
MobileAds.setRequestConfiguration(requestConfiguration)

val inMobiExtras = InMobiExtrasBuilder.build(context, mapToBundle(mediationExtras), protocol)

assertThat(inMobiExtras).isNotNull()
assertThat(inMobiExtras.parameterMap).isNotEmpty()
assertThat(inMobiExtras.parameterMap[InMobiAdapterUtils.COPPA]).isEqualTo("0")
}

@Test
fun buildInMobiExtras_whenCoppaNotSet_returnsInMobiExtrasWithCoppaFalse() {
// when coppa value is not specified...
Expand Down Expand Up @@ -118,7 +157,7 @@ class InMobiExtrasBuilderTest(

private fun verifyInMobiExtrasParameterMap(
mediationExtras: Map<String, String>?,
inMobiExtras: InMobiExtras
inMobiExtras: InMobiExtras,
) {
if (!mediationExtras.isNullOrEmpty()) {
assertThat(inMobiExtras.parameterMap).containsAtLeastEntriesIn(mediationExtras)
Expand All @@ -132,14 +171,14 @@ class InMobiExtrasBuilderTest(
listOf(
arrayOf(
mapOf(InMobiNetworkKeys.AGE to "25", InMobiNetworkKeys.AREA_CODE to "12345"),
InMobiAdapterUtils.PROTOCOL_RTB
InMobiAdapterUtils.PROTOCOL_RTB,
),
arrayOf(
mapOf(InMobiNetworkKeys.CITY to "MTV", InMobiNetworkKeys.LANGUAGE to "Japanese"),
InMobiAdapterUtils.PROTOCOL_WATERFALL
InMobiAdapterUtils.PROTOCOL_WATERFALL,
),
arrayOf(null, InMobiAdapterUtils.PROTOCOL_WATERFALL),
arrayOf(null, InMobiAdapterUtils.PROTOCOL_RTB)
arrayOf(null, InMobiAdapterUtils.PROTOCOL_RTB),
)
}
}
Loading