111/docs/project_context.md

109 lines
10 KiB
Markdown
Raw Permalink Normal View History

# Android项目全局上下文文档
## 1. 项目概况
语言Kotlin、少量 Java 本地库代码
架构Jetpack Compose 单 Activity UI未形成标准 MVVM当前主要通过 Composable 局部状态、StateFlow 全局 Manager、SharedPreferences 持久化驱动界面
技术栈AndroidX、Jetpack Compose、Material3、Haze 毛玻璃、OkHttp、Gson、ZXing、Google Play Services Location、LeakCanary、Android Instrumentation Test
Gradle/SDK版本Android Gradle Plugin 8.9.1Kotlin 2.1.0Compose BOM 2024.10.00compileSdk 36targetSdk 36minSdk 33Java/Kotlin JVM 1.8
项目作用:智能家居控制面板应用,提供登录、房间管理、设备控制展示、场景、自动化、设置、背景壁纸、多语言、天气展示,并预留 CAN/MQTT 设备柜通信能力
模块settings.gradle.kts 当前仅 include :app仓库内存在 blurview Android Library 源码和 test/BlurView-master 示例/测试目录,但未接入当前主工程构建
## 2. 包结构与模块职责
com.example.smarthome应用入口层
包含 SmartHomeApp、MainActivity、MainActivityCompose、MainActivityHaze、MainActivityAlternative。生产入口是 MainActivity负责初始化语言/用户管理器、隐藏系统栏、挂载 activity_main.xml 中的 ComposeView 并渲染 AppRoot。
com.example.smarthome.data数据、状态和服务层
UserManager 管理登录状态、用户信息、手机号验证码模拟登录和用户资料持久化。
LanguageManager 管理多语言枚举、翻译字典、语言持久化和切换语言后的应用重启。
BackgroundManager 管理背景壁纸列表、当前背景 StateFlow 和持久化。
WeatherService 使用定位、HTTP 天气接口、缓存和模拟兜底获取天气。
DeviceManager 聚合 MQTT 与 CAN 服务,向 UI 暴露设备控制统一入口。
MqttService.kt 定义 MQTT 常量、实体、接口和模拟实现。
CanService.kt 定义 CAN 常量、命令、实体、接口和模拟实现。
com.example.smarthome.uiCompose UI 层
MainScaffold 是主界面核心,承载控制台、房间内容、设备卡片、空调/灯光/图表、顶部栏、导航相关组件。
LoginScreen、PhoneLoginScreen 提供微信扫码模拟登录和手机号验证码登录。
SettingsScreen 提供设置、语言、背景、房间管理、退出登录。
RoomDialog 提供添加/编辑/删除房间弹窗。
SceneScreen 管理场景开关。
AutomationScreen 管理自动化列表增删改状态。
SecurityScreen 管理安防状态展示与本地开关。
StatisticsScreen 展示静态能耗统计。
SmartHomeScreen、HomeScreen、Neumorph*、LiquidIndicator 是备用/实验性界面或通用视觉组件。
Previews 提供多尺寸 Compose 预览。
com.example.smarthome.ui.theme主题层
SmartHomeTheme 使用 Material3 darkColorScheme当前为固定深色主题。
eightbitlab.com.blurview本地 BlurView 库源码
包含 BlurView、BlurController、PreDrawBlurController、RenderScriptBlur、RenderNodeBlurController 等传统 View 毛玻璃实现;当前未被 :app 依赖。
## 3. 分层与数据流
启动流程MainActivity.onCreate -> LanguageManager.init(context) -> UserManager.init(context) -> 隐藏状态栏/导航栏 -> ComposeView.setContent -> SmartHomeTheme -> AppRoot。
登录数据流AppRoot collect UserManager.isLoggedIn。未登录显示 LoginScreen微信模拟登录调用 UserManager.login手机号登录调用 UserManager.sendVerifyCode、verifyCode、loginWithPhone登录成功后 UserManager.isLoggedIn 变为 true自动切换到 MainContent。
主界面数据流MainContent 从 smart_home_prefs.rooms 加载房间列表,使用 Compose remember/mutableStateOf 保存 selectedRoom、selectedNavItem、rooms通过回调传给 MainScaffold。房间增删改由 saveRooms 写入 SharedPreferences 后更新 Compose 状态。
导航数据流MainScaffold 根据 selectedNavItem 分发页面0 控制台、1 场景、2 自动化、3 设置。SecurityScreen、StatisticsScreen 和部分导航组件已存在,但当前主 switch 未接入对应页面。
控制台数据流DashboardContent -> RoomSelector -> RoomContent。总览房间显示环境、安全健康、模式、灯光、所有设备具体房间显示空调卡、状态图、灯光行、设备网格。多数设备/图表数据为 UI 局部状态或静态模拟数据。
设置数据流SettingsContent -> SettingsContentList。语言通过 LanguageManager.currentLanguage collect切换语言写入 language_prefs 并重启应用;背景通过 BackgroundManager.selectedBackground collect切换背景写入 background_prefs退出登录调用 UserManager.logout。
场景/自动化/安防数据流SceneScreen 使用 SharedPreferences("scenes") 保存场景激活状态AutomationScreen 使用 SharedPreferences("automations").automation_list 和 Gson 保存自动化列表SecurityScreen 使用 smart_home_prefs.security_armed 保存安防开关。
设备通信数据流UI 可通过 rememberDeviceManager() 获取 DeviceManager。DeviceManager.initialize 打开 CAN 串口,并在 MQTT 参数完整时初始化/连接 MQTT业务方法调用 ICanService 发送开门、上电、LED、查询等命令CAN 回调进入 handleCanResponse必要时触发后续 CAN 查询或 MQTT 上报。当前 CAN/MQTT 均是模拟实现,真实客户端代码以 TODO 注释保留。
线程规则Compose 状态更新主要在主线程组合环境内完成;网络天气请求在 WeatherService.getWeather 中通过 withContext(Dispatchers.IO) 执行DeviceManager 使用 CoroutineScope(SupervisorJob() + Dispatchers.IO) 初始化 CAN/MQTTCAN/MQTT 的 MutableStateFlow 可跨线程更新,但新增真实硬件/网络回调时需注意线程切换和生命周期释放。
## 4. 核心基类
当前项目没有自定义 BaseActivity、BaseFragment、BaseViewModel、Repository 基类。
Activity 基类使用系统/AndroidX 类MainActivity、MainActivityCompose、MainActivityHaze 继承 ComponentActivityMainActivityAlternative 继承 AppCompatActivity。
全局状态封装以 singleton object/class manager 为主UserManager、LanguageManager、BackgroundManager、WeatherService、DeviceManager、MqttServiceImpl、CanServiceImpl。
## 5. 现有通用封装
网络WeatherService 使用 OkHttp 访问 7timer、wttr.in、ip-apiLoginScreen 使用 HttpURLConnection 预留微信扫码登录接口MqttServiceImpl 预留真实 MQTT 客户端接入点但当前只模拟连接和发布日志。
本地存储:广泛使用 SharedPreferences包括 user_prefs、users_database、language_prefs、background_prefs、smart_home_prefs、scenes、automations、mqtt_prefs。
状态封装:使用 MutableStateFlow/StateFlow 暴露登录、用户、语言、背景、MQTT 连接、CAN 连接、最后 CAN 响应、当前设备操作等状态。
工具方法tr(key) 多语言快捷函数rememberSelectedBackground()、rememberDeviceManager()、rememberMqttConnectionState()、rememberCanConnectionState() Compose 便捷函数Context.getMqttService()、Context.getCanService() 扩展generateQRCode 使用 ZXing 生成二维码Context.findActivity() 用于从 Context 查找 Activity。
UI 通用组件BackgroundSelector、LanguageSelectDialog、EditRoomsDialog、AddRoomDialog、CustomSwitch、GradientButton、CustomSlider、LightSlider、BlurGlassCard、FloatingBottomNav、SideNavRail、NeumorphButton、LiquidIndicator 等。
## 6. 开发约束
- 最小改动,禁止随意重构稳定代码
- 遵守分层架构,不跨层调用
- 优先复用现有代码,不重复造轮子
- 沿用项目现有第三方方案
- 当前没有标准 ViewModel/Repository 层;新增功能应优先沿用现有 Manager + StateFlow + Compose 状态方式,除非明确要求架构升级
- 修改房间、登录、语言、背景等功能时,应复用现有 SharedPreferences key 和 Manager不要引入新的重复存储
- 修改设备通信时,应通过 DeviceManager、IMqttService、ICanService 接口扩展,不要让 UI 直接拼 CAN 帧或 MQTT topic
- 修改 UI 时优先复用 MainScaffold.kt、SettingsScreen.kt、RoomDialog.kt 中已有组件和视觉风格
- 注意 SecurityScreen、StatisticsScreen 当前未接入生产导航 switch接入前需确认导航索引设计
- 注意 UiAdaptationTest 引用了当前源码中不存在的 ControlPanel测试维护前需先确认目标组件
## 7. 核心实体与全局常量
核心实体:
UserManager.UserInfo用户 ID、手机号、昵称、头像、注册/登录时间、性别、生日、邮箱、地址。
BackgroundOption背景 id、名称、资源、缩略图、描述、是否深色。
WeatherInfo温度、天气、湿度、空气质量、AQI、城市。
DoorInfo格口/柜子/设备状态、接口、电压、SN、PVD、PRO、MFG、电量、维修状态。
DeviceEvent借还/丢失等设备事件上报字段。
CanMessage、CanResponseCAN 命令和响应数据。
Scene场景 id、名称、描述、图标、渐变、激活状态。
Automation自动化 id、名称、触发条件、动作、启用状态。
SecurityEvent安全事件标题、时间、类型、描述。
DeviceUI 设备卡片名称、副标题、图标、开关状态。
ScanStatusResult、ScanStatus扫码登录状态。
全局常量:
LoginConfigBASE_URL、GET_QR_CODE、CHECK_STATUS、POLL_INTERVAL、QR_EXPIRE_TIME、USE_MOCK。
MqttConstantsMQTT host、API host、端口、发布/订阅 topic 前后缀、QoS。
CanConstants默认串口 /dev/ttyS4、波特率 115200、CAN 帧头/长度/帧尾、门开关状态。
CanCommandsLON、LOF、LST、PON、POF、RON、GON、AOF、PVD、MFG、PRO、DSN、CON、1VER、1LEN、1MD5、1MDE。
OperationType借、还、维修、批量出入柜、格口上断电、灯光、设备信息、固件版本、开门、异常检测等操作码。
LanguageManager.Language中文、英文、韩文、日文、俄文。
ModeHOME、AWAY、FUN、MOVIE。
## 8. 协作约定
生成本文档后,后续我只提供待修改局部代码,不再发送完整工程。所有修改基于这份上下文;信息不足、架构冲突请主动提问,不要自行猜测。回复仅输出改动代码+简短说明。