功能选择与消费页面 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 (- [x]) syntax for tracking.

Goal: 新增功能选择页和消费页骨架,建立页面导航,为三个功能卡片增加对应图标,并让功能选择页支持长按标题栏 Logo 验证密码后进入设置。

Architecture: 采用独立 Activity 导航:FunctionSelectActivity 负责三个功能入口,ConsumptionActivity 提供消费页骨架,HomeActivity 继续承载绑盘业务。功能卡片由可点击父布局承载矢量图标和文字,子控件通过父状态同步切换颜色;通用标题栏对任意 Activity 复用现有管理员密码弹窗。

Tech Stack: Java 8、AndroidX FragmentActivity、Android XML、EventBus 3.3.1、现有 NetWorkStatusViewToastUtils


文件结构

Task 1: 增加功能卡片资源与页面布局

Files:

<color name="function_card_normal">#E6FFFFFF</color>
<color name="function_card_pressed">#CC3455AE</color>
<color name="function_card_stroke">#99FFFFFF</color>
<color name="function_card_text">#3455AE</color>
<color name="function_card_text_pressed">#FFFFFF</color>
<string name="function_binding">绑盘</string>
<string name="function_consumption">消费</string>
<string name="function_order_management">订单管理</string>
<string name="function_developing">开发中</string>

普通态 function_card_normal.xml 使用半透明白色、18dp 圆角和 2dp 白色描边;按压态 function_card_pressed.xml 使用蓝色、18dp 圆角和 3dp 白色描边。function_card_background.xml 切换背景,function_card_text_color.xml 同步实现普通态蓝字与按压态白字。背景 selector 内容为:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/function_card_pressed" />
    <item android:drawable="@drawable/function_card_normal" />
</selector>

activity_function_select.xml 使用 @drawable/home_bac 根背景。顶部放 ID 为 function_status_viewNetWorkStatusView,不显示返回按钮;中央横向 LinearLayout 放三个 TextView 卡片。每张卡片使用 selector 背景、300dp × 260dp、左右 24dp 间距、42sp 粗体居中文字、10dp elevation,并设置 clickable/focusable。ID 为 function_binding_cardfunction_consumption_cardfunction_order_card

activity_consumption.xml 使用 @drawable/home_bac 根背景。顶部放 ID 为 consumption_status_viewNetWorkStatusView,宽高和边距沿用 activity_setting.xml,并配置:

app:showBackLayoutTag="true"
app:iconLongClickTag="false"

Run: rg -n "function_(binding|consumption|order_management|developing)|function_card_" app/src/main/res

Expected: 四个字符串、五个颜色、三个 drawable、一个文字颜色 selector 及三个卡片引用均被检出。

Task 2: 实现新页面及标题栏公共行为

Files:

继承 FragmentActivityonCreate() 注册 EventBus,onDestroy() 解除注册。initializeStatusView(int) 获取 NetWorkStatusView 并用 NetworkStatusUtils.getCurrentStatus(this) 初始化。订阅 EventName.NETWORK_CHANGE 后更新 setConnectStatus(event.isAvailable());仅在“连接但无互联网”从否变为是时使用 ToastUtils 显示 net_work_connected_no_internet

设置 activity_function_select 并绑定三个入口:

if (id == R.id.function_binding_card) {
    startActivity(new Intent(this, HomeActivity.class));
    finish();
} else if (id == R.id.function_consumption_card) {
    startActivity(new Intent(this, ConsumptionActivity.class));
} else if (id == R.id.function_order_card) {
    ToastUtils.toast(this, getString(R.string.function_developing));
}

设置 activity_consumption,初始化通用标题栏,将标题栏返回和 onBackPressed() 都绑定到:

private void returnToFunctionSelect() {
    Intent intent = new Intent(this, FunctionSelectActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    finish();
}

Run: rg -n "class (BaseTitleActivity|FunctionSelectActivity|ConsumptionActivity)|function_(binding|consumption|order)_card|returnToFunctionSelect" app/src/main/java/com/zhct/traybinding/main

Expected: 三个新类、三个点击入口和统一返回方法均被检出。

Task 3: 接入 HomeActivity 与 Manifest

Files:

activity_home.xmlapp:showBackLayoutTagfalse 改为 true

HomeActivity.initViews() 初始化 mNetWorkStatusView 后增加:

mNetWorkStatusView.getBackLayout().setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startActivity(new Intent(HomeActivity.this, FunctionSelectActivity.class));
        finish();
    }
});

实体返回键原有“应用使用中,请勿退出”逻辑保持不变。

<activity
    android:name=".main.FunctionSelectActivity"
    android:screenOrientation="landscape" />
<activity
    android:name=".main.ConsumptionActivity"
    android:screenOrientation="landscape" />

Run: rg -n "FunctionSelectActivity|ConsumptionActivity|showBackLayoutTag" app/src/main/AndroidManifest.xml app/src/main/java/com/zhct/traybinding/main app/src/main/res/layout

Expected: Manifest 注册两个页面;Home 和消费页显示返回;功能选择页不显示返回;跳转目标完整。

Task 4: 构建验证与变更记录

Files:

Run: git diff --check

Expected: 无输出且退出码为 0;该命令只读,不暂存或提交。

执行 JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home bash ./gradlew :app:assembleDebug

Expected: BUILD SUCCESSFUL,Debug APK 成功生成。

记录新增类与页面职责、卡片按压 selector、Home 返回入口、Manifest 注册,以及静态检查和构建的实际结果。Markdown 与 HTML 使用相同标题、变更结论和验证结论。

Run: git status --short

Run: git diff -- app/src/main/AndroidManifest.xml app/src/main/java/com/zhct/traybinding/main/HomeActivity.java app/src/main/res/layout/activity_home.xml app/src/main/res/values/strings.xml app/src/main/res/values/colors.xml

Expected: 仅出现本计划范围内的项目文件变化;不执行暂存、提交、推送、分支切换或其他 Git 写操作。

Task 5: 增加功能图标和功能选择页密码入口

Files:

三枚 vector 均使用 72dp × 72dp viewport,path 使用白色基色,由 ImageView 的颜色 selector 统一着色,不引用第三方图标库。

ic_function_binding.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="72dp"
    android:height="72dp"
    android:viewportWidth="72"
    android:viewportHeight="72">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M10,52h52v6H10zM16,46c0,-13.25 10.75,-24 24,-24s24,10.75 24,24h-6c0,-9.94 -8.06,-18 -18,-18s-18,8.06 -18,18zM36,14h8v8h-8z" />
</vector>

ic_function_consumption.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="72dp"
    android:height="72dp"
    android:viewportWidth="72"
    android:viewportHeight="72">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M8,8h44v8H8v44h48v-4H46c-6.63,0 -12,-5.37 -12,-12s5.37,-12 12,-12h10v-8H8v36h48v-4h8v4c0,4.42 -3.58,8 -8,8H8c-4.42,0 -8,-3.58 -8,-8V16c0,-4.42 3.58,-8 8,-8zM46,38h22v12H46c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6zM48,41a3,3 0,1 0,0 6a3,3 0,1 0,0 -6z" />
</vector>

ic_function_order.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="72dp"
    android:height="72dp"
    android:viewportWidth="72"
    android:viewportHeight="72">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M16,8h40v8h8v52H8V16h8zM24,14v8h24v-8zM16,30h8v8h-8zM30,30h24v8H30zM16,46h8v8h-8zM30,46h24v8H30z" />
</vector>

保留 function_binding_cardfunction_consumption_cardfunction_order_card 三个父布局 ID 和原卡片尺寸、背景、点击属性。在每个纵向 LinearLayout 中放置:

<ImageView
    android:layout_width="104dp"
    android:layout_height="104dp"
    android:duplicateParentState="true"
    android:src="@drawable/ic_function_binding"
    android:tint="@color/function_card_text_color" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="24dp"
    android:duplicateParentState="true"
    android:text="@string/function_binding"
    android:textColor="@color/function_card_text_color"
    android:textSize="42sp"
    android:textStyle="bold" />

消费和订单卡片分别替换 drawable、文案和 contentDescription。duplicateParentState 保证按压父卡片时,子图标和文字同步从蓝色变为白色。

activity_function_select.xml 的标题栏属性改为:

app:iconLongClickTag="true"

保留 NetWorkStatusView 默认返回逻辑所需的 HomeActivity import,仅将长按判断改为:

if (mContext instanceof Activity) {
    new CustomPwdInputDialog((Activity) mContext);
}
return true;

继续复用 CustomPwdInputDialogPwdInputDialogUtils,不修改密码值、输入限制、日志、错误提示或进入设置页的行为。

Run: rg -n "ic_function_(binding|consumption|order)|duplicateParentState|iconLongClickTag=\"true\"|new CustomPwdInputDialog" app/src/main/res app/src/main/java/com/zhct/traybinding/widget/NetWorkStatusView.java

Expected: 三枚图标均被对应卡片引用,六个子控件继承父状态,功能选择页开启长按,通用标题栏使用 Activity 创建原密码弹窗。

Task 6: 验证图标与密码入口变更

Files:

Run: git diff --check

Expected: 无输出且退出码为 0。

Run: JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home bash ./gradlew -q :app:assembleDebug

Run: JAVA_HOME=/Users/liang/Library/Java/JavaVirtualMachines/corretto-1.8.0_482/Contents/Home bash ./gradlew -q :app:testDebugUnitTest

Expected: 两条命令退出码均为 0。

在既有变更记录中补充三枚功能图标、父子按压状态同步、功能选择页 Logo 长按密码弹窗、通用标题栏 Activity 泛化,以及最新构建和测试结果;Markdown 与 HTML 保持一致。