1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "fingerprint_event_processor.h"
17
18 #include "libinput.h"
19
20 #include "ability_manager_client.h"
21 #include "dfx_hisysevent.h"
22 #include "event_log_helper.h"
23 #include "ffrt.h"
24 #include "input_event_handler.h"
25 #include "pointer_event.h"
26 #include "res_sched_client.h"
27 #include "res_type.h"
28 #include "setting_datashare.h"
29 #include "system_ability_definition.h"
30 #include "special_input_device_parser.h"
31
32 #undef MMI_LOG_DOMAIN
33 #define MMI_LOG_DOMAIN MMI_LOG_DISPATCH
34 #undef MMI_LOG_TAG
35 #define MMI_LOG_TAG "FingerprintEventProcessor"
36
37 namespace OHOS {
38 namespace MMI {
39 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
40 namespace {
41 constexpr int32_t MUTE_KEY_INIT { 0 };
42 constexpr int32_t MUTE_KEY_DOWN { 1 };
43 constexpr int32_t MUTE_KEY_UP { 2 };
44 constexpr int32_t POWER_KEY_UP_TIME { 1000 }; // 1000ms
45 constexpr int32_t VOLUME_KEY_UP_TIME { 500 }; // 500ms
46 const char* IS_START_SMART_KEY = "close_fingerprint_nav_event_key";
47 const char* IS_SMART_KEY_USE = "close_fingerprint_event_key";
48 const char* NEED_SHOW_DIALOG = "1";
49 const char* SMART_KEY_IS_OPEN = "1";
50 const char* SMART_KEY_IS_CLOSE = "0";
51 constexpr int32_t IS_SHOW_DIALOG = 1;
52 }
FingerprintEventProcessor()53 FingerprintEventProcessor::FingerprintEventProcessor()
54 {}
55
~FingerprintEventProcessor()56 FingerprintEventProcessor::~FingerprintEventProcessor()
57 {}
58
IsFingerprintEvent(struct libinput_event * event)59 bool FingerprintEventProcessor::IsFingerprintEvent(struct libinput_event* event)
60 {
61 CALL_DEBUG_ENTER;
62 CHKPF(event);
63 if (!isStartedSmartKey_) {
64 StartSmartKeyIfNeeded();
65 isStartedSmartKey_ = true;
66 }
67 if (!isCreatedObserver_) {
68 smartKeySwitch_.keyString = IS_START_SMART_KEY;
69 CreateStatusConfigObserver(smartKeySwitch_);
70 isCreatedObserver_ = true;
71 }
72 auto device = libinput_event_get_device(event);
73 CHKPR(device, false);
74 std::string name = libinput_device_get_name(device);
75 if (name != FINGERPRINT_SOURCE_KEY && name != SPECIAL_INPUT_DEVICE_PARSER.GetInputDevName("FINGER_PRINT_MOUSE")) {
76 MMI_HILOGD("Not FingerprintEvent");
77 return false;
78 }
79 if (name == FINGERPRINT_SOURCE_KEY) {
80 struct libinput_event_keyboard* keyBoard = libinput_event_get_keyboard_event(event);
81 CHKPR(keyBoard, false);
82 auto key = libinput_event_keyboard_get_key(keyBoard);
83 if ((key < FINGERPRINT_CODE_DOWN || key > FINGERPRINT_CODE_TOUCH) &&
84 key != FINGERPRINT_CODE_AFT_ON && key != FINGERPRINT_CODE_AFT_OFF) {
85 MMI_HILOGD("Not FingerprintEvent event");
86 return false;
87 }
88 }
89 return true;
90 }
91
SetPowerAndVolumeKeyState(struct libinput_event * event)92 void FingerprintEventProcessor::SetPowerAndVolumeKeyState(struct libinput_event* event)
93 {
94 CALL_DEBUG_ENTER;
95 CHKPV(event);
96 auto device = libinput_event_get_device(event);
97 CHKPV(device);
98 auto data = libinput_event_get_keyboard_event(event);
99 CHKPV(data);
100 int32_t keyCode = static_cast<int32_t>(libinput_event_keyboard_get_key(data));
101 auto iter = keyStateMap_.find(keyCode);
102 if (iter == keyStateMap_.end()) {
103 MMI_HILOGD("current keycode is not mistouch key, keycode is %{private}d", keyCode);
104 return;
105 }
106 int32_t keyAction = (libinput_event_keyboard_get_key_state(data) == 0) ?
107 (KeyEvent::KEY_ACTION_UP) : (KeyEvent::KEY_ACTION_DOWN);
108 MMI_HILOGD("current keycode is %{private}d, keyaction is %{private}d", keyCode, keyAction);
109 if (keyAction == KeyEvent::KEY_ACTION_DOWN) {
110 iter->second.first = MUTE_KEY_DOWN;
111 SendFingerprintCancelEvent();
112 } else {
113 iter->second.first = MUTE_KEY_UP;
114 iter->second.second = std::chrono::steady_clock::now();
115 }
116 }
117
SetScreenState(struct libinput_event * event)118 void FingerprintEventProcessor::SetScreenState(struct libinput_event* event)
119 {
120 CALL_DEBUG_ENTER;
121 CHKPV(event);
122 auto type = libinput_event_get_type(event);
123 MMI_HILOGD("smart key screen state is %{public}d", type);
124 switch (type) {
125 case LIBINPUT_EVENT_TOUCH_DOWN: {
126 screenState_ = true;
127 break;
128 }
129 case LIBINPUT_EVENT_TOUCH_UP: {
130 screenState_ = false;
131 break;
132 }
133 default: {
134 MMI_HILOGD("Unknown event type, touchType:%{public}d", type);
135 return;
136 }
137 }
138 ChangeScreenMissTouchFlag(screenState_, cancelState_);
139 }
140 /*
141 * This is a poorly designed state machine for handling screen touch errors, SAD :(
142 */
ChangeScreenMissTouchFlag(bool screen,bool cancel)143 void FingerprintEventProcessor::ChangeScreenMissTouchFlag(bool screen, bool cancel)
144 {
145 int32_t flag = screenMissTouchFlag_ ? 1 : 0;
146 MMI_HILOGD("screenMissTouchFlag_ :%{private}d, screen:%{private}d, cancel:%{private}d", flag, screen, screen);
147 if (screenMissTouchFlag_ == false) {
148 if (screen == true) {
149 screenMissTouchFlag_ = true;
150 if (!fingerprintFlag_) {
151 return;
152 }
153 SendFingerprintCancelEvent();
154 return;
155 }
156 } else {
157 if (screen == false && cancel == true) {
158 screenMissTouchFlag_ = false;
159 return;
160 }
161 }
162 }
CheckMisTouchState()163 bool FingerprintEventProcessor::CheckMisTouchState()
164 {
165 if (antiFalseTouchSwitch_ && (CheckKeyMisTouchState() || CheckScreenMisTouchState())) {
166 return true;
167 }
168 return false;
169 }
CheckScreenMisTouchState()170 bool FingerprintEventProcessor::CheckScreenMisTouchState()
171 {
172 int32_t flag = screenMissTouchFlag_ ? 1 : 0;
173 MMI_HILOGI("The screenMissTouchFlag_ is %{public}d", flag);
174 return screenMissTouchFlag_;
175 }
CheckKeyMisTouchState()176 bool FingerprintEventProcessor::CheckKeyMisTouchState()
177 {
178 CALL_DEBUG_ENTER;
179 bool ret = false;
180 for (auto &[key, value] : keyStateMap_) {
181 auto keystate = value.first;
182 MMI_HILOGD("keycode:%{private}d, state:%{public}d", key, value.first);
183 if (keystate == MUTE_KEY_DOWN) {
184 ret = true;
185 } else if (keystate == MUTE_KEY_UP) {
186 auto currentTime = std::chrono::steady_clock::now();
187 auto duration = currentTime - value.second;
188 auto durationMs = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
189 int32_t time = POWER_KEY_UP_TIME;
190 if (key != KEY_POWER) {
191 time = VOLUME_KEY_UP_TIME;
192 }
193 if (durationMs < time) {
194 MMI_HILOGD("Dont report because time diff < threshold, keycode:%{private}d, state:%{public}d",
195 key, value.first);
196 ret = true;
197 } else {
198 value.first = MUTE_KEY_INIT;
199 }
200 }
201 }
202 MMI_HILOGI("KeyMisTouchState is %{public}d", ret);
203 return ret;
204 }
205
SendFingerprintCancelEvent()206 int32_t FingerprintEventProcessor::SendFingerprintCancelEvent()
207 {
208 CALL_DEBUG_ENTER;
209 auto pointerEvent = PointerEvent::Create();
210 CHKPR(pointerEvent, ERROR_NULL_POINTER);
211 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_CANCEL);
212 int64_t time = GetSysClockTime();
213 pointerEvent->SetActionTime(time);
214 pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_FINGERPRINT);
215 pointerEvent->SetPointerId(0);
216 EventLogHelper::PrintEventData(pointerEvent, MMI_LOG_HEADER);
217 MMI_HILOGD("Fingerprint key:%{public}d", pointerEvent->GetPointerAction());
218 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && defined(OHOS_BUILD_ENABLE_MONITOR)
219 auto eventMonitorHandler_ = InputHandler->GetMonitorHandler();
220 if (eventMonitorHandler_ != nullptr) {
221 eventMonitorHandler_->OnHandleEvent(pointerEvent);
222 }
223 #endif
224 return ERR_OK;
225 }
226
HandleFingerprintEvent(struct libinput_event * event)227 int32_t FingerprintEventProcessor::HandleFingerprintEvent(struct libinput_event* event)
228 {
229 CALL_DEBUG_ENTER;
230 CHKPR(event, ERROR_NULL_POINTER);
231 auto device = libinput_event_get_device(event);
232 CHKPR(device, PARAM_INPUT_INVALID);
233 std::string name = libinput_device_get_name(device);
234 size_t pos = name.find("hand_status_dev");
235 if (name == FINGERPRINT_SOURCE_KEY) {
236 return AnalyseKeyEvent(event);
237 } else if (name == SPECIAL_INPUT_DEVICE_PARSER.GetInputDevName("FINGER_PRINT_MOUSE")) {
238 ProcessSlideEvent();
239 return AnalysePointEvent(event);
240 } else if (pos != std::string::npos) { // 设备名称包含hand_status_dev的即为合法设备
241 return AnalyseMsdpPointEvent(event);
242 } else {
243 MMI_HILOGI("Unknown input device name:%{public}s", name.c_str());
244 return PARAM_INPUT_INVALID;
245 }
246 }
247
AnalyseKeyEvent(struct libinput_event * event)248 int32_t FingerprintEventProcessor::AnalyseKeyEvent(struct libinput_event *event)
249 {
250 CALL_DEBUG_ENTER;
251 CHKPR(event, ERROR_NULL_POINTER);
252 struct libinput_event_keyboard* keyEvent = libinput_event_get_keyboard_event(event);
253 CHKPR(keyEvent, ERROR_NULL_POINTER);
254 auto key = libinput_event_keyboard_get_key(keyEvent);
255 enum libinput_key_state state = libinput_event_keyboard_get_key_state(keyEvent);
256 if (state == LIBINPUT_KEY_STATE_PRESSED) {
257 MMI_HILOGI("Dont analyse the press status for %{public}d", key);
258 return ERR_OK;
259 }
260 auto pointerEvent = PointerEvent::Create();
261 CHKPR(pointerEvent, ERROR_NULL_POINTER);
262 isStartedSmartKeyBySlide_ = false;
263 switch (key) {
264 case FINGERPRINT_CODE_AFT_ON: {
265 antiFalseTouchSwitch_ = true;
266 MMI_HILOGI("FingerPrint AFT on!");
267 return RET_OK;
268 }
269 case FINGERPRINT_CODE_AFT_OFF: {
270 antiFalseTouchSwitch_ = false;
271 MMI_HILOGI("FingerPrint AFT off!");
272 return RET_OK;
273 }
274 case FINGERPRINT_CODE_DOWN: {
275 fingerprintFlag_ = true;
276 cancelState_ = false;
277 ChangeScreenMissTouchFlag(screenState_, true);
278 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_DOWN);
279 ReportResSched(ResourceSchedule::ResType::RES_TYPE_CLICK_RECOGNIZE,
280 ResourceSchedule::ResType::ClickEventType::TOUCH_EVENT_DOWN);
281 break;
282 }
283 case FINGERPRINT_CODE_CANCEL: {
284 cancelState_ = true;
285 ChangeScreenMissTouchFlag(screenState_, cancelState_);
286 MMI_HILOGI("Change cancel state and dont send point event");
287 return RET_OK;
288 }
289 case FINGERPRINT_CODE_UP: {
290 fingerprintFlag_ = false;
291 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_UP);
292 ReportResSched(ResourceSchedule::ResType::RES_TYPE_CLICK_RECOGNIZE,
293 ResourceSchedule::ResType::ClickEventType::TOUCH_EVENT_UP);
294 break;
295 }
296 case FINGERPRINT_CODE_RETOUCH: {
297 fingerprintFlag_ = true;
298 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_RETOUCH);
299 ReportResSched(ResourceSchedule::ResType::RES_TYPE_CLICK_RECOGNIZE,
300 ResourceSchedule::ResType::ClickEventType::TOUCH_EVENT_DOWN);
301 break;
302 }
303 case FINGERPRINT_CODE_CLICK: {
304 fingerprintFlag_ = false;
305 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_CLICK);
306 ProcessClickEvent();
307 break;
308 }
309 case FINGERPRINT_CODE_HOLD: {
310 fingerprintFlag_ = true;
311 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_HOLD);
312 break;
313 }
314 case FINGERPRINT_CODE_TOUCH: {
315 fingerprintFlag_ = true;
316 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_TOUCH);
317 break;
318 }
319 default:
320 MMI_HILOGW("Unknown key event:%{private}d", key);
321 return UNKNOWN_EVENT;
322 }
323 int64_t time = GetSysClockTime();
324 pointerEvent->SetActionTime(time);
325 pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_FINGERPRINT);
326 pointerEvent->SetPointerId(0);
327 EventLogHelper::PrintEventData(pointerEvent, MMI_LOG_HEADER);
328 MMI_HILOGI("Fingerprint key:%{public}d", pointerEvent->GetPointerAction());
329 if (CheckMisTouchState()) {
330 MMI_HILOGD("In mistouch state, dont report event");
331 return ERR_OK;
332 }
333 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && defined(OHOS_BUILD_ENABLE_MONITOR)
334 auto eventMonitorHandler_ = InputHandler->GetMonitorHandler();
335 if (eventMonitorHandler_ != nullptr) {
336 eventMonitorHandler_->OnHandleEvent(pointerEvent);
337 }
338 #endif // (OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH) && OHOS_BUILD_ENABLE_MONITOR
339 return RET_OK;
340 }
341
AnalysePointEvent(libinput_event * event)342 int32_t FingerprintEventProcessor::AnalysePointEvent(libinput_event * event)
343 {
344 CALL_DEBUG_ENTER;
345 struct libinput_event_pointer* rawPointerEvent = libinput_event_get_pointer_event(event);
346 CHKPR(rawPointerEvent, ERROR_NULL_POINTER);
347 double ux = libinput_event_pointer_get_dx_unaccelerated(rawPointerEvent);
348 double uy = libinput_event_pointer_get_dy_unaccelerated(rawPointerEvent);
349 auto pointerEvent = PointerEvent::Create();
350 CHKPR(pointerEvent, ERROR_NULL_POINTER);
351 int64_t time = GetSysClockTime();
352 pointerEvent->SetActionTime(time);
353 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_FINGERPRINT_SLIDE);
354 pointerEvent->SetFingerprintDistanceX(ux);
355 pointerEvent->SetFingerprintDistanceY(uy);
356 pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_FINGERPRINT);
357 pointerEvent->SetPointerId(0);
358 EventLogHelper::PrintEventData(pointerEvent, MMI_LOG_HEADER);
359 MMI_HILOGI("Fingerprint key:%{public}d, ux:%f, uy:%f", pointerEvent->GetPointerAction(), ux, uy);
360 if (CheckMisTouchState()) {
361 MMI_HILOGD("In mistouch state, dont report event");
362 return ERR_OK;
363 }
364 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && defined(OHOS_BUILD_ENABLE_MONITOR)
365 auto eventMonitorHandler_ = InputHandler->GetMonitorHandler();
366 if (eventMonitorHandler_ != nullptr) {
367 eventMonitorHandler_->OnHandleEvent(pointerEvent);
368 }
369 #endif // (OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH) && OHOS_BUILD_ENABLE_MONITOR
370 return RET_OK;
371 }
372
AnalyseMsdpPointEvent(libinput_event * event)373 int32_t FingerprintEventProcessor::AnalyseMsdpPointEvent(libinput_event * event)
374 {
375 CALL_DEBUG_ENTER;
376 int32_t value = libinput_event_get_hand_feature(event);
377 auto pointerEvent = PointerEvent::Create();
378 CHKPR(pointerEvent, ERROR_NULL_POINTER);
379 pointerEvent->SetHandOption(value);
380 pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_MSDP_HAND_OPTINON);
381 EventLogHelper::PrintEventData(pointerEvent, MMI_LOG_HEADER);
382 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && defined(OHOS_BUILD_ENABLE_MONITOR)
383 auto eventMonitorHandler_ = InputHandler->GetMonitorHandler();
384 if (eventMonitorHandler_ != nullptr) {
385 eventMonitorHandler_->OnHandleEvent(pointerEvent);
386 }
387 #endif // (OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH) && OHOS_BUILD_ENABLE_MONITOR
388 return RET_OK;
389 }
390
391 template <class T>
CreateStatusConfigObserver(T & item)392 void FingerprintEventProcessor::CreateStatusConfigObserver(T& item)
393 {
394 CALL_DEBUG_ENTER;
395 SettingObserver::UpdateFunc updateFunc = [&item](const std::string& key) {
396 std::string value = NEED_SHOW_DIALOG;
397 auto ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID)
398 .GetStringValue(key, value);
399 if (ret != RET_OK) {
400 MMI_HILOGE("Get value from settings db failed, ret:%{public}d", ret);
401 return;
402 }
403 MMI_HILOGI("Config changed, key:%{public}s, value:%{public}s", key.c_str(), value.c_str());
404 item.valueString = value;
405 };
406
407 sptr<SettingObserver> statusObserver = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID)
408 .CreateObserver(item.keyString, updateFunc);
409 ErrCode ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID).RegisterObserver(statusObserver);
410 if (ret != RET_OK) {
411 MMI_HILOGE("Register setting observer failed, ret:%{public}d", ret);
412 statusObserver = nullptr;
413 }
414
415 std::string value = NEED_SHOW_DIALOG;
416 ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID)
417 .SettingDataShare::GetStringValue(item.keyString, value);
418 if (ret != RET_OK) {
419 MMI_HILOGE("Get value from settings db failed, ret:%{public}d", ret);
420 return;
421 }
422 MMI_HILOGI("Get value success, key:%{public}s, value:%{public}s", item.keyString.c_str(), value.c_str());
423 item.valueString = value;
424 }
425
StartSmartKeyIfNeeded()426 void FingerprintEventProcessor::StartSmartKeyIfNeeded()
427 {
428 std::string isStartSmartKey = SMART_KEY_IS_CLOSE;
429 ErrCode ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID)
430 .SettingDataShare::GetStringValue(IS_SMART_KEY_USE, isStartSmartKey);
431 if (ret != RET_OK) {
432 MMI_HILOGE("Get value from settings db failed, ret:%{public}d", ret);
433 return;
434 }
435 if (isStartSmartKey == SMART_KEY_IS_OPEN) {
436 MMI_HILOGI("Before start smart-key");
437 StartSmartKey(false);
438 }
439 }
440
StartSmartKey(bool isShowDialog)441 void FingerprintEventProcessor::StartSmartKey(bool isShowDialog)
442 {
443 ffrt::submit([isShowDialog] {
444 MMI_HILOGI("StartServiceExtAbility start");
445 std::shared_ptr<AAFwk::AbilityManagerClient> abmc = AAFwk::AbilityManagerClient::GetInstance();
446 CHKPF(abmc);
447 const std::string smartKeyBundleName = "";
448 const std::string smartKeyAbilityName = "";
449 AAFwk::Want want;
450 want.SetElementName(smartKeyBundleName, smartKeyAbilityName);
451 if (isShowDialog) {
452 want.SetParam("isShowDialog", IS_SHOW_DIALOG);
453 }
454 auto begin = std::chrono::high_resolution_clock::now();
455 auto ret = abmc->StartExtensionAbility(want, nullptr, -1, AppExecFwk::ExtensionAbilityType::SERVICE);
456 auto durationMS = std::chrono::duration_cast<std::chrono::milliseconds>(
457 std::chrono::high_resolution_clock::now() - begin).count();
458 #ifdef OHOS_BUILD_ENABLE_DFX_RADAR
459 DfxHisysevent::ReportApiCallTimes(ApiDurationStatistics::Api::ABILITY_MGR_START_EXT_ABILITY, durationMS);
460 #endif // OHOS_BUILD_ENABLE_DFX_RADAR
461 if (ret != RET_OK) {
462 MMI_HILOGE("StartExtensionAbility failed, ret:%{public}d", ret);
463 return false;
464 }
465 MMI_HILOGI("StartServiceExtAbility finished");
466 return true;
467 });
468 return;
469 }
470
ProcessSlideEvent()471 void FingerprintEventProcessor::ProcessSlideEvent()
472 {
473 if ((smartKeySwitch_.valueString == NEED_SHOW_DIALOG || smartKeySwitch_.valueString.empty()) &&
474 !isStartedSmartKeyBySlide_) {
475 isStartedSmartKeyBySlide_ = true;
476 StartSmartKey(true);
477 }
478 }
479
ProcessClickEvent()480 void FingerprintEventProcessor::ProcessClickEvent()
481 {
482 if (smartKeySwitch_.valueString == NEED_SHOW_DIALOG || smartKeySwitch_.valueString.empty()) {
483 StartSmartKey(true);
484 }
485 ReportResSched(ResourceSchedule::ResType::RES_TYPE_CLICK_RECOGNIZE,
486 ResourceSchedule::ResType::ClickEventType::TOUCH_EVENT_DOWN);
487 }
488
ReportResSched(uint32_t resType,int64_t value)489 void FingerprintEventProcessor::ReportResSched(uint32_t resType, int64_t value)
490 {
491 std::unordered_map<std::string, std::string> payload { {"msg", ""} };
492 auto begin = std::chrono::high_resolution_clock::now();
493 ResourceSchedule::ResSchedClient::GetInstance().ReportData(resType, value, payload);
494 auto durationMS = std::chrono::duration_cast<std::chrono::milliseconds>(
495 std::chrono::high_resolution_clock::now() - begin).count();
496 #ifdef OHOS_BUILD_ENABLE_DFX_RADAR
497 DfxHisysevent::ReportApiCallTimes(ApiDurationStatistics::Api::RESOURCE_SCHEDULE_REPORT_DATA, durationMS);
498 #endif // OHOS_BUILD_ENABLE_DFX_RADAR
499 }
500 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
501 } // namespace MMI
502 } // namespace OHOS
503