1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-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#ifndef KEY_COMMAND_HANDLER_H
17c29fa5a6Sopenharmony_ci#define KEY_COMMAND_HANDLER_H
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include <chrono>
20c29fa5a6Sopenharmony_ci#include <condition_variable>
21c29fa5a6Sopenharmony_ci#include <functional>
22c29fa5a6Sopenharmony_ci#include <fstream>
23c29fa5a6Sopenharmony_ci#include <map>
24c29fa5a6Sopenharmony_ci#include <mutex>
25c29fa5a6Sopenharmony_ci#include <set>
26c29fa5a6Sopenharmony_ci#include <thread>
27c29fa5a6Sopenharmony_ci#include <vector>
28c29fa5a6Sopenharmony_ci
29c29fa5a6Sopenharmony_ci#include "nocopyable.h"
30c29fa5a6Sopenharmony_ci#include "preferences.h"
31c29fa5a6Sopenharmony_ci#include "preferences_errno.h"
32c29fa5a6Sopenharmony_ci#include "preferences_helper.h"
33c29fa5a6Sopenharmony_ci#include "window_info.h"
34c29fa5a6Sopenharmony_ci
35c29fa5a6Sopenharmony_ci#include "i_input_event_handler.h"
36c29fa5a6Sopenharmony_ci#include "key_event.h"
37c29fa5a6Sopenharmony_ci#include "struct_multimodal.h"
38c29fa5a6Sopenharmony_ci
39c29fa5a6Sopenharmony_cinamespace OHOS {
40c29fa5a6Sopenharmony_cinamespace MMI {
41c29fa5a6Sopenharmony_cienum KeyCommandType : int32_t {
42c29fa5a6Sopenharmony_ci    TYPE_SHORTKEY = 0,
43c29fa5a6Sopenharmony_ci    TYPE_SEQUENCE = 1,
44c29fa5a6Sopenharmony_ci    TYPE_FINGERSCENE = 2,
45c29fa5a6Sopenharmony_ci    TYPE_REPEAT_KEY = 3,
46c29fa5a6Sopenharmony_ci    TYPE_MULTI_FINGERS = 4,
47c29fa5a6Sopenharmony_ci};
48c29fa5a6Sopenharmony_ci
49c29fa5a6Sopenharmony_cienum class KnuckleType : int32_t {
50c29fa5a6Sopenharmony_ci    KNUCKLE_TYPE_SINGLE = 0,
51c29fa5a6Sopenharmony_ci    KNUCKLE_TYPE_DOUBLE = 1,
52c29fa5a6Sopenharmony_ci};
53c29fa5a6Sopenharmony_ci
54c29fa5a6Sopenharmony_cienum class NotifyType : int32_t {
55c29fa5a6Sopenharmony_ci    CANCEL,
56c29fa5a6Sopenharmony_ci    INCONSISTENTGESTURE,
57c29fa5a6Sopenharmony_ci    REGIONGESTURE,
58c29fa5a6Sopenharmony_ci    LETTERGESTURE,
59c29fa5a6Sopenharmony_ci    OTHER
60c29fa5a6Sopenharmony_ci};
61c29fa5a6Sopenharmony_ci
62c29fa5a6Sopenharmony_cistruct Ability {
63c29fa5a6Sopenharmony_ci    std::string bundleName;
64c29fa5a6Sopenharmony_ci    std::string abilityName;
65c29fa5a6Sopenharmony_ci    std::string action;
66c29fa5a6Sopenharmony_ci    std::string type;
67c29fa5a6Sopenharmony_ci    std::string deviceId;
68c29fa5a6Sopenharmony_ci    std::string uri;
69c29fa5a6Sopenharmony_ci    std::string abilityType;
70c29fa5a6Sopenharmony_ci    std::vector<std::string> entities;
71c29fa5a6Sopenharmony_ci    std::map<std::string, std::string> params;
72c29fa5a6Sopenharmony_ci};
73c29fa5a6Sopenharmony_ci
74c29fa5a6Sopenharmony_cistruct ShortcutKey {
75c29fa5a6Sopenharmony_ci    std::set<int32_t> preKeys;
76c29fa5a6Sopenharmony_ci    std::string businessId;
77c29fa5a6Sopenharmony_ci    std::string statusConfig;
78c29fa5a6Sopenharmony_ci    bool statusConfigValue { true };
79c29fa5a6Sopenharmony_ci    int32_t finalKey { -1 };
80c29fa5a6Sopenharmony_ci    int32_t keyDownDuration { 0 };
81c29fa5a6Sopenharmony_ci    int32_t triggerType { KeyEvent::KEY_ACTION_DOWN };
82c29fa5a6Sopenharmony_ci    int32_t timerId { -1 };
83c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_MANAGER_ENABLED
84c29fa5a6Sopenharmony_ci    int32_t shortcutId { -1 };
85c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_MANAGER_ENABLED
86c29fa5a6Sopenharmony_ci    Ability ability;
87c29fa5a6Sopenharmony_ci    void Print() const;
88c29fa5a6Sopenharmony_ci};
89c29fa5a6Sopenharmony_ci
90c29fa5a6Sopenharmony_cistruct SequenceKey {
91c29fa5a6Sopenharmony_ci    int32_t keyCode { -1 };
92c29fa5a6Sopenharmony_ci    int32_t keyAction { 0 };
93c29fa5a6Sopenharmony_ci    int64_t actionTime { 0 };
94c29fa5a6Sopenharmony_ci    int64_t delay { 0 };
95c29fa5a6Sopenharmony_ci    bool operator!=(const SequenceKey &sequenceKey)
96c29fa5a6Sopenharmony_ci    {
97c29fa5a6Sopenharmony_ci        return (keyCode != sequenceKey.keyCode) || (keyAction != sequenceKey.keyAction);
98c29fa5a6Sopenharmony_ci    }
99c29fa5a6Sopenharmony_ci};
100c29fa5a6Sopenharmony_ci
101c29fa5a6Sopenharmony_cistruct ExcludeKey {
102c29fa5a6Sopenharmony_ci    int32_t keyCode { -1 };
103c29fa5a6Sopenharmony_ci    int32_t keyAction { -1 };
104c29fa5a6Sopenharmony_ci    int64_t delay { 0 };
105c29fa5a6Sopenharmony_ci};
106c29fa5a6Sopenharmony_ci
107c29fa5a6Sopenharmony_cistruct Sequence {
108c29fa5a6Sopenharmony_ci    std::vector<SequenceKey> sequenceKeys;
109c29fa5a6Sopenharmony_ci    std::string statusConfig;
110c29fa5a6Sopenharmony_ci    bool statusConfigValue { true };
111c29fa5a6Sopenharmony_ci    int64_t abilityStartDelay { 0 };
112c29fa5a6Sopenharmony_ci    int32_t timerId { -1 };
113c29fa5a6Sopenharmony_ci    Ability ability;
114c29fa5a6Sopenharmony_ci    friend std::ostream& operator<<(std::ostream&, const Sequence&);
115c29fa5a6Sopenharmony_ci};
116c29fa5a6Sopenharmony_ci
117c29fa5a6Sopenharmony_cistruct TwoFingerGesture {
118c29fa5a6Sopenharmony_ci    inline static constexpr auto MAX_TOUCH_NUM = 2;
119c29fa5a6Sopenharmony_ci    bool active = false;
120c29fa5a6Sopenharmony_ci    int32_t timerId = -1;
121c29fa5a6Sopenharmony_ci    int64_t abilityStartDelay = 0;
122c29fa5a6Sopenharmony_ci    Ability ability;
123c29fa5a6Sopenharmony_ci    struct {
124c29fa5a6Sopenharmony_ci        int32_t id { 0 };
125c29fa5a6Sopenharmony_ci        int32_t x { 0 };
126c29fa5a6Sopenharmony_ci        int32_t y { 0 };
127c29fa5a6Sopenharmony_ci        int64_t downTime { 0 };
128c29fa5a6Sopenharmony_ci    } touches[MAX_TOUCH_NUM];
129c29fa5a6Sopenharmony_ci};
130c29fa5a6Sopenharmony_ci
131c29fa5a6Sopenharmony_cistruct KnuckleGesture {
132c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> lastPointerDownEvent { nullptr };
133c29fa5a6Sopenharmony_ci    bool state { false };
134c29fa5a6Sopenharmony_ci    int64_t lastPointerUpTime { 0 };
135c29fa5a6Sopenharmony_ci    int64_t downToPrevUpTime { 0 };
136c29fa5a6Sopenharmony_ci    float doubleClickDistance { 0.0f };
137c29fa5a6Sopenharmony_ci    Ability ability;
138c29fa5a6Sopenharmony_ci    struct {
139c29fa5a6Sopenharmony_ci        int32_t id { 0 };
140c29fa5a6Sopenharmony_ci        int32_t x { 0 };
141c29fa5a6Sopenharmony_ci        int32_t y { 0 };
142c29fa5a6Sopenharmony_ci    } lastDownPointer;
143c29fa5a6Sopenharmony_ci};
144c29fa5a6Sopenharmony_ci
145c29fa5a6Sopenharmony_cistruct MultiFingersTap {
146c29fa5a6Sopenharmony_ci    Ability ability;
147c29fa5a6Sopenharmony_ci};
148c29fa5a6Sopenharmony_ci
149c29fa5a6Sopenharmony_cistruct RepeatKey {
150c29fa5a6Sopenharmony_ci    int32_t keyCode { -1 };
151c29fa5a6Sopenharmony_ci    int32_t keyAction { 0 };
152c29fa5a6Sopenharmony_ci    int32_t times { 0 };
153c29fa5a6Sopenharmony_ci    int64_t actionTime { 0 };
154c29fa5a6Sopenharmony_ci    int64_t delay { 0 };
155c29fa5a6Sopenharmony_ci    std::string statusConfig;
156c29fa5a6Sopenharmony_ci    bool statusConfigValue { true };
157c29fa5a6Sopenharmony_ci    Ability ability;
158c29fa5a6Sopenharmony_ci};
159c29fa5a6Sopenharmony_ci
160c29fa5a6Sopenharmony_cistruct KnuckleSwitch {
161c29fa5a6Sopenharmony_ci    std::string statusConfig { "" };
162c29fa5a6Sopenharmony_ci    bool statusConfigValue { false };
163c29fa5a6Sopenharmony_ci};
164c29fa5a6Sopenharmony_ci
165c29fa5a6Sopenharmony_ciclass KeyCommandHandler final : public IInputEventHandler {
166c29fa5a6Sopenharmony_cipublic:
167c29fa5a6Sopenharmony_ci    KeyCommandHandler() = default;
168c29fa5a6Sopenharmony_ci    DISALLOW_COPY_AND_MOVE(KeyCommandHandler);
169c29fa5a6Sopenharmony_ci    ~KeyCommandHandler() override = default;
170c29fa5a6Sopenharmony_ci    int32_t UpdateSettingsXml(const std::string &businessId, int32_t delay);
171c29fa5a6Sopenharmony_ci    int32_t EnableCombineKey(bool enable);
172c29fa5a6Sopenharmony_ci    KnuckleGesture GetSingleKnuckleGesture() const;
173c29fa5a6Sopenharmony_ci    KnuckleGesture GetDoubleKnuckleGesture() const;
174c29fa5a6Sopenharmony_ci    void Dump(int32_t fd, const std::vector<std::string> &args);
175c29fa5a6Sopenharmony_ci    void PrintGestureInfo(int32_t fd);
176c29fa5a6Sopenharmony_ci    std::string ConvertKeyActionToString(int32_t keyAction);
177c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
178c29fa5a6Sopenharmony_ci    void HandleKeyEvent(const std::shared_ptr<KeyEvent> keyEvent) override;
179c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
180c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
181c29fa5a6Sopenharmony_ci    void HandlePointerEvent(const std::shared_ptr<PointerEvent> pointerEvent) override;
182c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
183c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TOUCH
184c29fa5a6Sopenharmony_ci    void HandleTouchEvent(const std::shared_ptr<PointerEvent> pointerEvent) override;
185c29fa5a6Sopenharmony_ci    void HandlePointerActionDownEvent(const std::shared_ptr<PointerEvent> touchEvent);
186c29fa5a6Sopenharmony_ci    void HandlePointerActionMoveEvent(const std::shared_ptr<PointerEvent> touchEvent);
187c29fa5a6Sopenharmony_ci    void HandlePointerActionUpEvent(const std::shared_ptr<PointerEvent> touchEvent);
188c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH
189c29fa5a6Sopenharmony_ci    void SetKnuckleDoubleTapIntervalTime(int64_t interval);
190c29fa5a6Sopenharmony_ci    void SetKnuckleDoubleTapDistance(float distance);
191c29fa5a6Sopenharmony_ci    bool GetKnuckleSwitchValue();
192c29fa5a6Sopenharmony_ci    bool CheckInputMethodArea(const std::shared_ptr<PointerEvent> touchEvent);
193c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
194c29fa5a6Sopenharmony_ci    bool OnHandleEvent(const std::shared_ptr<KeyEvent> keyEvent);
195c29fa5a6Sopenharmony_ci    int32_t SetIsFreezePowerKey(const std::string pageName);
196c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
197c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
198c29fa5a6Sopenharmony_ci    bool OnHandleEvent(const std::shared_ptr<PointerEvent> pointerEvent);
199c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
200c29fa5a6Sopenharmony_ci    void InitKeyObserver();
201c29fa5a6Sopenharmony_ci#ifdef UNIT_TEST
202c29fa5a6Sopenharmony_cipublic:
203c29fa5a6Sopenharmony_ci#else
204c29fa5a6Sopenharmony_ciprivate:
205c29fa5a6Sopenharmony_ci#endif // UNIT_TEST
206c29fa5a6Sopenharmony_ci    void Print();
207c29fa5a6Sopenharmony_ci    void PrintSeq();
208c29fa5a6Sopenharmony_ci    void PrintExcludeKeys();
209c29fa5a6Sopenharmony_ci    bool ParseConfig();
210c29fa5a6Sopenharmony_ci    bool ParseExcludeConfig();
211c29fa5a6Sopenharmony_ci    bool ParseJson(const std::string &configFile);
212c29fa5a6Sopenharmony_ci    bool ParseExcludeJson(const std::string &configFile);
213c29fa5a6Sopenharmony_ci    void ParseRepeatKeyMaxCount();
214c29fa5a6Sopenharmony_ci    void ParseStatusConfigObserver();
215c29fa5a6Sopenharmony_ci    void LaunchAbility(const Ability &ability);
216c29fa5a6Sopenharmony_ci    void LaunchAbility(const Ability &ability, int64_t delay);
217c29fa5a6Sopenharmony_ci    void LaunchAbility(const ShortcutKey &key);
218c29fa5a6Sopenharmony_ci    void LaunchAbility(const Sequence &sequence);
219c29fa5a6Sopenharmony_ci    void LaunchRepeatKeyAbility(const RepeatKey &item, bool &isLaunched, const std::shared_ptr<KeyEvent> keyEvent);
220c29fa5a6Sopenharmony_ci    bool IsKeyMatch(const ShortcutKey &shortcutKey, const std::shared_ptr<KeyEvent> &key);
221c29fa5a6Sopenharmony_ci    bool IsRepeatKeyEvent(const SequenceKey &sequenceKey);
222c29fa5a6Sopenharmony_ci    bool HandleKeyUp(const std::shared_ptr<KeyEvent> &keyEvent, const ShortcutKey &shortcutKey);
223c29fa5a6Sopenharmony_ci    bool HandleKeyDown(ShortcutKey &shortcutKey);
224c29fa5a6Sopenharmony_ci    bool HandleKeyCancel(ShortcutKey &shortcutKey);
225c29fa5a6Sopenharmony_ci    bool PreHandleEvent(const std::shared_ptr<KeyEvent> key);
226c29fa5a6Sopenharmony_ci    bool HandleEvent(const std::shared_ptr<KeyEvent> key);
227c29fa5a6Sopenharmony_ci    bool HandleKeyUpCancel(const RepeatKey &item, const std::shared_ptr<KeyEvent> keyEvent);
228c29fa5a6Sopenharmony_ci    bool HandleRepeatKeyCount(const RepeatKey &item, const std::shared_ptr<KeyEvent> keyEvent);
229c29fa5a6Sopenharmony_ci    void HandleRepeatKeyOwnCount(const RepeatKey &item);
230c29fa5a6Sopenharmony_ci    bool HandleRepeatKey(const RepeatKey& item, bool &isLaunchAbility, const std::shared_ptr<KeyEvent> keyEvent);
231c29fa5a6Sopenharmony_ci    bool HandleRepeatKeys(const std::shared_ptr<KeyEvent> keyEvent);
232c29fa5a6Sopenharmony_ci    bool HandleRepeatKeyAbility(const RepeatKey &item, bool &isLaunched,
233c29fa5a6Sopenharmony_ci        const std::shared_ptr<KeyEvent> keyEvent, bool isMaxTimes);
234c29fa5a6Sopenharmony_ci    bool HandleSequence(Sequence& sequence, bool &isLaunchAbility);
235c29fa5a6Sopenharmony_ci    bool HandleNormalSequence(Sequence& sequence, bool &isLaunchAbility);
236c29fa5a6Sopenharmony_ci    bool HandleMatchedSequence(Sequence& sequence, bool &isLaunchAbility);
237c29fa5a6Sopenharmony_ci    bool HandleScreenLocked(Sequence& sequence, bool &isLaunchAbility);
238c29fa5a6Sopenharmony_ci    bool IsActiveSequenceRepeating(std::shared_ptr<KeyEvent> keyEvent) const;
239c29fa5a6Sopenharmony_ci    void MarkActiveSequence(bool active);
240c29fa5a6Sopenharmony_ci    bool HandleSequences(const std::shared_ptr<KeyEvent> keyEvent);
241c29fa5a6Sopenharmony_ci    bool HandleShortKeys(const std::shared_ptr<KeyEvent> keyEvent);
242c29fa5a6Sopenharmony_ci    bool MatchShortcutKeys(const std::shared_ptr<KeyEvent> keyEvent);
243c29fa5a6Sopenharmony_ci    bool MatchShortcutKey(std::shared_ptr<KeyEvent> keyEvent,
244c29fa5a6Sopenharmony_ci        ShortcutKey &shortcutKey, std::vector<ShortcutKey> &upAbilities);
245c29fa5a6Sopenharmony_ci    bool HandleConsumedKeyEvent(const std::shared_ptr<KeyEvent> keyEvent);
246c29fa5a6Sopenharmony_ci    bool HandleMulFingersTap(const std::shared_ptr<PointerEvent> pointerEvent);
247c29fa5a6Sopenharmony_ci    bool AddSequenceKey(const std::shared_ptr<KeyEvent> keyEvent);
248c29fa5a6Sopenharmony_ci    std::shared_ptr<KeyEvent> CreateKeyEvent(int32_t keyCode, int32_t keyAction, bool isPressed);
249c29fa5a6Sopenharmony_ci    bool IsEnableCombineKey(const std::shared_ptr<KeyEvent> key);
250c29fa5a6Sopenharmony_ci    bool IsExcludeKey(const std::shared_ptr<KeyEvent> key);
251c29fa5a6Sopenharmony_ci    void RemoveSubscribedTimer(int32_t keyCode);
252c29fa5a6Sopenharmony_ci    void HandleSpecialKeys(int32_t keyCode, int32_t keyAction);
253c29fa5a6Sopenharmony_ci    void InterruptTimers();
254c29fa5a6Sopenharmony_ci    void HandlePointerVisibleKeys(const std::shared_ptr<KeyEvent> &keyEvent);
255c29fa5a6Sopenharmony_ci    int32_t GetKeyDownDurationFromXml(const std::string &businessId);
256c29fa5a6Sopenharmony_ci    void SendKeyEvent();
257c29fa5a6Sopenharmony_ci    bool CheckSpecialRepeatKey(RepeatKey& item, const std::shared_ptr<KeyEvent> keyEvent);
258c29fa5a6Sopenharmony_ci    template <class T>
259c29fa5a6Sopenharmony_ci    void CreateStatusConfigObserver(T& item);
260c29fa5a6Sopenharmony_ci    void ResetLastMatchedKey()
261c29fa5a6Sopenharmony_ci    {
262c29fa5a6Sopenharmony_ci        lastMatchedKey_.preKeys.clear();
263c29fa5a6Sopenharmony_ci        lastMatchedKey_.finalKey = -1;
264c29fa5a6Sopenharmony_ci        lastMatchedKey_.timerId = -1;
265c29fa5a6Sopenharmony_ci        lastMatchedKey_.keyDownDuration = 0;
266c29fa5a6Sopenharmony_ci    }
267c29fa5a6Sopenharmony_ci    void ResetCurrentLaunchAbilityKey()
268c29fa5a6Sopenharmony_ci    {
269c29fa5a6Sopenharmony_ci        currentLaunchAbilityKey_.preKeys.clear();
270c29fa5a6Sopenharmony_ci        currentLaunchAbilityKey_.finalKey = -1;
271c29fa5a6Sopenharmony_ci        currentLaunchAbilityKey_.timerId = -1;
272c29fa5a6Sopenharmony_ci        currentLaunchAbilityKey_.keyDownDuration = 0;
273c29fa5a6Sopenharmony_ci    }
274c29fa5a6Sopenharmony_ci
275c29fa5a6Sopenharmony_ci    void ResetSequenceKeys()
276c29fa5a6Sopenharmony_ci    {
277c29fa5a6Sopenharmony_ci        keys_.clear();
278c29fa5a6Sopenharmony_ci        filterSequences_.clear();
279c29fa5a6Sopenharmony_ci    }
280c29fa5a6Sopenharmony_ci    bool SkipFinalKey(const int32_t keyCode, const std::shared_ptr<KeyEvent> &key);
281c29fa5a6Sopenharmony_ci
282c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TOUCH
283c29fa5a6Sopenharmony_ci    void OnHandleTouchEvent(const std::shared_ptr<PointerEvent> touchEvent);
284c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH
285c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
286c29fa5a6Sopenharmony_ci    void StartTwoFingerGesture();
287c29fa5a6Sopenharmony_ci    void StopTwoFingerGesture();
288c29fa5a6Sopenharmony_ci    bool CheckTwoFingerGestureAction() const;
289c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
290c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
291c29fa5a6Sopenharmony_ci    void HandleFingerGestureDownEvent(const std::shared_ptr<PointerEvent> touchEvent);
292c29fa5a6Sopenharmony_ci    void HandleFingerGestureUpEvent(const std::shared_ptr<PointerEvent> touchEvent);
293c29fa5a6Sopenharmony_ci    void HandleKnuckleGestureDownEvent(const std::shared_ptr<PointerEvent> touchEvent);
294c29fa5a6Sopenharmony_ci    void HandleKnuckleGestureUpEvent(const std::shared_ptr<PointerEvent> touchEvent);
295c29fa5a6Sopenharmony_ci    std::pair<int32_t, int32_t> CalcDrawCoordinate(const DisplayInfo& displayInfo,
296c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem pointerItem);
297c29fa5a6Sopenharmony_ci    void SingleKnuckleGestureProcesser(const std::shared_ptr<PointerEvent> touchEvent);
298c29fa5a6Sopenharmony_ci    void DoubleKnuckleGestureProcesser(const std::shared_ptr<PointerEvent> touchEvent);
299c29fa5a6Sopenharmony_ci    void ReportKnuckleScreenCapture(const std::shared_ptr<PointerEvent> touchEvent);
300c29fa5a6Sopenharmony_ci    void KnuckleGestureProcessor(std::shared_ptr<PointerEvent> touchEvent,
301c29fa5a6Sopenharmony_ci        KnuckleGesture &knuckleGesture, KnuckleType type);
302c29fa5a6Sopenharmony_ci    void UpdateKnuckleGestureInfo(const std::shared_ptr<PointerEvent> touchEvent, KnuckleGesture &knuckleGesture);
303c29fa5a6Sopenharmony_ci    void AdjustTimeIntervalConfigIfNeed(int64_t intervalTime);
304c29fa5a6Sopenharmony_ci    void AdjustDistanceConfigIfNeed(float distance);
305c29fa5a6Sopenharmony_ci    bool CheckKnuckleCondition(std::shared_ptr<PointerEvent> touchEvent);
306c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
307c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TOUCH
308c29fa5a6Sopenharmony_ci    int32_t ConvertVPToPX(int32_t vp) const;
309c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH
310c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
311c29fa5a6Sopenharmony_ci    void HandleKnuckleGestureEvent(std::shared_ptr<PointerEvent> touchEvent);
312c29fa5a6Sopenharmony_ci    void HandleKnuckleGestureTouchDown(std::shared_ptr<PointerEvent> touchEvent);
313c29fa5a6Sopenharmony_ci    void HandleKnuckleGestureTouchMove(std::shared_ptr<PointerEvent> touchEvent);
314c29fa5a6Sopenharmony_ci    void HandleKnuckleGestureTouchUp(std::shared_ptr<PointerEvent> touchEvent);
315c29fa5a6Sopenharmony_ci    void ProcessKnuckleGestureTouchUp(NotifyType type);
316c29fa5a6Sopenharmony_ci    void ResetKnuckleGesture();
317c29fa5a6Sopenharmony_ci    std::string GesturePointsToStr() const;
318c29fa5a6Sopenharmony_ci    bool IsValidAction(int32_t action);
319c29fa5a6Sopenharmony_ci    void ReportIfNeed();
320c29fa5a6Sopenharmony_ci    void ReportRegionGesture();
321c29fa5a6Sopenharmony_ci    void ReportLetterGesture();
322c29fa5a6Sopenharmony_ci    void ReportGestureInfo();
323c29fa5a6Sopenharmony_ci    bool IsMatchedAbility(std::vector<float> gesturePoints_, float gestureLastX, float gestureLastY);
324c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
325c29fa5a6Sopenharmony_ci    void CheckAndUpdateTappingCountAtDown(std::shared_ptr<PointerEvent> touchEvent);
326c29fa5a6Sopenharmony_ci    bool TouchPadKnuckleDoubleClickHandle(std::shared_ptr<KeyEvent> event);
327c29fa5a6Sopenharmony_ci    void TouchPadKnuckleDoubleClickProcess(const std::string bundleName, const std::string abilityName,
328c29fa5a6Sopenharmony_ci        const std::string action);
329c29fa5a6Sopenharmony_ciprivate:
330c29fa5a6Sopenharmony_ci    Sequence matchedSequence_;
331c29fa5a6Sopenharmony_ci    ShortcutKey lastMatchedKey_;
332c29fa5a6Sopenharmony_ci    ShortcutKey currentLaunchAbilityKey_;
333c29fa5a6Sopenharmony_ci    std::map<std::string, ShortcutKey> shortcutKeys_;
334c29fa5a6Sopenharmony_ci    std::vector<Sequence> sequences_;
335c29fa5a6Sopenharmony_ci    std::vector<ExcludeKey> excludeKeys_;
336c29fa5a6Sopenharmony_ci    std::vector<Sequence> filterSequences_;
337c29fa5a6Sopenharmony_ci    std::vector<SequenceKey> keys_;
338c29fa5a6Sopenharmony_ci    std::vector<RepeatKey> repeatKeys_;
339c29fa5a6Sopenharmony_ci    std::vector<std::string> businessIds_;
340c29fa5a6Sopenharmony_ci    bool isParseConfig_ { false };
341c29fa5a6Sopenharmony_ci    bool isParseExcludeConfig_ { false };
342c29fa5a6Sopenharmony_ci    std::map<int32_t, int32_t> specialKeys_;
343c29fa5a6Sopenharmony_ci    std::map<int32_t, std::list<int32_t>> specialTimers_;
344c29fa5a6Sopenharmony_ci    std::map<int32_t, int32_t> repeatKeyMaxTimes_;
345c29fa5a6Sopenharmony_ci    std::map<std::string, int32_t> repeatKeyTimerIds_;
346c29fa5a6Sopenharmony_ci    std::map<std::string, int32_t> repeatKeyCountMap_;
347c29fa5a6Sopenharmony_ci    TwoFingerGesture twoFingerGesture_;
348c29fa5a6Sopenharmony_ci    KnuckleGesture singleKnuckleGesture_;
349c29fa5a6Sopenharmony_ci    KnuckleGesture doubleKnuckleGesture_;
350c29fa5a6Sopenharmony_ci    MultiFingersTap threeFingersTap_;
351c29fa5a6Sopenharmony_ci    bool isTimeConfig_ { false };
352c29fa5a6Sopenharmony_ci    bool isDistanceConfig_ { false };
353c29fa5a6Sopenharmony_ci    bool isKnuckleSwitchConfig_ { false };
354c29fa5a6Sopenharmony_ci    struct KnuckleSwitch knuckleSwitch_;
355c29fa5a6Sopenharmony_ci    int32_t checkAdjustIntervalTimeCount_ { 0 };
356c29fa5a6Sopenharmony_ci    int32_t checkAdjustDistanceCount_ { 0 };
357c29fa5a6Sopenharmony_ci    int64_t downToPrevUpTimeConfig_ { 0 };
358c29fa5a6Sopenharmony_ci    float downToPrevDownDistanceConfig_ { 0.0f };
359c29fa5a6Sopenharmony_ci    float distanceDefaultConfig_ { 0.0f };
360c29fa5a6Sopenharmony_ci    float distanceLongConfig_ { 0.0f };
361c29fa5a6Sopenharmony_ci    bool enableCombineKey_ { true };
362c29fa5a6Sopenharmony_ci    RepeatKey repeatKey_;
363c29fa5a6Sopenharmony_ci    int32_t maxCount_ { 0 };
364c29fa5a6Sopenharmony_ci    int32_t count_ { 0 };
365c29fa5a6Sopenharmony_ci    int32_t repeatTimerId_ { -1 };
366c29fa5a6Sopenharmony_ci    int32_t knuckleCount_ { 0 };
367c29fa5a6Sopenharmony_ci    int32_t sosDelayTimerId_ { -1 };
368c29fa5a6Sopenharmony_ci    int64_t downActionTime_ { 0 };
369c29fa5a6Sopenharmony_ci    int64_t lastDownActionTime_ { 0 };
370c29fa5a6Sopenharmony_ci    int64_t lastVolumeDownActionTime_ { 0 };
371c29fa5a6Sopenharmony_ci    int64_t upActionTime_ { 0 };
372c29fa5a6Sopenharmony_ci    int32_t launchAbilityCount_ { 0 };
373c29fa5a6Sopenharmony_ci    int64_t intervalTime_ { 120000 };
374c29fa5a6Sopenharmony_ci    std::atomic<bool> isFreezePowerKey_ { false };
375c29fa5a6Sopenharmony_ci    bool isDownStart_ { false };
376c29fa5a6Sopenharmony_ci    bool isKeyCancel_ { false };
377c29fa5a6Sopenharmony_ci    bool sequenceOccurred_ { false };
378c29fa5a6Sopenharmony_ci    bool isHandleSequence_ { false };
379c29fa5a6Sopenharmony_ci    bool isParseMaxCount_ { false };
380c29fa5a6Sopenharmony_ci    bool isParseStatusConfig_ { false };
381c29fa5a6Sopenharmony_ci    bool isDoubleClick_ { false };
382c29fa5a6Sopenharmony_ci    int32_t lastKeyEventCode_ { -1 };
383c29fa5a6Sopenharmony_ci    std::string sessionKey_ { };
384c29fa5a6Sopenharmony_ci    bool isStartBase_ { false };
385c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
386c29fa5a6Sopenharmony_ci    bool isGesturing_ { false };
387c29fa5a6Sopenharmony_ci    bool isLetterGesturing_ { false };
388c29fa5a6Sopenharmony_ci    bool isLastGestureSucceed_ { false };
389c29fa5a6Sopenharmony_ci    float gestureLastX_ { 0.0f };
390c29fa5a6Sopenharmony_ci    float gestureLastY_ { 0.0f };
391c29fa5a6Sopenharmony_ci    float gestureTrackLength_ { 0.0f };
392c29fa5a6Sopenharmony_ci    std::vector<float> gesturePoints_;
393c29fa5a6Sopenharmony_ci    std::vector<int64_t> gestureTimeStamps_;
394c29fa5a6Sopenharmony_ci    int64_t drawOFailTimestamp_ { 0 };
395c29fa5a6Sopenharmony_ci    int64_t drawOSuccTimestamp_ { 0 };
396c29fa5a6Sopenharmony_ci    Direction lastDirection_ { DIRECTION0 };
397c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
398c29fa5a6Sopenharmony_ci    int64_t lastDownTime_ { 0 };
399c29fa5a6Sopenharmony_ci    int64_t previousUpTime_ { 0 };
400c29fa5a6Sopenharmony_ci    int32_t tappingCount_ { 0 };
401c29fa5a6Sopenharmony_ci    std::mutex mutex_;
402c29fa5a6Sopenharmony_ci    std::map<int32_t, int64_t> lastPointerDownTime_;
403c29fa5a6Sopenharmony_ci};
404c29fa5a6Sopenharmony_ci} // namespace MMI
405c29fa5a6Sopenharmony_ci} // namespace OHOS
406c29fa5a6Sopenharmony_ci#endif // KEY_COMMAND_HANDLER_H