# lexilabs-app/basic-ads architecture

> Architecture diagram of the GitHub repository lexilabs-app/basic-ads, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/lexilabs-app/basic-ads
- Repository: https://github.com/lexilabs-app/basic-ads

## Overview

Basic-Ads is a Kotlin Multiplatform AdMob integration for Android and iOS. The principal flow is an app initializing the library, composing or preloading an ad, and receiving readiness and display callbacks. The graph keeps consent, native ads, and the separate ad formats visible alongside that flow. Platform handler behavior is sampled for selected rewarded and native ads; other links reflect README-described capabilities and the source tree, so uncertain internal call wiring is omitted.

Main entry points: [`basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads`](https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads) (Android ad handlers), [`basic-ads/src/iosMain/kotlin/app/lexilabs/basic/ads`](https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/iosMain/kotlin/app/lexilabs/basic/ads) (iOS ad handlers), [`basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/AdState.kt`](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/AdState.kt) (Ad readiness state), [`basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/BasicAds.kt`](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/BasicAds.kt) (Ads initialization)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["Shared API"]
  node_init["Ads initialization<br/>[BasicAds.kt]"]
  node_shared["Shared ad API"]
  node_adstate["Ad readiness state<br/>[AdState.kt]"]
end

subgraph group_compose["Compose Ads"]
  node_bannerui["Banner composables<br/>[BannerAd.kt]"]
  node_preload["Remember ad state"]
  node_fullui["Fullscreen composables<br/>[RewardedAd.kt]"]
  node_fullremember["Fullscreen preload"]
end

subgraph group_handlers["Platform Handlers"]
  node_android["Android ad handlers"]
  node_ios["iOS ad handlers"]
end

subgraph group_native["Native Ads"]
  node_nativeui["Native ad UI<br/>[NativeAd.kt]"]
  node_nativehandler["Native ad handler<br/>[NativeAdHandler.kt]"]
  node_nativedata["Native ad data<br/>[NativeAdData.kt]"]
  node_nativeplatform["Platform native loaders<br/>[NativeAdHandler.kt]"]
end

subgraph group_consent["Consent"]
  node_consentui["Consent composables<br/>[ConsentPopup.kt]"]
  node_consentremember["Remember consent<br/>[RememberConsent.kt]"]
  node_consentapi["Consent API<br/>[Consent.kt]"]
end

node_app(("Host app"))
node_admob["Google Mobile Ads"]
node_ump["User Messaging Platform"]

node_app -->|"initializes"| node_init
node_app -->|"composes"| node_bannerui
node_app -->|"preloads"| node_preload
node_app -->|"composes"| node_fullui
node_app -->|"preloads"| node_fullremember
node_app -->|"requests consent"| node_consentui
node_app -->|"composes"| node_nativeui
node_init -->|"initializes"| node_android
node_init -->|"initializes"| node_ios
node_bannerui -->|"displays via"| node_android
node_bannerui -->|"displays via"| node_ios
node_preload -->|"loads via"| node_android
node_preload -->|"loads via"| node_ios
node_fullui -->|"displays via"| node_android
node_fullui -->|"displays via"| node_ios
node_fullremember -->|"loads via"| node_android
node_fullremember -->|"loads via"| node_ios
node_android -->|"loads and shows"| node_admob
node_ios -->|"loads and shows"| node_admob
node_android -->|"updates"| node_adstate
node_ios -->|"updates"| node_adstate
node_nativeui -->|"renders through"| node_nativehandler
node_nativehandler -->|"loads via"| node_nativeplatform
node_nativeplatform -->|"requests ads"| node_admob
node_nativeplatform -->|"creates"| node_nativedata
node_nativehandler -->|"updates"| node_adstate
node_consentui -->|"uses"| node_consentremember
node_consentremember -->|"accesses"| node_consentapi
node_consentapi -.->|"requests consent"| node_ump
node_shared -->|"exposes"| node_adstate

click node_init "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/BasicAds.kt"
click node_shared "https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads"
click node_bannerui "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/BannerAd.kt"
click node_preload "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberBannerAd.kt"
click node_fullui "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RewardedAd.kt"
click node_fullremember "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberRewardedAd.kt"
click node_android "https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads"
click node_ios "https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/iosMain/kotlin/app/lexilabs/basic/ads"
click node_nativeui "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/NativeAd.kt"
click node_nativehandler "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdHandler.kt"
click node_nativedata "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdData.kt"
click node_nativeplatform "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdHandler.kt"
click node_consentui "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/ConsentPopup.kt"
click node_consentremember "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberConsent.kt"
click node_consentapi "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/Consent.kt"
click node_adstate "https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/AdState.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_init,node_shared,node_adstate,node_ump toneBlue
class node_bannerui,node_preload,node_fullui,node_fullremember toneAmber
class node_android,node_ios toneMint
class node_nativeui,node_nativehandler,node_nativedata,node_nativeplatform toneRose
class node_consentui,node_consentremember,node_consentapi,node_app,node_admob toneIndigo
```

## Components

### Shared API

- [Ads initialization](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/BasicAds.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/BasicAds.kt`
- [Shared ad API](https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads`
- [Ad readiness state](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/AdState.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/AdState.kt`

### Compose Ads

- [Banner composables](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/BannerAd.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/BannerAd.kt`
- [Remember ad state](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberBannerAd.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberBannerAd.kt`
- [Fullscreen composables](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RewardedAd.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RewardedAd.kt`
- [Fullscreen preload](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberRewardedAd.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberRewardedAd.kt`

### Platform Handlers

- [Android ad handlers](https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads): `basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads`
- [iOS ad handlers](https://github.com/lexilabs-app/basic-ads/tree/main/basic-ads/src/iosMain/kotlin/app/lexilabs/basic/ads): `basic-ads/src/iosMain/kotlin/app/lexilabs/basic/ads`

### Native Ads

- [Native ad UI](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/NativeAd.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/NativeAd.kt`
- [Native ad handler](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdHandler.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdHandler.kt`
- [Native ad data](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdData.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdData.kt`
- [Platform native loaders](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdHandler.kt): `basic-ads/src/androidMain/kotlin/app/lexilabs/basic/ads/nativead/NativeAdHandler.kt`

### Consent

- [Consent composables](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/ConsentPopup.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/ConsentPopup.kt`
- [Remember consent](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberConsent.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/composable/RememberConsent.kt`
- [Consent API](https://github.com/lexilabs-app/basic-ads/blob/main/basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/Consent.kt): `basic-ads/src/commonMain/kotlin/app/lexilabs/basic/ads/Consent.kt`

### Other components

- **Host app**
- **Google Mobile Ads**
- **User Messaging Platform**

## Connections

- Host app → Ads initialization: initializes
- Host app → Banner composables: composes
- Host app → Remember ad state: preloads
- Host app → Fullscreen composables: composes
- Host app → Fullscreen preload: preloads
- Host app → Consent composables: requests consent
- Host app → Native ad UI: composes
- Ads initialization → Android ad handlers: initializes
- Ads initialization → iOS ad handlers: initializes
- Banner composables → Android ad handlers: displays via
- Banner composables → iOS ad handlers: displays via
- Remember ad state → Android ad handlers: loads via
- Remember ad state → iOS ad handlers: loads via
- Fullscreen composables → Android ad handlers: displays via
- Fullscreen composables → iOS ad handlers: displays via
- Fullscreen preload → Android ad handlers: loads via
- Fullscreen preload → iOS ad handlers: loads via
- Android ad handlers → Google Mobile Ads: loads and shows
- iOS ad handlers → Google Mobile Ads: loads and shows
- Android ad handlers → Ad readiness state: updates
- iOS ad handlers → Ad readiness state: updates
- Native ad UI → Native ad handler: renders through
- Native ad handler → Platform native loaders: loads via
- Platform native loaders → Google Mobile Ads: requests ads
- Platform native loaders → Native ad data: creates
- Native ad handler → Ad readiness state: updates
- Consent composables → Remember consent: uses
- Remember consent → Consent API: accesses
- Consent API → User Messaging Platform: requests consent
- Shared ad API → Ad readiness state: exposes
