## Context

在 phase-2a（激励，已验证的五步法模板）之上实现插屏。**权威设计在 SPACE，本文只引用不复制**：

- L1 API：SPACE **§4.7 `ATInterstitialAd`**（+ AutoAd）
- TurboModule 方法：SPACE **§7.3**（插屏）
- callbackName 全量：SPACE **§17.3.3**（17 个，已落地在 `Const.java` 的 `InterstitialCallback`）
- 执行步骤：实施规范 **Step 2-B**
- 对拍：`docs/android-rn-parity.md`

## Goals / Non-Goals

**Goals:**
- Android 插屏 load → show → close 全链路真实可跑（ADX 源）；视频插屏含 PlayStart/End。
- 回调经唯一 `ATReactNativeEventEmitter`（callName `InterstitialCall`），按 placementID 分发到 `ATInterstitialAd.setAdListener`。
- 展示成功/失败（`interstitialDidShowSucceed`/`interstitialFailedToShow`）、deeplink、AdSource、Auto 覆盖。
- iOS 编译过 + 路由 log 可见。

**Non-Goals:**
- 开屏/Banner/Native（后续 Phase）；iOS 真实插屏业务。
- 新错误码 / 新 EventEmitter（复用既有）。

## Decisions

- **照搬 phase-2a 模式**：插屏三件套与激励一一对应，仅类型/字典不同：
  `ATAdInterstitialManger → ATInterstitialManager`（路由 + `ConcurrentHashMap<placementId, Helper>` + Promise/init/Activity 门控 + RN 类型转换）、
  `ATInterstitialHelper`（持 `ATInterstitialAd` 实例 + `ATInterstitialExListener` + AdSource listener，回调经 `emit(InterstitialCall, callbackKey, pid, adInfo→Map, errMsg, extra)`）、
  `ATAutoLoadInterstitialHelper`（`ATInterstitialAutoAd`）。
- **callName 字段**：原生用 `Const.CallbackMethodCall.InterstitialCall`（注意字段名首字母大写，与 reward 的 `rewardedVideoCall` 不同）。
- **插屏 vs 激励 callbackName 差异**：插屏**无** reward/again 系列；**多** `ShowCallbackKey`(interstitialDidShowSucceed) / `ShowFailCallbackKey`(interstitialFailedToShow)。L1 typed listener 据此调整（去掉 onReward/again，加 onShow/onShowFail）。
- **视频插屏**：复用 PlayStart/PlayEnd/PlayFail 回调（验收 I-F05 的 VideoStart/End/Error 即映射到这三个真实 callbackName）。
- **错误只走 Event**：load/show 失败 → 对应 `*FailToLoad`/`failedToShow` 事件 + `requestMessage`，不 reject；reject 仅用于未 init（`SDK_NOT_INITIALIZED`）/无 Activity（`ACTIVITY_NULL`）。
- **下行结构化对象**：load 的 extra 走 ReadableMap；复杂嵌套经 `BridgeJsonMapUtil`，简单走 `RNMapUtil`（沿用 2a）。
- **iOS stub**：插屏桥方法空实现 + NSLog；查询返回空/false；真实实现留 iOS 同事；播放失败用正确常量 `interstitialDidFailToPlayVideo`。

## Risks / Trade-offs

- [验收文档 callbackName 简写与 Const.java 不符] → 一律以 **Const.java/§17.3.3 为准**（如 load 失败 `interstitialAdFailToLoadAD`、展示 `interstitialDidShowSucceed`），spec 用真实名。
- [ADX 源不 fill] → 用插屏 ADX 测试位 `b5fdc16e15a78b`；no-fill 时验失败事件 + requestMessage 也算达标。
- [Listener 接口方法集与 6.5.73 差异] → 移植后编译报错按 Android 真实接口调整（同 2a 流程，用户本机编译反馈）。
