diff --git a/play-services-ads-api/build.gradle b/play-services-ads-api/build.gradle
new file mode 100644
index 0000000000..4c4a826758
--- /dev/null
+++ b/play-services-ads-api/build.gradle
@@ -0,0 +1,46 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+apply plugin: 'com.android.library'
+apply plugin: 'maven-publish'
+apply plugin: 'signing'
+
+android {
+ namespace "com.google.android.gms.ads"
+
+ compileSdkVersion androidCompileSdk
+ buildToolsVersion "$androidBuildVersionTools"
+
+ buildFeatures {
+ aidl = true
+ }
+
+ defaultConfig {
+ versionName version
+ minSdkVersion androidMinSdk
+ targetSdkVersion androidTargetSdk
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+apply from: '../gradle/publish-android.gradle'
+
+description = 'microG implementation of play-services-ads-api'
+
+dependencies {
+ // Dependencies from play-services-ads-api:25.3.0
+ api 'androidx.browser:browser:1.8.0'
+ api 'androidx.core:core:1.10.1'
+ api 'androidx.datastore:datastore:1.0.0'
+ api 'androidx.work:work-runtime:2.7.0'
+ //api 'com.google.android.ump:user-messaging-platform:4.0.0'
+ api project(':play-services-basement')
+ //api project(':play-services-measurement-sdk-api')
+ annotationProcessor project(':safe-parcel-processor')
+}
diff --git a/play-services-ads-lite/core/build.gradle b/play-services-ads-api/core/build.gradle
similarity index 94%
rename from play-services-ads-lite/core/build.gradle
rename to play-services-ads-api/core/build.gradle
index 4c4832ef5e..9beb7b8c90 100644
--- a/play-services-ads-lite/core/build.gradle
+++ b/play-services-ads-api/core/build.gradle
@@ -7,7 +7,7 @@ apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
dependencies {
- api project(':play-services-ads-lite')
+ api project(':play-services-ads-api')
implementation project(':play-services-base-core')
}
diff --git a/play-services-ads-lite/core/src/main/AndroidManifest.xml b/play-services-ads-api/core/src/main/AndroidManifest.xml
similarity index 100%
rename from play-services-ads-lite/core/src/main/AndroidManifest.xml
rename to play-services-ads-api/core/src/main/AndroidManifest.xml
diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt
similarity index 82%
rename from play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt
rename to play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt
index dc258c2ded..a42081b242 100644
--- a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/AdLoaderBuilderCreatorImpl.kt
@@ -8,6 +8,7 @@ import android.os.IBinder
import android.os.Parcel
import android.util.Log
import androidx.annotation.Keep
+import com.google.android.gms.ads.internal.client.IAdLoaderBuilder
import com.google.android.gms.ads.internal.client.IAdLoaderBuilderCreator
import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator
import com.google.android.gms.dynamic.IObjectWrapper
@@ -16,10 +17,10 @@ import org.microg.gms.utils.warnOnTransactionIssues
private const val TAG = "AdLoaderBuilder"
@Keep
-class AdLoaderBuilderCreatorImpl : IAdLoaderBuilderCreator.Stub() {
- override fun newAdLoaderBuilder(context: IObjectWrapper?, adUnitId: String, adapterCreator: IAdapterCreator?, clientVersion: Int): IBinder? {
+open class AdLoaderBuilderCreatorImpl : IAdLoaderBuilderCreator.Stub() {
+ override fun newAdLoaderBuilder(context: IObjectWrapper?, adUnitId: String, adapterCreator: IAdapterCreator?, clientVersion: Int): IAdLoaderBuilder? {
Log.d(TAG, "newAdLoaderBuilder: adUnitId=$adUnitId clientVersion=$clientVersion")
- return null
+ return LegacyAdLoaderBuilder()
}
override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) }
diff --git a/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt
new file mode 100644
index 0000000000..bb51242bd7
--- /dev/null
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt
@@ -0,0 +1,36 @@
+/*
+ * SPDX-FileCopyrightText: 2023 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.google.android.gms.ads
+
+import android.content.Context
+import android.os.IBinder
+import android.os.Parcel
+import android.util.Log
+import androidx.annotation.Keep
+import com.google.android.gms.ads.internal.client.AdSizeParcel
+import com.google.android.gms.ads.internal.client.IAdManager
+import com.google.android.gms.ads.internal.client.IAdManagerCreator
+import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator
+import com.google.android.gms.dynamic.IObjectWrapper
+import com.google.android.gms.dynamic.ObjectWrapper
+import org.microg.gms.utils.warnOnTransactionIssues
+
+private const val TAG = "AdManagerCreator"
+
+@Keep
+open class AdManagerCreatorImpl : IAdManagerCreator.Stub() {
+ override fun newAdManager(context: IObjectWrapper?, adSize: AdSizeParcel?, adUnitId: String?, adapterCreator: IAdapterCreator?, clientVersion: Int): IAdManager {
+ Log.d(TAG, "newAdManager: adUnitId=$adUnitId clientVersion=$clientVersion")
+ return LegacyAdManager(ObjectWrapper.unwrap(context) as? Context)
+ }
+
+ override fun newAdManagerByType(context: IObjectWrapper?, adSize: AdSizeParcel?, adUnitId: String?, adapterCreator: IAdapterCreator?, clientVersion: Int, type: Int): IAdManager {
+ Log.d(TAG, "newAdManagerByType: adUnitId=$adUnitId clientVersion=$clientVersion type=$type")
+ return LegacyAdManager(ObjectWrapper.unwrap(context) as? Context)
+ }
+
+ override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean =
+ warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) }
+}
diff --git a/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraAdLoaderBuilderCreatorImpl.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraAdLoaderBuilderCreatorImpl.kt
new file mode 100644
index 0000000000..6da9cbe7df
--- /dev/null
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraAdLoaderBuilderCreatorImpl.kt
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.google.android.gms.ads
+
+import androidx.annotation.Keep
+
+/**
+ * Dynamite entry point for the native-ad (AdLoader) path.
+ *
+ * The AdMob SDK loads this class from the ads dynamite module by its fully-qualified name, so it must
+ * exist under this exact FQCN and implement `IAdLoaderBuilderCreator`. Behaviour is identical to
+ * [AdLoaderBuilderCreatorImpl], which is kept under its own name for SDKs that request the un-prefixed
+ * class.
+ */
+@Keep
+class ChimeraAdLoaderBuilderCreatorImpl : AdLoaderBuilderCreatorImpl()
diff --git a/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraAdManagerCreatorImpl.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraAdManagerCreatorImpl.kt
new file mode 100644
index 0000000000..aa42ba1b5e
--- /dev/null
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraAdManagerCreatorImpl.kt
@@ -0,0 +1,17 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.google.android.gms.ads
+
+import androidx.annotation.Keep
+
+/**
+ * Dynamite entry point for the banner/interstitial (AdManager) path.
+ *
+ * The AdMob SDK loads this class from the ads dynamite module by its fully-qualified name, so it must
+ * exist under this exact FQCN and implement `IAdManagerCreator`. Behaviour is identical to
+ * [AdManagerCreatorImpl], which is kept under its own name for SDKs that request the un-prefixed class.
+ */
+@Keep
+class ChimeraAdManagerCreatorImpl : AdManagerCreatorImpl()
diff --git a/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraMobileAdsSettingManagerCreatorImpl.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraMobileAdsSettingManagerCreatorImpl.kt
new file mode 100644
index 0000000000..1cd079794b
--- /dev/null
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/ChimeraMobileAdsSettingManagerCreatorImpl.kt
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.google.android.gms.ads
+
+import androidx.annotation.Keep
+
+/**
+ * Dynamite entry point for the Mobile Ads initialization / settings path.
+ *
+ * The AdMob SDK loads this class from the ads dynamite module by its fully-qualified name, so it must
+ * exist under this exact FQCN and implement `IMobileAdsSettingManagerCreator`. This is the entry point
+ * that gates ad initialization. Behaviour is identical to [MobileAdsSettingManagerCreatorImpl], which is
+ * kept under its own name for SDKs that request the un-prefixed class.
+ */
+@Keep
+class ChimeraMobileAdsSettingManagerCreatorImpl : MobileAdsSettingManagerCreatorImpl()
diff --git a/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/LegacyAdLoaderBuilder.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/LegacyAdLoaderBuilder.kt
new file mode 100644
index 0000000000..ea93115705
--- /dev/null
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/LegacyAdLoaderBuilder.kt
@@ -0,0 +1,54 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.google.android.gms.ads
+
+import android.util.Log
+import com.google.android.gms.ads.formats.AdManagerAdViewOptions
+import com.google.android.gms.ads.formats.PublisherAdViewOptions
+import com.google.android.gms.ads.internal.AdRequestParcel
+import com.google.android.gms.ads.internal.client.AdSizeParcel
+import com.google.android.gms.ads.internal.client.IAdListener
+import com.google.android.gms.ads.internal.client.IAdLoader
+import com.google.android.gms.ads.internal.client.IAdLoaderBuilder
+import com.google.android.gms.ads.internal.client.ICorrelationIdProvider
+import com.google.android.gms.ads.internal.formats.NativeAdOptionsParcel
+import com.google.android.gms.ads.internal.formats.client.IOnAppInstallAdLoadedListener
+import com.google.android.gms.ads.internal.formats.client.IOnContentAdLoadedListener
+import com.google.android.gms.ads.internal.formats.client.IOnCustomClickListener
+import com.google.android.gms.ads.internal.formats.client.IOnCustomTemplateAdLoadedListener
+import com.google.android.gms.ads.internal.formats.client.IOnPublisherAdViewLoadedListener
+import com.google.android.gms.ads.internal.formats.client.IOnUnifiedNativeAdLoadedListener
+import com.google.android.gms.ads.internal.instream.InstreamAdConfigurationParcel
+import com.google.android.gms.ads.internal.instream.client.IInstreamAdLoadCallback
+
+private const val TAG = "LegacyAdLoader"
+
+internal class LegacyAdLoaderBuilder : IAdLoaderBuilder.Stub() {
+ override fun build(): IAdLoader = LegacyAdLoader
+ override fun withAdListener(listener: IAdListener?) = Unit
+ override fun withAppInstallAdLoadedListener(listener: IOnAppInstallAdLoadedListener?) = Unit
+ override fun withContentAdLoadedListener(listener: IOnContentAdLoadedListener?) = Unit
+ override fun forCustomFormatAd(templateId: String?, onCustomFormatAdLoadedListener: IOnCustomTemplateAdLoadedListener?, onCustomClickListener: IOnCustomClickListener?) = Unit
+ override fun withNativeAdOptions(options: NativeAdOptionsParcel?) = Unit
+ override fun withCorrelationIdProvider(provider: ICorrelationIdProvider?) = Unit
+ override fun forAdView(onPublisherAdViewLoadedListener: IOnPublisherAdViewLoadedListener?, adSize: AdSizeParcel?) = Unit
+ override fun withPublisherAdViewOptions(options: PublisherAdViewOptions?) = Unit
+ override fun forNativeAd(listener: IOnUnifiedNativeAdLoadedListener?) = Unit
+ override fun forInstreamAd(config: InstreamAdConfigurationParcel?) = Unit
+ override fun setInstreamAdLoadCallback(callback: IInstreamAdLoadCallback?) = Unit
+ override fun withAdManagerAdViewOptions(options: AdManagerAdViewOptions?) = Unit
+}
+
+private object LegacyAdLoader : IAdLoader.Stub() {
+ override fun load(request: AdRequestParcel?) {
+ Log.w(TAG, "load")
+ }
+ override fun getMediationAdapterClassName(): String? = null
+ override fun isLoading(): Boolean = false
+ override fun getAdManagerAdapterClassName(): String? = null
+ override fun loadAds(request: AdRequestParcel?, count: Int) {
+ Log.w(TAG, "loadAds")
+ }
+}
diff --git a/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/LegacyAdManager.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/LegacyAdManager.kt
new file mode 100644
index 0000000000..7da7f83cf5
--- /dev/null
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/LegacyAdManager.kt
@@ -0,0 +1,56 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.google.android.gms.ads
+
+import android.content.Context
+import android.util.Log
+import android.widget.FrameLayout
+import com.google.android.gms.ads.internal.AdRequestParcel
+import com.google.android.gms.ads.internal.client.AdSizeParcel
+import com.google.android.gms.ads.internal.client.IAdClickListener
+import com.google.android.gms.ads.internal.client.IAdListener
+import com.google.android.gms.ads.internal.client.IAdLoadCallback
+import com.google.android.gms.ads.internal.client.IAdManager
+import com.google.android.gms.ads.internal.client.IAppEventListener
+import com.google.android.gms.ads.internal.client.IFullScreenContentCallback
+import com.google.android.gms.ads.internal.client.IOnPaidEventListener
+import com.google.android.gms.ads.internal.client.IVideoController
+import com.google.android.gms.dynamic.IObjectWrapper
+import com.google.android.gms.dynamic.ObjectWrapper
+
+private const val TAG = "LegacyAdManager"
+
+/**
+ * Minimal [IAdManager] returned by [AdManagerCreatorImpl] for the banner/interstitial path.
+ *
+ * It is a non-null ad manager so the AdMob SDK keeps using microG's remote result. No ad is served:
+ * [getView] returns an empty container, [loadAd] reports "no fill", and the listeners/getters are
+ * accepted but inert.
+ */
+internal class LegacyAdManager(private val context: Context?) : IAdManager.Stub() {
+ private val adView: FrameLayout? by lazy { context?.let { FrameLayout(it) } }
+
+ override fun getView(): IObjectWrapper = ObjectWrapper.wrap(adView)
+ override fun destroy() = Unit
+ override fun loadAd(request: AdRequestParcel?): Boolean {
+ Log.w(TAG, "loadAd")
+ return false
+ }
+ override fun pause() = Unit
+ override fun resume() = Unit
+ override fun setAdListener(listener: IAdListener?) = Unit
+ override fun setAppEventListener(listener: IAppEventListener?) = Unit
+ override fun getAdSize(): AdSizeParcel? = null
+ override fun setAdSize(adSize: AdSizeParcel?) = Unit
+ override fun setAdClickListener(listener: IAdClickListener?) = Unit
+ override fun setManualImpressionFlag(flag: Int) = Unit
+ override fun getVideoController(): IVideoController? = null
+ override fun setManualImpressionsEnabled(enabled: Boolean) = Unit
+ override fun setOnPaidEventListener(listener: IOnPaidEventListener?) = Unit
+ override fun loadAdWithCallback(request: AdRequestParcel?, callback: IAdLoadCallback?) = Unit
+ override fun showInterstitial(activityWrapper: IObjectWrapper?) = Unit
+ override fun setFullScreenContentCallback(callback: IFullScreenContentCallback?) = Unit
+ override fun setStartTimestampMillis(timestampMillis: Long) = Unit
+}
diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt
similarity index 82%
rename from play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt
rename to play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt
index 176a17d83c..450ddd0368 100644
--- a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt
+++ b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/MobileAdsSettingManagerCreatorImpl.kt
@@ -9,6 +9,7 @@ import android.os.IBinder
import android.os.Parcel
import android.util.Log
import androidx.annotation.Keep
+import com.google.android.gms.ads.internal.client.IMobileAdsSettingManager
import com.google.android.gms.ads.internal.client.IMobileAdsSettingManagerCreator
import com.google.android.gms.dynamic.IObjectWrapper
import com.google.android.gms.dynamic.ObjectWrapper
@@ -18,8 +19,8 @@ import org.microg.gms.utils.warnOnTransactionIssues
private const val TAG = "AdsSettingManager"
@Keep
-class MobileAdsSettingManagerCreatorImpl : IMobileAdsSettingManagerCreator.Stub() {
- override fun getMobileAdsSettingManager(context: IObjectWrapper?, clientVersion: Int): IBinder {
+open class MobileAdsSettingManagerCreatorImpl : IMobileAdsSettingManagerCreator.Stub() {
+ override fun getMobileAdsSettingManager(context: IObjectWrapper?, clientVersion: Int): IMobileAdsSettingManager {
Log.d(TAG, "getMobileAdsSettingManager($clientVersion)")
return MobileAdsSettingManagerImpl(ObjectWrapper.unwrap(context) as Context)
}
diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt
similarity index 100%
rename from play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt
rename to play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/measurement/DynamiteMeasurementManager.kt
diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt b/play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt
similarity index 100%
rename from play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt
rename to play-services-ads-api/core/src/main/kotlin/com/google/android/gms/ads/rewarded/ChimeraRewardedAdCreatorImpl.kt
diff --git a/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt b/play-services-ads-api/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt
similarity index 100%
rename from play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt
rename to play-services-ads-api/core/src/main/kotlin/org/microg/gms/ads/MobileAdsSettingManagerImpl.kt
diff --git a/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt b/play-services-ads-api/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt
similarity index 100%
rename from play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt
rename to play-services-ads-api/core/src/main/kotlin/org/microg/gms/ads/rewarded/ResponseInfoImpl.kt
diff --git a/play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt b/play-services-ads-api/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt
similarity index 100%
rename from play-services-ads-lite/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt
rename to play-services-ads-api/core/src/main/kotlin/org/microg/gms/ads/rewarded/RewardedAdImpl.kt
diff --git a/play-services-ads-api/src/main/AndroidManifest.xml b/play-services-ads-api/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..3b29c9d5f6
--- /dev/null
+++ b/play-services-ads-api/src/main/AndroidManifest.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/formats/AdManagerAdViewOptions.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/formats/AdManagerAdViewOptions.aidl
new file mode 100644
index 0000000000..2ff1efe7b3
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/formats/AdManagerAdViewOptions.aidl
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.formats;
+
+parcelable AdManagerAdViewOptions;
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/formats/PublisherAdViewOptions.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/formats/PublisherAdViewOptions.aidl
new file mode 100644
index 0000000000..6fbfae8bde
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/formats/PublisherAdViewOptions.aidl
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.formats;
+
+parcelable PublisherAdViewOptions;
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdErrorParcel.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdRequestParcel.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/AdapterStatusParcel.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/RequestConfigurationParcel.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.aidl
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/AdSizeParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/AdSizeParcel.aidl
new file mode 100644
index 0000000000..4e437f4cd4
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/AdSizeParcel.aidl
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+parcelable AdSizeParcel;
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/AdValueParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/AdValueParcel.aidl
new file mode 100644
index 0000000000..038a95e61b
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/AdValueParcel.aidl
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+parcelable AdValueParcel;
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdClickListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdClickListener.aidl
new file mode 100644
index 0000000000..77843785fb
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdClickListener.aidl
@@ -0,0 +1,10 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+interface IAdClickListener {
+ void onAdClicked() = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdListener.aidl
new file mode 100644
index 0000000000..f669bbdd8c
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdListener.aidl
@@ -0,0 +1,19 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.AdErrorParcel;
+
+interface IAdListener {
+ void onAdClosed() = 0;
+ void onAdFailedToLoad(int errorCode) = 1;
+ void onAdLeftApplication() = 2;
+ void onAdOpened() = 3;
+ void onAdLoaded() = 4;
+ void onAdClicked() = 5;
+ void onAdImpression() = 6;
+ void onAdFailedToLoadWithAdError(in AdErrorParcel error) = 7;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoadCallback.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoadCallback.aidl
new file mode 100644
index 0000000000..f5e9a1216c
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoadCallback.aidl
@@ -0,0 +1,13 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.AdErrorParcel;
+
+interface IAdLoadCallback {
+ void onAdLoaded() = 0;
+ void onAdFailedToLoad(in AdErrorParcel error) = 1;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoader.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoader.aidl
new file mode 100644
index 0000000000..79dcebb2da
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoader.aidl
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.AdRequestParcel;
+
+interface IAdLoader {
+ void load(in AdRequestParcel request) = 0;
+ String getMediationAdapterClassName() = 1;
+ boolean isLoading() = 2;
+ String getAdManagerAdapterClassName() = 3;
+ void loadAds(in AdRequestParcel request, int count) = 4;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilder.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilder.aidl
new file mode 100644
index 0000000000..b40cc5178c
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilder.aidl
@@ -0,0 +1,38 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.client.IAdLoader;
+import com.google.android.gms.ads.internal.client.IAdListener;
+import com.google.android.gms.ads.internal.client.ICorrelationIdProvider;
+import com.google.android.gms.ads.internal.client.AdSizeParcel;
+import com.google.android.gms.ads.internal.formats.NativeAdOptionsParcel;
+import com.google.android.gms.ads.internal.formats.client.IOnAppInstallAdLoadedListener;
+import com.google.android.gms.ads.internal.formats.client.IOnContentAdLoadedListener;
+import com.google.android.gms.ads.internal.formats.client.IOnCustomTemplateAdLoadedListener;
+import com.google.android.gms.ads.internal.formats.client.IOnCustomClickListener;
+import com.google.android.gms.ads.internal.formats.client.IOnUnifiedNativeAdLoadedListener;
+import com.google.android.gms.ads.internal.formats.client.IOnPublisherAdViewLoadedListener;
+import com.google.android.gms.ads.internal.instream.InstreamAdConfigurationParcel;
+import com.google.android.gms.ads.internal.instream.client.IInstreamAdLoadCallback;
+import com.google.android.gms.ads.formats.PublisherAdViewOptions;
+import com.google.android.gms.ads.formats.AdManagerAdViewOptions;
+
+interface IAdLoaderBuilder {
+ IAdLoader build() = 0;
+ void withAdListener(IAdListener listener) = 1;
+ void withAppInstallAdLoadedListener(IOnAppInstallAdLoadedListener listener) = 2;
+ void withContentAdLoadedListener(IOnContentAdLoadedListener listener) = 3;
+ void forCustomFormatAd(String customFormatId, IOnCustomTemplateAdLoadedListener onCustomFormatAdLoadedListener, IOnCustomClickListener onCustomClickListener) = 4;
+ void withNativeAdOptions(in NativeAdOptionsParcel options) = 5;
+ void withCorrelationIdProvider(ICorrelationIdProvider provider) = 6;
+ void forAdView(IOnPublisherAdViewLoadedListener onPublisherAdViewLoadedListener, in AdSizeParcel adSize) = 7;
+ void withPublisherAdViewOptions(in PublisherAdViewOptions options) = 8;
+ void forNativeAd(IOnUnifiedNativeAdLoadedListener listener) = 9;
+ void forInstreamAd(in InstreamAdConfigurationParcel config) = 12;
+ void setInstreamAdLoadCallback(IInstreamAdLoadCallback callback) = 13;
+ void withAdManagerAdViewOptions(in AdManagerAdViewOptions options) = 14;
+}
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl
similarity index 52%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl
index b6f63ac331..baa9758f65 100644
--- a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdLoaderBuilderCreator.aidl
@@ -1,8 +1,9 @@
package com.google.android.gms.ads.internal.client;
+import com.google.android.gms.ads.internal.client.IAdLoaderBuilder;
import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator;
import com.google.android.gms.dynamic.IObjectWrapper;
interface IAdLoaderBuilderCreator {
- IBinder newAdLoaderBuilder(IObjectWrapper context, String adUnitId, IAdapterCreator adapterCreator, int clientVersion);
+ IAdLoaderBuilder newAdLoaderBuilder(IObjectWrapper context, String adUnitId, IAdapterCreator adapterCreator, int clientVersion);
}
\ No newline at end of file
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdManager.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdManager.aidl
new file mode 100644
index 0000000000..8e5d997f8e
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdManager.aidl
@@ -0,0 +1,38 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.AdRequestParcel;
+import com.google.android.gms.ads.internal.client.AdSizeParcel;
+import com.google.android.gms.ads.internal.client.IAdListener;
+import com.google.android.gms.ads.internal.client.IAppEventListener;
+import com.google.android.gms.ads.internal.client.IAdClickListener;
+import com.google.android.gms.ads.internal.client.IVideoController;
+import com.google.android.gms.ads.internal.client.IOnPaidEventListener;
+import com.google.android.gms.ads.internal.client.IAdLoadCallback;
+import com.google.android.gms.ads.internal.client.IFullScreenContentCallback;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface IAdManager {
+ IObjectWrapper getView() = 0;
+ void destroy() = 1;
+ boolean loadAd(in AdRequestParcel request) = 3;
+ void pause() = 4;
+ void resume() = 5;
+ void setAdListener(IAdListener listener) = 6;
+ void setAppEventListener(IAppEventListener listener) = 7;
+ AdSizeParcel getAdSize() = 11;
+ void setAdSize(in AdSizeParcel adSize) = 12;
+ void setAdClickListener(IAdClickListener listener) = 19;
+ void setManualImpressionFlag(int flag) = 21;
+ IVideoController getVideoController() = 25;
+ void setManualImpressionsEnabled(boolean enabled) = 33;
+ void setOnPaidEventListener(IOnPaidEventListener listener) = 41;
+ void loadAdWithCallback(in AdRequestParcel request, IAdLoadCallback callback) = 42;
+ void showInterstitial(IObjectWrapper activityWrapper) = 43;
+ void setFullScreenContentCallback(IFullScreenContentCallback callback) = 44;
+ void setStartTimestampMillis(long timestampMillis) = 47;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdManagerCreator.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdManagerCreator.aidl
new file mode 100644
index 0000000000..4446547d23
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAdManagerCreator.aidl
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.client.AdSizeParcel;
+import com.google.android.gms.ads.internal.client.IAdManager;
+import com.google.android.gms.ads.internal.mediation.client.IAdapterCreator;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface IAdManagerCreator {
+ IAdManager newAdManager(IObjectWrapper context, in AdSizeParcel adSize, String adUnitId, IAdapterCreator adapterCreator, int clientVersion) = 0;
+ IAdManager newAdManagerByType(IObjectWrapper context, in AdSizeParcel adSize, String adUnitId, IAdapterCreator adapterCreator, int clientVersion, int type) = 1;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAppEventListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAppEventListener.aidl
new file mode 100644
index 0000000000..0c62f01642
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IAppEventListener.aidl
@@ -0,0 +1,10 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+interface IAppEventListener {
+ void onAppEvent(String name, String info) = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/ICorrelationIdProvider.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/ICorrelationIdProvider.aidl
new file mode 100644
index 0000000000..205f82edf4
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/ICorrelationIdProvider.aidl
@@ -0,0 +1,10 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+interface ICorrelationIdProvider {
+ String getCorrelationId() = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IFullScreenContentCallback.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IFullScreenContentCallback.aidl
new file mode 100644
index 0000000000..0464ff16ab
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IFullScreenContentCallback.aidl
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.AdErrorParcel;
+
+interface IFullScreenContentCallback {
+ void onAdFailedToShowFullScreenContent(in AdErrorParcel error) = 0;
+ void onAdShowedFullScreenContent() = 1;
+ void onAdDismissedFullScreenContent() = 2;
+ void onAdImpression() = 3;
+ void onAdClicked() = 4;
+}
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManager.aidl
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl
new file mode 100644
index 0000000000..f68ce14c21
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl
@@ -0,0 +1,8 @@
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.client.IMobileAdsSettingManager;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface IMobileAdsSettingManagerCreator {
+ IMobileAdsSettingManager getMobileAdsSettingManager(IObjectWrapper context, int clientVersion);
+}
\ No newline at end of file
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdInspectorClosedListener.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IOnAdMetadataChangedListener.aidl
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl
new file mode 100644
index 0000000000..eabf5d201f
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl
@@ -0,0 +1,13 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.client.AdValueParcel;
+
+interface IOnPaidEventListener {
+ void onPaidEvent(in AdValueParcel adValue) = 0;
+ boolean isLoggingLimitedToImpressionEvents() = 1;
+}
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IResponseInfo.aidl
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IVideoController.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IVideoController.aidl
new file mode 100644
index 0000000000..643d2e8b8e
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IVideoController.aidl
@@ -0,0 +1,24 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import com.google.android.gms.ads.internal.client.IVideoLifecycleCallbacks;
+
+interface IVideoController {
+ float getAspectRatio() = 0;
+ float getCurrentTime() = 1;
+ float getDuration() = 2;
+ int getPlaybackState() = 3;
+ void play() = 4;
+ void pause() = 5;
+ void stop() = 6;
+ IVideoLifecycleCallbacks getVideoLifecycleCallbacks() = 7;
+ void setVideoLifecycleCallbacks(IVideoLifecycleCallbacks callbacks) = 8;
+ boolean isClickToExpandEnabled() = 9;
+ boolean isCustomControlsEnabled() = 10;
+ boolean isMuted() = 11;
+ void mute(boolean mute) = 12;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IVideoLifecycleCallbacks.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IVideoLifecycleCallbacks.aidl
new file mode 100644
index 0000000000..6b0c5ba819
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/client/IVideoLifecycleCallbacks.aidl
@@ -0,0 +1,14 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+interface IVideoLifecycleCallbacks {
+ void onVideoStart() = 0;
+ void onVideoPlay() = 1;
+ void onVideoPause() = 2;
+ void onVideoEnd() = 3;
+ void onVideoMute(boolean muted) = 4;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/NativeAdOptionsParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/NativeAdOptionsParcel.aidl
new file mode 100644
index 0000000000..f6f4957642
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/NativeAdOptionsParcel.aidl
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats;
+
+parcelable NativeAdOptionsParcel;
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IAttributionInfo.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IAttributionInfo.aidl
new file mode 100644
index 0000000000..ebd8c5b500
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IAttributionInfo.aidl
@@ -0,0 +1,14 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.ads.internal.formats.client.INativeAdImage;
+
+interface IAttributionInfo {
+ String getText() = 0;
+ INativeAdImage getImage() = 1;
+ IAttributionInfo getNextAttributionInfo() = 2;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeAdImage.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeAdImage.aidl
new file mode 100644
index 0000000000..ad5a69fc8f
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeAdImage.aidl
@@ -0,0 +1,17 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import android.net.Uri;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface INativeAdImage {
+ IObjectWrapper getDrawable() = 0;
+ Uri getUri() = 1;
+ double getScale() = 2;
+ int getWidth() = 3;
+ int getHeight() = 4;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeAppInstallAd.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeAppInstallAd.aidl
new file mode 100644
index 0000000000..cbe18571b4
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeAppInstallAd.aidl
@@ -0,0 +1,28 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import android.os.Bundle;
+import com.google.android.gms.ads.internal.client.IVideoController;
+import com.google.android.gms.ads.internal.formats.client.INativeAdImage;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface INativeAppInstallAd {
+ String getHeadline() = 0;
+ List getImages() = 1;
+ String getBody() = 2;
+ INativeAdImage getIcon() = 3;
+ String getCallToAction() = 4;
+ double getStarRating() = 5;
+ String getStore() = 6;
+ String getPrice() = 7;
+ Bundle getExtras() = 8;
+ void recordImpression() = 9;
+ void performClick(in Bundle clickData) = 10;
+ void reportTouchEvent(in Bundle touchData) = 11;
+ IVideoController getVideoController() = 12;
+ IObjectWrapper getMediaContent() = 13;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeContentAd.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeContentAd.aidl
new file mode 100644
index 0000000000..d55ccbfc1a
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeContentAd.aidl
@@ -0,0 +1,26 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import android.os.Bundle;
+import com.google.android.gms.ads.internal.client.IVideoController;
+import com.google.android.gms.ads.internal.formats.client.INativeAdImage;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface INativeContentAd {
+ String getHeadline() = 0;
+ List getImages() = 1;
+ String getBody() = 2;
+ String getCallToAction() = 3;
+ String getAdvertiser() = 4;
+ INativeAdImage getLogo() = 5;
+ Bundle getExtras() = 6;
+ void recordImpression() = 7;
+ void performClick(in Bundle clickData) = 8;
+ void reportTouchEvent(in Bundle touchData) = 9;
+ IVideoController getVideoController() = 10;
+ IObjectWrapper getMediaContent() = 11;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeCustomTemplateAd.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeCustomTemplateAd.aidl
new file mode 100644
index 0000000000..8ad51cf7e7
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/INativeCustomTemplateAd.aidl
@@ -0,0 +1,22 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.ads.internal.client.IVideoController;
+import com.google.android.gms.ads.internal.formats.client.INativeAdImage;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface INativeCustomTemplateAd {
+ List getAvailableAssetNames() = 0;
+ String getCustomTemplateId() = 1;
+ String getText(String assetName) = 2;
+ INativeAdImage getImage(String assetName) = 3;
+ void performClick(String assetName) = 4;
+ void recordImpression() = 5;
+ IVideoController getVideoController() = 6;
+ IObjectWrapper getMediaContent() = 7;
+ IObjectWrapper getDisplayOpenMeasurement() = 8;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnAppInstallAdLoadedListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnAppInstallAdLoadedListener.aidl
new file mode 100644
index 0000000000..494f54faeb
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnAppInstallAdLoadedListener.aidl
@@ -0,0 +1,12 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.ads.internal.formats.client.INativeAppInstallAd;
+
+interface IOnAppInstallAdLoadedListener {
+ void onAppInstallAdLoaded(INativeAppInstallAd ad) = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnContentAdLoadedListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnContentAdLoadedListener.aidl
new file mode 100644
index 0000000000..c35c6ed091
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnContentAdLoadedListener.aidl
@@ -0,0 +1,12 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.ads.internal.formats.client.INativeContentAd;
+
+interface IOnContentAdLoadedListener {
+ void onContentAdLoaded(INativeContentAd ad) = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnCustomClickListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnCustomClickListener.aidl
new file mode 100644
index 0000000000..b0ec913130
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnCustomClickListener.aidl
@@ -0,0 +1,12 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.ads.internal.formats.client.INativeCustomTemplateAd;
+
+interface IOnCustomClickListener {
+ void onCustomClick(INativeCustomTemplateAd ad, String assetName) = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnCustomTemplateAdLoadedListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnCustomTemplateAdLoadedListener.aidl
new file mode 100644
index 0000000000..6b82dc26f6
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnCustomTemplateAdLoadedListener.aidl
@@ -0,0 +1,12 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.ads.internal.formats.client.INativeCustomTemplateAd;
+
+interface IOnCustomTemplateAdLoadedListener {
+ void onCustomTemplateAdLoaded(INativeCustomTemplateAd ad) = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnPublisherAdViewLoadedListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnPublisherAdViewLoadedListener.aidl
new file mode 100644
index 0000000000..18617588b9
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnPublisherAdViewLoadedListener.aidl
@@ -0,0 +1,12 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface IOnPublisherAdViewLoadedListener {
+ void onPublisherAdViewLoaded(IObjectWrapper view) = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnUnifiedNativeAdLoadedListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnUnifiedNativeAdLoadedListener.aidl
new file mode 100644
index 0000000000..cfa2235d33
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IOnUnifiedNativeAdLoadedListener.aidl
@@ -0,0 +1,12 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import com.google.android.gms.ads.internal.formats.client.IUnifiedNativeAd;
+
+interface IOnUnifiedNativeAdLoadedListener {
+ void onUnifiedNativeAdLoaded(IUnifiedNativeAd ad) = 0;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IUnifiedNativeAd.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IUnifiedNativeAd.aidl
new file mode 100644
index 0000000000..3fc4c948a5
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/formats/client/IUnifiedNativeAd.aidl
@@ -0,0 +1,36 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats.client;
+
+import android.os.Bundle;
+import com.google.android.gms.ads.internal.client.IVideoController;
+import com.google.android.gms.ads.internal.client.IResponseInfo;
+import com.google.android.gms.ads.internal.formats.client.INativeAdImage;
+import com.google.android.gms.ads.internal.formats.client.IAttributionInfo;
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface IUnifiedNativeAd {
+ String getHeadline() = 0;
+ List getImages() = 1;
+ String getBody() = 2;
+ INativeAdImage getIcon() = 3;
+ String getCallToAction() = 4;
+ double getStarRating() = 5;
+ String getStore() = 6;
+ String getPrice() = 7;
+ String getAdvertiser() = 8;
+ Bundle getExtras() = 9;
+ IVideoController getVideoController() = 10;
+ float getMediaContentAspectRatio() = 11;
+ IResponseInfo getResponseInfo() = 12;
+ IAttributionInfo getAttributionInfo() = 13;
+ void recordImpression() = 14;
+ void performClick(in Bundle clickData) = 15;
+ void reportTouchEvent(in Bundle touchData) = 16;
+ void cancelUnconfirmedClick() = 17;
+ void recordCustomClickGesture() = 18;
+ IObjectWrapper getMediaContent() = 19;
+}
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/initialization/IInitializationCallback.aidl
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/InstreamAdConfigurationParcel.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/InstreamAdConfigurationParcel.aidl
new file mode 100644
index 0000000000..50dd790e67
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/InstreamAdConfigurationParcel.aidl
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.instream;
+
+parcelable InstreamAdConfigurationParcel;
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/client/IInstreamAd.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/client/IInstreamAd.aidl
new file mode 100644
index 0000000000..463828ea26
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/client/IInstreamAd.aidl
@@ -0,0 +1,14 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.instream.client;
+
+import com.google.android.gms.dynamic.IObjectWrapper;
+
+interface IInstreamAd {
+ void destroy() = 0;
+ IObjectWrapper getMediaContent() = 1;
+ float getAspectRatio() = 2;
+}
diff --git a/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/client/IInstreamAdLoadCallback.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/client/IInstreamAdLoadCallback.aidl
new file mode 100644
index 0000000000..d66d32240a
--- /dev/null
+++ b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/instream/client/IInstreamAdLoadCallback.aidl
@@ -0,0 +1,13 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.instream.client;
+
+import com.google.android.gms.ads.internal.instream.client.IInstreamAd;
+
+interface IInstreamAdLoadCallback {
+ void onInstreamAdLoaded(IInstreamAd ad) = 0;
+ void onInstreamAdFailedToLoad(int errorCode) = 1;
+}
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/mediation/client/IAdapterCreator.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardItem.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAd.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCallback.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdCreator.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdLoadCallback.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/internal/rewarded/client/IRewardedAdSkuListener.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/measurement/IAppMeasurementProxy.aidl
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl b/play-services-ads-api/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl
similarity index 100%
rename from play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl
rename to play-services-ads-api/src/main/aidl/com/google/android/gms/ads/measurement/IMeasurementManager.aidl
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/AdLoader.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/AdLoader.java
new file mode 100644
index 0000000000..9232de3d25
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/AdLoader.java
@@ -0,0 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads;
+
+public class AdLoader {
+}
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/admanager/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/admanager/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/admanager/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/admanager/package-info.java
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/formats/AdManagerAdViewOptions.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/formats/AdManagerAdViewOptions.java
new file mode 100644
index 0000000000..f04671e553
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/formats/AdManagerAdViewOptions.java
@@ -0,0 +1,45 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ * Notice: Portions of this file are reproduced from work created and shared by Google and used
+ * according to terms described in the Creative Commons 4.0 Attribution License.
+ * See https://developers.google.com/readme/policies for details.
+ */
+
+package com.google.android.gms.ads.formats;
+
+import android.os.Parcel;
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.ads.AdLoader;
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+/**
+ * Options to configure Google Ad Manager banner requests using an {@link AdLoader}.
+ */
+@SafeParcelable.Class
+public final class AdManagerAdViewOptions extends AbstractSafeParcelable {
+ @Field(1)
+ public final boolean manualImpressionsEnabled;
+
+ @Constructor
+ AdManagerAdViewOptions(@Param(1) boolean manualImpressionsEnabled) {
+ this.manualImpressionsEnabled = manualImpressionsEnabled;
+ }
+
+ /**
+ * Returns {@code true} if manual impression reporting is enabled.
+ */
+ public boolean getManualImpressionsEnabled() {
+ return manualImpressionsEnabled;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(AdManagerAdViewOptions.class);
+}
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/formats/PublisherAdViewOptions.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/formats/PublisherAdViewOptions.java
new file mode 100644
index 0000000000..9bdcef6806
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/formats/PublisherAdViewOptions.java
@@ -0,0 +1,34 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.formats;
+
+import android.os.IBinder;
+import android.os.Parcel;
+import androidx.annotation.NonNull;
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+/**
+ * Ad Manager publisher ad view options passed to {@code IAdLoaderBuilder.setPublisherAdViewOptions}.
+ */
+@Deprecated
+@SafeParcelable.Class
+public final class PublisherAdViewOptions extends AbstractSafeParcelable {
+ @Field(1)
+ public boolean manualImpressionsEnabled;
+ @Field(2)
+ public IBinder appEventListener;
+ @Field(3)
+ public IBinder delayedBannerAdListener;
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PublisherAdViewOptions.class);
+}
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/h5/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/h5/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/h5/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/h5/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/initialization/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/initialization/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/initialization/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/initialization/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdDataParcel.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdErrorParcel.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdRequestParcel.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdapterResponseInfoParcel.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/AdapterStatusParcel.java
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java
new file mode 100644
index 0000000000..1e660fb6a3
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java
@@ -0,0 +1,35 @@
+/*
+ * SPDX-FileCopyrightText: 2023 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal;
+
+import android.os.Parcel;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+@SafeParcelable.Class
+public class RequestConfigurationParcel extends AbstractSafeParcelable {
+ @Field(1)
+ public final int tagForChildDirectedTreatment;
+ @Field(2)
+ public final int tagForUnderAgeOfConsent;
+
+ @Constructor
+ RequestConfigurationParcel(@Param(1) int tagForChildDirectedTreatment, @Param(2) int tagForUnderAgeOfConsent) {
+ this.tagForChildDirectedTreatment = tagForChildDirectedTreatment;
+ this.tagForUnderAgeOfConsent = tagForUnderAgeOfConsent;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(RequestConfigurationParcel.class);
+}
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/SearchAdRequestParcel.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/ServerSideVerificationOptionsParcel.java
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/AdSizeParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/AdSizeParcel.java
new file mode 100644
index 0000000000..27c3645955
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/AdSizeParcel.java
@@ -0,0 +1,59 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import android.os.Parcel;
+import androidx.annotation.NonNull;
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+/**
+ * Ad size (AdMob {@code AdSize}) passed to {@code IAdLoaderBuilder.forPublisherAdView} and used by the
+ * banner ad manager.
+ */
+@SafeParcelable.Class
+public class AdSizeParcel extends AbstractSafeParcelable {
+ @Field(2)
+ public String formatString;
+ @Field(3)
+ public int height;
+ @Field(4)
+ public int heightPixels;
+ @Field(5)
+ public boolean autoHeight;
+ @Field(6)
+ public int width;
+ @Field(7)
+ public int widthPixels;
+ @Field(8)
+ public AdSizeParcel[] shortcuts;
+ @Field(9)
+ public boolean isFluid;
+ @Field(10)
+ public boolean isAutoHeightSmartBanner;
+ @Field(11)
+ public boolean isDynamicBanner;
+ @Field(12)
+ public boolean isFullWidth;
+ @Field(13)
+ public boolean isAutoMediation;
+ @Field(14)
+ public boolean isParcelStateValid;
+ @Field(15)
+ public boolean isAdaptiveBanner;
+ @Field(16)
+ public boolean isInlineAdaptiveBanner;
+ @Field(17)
+ public boolean isCollapsible;
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(AdSizeParcel.class);
+}
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/AdValueParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/AdValueParcel.java
new file mode 100644
index 0000000000..2772cfe1d4
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/AdValueParcel.java
@@ -0,0 +1,34 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import android.os.Parcel;
+import androidx.annotation.NonNull;
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+/**
+ * Ad value (AdMob {@code AdValue}) delivered to {@code IOnPaidEventListener.onPaidEvent}.
+ */
+@SafeParcelable.Class
+public class AdValueParcel extends AbstractSafeParcelable {
+ @Field(1)
+ public int adType;
+ @Field(2)
+ public int precisionType;
+ @Field(3)
+ public String currencyCode;
+ @Field(4)
+ public long valueMicros;
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(AdValueParcel.class);
+}
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/VideoOptionsParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/VideoOptionsParcel.java
new file mode 100644
index 0000000000..7db887515d
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/client/VideoOptionsParcel.java
@@ -0,0 +1,32 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.client;
+
+import android.os.Parcel;
+import androidx.annotation.NonNull;
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+/**
+ * Video options (AdMob {@code VideoOptions}) nested inside {@link NativeAdOptionsParcel}.
+ */
+@SafeParcelable.Class
+public class VideoOptionsParcel extends AbstractSafeParcelable {
+ @Field(2)
+ public boolean startMuted;
+ @Field(3)
+ public boolean customControlsRequested;
+ @Field(4)
+ public boolean clickToExpandRequested;
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(VideoOptionsParcel.class);
+}
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/formats/NativeAdOptionsParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/formats/NativeAdOptionsParcel.java
new file mode 100644
index 0000000000..4cd3fe0d11
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/formats/NativeAdOptionsParcel.java
@@ -0,0 +1,49 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.formats;
+
+import android.os.Parcel;
+import androidx.annotation.NonNull;
+import com.google.android.gms.ads.internal.client.VideoOptionsParcel;
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+/**
+ * Native ad options (AdMob {@code NativeAdOptions}) passed to {@code IAdLoaderBuilder.setNativeAdOptions}.
+ */
+@SafeParcelable.Class
+public class NativeAdOptionsParcel extends AbstractSafeParcelable {
+ @Field(1)
+ public int versionCode = 6;
+ @Field(2)
+ public boolean returnUrlsForImageAssets;
+ @Field(3)
+ public int imageOrientation;
+ @Field(4)
+ public boolean requestMultipleImages;
+ @Field(5)
+ public int adChoicesPlacement;
+ @Field(6)
+ public VideoOptionsParcel videoOptions;
+ @Field(7)
+ public boolean requestCustomMuteThisAd;
+ @Field(8)
+ public int mediaAspectRatio;
+ @Field(9)
+ public int swipeGestureDirection;
+ @Field(10)
+ public boolean customClickGestureEnabled;
+ @Field(11)
+ public int customClickGestureDirection;
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(NativeAdOptionsParcel.class);
+}
diff --git a/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/instream/InstreamAdConfigurationParcel.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/instream/InstreamAdConfigurationParcel.java
new file mode 100644
index 0000000000..219860d817
--- /dev/null
+++ b/play-services-ads-api/src/main/java/com/google/android/gms/ads/internal/instream/InstreamAdConfigurationParcel.java
@@ -0,0 +1,34 @@
+/*
+ * SPDX-FileCopyrightText: 2026 microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package com.google.android.gms.ads.internal.instream;
+
+import android.os.Parcel;
+import androidx.annotation.NonNull;
+import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
+import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
+
+/**
+ * Instream ad configuration passed to {@code IAdLoaderBuilder.forInstreamAd}.
+ */
+@SafeParcelable.Class
+public class InstreamAdConfigurationParcel extends AbstractSafeParcelable {
+ @Field(1000)
+ public int versionCode;
+ @Field(1)
+ public int instreamAdType;
+ @Field(2)
+ public String adTagUrl;
+ @Field(3)
+ public int timeoutMillis;
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ CREATOR.writeToParcel(this, dest, flags);
+ }
+
+ public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(InstreamAdConfigurationParcel.class);
+}
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/interstitial/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/interstitial/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/interstitial/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/interstitial/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/mediation/customevent/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/mediation/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/mediation/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/mediation/rtb/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/nativead/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/nativead/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/nativead/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/nativead/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewarded/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/rewarded/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewarded/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/rewarded/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/rewardedinterstitial/package-info.java
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/search/package-info.java b/play-services-ads-api/src/main/java/com/google/android/gms/ads/search/package-info.java
similarity index 100%
rename from play-services-ads-lite/src/main/java/com/google/android/gms/ads/search/package-info.java
rename to play-services-ads-api/src/main/java/com/google/android/gms/ads/search/package-info.java
diff --git a/play-services-ads-lite/build.gradle b/play-services-ads-lite/build.gradle
index 1c8dbe17a8..a38f75067d 100644
--- a/play-services-ads-lite/build.gradle
+++ b/play-services-ads-lite/build.gradle
@@ -8,7 +8,7 @@ apply plugin: 'maven-publish'
apply plugin: 'signing'
android {
- namespace "com.google.android.gms.ads"
+ namespace "com.google.android.gms.ads_lite"
compileSdkVersion androidCompileSdk
buildToolsVersion "$androidBuildVersionTools"
@@ -34,9 +34,6 @@ apply from: '../gradle/publish-android.gradle'
description = 'microG implementation of play-services-ads-lite'
dependencies {
- api 'androidx.work:work-runtime:2.7.0'
- api project(':play-services-ads-base')
- api project(':play-services-basement')
-// api project(':play-services-measurement-sdk-api')
-// api project(':user-messaging-platform')
+ // Dependencies from play-services-ads-lite:25.0.0
+ api project(':play-services-ads-api')
}
diff --git a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt b/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt
deleted file mode 100644
index 398956f8c0..0000000000
--- a/play-services-ads-lite/core/src/main/kotlin/com/google/android/gms/ads/AdManagerCreatorImpl.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2023 microG Project Team
- * SPDX-License-Identifier: Apache-2.0
- */
-package com.google.android.gms.ads
-
-import android.os.Parcel
-import androidx.annotation.Keep
-import org.microg.gms.utils.warnOnTransactionIssues
-
-private const val TAG = "AdManager"
-
-@Keep
-class AdManagerCreatorImpl : AdManagerCreator.Stub() {
- override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean =
- warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) }
-}
diff --git a/play-services-ads-lite/src/main/AndroidManifest.xml b/play-services-ads-lite/src/main/AndroidManifest.xml
index 1b55c5b813..3408ac9209 100644
--- a/play-services-ads-lite/src/main/AndroidManifest.xml
+++ b/play-services-ads-lite/src/main/AndroidManifest.xml
@@ -4,23 +4,5 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/AdManagerCreator.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/AdManagerCreator.aidl
deleted file mode 100644
index 7e07dd018c..0000000000
--- a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/AdManagerCreator.aidl
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.google.android.gms.ads;
-
-interface AdManagerCreator {
-}
\ No newline at end of file
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl
deleted file mode 100644
index f468200741..0000000000
--- a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IMobileAdsSettingManagerCreator.aidl
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.google.android.gms.ads.internal.client;
-
-import com.google.android.gms.dynamic.IObjectWrapper;
-
-interface IMobileAdsSettingManagerCreator {
- IBinder getMobileAdsSettingManager(IObjectWrapper context, int clientVersion);
-}
\ No newline at end of file
diff --git a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl b/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl
deleted file mode 100644
index 8f2d342450..0000000000
--- a/play-services-ads-lite/src/main/aidl/com/google/android/gms/ads/internal/client/IOnPaidEventListener.aidl
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.google.android.gms.ads.internal.client;
-
-import com.google.android.gms.ads.internal.AdErrorParcel;
-
-interface IOnPaidEventListener {
-}
\ No newline at end of file
diff --git a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java b/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java
deleted file mode 100644
index f773f34868..0000000000
--- a/play-services-ads-lite/src/main/java/com/google/android/gms/ads/internal/RequestConfigurationParcel.java
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2023 microG Project Team
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package com.google.android.gms.ads.internal;
-
-import org.microg.safeparcel.AutoSafeParcelable;
-
-public class RequestConfigurationParcel extends AutoSafeParcelable {
- public static final Creator CREATOR = new AutoCreator<>(RequestConfigurationParcel.class);
-}
diff --git a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl
index de75deffa5..7b7e909a4f 100644
--- a/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl
+++ b/play-services-api/src/main/aidl/com/google/android/gms/semanticlocation/internal/ISemanticLocationService.aidl
@@ -6,6 +6,7 @@ package com.google.android.gms.semanticlocation.internal;
import android.app.PendingIntent;
import android.os.IInterface;
+import com.google.android.gms.common.api.ApiMetadata;
import com.google.android.gms.semanticlocation.SemanticLocationEventRequest;
import com.google.android.gms.semanticlocation.internal.SemanticLocationParameters;
import com.google.android.gms.common.api.internal.IStatusCallback;
@@ -15,4 +16,6 @@ interface ISemanticLocationService {
void unregisterSemanticLocationEvents(in SemanticLocationParameters params, IStatusCallback callback, in PendingIntent pendingIntent) = 1;
void setIncognitoMode(in SemanticLocationParameters params, IStatusCallback callback, boolean mode) = 4;
+
+ void setIncognitoModeWithMetadata(in SemanticLocationParameters params, IStatusCallback callback, boolean mode, in ApiMetadata metadata) = 5;
}
\ No newline at end of file
diff --git a/play-services-auth-blockstore/core/src/main/kotlin/org/microg/gms/auth/blockstore/BlockstoreApiService.kt b/play-services-auth-blockstore/core/src/main/kotlin/org/microg/gms/auth/blockstore/BlockstoreApiService.kt
index 299628a836..7ef1430fab 100644
--- a/play-services-auth-blockstore/core/src/main/kotlin/org/microg/gms/auth/blockstore/BlockstoreApiService.kt
+++ b/play-services-auth-blockstore/core/src/main/kotlin/org/microg/gms/auth/blockstore/BlockstoreApiService.kt
@@ -78,11 +78,7 @@ class BlobstoreServiceImpl(val blockStore: BlockStoreImpl, override val lifecycl
lifecycleScope.launch {
runCatching {
val retrieveBytes = blockStore.retrieveBytes()
- if (retrieveBytes != null) {
- callback?.onBytesResult(Status.SUCCESS, retrieveBytes)
- } else {
- callback?.onBytesResult(Status.INTERNAL_ERROR, null)
- }
+ callback?.onBytesResult(Status.SUCCESS, retrieveBytes)
}
}
}
@@ -142,11 +138,7 @@ class BlobstoreServiceImpl(val blockStore: BlockStoreImpl, override val lifecycl
runCatching {
val retrieveBytesResponse = blockStore.retrieveBytesWithRequest(request)
Log.d(TAG, "retrieveBytesWithRequest: retrieveBytesResponse: $retrieveBytesResponse")
- if (retrieveBytesResponse != null) {
- callback?.onResponseResult(Status.SUCCESS, retrieveBytesResponse)
- } else {
- callback?.onResponseResult(Status.INTERNAL_ERROR, RetrieveBytesResponse(Bundle.EMPTY, emptyList()))
- }
+ callback?.onResponseResult(Status.SUCCESS, retrieveBytesResponse ?: RetrieveBytesResponse(Bundle.EMPTY, emptyList()))
}
}
}
diff --git a/play-services-base/core/src/main/kotlin/org/microg/gms/common/KnownGooglePackages.kt b/play-services-base/core/src/main/kotlin/org/microg/gms/common/KnownGooglePackages.kt
index 2e7d2a7493..6a592e6f25 100644
--- a/play-services-base/core/src/main/kotlin/org/microg/gms/common/KnownGooglePackages.kt
+++ b/play-services-base/core/src/main/kotlin/org/microg/gms/common/KnownGooglePackages.kt
@@ -210,6 +210,12 @@ private val KNOWN_GOOGLE_PACKAGES = mapOf(
PackageAndCertHash("com.waymo.carapp", SHA256, "c600dafe48f6ee770dd814261bd4b64708bc19dd014322107b58e836d8f2634e"),
setOf(ACCOUNT, AUTH, OWNER)
),
+
+ // YT Create
+ Pair(
+ PackageAndCertHash("com.google.android.apps.youtube.producer", SHA256, "5faeab9198730e9ef1f2312f742d66095632bffa7cc74f5d5c8280cb0b184e9d"),
+ setOf(ACCOUNT, AUTH, OWNER)
+ ),
)
fun isGooglePackage(pkg: PackageAndCertHash): Boolean {
diff --git a/play-services-conscrypt-provider-core/src/main/java/com/google/android/gms/providerinstaller/ProviderInstallerImpl.java b/play-services-conscrypt-provider-core/src/main/java/com/google/android/gms/providerinstaller/ProviderInstallerImpl.java
index 175efc6046..818270862d 100644
--- a/play-services-conscrypt-provider-core/src/main/java/com/google/android/gms/providerinstaller/ProviderInstallerImpl.java
+++ b/play-services-conscrypt-provider-core/src/main/java/com/google/android/gms/providerinstaller/ProviderInstallerImpl.java
@@ -110,13 +110,13 @@ private static void initProvider(Context context, String packageName) {
Log.d(TAG, "Initializing provider for " + packageName);
try {
- provider = Conscrypt.newProviderBuilder().setName(PROVIDER_NAME).defaultTlsProtocol("TLSv1.2").build();
+ provider = Conscrypt.newProviderBuilder().setName(PROVIDER_NAME).defaultTlsProtocol("TLSv1.3").build();
} catch (UnsatisfiedLinkError e) {
Log.w(TAG, "Could not link conscrypt via default loader, trying manual loading");
try {
loadConscryptDirect(context, packageName);
- provider = Conscrypt.newProviderBuilder().setName(PROVIDER_NAME).defaultTlsProtocol("TLSv1.2").build();
+ provider = Conscrypt.newProviderBuilder().setName(PROVIDER_NAME).defaultTlsProtocol("TLSv1.3").build();
} catch (Exception e2) {
Log.w(TAG, e2);
}
diff --git a/play-services-core/build.gradle b/play-services-core/build.gradle
index a348337ce1..967b2d442b 100644
--- a/play-services-core/build.gradle
+++ b/play-services-core/build.gradle
@@ -21,8 +21,8 @@ dependencies {
implementation project(':firebase-dynamic-links')
implementation project(':firebase-auth-core')
implementation project(':play-services-ads-core')
+ implementation project(':play-services-ads-api-core')
implementation project(':play-services-ads-identifier-core')
- implementation project(':play-services-ads-lite-core')
implementation project(':play-services-appinvite-core')
implementation project(':play-services-appset-core')
implementation project(':play-services-auth-api-phone-core')
diff --git a/play-services-core/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationService.kt b/play-services-core/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationService.kt
index c0bd6946e5..a0c007804f 100644
--- a/play-services-core/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationService.kt
+++ b/play-services-core/src/main/java/com/google/android/gms/semanticlocation/SemanticLocationService.kt
@@ -8,6 +8,9 @@ import android.app.PendingIntent
import android.util.Log
import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.Feature
+import com.google.android.gms.common.api.ApiMetadata
+import com.google.android.gms.common.api.CommonStatusCodes
+import com.google.android.gms.common.api.Status
import com.google.android.gms.common.api.internal.IStatusCallback
import com.google.android.gms.common.internal.ConnectionInfo
import com.google.android.gms.common.internal.GetServiceRequest
@@ -47,13 +50,21 @@ class SemanticLocationServiceImpl : ISemanticLocationService.Stub() {
pendingIntent: PendingIntent
) {
Log.d(TAG, "registerSemanticLocationEvents: $params")
+ callback.onResult(Status(CommonStatusCodes.SUCCESS))
}
override fun setIncognitoMode(params: SemanticLocationParameters, callback: IStatusCallback, mode: Boolean) {
- Log.d(TAG, "setIncognitoMode: $params")
+ Log.d(TAG, "setIncognitoMode (legacy): $params mode=$mode")
+ callback.onResult(Status(CommonStatusCodes.SUCCESS))
+ }
+
+ override fun setIncognitoModeWithMetadata(params: SemanticLocationParameters, callback: IStatusCallback, mode: Boolean, metadata: ApiMetadata) {
+ Log.d(TAG, "setIncognitoModeWithMetadata: $params mode=$mode")
+ callback.onResult(Status(CommonStatusCodes.SUCCESS))
}
override fun unregisterSemanticLocationEvents(params: SemanticLocationParameters, callback: IStatusCallback, pendingIntent: PendingIntent) {
Log.d(TAG, "unregisterSemanticLocationEvents: $params")
+ callback.onResult(Status(CommonStatusCodes.SUCCESS))
}
}
diff --git a/play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java b/play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java
index 0ae8e0e06e..5d5cad784c 100644
--- a/play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java
+++ b/play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java
@@ -17,6 +17,7 @@
package org.microg.gms.ui;
import static org.microg.gms.accountsettings.ui.ExtensionsKt.ACTION_LOCATION_SHARING;
+import static org.microg.gms.accountsettings.ui.ExtensionsKt.EXTRA_ACCOUNT_NAME;
import android.app.Activity;
import android.content.Intent;
@@ -27,6 +28,8 @@
public class LocationSettingsActivity extends Activity {
+ private final static String ACCOUNT_NAME = "account_name";
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -34,6 +37,10 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
if (ACTION_LOCATION_SHARING.equals(getIntent().getAction())) {
Intent intent = new Intent(this, MainActivity.class);
intent.setAction(ACTION_LOCATION_SHARING);
+ Bundle extras = getIntent().getExtras();
+ if (extras != null && extras.containsKey(ACCOUNT_NAME)) {
+ intent.putExtra(EXTRA_ACCOUNT_NAME, extras.getString(ACCOUNT_NAME));
+ }
startActivity(intent);
}
} catch (Exception ignore) {
diff --git a/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt b/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt
index 0e35f62dc6..1ff998726d 100644
--- a/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt
+++ b/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt
@@ -68,6 +68,7 @@ private val SCREEN_ID_TO_URL = hashMapOf(
205 to "https://myaccount.google.com/birthday",
206 to "https://myaccount.google.com/gender",
210 to "https://myaccount.google.com/locationsharing",
+ 212 to "https://myactivity.google.com/activitycontrols",
214 to "https://myaccount.google.com/dashboard",
215 to "https://takeout.google.com",
216 to "https://myaccount.google.com/inactive",
diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/GoogleIdService.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/GoogleIdService.kt
index 36e00c4fdb..ed24e4cb09 100644
--- a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/GoogleIdService.kt
+++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/GoogleIdService.kt
@@ -168,6 +168,9 @@ const val GOOGLE_ID_ANDROIDX_AUTO_SELECT = "androidx.credentials.BUNDLE_KEY_IS_A
const val GOOGLE_ID_BUNDLE_KEY_ID = "com.google.android.libraries.identity.googleid.BUNDLE_KEY_ID"
const val GOOGLE_ID_BUNDLE_KEY_ID_TOKEN = "com.google.android.libraries.identity.googleid.BUNDLE_KEY_ID_TOKEN"
const val GOOGLE_ID_BUNDLE_KEY_DISPLAY_NAME = "com.google.android.libraries.identity.googleid.BUNDLE_KEY_DISPLAY_NAME"
+const val GOOGLE_ID_BUNDLE_KEY_GIVEN_NAME = "com.google.android.libraries.identity.googleid.BUNDLE_KEY_GIVEN_NAME"
+const val GOOGLE_ID_BUNDLE_KEY_FAMILY_NAME = "com.google.android.libraries.identity.googleid.BUNDLE_KEY_FAMILY_NAME"
+const val GOOGLE_ID_BUNDLE_KEY_PHONE_NUMBER = "com.google.android.libraries.identity.googleid.BUNDLE_KEY_PHONE_NUMBER"
const val GOOGLE_ID_BUNDLE_KEY_PROFILE_PICTURE_URI = "com.google.android.libraries.identity.googleid.BUNDLE_KEY_PROFILE_PICTURE_URI"
// Credential types
diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/SignInProxyActivity.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/SignInProxyActivity.kt
index 16ff2da1f4..e598964e87 100644
--- a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/SignInProxyActivity.kt
+++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/provider/SignInProxyActivity.kt
@@ -94,7 +94,10 @@ class SignInProxyActivity : CredentialProviderActivity() {
putString(GOOGLE_ID_BUNDLE_KEY_ID, signInCredential.id)
putString(GOOGLE_ID_BUNDLE_KEY_ID_TOKEN, signInCredential.googleIdToken)
putString(GOOGLE_ID_BUNDLE_KEY_DISPLAY_NAME, signInCredential.displayName)
- putString(GOOGLE_ID_BUNDLE_KEY_PROFILE_PICTURE_URI, signInCredential.profilePictureUri?.toString())
+ putString(GOOGLE_ID_BUNDLE_KEY_GIVEN_NAME, signInCredential.givenName)
+ putString(GOOGLE_ID_BUNDLE_KEY_FAMILY_NAME, signInCredential.familyName)
+ putString(GOOGLE_ID_BUNDLE_KEY_PHONE_NUMBER, signInCredential.phoneNumber)
+ putParcelable(GOOGLE_ID_BUNDLE_KEY_PROFILE_PICTURE_URI, signInCredential.profilePictureUri)
}
val credential = CustomCredential(TYPE_GOOGLE_ID_TOKEN_CREDENTIAL, credentialData)
diff --git a/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt b/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt
index c925faf26f..4374736975 100644
--- a/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt
+++ b/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt
@@ -44,7 +44,19 @@ private val CONFIGURATION_OPTIONS = mapOf(
// Enable Gemini sharing and video features
Flag("45638955", true, 0),
Flag("45621205", true, 0),
- Flag("45616812", true, 0)
+ Flag("45616812", true, 0),
+ // Enable Gemini NotebookLM in AttachmentMenuConfig
+ Flag("45715239", true, 0),
+ Flag("45713945", true, 0),
+ // Enable Gemini related third-party applications
+ Flag("45685960", true, 0),
+ // Enable Gemini temporary chat and more menus.
+ Flag("45737809", true, 0),
+ Flag("45752052", true, 0),
+ Flag("45762487", true, 0),
+ Flag("45726191", true, 0),
+ // Enable Gemini show Usage-limits
+ Flag("45778691", true, 0),
),
"com.google.android.inputmethod.latin#com.google.android.inputmethod.latin" to arrayOf(
// Enable Gboard supports voice input in other languages
@@ -78,6 +90,22 @@ private val CONFIGURATION_OPTIONS = mapOf(
"com.google.android.apps.photos" to arrayOf(
Flag("45617431", true, 0),
),
+ "com.google.android.apps.translate" to arrayOf(
+ // Enable Practice Tab
+ Flag("SpeakEasy__enabled", true, 0),
+ // Enable Layout adjustment
+ Flag("OpenMic__enable_open_mic_2_august_launch_ui", true, 0),
+ // Enable Handwriting Improvements
+ Flag("HandwritingImprovements__enable_handwriting_improvements", true, 0),
+ ),
+ "com.google.labs.language.tailwind.mobile#com.google.android.apps.labs.language.tailwind" to arrayOf(
+ // Enable NotebookLM video overview
+ Flag("45741830", true, 0),
+ ),
+ "com.google.android.apps.messaging#com.google.android.apps.messaging" to arrayOf(
+ Flag("bugle_phenotype__enable_penpal_conversation", true, 0),
+ Flag("bugle_phenotype__bug_325090692_enable_penpal_dasher_check", false, 0),
+ ),
)
class PhenotypeServiceImpl(val packageName: String?) : IPhenotypeService.Stub() {
diff --git a/play-services-core/src/main/kotlin/org/microg/gms/udc/ActivityControlSettings.kt b/play-services-core/src/main/kotlin/org/microg/gms/udc/ActivityControlSettings.kt
index 662a823194..87a2268d61 100644
--- a/play-services-core/src/main/kotlin/org/microg/gms/udc/ActivityControlSettings.kt
+++ b/play-services-core/src/main/kotlin/org/microg/gms/udc/ActivityControlSettings.kt
@@ -14,6 +14,7 @@ private enum class Controls(val id: Int) {
CALL_LOG(6),
CONTACT(9),
CALENDAR(10),
+ LOCATION_HISTORY(13),
CAMERA(15),
MICROPHONE(17),
STORAGE(18),
@@ -31,6 +32,7 @@ private enum class Controls(val id: Int) {
private val ALLOW_CONTROLS_PACKAGES = mapOf(
Pair("com.google.android.googlequicksearchbox", setOf(Controls.STORAGE, Controls.MICROPHONE, Controls.SYSTEM_WINDOW_OVERLAY)),
+ Pair("com.google.android.apps.maps", setOf(Controls.APP_USAGE_TIME, Controls.CALENDAR, Controls.CONTACT, Controls.LOCATION_HISTORY, Controls.SYSTEM_WINDOW_OVERLAY)),
)
fun getAllowControlsByPackage(packageName: String) : ByteArray? {
diff --git a/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/controller/HybridAuthenticatorController.kt b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/controller/HybridAuthenticatorController.kt
index 398d73226d..48995bb53f 100644
--- a/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/controller/HybridAuthenticatorController.kt
+++ b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/controller/HybridAuthenticatorController.kt
@@ -17,7 +17,6 @@ import com.upokecenter.cbor.CBORObject
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.suspendCancellableCoroutine
import org.microg.gms.fido.core.RequestHandlingException
-import org.microg.gms.fido.core.hybrid.CtapError
import org.microg.gms.fido.core.hybrid.HandshakePhase
import org.microg.gms.fido.core.hybrid.ble.HybridBleAdvertiser
import org.microg.gms.fido.core.hybrid.generateEcKeyPair
@@ -39,6 +38,7 @@ import org.microg.gms.fido.core.protocol.msgs.AuthenticatorMakeCredentialRequest
import org.microg.gms.fido.core.protocol.msgs.Ctap2CommandCode
import org.microg.gms.fido.core.protocol.msgs.Ctap2Request
import org.microg.gms.fido.core.protocol.msgs.Ctap2Response
+import org.microg.gms.fido.core.transport.CtapStatus
import java.io.ByteArrayInputStream
import java.security.interfaces.ECPrivateKey
import java.security.interfaces.ECPublicKey
@@ -214,7 +214,7 @@ class HybridAuthenticatorController(context: Context) {
val crypt = this.crypter ?: error("Crypter not initialized (handshake incomplete)")
val decrypted = crypt.decrypt(data) ?: error("Failed to decrypt CTAP request")
if (decrypted.isEmpty()) {
- ws?.sendCtapResponse(byteArrayOf(CtapError.INVALID_LENGTH.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP1_ERR_INVALID_LENGTH.code))
return null
}
val frameType = decrypted[0].toInt() and 0xFF
@@ -235,12 +235,12 @@ class HybridAuthenticatorController(context: Context) {
}
if (frameType == 0x01) {
if (decrypted.size < 2) {
- ws?.sendCtapResponse(byteArrayOf(CtapError.INVALID_CBOR.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP2_ERR_INVALID_CBOR.code))
return null
}
val commandCode = Ctap2CommandCode.entries.find { it.byte == decrypted[1] }
if (commandCode == null) {
- ws?.sendCtapResponse(byteArrayOf(CtapError.INVALID_COMMAND.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP1_ERR_INVALID_COMMAND.code))
return null
}
val params = if (decrypted.size > 2) {
@@ -258,7 +258,7 @@ class HybridAuthenticatorController(context: Context) {
val request = when (commandCode) {
Ctap2CommandCode.AuthenticatorMakeCredential -> {
if (params == null) {
- ws?.sendCtapResponse(byteArrayOf(CtapError.MISSING_PARAMETER.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP2_ERR_MISSING_PARAMETER.code))
return null
}
AuthenticatorMakeCredentialRequest.decodeFromCbor(params)
@@ -266,7 +266,7 @@ class HybridAuthenticatorController(context: Context) {
Ctap2CommandCode.AuthenticatorGetAssertion -> {
if (params == null) {
- ws?.sendCtapResponse(byteArrayOf(CtapError.MISSING_PARAMETER.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP2_ERR_MISSING_PARAMETER.code))
return null
}
AuthenticatorGetAssertionRequest.decodeFromCbor(params)
@@ -277,7 +277,7 @@ class HybridAuthenticatorController(context: Context) {
}
else -> {
- ws?.sendCtapResponse(byteArrayOf(CtapError.INVALID_COMMAND.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP1_ERR_INVALID_COMMAND.code))
return null
}
}
@@ -286,7 +286,7 @@ class HybridAuthenticatorController(context: Context) {
Log.d(TAG, "Request: $request")
Log.d(TAG, "Response: $response")
if (response == null) {
- ws?.sendCtapResponse(byteArrayOf(CtapError.OTHER_ERROR.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP1_ERR_OTHER.code))
return null
}
val responseBytes = byteArrayOf(0) + response.encodePayloadAsCbor().EncodeToBytes()
@@ -294,7 +294,7 @@ class HybridAuthenticatorController(context: Context) {
return responseBytes
} catch (e: Exception) {
Log.w(TAG, "error handling request: ", e)
- ws?.sendCtapResponse(byteArrayOf(CtapError.OTHER_ERROR.value))
+ ws?.sendCtapResponse(byteArrayOf(CtapStatus.CTAP1_ERR_OTHER.code))
return null
}
}
diff --git a/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/extensions.kt b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/extensions.kt
index c89272b224..f3ded2fab3 100644
--- a/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/extensions.kt
+++ b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/hybrid/extensions.kt
@@ -19,9 +19,6 @@ import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
enum class HandshakePhase { NONE, CLIENT_HELLO_SENT, READY }
-enum class CtapError(val value: Byte) {
- SUCCESS(0x00), INVALID_COMMAND(0x01), INVALID_LENGTH(0x03), INVALID_CBOR(0x12), MISSING_PARAMETER(0x14), OTHER_ERROR(0x7F),
-}
const val HKDF_ALGORITHM = "HmacSHA256"
const val AEMK_ALGORITHM = "AES"
diff --git a/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapConnection.kt b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapConnection.kt
index 82e1a8751d..1d6bd2a489 100644
--- a/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapConnection.kt
+++ b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapConnection.kt
@@ -5,8 +5,6 @@
package org.microg.gms.fido.core.transport
-import com.google.android.gms.fido.fido2.api.common.ErrorCode
-import org.microg.gms.fido.core.RequestHandlingException
import org.microg.gms.fido.core.protocol.msgs.*
const val CAPABILITY_CTAP_1 = 1 shl 0
@@ -43,4 +41,5 @@ interface CtapConnection {
suspend fun runCommand(command: Ctap2Command): S
}
-class Ctap2StatusException(val status: Byte) : Exception("Received status ${(status.toInt() and 0xff).toString(16)}")
+class Ctap2StatusException(val status: Byte) :
+ Exception("Received ${CtapStatus.description(status)}")
diff --git a/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapStatus.kt b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapStatus.kt
new file mode 100644
index 0000000000..820276d068
--- /dev/null
+++ b/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/CtapStatus.kt
@@ -0,0 +1,74 @@
+package org.microg.gms.fido.core.transport
+
+/**
+ * CTAP status code to value
+ *
+ * See https://fidoalliance.org/specs/fido-v2.2-ps-20250714/fido-client-to-authenticator-protocol-v2.2-ps-20250714.html#error-responses
+ */
+enum class CtapStatus(val code: Byte, val description: String) {
+ // CTAP2_OK
+ CTAP1_ERR_SUCCESS(0x00, "Indicates successful response."),
+ CTAP1_ERR_INVALID_COMMAND(0x01, "The command is not a valid CTAP command."),
+ CTAP1_ERR_INVALID_PARAMETER(0x02, "The command included an invalid parameter."),
+ CTAP1_ERR_INVALID_LENGTH(0x03, "Invalid message or item length."),
+ CTAP1_ERR_INVALID_SEQ(0x04, "Invalid message sequencing."),
+ CTAP1_ERR_TIMEOUT(0x05, "Message timed out."),
+ CTAP1_ERR_CHANNEL_BUSY(0x06, "Channel busy. Client SHOULD retry the request after a short delay."),
+ CTAP1_ERR_LOCK_REQUIRED(0x0A, "Command requires channel lock."),
+ CTAP1_ERR_INVALID_CHANNEL(0x0B, "Command not allowed on this cid."),
+ CTAP2_ERR_CBOR_UNEXPECTED_TYPE(0x11, "Invalid/unexpected CBOR error."),
+ CTAP2_ERR_INVALID_CBOR(0x12, "Error when parsing CBOR."),
+ CTAP2_ERR_MISSING_PARAMETER(0x14, "Missing non-optional parameter."),
+ CTAP2_ERR_LIMIT_EXCEEDED(0x15, "Limit for number of items exceeded."),
+ CTAP2_ERR_FP_DATABASE_FULL(0x17, "Fingerprint data base is full, e.g., during enrollment."),
+ CTAP2_ERR_LARGE_BLOB_STORAGE_FULL(0x18, "Large blob storage is full."),
+ CTAP2_ERR_CREDENTIAL_EXCLUDED(0x19, "Valid credential found in the exclude list."),
+ CTAP2_ERR_PROCESSING(0x21, "Processing (Lengthy operation is in progress)."),
+ CTAP2_ERR_INVALID_CREDENTIAL(0x22, "Credential not valid for the authenticator."),
+ CTAP2_ERR_USER_ACTION_PENDING(0x23, "Authentication is waiting for user interaction."),
+ CTAP2_ERR_OPERATION_PENDING(0x24, "Processing, lengthy operation is in progress."),
+ CTAP2_ERR_NO_OPERATIONS(0x25, "No request is pending."),
+ CTAP2_ERR_UNSUPPORTED_ALGORITHM(0x26, "Authenticator does not support requested algorithm."),
+ CTAP2_ERR_OPERATION_DENIED(0x27, "Not authorized for requested operation."),
+ CTAP2_ERR_KEY_STORE_FULL(0x28, "Internal key storage is full."),
+ CTAP2_ERR_UNSUPPORTED_OPTION(0x2B, "Unsupported option."),
+ CTAP2_ERR_INVALID_OPTION(0x2C, "Not a valid option for current operation."),
+ CTAP2_ERR_KEEPALIVE_CANCEL(0x2D, "Pending keep alive was cancelled."),
+ CTAP2_ERR_NO_CREDENTIALS(0x2E, "No valid credentials provided."),
+ CTAP2_ERR_USER_ACTION_TIMEOUT(0x2F, "A user action timeout occurred."),
+ CTAP2_ERR_NOT_ALLOWED(0x30, "Continuation command, such as, authenticatorGetNextAssertion not allowed."),
+ CTAP2_ERR_PIN_INVALID(0x31, "PIN Invalid."),
+ CTAP2_ERR_PIN_BLOCKED(0x32, "PIN Blocked."),
+ CTAP2_ERR_PIN_AUTH_INVALID(0x33, "PIN authentication,pinUvAuthParam, verification failed."),
+ CTAP2_ERR_PIN_AUTH_BLOCKED(0x34, "PIN authentication using pinUvAuthToken blocked. Requires power cycle to reset."),
+ CTAP2_ERR_PIN_NOT_SET(0x35, "No PIN has been set."),
+ CTAP2_ERR_PUAT_REQUIRED(0x36, "A pinUvAuthToken is required for the selected operation. See also the pinUvAuthToken option ID."),
+ CTAP2_ERR_PIN_POLICY_VIOLATION(0x37, "PIN policy violation. Minimum PIN length or PIN complexity may trigger this error."),
+ CTAP2_ERR_REQUEST_TOO_LARGE(0x39, "Authenticator cannot handle this request due to memory constraints."),
+ CTAP2_ERR_ACTION_TIMEOUT(0x3A, "The current operation has timed out."),
+ CTAP2_ERR_UP_REQUIRED(0x3B, "User presence is required for the requested operation."),
+ CTAP2_ERR_UV_BLOCKED(0x3C, "Built-in user verification is disabled."),
+ CTAP2_ERR_INTEGRITY_FAILURE(0x3D, "A checksum did not match."),
+ CTAP2_ERR_INVALID_SUBCOMMAND(0x3E, "The requested subcommand is either invalid or not implemented."),
+ CTAP2_ERR_UV_INVALID(0x3F, "Built-in user verification unsuccessful. The platform SHOULD retry."),
+ CTAP2_ERR_UNAUTHORIZED_PERMISSION(0x40, "The permissions parameter contains an unauthorized permission."),
+ CTAP1_ERR_OTHER(0x7F, "Other unspecified error."),
+ CTAP2_ERR_SPEC_LAST(0xDF.toByte(), "CTAP 2 spec last error."),
+ CTAP2_ERR_EXTENSION_FIRST(0xE0.toByte(), "Extension specific error."),
+ CTAP2_ERR_EXTENSION_LAST(0xEF.toByte(), "Extension specific error."),
+ CTAP2_ERR_VENDOR_FIRST(0xF0.toByte(), "Vendor specific error."),
+ CTAP2_ERR_VENDOR_LAST(0xFF.toByte(), "Vendor specific error.");
+
+ fun fullDescription() = "$name (${(code.toInt() and 0xff).toString(16)}, $description)"
+
+ companion object {
+ fun fromByte(statusCode: Byte): CtapStatus? {
+ return CtapStatus.entries.firstOrNull {
+ it.code == statusCode
+ }
+ }
+
+ fun description(statusCode: Byte) = fromByte(statusCode)?.fullDescription()
+ ?: "Unknown error (status=${(statusCode.toInt() and 0xff).toString(16)})"
+ }
+}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 1ab99b9000..a5bc84ca3c 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -21,6 +21,7 @@ include ':safe-parcel-processor'
include ':vending-app'
include ':play-services-ads'
+include ':play-services-ads-api'
include ':play-services-ads-base'
include ':play-services-ads-identifier'
include ':play-services-ads-lite'
@@ -79,8 +80,8 @@ sublude ':play-services-basement:ktx'
sublude ':play-services-tasks:ktx'
sublude ':play-services-ads:core'
+sublude ':play-services-ads-api:core'
sublude ':play-services-ads-identifier:core'
-sublude ':play-services-ads-lite:core'
sublude ':play-services-appinvite:core'
sublude ':play-services-appset:core'
sublude ':play-services-auth-api-phone:core'
diff --git a/vending-app/src/main/AndroidManifest.xml b/vending-app/src/main/AndroidManifest.xml
index 3bb7d80b28..801549a9ef 100644
--- a/vending-app/src/main/AndroidManifest.xml
+++ b/vending-app/src/main/AndroidManifest.xml
@@ -123,6 +123,16 @@
android:targetActivity="org.microg.vending.MarketIntentRedirect">
+
+
+
+
+
+
+