• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     virtual void updateLedState(bool reset);
46 
47 private:
48     // The current viewport.
49     std::optional<DisplayViewport> mViewport;
50 
51     struct KeyDown {
52         int32_t keyCode;
53         int32_t scanCode;
54     };
55 
56     uint32_t mSource;
57     int32_t mKeyboardType;
58 
59     std::vector<KeyDown> mKeyDowns; // keys that are down
60     int32_t mMetaState;
61     nsecs_t mDownTime; // time of most recent key down
62 
63     int32_t mCurrentHidUsage; // most recent HID usage seen this packet, or 0 if none
64 
65     struct LedState {
66         bool avail; // led is available
67         bool on;    // we think the led is currently on
68     };
69     LedState mCapsLockLedState;
70     LedState mNumLockLedState;
71     LedState mScrollLockLedState;
72 
73     // Immutable configuration parameters.
74     struct Parameters {
75         bool orientationAware;
76         bool handlesKeyRepeat;
77         bool doNotWakeByDefault;
78     } mParameters;
79 
80     void configureParameters();
81     void dumpParameters(std::string& dump);
82 
83     int32_t getOrientation();
84     int32_t getDisplayId();
85 
86     bool isKeyboardOrGamepadKey(int32_t scanCode);
87     bool isMediaKey(int32_t keyCode);
88 
89     void processKey(nsecs_t when, nsecs_t readTime, bool down, int32_t scanCode, int32_t usageCode);
90 
91     bool updateMetaStateIfNeeded(int32_t keyCode, bool down);
92 
93     ssize_t findKeyDown(int32_t scanCode);
94 
95     void resetLedState();
96     void initializeLedState(LedState& ledState, int32_t led);
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