Skip to content

Releases: lingion/sleepy

Sleepy v1.0.21 — 课程颜色自定义 + 网格修复 + 小组件刷新

28 Jun 06:08

Choose a tag to compare

v1.0.21 更新内容(自 v1.0.20 以来全部改动)

🎨 课程颜色

  • 自动配色:按 course.id × 黄金角 137.5° 确定性分配 HSL 色相,每门课颜色不同,不再按关键词撞色
  • 自定义颜色:编辑课程 → 颜色行点"+"→ 弹出 HSV 调色盘(饱和度/明度面板 + 360° 色相条)
  • 用户选的颜色优先于自动分配,不选则走自动色

📋 网格视图修复

  • 修复时间栏塌缩:10 节长课不再将时间栏压成一个卡片,每节独立显示
  • 修复滚动失效:全部节次可自由滚动
  • 架构重写:BoxWithConstraints + Modifier.offset 绝对定位
  • 修复列对齐:消除 weight Round 累积误差
  • 修复 startNode=3 卡片缺失
  • 移除空 cell 占位符

📥 导入功能

  • 导入预览对话框
  • 外部 app 打开 JSON 自动弹预览
  • 无课表时可直接导入

📊 "我的"页面

  • 课程数从行数改为去重门数

📅 当前周独立

  • 切课表视图查看不同周次,不再改变真实当前周

🔄 小组件刷新修复

  • 根因WidgetUpdater 只刷新 Glance widget,完全漏了 RemoteViews 版(Bitmap/Canvas)的 WeekGridWidgetProvider
  • 修复:编辑课程/换课表后两套小组件都强制刷新
  • Glance widget 加 3 次重试(500ms 间隔),不再静默吞异常

🔧 构建

  • applicationId 还原为 com.lingion.sleepy.debug

下载

  • app-arm64-v8a-debug.apk — arm64 真机
  • app-armeabi-v7a-debug.apk — arm32 真机
  • app-x86_64-debug.apk — x86_64 模拟器

Sleepy v1.0.20 — 提醒重做 + 关于页面

27 Jun 11:31

Choose a tag to compare

v1.0.20 更新内容

提醒功能重做

  • 移除首次启动权限弹窗:不再下载即问权限
  • 独立提醒页面:「我的」→「提醒」跳转(原行内 toggle 改为导航项)
  • Master toggle 权限流:默认关闭 → 点击开启 → 请求通知权限 → 拒绝则回弹关闭 → 可反复请求(非一次性)
  • 每日提醒:自定义任意时间,内容动态生成——「今日X号 您有N节课 第一节课XX于XX:XX在XX教室上课」
  • 每节课前提醒:自由输入分钟数(胶囊型输入框),内容——「下节课XX于XX:XX在XX教室上课」

关于页面

  • 版本信息(版本号 + 构建号)
  • 作者 Lingion(可跳转 GitHub 主页)
  • 开源地址 github.com/lingion/sleepy
  • GPL v3.0 开源声明

下载

  • app-arm64-v8a-debug.apk — arm64 真机
  • app-x86_64-debug.apk — x86_64 模拟器

Sleepy v1.0.19 (新 logo + 滑动切周)

28 Jun 08:40

Choose a tag to compare

v1.0.19 更新内容

新功能

  • 新 App 图标 — 全局替换为全新紫色 logo
  • 左右滑动切换周次 — 周视图和网格视图都支持手指左右滑动切换上一周/下一周
    • 从右往左拨 → 下一周
    • 从左往右拨 → 上一周
    • TopBar 箭头和下拉选周菜单与滑动双向同步(程序化切换瞬切,手势滑动有动画)

v1.0.17-18 累积更新

  • 完整导出功能 + 4 widget 真实渲染 + README 重写(v1.0.17)
  • 智慧节次编辑器(v1.0.16)
  • 导入课表改为 ModalBottomSheet 弹窗(v1.0.18)
  • 新建课表改为"点保存才生效"语义
  • 修复点"新建课表"时管理页"当前课表"卡片跳动

其他

  • App icon 背景色: #6750A4 → #1A1A2E 深紫黑
  • settings.gradle.kts: FAIL_ON_PROJECT_REPOS → PREFER_SETTINGS
  • JDK 21 构建

Sleepy v1.0.18 (patch)

28 Jun 08:40

Choose a tag to compare

v1.0.18 累计更新

教务导入 — wakeup.fun 全量整合

  • 183 所学校接入:来自 WakeupSchedule_BUPT 真实 URL+type 数据库
  • 每所学校均带真实教务 URL + 协议类型(wisedu/zf/qz/urp 等)
  • HEU 哈尔滨工程大学实测打通:登录页真实可达,金智教务直连
  • 协议类型覆盖:zf_new / zf / qz / qz_with_node / urp_new / urp / qz_br / cf / hnust / zf_1 / qz_crazy / pku / bnuz / wisedu / hniu / qz_old

学校列表 UI

  • 顶部总数统计:共 183 所
  • 搜索框支持中文子串 + 拼音首字母(如 hrbeu)
  • 实时匹配数显示

主页

  • 第 N 周按钮:Material3 DropdownMenu (FlowRow 5列标签网格)
  • 周次快速切换 / 不在当前周自动回弹

桌面小组件

  • Today / TwoDay 全部课程可滚动 (LazyColumn 替代 MAX_COURSES 截断)
  • PinWidgetActivity 支持 4 种 widget

修复

  • 导出文本/ICS 双向解析
  • 切换课表小组件自动刷新
  • 新建课表直接显示新表

GitHub: https://github.com/lingion/sleepy/releases/tag/v1.0.18

v1.0.17 完整导出 + 4 widget 真实渲染 + README 重写

25 Jun 14:14

Choose a tag to compare

v1.0.17 完整导出功能 + 4 widget 真实渲染 + README 重写

新增:完整导出课表(替换原"开发中"占位)

  • WakeUp 兼容 JSON(结构完整,可被同类 App 导入)
  • 分享文本(URL 编码 JSON,可粘贴聊天工具)
  • ICS 日历(标准 iCalendar,可导入系统日历 / Google / Apple Calendar)
  • 文件自动写入设备 Download/Sleepy/,触发系统分享面板

修复:Widget 选表 bug

  • WidgetTableResolver 之前优先选"非默认表",跳过真正的默认表数据
  • 修复后优先选有课的非空表
  • 4 类 widget 全部显示真实课程数据(不再显示 24 节暴力 mock)

文档:README 完全重写

  • 18 张截图全部为真实 HEU 课表(17 门 + 编译原理 18 周)
  • 三视图(周/网格/今日)一一对应
  • 4 个 widget 各 1 张独立截图
  • 删除多格式导入节(无截图)
  • 导出节配真实截图

包名/版本

  • versionCode 16 → 17
  • versionName 1.0.16 → 1.0.17
  • 包名仍为 com.lingion.sleepy.debug
  • APK 20MB(arm64-v8a debug 变体)

v1.0.16 智慧节次

25 Jun 08:29

Choose a tag to compare

v1.0.16 智慧节次(自动模式)+ 课表空态修复

修复重大 bug:去掉自动创建的占位默认表

  • 用户无表时 app 偷偷建了"默认课表 1"做占位
  • 用户手动建"默认课表 2"设了节次后,app 仍把"默认课表 1"
    当作默认表,导致节次看不到、加课不显示
  • "空课表也是课表",应该有自己的节次和视图

改动

  • ScheduleViewModel.loadTables(): 空表时不再自动建占位,selectedTableId = null
  • ScheduleViewModel.createEmptyTable(): 第一张表自动 isDefault=true(避免出现无默认表)
  • ScheduleViewModel.addEmptyCourse(): 没表时自动建表再加课
  • AddCourseScreen 保存: 没表自动建,drafts 的 tableId 用真实 id 修正
  • ScheduleScreen 区分两种空态:
    • 没表 → "还没有课表" + 两个 CTA(去管理 / 手动创建)
    • 有表无课 → "「表名」还是空的" + 加课/导入 CTA

新功能:智慧节次(自动模式)

  • 节次编辑器顶部 [手动模式]/[自动模式] Tab 切换
  • 三个字段驱动整日节次:每节时长 + 总节数 + 小课间/大课间模板
  • Break 分组卡片:每个 break 模板下显示 1.5, 2.5, ..., (N-1).5 位置卡片
  • 跨组互斥:同一 transition 只能属于一个 break
  • 默认 0 分钟:未选中的 transition = 0 分钟(连续上课)
  • 实时预览

历史修复

  • v1.0.16-1:点击自动模式 Tab 直接闪退
  • v1.0.16-2:包名 com.lingion.sleepy.debug,APK 20.4MB (debug variant)

数据模型

  • SmartPeriodConfig: startTime/periodMinutes/totalPeriods/breaks/transitionAssignments
  • BreakOption: minutes + isLong + label

测试

  • 30 + 7 = 37 用例全部通过

APK

  • sleepy-v1.0.16-2-arm64-v8a.apk (md5: e99bab9e15f6bae2501527b42a79b0a8)
  • 20.4MB, versionCode 16, versionName 1.0.16-debug
  • applicationId com.lingion.sleepy.debug

v1.0.15 干净重开版 - 哈工程金智Wisedu

25 Jun 06:32

Choose a tag to compare

干净重开 v1.0.15

修复

  • 哈工程教务系统导入:从零重写为金智 Wisedu jwapp 协议
    • JwWiseduParser: 解析 xskcb.do JSON → 46 个 JwCourse(多节拆分)
    • WISEDU_FETCH_JS: WebView 内 fetch 完整链路
      1. GET wdkb app 入口初始化 session(避免 module API 403)
      2. POST dqxnxq 拿当前学期
      3. POST xskcb 拿 34 行课表
    • 实测验证:CAS 登录 → fetch 链 → 34 行完整数据

节次时间

  • 不硬编码任何学校节次时间
  • TimeSlotEditor 在第一次导入时让用户确认(已有组件)
  • 节次数(KSJC/JSJC)从 xskcb API 拿

技术

  • versionName 1.0.9 → 1.0.15, versionCode 9 → 15
  • 30/30 单元测试通过
  • arm64-v8a only (20.4 MB)
  • md5: b0b46d9f1bbe6e1d33008277a24cf7e7

API 端点

  • CAS: https://cas.hrbeu.edu.cn/cas/login
  • 教务: https://jwgl.hrbeu.edu.cn/jwapp/sys/wdkb/*default/index.do
  • 当前学期: POST /jwapp/sys/wdkb/modules/jshkcb/dqxnxq.do
  • 课表: POST /jwapp/sys/wdkb/modules/xskcb/xskcb.do (XNXQDM form data)

v1.0.14: HEU 13节节次预设 + 教务导入流程补全 + RELEASE 整改

25 Jun 00:34

Choose a tag to compare

v1.0.14

新增

  • HEU 13 节节次时间预设: 哈工程入口自动预填 13 节时间表 (5 大节, 2025-2026-2 实测)
  • JwSchoolInfo 新增 timeJson 字段
  • JwImportConfigScreen 接受 initialTimeJson 预填

修复

  • 教务导入流程补全 (所有学校通用): 之前 WebView 抓数据 → 解析 → 直接落库 → Snackbar → finish(), 缺节次时间/开始日期/表名配置
  • 现在流程: 解析 → 配置页 (节次时间 + 开始日期 + 表名) → 确认 → 落库

RELEASE 整改

  • 删 14 个 v1.0.16-rebuild-* 脏 release + tag
  • v1.0.4 空 release
  • 新增 RELEASE_POLICY.md (semver 强制规范)
  • 修复 build.gradle.kts 版本号与 HEAD 不匹配 (v1.0.9 → v1.0.14, versionCode 9 → 14)

构建

  • APK: sleepy-v1.0.14-arm64-release.apk (13.7 MB)
  • versionCode: 14
  • versionName: 1.0.14
  • commit: 767b30c
  • tag: v1.0.14

v1.0.13: 教务导入流程补全配置页 (修复导入即跳回 bug)

25 Jun 00:38

Choose a tag to compare

v1.0.13

修复

  • 教务导入流程补全 (所有学校通用): 之前 WebView 抓数据 → 解析 → 直接落库 → Snackbar → finish(), 缺节次时间/开始日期/表名配置
  • 现在流程: 解析 → 配置页 (节次时间 + 开始日期 + 表名) → 确认 → 落库
  • 用户感知: 选学校 → WebView 登录 → 点导入 → 配置页弹出 (而不是回到学校列表)

构建

  • APK: sleepy-v1.0.13-arm64-release.apk
  • versionCode: 13
  • versionName: 1.0.13
  • commit: ad882c8
  • tag: v1.0.13

v1.0.12: HEU 教务导入 (金智 Wisedu 协议)

25 Jun 00:43

Choose a tag to compare

v1.0.12

新增

  • 哈工程教务系统课表导入: 金智 Wisedu 协议支持
  • JwWiseduParser: 解析 xskcb.do 返回的 JSON (KCM/SKJS/JASMC/SKXQ/KSJC/JSJC/SKZC/XNXQDM)
  • schools.json HEU 入口协议从 urp_new (HTML解析) 改为金智 jwapp (JSON API)

修复

  • urp_new 协议对金智 Wisedu 系统必然失败 (HTML 结构完全不同)
  • HEU 学号/密码在 WebView 输入 → 自动登录 → 自动抓 xskcb JSON → 解析为标准课程模型

构建

  • APK: sleepy-v1.0.12-arm64-release.apk
  • versionCode: 12
  • versionName: 1.0.12
  • commit: 912f03a
  • tag: v1.0.12