Skip to content

feat: 新增资源收藏功能 - #1541

Open
leemwood wants to merge 7 commits into
ZalithLauncher:mainfrom
leemwood:feature/asset_favorites
Open

feat: 新增资源收藏功能#1541
leemwood wants to merge 7 commits into
ZalithLauncher:mainfrom
leemwood:feature/asset_favorites

Conversation

@leemwood

@leemwood leemwood commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

功能概述

新增「资源收藏」功能,用户可收藏资源(整合包/模组/资源包/地图/光影)的项目 + 特定版本下载链接到本地,不收藏本地模组文件本身。

实现要点

持久化(Room)

  • 新增 FavoriteAsset 实体,复合唯一索引 (platform, projectId),DB v2 → v3 + MIGRATION_2_3
  • FavoriteAssetDaosuspendFavoriteManager object 管理器暴露 StateFlow<List<FavoriteAsset>>(参照 GamePathManager 模式)
  • ConvertersPlatform / PlatformClasses / PlatformReleaseType@TypeConverter

收藏入口(三处统一调 FavoriteManager

  1. 搜索结果卡_Search.Result.kt):仅有项目元信息,首次收藏 downloadUrl 留空 + versionName=null,UI 灰色徽标「未指定版本」
  2. 下载详情页版本行DownloadAssetsScreen / DownloadAssetsElements):收藏「项目 + 特定版本链接」,语义最完整,每个版本行独立显示收藏态
  3. 收藏列表FavoritesListScreen):卡片右侧图标显示已收藏态,点击取消

链接语义

  • downloadUrl平台原始直链(未经 MCIM 映射),下载时再 mapMCIMMirrorUrls
  • 未选版本允许 downloadUrl="" + versionName=null

路由

  • 点击收藏项 → 复用 NormalNavKey.DownloadAssets(platform, projectId, classes, iconUrl)
  • 侧边分类新增 NestedNavKey.DownloadFavorites,由 ScreenBackStackViewModel 持有 downloadFavoritesScreen
  • DownloadScreen.kt downloadsList 追加收藏分类(ic_favorite_outlined

收藏列表页

  • 顶部搜索框(按 title/slug/author/description/versionName 过滤)
  • 类别筛选 tab,图标复用下载页侧边栏同款 ic_*(整合包/模组/资源包/地图/光影)
  • 空态:图标 + 文案

字符串

  • 一律 favorites_ 前缀,5 语言(en/zh-rCN/tr/vi/pt-rBR)
  • 勿与「版本收藏」(CurrentGameInfo.favoritesMap)命名冲突

关键修复

  • FavoriteMapperprojectId 取自 PlatformProject.platformId()(非 PlatformVersion.platformId(),后者是 version id 会导致 404)
  • 下载详情页每版本行按 downloadUrl 比对判断收藏态,切换版本时保留原 savedAt

测试

  • ./gradlew :ZalithLauncher:assembleDebug 编译打包通过
  • 已在真机验证:搜索/下载详情/收藏列表三处入口正常,跳转不再 404

不包含

  • 未提交构建环境改动(gradle 镜像/JDK 路径,本地构建配置)
  • 未提交 AGENTS.md 开发规范文档

兼容性

  • DB 迁移 v2→3,不影响现有 accounts / servers / gamePaths
  • 不影响 CurrentGameInfo.favoritesMap(旧「版本收藏」语义保留)

@MovTery

MovTery commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

这类数据通常不太敏感,建议使用MMKV来存储,读写更高效,且能避免破坏原本的数据库结构
主要就是快,还支持分区读写

@leemwood
leemwood force-pushed the feature/asset_favorites branch from cba71e3 to 6172602 Compare July 10, 2026 23:49
@leemwood

Copy link
Copy Markdown
Contributor Author

已通过真机测试,可以合并(或合并至分支进行修改)。

leemwood added 5 commits July 13, 2026 19:47
- Room 持久化 FavoriteAsset 实体(platform+projectId 唯一),AppDatabase v2→3 迁移
- FavoriteManager 管理器 + StateFlow,三处入口(搜索结果卡/下载详情版本行/收藏列表)
- 收藏列表页支持按类别筛选(带侧边栏同款图标)与搜索
- 链接语义:存平台原始直链,下载时再走 MCIM 镜像
- FavoriteAsset 新增 type 字段(PROJECT/VERSION),唯一约束改为
  (platform, projectId, type, downloadUrl),AppDatabase v3→4 迁移
- 搜索结果卡仅切换项目收藏(isProjectFavorite),
  下载详情页版本行按 downloadUrl 切换版本收藏(isVersionFavorite),
  两者互不覆盖
- 收藏列表按 (platform, projectId) 分组合并为一行,
  展示项目收藏态与已收藏版本数/单版本名
- 仅收藏单版本(无项目收藏)时点击直接触发下载,
  其他情况跳转资源详情页
- 复用现有 DownloadSingleOperation 对话框与下载流程,
  新增 FavoriteAssetSnapshot 实现 PlatformVersion 快照
- FavoriteManager 新增 isProjectFavorite/isVersionFavorite/
  findProject/findVersions/removeProject/removeVersion/
  removeAllByProject/toggleProject/toggleVersion API
收藏功能未随版本发布,无需 v3→4 迁移,直接在 MIGRATION_2_3
建表语句中包含 type 列与新唯一索引 (platform, projectId,
type, downloadUrl)
- FavoriteAsset移除Room注解与id字段,改为纯Parcelable
- 新增_MMKV.kt,收藏以复合键(platform|projectId|type|downloadUrl)存储
- 删除FavoriteAssetDao
- FavoriteManager改用MMKV读写,不再依赖AppDatabase
- AppDatabase回退至v2(收藏未发布,无需v3表)
- Converters移除FavoriteType等收藏相关转换器
@leemwood
leemwood force-pushed the feature/asset_favorites branch from 6172602 to d958add Compare July 13, 2026 16:46
@MovTery
MovTery requested a review from Lo-quee July 15, 2026 20:28
dryfish09

This comment was marked as off-topic.

@leemwood

Copy link
Copy Markdown
Contributor Author

怎么又冲突了(

@leemwood leemwood closed this Aug 6, 2026
@leemwood
leemwood deleted the feature/asset_favorites branch August 6, 2026 11:57
@dryfish09

Copy link
Copy Markdown

Hmmm... Why???

@leemwood
leemwood restored the feature/asset_favorites branch August 6, 2026 13:01
@leemwood leemwood reopened this Aug 6, 2026
@leemwood

leemwood commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

抱歉,刚才误操作删除了该 PR 的源分支,导致 PR 被 GitHub 自动关闭。目前分支已经恢复,PR 也已重新开启。

@dryfish09

Copy link
Copy Markdown

Ah

- 数据层 6 文件收敛为 2 个:AssetFavorite + AssetFavoriteManager
- 存储改 GSON JSON + schemaVersion,主键改 (platform, projectId, type, versionId)
- 收藏态乐观更新 StateFlow,派生 favoriteKeys 集合供行级 O(1) 查询
- 收藏列表页重写:ViewModel、入场动画、滚动条、确认对话框、可展开版本子列表(下载/复制直链/单条移除)
- 共享组件改 trailingContent slot 注入,移除 favoriteProvider/FavoriteAction
- 详情页头部补项目收藏入口,版本行收藏态改按 versionId 判定
- 修复 savedAt 继承错误、AssetsVersionListItem 丢失的 padding、陈旧闭包
- 字符串收敛 download_favorites_* 前缀,删除 Weblate 托管语言(tr/vi/pt-rBR)改动
@leemwood

Copy link
Copy Markdown
Contributor Author

更新:按项目规范重写资源收藏功能

本次推送(387684d4)对实现做了一次全面重写,回应评审意见与既有规范:

数据层(6 文件 → 2 文件)

  • 存储改为 GSON JSON + schemaVersion(替换 @parcelize 二进制,后者改字段即静默丢数据且无迁移路径)
  • 收藏主键改为 (platform, projectId, type, versionId):版本收藏身份不再绑定 downloadUrl(URL 降级为下载载荷快照,仍存平台原始直链,下载时走既有 MCIM 映射)
  • 写操作乐观更新 StateFlow(取消每次写后的全量 reload 回读),判定+写入收进同一 Mutex;派生 favoriteKeys: StateFlow<Set<String>> 供列表行级 O(1) 查询收藏态
  • 删除死字段 categoriesCsv 与 4 个零调用 API;命名统一 AssetFavorite* 前缀,与旧「版本收藏」(CurrentGameInfo.favoritesMap)划清界限
  • MMKV 存储不变(mmkvWithID + MULTI_PROCESS_MODE,与项目惯例一致)

UI 层

  • 收藏列表页重写:文件私有 ViewModel + keyed 工厂、BaseScreen 消费 isVisible 的入场动画、lazyScrollWithBar + 12.dp 档位 + items(key)CheckChip 类别筛选、ScalingLabel 空态(区分无收藏/搜索无结果)
  • 收藏卡片可展开版本子列表:逐行提供 下载 / 复制直链 / 移除单版本——兑现「收藏指定版本」的核心价值
  • 删除整组收藏改为 Operation 状态机 + SimpleAlertDialog 确认(原先心形一键删全部且无确认)
  • 共享组件(AssetsVersionItemLayout/ResultProjectLayout/ProjectTitleHead)由 favoriteProvider 参数穿透改为 trailingContent slot 注入,elements 不再反向依赖 favorites 包
  • 三入口心形语义统一:项目收藏入口 = 搜索卡 + 详情页头部(新增);版本收藏 = 仅版本行;SearchIdScreen 与下载详情弹窗补齐入口
  • 版本行收藏态改按 versionId 判定(不再按 URL 比对);修复 savedAt 错误继承任意版本时间戳的排序错乱 bug;修复 AssetsVersionListItem 被误删的 padding(all = 8.dp)
  • 从收藏列表直接下载时在线重取版本(拿依赖列表与最新直链),失败回退快照并 toast 提示(原先快照依赖恒为空会导致模组缺依赖)

资源与翻译

  • 字符串收敛为 download_favorites_ 前缀并归入 Download 分组;删除 tr/vi/pt-rBR 三个 Weblate 托管语言的改动(之前冲突的主要来源);en 与 zh-rCN 严格 1:1 镜像;删除 3 个无引用的死键

验证

  • 完整 :ZalithLauncher:compileDebugKotlin + assembleDebug 通过(云构建环境,JDK 21 + SDK 37)
  • 真机验证中

改动面集中在 favorites 相关文件 + 5 处小 diff,共 28 个文件(+1485/-1004)。

@dryfish09 dryfish09 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's look good to me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants