三块改动同批落地,互相咬合(详情页未开启分支依赖开关联动,睡眠页依赖前两者), 拆开提交会得到编译不过的中间态,故合并为一次。 详情页专属化(spec §6.1) - feature/detail/pages/ 七个指标各一个文件,各自决定放几张卡; MetricDetailScreen 只剩页头 + 周/月切换 + 按 metric 分派 - 新增 MetricRangeBar(心率区间条)、MetricThresholdStrip(血氧阈值带)、 MetricDeviationBar(体温偏离条)、ChartAxisLabels(三图共用的 X 轴标签行) - MetricBarChart 增 valueRange / bandRange,均值参考线泛化为 referenceLine - 修:窄区间指标(血氧 95–99、体温 36.1–36.9)柱子被抹平成一样高,整张图无信息量 - 修:头图当前值与趋势图末点各生成各的,改为末点取自 todaySummary 功能开关联动(spec §6.3) - MetricType 显式带 switchId,null 表示常开(计步、体温) - MockHealthDataRepository 订阅 functionSettings,概览/历史/睡眠全部由开关算出 - 未开启的指标在概览里为 null;详情页整页走共用的 MetricDisabledCard 且不画图 - 修:血压卡因「未开启」不可点击,说明页成为死代码,用户无从知道怎么开启 - 修:压力开关默认关着而 todaySummary 一直给出 stress = 34 睡眠时段图(spec §6.2) - 新增 SleepSession:MetricPoint 只装得下一个 Double,装不下「几点到几点」 - 新增 SleepWindowChart:每晚一行,圆角条从入睡横到醒来;横轴锚在 20:00 跨零点 (不能用 timestamp % 86400000,那是 UTC 余数,东八区会整体平移八小时), 轴范围由数据算出并取整到刻度线;只用一个颜色,不假装知道分期位置 - 睡眠页撤掉柱状图(条长即时长,与时段图重复),改画时段图 + 分期时长图例 - 今日睡眠时长、睡眠历史点、分期条全部由 SleepSession 派生,不再各生成各的 验证:44 个单测通过;装机核对近 7 天 / 近 30 天 / 关闭睡眠开关三种状态
31 lines
1.3 KiB
Kotlin
31 lines
1.3 KiB
Kotlin
package com.placeholder.ringhealth
|
|
|
|
import com.placeholder.ringhealth.data.mock.MockHealthDataRepository
|
|
import com.placeholder.ringhealth.data.mock.MockRingDeviceRepository
|
|
import com.placeholder.ringhealth.domain.repository.HealthDataRepository
|
|
import com.placeholder.ringhealth.domain.repository.RingDeviceRepository
|
|
|
|
/**
|
|
* 手动依赖注入容器。M2 接入 SDK 时只需在这里把 Mock 实现换成真实实现。
|
|
*/
|
|
interface AppContainer {
|
|
val healthDataRepository: HealthDataRepository
|
|
val ringDeviceRepository: RingDeviceRepository
|
|
}
|
|
|
|
/**
|
|
* 默认容器:阶段一全部使用 Mock 数据。
|
|
*
|
|
* 注意 [healthDataRepository] **依赖** [ringDeviceRepository] 的开关流,不是两个平行字段 ——
|
|
* 之前正是各建各的,导致功能开关与健康数据互不相干(详见 [MockHealthDataRepository])。
|
|
* 声明里保留具体类型,是为了把开关流传下去而不必向下转型。
|
|
*/
|
|
class DefaultAppContainer : AppContainer {
|
|
private val mockRingDeviceRepository = MockRingDeviceRepository()
|
|
|
|
override val ringDeviceRepository: RingDeviceRepository = mockRingDeviceRepository
|
|
|
|
override val healthDataRepository: HealthDataRepository =
|
|
MockHealthDataRepository(functionSettings = mockRingDeviceRepository.functionSettings)
|
|
}
|