feat: compose Android app and verify native calendar and reminders

This commit is contained in:
Codex
2026-10-13 09:14:47 +08:00
parent 2c4256b880
commit 5ceab20b67
37 changed files with 695 additions and 229 deletions
+37 -28
View File
@@ -1,47 +1,56 @@
# 河畔 Everyday
# 河畔Everyday
电子科技大学研究生课表 APP。采用 Flutter,优先 Android,后续支持 iOS。
电子科技大学研究生课表 APP,Flutter 实现,Android 首版 0.1.0+1,Android 7.0 及以上。iOS 尚未配置。
当前阶段:Android 开发环境已配置,首版设计文件已确认,实现计划待审核;尚未生成业务代码或 APP 安装包。
已实现:周一至周日、11 节学校作息、跨节课程条形卡片、课程详情与冲突提示、两个无文字图标的玻璃悬浮 Dock、单色/多彩设置、学期开始日/周数设置、JSON 预览导入、本地保存/备份恢复、课前通知及手机日历同步。
## 开发环境
学校认证提供自绘登录入口与官方 WebView。**本人登录、验证码及研究生课表自动识别仍待真实页面联调**,目前不会假装成功导入。详见 [学校接入状态](docs/school-integration-status.md)。
项目工具与缓存放在 `.tools/`,不会进入版本控制。使用官方发行版及 SHA-256 校验:
## 体验
- Flutter 3.47.7 稳定版,Dart 3.13.5。
- Microsoft OpenJDK 17.0.20.1。
- Android 命令行工具 22.0、Android API 36、Build Tools 36.0.0、Platform Tools。
- Flutter 配套 NDK 28.2.13676358、CMake 3.22.1。
- 可选 Android Emulator 与 Android 16(API 36)Google APIs x86_64 镜像。
安装 `dist/hepan-everyday-debug.apk`。这是开发测试包,不是商店发布包。首次打开点“体验示例课表”即可预览;示例课程不会写入手机日历或触发通知。
在 Windows PowerShell 中,进入本目录后,安装与检查环境:
自己的课程:在“我的 → 课表设置”填写学校实际开始日和周数,再通过“导入课表文件”导入 JSON 并确认预览。默认提前 15 分钟提醒,可选 5、10、15、30、60 分钟或关闭。首次启用需要允许通知;没有精确闹钟权限时会显示可能延迟。
```powershell
./scripts/setup-android.ps1 -WithEmulator
```
日历同步需授权并选择可写日历。关闭可保留或删除本 APP 创建的日程。删除时检查课程实例与本 APP 专属标记,不操作其他日程;清理失败保留映射并可重试。日历事件不创建第二份系统提醒。
安装时需要访问官方下载源和软件包服务,并接受 Android SDK 开发工具许可。安装日志与许可文本保留在 `.tools/`。安装脚本只在项目内放置工具;Flutter 自身会保存 SDK 路径配置。
## JSON 文件
每次打开新的 PowerShell 终端后激活环境:
样例:[schedule.schema-v1.json](examples/schedule.schema-v1.json)。
| 字段 | 含义 |
|---|---|
| schemaVersion | 固定为 1 |
| isDemo | 样例为 true;导入本人课程改成 false |
| explicitlyEmpty | 只有明确要清空且 courses=[] 时设 true,并在预览再次确认 |
| id | 每条课程安排唯一的非空标识 |
| name / teacher / room | 课程名、教师、教室,均非空 |
| weekday | 周一至周日:1–7 |
| startPeriod / endPeriod | 开始/结束节次:1–11,包含边界 |
| weeks | 实际上课周次数组:1–30;单双周展开成明确周次 |
同一课程不同星期或不同节次,应使用不同 id。文件上限 2 MB。导入文件不能冒充学校来源;示例模式不覆盖真实课表。
## 开发与构建
源码位于 `mobile/`。本次工具在 `C:/Users/david/Desktop/app/.tools`,不会进入 Git。Windows PowerShell:
```powershell
$env:HEPAN_TOOLCHAIN_ROOT='C:/Users/david/Desktop/app/.tools'
. ./scripts/android-env.ps1
flutter doctor -v
flutter devices
Set-Location mobile
flutter pub get
flutter analyze
flutter test
flutter run -d emulator-5554
```
真机调试:在 Android 手机打开开发者选项和 USB 调试,通过 USB 连接电脑,在手机上允许电脑调试,然后检查 `flutter devices`。如果 Windows 无法识别手机,根据手机厂商说明安装官方 USB 驱动。不要在聊天中提供学校账号密码。
模拟器需 Windows 支持的硬件虚拟化环境;环境检查与设备启动结果记录在 `docs/android-setup-status.md`。安装完成后可使用:
回到仓库根目录构建:
```powershell
. ./scripts/android-env.ps1
./scripts/create-android-emulator.ps1
emulator -avd hepan_everyday
./scripts/build-android.ps1
```
已创建的虚拟设备会重复使用,不覆盖其数据。
构建成功才复制新 APK 到 `dist/`。工具版本与设备环境见 [Android 环境](docs/android-setup-status.md)。其他电脑可使用 `scripts/setup-android.ps1 -WithEmulator` 安装环境,并将构建脚本 ToolchainRoot 指向对应 `.tools` 目录。
## 首版设计
见 [已确认的首版设计](docs/superpowers/specs/2026-10-12-hepan-everyday-design.md)与[实现计划](docs/superpowers/plans/2026-10-12-hepan-everyday-android.md)。学校真实课表解析需要在用户本人认证后的页面上验证。
设备集成检查见 [验证记录](docs/android-mvp-validation.md)。系统日历测试仅运行于专用模拟器的 `Hepan_Integration_Test` 测试日历,需提前允许测试 APP 读取和写入日历。`mobile/tool/reminder_probe.dart` 是短时系统提醒测试入口,交付 APK 始终使用 `lib/main.dart`。