blob: 7474b2d11901d224a62ea8fd18a49c8e74c9b5cf [file] [log] [blame]
Arpit Singhb3b3f732023-07-04 14:30:05 +00001/*
2 * Copyright 2023 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#include "KeyboardInputMapper.h"
18
Harry Cuttsf673e672024-11-08 17:51:40 +000019#include <cstdint>
20#include <list>
21#include <memory>
22#include <optional>
23#include <string>
Arpit Singhb3b3f732023-07-04 14:30:05 +000024
Harry Cuttsf673e672024-11-08 17:51:40 +000025#include <android/input.h>
26#include <android/keycodes.h>
27#include <com_android_input_flags.h>
28#include <flag_macros.h>
29#include <ftl/flags.h>
30#include <gtest/gtest.h>
31#include <input/DisplayViewport.h>
32#include <input/Input.h>
33#include <input/InputDevice.h>
34#include <ui/LogicalDisplayId.h>
35#include <ui/Rotation.h>
36
37#include "EventHub.h"
Arpit Singhb3b3f732023-07-04 14:30:05 +000038#include "InputMapperTest.h"
39#include "InterfaceMocks.h"
Harry Cuttsf673e672024-11-08 17:51:40 +000040#include "NotifyArgs.h"
41#include "TestConstants.h"
David Padlipsky48fd8842024-10-18 03:36:58 +000042#include "TestEventMatchers.h"
Arpit Singhb3b3f732023-07-04 14:30:05 +000043
44#define TAG "KeyboardInputMapper_test"
45
46namespace android {
47
48using testing::_;
David Padlipsky48fd8842024-10-18 03:36:58 +000049using testing::AllOf;
Arpit Singh82e413e2023-10-10 19:30:58 +000050using testing::Args;
Arpit Singhb3b3f732023-07-04 14:30:05 +000051using testing::DoAll;
52using testing::Return;
53using testing::SetArgPointee;
David Padlipsky48fd8842024-10-18 03:36:58 +000054using testing::VariantWith;
Arpit Singhb3b3f732023-07-04 14:30:05 +000055
Harry Cuttsf673e672024-11-08 17:51:40 +000056namespace {
57
58// Arbitrary display properties.
59constexpr ui::LogicalDisplayId DISPLAY_ID = ui::LogicalDisplayId::DEFAULT;
60constexpr int32_t DISPLAY_WIDTH = 480;
61constexpr int32_t DISPLAY_HEIGHT = 800;
62constexpr std::optional<uint8_t> NO_PORT = std::nullopt; // no physical port is specified
63
64} // namespace
65
Arpit Singhb3b3f732023-07-04 14:30:05 +000066/**
67 * Unit tests for KeyboardInputMapper.
68 */
69class KeyboardInputMapperUnitTest : public InputMapperUnitTest {
70protected:
71 sp<FakeInputReaderPolicy> mFakePolicy;
72 const std::unordered_map<int32_t, int32_t> mKeyCodeMap{{KEY_0, AKEYCODE_0},
73 {KEY_A, AKEYCODE_A},
74 {KEY_LEFTCTRL, AKEYCODE_CTRL_LEFT},
75 {KEY_LEFTALT, AKEYCODE_ALT_LEFT},
76 {KEY_RIGHTALT, AKEYCODE_ALT_RIGHT},
77 {KEY_LEFTSHIFT, AKEYCODE_SHIFT_LEFT},
78 {KEY_RIGHTSHIFT, AKEYCODE_SHIFT_RIGHT},
79 {KEY_FN, AKEYCODE_FUNCTION},
80 {KEY_LEFTCTRL, AKEYCODE_CTRL_LEFT},
81 {KEY_RIGHTCTRL, AKEYCODE_CTRL_RIGHT},
82 {KEY_LEFTMETA, AKEYCODE_META_LEFT},
83 {KEY_RIGHTMETA, AKEYCODE_META_RIGHT},
84 {KEY_CAPSLOCK, AKEYCODE_CAPS_LOCK},
85 {KEY_NUMLOCK, AKEYCODE_NUM_LOCK},
86 {KEY_SCROLLLOCK, AKEYCODE_SCROLL_LOCK}};
87
88 void SetUp() override {
89 InputMapperUnitTest::SetUp();
90
91 // set key-codes expected in tests
92 for (const auto& [scanCode, outKeycode] : mKeyCodeMap) {
93 EXPECT_CALL(mMockEventHub, mapKey(EVENTHUB_ID, scanCode, _, _, _, _, _))
94 .WillRepeatedly(DoAll(SetArgPointee<4>(outKeycode), Return(NO_ERROR)));
95 }
96
97 mFakePolicy = sp<FakeInputReaderPolicy>::make();
98 EXPECT_CALL(mMockInputReaderContext, getPolicy).WillRepeatedly(Return(mFakePolicy.get()));
99
Prabir Pradhan38636652024-07-23 21:59:36 +0000100 ON_CALL((*mDevice), getSources).WillByDefault(Return(AINPUT_SOURCE_KEYBOARD));
101
Arpit Singhb3b3f732023-07-04 14:30:05 +0000102 mMapper = createInputMapper<KeyboardInputMapper>(*mDeviceContext, mReaderConfiguration,
Vaibhav Devmurarie58ffb92024-05-22 17:38:25 +0000103 AINPUT_SOURCE_KEYBOARD);
Arpit Singhb3b3f732023-07-04 14:30:05 +0000104 }
Arpit Singhb3b3f732023-07-04 14:30:05 +0000105};
106
Arpit Singh82e413e2023-10-10 19:30:58 +0000107TEST_F(KeyboardInputMapperUnitTest, KeyPressTimestampRecorded) {
108 nsecs_t when = ARBITRARY_TIME;
109 std::vector<int32_t> keyCodes{KEY_0, KEY_A, KEY_LEFTCTRL, KEY_RIGHTALT, KEY_LEFTSHIFT};
110 EXPECT_CALL(mMockInputReaderContext, setLastKeyDownTimestamp)
111 .With(Args<0>(when))
112 .Times(keyCodes.size());
113 for (int32_t keyCode : keyCodes) {
114 process(when, EV_KEY, keyCode, 1);
115 process(when, EV_SYN, SYN_REPORT, 0);
116 process(when, EV_KEY, keyCode, 0);
117 process(when, EV_SYN, SYN_REPORT, 0);
118 }
119}
120
David Padlipsky48fd8842024-10-18 03:36:58 +0000121TEST_F(KeyboardInputMapperUnitTest, RepeatEventsDiscarded) {
122 std::list<NotifyArgs> args;
123 args += process(ARBITRARY_TIME, EV_KEY, KEY_0, 1);
124 args += process(ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
125
126 args += process(ARBITRARY_TIME, EV_KEY, KEY_0, 2);
127 args += process(ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
128
129 args += process(ARBITRARY_TIME, EV_KEY, KEY_0, 0);
130 args += process(ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
131
132 EXPECT_THAT(args,
133 ElementsAre(VariantWith<NotifyKeyArgs>(AllOf(WithKeyAction(AKEY_EVENT_ACTION_DOWN),
134 WithKeyCode(AKEYCODE_0),
135 WithScanCode(KEY_0))),
136 VariantWith<NotifyKeyArgs>(AllOf(WithKeyAction(AKEY_EVENT_ACTION_UP),
137 WithKeyCode(AKEYCODE_0),
138 WithScanCode(KEY_0)))));
139}
140
Harry Cuttsf673e672024-11-08 17:51:40 +0000141// TODO(b/283812079): convert the tests below to use InputMapperUnitTest.
142
143// --- KeyboardInputMapperTest ---
144
145class KeyboardInputMapperTest : public InputMapperTest {
146protected:
147 void SetUp() override {
148 InputMapperTest::SetUp(DEVICE_CLASSES | InputDeviceClass::KEYBOARD |
149 InputDeviceClass::ALPHAKEY);
150 }
151 const std::string UNIQUE_ID = "local:0";
152 const KeyboardLayoutInfo DEVICE_KEYBOARD_LAYOUT_INFO = KeyboardLayoutInfo("en-US", "qwerty");
153 void prepareDisplay(ui::Rotation orientation);
154
155 void testDPadKeyRotation(KeyboardInputMapper& mapper, int32_t originalScanCode,
156 int32_t originalKeyCode, int32_t rotatedKeyCode,
157 ui::LogicalDisplayId displayId = ui::LogicalDisplayId::INVALID);
158};
159
160/* Similar to setDisplayInfoAndReconfigure, but pre-populates all parameters except for the
161 * orientation.
162 */
163void KeyboardInputMapperTest::prepareDisplay(ui::Rotation orientation) {
164 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation, UNIQUE_ID,
165 NO_PORT, ViewportType::INTERNAL);
166}
167
168void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper& mapper,
169 int32_t originalScanCode, int32_t originalKeyCode,
170 int32_t rotatedKeyCode,
171 ui::LogicalDisplayId displayId) {
172 NotifyKeyArgs args;
173
174 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, originalScanCode, 1);
175 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
176 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
177 ASSERT_EQ(originalScanCode, args.scanCode);
178 ASSERT_EQ(rotatedKeyCode, args.keyCode);
179 ASSERT_EQ(displayId, args.displayId);
180
181 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, originalScanCode, 0);
182 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
183 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
184 ASSERT_EQ(originalScanCode, args.scanCode);
185 ASSERT_EQ(rotatedKeyCode, args.keyCode);
186 ASSERT_EQ(displayId, args.displayId);
187}
188
189TEST_F(KeyboardInputMapperTest, GetSources) {
190 KeyboardInputMapper& mapper =
191 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
192
193 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper.getSources());
194}
195
196TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
197 const int32_t USAGE_A = 0x070004;
198 const int32_t USAGE_UNKNOWN = 0x07ffff;
199 mFakeEventHub->addKey(EVENTHUB_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
200 mFakeEventHub->addKey(EVENTHUB_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
201 mFakeEventHub->addKey(EVENTHUB_ID, 0, KEY_NUMLOCK, AKEYCODE_NUM_LOCK, POLICY_FLAG_WAKE);
202 mFakeEventHub->addKey(EVENTHUB_ID, 0, KEY_CAPSLOCK, AKEYCODE_CAPS_LOCK, POLICY_FLAG_WAKE);
203 mFakeEventHub->addKey(EVENTHUB_ID, 0, KEY_SCROLLLOCK, AKEYCODE_SCROLL_LOCK, POLICY_FLAG_WAKE);
204
205 KeyboardInputMapper& mapper =
206 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
207 // Initial metastate is AMETA_NONE.
208 ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
209
210 // Key down by scan code.
211 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_HOME, 1);
212 NotifyKeyArgs args;
213 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
214 ASSERT_EQ(DEVICE_ID, args.deviceId);
215 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
216 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
217 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
218 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
219 ASSERT_EQ(KEY_HOME, args.scanCode);
220 ASSERT_EQ(AMETA_NONE, args.metaState);
221 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
222 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
223 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
224
225 // Key up by scan code.
226 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_HOME, 0);
227 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
228 ASSERT_EQ(DEVICE_ID, args.deviceId);
229 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
230 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
231 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
232 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
233 ASSERT_EQ(KEY_HOME, args.scanCode);
234 ASSERT_EQ(AMETA_NONE, args.metaState);
235 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
236 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
237 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
238
239 // Key down by usage code.
240 process(mapper, ARBITRARY_TIME, READ_TIME, EV_MSC, MSC_SCAN, USAGE_A);
241 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, 0, 1);
242 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
243 ASSERT_EQ(DEVICE_ID, args.deviceId);
244 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
245 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
246 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
247 ASSERT_EQ(AKEYCODE_A, args.keyCode);
248 ASSERT_EQ(0, args.scanCode);
249 ASSERT_EQ(AMETA_NONE, args.metaState);
250 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
251 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
252 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
253
254 // Key up by usage code.
255 process(mapper, ARBITRARY_TIME, READ_TIME, EV_MSC, MSC_SCAN, USAGE_A);
256 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, 0, 0);
257 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
258 ASSERT_EQ(DEVICE_ID, args.deviceId);
259 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
260 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
261 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
262 ASSERT_EQ(AKEYCODE_A, args.keyCode);
263 ASSERT_EQ(0, args.scanCode);
264 ASSERT_EQ(AMETA_NONE, args.metaState);
265 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
266 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
267 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
268
269 // Key down with unknown scan code or usage code.
270 process(mapper, ARBITRARY_TIME, READ_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
271 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UNKNOWN, 1);
272 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
273 ASSERT_EQ(DEVICE_ID, args.deviceId);
274 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
275 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
276 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
277 ASSERT_EQ(0, args.keyCode);
278 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
279 ASSERT_EQ(AMETA_NONE, args.metaState);
280 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
281 ASSERT_EQ(0U, args.policyFlags);
282 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
283
284 // Key up with unknown scan code or usage code.
285 process(mapper, ARBITRARY_TIME, READ_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
286 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_UNKNOWN, 0);
287 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
288 ASSERT_EQ(DEVICE_ID, args.deviceId);
289 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
290 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
291 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
292 ASSERT_EQ(0, args.keyCode);
293 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
294 ASSERT_EQ(AMETA_NONE, args.metaState);
295 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
296 ASSERT_EQ(0U, args.policyFlags);
297 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
298}
299
300TEST_F(KeyboardInputMapperTest, Process_KeyRemapping) {
301 mFakeEventHub->addKey(EVENTHUB_ID, KEY_A, 0, AKEYCODE_A, 0);
302 mFakeEventHub->addKey(EVENTHUB_ID, KEY_B, 0, AKEYCODE_B, 0);
303
304 KeyboardInputMapper& mapper =
305 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
306
307 mFakeEventHub->setKeyRemapping(EVENTHUB_ID, {{AKEYCODE_A, AKEYCODE_B}});
308 // Key down by scan code.
309 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_A, 1);
310 NotifyKeyArgs args;
311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
312 ASSERT_EQ(AKEYCODE_B, args.keyCode);
313
314 // Key up by scan code.
315 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_A, 0);
316 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
317 ASSERT_EQ(AKEYCODE_B, args.keyCode);
318}
319
320/**
321 * Ensure that the readTime is set to the time when the EV_KEY is received.
322 */
323TEST_F(KeyboardInputMapperTest, Process_SendsReadTime) {
324 mFakeEventHub->addKey(EVENTHUB_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
325
326 KeyboardInputMapper& mapper =
327 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
328 NotifyKeyArgs args;
329
330 // Key down
331 process(mapper, ARBITRARY_TIME, /*readTime=*/12, EV_KEY, KEY_HOME, 1);
332 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
333 ASSERT_EQ(12, args.readTime);
334
335 // Key up
336 process(mapper, ARBITRARY_TIME, /*readTime=*/15, EV_KEY, KEY_HOME, 1);
337 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
338 ASSERT_EQ(15, args.readTime);
339}
340
341TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
342 mFakeEventHub->addKey(EVENTHUB_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
343 mFakeEventHub->addKey(EVENTHUB_ID, KEY_A, 0, AKEYCODE_A, 0);
344 mFakeEventHub->addKey(EVENTHUB_ID, 0, KEY_NUMLOCK, AKEYCODE_NUM_LOCK, 0);
345 mFakeEventHub->addKey(EVENTHUB_ID, 0, KEY_CAPSLOCK, AKEYCODE_CAPS_LOCK, 0);
346 mFakeEventHub->addKey(EVENTHUB_ID, 0, KEY_SCROLLLOCK, AKEYCODE_SCROLL_LOCK, 0);
347
348 KeyboardInputMapper& mapper =
349 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
350
351 // Initial metastate is AMETA_NONE.
352 ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
353
354 // Metakey down.
355 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_LEFTSHIFT, 1);
356 NotifyKeyArgs args;
357 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
358 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
359 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper.getMetaState());
360 ASSERT_NO_FATAL_FAILURE(mReader->getContext()->assertUpdateGlobalMetaStateWasCalled());
361
362 // Key down.
363 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_A, 1);
364 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
365 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
366 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper.getMetaState());
367
368 // Key up.
369 process(mapper, ARBITRARY_TIME + 2, READ_TIME, EV_KEY, KEY_A, 0);
370 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
371 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
372 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper.getMetaState());
373
374 // Metakey up.
375 process(mapper, ARBITRARY_TIME + 3, READ_TIME, EV_KEY, KEY_LEFTSHIFT, 0);
376 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
377 ASSERT_EQ(AMETA_NONE, args.metaState);
378 ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
379 ASSERT_NO_FATAL_FAILURE(mReader->getContext()->assertUpdateGlobalMetaStateWasCalled());
380}
381
382TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
383 mFakeEventHub->addKey(EVENTHUB_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
384 mFakeEventHub->addKey(EVENTHUB_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
385 mFakeEventHub->addKey(EVENTHUB_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
386 mFakeEventHub->addKey(EVENTHUB_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
387
388 KeyboardInputMapper& mapper =
389 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
390
391 prepareDisplay(ui::ROTATION_90);
392 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
393 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
394 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
395 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
396 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
397 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
398 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
399 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
400}
401
402TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
403 mFakeEventHub->addKey(EVENTHUB_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
404 mFakeEventHub->addKey(EVENTHUB_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
405 mFakeEventHub->addKey(EVENTHUB_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
406 mFakeEventHub->addKey(EVENTHUB_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
407
408 addConfigurationProperty("keyboard.orientationAware", "1");
409 KeyboardInputMapper& mapper =
410 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
411
412 prepareDisplay(ui::ROTATION_0);
413 ASSERT_NO_FATAL_FAILURE(
414 testDPadKeyRotation(mapper, KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP, DISPLAY_ID));
415 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_RIGHT, AKEYCODE_DPAD_RIGHT,
416 AKEYCODE_DPAD_RIGHT, DISPLAY_ID));
417 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_DOWN, AKEYCODE_DPAD_DOWN,
418 AKEYCODE_DPAD_DOWN, DISPLAY_ID));
419 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_LEFT, AKEYCODE_DPAD_LEFT,
420 AKEYCODE_DPAD_LEFT, DISPLAY_ID));
421
422 clearViewports();
423 prepareDisplay(ui::ROTATION_90);
424 ASSERT_NO_FATAL_FAILURE(
425 testDPadKeyRotation(mapper, KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT, DISPLAY_ID));
426 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_RIGHT, AKEYCODE_DPAD_RIGHT,
427 AKEYCODE_DPAD_UP, DISPLAY_ID));
428 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_DOWN, AKEYCODE_DPAD_DOWN,
429 AKEYCODE_DPAD_RIGHT, DISPLAY_ID));
430 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_LEFT, AKEYCODE_DPAD_LEFT,
431 AKEYCODE_DPAD_DOWN, DISPLAY_ID));
432
433 clearViewports();
434 prepareDisplay(ui::ROTATION_180);
435 ASSERT_NO_FATAL_FAILURE(
436 testDPadKeyRotation(mapper, KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN, DISPLAY_ID));
437 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_RIGHT, AKEYCODE_DPAD_RIGHT,
438 AKEYCODE_DPAD_LEFT, DISPLAY_ID));
439 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_DOWN, AKEYCODE_DPAD_DOWN,
440 AKEYCODE_DPAD_UP, DISPLAY_ID));
441 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_LEFT, AKEYCODE_DPAD_LEFT,
442 AKEYCODE_DPAD_RIGHT, DISPLAY_ID));
443
444 clearViewports();
445 prepareDisplay(ui::ROTATION_270);
446 ASSERT_NO_FATAL_FAILURE(
447 testDPadKeyRotation(mapper, KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT, DISPLAY_ID));
448 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_RIGHT, AKEYCODE_DPAD_RIGHT,
449 AKEYCODE_DPAD_DOWN, DISPLAY_ID));
450 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_DOWN, AKEYCODE_DPAD_DOWN,
451 AKEYCODE_DPAD_LEFT, DISPLAY_ID));
452 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_LEFT, AKEYCODE_DPAD_LEFT,
453 AKEYCODE_DPAD_UP, DISPLAY_ID));
454
455 // Special case: if orientation changes while key is down, we still emit the same keycode
456 // in the key up as we did in the key down.
457 NotifyKeyArgs args;
458 clearViewports();
459 prepareDisplay(ui::ROTATION_270);
460 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 1);
461 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
462 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
463 ASSERT_EQ(KEY_UP, args.scanCode);
464 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
465
466 clearViewports();
467 prepareDisplay(ui::ROTATION_180);
468 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 0);
469 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
470 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
471 ASSERT_EQ(KEY_UP, args.scanCode);
472 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
473}
474
475TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_NotOrientationAware) {
476 // If the keyboard is not orientation aware,
477 // key events should not be associated with a specific display id
478 mFakeEventHub->addKey(EVENTHUB_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
479
480 KeyboardInputMapper& mapper =
481 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
482 NotifyKeyArgs args;
483
484 // Display id should be LogicalDisplayId::INVALID without any display configuration.
485 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 1);
486 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
487 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 0);
488 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
489 ASSERT_EQ(ui::LogicalDisplayId::INVALID, args.displayId);
490
491 prepareDisplay(ui::ROTATION_0);
492 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 1);
493 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
494 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 0);
495 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
496 ASSERT_EQ(ui::LogicalDisplayId::INVALID, args.displayId);
497}
498
499TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_OrientationAware) {
500 // If the keyboard is orientation aware,
501 // key events should be associated with the internal viewport
502 mFakeEventHub->addKey(EVENTHUB_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
503
504 addConfigurationProperty("keyboard.orientationAware", "1");
505 KeyboardInputMapper& mapper =
506 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
507 NotifyKeyArgs args;
508
509 // Display id should be LogicalDisplayId::INVALID without any display configuration.
510 // ^--- already checked by the previous test
511
512 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, ui::ROTATION_0,
513 UNIQUE_ID, NO_PORT, ViewportType::INTERNAL);
514 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 1);
515 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
516 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 0);
517 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
518 ASSERT_EQ(DISPLAY_ID, args.displayId);
519
520 constexpr ui::LogicalDisplayId newDisplayId = ui::LogicalDisplayId{2};
521 clearViewports();
522 setDisplayInfoAndReconfigure(newDisplayId, DISPLAY_WIDTH, DISPLAY_HEIGHT, ui::ROTATION_0,
523 UNIQUE_ID, NO_PORT, ViewportType::INTERNAL);
524 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 1);
525 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
526 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_UP, 0);
527 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
528 ASSERT_EQ(newDisplayId, args.displayId);
529}
530
531TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
532 KeyboardInputMapper& mapper =
533 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
534
535 mFakeEventHub->setKeyCodeState(EVENTHUB_ID, AKEYCODE_A, 1);
536 ASSERT_EQ(1, mapper.getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
537
538 mFakeEventHub->setKeyCodeState(EVENTHUB_ID, AKEYCODE_A, 0);
539 ASSERT_EQ(0, mapper.getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
540}
541
542TEST_F(KeyboardInputMapperTest, GetKeyCodeForKeyLocation) {
543 KeyboardInputMapper& mapper =
544 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
545
546 mFakeEventHub->addKeyCodeMapping(EVENTHUB_ID, AKEYCODE_Y, AKEYCODE_Z);
547 ASSERT_EQ(AKEYCODE_Z, mapper.getKeyCodeForKeyLocation(AKEYCODE_Y))
548 << "If a mapping is available, the result is equal to the mapping";
549
550 ASSERT_EQ(AKEYCODE_A, mapper.getKeyCodeForKeyLocation(AKEYCODE_A))
551 << "If no mapping is available, the result is the key location";
552}
553
554TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
555 KeyboardInputMapper& mapper =
556 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
557
558 mFakeEventHub->setScanCodeState(EVENTHUB_ID, KEY_A, 1);
559 ASSERT_EQ(1, mapper.getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
560
561 mFakeEventHub->setScanCodeState(EVENTHUB_ID, KEY_A, 0);
562 ASSERT_EQ(0, mapper.getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
563}
564
565TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
566 KeyboardInputMapper& mapper =
567 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
568
569 mFakeEventHub->addKey(EVENTHUB_ID, KEY_A, 0, AKEYCODE_A, 0);
570
571 uint8_t flags[2] = { 0, 0 };
572 ASSERT_TRUE(mapper.markSupportedKeyCodes(AINPUT_SOURCE_ANY, {AKEYCODE_A, AKEYCODE_B}, flags));
573 ASSERT_TRUE(flags[0]);
574 ASSERT_FALSE(flags[1]);
575}
576
577TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
578 mFakeEventHub->addLed(EVENTHUB_ID, LED_CAPSL, true /*initially on*/);
579 mFakeEventHub->addLed(EVENTHUB_ID, LED_NUML, false /*initially off*/);
580 mFakeEventHub->addLed(EVENTHUB_ID, LED_SCROLLL, false /*initially off*/);
581 mFakeEventHub->addKey(EVENTHUB_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
582 mFakeEventHub->addKey(EVENTHUB_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
583 mFakeEventHub->addKey(EVENTHUB_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
584
585 KeyboardInputMapper& mapper =
586 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
587 // Initial metastate is AMETA_NONE.
588 ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
589
590 // Initialization should have turned all of the lights off.
591 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
592 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
593 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
594
595 // Toggle caps lock on.
596 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 1);
597 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 0);
598 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
599 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
600 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
601 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper.getMetaState());
602
603 // Toggle num lock on.
604 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 1);
605 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 0);
606 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
607 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
608 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
609 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper.getMetaState());
610
611 // Toggle caps lock off.
612 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 1);
613 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 0);
614 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
615 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
616 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
617 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper.getMetaState());
618
619 // Toggle scroll lock on.
620 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
621 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
622 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
623 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
624 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
625 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper.getMetaState());
626
627 // Toggle num lock off.
628 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 1);
629 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 0);
630 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
631 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
632 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
633 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper.getMetaState());
634
635 // Toggle scroll lock off.
636 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
637 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
638 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
639 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
640 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
641 ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
642}
643
644TEST_F(KeyboardInputMapperTest, Configure_AssignsDisplayPort) {
645 // keyboard 1.
646 mFakeEventHub->addKey(EVENTHUB_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
647 mFakeEventHub->addKey(EVENTHUB_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
648 mFakeEventHub->addKey(EVENTHUB_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
649 mFakeEventHub->addKey(EVENTHUB_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
650
651 // keyboard 2.
652 const std::string USB2 = "USB2";
653 const std::string DEVICE_NAME2 = "KEYBOARD2";
654 constexpr int32_t SECOND_DEVICE_ID = DEVICE_ID + 1;
655 constexpr int32_t SECOND_EVENTHUB_ID = EVENTHUB_ID + 1;
656 std::shared_ptr<InputDevice> device2 =
657 newDevice(SECOND_DEVICE_ID, DEVICE_NAME2, USB2, SECOND_EVENTHUB_ID,
658 ftl::Flags<InputDeviceClass>(0));
659
660 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
661 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
662 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
663 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
664
665 KeyboardInputMapper& mapper =
666 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
667
668 device2->addEmptyEventHubDevice(SECOND_EVENTHUB_ID);
669 KeyboardInputMapper& mapper2 =
670 device2->constructAndAddMapper<KeyboardInputMapper>(SECOND_EVENTHUB_ID,
671 mFakePolicy
672 ->getReaderConfiguration(),
673 AINPUT_SOURCE_KEYBOARD);
674 std::list<NotifyArgs> unused =
675 device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
676 /*changes=*/{});
677 unused += device2->reset(ARBITRARY_TIME);
678
679 // Prepared displays and associated info.
680 constexpr uint8_t hdmi1 = 0;
681 constexpr uint8_t hdmi2 = 1;
682 const std::string SECONDARY_UNIQUE_ID = "local:1";
683
684 mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
685 mFakePolicy->addInputPortAssociation(USB2, hdmi2);
686
687 // No associated display viewport found, should disable the device.
688 unused += device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
689 InputReaderConfiguration::Change::DISPLAY_INFO);
690 ASSERT_FALSE(device2->isEnabled());
691
692 // Prepare second display.
693 constexpr ui::LogicalDisplayId newDisplayId = ui::LogicalDisplayId{2};
694 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, ui::ROTATION_0,
695 UNIQUE_ID, hdmi1, ViewportType::INTERNAL);
696 setDisplayInfoAndReconfigure(newDisplayId, DISPLAY_WIDTH, DISPLAY_HEIGHT, ui::ROTATION_0,
697 SECONDARY_UNIQUE_ID, hdmi2, ViewportType::EXTERNAL);
698 // Default device will reconfigure above, need additional reconfiguration for another device.
699 unused += device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
700 InputReaderConfiguration::Change::DISPLAY_INFO);
701
702 // Device should be enabled after the associated display is found.
703 ASSERT_TRUE(mDevice->isEnabled());
704 ASSERT_TRUE(device2->isEnabled());
705
706 // Test pad key events
707 ASSERT_NO_FATAL_FAILURE(
708 testDPadKeyRotation(mapper, KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP, DISPLAY_ID));
709 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_RIGHT, AKEYCODE_DPAD_RIGHT,
710 AKEYCODE_DPAD_RIGHT, DISPLAY_ID));
711 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_DOWN, AKEYCODE_DPAD_DOWN,
712 AKEYCODE_DPAD_DOWN, DISPLAY_ID));
713 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, KEY_LEFT, AKEYCODE_DPAD_LEFT,
714 AKEYCODE_DPAD_LEFT, DISPLAY_ID));
715
716 ASSERT_NO_FATAL_FAILURE(
717 testDPadKeyRotation(mapper2, KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP, newDisplayId));
718 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper2, KEY_RIGHT, AKEYCODE_DPAD_RIGHT,
719 AKEYCODE_DPAD_RIGHT, newDisplayId));
720 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper2, KEY_DOWN, AKEYCODE_DPAD_DOWN,
721 AKEYCODE_DPAD_DOWN, newDisplayId));
722 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper2, KEY_LEFT, AKEYCODE_DPAD_LEFT,
723 AKEYCODE_DPAD_LEFT, newDisplayId));
724}
725
726TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleAfterReattach) {
727 mFakeEventHub->addLed(EVENTHUB_ID, LED_CAPSL, true /*initially on*/);
728 mFakeEventHub->addLed(EVENTHUB_ID, LED_NUML, false /*initially off*/);
729 mFakeEventHub->addLed(EVENTHUB_ID, LED_SCROLLL, false /*initially off*/);
730 mFakeEventHub->addKey(EVENTHUB_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
731 mFakeEventHub->addKey(EVENTHUB_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
732 mFakeEventHub->addKey(EVENTHUB_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
733
734 KeyboardInputMapper& mapper =
735 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
736 // Initial metastate is AMETA_NONE.
737 ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
738
739 // Initialization should have turned all of the lights off.
740 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
741 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
742 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
743
744 // Toggle caps lock on.
745 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 1);
746 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 0);
747 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
748 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper.getMetaState());
749
750 // Toggle num lock on.
751 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 1);
752 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 0);
753 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
754 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper.getMetaState());
755
756 // Toggle scroll lock on.
757 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
758 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
759 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
760 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper.getMetaState());
761
762 mFakeEventHub->removeDevice(EVENTHUB_ID);
763 mReader->loopOnce();
764
765 // keyboard 2 should default toggle keys.
766 const std::string USB2 = "USB2";
767 const std::string DEVICE_NAME2 = "KEYBOARD2";
768 constexpr int32_t SECOND_DEVICE_ID = DEVICE_ID + 1;
769 constexpr int32_t SECOND_EVENTHUB_ID = EVENTHUB_ID + 1;
770 std::shared_ptr<InputDevice> device2 =
771 newDevice(SECOND_DEVICE_ID, DEVICE_NAME2, USB2, SECOND_EVENTHUB_ID,
772 ftl::Flags<InputDeviceClass>(0));
773 mFakeEventHub->addLed(SECOND_EVENTHUB_ID, LED_CAPSL, true /*initially on*/);
774 mFakeEventHub->addLed(SECOND_EVENTHUB_ID, LED_NUML, false /*initially off*/);
775 mFakeEventHub->addLed(SECOND_EVENTHUB_ID, LED_SCROLLL, false /*initially off*/);
776 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
777 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
778 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
779
780 device2->addEmptyEventHubDevice(SECOND_EVENTHUB_ID);
781 KeyboardInputMapper& mapper2 =
782 device2->constructAndAddMapper<KeyboardInputMapper>(SECOND_EVENTHUB_ID,
783 mFakePolicy
784 ->getReaderConfiguration(),
785 AINPUT_SOURCE_KEYBOARD);
786 std::list<NotifyArgs> unused =
787 device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
788 /*changes=*/{});
789 unused += device2->reset(ARBITRARY_TIME);
790
791 ASSERT_TRUE(mFakeEventHub->getLedState(SECOND_EVENTHUB_ID, LED_CAPSL));
792 ASSERT_TRUE(mFakeEventHub->getLedState(SECOND_EVENTHUB_ID, LED_NUML));
793 ASSERT_TRUE(mFakeEventHub->getLedState(SECOND_EVENTHUB_ID, LED_SCROLLL));
794 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON,
795 mapper2.getMetaState());
796}
797
798TEST_F(KeyboardInputMapperTest, Process_toggleCapsLockState) {
799 mFakeEventHub->addKey(EVENTHUB_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
800 mFakeEventHub->addKey(EVENTHUB_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
801 mFakeEventHub->addKey(EVENTHUB_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
802
803 // Suppose we have two mappers. (DPAD + KEYBOARD)
804 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_DPAD);
805 KeyboardInputMapper& mapper =
806 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
807 // Initial metastate is AMETA_NONE.
808 ASSERT_EQ(AMETA_NONE, mapper.getMetaState());
809
810 mReader->toggleCapsLockState(DEVICE_ID);
811 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper.getMetaState());
812}
813
814TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleInMultiDevices) {
815 // keyboard 1.
816 mFakeEventHub->addLed(EVENTHUB_ID, LED_CAPSL, true /*initially on*/);
817 mFakeEventHub->addLed(EVENTHUB_ID, LED_NUML, false /*initially off*/);
818 mFakeEventHub->addLed(EVENTHUB_ID, LED_SCROLLL, false /*initially off*/);
819 mFakeEventHub->addKey(EVENTHUB_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
820 mFakeEventHub->addKey(EVENTHUB_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
821 mFakeEventHub->addKey(EVENTHUB_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
822
823 KeyboardInputMapper& mapper1 =
824 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
825
826 // keyboard 2.
827 const std::string USB2 = "USB2";
828 const std::string DEVICE_NAME2 = "KEYBOARD2";
829 constexpr int32_t SECOND_DEVICE_ID = DEVICE_ID + 1;
830 constexpr int32_t SECOND_EVENTHUB_ID = EVENTHUB_ID + 1;
831 std::shared_ptr<InputDevice> device2 =
832 newDevice(SECOND_DEVICE_ID, DEVICE_NAME2, USB2, SECOND_EVENTHUB_ID,
833 ftl::Flags<InputDeviceClass>(0));
834 mFakeEventHub->addLed(SECOND_EVENTHUB_ID, LED_CAPSL, true /*initially on*/);
835 mFakeEventHub->addLed(SECOND_EVENTHUB_ID, LED_NUML, false /*initially off*/);
836 mFakeEventHub->addLed(SECOND_EVENTHUB_ID, LED_SCROLLL, false /*initially off*/);
837 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
838 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
839 mFakeEventHub->addKey(SECOND_EVENTHUB_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
840
841 device2->addEmptyEventHubDevice(SECOND_EVENTHUB_ID);
842 KeyboardInputMapper& mapper2 =
843 device2->constructAndAddMapper<KeyboardInputMapper>(SECOND_EVENTHUB_ID,
844 mFakePolicy
845 ->getReaderConfiguration(),
846 AINPUT_SOURCE_KEYBOARD);
847 std::list<NotifyArgs> unused =
848 device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
849 /*changes=*/{});
850 unused += device2->reset(ARBITRARY_TIME);
851
852 // Initial metastate is AMETA_NONE.
853 ASSERT_EQ(AMETA_NONE, mapper1.getMetaState());
854 ASSERT_EQ(AMETA_NONE, mapper2.getMetaState());
855
856 // Toggle num lock on and off.
857 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 1);
858 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 0);
859 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
860 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper1.getMetaState());
861 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper2.getMetaState());
862
863 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 1);
864 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_NUMLOCK, 0);
865 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_NUML));
866 ASSERT_EQ(AMETA_NONE, mapper1.getMetaState());
867 ASSERT_EQ(AMETA_NONE, mapper2.getMetaState());
868
869 // Toggle caps lock on and off.
870 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 1);
871 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 0);
872 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
873 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper1.getMetaState());
874 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper2.getMetaState());
875
876 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 1);
877 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_CAPSLOCK, 0);
878 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_CAPSL));
879 ASSERT_EQ(AMETA_NONE, mapper1.getMetaState());
880 ASSERT_EQ(AMETA_NONE, mapper2.getMetaState());
881
882 // Toggle scroll lock on and off.
883 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
884 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
885 ASSERT_TRUE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
886 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper1.getMetaState());
887 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper2.getMetaState());
888
889 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
890 process(mapper1, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
891 ASSERT_FALSE(mFakeEventHub->getLedState(EVENTHUB_ID, LED_SCROLLL));
892 ASSERT_EQ(AMETA_NONE, mapper1.getMetaState());
893 ASSERT_EQ(AMETA_NONE, mapper2.getMetaState());
894}
895
896TEST_F(KeyboardInputMapperTest, Process_DisabledDevice) {
897 const int32_t USAGE_A = 0x070004;
898 mFakeEventHub->addKey(EVENTHUB_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
899 mFakeEventHub->addKey(EVENTHUB_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
900
901 KeyboardInputMapper& mapper =
902 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
903 // Key down by scan code.
904 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_HOME, 1);
905 NotifyKeyArgs args;
906 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
907 ASSERT_EQ(DEVICE_ID, args.deviceId);
908 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
909 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
910 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
911 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
912 ASSERT_EQ(KEY_HOME, args.scanCode);
913 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
914
915 // Disable device, it should synthesize cancellation events for down events.
916 mFakePolicy->addDisabledDevice(DEVICE_ID);
917 configureDevice(InputReaderConfiguration::Change::ENABLED_STATE);
918
919 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
920 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
921 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
922 ASSERT_EQ(KEY_HOME, args.scanCode);
923 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_CANCELED, args.flags);
924}
925
926TEST_F(KeyboardInputMapperTest, Configure_AssignKeyboardLayoutInfo) {
927 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
928 std::list<NotifyArgs> unused =
929 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
930 /*changes=*/{});
931
932 uint32_t generation = mReader->getContext()->getGeneration();
933 mFakePolicy->addKeyboardLayoutAssociation(DEVICE_LOCATION, DEVICE_KEYBOARD_LAYOUT_INFO);
934
935 unused += mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
936 InputReaderConfiguration::Change::KEYBOARD_LAYOUT_ASSOCIATION);
937
938 InputDeviceInfo deviceInfo = mDevice->getDeviceInfo();
939 ASSERT_EQ(DEVICE_KEYBOARD_LAYOUT_INFO.languageTag,
940 deviceInfo.getKeyboardLayoutInfo()->languageTag);
941 ASSERT_EQ(DEVICE_KEYBOARD_LAYOUT_INFO.layoutType,
942 deviceInfo.getKeyboardLayoutInfo()->layoutType);
943 ASSERT_TRUE(mReader->getContext()->getGeneration() != generation);
944
945 // Call change layout association with the same values: Generation shouldn't change
946 generation = mReader->getContext()->getGeneration();
947 mFakePolicy->addKeyboardLayoutAssociation(DEVICE_LOCATION, DEVICE_KEYBOARD_LAYOUT_INFO);
948 unused += mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
949 InputReaderConfiguration::Change::KEYBOARD_LAYOUT_ASSOCIATION);
950 ASSERT_TRUE(mReader->getContext()->getGeneration() == generation);
951}
952
953TEST_F(KeyboardInputMapperTest, LayoutInfoCorrectlyMapped) {
954 mFakeEventHub->setRawLayoutInfo(EVENTHUB_ID,
955 RawLayoutInfo{.languageTag = "en", .layoutType = "extended"});
956
957 // Configuration
958 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
959 InputReaderConfiguration config;
960 std::list<NotifyArgs> unused = mDevice->configure(ARBITRARY_TIME, config, /*changes=*/{});
961
962 ASSERT_EQ("en", mDevice->getDeviceInfo().getKeyboardLayoutInfo()->languageTag);
963 ASSERT_EQ("extended", mDevice->getDeviceInfo().getKeyboardLayoutInfo()->layoutType);
964}
965
966TEST_F(KeyboardInputMapperTest, Process_GesureEventToSetFlagKeepTouchMode) {
967 mFakeEventHub->addKey(EVENTHUB_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, POLICY_FLAG_GESTURE);
968 KeyboardInputMapper& mapper =
969 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
970 NotifyKeyArgs args;
971
972 // Key down
973 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_LEFT, 1);
974 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
975 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_KEEP_TOUCH_MODE, args.flags);
976}
977
978TEST_F_WITH_FLAGS(KeyboardInputMapperTest, WakeBehavior_AlphabeticKeyboard,
979 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(com::android::input::flags,
980 enable_alphabetic_keyboard_wake))) {
981 // For internal alphabetic devices, keys will trigger wake on key down.
982
983 mFakeEventHub->addKey(EVENTHUB_ID, KEY_A, 0, AKEYCODE_A, 0);
984 mFakeEventHub->addKey(EVENTHUB_ID, KEY_HOME, 0, AKEYCODE_HOME, 0);
985 mFakeEventHub->addKey(EVENTHUB_ID, KEY_PLAYPAUSE, 0, AKEYCODE_MEDIA_PLAY_PAUSE, 0);
986
987 KeyboardInputMapper& mapper =
988 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
989
990 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_A, 1);
991 NotifyKeyArgs args;
992 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
993 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
994
995 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_A, 0);
996 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
997 ASSERT_EQ(uint32_t(0), args.policyFlags);
998
999 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_HOME, 1);
1000 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1001 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1002
1003 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_HOME, 0);
1004 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1005 ASSERT_EQ(uint32_t(0), args.policyFlags);
1006
1007 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_PLAYPAUSE, 1);
1008 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1009 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1010
1011 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_PLAYPAUSE, 0);
1012 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1013 ASSERT_EQ(uint32_t(0), args.policyFlags);
1014}
1015
1016/**
1017 * When there is more than one KeyboardInputMapper for an InputDevice, each mapper should produce
1018 * events that use the shared keyboard source across all mappers. This is to ensure that each
1019 * input device generates key events in a consistent manner, regardless of which mapper produces
1020 * the event.
1021 */
1022TEST_F(KeyboardInputMapperTest, UsesSharedKeyboardSource) {
1023 mFakeEventHub->addKey(EVENTHUB_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1024
1025 // Add a mapper with SOURCE_KEYBOARD
1026 KeyboardInputMapper& keyboardMapper =
1027 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
1028
1029 process(keyboardMapper, ARBITRARY_TIME, 0, EV_KEY, KEY_HOME, 1);
1030 ASSERT_NO_FATAL_FAILURE(
1031 mFakeListener->assertNotifyKeyWasCalled(WithSource(AINPUT_SOURCE_KEYBOARD)));
1032 process(keyboardMapper, ARBITRARY_TIME, 0, EV_KEY, KEY_HOME, 0);
1033 ASSERT_NO_FATAL_FAILURE(
1034 mFakeListener->assertNotifyKeyWasCalled(WithSource(AINPUT_SOURCE_KEYBOARD)));
1035
1036 // Add a mapper with SOURCE_DPAD
1037 KeyboardInputMapper& dpadMapper =
1038 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_DPAD);
1039 for (auto* mapper : {&keyboardMapper, &dpadMapper}) {
1040 process(*mapper, ARBITRARY_TIME, 0, EV_KEY, KEY_HOME, 1);
1041 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(
1042 WithSource(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_DPAD)));
1043 process(*mapper, ARBITRARY_TIME, 0, EV_KEY, KEY_HOME, 0);
1044 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(
1045 WithSource(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_DPAD)));
1046 }
1047
1048 // Add a mapper with SOURCE_GAMEPAD
1049 KeyboardInputMapper& gamepadMapper =
1050 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_GAMEPAD);
1051 for (auto* mapper : {&keyboardMapper, &dpadMapper, &gamepadMapper}) {
1052 process(*mapper, ARBITRARY_TIME, 0, EV_KEY, KEY_HOME, 1);
1053 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(
1054 WithSource(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_DPAD | AINPUT_SOURCE_GAMEPAD)));
1055 process(*mapper, ARBITRARY_TIME, 0, EV_KEY, KEY_HOME, 0);
1056 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(
1057 WithSource(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_DPAD | AINPUT_SOURCE_GAMEPAD)));
1058 }
1059}
1060
1061// --- KeyboardInputMapperTest_ExternalAlphabeticDevice ---
1062
1063class KeyboardInputMapperTest_ExternalAlphabeticDevice : public InputMapperTest {
1064protected:
1065 void SetUp() override {
1066 InputMapperTest::SetUp(DEVICE_CLASSES | InputDeviceClass::KEYBOARD |
1067 InputDeviceClass::ALPHAKEY | InputDeviceClass::EXTERNAL);
1068 }
1069};
1070
1071// --- KeyboardInputMapperTest_ExternalNonAlphabeticDevice ---
1072
1073class KeyboardInputMapperTest_ExternalNonAlphabeticDevice : public InputMapperTest {
1074protected:
1075 void SetUp() override {
1076 InputMapperTest::SetUp(DEVICE_CLASSES | InputDeviceClass::KEYBOARD |
1077 InputDeviceClass::EXTERNAL);
1078 }
1079};
1080
1081TEST_F(KeyboardInputMapperTest_ExternalAlphabeticDevice, WakeBehavior_AlphabeticKeyboard) {
1082 // For external devices, keys will trigger wake on key down. Media keys should also trigger
1083 // wake if triggered from external devices.
1084
1085 mFakeEventHub->addKey(EVENTHUB_ID, KEY_HOME, 0, AKEYCODE_HOME, 0);
1086 mFakeEventHub->addKey(EVENTHUB_ID, KEY_PLAY, 0, AKEYCODE_MEDIA_PLAY, 0);
1087 mFakeEventHub->addKey(EVENTHUB_ID, KEY_PLAYPAUSE, 0, AKEYCODE_MEDIA_PLAY_PAUSE,
1088 POLICY_FLAG_WAKE);
1089
1090 KeyboardInputMapper& mapper =
1091 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
1092
1093 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_HOME, 1);
1094 NotifyKeyArgs args;
1095 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1096 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1097
1098 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_HOME, 0);
1099 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1100 ASSERT_EQ(uint32_t(0), args.policyFlags);
1101
1102 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_PLAY, 1);
1103 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1104 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1105
1106 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_PLAY, 0);
1107 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1108 ASSERT_EQ(uint32_t(0), args.policyFlags);
1109
1110 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_PLAYPAUSE, 1);
1111 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1112 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1113
1114 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_PLAYPAUSE, 0);
1115 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1116 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1117}
1118
1119TEST_F(KeyboardInputMapperTest_ExternalNonAlphabeticDevice, WakeBehavior_NonAlphabeticKeyboard) {
1120 // For external devices, keys will trigger wake on key down. Media keys should not trigger
1121 // wake if triggered from external non-alphaebtic keyboard (e.g. headsets).
1122
1123 mFakeEventHub->addKey(EVENTHUB_ID, KEY_PLAY, 0, AKEYCODE_MEDIA_PLAY, 0);
1124 mFakeEventHub->addKey(EVENTHUB_ID, KEY_PLAYPAUSE, 0, AKEYCODE_MEDIA_PLAY_PAUSE,
1125 POLICY_FLAG_WAKE);
1126
1127 KeyboardInputMapper& mapper =
1128 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
1129
1130 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_PLAY, 1);
1131 NotifyKeyArgs args;
1132 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1133 ASSERT_EQ(uint32_t(0), args.policyFlags);
1134
1135 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_PLAY, 0);
1136 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1137 ASSERT_EQ(uint32_t(0), args.policyFlags);
1138
1139 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_PLAYPAUSE, 1);
1140 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1141 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1142
1143 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_PLAYPAUSE, 0);
1144 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1145 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1146}
1147
1148TEST_F(KeyboardInputMapperTest_ExternalAlphabeticDevice, DoNotWakeByDefaultBehavior) {
1149 // Tv Remote key's wake behavior is prescribed by the keylayout file.
1150
1151 mFakeEventHub->addKey(EVENTHUB_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1152 mFakeEventHub->addKey(EVENTHUB_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1153 mFakeEventHub->addKey(EVENTHUB_ID, KEY_PLAY, 0, AKEYCODE_MEDIA_PLAY, POLICY_FLAG_WAKE);
1154
1155 addConfigurationProperty("keyboard.doNotWakeByDefault", "1");
1156 KeyboardInputMapper& mapper =
1157 constructAndAddMapper<KeyboardInputMapper>(AINPUT_SOURCE_KEYBOARD);
1158
1159 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_HOME, 1);
1160 NotifyKeyArgs args;
1161 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1162 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1163
1164 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_HOME, 0);
1165 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1166 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1167
1168 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_DOWN, 1);
1169 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1170 ASSERT_EQ(uint32_t(0), args.policyFlags);
1171
1172 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_DOWN, 0);
1173 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1174 ASSERT_EQ(uint32_t(0), args.policyFlags);
1175
1176 process(mapper, ARBITRARY_TIME, READ_TIME, EV_KEY, KEY_PLAY, 1);
1177 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1178 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1179
1180 process(mapper, ARBITRARY_TIME + 1, READ_TIME, EV_KEY, KEY_PLAY, 0);
1181 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1182 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1183}
1184
Arpit Singhb3b3f732023-07-04 14:30:05 +00001185} // namespace android