1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _UI_INPUTREADER_KEYBOARD_INPUT_MAPPER_H
18 #define _UI_INPUTREADER_KEYBOARD_INPUT_MAPPER_H
19 
20 #include "InputMapper.h"
21 
22 namespace android {
23 
24 class KeyboardInputMapper : public InputMapper {
25 public:
26     KeyboardInputMapper(InputDevice* device, uint32_t source, int32_t keyboardType);
27     virtual ~KeyboardInputMapper();
28 
29     virtual uint32_t getSources();
30     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
31     virtual void dump(std::string& dump);
32     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
33     virtual void reset(nsecs_t when);
34     virtual void process(const RawEvent* rawEvent);
35 
36     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
37     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
38     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
39                                        const int32_t* keyCodes, uint8_t* outFlags);
40 
41     virtual int32_t getMetaState();
42     virtual void updateMetaState(int32_t keyCode);
43 
44 private:
45     // The current viewport.
46     std::optional<DisplayViewport> mViewport;
47 
48     struct KeyDown {
49         int32_t keyCode;
50         int32_t scanCode;
51     };
52 
53     uint32_t mSource;
54     int32_t mKeyboardType;
55 
56     std::vector<KeyDown> mKeyDowns; // keys that are down
57     int32_t mMetaState;
58     nsecs_t mDownTime; // time of most recent key down
59 
60     int32_t mCurrentHidUsage; // most recent HID usage seen this packet, or 0 if none
61 
62     struct LedState {
63         bool avail; // led is available
64         bool on;    // we think the led is currently on
65     };
66     LedState mCapsLockLedState;
67     LedState mNumLockLedState;
68     LedState mScrollLockLedState;
69 
70     // Immutable configuration parameters.
71     struct Parameters {
72         bool orientationAware;
73         bool handlesKeyRepeat;
74     } mParameters;
75 
76     void configureParameters();
77     void dumpParameters(std::string& dump);
78 
79     int32_t getOrientation();
80     int32_t getDisplayId();
81 
82     bool isKeyboardOrGamepadKey(int32_t scanCode);
83     bool isMediaKey(int32_t keyCode);
84 
85     void processKey(nsecs_t when, bool down, int32_t scanCode, int32_t usageCode);
86 
87     bool updateMetaStateIfNeeded(int32_t keyCode, bool down);
88 
89     ssize_t findKeyDown(int32_t scanCode);
90 
91     void resetLedState();
92     void initializeLedState(LedState& ledState, int32_t led);
93     void updateLedState(bool reset);
94     void updateLedStateForModifier(LedState& ledState, int32_t led, int32_t modifier, bool reset);
95 };
96 
97 } // namespace android
98 
99 #endif // _UI_INPUTREADER_KEYBOARD_INPUT_MAPPER_H