AI SDK Unified Readiness Gate Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: 将银歌 AI 插件、初始化、强制升级和真实激活状态统一收口,在 AI 业务放行前完成可靠检查,并按已确认规则引导未激活用户进入设置或返回主页。

Architecture: AiSdkManager 维护单例 SDK 会话和统一就绪状态,提供“服务就绪”和“业务就绪”两层门禁;业务页面通过可复用的 AiReadinessGuard 获得一致弹框与导航行为。设置页激活复用服务门禁,激活成功后重新查询真实状态。

Tech Stack: Android Java、银歌 AI SDK AAR、AndroidX AppCompat、JUnit 4、Gradle 7.4。


Task 1: 建立可测试的状态模型

Files:

覆盖 SUCCESS -> READYNOT_ACTIVE -> NOT_ACTIVE、插件缺失、强制升级以及未知错误映射。

Run: ./gradlew :app:testDebugUnitTest --tests com.cpt.aidishrecognition.ai.AiReadinessPolicyTest

Expected: 因目标类型尚未创建而编译失败。

AiReadinessPolicy 只负责将 SDK code 映射到 AiReadyState,不持有 Android Context 或页面引用。

Run: ./gradlew :app:testDebugUnitTest --tests com.cpt.aidishrecognition.ai.AiReadinessPolicyTest

Expected: BUILD SUCCESSFUL

Task 2: 扩展 AiSdkManager 为统一门禁

Files:

提供 ensureServiceReady()ensureAiReady()cancelReadyRequests()invalidateReadyState()markNotActive()

同一时刻只执行一次初始化/查询;请求排队,回调前检查 Activity 生命周期;插件安装交互期间不触发普通初始化超时。

onInitSuccess() 后短暂等待 SDK 的强制升级消息,再放行服务请求或查询激活状态,避免先弹未激活、随后又收到 1010。

在后台线程调用 queryAiActiveStatus(),主线程分发结果;NOT_ACTIVE 同步清除本地激活展示缓存。

Run: ./gradlew :app:compileDebugJavaWithJavac

Expected: BUILD SUCCESSFUL

Task 3: 设置页激活复用统一服务门禁

Files:

激活前调用 ensureServiceReady();插件未安装或必须升级时返回明确状态;激活成功后调用 ensureAiReady() 二次确认。

SettingActivity 增加来源和目标项参数,基础设置页定位并短暂高亮 AI 激活行。

从 AI 业务页进入设置时,激活成功回传 RESULT_OK;取消或返回时回传 RESULT_CANCELED

Run: ./gradlew :app:compileDebugJavaWithJavac

Expected: BUILD SUCCESSFUL

Task 4: 建立统一业务页面交互守卫

Files:

守卫调用 ensureAiReady(),处理进度提示、重复请求和 Activity 销毁。

未激活:前往设置/返回主页;插件未安装:安装插件/返回主页;必须升级:立即升级/返回主页;其他错误:重试/返回主页。

前往设置携带目标项参数;拒绝处理使用 CLEAR_TOP | SINGLE_TOP 返回 MainActivity

Run: ./gradlew :app:compileDebugJavaWithJavac

Expected: BUILD SUCCESSFUL

Task 5: 接入三个 AI 业务页面

Files:

页面创建后先检查门禁,READY 后才同步菜品与学习数据;设置返回后重新查询;learnDateRivise() 返回 NOT_ACTIVE 时使状态失效并重新提示。

门禁通过前不启动相机识别和学习请求;删除页面内重复的插件、升级和自动激活处理。

门禁通过前不提交识别帧;运行中返回 NOT_ACTIVE 时交给统一守卫,不在页面自动提交激活码。

Run: ./gradlew :app:compileDebugJavaWithJavac

Expected: BUILD SUCCESSFUL

Task 6: 防止校正失败破坏已有学习数据

Files:

远端图片先写入独立临时目录,不提前删除正式目录。

SDK 校正成功后再切换正式目录;下载、保存或 SDK 校正失败时清理临时目录并保留原数据。

Run: ./gradlew :app:compileDebugJavaWithJavac && git diff --check

Expected: BUILD SUCCESSFUL 且无空白错误。

Task 7: 完整验证与记录

Files:

Run: ./gradlew :app:testDebugUnitTest :app:assembleDebug

Expected: BUILD SUCCESSFUL

验证插件未安装、必须升级、未激活、激活成功及运行中 1004 五类路径;日志不得包含激活码。

同步 Markdown/HTML 文档,记录具体文件、行为、验证命令和遗留的设备侧前置条件。

Run: git diff --check && git status --short

Expected: 仅包含本次实现文件和用户原有未相关改动,不执行暂存、提交或推送。

执行状态(2026-07-21)

后续增量:插件更新弹框统一封装(2026-07-21)

后续增量:AI 全流程弹框风格统一(2026-07-21)