release: 2.1 通话记录 / 拨号器 / In-call 大改版 + 一堆 bug 修复
通话记录页 (CallLog)
- 整页改 MD3 list-item 风格 干掉每行 MaterialCardView, 改成整行 ripple + 字母头像圆
- 字母头像按号码 hash 在 primary/secondary/tertiary container 三色轮转, 同号码颜色固定
- 联系人有头像时异步加载 (ContactAvatars: 单线程 IO + 4MB LruCache + tag 防回收串图)
- 日期分组 header: 今天 / 昨天 / 更早
- 顶部 MD3 Filter ChipGroup: 全部 / 未接 / 来电 / 已拨 (单选必选)
- 未接电话方向 icon + 副文本走 colorError 突出
- 同号码连续多通自动折叠 显示 "(N)" 次数
- 折叠组点击行展开 显示组内每次时间 (Wed 4:36 PM 绝对时间格式 + 时长)
- 展开面板下方两个 Tonal action: Message (smsto:) / Contact (有联系人跳详情 没有就新建)
- 整行点击: 单通直接回拨 多通切换展开/折叠 右侧 IconButton 始终回拨最新一通
拨号器页 (Dialer)
- 整页重构: 顶部 ScrollView 可滚 + 底部固定拨号区 Y 不变
- 拨号区背景 colorSurfaceContainer 顶部圆角 28dp 视觉上和上方滚动区分开
- 号码显示行移到拨号区顶部: overflow icon 左 / EditText 居中 / backspace 右
- 顶部命中区按输入数字搜:
- 「All contacts」联系人 (Phone.NUMBER 归一化后 contains digits)
- 「Not in your contacts」通话记录里命中但不在通讯录的号码
- 匹配号码段加粗 (SpannableString StyleSpan), 例 "Mobile 11451<b>4</b>"
- 命中行带联系人头像 + 字母 fallback + 直接呼叫按钮
- DialerMatchRepository: ContactMatch + OtherMatch records 限 8 / 4 条
In-call 页
- 「更多」面板每行 Add call / Hold 改用圆角 28dp surfaceContainerHigh ripple 背景
- 行内 icon 圆从 colorSecondaryContainer (紫调) → colorSurfaceContainerHighest (中性灰)
- 「More」标题字号 TitleMedium → TitleLarge
- Dock 按钮圆角 30dp (胶囊) → 16dp (圆角方块) 跟 Pixel Dialer 一致
ContactsRepository
- 新增 lookupPhotoUri(): PhoneLookup 查 PHOTO_THUMBNAIL_URI 回退到 PHOTO_URI
- 新增 lookupContactUri(): 解出真正可 ACTION_VIEW 的 Contacts lookup uri
(之前直接拿 PhoneLookup CONTENT_FILTER_URI 去 VIEW 必然 ActivityNotFoundException)
Bug 修复
- More 面板 Add call / Hold icon 暗色模式下显示黑色:
IconicsImageView 不会自动跟随主题色 必须显式声明 app:iiv_color - 展开面板 Contact 按钮 toast「no app available」:
- PhoneLookup CONTENT_FILTER_URI 不能直接 ACTION_VIEW 改走 Contacts.getLookupUri
- ACTION_INSERT_OR_EDIT 改成 ACTION_INSERT + CONTENT_TYPE 跟 DialerFragment 对齐
- AndroidManifest 补 queries 声明 (Android 11+ package visibility):
smsto VIEW / SENDTO, contacts INSERT, contacts VIEW (item/contact + item/person) - Monochrome launcher icon 在 Pixel Launcher 不被主题化:
去掉 <group> scale/translate 变换 路径坐标 ×2.5 +24 烤进 108×108 viewport 直填
代码规范统一
- 去掉所有 inline 完整类名 (io.langya.module.R.string.xxx / android.R.attr.xxx)
- material / framework R 用 static import 个别属性常量 避免和项目 R 命名冲突
- import 分组: java → 第三方 (android/androidx/com/timber) → io.langya, 空行分隔
- 删未使用 import, 散落 magic dp 提取成常量