执行要求:使用 executing-plans 按任务实施。仓库 Git 操作限制为只读,因此不包含暂存或提交步骤。
目标:一卡通 USB 读卡器完成协议初始化前,不得进入或运行消费业务。
架构:ConsumptionStartActivity 通过专用启动控制器发现设备、申请权限并初始化协议,成功后才启动 ConsumptionActivity。纯状态门禁负责可测试的弹框、等待和退出决策;所有消费入口统一经过启动页。消费页自身仅在读卡器进入寻卡状态后启动餐盘识别,并在可用性丢失时立即关闭餐盘入口。
技术栈:Android Java、USB Host API、NewcapecUsbCardReader、SingleTipPop、JUnit 4、JDK 8 Gradle。
ConsumptionReaderStartupGate.java 和 ConsumptionReaderStartupGateTest.java。CHECKING、DEVICE_MISSING、WAITING_FOR_DEVICE、CONNECTING、READY、FAILED、EXIT_REQUESTED。JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:testDebugUnitTest --tests '*ConsumptionReaderStartupGateTest'
ConsumptionReaderStartupController.java,复用 NewcapecUsbCardReader。onReady(),保证消费页能够干净接管。ReaderDeviceStateTest,确认物理设备消失时旧连接不能被视为可用。JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:compileDebugJavaWithJavac
ConsumptionStartActivity.java 和 strings.xml。finishAffinity()。enteringConsumption 防止重复导航;销毁时关闭控制器和弹框。FunctionSelectionRouter.java 与 FunctionSelectionRouterTest.java。FunctionSelectActivity 的消费入口改为 ConsumptionStartActivity。ModeTargetResolverTest 与 SettingReturnRouterTest,确保固定模式、功能选择和设置返回均经过门禁。JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:testDebugUnitTest --tests '*FunctionSelectionRouterTest' --tests '*ModeTargetResolverTest' --tests '*SettingReturnRouterTest'
ConsumptionActivity.java、ReaderInitializationRetryGate.java 和对应测试。onStart() 只启动一卡通管理器;只有 onSearching() 可以打开餐盘识别。JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:testDebugUnitTest --tests '*ReaderInitializationRetryGateTest' --tests '*ConsumptionFlowStateMachineTest' --tests '*ConsumptionTransactionGateTest'
git diff --check。CustomerFullFetchServiceTest 分页预期失败,单独记录,不声称全绿。JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:testDebugUnitTest --rerun-tasks JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:assembleDebug shasum -a 256 app/build/outputs/apk/debug/app-debug.apk
需要真机验证 USB 接入、授权、协议初始化、设置返回时重新校验、取消退出,以及消费运行期间拔出读卡器后的业务阻断。