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(InputDeviceContext& deviceContext, uint32_t source, int32_t keyboardType);
27     virtual ~KeyboardInputMapper();
28 
29     virtual uint32_t getSources() override;
30     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) override;
31     virtual void dump(std::string& dump) override;
32     virtual void configure(nsecs_t when, const InputReaderConfiguration* config,
33                            uint32_t changes) override;
34     virtual void reset(nsecs_t when) override;
35     virtual void process(const RawEvent* rawEvent) override;
36 
37     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) override;
38     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) override;
39     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
40                                        const int32_t* keyCodes, uint8_t* outFlags) override;
41 
42     virtual int32_t getMetaState() override;
43     virtual void updateMetaState(int32_t keyCode) override;
44     virtual std::optional<int32_t> getAssociatedDisplayId() override;
45 
46 private:
47     // The current viewport.
48     std::optional<DisplayViewport> mViewport;
49 
50     struct KeyDown {
51         int32_t keyCode;
52         int32_t scanCode;
53     };
54 
55     uint32_t mSource;
56     int32_t mKeyboardType;
57 
58     std::vector<KeyDown> mKeyDowns; // keys that are down
59     int32_t mMetaState;
60     nsecs_t mDownTime; // time of most recent key down
61 
62     int32_t mCurrentHidUsage; // most recent HID usage seen this packet, or 0 if none
63 
64     struct LedState {
65         bool avail; // led is available
66         bool on;    // we think the led is currently on
67     };
68     LedState mCapsLockLedState;
69     LedState mNumLockLedState;
70     LedState mScrollLockLedState;
71 
72     // Immutable configuration parameters.
73     struct Parameters {
74         bool orientationAware;
75         bool handlesKeyRepeat;
76         bool doNotWakeByDefault;
77     } mParameters;
78 
79     void configureParameters();
80     void dumpParameters(std::string& dump);
81 
82     int32_t getOrientation();
83     int32_t getDisplayId();
84 
85     bool isKeyboardOrGamepadKey(int32_t scanCode);
86     bool isMediaKey(int32_t keyCode);
87 
88     void processKey(nsecs_t when, bool down, int32_t scanCode, int32_t usageCode);
89 
90     bool updateMetaStateIfNeeded(int32_t keyCode, bool down);
91 
92     ssize_t findKeyDown(int32_t scanCode);
93 
94     void resetLedState();
95     void initializeLedState(LedState& ledState, int32_t led);
96     void updateLedState(bool reset);
97     void updateLedStateForModifier(LedState& ledState, int32_t led, int32_t modifier, bool reset);
98     std::optional<DisplayViewport> findViewport(nsecs_t when,
99                                                 const InputReaderConfiguration* config);
100 };
101 
102 } // namespace android
103 
104 #endif // _UI_INPUTREADER_KEYBOARD_INPUT_MAPPER_H