Skip to content

Releases: kuailiaojie/classtable

3.6.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 08:56

继续打磨 AI 助手面板:去掉面板左上角的返回箭头,补上日程的改 / 删与「一次建多天课程」,并把面板的确认 / 取消接上全站触感。

变更:AI 助手面板

  • 去掉左上角返回箭头:面板是覆盖层而非导航页,不该用「‹ 返回」。关闭统一走下滑把手 / 点遮罩 /
    系统返回
    三条路。
  • 确认 / 取消补触感:「确认执行」用实一点的一下、「取消」用轻的一下,与全站调用点(如日程删除确认)一致。

变更:AI 助手(操作)

  • 日程可改 / 可删:动作新增 agenda_update / agenda_delete(局部补丁,未给的字段保留;改时间成对给出,
    改全天用 allDay);配套只读工具 SEARCH_AGENDA,改 / 删前先用它取真实 agendaId。预览卡给出
    「改前 → 改后」的标题 / 日期 / 时间 / 地点 / 备注。
  • 一次建多天课程:建课动作支持 days(如 [1,3] = 周一 + 周三),落成课程的多星期掩码;单个 day 仍可用。
  • 空态示例与提示词同步更新(工具目录与动作格式随 AiFunctions / AI_ASSISTANT_PROMPT 生成)。

3.5.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 13:49

助手换个形态打开:从「顶部滑下的覆盖层」改成底部弹出面板,消息按聊天气泡重排;顺手修好课表页头那一行「不齐平」。

变更:AI 助手打开方式

  • 改成底部弹出面板:从课表页头的「✦ 助手」打开时,面板自屏幕底部升起,占屏高约 85%,顶部圆角 +
    一道拖拽把手。抓住把手下滑即可收起(带速度判定),点遮罩 / 系统返回 / 面板返回箭头照旧能关。
    相比原先从顶部滑下,底部面板更贴近「聊天」的直觉,也让入口与面板在视觉上解耦。

变更:AI 助手界面

  • 助手消息改成左对齐气泡:与右侧的用户气泡对位;气泡底色是一层极淡的前景色叠加,浅色 / 深色主题
    都读得出层级。身份标签「✦ 助手」与正文(Markdown)都在气泡里。
  • 等待态也是气泡:「✦ 助手」+ 三点呼吸,提前占住助手气泡的位置。
  • 确认卡嵌进气泡:待落库动作的明细与「确认执行 / 取消」跟随助手气泡,不再脱离「谁在说话」。

修复:课表页头不齐平

  • 页头的「今天 / 添加 / ✦ 助手」此前把 44dp 触达高度直接挂在文字上,文字顶对齐在这 44dp 里,
    与同行的周 / 日分段控件(34dp,文字居中)、天气图标(22dp)的中线差了约 8dp。改用居中的容器兜住
    触达高度,字形落回行中线,整排对齐;触达高度不变。

3.4.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 06:36

继续打磨 AI 助手面板(设计 / 逻辑 / 动效),并重整课表顶部那一行的排布。

变更:课表顶部排布

  • 周 / 日切换改用分段控件:原先是两颗各自描边的 chip,现与「日程 / 倒计时」同用一条底槽 + 会滑动的
    指示块,顶部更收敛。
  • 顶部按「导航簇 / 动作簇」分组:定位(今天)与视图粒度(周 / 日)收成一组,「添加」「✦ 助手」另起一组,
    靠留白分开,不再是一串等距项。
  • 修正大标题跨周不更新:翻到别的周时,标题改亮该周的日期区间(原先恒显示今天的日期,与表头列出的
    日期对不上);当前周仍亮今天。

变更:AI 助手面板

  • 消息入场动效:新到的气泡淡入 + 轻轻上移;同一次打开内不重播旧消息的入场(复用 EntranceTracker)。
  • 等待态改成三点呼吸:替掉静止的一行「正在整理…」,更像「在算」。
  • 回执改成浮起面小胶囊,带出入场,且不占布局(不再把输入区顶动)。
  • 发送键:按下回缩、可用 / 不可用之间底色与字色缓动,并补上「发送」读屏名。
  • 自动滚动收敛:只有本来就贴在底部时才自动跟到最新,向上翻历史时不再被新消息拽走;首次打开仍直接落在
    最新一条。
  • 助手身份标签由「✦ 整理结果」改为「✦ 助手」(提问类回答也说得通)。

变更:AI 助手(逻辑)

  • 可信时钟:上下文里单独给出一块「现在」(今天 / 明天 / 昨天 / 本周 + 教学周 + 开学日),并在提示词里
    要求日期与相对日期一律以此为准,不再让模型拿自己的日期知识去推「周三」是哪天。
  • 本地自检 + 一次修回:模型产出的动作先过一遍本地校验(节次是否落在作息内、周次是否在学期内、日期 /
    时间是否合法);不合格就把具体字段与原因喂回模型重出一份完整计划(只修一次),不再像以前那样把坏
    条目静默丢弃。修完仍不合格时只说明问题,不落地、不给确认按钮。
  • 确认卡改成字段级明细(名称 / 时间 / 周次 / 地点 / 教师;日程为标题 / 日期 / 时间 / 地点),
    不再是一行长句。
  • 解析阶段不再静默丢弃坏条目:缺字段 / 未知类型会带上下标与字段名进入问题列表,参与上面的修回。

变更:AI 助手(工具循环与改删课)

  • 只读工具循环:助手不再一次性作答 —— 需要事实时先调用只读工具(GET_CURRENT_OVERVIEW /
    SEARCH_COURSES / GET_WEEK_SCHEDULE / GET_SEMESTER_SCHEDULE / GET_PERIODS / GET_SETTINGS /
    GET_SCHEDULE_ADJUSTMENTS),App 执行后把结果回灌,最多 6 轮;事实够了再给动作。课程 ID 只能来自
    工具返回,不能编。
  • 可改 / 删已有课程:动作新增 update / delete(局部补丁,未给的字段保留;SELECTED_WEEKS 只改 /
    删指定周次,必要时把记录拆成「保留的周 + 改动后的周」两条)。改 / 删前先定位唯一课程,歧义就反问。
  • 长期记忆:新增 memory 动作,把用户偏好记下来并注入之后的对话;设置里新增「助手记忆」页,可查看 /
    增删 / 清空(仅本机,不进云端设置同步)。
  • 事实缓存:同一轮内相同调用只执行一次;跨轮用进程级缓存(随课程 / 日程 / 设置版本失效,5 分钟过期)。
  • 轻量遥测:每轮记录轮数 / 工具调用数 / 动作数 / 字符数 / 延迟(ai_agent_turn),不落库、不含课表正文。
  • 确认卡支持改 / 删的字段级「改前 → 改后」;主按钮文案由「确认添加」改为「确认执行」。
  • 系统提示词随之重写:加入输出协议(每轮 tool 或 actions)、工具目录,以及动作格式(建 / 改 / 删 / 记忆)。

变更:AI 助手(改设置 / 打开页面 / 原生函数调用)

  • 可改设置:动作新增 setting,白名单覆盖主题 / 强调色 / 提醒开关与提前量 / 提醒形态 / 明日预告与时刻 /
    日程提醒与时刻 / 上课免打扰 / 学期总周数;取值先经本地归一化与范围校验,落库走与设置页相同的 setter
    —— 设置页能拒绝的,助手也拒绝。
  • 打开页面:动作新增 open,把用户带到指定页(设置 / 作息 / 调休 / 记忆 / 导入…),只导航、不改数据;
    确认后先关面板、动画跑完再跳转。
  • 原生 function calling:只读工具改为按 provider 下发 tools(OpenAI 兼容端 tools、Gemini
    functionDeclarations),模型可直接返回原生工具调用;带工具请求被拒时自动退回纯文本,老的 JSON
    tool 协议仍是兜底。函数定义集中在 data/AiFunctions.kt,提示词目录与两家 wire 格式都由它生成。
  • 预览卡支持「改设置」的改前 → 改后。

新增:AppFunctions(Android 16+)

  • 接入 androidx.appfunctions(实验性),把课表能力以设备端 MCP 的形式开放给系统智能体:今日课程、
    按条件搜课、某周课程、作息、学期信息、加课、加日程、按 ID 删课。
  • 服务 ClasstableAppFunctionService 由 KSP 生成;清单已按官方契约声明(schema / v2 XML / intent-filter),
    res/xml/app_metadata.xml 描述能力边界与使用约束;函数与 DTO 都带 KDoc,由 @AppFunctionDeclaration /
    @AppFunctionSerializable 描述。低版本或未授权时系统不会调用,不影响应用其余部分。
  • 复用与站内助手同一套领域逻辑(AiPlanner / 仓库),两条入口行为一致。

3.3.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 12:39

把 AI 助手的入口与面板形态重做了一遍:入口从页顶那条隐蔽的下拉横条挪进课表页头,面板按聊天形态重排。

变更:AI 助手入口

  • 入口挪进课表页头:原先藏在页顶的下拉横条改成一个看得见的「✦ 助手」按钮(可点、可读屏);
    面板仍从顶部滑入,打开时隐藏底部导航,点遮罩 / 系统返回 / 面板返回箭头都能关闭。
    对话在本次会话内保留。

变更:AI 助手面板形态

  • 回答按聊天形态重排:用户消息是右对齐的实底气泡;AI 回答改为带「✦ 整理结果」标签的无气泡正文,
    并接入站内的轻量 Markdown 渲染(列表 / 加粗 / 小标题),不再是一坨无格式的平铺文字。
  • 输入区改成胶囊输入框 + 圆形发送键,替掉原先「下划线表单 + 方块按钮」的填表长相。
  • 面板改用浮起面 + 投影(与悬浮底部导航同一套浮起语言),读成「浮在课表上的一层」而非一张白纸。
  • 提示词放开轻量 Markdown,让助手能自己用列表 / 加粗把信息组织出来。

3.2.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 08:19

把导航栏与 AI 助手的入口、面板形态重做了一遍:助手不再占底部页签,入口挪进课表页头,面板按聊天形态重排;
顺手理清了 AI 的命名与配置位置,把「上课时间」从时间线改成清单式编辑,并补上雨课堂通知的 HTML 清洗。

变更:导航与助手入口

  • 底部导航从 5 个页签精简为 4 个(课表 / 课程 / 日程 / 设置),「助手」不再占用页签 —— 借鉴
    「助手是上下文入口,不是一级页面」的做法。
  • AI 助手入口挪进课表页头:原先藏在页顶的那条下拉横条改成一个看得见的「✦ 助手」按钮(可点、
    可读屏);面板仍从顶部滑入,打开时隐藏底部导航,点遮罩 / 系统返回 / 面板返回箭头都能关闭。
    对话在本次会话内保留。

变更:AI 助手面板形态

  • 回答按聊天形态重排:用户消息是右对齐的实底气泡;AI 回答改为带「✦ 整理结果」标签的无气泡正文,
    并接入站内的轻量 Markdown 渲染(列表 / 加粗 / 小标题),不再是一坨无格式的平铺文字。
  • 输入区改成胶囊输入框 + 圆形发送键,替掉原先「下划线表单 + 方块按钮」的填表长相。
  • 面板改用浮起面 + 投影(与悬浮底部导航同一套浮起语言),读成「浮在课表上的一层」而非一张白纸。
  • 提示词放开轻量 Markdown,让助手能自己用列表 / 加粗把信息组织出来。

变更:AI 命名与配置

  • 配置页标题由「AI 助手」改为「AI 设置」,并从「导入课表」分组移到设置首页「常用」里直达。
  • 修正指向不存在入口的文案(原为「设置 → 图片识别」);说明改为「图片识别与助手共用这份配置」。
  • 默认模型 ID 换成真实值:Gemini gemini-2.5-flash、OpenAI 兼容 gpt-4o。

变更:上课时间(作息)

  • 由按分钟成比例的「时间线 + 右下角拖拽手柄」改为清单式:一行一节
    「第 N 节 08:00–08:45 · 45 分钟」,时长用「- / +」按 5 分钟一档调,点任意时刻弹选择器精确改;
    课间单独一行,可改长短或插一节。

修复:雨课堂通知里的 HTML

  • 通知出口(新公告 / 课前提醒里的公告 / 实时活动 / FCM 正文)统一再清洗一次 HTML —— 旧缓存与
    转义过一层的 <p> 都不会再逐字显示。
  • 清洗器同时补上 <script> / <style> 整块剔除,并把标签识别收紧到「以字母开头」,避免把纯文本
    里的尖括号(5 < 6 > 3)误当标签吃掉。

内部质量

  • 清掉全部编译期废弃告警:hiltViewModel 换用新包 androidx.hilt.lifecycle.viewmodel.compose、
    resourceConfigurations 改为 androidResources.localeFilters、Hilt 限定注解显式标注 @param: 目标、
    App Check 的 Tasks.call 改为 TaskCompletionSource。
  • 两处替代方案牵涉后端 / 存储迁移的告警也已实迁:推送标识从废弃的 FCM 注册令牌改为
    Firebase Installation ID(FID)(登录后上报,去掉 getToken() / onNewToken();后端仍按同一
    字段定向投递——FID 可直接当令牌用);会话加密存储从废弃的 androidx.security:security-crypto
    换成基于 Android Keystore AES-GCM 的轻量 SecurePrefs,并移除了该依赖。
  • 迁移注意:旧会话(账号登录态 / 雨课堂登录态)不迁移,升级后需重登一次——会话可重新取得,
    不同于课程数据。

3.1.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 05:15

一次功能 + 内部质量并重的版本:新增 AI 助手(自然语言建课 / 建日程、询问课表),
修掉雨课堂公告的 HTML 直出,并把上一版欠下的构建纪律与适配脚本去重收尾。

新增:AI 助手

  • 底部导航新增「助手」页:用一句话就能建课 / 建日程,也能直接问课表安排。
    例:「周三下午加一门高数,1-16 周,教三 201」「明晚 8 点提醒我交作业」「这周哪天最空?」
  • 先预览、再落库:模型只负责把话解析成结构化动作,App 在聊天气泡里列成
    「将执行以下操作」卡片,点「确认添加」才写进课表 —— 模型幻觉不会直接污染课表。
  • 复用已有的 AI 供应商配置(Gemini / 任意 OpenAI 兼容接口);新增文本对话通道,
    并把「今天 / 作息 / 现有课表 / 近期日程」作为上下文喂给模型,便于换算日期、避开冲突。
  • 未配置密钥时给出明确提示;调用失败有错误行与 Crashlytics 上报。

修复:雨课堂公告 HTML 直出

  • 雨课堂的 content.text / app_text 偶尔带 HTML 标签与实体,此前全链路原样透传,
    <p> / <br> / &nbsp; 会逐字显示在课程详情页与通知里。现在入库前统一转纯文本
    (段落与 <br> 变换行、解码实体、折叠空行),详情页与通知一并干净。

内部质量

  • 统一 JVM/构建:布局 lint 的 7 个 error 全部修掉(4 处 java.time 的 ofInstant
    新 API 误用改为 atZone 换算、通知 notify 的 MissingPermission、WebView 桥的
    JavascriptInterface 误报);CI 增加 lint 步骤。
  • 天气密钥移出仓库:WEATHER_API_KEY 改从 local.properties / 环境变量读取,
    CI 走仓库 Secrets;留空自动退回访客额度。
  • 适配脚本去重:warehouse/resources 与 app/src/main/assets/.../resources 原本各存一份
    (265 个 .js,约 3.9MB),现在 git 只留源,构建期由 syncWarehouseAssets 任务生成进 assets,
    APK 内容与路径不变。

3.0.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 04:12

3.0.0 系列的正式版:rc1 的首次启动介绍与文案重写、rc2 的稳定性 / 性能加固就此定稿,
并在此之上又补了一轮线程、去重与交互一致性。

数据与稳定性(rc2 起)

  • 保存失败不再被吞。新增 / 编辑课程与日程、删除课程,此前把本地写失败 runCatching 掉
    却仍按「成功」返回上一层 —— 数据没落库、用户却以为已生效。现在只有真正写成功才返回,
    失败留在表单并弹窗说明(同时上报非致命异常)。
  • 同步按 nextPageToken 翻页。此前固定 pageSize=300 且不翻页,课程 / 日程超过一页时
    只会拿到前缀;现在拉全,本地清理也只在拉取完整后进行。
  • 加密会话读失败不再启动即崩。主密钥失效 / 密文损坏(ROM 升级、Keystore 重置、备份还原)
    时读取会抛异常,旧实现不捕获 → 每次启动都崩;现在退化为「未登录」并清掉损坏数据。
  • DataStore 加 corruptionHandler;一次坏写不再永久崩。
  • 导入更稳:手动表格 / AI 图片导入的读文件与解析移到 IO 线程并加兜底;图片先下采样重编码
    再上传(原来整张原图进内存 + Base64,大图会 OOM)。
  • 接收器 / 服务兜底:三个闹钟接收器补 catch + 上报;实时活动「挂前台失败」时一并收掉通知。

安全(rc2 起)

  • WebView 远程调试只在 debug 开放(教务登录页此前 release 也开着)。
  • 应用自身后端域名在网络安全配置里收紧为仅 https;教务系统仍放行明文(否则老系统白屏)。
  • 新增备份 / 换机传输规则,排除安装包、适配器缓存与加密会话文件。

性能(rc2 起)

  • 冷启动:通知渠道创建与 WorkManager 排队移出 Application.onCreate 主线程。
  • 组合期不再做系统 IPC:引导判断的通知 / 精确闹钟 / 电池查询改快照 + 回前台刷新。
  • 课程表单:颜色正则与预设色提前算好,不再每敲一键重编译 / 重解析。
  • 导入页:索引改 IO 加载(带载入提示),搜索派生值按输入缓存。
  • 流与映射:课程 / 日程行映射 flowOn(Default);设置流 shareIn + distinctUntilChanged。
  • 课表:周视图按天布局缓存;「现在」线在布局阶段读取,不再逐帧重组整个网格。
  • 首次引导:入场动画进度延迟读,不再每秒 60 次整屏重组。
  • 小组件:一次快照读齐设置 / 课程 / 日程。

本轮新增(rc2 → 3.0.0)

  • 线程:ReminderPlanner.rescheduleAll 与 withShortWakeLock 改 suspend,去掉内部
    runBlocking(所有调用点本就在协程中)。
  • 去重:删除不再使用的 Schedule.bigPeriods / currentBigPeriodIndex;新增 Schedule.nowMinute,
    内部多处「hour×60+minute」收敛到一处;日程编辑页的时间解析改回复用 Schedule.parseClock / clockText,去掉本地重写的第二套实现。
  • 交互:底部导航切换加触感、项高补到 44dp;编辑课程加「载入中…」载入态;退出登录补二次确认;
    顶部返回补无障碍标签;调休确认行改开关;外链补 ↗;开屏文案「课表」→「余课」;
    导入页「跳过 / 重试 / 关闭 / 首字母索引」、雨课堂登录页「后退 / 前进 / 刷新」、倒计时「已结束」
    展开、日历「今天」、检查更新「取消」、作息编辑「生成 / 收起」、关于页 GitHub 等可点文字统一补到
    44dp 触达区;AI 图片导入补加载 / 空态提示。
  • 构建:Gradle -Xmx 提到 4G,降低 R8 + Compose 构建 OOM 风险。

版本

  • 3.0.0-rc1(77) → 3.0.0-rc2(78) → 3.0.0(79),转正式版。

内部重构(3.0.0 定稿)

面向可维护性的一轮结构重整,不改用户可见行为:

  • DI 统一:接收器 / 服务不再手工 new ReminderPlanner(…, SettingsRepository(ctx), AppDatabase.get(ctx)…),
    统一走 @EntryPoint(NotifyEntryPoint、扩充后的 FcmEntryPoint);新增 di/CoroutineModule.kt
    提供单一 @ApplicationScope 协程作用域,课程 / 日程 / 认证 / 设置 / 更新 / 雨课堂六个仓库与
    ClasstableApp 共用它,不再各自 CoroutineScope(SupervisorJob() + Dispatchers.IO)。
  • 线程:ReminderPlanner.rescheduleAll / withShortWakeLock 改 suspend;接收器里散落的
    runBlocking(读设置 / 课表 / 公告)全部消除 —— goAsync 协程内直接挂起读。
  • 去重:新增 domain/Dates.kt(中文日期 / 星期 / 相对日的唯一来源)与 domain/Enums.kt
    (enumOrDefault),domain/Defaults.kt(ACCENT_HEX);"一二三四五六日"[day - 1] 的 11 处
    内联、runCatching { X.valueOf(…) }.getOrDefault(…) 的 15 处样板、#C56473 的 8 处字面量、
    hour * 60 + minute 的多处重复全部收敛;Schedule.nowMinute() 成为唯一实现。
  • 拆巨型文件:notify/Notifier.kt(583 行)拆为 NotifyChannels / CourseNotifier /
    AgendaNotifier / LiveUpdateNotifier / PushNotifier + NotifyShared;
    ui/importer/ImportScreen.kt(1265 行)拆为 ImportScreen(根屏)/ ImportSteps(三步 UI)/
    ImportWebView(WebView 配置与客户端)。
  • 构建:Gradle -Xmx 提到 4G。

3.0.0-rc2

3.0.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 02:29

一次以「稳定性 + 流畅度」为主的底层加固:修掉会静默丢数据 / 启动崩溃 / 安全暴露的老问题,
清掉启动与滚动路径上的主线程重活,并补齐几处交互一致性。

数据与稳定性

  • 保存失败不再被吞。新增 / 编辑课程与日程、删除课程,此前把本地写失败 runCatching 掉却
    仍按「成功」返回上一层 —— 数据没落库、用户却以为已生效。现在只有真正写成功才返回,
    失败留在表单并弹窗说明(同时上报非致命异常)。
  • 同步翻页。Firestore 拉取此前固定 pageSize=300 且不翻页,课程 / 日程超过一页时只会拿到
    前缀;现在按 nextPageToken 拉全,本地清理也只在拉取完整后进行。
  • 加密会话读失败不再启动即崩。EncryptedSharedPreferences 的主密钥失效 / 密文损坏
    (ROM 升级、Keystore 重置、备份还原)时读取会抛异常,旧实现不捕获 → 每次启动都崩。现在退化为
    「未登录」并清掉损坏数据,应用照常可用(雨课堂会话同理)。
  • DataStore 加 corruptionHandler。一次坏写会让此后每次读都抛 CorruptionException;
    现在命中即退化为空设置,不再永久崩。
  • 导入更稳。手动表格 / AI 图片导入的读文件与解析移到 IO 线程并加兜底(云盘 / 一次性授权
    的 URI 不再把应用带崩);图片会先下采样重编码再上传(原来整张原图进内存 + Base64,大图会 OOM)。
  • 接收器 / 服务异常兜底。课程提醒、下课、开机重排三个闹钟接收器此前只有 finally 没有
    catch,任意异常都会带着进程崩、闹钟还静默失败;现在捕获并上报。实时活动「挂前台失败」时
    会一并收掉已上屏的通知,不再留下划不掉的常驻通知。

安全

  • WebView 远程调试只在 debug 开放。这是用户输入教务账号密码的页面,此前 release 里也开着
    setWebContentsDebuggingEnabled(true),任何连 USB 的电脑都能通过 DevTools 读到页面与控制台。
  • 应用自身后端仅走 https。教务系统仍需放行 http 明文(否则老系统网页会白屏),但反代 / 天气 /
    Google 服务等自有域名在网络安全配置里收紧为禁止明文。
  • 备份范围收紧。新增备份 / 换机传输规则,排除下载的安装包(可达数十 MB,会把 Auto Backup
    的配额撑爆)、适配器缓存与两个加密会话文件。

性能

  • 冷启动:通知渠道创建与三组 WorkManager 定时任务的排队移出 Application.onCreate 主线程
    (建渠道是系统 IPC、WorkManager 首次调用还会初始化自己的库);首帧之前不再做这些。
  • 主线程不再做系统 IPC:首次引导判断里的通知 / 精确闹钟 / 电池白名单查询改为快照,
    只在回到前台时刷新,而不是每次重组都跨进程问一遍。
  • 课程表单:颜色校验正则与 20 个预设色提前算好,不再每敲一键重编译 / 重解析。
  • 导入页:适配器索引改到 IO 线程加载(带载入提示),搜索的过滤 / 排序 / 分组按输入缓存,
    字母索引单次遍历算出(O(N) 而非 O(字母数×学校数))。
  • 流与映射:课程 / 日程的行映射挪到后台线程;设置流 distinctUntilChanged + shareIn,
    全应用共享一份,不再被约十个订阅者各跑一遍 40 键映射。
  • 课表:周视图的按天布局结果缓存(不再每帧重算),「现在」时间线在布局阶段读取位置,
    动画不再逐帧重组整个网格。
  • 首次引导:入场动画的进度改为在合成层读取,七步错峰不再每秒 60 次整屏重组。
  • 小组件:每帧改为一次快照读齐设置 / 课程 / 日程(原来单个组件一帧能读 4 次设置 + 3 次数据库,
    改一门课还会连带刷新三个组件)。

交互

  • 切底部标签有触感了(全应用最常用的控件此前一处触感都没有);导航项高度补到 44dp。
  • 编辑课程不再先闪一帧空表单:等目标课程读出后再建表单,加载中给一行「载入中…」。
  • 退出登录补二次确认(与雨课堂一致),说明「退出后停止云同步、本机数据仍在」。
  • 顶部返回补无障碍标签(读屏此前只会念出符号「‹」)。
  • 调休确认行的「已选 / 忽略」由 chip 改为开关,与「二值一律用开关」的约定一致。
  • 外部链接补「↗」(检查更新的发布页、关于页的 GitHub 仓库)。
  • 开屏品牌文案修正:「课表」→「余课」。

版本

  • 3.0.0-rc1(77) → 3.0.0-rc2(78)。

3.0.0-rc1

3.0.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 00:31

一次围绕「首次启动」与「一眼看懂」的升级:新老用户首次打开都能看到一段介绍动画;后台菜单文案按「用户一眼看懂」重写;并修掉了课程结束后常驻通知不消失的老问题。

介绍

  • 首次启动介绍动画。品牌开场 + 四个功能亮点(看课表 / 快速导入 / 上课提醒 / 多端同步),可左右滑动或点「下一步」,随时可跳过。播放时机在开屏之后、权限引导之前 —— 先讲清应用能做什么,再要权限。全部只动合成层(淡入 / 位移 / 缩放),并随系统「移除动画」压缩。
  • 按主版本门控。新增 intro_seen_version(仅本机、不参与云同步):新用户与升级到 3.0.0 的老用户首次打开都会看到,之后同一主版本内升级不再重复。

提醒

  • 修掉「课程结束后通知仍然存在」。实时活动的下课收敛此前只依赖服务内部基于单调时钟的 delay(息屏 / Doze 时不按墙上时间推进);排在下课时刻的「相位边界闹钟」又因 endAt <= now 被提前 return 吞掉,永远走不到取消分支 —— 于是手机在课程结束那一刻处于息屏时,常驻的「课程进行中」通知会一直留在通知栏。现在下课边界闹钟会真正收尾:确认当前展示的正是这节课后,收掉通知与前台服务(两门课时间重叠时也不会误收另一门)。

文案

  • 后台设置区文案重写(按《Don't Make Me Think》原则):菜单名收敛到 2–4 字、描述不超过 20 字,用日常说法替换术语 ——「实时活动 → 倒计时通知」「适配器 → 识别方案」「AI 密钥 → 图片识别」「强调色 → 主色」「作息时间 → 上课时间」等。功能不变。

版本

  • 2.7.2(76) → 3.0.0-rc1(77)。

2.7.2

Choose a tag to compare

@github-actions github-actions released this 29 Sep 15:53

修复手势返回时页面缩放、淡入导致的内容遮挡。

转场

  • 预测性返回沿用统一转场。Navigation 2.10 起手势返回改走独立的预测性返回转场参数,此前未显式指定时会使用默认的缩放与淡入动画,导致「关于」等页面返回「设置」时缩在屏幕中央并压住底层文字。现在手势返回显式复用现有的单层滑出方案,保持一次转场只让一层在动。

版本

  • 2.7.1(75) → 2.7.2(76)。