111/docs/project_context.md

10 KiB
Raw Blame 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. 协作约定

生成本文档后,后续我只提供待修改局部代码,不再发送完整工程。所有修改基于这份上下文;信息不足、架构冲突请主动提问,不要自行猜测。回复仅输出改动代码+简短说明。