| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
mod clear deviceid Signed-off-by: 惠元通 <huiyuantong8@h-partners.com> | 5 个月前 | |
!9857 merge feat/perceive-recent-nonkey-event into master feat: add client-side PointerEvent recording and query Created-by: athends Commit-by: athends Merged-by: openharmony_ci Description: ### 相关的Issue #7703 ### 原因(目的、解决的问题等) 当前客户端(应用进程)没有能力记录和回查本进程收到的 PointerEvent。应用无法在不注册 consumer 的前提下,感知本进程最近收到的非按键输入事件。需要新增客户端事件记录能力,全程不连接服务端。 ### 描述(做了什么,变更了什么) 新增 PointerEventRecorder 类,作为 InputManagerImpl 私有成员,使用循环缓冲队列记录 PointerEvent 的 5 个已有字段(sourceType、toolType、deviceId、pointerAction、actionTime)。 新增 3 个 innerkit 接口(@since 26.0.0): - EnablePointerEventRecord(maxCount):开启记录,maxCount 上限 100(>100 钳位,≤0 拒绝),使用循环缓冲队列 - DisablePointerEventRecord():关闭记录,清空并释放缓冲内存 - GetPointerEventRecord(pointerList):返回所有记录,以重建的 PointerEvent 形式返回 **设计要点:** - 记录钩子挂在 OnPointerEvent 中 consumer_/eventHandler_ 校验之后,仅记录真正分发给应用的事件 - 关闭态:PushEvent 仅 1 次 atomic<bool> 读即返回(零开销) - 开启态:mutex lock + 5 字段平凡赋值,无字符串格式化、无堆分配 - Disable 调用 buffer_.clear() + capacity_=0 真正释放内存 **变更文件:** | 文件 | 操作 | |------|------| | pointer_event_recorder.h | 新增:PointerEventRecorder 类 + EventRecord 结构 | | pointer_event_recorder.cpp | 新增:Enable/Disable/PushEvent/Query 实现 | | input_manager.h | 修改:新增 3 个接口声明 | | input_manager.cpp | 修改:新增 3 个委托实现 | | input_manager_impl.h | 修改:新增 include + 3 方法声明 + pointerEventRecorder_ 成员 | | input_manager_impl.cpp | 修改:OnPointerEvent 记录钩子 + 3 方法实现 | | BUILD.gn(proxy + test) | 修改:5 个 target 注册新源文件 | | input_manager_impl_test.cpp | 修改:新增 14 个单测 | ### 验证结果(新增、改动、可能影响的功能) - 新增 14 个单测覆盖全部 AC(enable 正常/钳位/拒绝/重复、disable 清空/空关闭、query 正常/空/FIFO/对象独立性、5 字段正确性、关闭态零开销) - 待板侧编译验证:ninja -C out/standard InputManagerImplTest - 不影响已有功能:新增接口和成员,不修改已有行为 ### 多模输入上库必备 checklist: - [x] 【线程安全】buffer_ 由 std::mutex 保护,enabled_ 为 std::atomic<bool>,PushEvent 使用 double-check 模式;recorder mutex 独立于 resourceMtx_ 不嵌套 - [x] 【内存泄漏】Enable 预分配 buffer,Disable 调用 buffer_.clear() 释放内存;PushEvent 无动态分配 - [x] 【性能】关闭态仅 atomic 读;开启态 mutex + 5 字段赋值,无字符串格式化 - [x] 【避免深拷贝】PushEvent 入参为 const shared_ptr&;Query 返回新建对象 - [x] 【依赖】无新增外部依赖 - [x] 【重用】ring buffer 模式参考服务端 EventStatistic::PushPointerRecord/QueryPointerRecord - [x] 【返回值】Enable/Disable/Query 返回 RET_OK/RET_ERR;PushEvent 内 CHKPV 检查;Query 内 CHKPR 检查 Create() 返回值 ### 日志规范自检: - [x] 【规则】PushEvent 热路径无日志;仅 Enable/Disable 各一条 MMI_HILOGI - [x] 【规则】Enable 非法入参输出 MMI_HILOGE - [x] 【规则】Enable/Disable 日志使用 "Enable/Disable pointer event record" 主谓宾形式 - [x] 【规则】N/A(无状态转换日志) - [x] 【规则】maxCount 日志使用 maxCount=%{public}d 格式 - [x] 【规则】N/A - [x] 【规则】N/A ### 安全编码自检: - [x] 【指针】PushEvent 内 CHKPV(event);Query 内 CHKPR(pointerEvent, RET_ERR) - [x] 【临时变量】所有成员变量均赋初值(enabled_{false}, capacity_{0}, head_{0} 等) - [x] 【数组下标】ring buffer 索引使用 % capacity_,capacity_ > 0 由 enabled_ 保证 - [x] 【内存管理】buffer_.resize(maxCount),maxCount ∈ [1,100] - [x] 【内存管理】Disable 调用 buffer_.clear() 释放 - [x] 【内存管理】PointerEvent::Create() 返回值由 CHKPR 检查 - [x] 【内存管理】N/A(无全局变量需置空) - [x] 【整数运算】capacity_ > 0 保证取模安全;maxCount 边界已校验 - [x] 【整数运算】无有符号整数位运算 - [x] 【循环变量】Query 循环 int32_t i < size_,size_ ≤ capacity_ ≤ 100 - [x] 【循环变量】循环不受外部数据控制 - [x] 【安全函数】N/A(未使用安全函数) - [x] 【安全函数】N/A - [x] 【外部输入校验】maxCount ≤ 0 拒绝,> 100 钳位为 100 - [x] 【外部输入校验】N/A(无外部输入解析) - [x] 【常见问题】无新增异常返回分支导致资源泄漏 - [x] 【常见问题】CHKPV 宏使用正确 - [x] 【常见问题】返回类型一致(int32_t) - [x] 【常见问题】日志格式 %{public}d 匹配 int32_t ### 是否已执行mini system用例 - [ ] 已验证 - [x] 不涉及。如不涉及,请写明理由 理由:本次新增客户端 innerkit 接口,需在板侧编译验证单测后再执行 mini system 用例 See merge request: openharmony/multimodalinput_input!9857 | 16 小时前 | |
去除无效DT用例 Signed-off-by: swtyxy <1905390725@qq.com> | 3 天前 |