feat(vibration): 服务端参数下发+双层开关+音量控制

REQ-20260430-0037

新增 VibrationConfigManager:
- MQTT type=7 → 更新振动方案参数(覆盖默认值)
- MQTT type=8 → 更新用户配置(震动开关/语音开关/音量)
- 线程安全(ConcurrentHashMap + @Volatile)
- 内存存储不持久化(MQTT重连后服务端重新下发)

VibrationController 新增 executeByPlanId(planId):
- 内部完成:获取方案(优先服务端参数)→ 双层开关 → 音量控制
- 调用方只传 planId,不关心参数来源和开关逻辑
- PunchViewModel/NotificationManager 调用简化为一行

双层开关逻辑:
- 系统级:方案自身 shockState/voiceState(type=7下发)
- 用户级:全局 userShockEnabled/userVoiceEnabled(type=8下发)
- 两层都开启才执行

音量控制:
- MediaPlayer.setVolume(volume, volume)
- volume = voiceValue / 100(服务端下发0~100)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-04-30 19:38:40 +09:30
parent d6a8f4acf9
commit 6e8c93fc46
6 changed files with 211 additions and 17 deletions

View File

@@ -3,7 +3,6 @@ package com.xiaoqu.watch.service.manager
import com.xiaoqu.watch.data.task.TaskStatistics
import com.xiaoqu.watch.device.screen.ScreenController
import com.xiaoqu.watch.device.sensor.VibrationController
import com.xiaoqu.watch.device.sensor.VibrationDefaults
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@@ -131,10 +130,7 @@ class NotificationManager @Inject constructor(
addTaskIds(taskIds)
// 震动 + 亮屏(只在首条时触发,暂存的合并后不重复震动)
val pattern = VibrationDefaults.getPattern(PLAN_NEW_MESSAGE)
if (pattern != null) {
vibrationController.executePattern(pattern)
}
vibrationController.executeByPlanId(PLAN_NEW_MESSAGE)
screenController.turnOn()
// 通知 HomeFragment 更新红点