• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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