Skip to content

Commit 96afe59

Browse files
AdMob: Add ChimeraCreator Impl (#3536)
Co-authored-by: Marvin W <git@larma.de>
1 parent bc3cd9b commit 96afe59

49 files changed

Lines changed: 937 additions & 12 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

play-services-ads-lite/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ dependencies {
3737
api 'androidx.work:work-runtime:2.7.0'
3838
api project(':play-services-ads-base')
3939
api project(':play-services-basement')
40+
annotationProcessor project(':safe-parcel-processor')
4041
// api project(':play-services-measurement-sdk-api')
4142
// api project(':user-messaging-platform')
4243
}

play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import org.microg.gms.utils.warnOnTransactionIssues
1616
private const val TAG = "AdLoaderBuilder"
1717

1818
@Keep
19-
class AdLoaderBuilderCreatorImpl : IAdLoaderBuilderCreator.Stub() {
19+
open class AdLoaderBuilderCreatorImpl : IAdLoaderBuilderCreator.Stub() {
2020
override fun newAdLoaderBuilder(context: IObjectWrapper?, adUnitId: String, adapterCreator: IAdapterCreator?, clientVersion: Int): IBinder? {
2121
Log.d(TAG, "newAdLoaderBuilder: adUnitId=$adUnitId clientVersion=$clientVersion")
2222
return LegacyAdLoaderBuilder()

play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,32 @@
44
*/
55
package com.google.android.gms.ads
66

7+
import android.content.Context
8+
import android.os.IBinder
79
import android.os.Parcel
10+
import android.util.Log
811
import androidx.annotation.Keep
12+
import com.google.android.gms.ads.internal.client.AdSizeParcel
13+
import com.google.android.gms.ads.internal.client.IAdManagerCreator
14+
import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator
15+
import com.google.android.gms.dynamic.IObjectWrapper
16+
import com.google.android.gms.dynamic.ObjectWrapper
917
import org.microg.gms.utils.warnOnTransactionIssues
1018

11-
private const val TAG = "AdManager"
19+
private const val TAG = "AdManagerCreator"
1220

1321
@Keep
14-
class AdManagerCreatorImpl : AdManagerCreator.Stub() {
22+
open class AdManagerCreatorImpl : IAdManagerCreator.Stub() {
23+
override fun newAdManager(context: IObjectWrapper?, adSize: AdSizeParcel?, adUnitId: String?, adapterCreator: IAdapterCreator?, clientVersion: Int): IBinder {
24+
Log.d(TAG, "newAdManager: adUnitId=$adUnitId clientVersion=$clientVersion")
25+
return LegacyAdManager(ObjectWrapper.unwrap(context) as? Context)
26+
}
27+
28+
override fun newAdManagerByType(context: IObjectWrapper?, adSize: AdSizeParcel?, adUnitId: String?, adapterCreator: IAdapterCreator?, clientVersion: Int, type: Int): IBinder {
29+
Log.d(TAG, "newAdManagerByType: adUnitId=$adUnitId clientVersion=$clientVersion type=$type")
30+
return LegacyAdManager(ObjectWrapper.unwrap(context) as? Context)
31+
}
32+
1533
override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean =
1634
warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) }
1735
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2026 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package com.google.android.gms.ads
6+
7+
import androidx.annotation.Keep
8+
9+
/**
10+
* Dynamite entry point for the native-ad (AdLoader) path.
11+
*
12+
* The AdMob SDK loads this class from the ads dynamite module by its fully-qualified name, so it must
13+
* exist under this exact FQCN and implement `IAdLoaderBuilderCreator`. Behaviour is identical to
14+
* [AdLoaderBuilderCreatorImpl], which is kept under its own name for SDKs that request the un-prefixed
15+
* class.
16+
*/
17+
@Keep
18+
class ChimeraAdLoaderBuilderCreatorImpl : AdLoaderBuilderCreatorImpl()
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2026 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package com.google.android.gms.ads
6+
7+
import androidx.annotation.Keep
8+
9+
/**
10+
* Dynamite entry point for the banner/interstitial (AdManager) path.
11+
*
12+
* The AdMob SDK loads this class from the ads dynamite module by its fully-qualified name, so it must
13+
* exist under this exact FQCN and implement `IAdManagerCreator`. Behaviour is identical to
14+
* [AdManagerCreatorImpl], which is kept under its own name for SDKs that request the un-prefixed class.
15+
*/
16+
@Keep
17+
class ChimeraAdManagerCreatorImpl : AdManagerCreatorImpl()
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2026 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package com.google.android.gms.ads
6+
7+
import androidx.annotation.Keep
8+
9+
/**
10+
* Dynamite entry point for the Mobile Ads initialization / settings path.
11+
*
12+
* The AdMob SDK loads this class from the ads dynamite module by its fully-qualified name, so it must
13+
* exist under this exact FQCN and implement `IMobileAdsSettingManagerCreator`. This is the entry point
14+
* that gates ad initialization. Behaviour is identical to [MobileAdsSettingManagerCreatorImpl], which is
15+
* kept under its own name for SDKs that request the un-prefixed class.
16+
*/
17+
@Keep
18+
class ChimeraMobileAdsSettingManagerCreatorImpl : MobileAdsSettingManagerCreatorImpl()

play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/LegacyAdLoaderBuilder.kt

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,51 @@
44
*/
55
package com.google.android.gms.ads
66

7-
import android.os.IBinder
87
import android.util.Log
8+
import com.google.android.gms.ads.formats.AdManagerAdViewOptions
9+
import com.google.android.gms.ads.formats.PublisherAdViewOptions
910
import com.google.android.gms.ads.internal.AdRequestParcel
11+
import com.google.android.gms.ads.internal.client.AdSizeParcel
12+
import com.google.android.gms.ads.internal.client.IAdListener
1013
import com.google.android.gms.ads.internal.client.IAdLoader
1114
import com.google.android.gms.ads.internal.client.IAdLoaderBuilder
15+
import com.google.android.gms.ads.internal.client.ICorrelationIdProvider
16+
import com.google.android.gms.ads.internal.formats.NativeAdOptionsParcel
17+
import com.google.android.gms.ads.internal.formats.client.IOnAppInstallAdLoadedListener
18+
import com.google.android.gms.ads.internal.formats.client.IOnContentAdLoadedListener
19+
import com.google.android.gms.ads.internal.formats.client.IOnCustomClickListener
20+
import com.google.android.gms.ads.internal.formats.client.IOnCustomTemplateAdLoadedListener
21+
import com.google.android.gms.ads.internal.formats.client.IOnPublisherAdViewLoadedListener
22+
import com.google.android.gms.ads.internal.formats.client.IOnUnifiedNativeAdLoadedListener
23+
import com.google.android.gms.ads.internal.instream.InstreamAdConfigurationParcel
24+
import com.google.android.gms.ads.internal.instream.client.IInstreamAdLoadCallback
1225

1326
private const val TAG = "LegacyAdLoader"
1427

1528
internal class LegacyAdLoaderBuilder : IAdLoaderBuilder.Stub() {
1629
override fun build(): IAdLoader = LegacyAdLoader
17-
override fun setAdListener(listener: IBinder?) = Unit
18-
override fun setUnifiedNativeAdLoadedListener(listener: IBinder?) = Unit
30+
override fun setAdListener(listener: IAdListener?) = Unit
31+
override fun setAppInstallAdLoadedListener(listener: IOnAppInstallAdLoadedListener?) = Unit
32+
override fun setContentAdLoadedListener(listener: IOnContentAdLoadedListener?) = Unit
33+
override fun forCustomFormatAd(templateId: String?, onCustomFormatAdLoadedListener: IOnCustomTemplateAdLoadedListener?, onCustomClickListener: IOnCustomClickListener?) = Unit
34+
override fun setNativeAdOptions(options: NativeAdOptionsParcel?) = Unit
35+
override fun setCorrelationIdProvider(provider: ICorrelationIdProvider?) = Unit
36+
override fun forPublisherAdView(onPublisherAdViewLoadedListener: IOnPublisherAdViewLoadedListener?, adSize: AdSizeParcel?) = Unit
37+
override fun setPublisherAdViewOptions(options: PublisherAdViewOptions?) = Unit
38+
override fun setUnifiedNativeAdLoadedListener(listener: IOnUnifiedNativeAdLoadedListener?) = Unit
39+
override fun forInstreamAd(config: InstreamAdConfigurationParcel?) = Unit
40+
override fun setInstreamAdLoadCallback(callback: IInstreamAdLoadCallback?) = Unit
41+
override fun setAdManagerAdViewOptions(options: AdManagerAdViewOptions?) = Unit
1942
}
2043

2144
private object LegacyAdLoader : IAdLoader.Stub() {
2245
override fun load(request: AdRequestParcel?) {
2346
Log.w(TAG, "load")
2447
}
48+
override fun getMediationAdapterClassName(): String? = null
2549
override fun isLoading(): Boolean = false
50+
override fun getAdManagerAdapterClassName(): String? = null
2651
override fun loadAds(request: AdRequestParcel?, count: Int) {
27-
Log.w(TAG, "load ads")
52+
Log.w(TAG, "loadAds")
2853
}
2954
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2026 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package com.google.android.gms.ads
6+
7+
import android.content.Context
8+
import android.util.Log
9+
import android.widget.FrameLayout
10+
import com.google.android.gms.ads.internal.AdRequestParcel
11+
import com.google.android.gms.ads.internal.client.AdSizeParcel
12+
import com.google.android.gms.ads.internal.client.IAdClickListener
13+
import com.google.android.gms.ads.internal.client.IAdListener
14+
import com.google.android.gms.ads.internal.client.IAdLoadCallback
15+
import com.google.android.gms.ads.internal.client.IAdManager
16+
import com.google.android.gms.ads.internal.client.IAppEventListener
17+
import com.google.android.gms.ads.internal.client.IFullScreenContentCallback
18+
import com.google.android.gms.ads.internal.client.IOnPaidEventListener
19+
import com.google.android.gms.ads.internal.client.IVideoController
20+
import com.google.android.gms.dynamic.IObjectWrapper
21+
import com.google.android.gms.dynamic.ObjectWrapper
22+
23+
private const val TAG = "LegacyAdManager"
24+
25+
/**
26+
* Minimal [IAdManager] returned by [AdManagerCreatorImpl] for the banner/interstitial path.
27+
*
28+
* It is a non-null ad manager so the AdMob SDK keeps using microG's remote result. No ad is served:
29+
* [getView] returns an empty container, [loadAd] reports "no fill", and the listeners/getters are
30+
* accepted but inert.
31+
*/
32+
internal class LegacyAdManager(private val context: Context?) : IAdManager.Stub() {
33+
private val adView: FrameLayout? by lazy { context?.let { FrameLayout(it) } }
34+
35+
override fun getView(): IObjectWrapper = ObjectWrapper.wrap(adView)
36+
override fun destroy() = Unit
37+
override fun loadAd(request: AdRequestParcel?): Boolean {
38+
Log.w(TAG, "loadAd")
39+
return false
40+
}
41+
override fun pause() = Unit
42+
override fun resume() = Unit
43+
override fun setAdListener(listener: IAdListener?) = Unit
44+
override fun setAppEventListener(listener: IAppEventListener?) = Unit
45+
override fun getAdSize(): AdSizeParcel? = null
46+
override fun setAdSize(adSize: AdSizeParcel?) = Unit
47+
override fun setAdClickListener(listener: IAdClickListener?) = Unit
48+
override fun setManualImpressionFlag(flag: Int) = Unit
49+
override fun getVideoController(): IVideoController? = null
50+
override fun setManualImpressionsEnabled(enabled: Boolean) = Unit
51+
override fun setOnPaidEventListener(listener: IOnPaidEventListener?) = Unit
52+
override fun loadAdWithCallback(request: AdRequestParcel?, callback: IAdLoadCallback?) = Unit
53+
override fun showInterstitial(activityWrapper: IObjectWrapper?) = Unit
54+
override fun setFullScreenContentCallback(callback: IFullScreenContentCallback?) = Unit
55+
override fun setStartTimestampMillis(timestampMillis: Long) = Unit
56+
}

play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import org.microg.gms.utils.warnOnTransactionIssues
1818
private const val TAG = "AdsSettingManager"
1919

2020
@Keep
21-
class MobileAdsSettingManagerCreatorImpl : IMobileAdsSettingManagerCreator.Stub() {
21+
open class MobileAdsSettingManagerCreatorImpl : IMobileAdsSettingManagerCreator.Stub() {
2222
override fun getMobileAdsSettingManager(context: IObjectWrapper?, clientVersion: Int): IBinder {
2323
Log.d(TAG, "getMobileAdsSettingManager($clientVersion)")
2424
return MobileAdsSettingManagerImpl(ObjectWrapper.unwrap(context) as Context)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2026 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.google.android.gms.ads.formats;
7+
8+
parcelable AdManagerAdViewOptions;

0 commit comments

Comments
 (0)