240 lines
6.9 KiB
Markdown
240 lines
6.9 KiB
Markdown
# Codex Xugong
|
|
|
|
## Workspace
|
|
|
|
- Root: `D:\zdCode\xugong`
|
|
- Project type: multi-module Android project
|
|
- Main module registry: `settings.gradle`
|
|
|
|
## Fast Start
|
|
|
|
下次进入这个项目,优先按下面顺序建立上下文,不需要全仓扫描。
|
|
|
|
1. 先确认当前任务目标
|
|
2. 再定位相关模块
|
|
3. 只沿调用链读取必要代码
|
|
4. 需要修改时,再扩展到相邻模块
|
|
|
|
推荐开场信息:
|
|
|
|
```text
|
|
继续处理 xugong 项目
|
|
当前问题:<一句话描述>
|
|
相关模块:<模块名列表>
|
|
已知结论:<如果有,写 1-3 句>
|
|
```
|
|
|
|
示例:
|
|
|
|
```text
|
|
继续处理 xugong 项目的蓝牙通讯录重复同步问题
|
|
相关模块:YX_Voice / YX_BluetoothSDK / YX_BlueTooth
|
|
已知结论:syncBtPhoneContactStatus 在连接成功后和 PBAP 通讯录下载完成后各发送了一次
|
|
```
|
|
|
|
## Module Heuristics
|
|
|
|
当前仓库很大,但常见问题可先按职责收敛:
|
|
|
|
- `YX_Voice`: 语音协议、事件上报、蓝牙状态同步到语音侧
|
|
- `YX_BluetoothSDK`: 蓝牙协议、PBAP、联系人/通话记录同步
|
|
- `YX_BlueTooth`: 蓝牙业务 UI、ViewModel、页面触发入口
|
|
- `YX_Lib_CommonBase`: 常量、公共协议字段
|
|
|
|
如果问题和蓝牙联系人同步有关,默认先看:
|
|
|
|
- `YX_Voice/src/main/java/com/yaxon/voice/helper/VoiceEventHelper.java`
|
|
- `YX_Voice/src/main/java/com/yaxon/voice/protocol/YxProtocol.java`
|
|
- `YX_Voice/src/main/java/com/yaxon/voice/receiver/BluetoothMonitorReceiver.java`
|
|
- `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.java`
|
|
- `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/platform/BluetoothPbapClient.java`
|
|
|
|
## Current Topic
|
|
|
|
### Issue
|
|
|
|
日志文件:
|
|
|
|
- `C:\Users\Administrator\Desktop\徐工日志\yx_log\2026_0513_1747_33_545.log`
|
|
|
|
问题:
|
|
|
|
- 打开蓝牙并连接手机后,`syncBtPhoneContactStatus` 发送了 2 次
|
|
|
|
### Current Conclusion
|
|
|
|
`syncBtPhoneContactStatus` 的两次发送不是单纯由“蓝牙打开”触发,而是两段不同链路:
|
|
|
|
1. 蓝牙连接成功后立即上报一次当前联系人
|
|
2. 首次连接触发 PBAP 通讯录下载,下载完成后再次上报一次
|
|
|
|
关键日志时间点:
|
|
|
|
- `2026-05-13 17:48:07.393` 第一次发送 `syncBtPhoneContactStatus`
|
|
- `2026-05-13 17:48:13.662` `BtContactsManager` 触发 `phoneBookPullRequest`
|
|
- `2026-05-13 17:48:14.270` 第二次发送 `syncBtPhoneContactStatus`
|
|
|
|
### Relevant Code Paths
|
|
|
|
当前已确认的主要入口:
|
|
|
|
- `YX_Voice/.../YxProtocol.java`
|
|
- `BLUETOOTH_CONNECT_STATUS` 中调用 `VoiceManager.VOICE_EVENT_HELPER.notifyContact()`
|
|
- `YX_Voice/.../BluetoothMonitorReceiver.java`
|
|
- `ACTION_CONTACTS_DOWNLOAD_COMPLETE` 中调用 `VoiceManager.VOICE_EVENT_HELPER.notifyContact()`
|
|
- `YX_Voice/.../VoiceEventHelper.java`
|
|
- `initNotifyBluetoothStatus()` 中会补发一次 `notifyContact()`
|
|
|
|
联系人下载链路:
|
|
|
|
- `BtContactsManager.onPbabStatusChanged(...)`
|
|
- `BluetoothPbapClient.phoneBookPullRequest(...)`
|
|
- `ContactUtils.getAllContacts(...)`
|
|
- 完成后回到语音侧再触发联系人同步
|
|
|
|
## Suggested Fix
|
|
|
|
优先按“数据就绪事件”而不是“连接事件”驱动联系人同步。
|
|
|
|
建议顺序:
|
|
|
|
1. 去掉连接成功后立即 `notifyContact()` 的路径
|
|
2. 保留 PBAP 下载完成后的联系人同步
|
|
3. 保留显式查询联系人时的主动同步
|
|
4. 给 `notifyContact()` 增加幂等保护
|
|
|
|
推荐幂等键:
|
|
|
|
- `activeDeviceMac`
|
|
- `contactJson` 的 hash
|
|
|
|
推荐规则:
|
|
|
|
- 同一 `mac`
|
|
- 同一份联系人内容
|
|
|
|
则跳过重复发送 `syncBtPhoneContactStatus`
|
|
|
|
### Minimal Safe Change
|
|
|
|
如果只做最小改动,先改这一条:
|
|
|
|
- 删除 `YxProtocol.BLUETOOTH_CONNECT_STATUS` 里的 `notifyContact()`
|
|
|
|
保留:
|
|
|
|
- PBAP 下载完成广播触发的 `notifyContact()`
|
|
- 手动查询联系人时触发的 `notifyContact()`
|
|
|
|
同时把初始化补发改成带条件:
|
|
|
|
- 仅当当前已连接
|
|
- 且本地已有该 `mac` 的联系人缓存
|
|
|
|
才补发联系人
|
|
|
|
## Re-entry Notes
|
|
|
|
如果下次关闭终端后重新进入,直接:
|
|
|
|
```powershell
|
|
cd D:\zdCode\xugong
|
|
```
|
|
|
|
然后对 Codex 说:
|
|
|
|
```text
|
|
按 codex_xugong.md 继续
|
|
```
|
|
|
|
或者补一句:
|
|
|
|
```text
|
|
按 codex_xugong.md 继续,开始改蓝牙联系人重复同步
|
|
```
|
|
|
|
## Session Log
|
|
|
|
### 2026-05-13
|
|
|
|
当前分析聚焦在“蓝牙联系人同步到语音侧”的链路。
|
|
|
|
#### Logs Conclusion
|
|
|
|
日志文件:
|
|
|
|
- `C:\Users\Administrator\Desktop\徐工日志\yx_log\2026_0513_1747_33_545.log`
|
|
|
|
结论:
|
|
|
|
- `syncBtPhoneContactStatus` 确实发送了 2 次
|
|
- 不是单纯“蓝牙打开”导致 2 次
|
|
- 实际是:
|
|
1. 蓝牙连接成功后先上报一次联系人
|
|
2. PBAP 通讯录下载完成后又上报一次联系人
|
|
|
|
#### Uncommitted Code Review
|
|
|
|
已分析当前工作区未提交改动,重点文件:
|
|
|
|
- `YX_Voice/src/main/java/com/yaxon/voice/helper/ContactHelper.java`
|
|
- `YX_Voice/src/main/java/com/yaxon/voice/helper/VoiceEventHelper.java`
|
|
- `YX_Voice/src/main/java/com/yaxon/voice/protocol/BluetoothProtocol.java`
|
|
- `YX_Voice/src/main/java/com/yaxon/voice/helper/BlueToothHelper.java`
|
|
- `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtSettingManager.java`
|
|
- `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.java`
|
|
- `YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtVoiceManager.java`
|
|
|
|
当前未提交改动的主要目的:
|
|
|
|
- 修复“切换不同手机后,把多个手机的通讯录一起同步给语音侧”的问题
|
|
|
|
当前结论:
|
|
|
|
1. 这次改动的主方向是对的
|
|
2. 关键修复已经落在“按当前活动设备 `macAddress` 过滤联系人”
|
|
3. `notifyContact()` 不再直接读全量蓝牙联系人,而是:
|
|
- 先取 `activeDeviceMac`
|
|
- 再调用 `getContactsNew(macAddress)`
|
|
4. `ContactHelper.getContactsNew(macAddress)` 已经对 `content://com.yaxon.bluetooth.contact/table_contacts` 加了:
|
|
- `selection = "macAddress = ?"`
|
|
- `selectionArgs = new String[]{macAddress}`
|
|
5. 数据表列名 `macAddress` 已核对,和 `YX_BluetoothSDK` 里的数据库定义一致
|
|
|
|
这意味着:
|
|
|
|
- “多台手机联系人混发”的问题,当前未提交代码已经基本修住
|
|
|
|
#### Remaining Risks
|
|
|
|
这批改动还没有解决的点:
|
|
|
|
1. 仍可能对同一台手机重复同步 2 次联系人
|
|
- 连接成功一次
|
|
- PBAP 下载完成一次
|
|
|
|
2. `notifyContact()` 现在强依赖 `activeDeviceMac`
|
|
- 如果某个时序里先触发 `notifyContact()`
|
|
- 但语音侧还没收到 `cmd.syncBtActiveDeviceMac`
|
|
- 这次同步会直接跳过,日志会打印 `notifyContact: no active device`
|
|
|
|
#### Next Step
|
|
|
|
明天继续时,建议在当前基础上做这两件事:
|
|
|
|
1. 给 `notifyContact()` 增加幂等保护
|
|
- 去重键建议:`macAddress + contactJson/hash`
|
|
|
|
2. 收敛联系人同步触发时机
|
|
- 区分“连接事件”
|
|
- 区分“PBAP 下载完成事件”
|
|
- 避免同一份联系人重复发给语音侧
|
|
|
|
#### Resume Prompt
|
|
|
|
明天可直接输入:
|
|
|
|
```text
|
|
按 codex_xugong.md 继续,基于当前未提交代码继续处理蓝牙联系人同步去重
|
|
```
|