1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "key_auto_repeat.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <array>
19c29fa5a6Sopenharmony_ci
20c29fa5a6Sopenharmony_ci#include "define_multimodal.h"
21c29fa5a6Sopenharmony_ci#include "error_multimodal.h"
22c29fa5a6Sopenharmony_ci#include "event_log_helper.h"
23c29fa5a6Sopenharmony_ci#include "input_device_manager.h"
24c29fa5a6Sopenharmony_ci#include "input_event_handler.h"
25c29fa5a6Sopenharmony_ci#include "i_preference_manager.h"
26c29fa5a6Sopenharmony_ci#include "mmi_log.h"
27c29fa5a6Sopenharmony_ci#include "timer_manager.h"
28c29fa5a6Sopenharmony_ci
29c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN
30c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_HANDLER
31c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
32c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "KeyAutoRepeat"
33c29fa5a6Sopenharmony_ci
34c29fa5a6Sopenharmony_cinamespace OHOS {
35c29fa5a6Sopenharmony_cinamespace MMI {
36c29fa5a6Sopenharmony_cinamespace {
37c29fa5a6Sopenharmony_ciconstexpr int32_t INVALID_DEVICE_ID { -1 };
38c29fa5a6Sopenharmony_ciconstexpr int32_t OPEN_AUTO_REPEAT { 1 };
39c29fa5a6Sopenharmony_ciconstexpr int32_t DEFAULT_KEY_REPEAT_DELAY { 500 };
40c29fa5a6Sopenharmony_ciconstexpr int32_t MIN_KEY_REPEAT_DELAY { 300 };
41c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_KEY_REPEAT_DELAY { 1000 };
42c29fa5a6Sopenharmony_ciconstexpr int32_t DEFAULT_KEY_REPEAT_RATE { 50 };
43c29fa5a6Sopenharmony_ciconstexpr int32_t MIN_KEY_REPEAT_RATE { 36 };
44c29fa5a6Sopenharmony_ciconstexpr int32_t MAX_KEY_REPEAT_RATE { 100 };
45c29fa5a6Sopenharmony_ciconst std::string KEYBOARD_FILE_NAME { "keyboard_settings.xml" };
46c29fa5a6Sopenharmony_ci} // namespace
47c29fa5a6Sopenharmony_ci
48c29fa5a6Sopenharmony_ciKeyAutoRepeat::KeyAutoRepeat() {}
49c29fa5a6Sopenharmony_ciKeyAutoRepeat::~KeyAutoRepeat() {}
50c29fa5a6Sopenharmony_ci
51c29fa5a6Sopenharmony_cistd::map<int32_t, DeviceConfig> KeyAutoRepeat::GetDeviceConfig() const
52c29fa5a6Sopenharmony_ci{
53c29fa5a6Sopenharmony_ci    return deviceConfig_;
54c29fa5a6Sopenharmony_ci}
55c29fa5a6Sopenharmony_ci
56c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::AddDeviceConfig(struct libinput_device *device)
57c29fa5a6Sopenharmony_ci{
58c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
59c29fa5a6Sopenharmony_ci    CHKPR(device, ERROR_NULL_POINTER);
60c29fa5a6Sopenharmony_ci    std::string fileName = KeyMapMgr->GetKeyEventFileName(device);
61c29fa5a6Sopenharmony_ci    DeviceConfig devConf;
62c29fa5a6Sopenharmony_ci    if (ReadTomlFile(GetTomlFilePath(fileName), devConf) != RET_OK) {
63c29fa5a6Sopenharmony_ci        MMI_HILOGI("Can not read device config file");
64c29fa5a6Sopenharmony_ci        return RET_ERR;
65c29fa5a6Sopenharmony_ci    }
66c29fa5a6Sopenharmony_ci    int32_t deviceId = INPUT_DEV_MGR->FindInputDeviceId(device);
67c29fa5a6Sopenharmony_ci    if (deviceId == INVALID_DEVICE_ID) {
68c29fa5a6Sopenharmony_ci        MMI_HILOGE("Find to device failed");
69c29fa5a6Sopenharmony_ci        return RET_ERR;
70c29fa5a6Sopenharmony_ci    }
71c29fa5a6Sopenharmony_ci    deviceConfig_[deviceId] = devConf;
72c29fa5a6Sopenharmony_ci    return RET_OK;
73c29fa5a6Sopenharmony_ci}
74c29fa5a6Sopenharmony_ci
75c29fa5a6Sopenharmony_cibool KeyAutoRepeat::JudgeKeyEvent(const std::shared_ptr<KeyEvent>& keyEvent)
76c29fa5a6Sopenharmony_ci{
77c29fa5a6Sopenharmony_ci    return (keyEvent->GetKeyAction() == KeyEvent::KEY_ACTION_UP) || (keyEvent->GetKeyAction() ==
78c29fa5a6Sopenharmony_ci            KeyEvent::KEY_ACTION_CANCEL);
79c29fa5a6Sopenharmony_ci}
80c29fa5a6Sopenharmony_ci
81c29fa5a6Sopenharmony_cibool KeyAutoRepeat::JudgeLimitPrint(const std::shared_ptr<KeyEvent>& keyEvent)
82c29fa5a6Sopenharmony_ci{
83c29fa5a6Sopenharmony_ci    return !EventLogHelper::IsBetaVersion() || keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE);
84c29fa5a6Sopenharmony_ci}
85c29fa5a6Sopenharmony_ci
86c29fa5a6Sopenharmony_civoid KeyAutoRepeat::SelectAutoRepeat(const std::shared_ptr<KeyEvent>& keyEvent)
87c29fa5a6Sopenharmony_ci{
88c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
89c29fa5a6Sopenharmony_ci    CHKPV(keyEvent);
90c29fa5a6Sopenharmony_ci    DeviceConfig devConf = GetAutoSwitch(keyEvent->GetDeviceId());
91c29fa5a6Sopenharmony_ci    MMI_HILOGD("AutoRepeatSwitch:%{public}d, keyEvent flag:%{public}x", devConf.autoSwitch, keyEvent->GetFlag());
92c29fa5a6Sopenharmony_ci    if (devConf.autoSwitch != OPEN_AUTO_REPEAT && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_SIMULATE)) {
93c29fa5a6Sopenharmony_ci        MMI_HILOGI("AutoRepeatSwitch not open and is not simulate event");
94c29fa5a6Sopenharmony_ci        return;
95c29fa5a6Sopenharmony_ci    }
96c29fa5a6Sopenharmony_ci    keyEvent_ = keyEvent;
97c29fa5a6Sopenharmony_ci    if (keyEvent_->GetKeyAction() == KeyEvent::KEY_ACTION_DOWN) {
98c29fa5a6Sopenharmony_ci        if (TimerMgr->IsExist(timerId_)) {
99c29fa5a6Sopenharmony_ci            if (!EventLogHelper::IsBetaVersion()) {
100c29fa5a6Sopenharmony_ci                MMI_HILOGI("Keyboard down but timer exists, timerId:%{public}d", timerId_);
101c29fa5a6Sopenharmony_ci            } else {
102c29fa5a6Sopenharmony_ci                if (keyEvent_->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
103c29fa5a6Sopenharmony_ci                    MMI_HILOGI("Keyboard down but timer exists, timerId:%{public}d, keyCode:%d",
104c29fa5a6Sopenharmony_ci                        timerId_, keyEvent_->GetKeyCode());
105c29fa5a6Sopenharmony_ci                } else {
106c29fa5a6Sopenharmony_ci                    MMI_HILOGI("Keyboard down but timer exists, timerId:%{public}d, keyCode:%{private}d",
107c29fa5a6Sopenharmony_ci                        timerId_, keyEvent_->GetKeyCode());
108c29fa5a6Sopenharmony_ci                }
109c29fa5a6Sopenharmony_ci            }
110c29fa5a6Sopenharmony_ci            TimerMgr->RemoveTimer(timerId_);
111c29fa5a6Sopenharmony_ci            keyEvent_->SetRepeatKey(false);
112c29fa5a6Sopenharmony_ci            timerId_ = -1;
113c29fa5a6Sopenharmony_ci            repeatKeyCode_ = -1;
114c29fa5a6Sopenharmony_ci        }
115c29fa5a6Sopenharmony_ci        int32_t delayTime = GetDelayTime();
116c29fa5a6Sopenharmony_ci        keyEvent_->SetRepeatKey(true);
117c29fa5a6Sopenharmony_ci        AddHandleTimer(delayTime);
118c29fa5a6Sopenharmony_ci        repeatKeyCode_ = keyEvent_->GetKeyCode();
119c29fa5a6Sopenharmony_ci    }
120c29fa5a6Sopenharmony_ci    if (JudgeKeyEvent(keyEvent_) && TimerMgr->IsExist(timerId_)) {
121c29fa5a6Sopenharmony_ci        TimerMgr->RemoveTimer(timerId_);
122c29fa5a6Sopenharmony_ci        keyEvent_->SetRepeatKey(false);
123c29fa5a6Sopenharmony_ci        timerId_ = -1;
124c29fa5a6Sopenharmony_ci        if (!JudgeLimitPrint(keyEvent_)) {
125c29fa5a6Sopenharmony_ci            MMI_HILOGI("Stop autorepeat, keyCode:%{private}d, repeatKeyCode:%{private}d, keyAction:%{public}d",
126c29fa5a6Sopenharmony_ci                keyEvent_->GetKeyCode(), repeatKeyCode_, keyEvent_->GetKeyAction());
127c29fa5a6Sopenharmony_ci        } else {
128c29fa5a6Sopenharmony_ci            MMI_HILOGI("Stop autorepeat, keyCode:%d, repeatKeyCode:%d, keyAction: %d",
129c29fa5a6Sopenharmony_ci                keyEvent_->GetKeyCode(), repeatKeyCode_, keyEvent_->GetKeyAction());
130c29fa5a6Sopenharmony_ci        }
131c29fa5a6Sopenharmony_ci        if (keyEvent_->GetKeyAction() == KeyEvent::KEY_ACTION_UP && repeatKeyCode_ != keyEvent_->GetKeyCode()) {
132c29fa5a6Sopenharmony_ci            std::optional<KeyEvent::KeyItem> pressedKeyItem = keyEvent_->GetKeyItem(keyEvent_->GetKeyCode());
133c29fa5a6Sopenharmony_ci            if (pressedKeyItem) {
134c29fa5a6Sopenharmony_ci                keyEvent_->RemoveReleasedKeyItems(*pressedKeyItem);
135c29fa5a6Sopenharmony_ci            } else {
136c29fa5a6Sopenharmony_ci                MMI_HILOGW("The pressedKeyItem is nullopt");
137c29fa5a6Sopenharmony_ci            }
138c29fa5a6Sopenharmony_ci            pressedKeyItem = keyEvent_->GetKeyItem(repeatKeyCode_);
139c29fa5a6Sopenharmony_ci            if (!pressedKeyItem) {
140c29fa5a6Sopenharmony_ci                return;
141c29fa5a6Sopenharmony_ci            }
142c29fa5a6Sopenharmony_ci            keyEvent_->SetKeyCode(repeatKeyCode_);
143c29fa5a6Sopenharmony_ci            keyEvent_->SetAction(KeyEvent::KEY_ACTION_DOWN);
144c29fa5a6Sopenharmony_ci            keyEvent_->SetKeyAction(KeyEvent::KEY_ACTION_DOWN);
145c29fa5a6Sopenharmony_ci            int32_t delayTime = GetDelayTime();
146c29fa5a6Sopenharmony_ci            keyEvent_->SetRepeatKey(true);
147c29fa5a6Sopenharmony_ci            AddHandleTimer(delayTime);
148c29fa5a6Sopenharmony_ci            if (!JudgeLimitPrint(keyEvent_)) {
149c29fa5a6Sopenharmony_ci                MMI_HILOGD("The end keyboard autorepeat, keyCode:%{private}d", keyEvent_->GetKeyCode());
150c29fa5a6Sopenharmony_ci            } else {
151c29fa5a6Sopenharmony_ci                MMI_HILOGD("The end keyboard autorepeat, keyCode:%d", keyEvent_->GetKeyCode());
152c29fa5a6Sopenharmony_ci            }
153c29fa5a6Sopenharmony_ci        } else {
154c29fa5a6Sopenharmony_ci            repeatKeyCode_ = -1;
155c29fa5a6Sopenharmony_ci        }
156c29fa5a6Sopenharmony_ci    }
157c29fa5a6Sopenharmony_ci}
158c29fa5a6Sopenharmony_ci
159c29fa5a6Sopenharmony_civoid KeyAutoRepeat::AddHandleTimer(int32_t timeout)
160c29fa5a6Sopenharmony_ci{
161c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
162c29fa5a6Sopenharmony_ci    timerId_ = TimerMgr->AddTimer(timeout, 1, [this]() {
163c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
164c29fa5a6Sopenharmony_ci        auto inputEventNormalizeHandler = InputHandler->GetEventNormalizeHandler();
165c29fa5a6Sopenharmony_ci        CHKPV(inputEventNormalizeHandler);
166c29fa5a6Sopenharmony_ci        LogTracer lt(this->keyEvent_->GetId(), this->keyEvent_->GetEventType(), this->keyEvent_->GetKeyAction());
167c29fa5a6Sopenharmony_ci        inputEventNormalizeHandler->HandleKeyEvent(this->keyEvent_);
168c29fa5a6Sopenharmony_ci        this->keyEvent_->UpdateId();
169c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
170c29fa5a6Sopenharmony_ci        int32_t triggertime = KeyRepeat->GetIntervalTime(keyEvent_->GetDeviceId());
171c29fa5a6Sopenharmony_ci        this->AddHandleTimer(triggertime);
172c29fa5a6Sopenharmony_ci    });
173c29fa5a6Sopenharmony_ci}
174c29fa5a6Sopenharmony_ci
175c29fa5a6Sopenharmony_cistd::string KeyAutoRepeat::GetTomlFilePath(const std::string &fileName) const
176c29fa5a6Sopenharmony_ci{
177c29fa5a6Sopenharmony_ci    return "/vendor/etc/keymap/" + fileName + ".TOML";
178c29fa5a6Sopenharmony_ci}
179c29fa5a6Sopenharmony_ci
180c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::GetIntervalTime(int32_t deviceId)
181c29fa5a6Sopenharmony_ci{
182c29fa5a6Sopenharmony_ci    int32_t triggertime = DEFAULT_KEY_REPEAT_RATE;
183c29fa5a6Sopenharmony_ci    GetKeyboardRepeatRate(triggertime);
184c29fa5a6Sopenharmony_ci    return triggertime;
185c29fa5a6Sopenharmony_ci}
186c29fa5a6Sopenharmony_ci
187c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::GetDelayTime()
188c29fa5a6Sopenharmony_ci{
189c29fa5a6Sopenharmony_ci    int32_t delaytime = DEFAULT_KEY_REPEAT_DELAY;
190c29fa5a6Sopenharmony_ci    GetKeyboardRepeatDelay(delaytime);
191c29fa5a6Sopenharmony_ci    return delaytime;
192c29fa5a6Sopenharmony_ci}
193c29fa5a6Sopenharmony_ci
194c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::GetKeyboardRepeatTime(int32_t deviceId, bool isDelay)
195c29fa5a6Sopenharmony_ci{
196c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
197c29fa5a6Sopenharmony_ci    auto iter = deviceConfig_.find(deviceId);
198c29fa5a6Sopenharmony_ci    int32_t repeatTime = isDelay ? DEFAULT_KEY_REPEAT_DELAY : DEFAULT_KEY_REPEAT_RATE;
199c29fa5a6Sopenharmony_ci    if (iter != deviceConfig_.end()) {
200c29fa5a6Sopenharmony_ci        repeatTime = isDelay ? iter->second.delayTime : iter->second.intervalTime;
201c29fa5a6Sopenharmony_ci    }
202c29fa5a6Sopenharmony_ci    return repeatTime;
203c29fa5a6Sopenharmony_ci}
204c29fa5a6Sopenharmony_ci
205c29fa5a6Sopenharmony_ciDeviceConfig KeyAutoRepeat::GetAutoSwitch(int32_t deviceId)
206c29fa5a6Sopenharmony_ci{
207c29fa5a6Sopenharmony_ci    auto iter = deviceConfig_.find(deviceId);
208c29fa5a6Sopenharmony_ci    if (iter == deviceConfig_.end()) {
209c29fa5a6Sopenharmony_ci        return {};
210c29fa5a6Sopenharmony_ci    }
211c29fa5a6Sopenharmony_ci    MMI_HILOGD("Open autorepeat:%{public}d", iter->second.autoSwitch);
212c29fa5a6Sopenharmony_ci    return iter->second;
213c29fa5a6Sopenharmony_ci}
214c29fa5a6Sopenharmony_ci
215c29fa5a6Sopenharmony_civoid KeyAutoRepeat::RemoveDeviceConfig(struct libinput_device *device)
216c29fa5a6Sopenharmony_ci{
217c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
218c29fa5a6Sopenharmony_ci    CHKPV(device);
219c29fa5a6Sopenharmony_ci    int32_t deviceId = INPUT_DEV_MGR->FindInputDeviceId(device);
220c29fa5a6Sopenharmony_ci    auto iter = deviceConfig_.find(deviceId);
221c29fa5a6Sopenharmony_ci    if (iter == deviceConfig_.end()) {
222c29fa5a6Sopenharmony_ci        MMI_HILOGI("Can not remove device config file");
223c29fa5a6Sopenharmony_ci        return;
224c29fa5a6Sopenharmony_ci    }
225c29fa5a6Sopenharmony_ci    deviceConfig_.erase(iter);
226c29fa5a6Sopenharmony_ci}
227c29fa5a6Sopenharmony_ci
228c29fa5a6Sopenharmony_civoid KeyAutoRepeat::RemoveTimer()
229c29fa5a6Sopenharmony_ci{
230c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
231c29fa5a6Sopenharmony_ci    TimerMgr->RemoveTimer(timerId_);
232c29fa5a6Sopenharmony_ci}
233c29fa5a6Sopenharmony_ci
234c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::SetKeyboardRepeatDelay(int32_t delay)
235c29fa5a6Sopenharmony_ci{
236c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
237c29fa5a6Sopenharmony_ci    int32_t repeatDelayTime = delay;
238c29fa5a6Sopenharmony_ci    if (delay < MIN_KEY_REPEAT_DELAY) {
239c29fa5a6Sopenharmony_ci        repeatDelayTime = MIN_KEY_REPEAT_DELAY;
240c29fa5a6Sopenharmony_ci    }
241c29fa5a6Sopenharmony_ci    if (delay > MAX_KEY_REPEAT_DELAY) {
242c29fa5a6Sopenharmony_ci        repeatDelayTime = MAX_KEY_REPEAT_DELAY;
243c29fa5a6Sopenharmony_ci    }
244c29fa5a6Sopenharmony_ci    std::string name = "keyboardRepeatDelay";
245c29fa5a6Sopenharmony_ci    if (PutConfigDataToDatabase(name, repeatDelayTime) != RET_OK) {
246c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set keyboard repeat delay");
247c29fa5a6Sopenharmony_ci        return RET_ERR;
248c29fa5a6Sopenharmony_ci    }
249c29fa5a6Sopenharmony_ci    MMI_HILOGD("Set keyboard repeat delay:%{public}d", repeatDelayTime);
250c29fa5a6Sopenharmony_ci    return RET_OK;
251c29fa5a6Sopenharmony_ci}
252c29fa5a6Sopenharmony_ci
253c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::SetKeyboardRepeatRate(int32_t rate)
254c29fa5a6Sopenharmony_ci{
255c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
256c29fa5a6Sopenharmony_ci    int32_t repeatRateTime = rate;
257c29fa5a6Sopenharmony_ci    if (rate < MIN_KEY_REPEAT_RATE) {
258c29fa5a6Sopenharmony_ci        repeatRateTime = MIN_KEY_REPEAT_RATE;
259c29fa5a6Sopenharmony_ci    }
260c29fa5a6Sopenharmony_ci    if (rate > MAX_KEY_REPEAT_RATE) {
261c29fa5a6Sopenharmony_ci        repeatRateTime = MAX_KEY_REPEAT_RATE;
262c29fa5a6Sopenharmony_ci    }
263c29fa5a6Sopenharmony_ci    std::string name = "keyboardRepeatRate";
264c29fa5a6Sopenharmony_ci    if (PutConfigDataToDatabase(name, repeatRateTime) != RET_OK) {
265c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set keyboard repeat rate");
266c29fa5a6Sopenharmony_ci        return RET_ERR;
267c29fa5a6Sopenharmony_ci    }
268c29fa5a6Sopenharmony_ci    MMI_HILOGD("Successfully set keyboard repeat for rate:%{public}d", repeatRateTime);
269c29fa5a6Sopenharmony_ci    return RET_OK;
270c29fa5a6Sopenharmony_ci}
271c29fa5a6Sopenharmony_ci
272c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::GetKeyboardRepeatDelay(int32_t &delay)
273c29fa5a6Sopenharmony_ci{
274c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
275c29fa5a6Sopenharmony_ci    std::string name = "keyboardRepeatDelay";
276c29fa5a6Sopenharmony_ci    if (GetConfigDataFromDatabase(name, delay) != RET_OK) {
277c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to get keyboard repeat delay");
278c29fa5a6Sopenharmony_ci        return RET_ERR;
279c29fa5a6Sopenharmony_ci    }
280c29fa5a6Sopenharmony_ci    if (delay == 0) {
281c29fa5a6Sopenharmony_ci        delay = DEFAULT_KEY_REPEAT_DELAY;
282c29fa5a6Sopenharmony_ci        if (keyEvent_ != nullptr) {
283c29fa5a6Sopenharmony_ci            delay = GetKeyboardRepeatTime(keyEvent_->GetDeviceId(), true);
284c29fa5a6Sopenharmony_ci        }
285c29fa5a6Sopenharmony_ci    }
286c29fa5a6Sopenharmony_ci    MMI_HILOGD("Get keyboard repeat delay:%{public}d", delay);
287c29fa5a6Sopenharmony_ci    return RET_OK;
288c29fa5a6Sopenharmony_ci}
289c29fa5a6Sopenharmony_ci
290c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::GetKeyboardRepeatRate(int32_t &rate)
291c29fa5a6Sopenharmony_ci{
292c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
293c29fa5a6Sopenharmony_ci    std::string name = "keyboardRepeatRate";
294c29fa5a6Sopenharmony_ci    if (GetConfigDataFromDatabase(name, rate) != RET_OK) {
295c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to get keyboard repeat rate");
296c29fa5a6Sopenharmony_ci        return RET_ERR;
297c29fa5a6Sopenharmony_ci    }
298c29fa5a6Sopenharmony_ci    if (rate == 0) {
299c29fa5a6Sopenharmony_ci        rate = DEFAULT_KEY_REPEAT_RATE;
300c29fa5a6Sopenharmony_ci        if (keyEvent_ != nullptr) {
301c29fa5a6Sopenharmony_ci            rate = GetKeyboardRepeatTime(keyEvent_->GetDeviceId(), false);
302c29fa5a6Sopenharmony_ci        }
303c29fa5a6Sopenharmony_ci    }
304c29fa5a6Sopenharmony_ci    MMI_HILOGD("Get keyboard repeat rate:%{public}d", rate);
305c29fa5a6Sopenharmony_ci    return RET_OK;
306c29fa5a6Sopenharmony_ci}
307c29fa5a6Sopenharmony_ci
308c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::GetRepeatKeyCode() const
309c29fa5a6Sopenharmony_ci{
310c29fa5a6Sopenharmony_ci    return repeatKeyCode_;
311c29fa5a6Sopenharmony_ci}
312c29fa5a6Sopenharmony_ci
313c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::PutConfigDataToDatabase(std::string &key, int32_t value)
314c29fa5a6Sopenharmony_ci{
315c29fa5a6Sopenharmony_ci    return PREFERENCES_MGR->SetIntValue(key, KEYBOARD_FILE_NAME, value);
316c29fa5a6Sopenharmony_ci}
317c29fa5a6Sopenharmony_ci
318c29fa5a6Sopenharmony_ciint32_t KeyAutoRepeat::GetConfigDataFromDatabase(std::string &key, int32_t &value)
319c29fa5a6Sopenharmony_ci{
320c29fa5a6Sopenharmony_ci    value = PREFERENCES_MGR->GetIntValue(key, value);
321c29fa5a6Sopenharmony_ci    return RET_OK;
322c29fa5a6Sopenharmony_ci}
323c29fa5a6Sopenharmony_ci} // namespace MMI
324c29fa5a6Sopenharmony_ci} // namespace OHOS