1/*
2 * Copyright (c) 2021-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 "processing_keyboard_device.h"
17
18#undef MMI_LOG_TAG
19#define MMI_LOG_TAG "ProcessingKeyboardDevice"
20
21namespace OHOS {
22namespace MMI {
23namespace {
24constexpr int32_t EVENT_REPORT_COUNTS { 50 };
25constexpr int64_t EVENT_REPORT_TIMES { 20 };
26} // namespace
27
28int32_t ProcessingKeyboardDevice::TransformJsonDataToInputData(const DeviceItem& fingerEventArrays,
29    InputEventArray& inputEventArray)
30{
31    CALL_DEBUG_ENTER;
32    std::vector<DeviceEvent> inputData = fingerEventArrays.events;
33    if (inputData.empty()) {
34        MMI_HILOGE("Manage KeyBoard array failed, inputData is empty.");
35        return RET_ERR;
36    }
37    std::vector<KeyBoardEvent> keyBoardEventArray;
38    if (AnalysisKeyBoardEvent(inputData, keyBoardEventArray) == RET_ERR) {
39        return RET_ERR;
40    }
41    TransformKeyBoardEventToInputEvent(keyBoardEventArray, inputEventArray);
42    return RET_OK;
43}
44
45void ProcessingKeyboardDevice::TransformKeyBoardEventToInputEvent(const std::vector<KeyBoardEvent>& keyBoardEventArray,
46                                                                  InputEventArray& inputEventArray)
47{
48    for (const auto &item : keyBoardEventArray) {
49        if (item.eventType == "KEY_EVENT_PRESS") {
50            TransformKeyPressEvent(item, inputEventArray);
51        } else if (item.eventType == "KEY_EVENT_RELEASE") {
52            TransformKeyReleaseEvent(item, inputEventArray);
53        } else if (item.eventType == "KEY_EVENT_CLICK") {
54            TransformKeyClickEvent(item, inputEventArray);
55        } else if (item.eventType == "KEY_EVENT_LONG_PRESS") {
56            TransformKeyLongPressEvent(item, inputEventArray);
57        } else {
58            MMI_HILOGW("Json file format error");
59        }
60    }
61}
62
63int32_t ProcessingKeyboardDevice::AnalysisKeyBoardEvent(const std::vector<DeviceEvent>& inputData,
64                                                        std::vector<KeyBoardEvent>& keyBoardEventArray)
65{
66    KeyBoardEvent keyBoardEvent = {};
67    for (const auto &item : inputData) {
68        keyBoardEvent = {};
69        keyBoardEvent.eventType = item.eventType;
70        keyBoardEvent.keyValue = item.keyValue;
71        keyBoardEvent.blockTime = item.blockTime;
72        keyBoardEventArray.push_back(keyBoardEvent);
73    }
74
75    return RET_OK;
76}
77
78void ProcessingKeyboardDevice::TransformKeyPressEvent(const KeyBoardEvent& keyBoardEvent,
79                                                      InputEventArray& inputEventArray)
80{
81    uint16_t keyValue = static_cast<uint16_t>(keyBoardEvent.keyValue);
82    SetKeyPressEvent(inputEventArray, keyBoardEvent.blockTime, keyValue);
83    SetSynReport(inputEventArray);
84}
85
86void ProcessingKeyboardDevice::TransformKeyLongPressEvent(const KeyBoardEvent& keyBoardEvent,
87                                                          InputEventArray& inputEventArray)
88{
89    uint16_t keyValue = static_cast<uint16_t>(keyBoardEvent.keyValue);
90    SetKeyPressEvent(inputEventArray, EVENT_REPORT_TIMES, keyValue);
91    SetSynReport(inputEventArray);
92    int32_t keyEventNum = (keyBoardEvent.blockTime / EVENT_REPORT_COUNTS) + 1;
93    int32_t count = 0;
94    while (count++ < keyEventNum) {
95        SetKeyLongPressEvent(inputEventArray, EVENT_REPORT_TIMES, keyValue);
96        SetSynConfigReport(inputEventArray, EVENT_REPORT_TIMES);
97    }
98    SetKeyReleaseEvent(inputEventArray, EVENT_REPORT_TIMES, keyValue);
99    SetSynReport(inputEventArray);
100}
101
102void ProcessingKeyboardDevice::TransformKeyReleaseEvent(const KeyBoardEvent& keyBoardEvent,
103                                                        InputEventArray& inputEventArray)
104{
105    uint16_t keyValue = static_cast<uint16_t>(keyBoardEvent.keyValue);
106    SetKeyReleaseEvent(inputEventArray, keyBoardEvent.blockTime, keyValue);
107    SetSynReport(inputEventArray);
108}
109
110void ProcessingKeyboardDevice::TransformKeyClickEvent(const KeyBoardEvent& keyBoardEvent,
111                                                      InputEventArray& inputEventArray)
112{
113    uint16_t keyValue = static_cast<uint16_t>(keyBoardEvent.keyValue);
114    SetKeyPressEvent(inputEventArray, keyBoardEvent.blockTime, keyValue);
115    SetSynReport(inputEventArray);
116    SetKeyReleaseEvent(inputEventArray, keyBoardEvent.blockTime, keyValue);
117    SetSynReport(inputEventArray);
118}
119} // namespace MMI
120} // namespace OHOS