1 /* 2 * Copyright (C) 2021 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 package android.view; 18 19 import static org.junit.Assert.assertEquals; 20 21 import android.hardware.input.HostUsiVersion; 22 import android.os.Parcel; 23 24 import androidx.test.ext.junit.runners.AndroidJUnit4; 25 import androidx.test.filters.SmallTest; 26 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 30 @SmallTest 31 @RunWith(AndroidJUnit4.class) 32 public class InputDeviceTest { 33 private static final float DELTA = 0.01f; 34 private static final int DEVICE_ID = 1000; 35 assertMotionRangeEquals(InputDevice.MotionRange range, InputDevice.MotionRange outRange)36 private void assertMotionRangeEquals(InputDevice.MotionRange range, 37 InputDevice.MotionRange outRange) { 38 assertEquals(range.getAxis(), outRange.getAxis()); 39 assertEquals(range.getSource(), outRange.getSource()); 40 assertEquals(range.getMin(), outRange.getMin(), DELTA); 41 assertEquals(range.getMax(), outRange.getMax(), DELTA); 42 assertEquals(range.getFlat(), outRange.getFlat(), DELTA); 43 assertEquals(range.getFuzz(), outRange.getFuzz(), DELTA); 44 assertEquals(range.getResolution(), outRange.getResolution(), DELTA); 45 } 46 assertDeviceEquals(InputDevice device, InputDevice outDevice)47 private void assertDeviceEquals(InputDevice device, InputDevice outDevice) { 48 assertEquals(device.getId(), outDevice.getId()); 49 assertEquals(device.getGeneration(), outDevice.getGeneration()); 50 assertEquals(device.getControllerNumber(), outDevice.getControllerNumber()); 51 assertEquals(device.getName(), outDevice.getName()); 52 assertEquals(device.getVendorId(), outDevice.getVendorId()); 53 assertEquals(device.getProductId(), outDevice.getProductId()); 54 assertEquals(device.getDescriptor(), outDevice.getDescriptor()); 55 assertEquals(device.isExternal(), outDevice.isExternal()); 56 assertEquals(device.getSources(), outDevice.getSources()); 57 assertEquals(device.getKeyboardType(), outDevice.getKeyboardType()); 58 assertEquals(device.getKeyboardLanguageTag(), outDevice.getKeyboardLanguageTag()); 59 assertEquals(device.getKeyboardLayoutType(), outDevice.getKeyboardLayoutType()); 60 assertEquals(device.getMotionRanges().size(), outDevice.getMotionRanges().size()); 61 assertEquals(device.getHostUsiVersion(), outDevice.getHostUsiVersion()); 62 assertEquals(device.getAssociatedDisplayId(), outDevice.getAssociatedDisplayId()); 63 64 KeyCharacterMap keyCharacterMap = device.getKeyCharacterMap(); 65 KeyCharacterMap outKeyCharacterMap = outDevice.getKeyCharacterMap(); 66 assertEquals("keyCharacterMap not equal", keyCharacterMap, outKeyCharacterMap); 67 68 for (int j = 0; j < device.getMotionRanges().size(); j++) { 69 assertMotionRangeEquals(device.getMotionRanges().get(j), 70 outDevice.getMotionRanges().get(j)); 71 } 72 } 73 assertInputDeviceParcelUnparcel(KeyCharacterMap keyCharacterMap)74 private void assertInputDeviceParcelUnparcel(KeyCharacterMap keyCharacterMap) { 75 final InputDevice.Builder deviceBuilder = new InputDevice.Builder() 76 .setId(DEVICE_ID) 77 .setGeneration(42) 78 .setControllerNumber(43) 79 .setName("Test Device " + DEVICE_ID) 80 .setVendorId(44) 81 .setProductId(45) 82 .setDescriptor("descriptor") 83 .setExternal(true) 84 .setSources(InputDevice.SOURCE_HDMI) 85 .setKeyboardType(InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC) 86 .setKeyCharacterMap(keyCharacterMap) 87 .setHasVibrator(true) 88 .setHasMicrophone(true) 89 .setHasButtonUnderPad(true) 90 .setHasSensor(true) 91 .setHasBattery(true) 92 .setKeyboardLanguageTag("en-US") 93 .setKeyboardLayoutType("qwerty") 94 .setUsiVersion(new HostUsiVersion(2, 0)); 95 96 for (int i = 0; i < 30; i++) { 97 deviceBuilder.addMotionRange( 98 MotionEvent.AXIS_GENERIC_1, 99 InputDevice.SOURCE_UNKNOWN, 100 i, 101 i + 1, 102 i + 2, 103 i + 3, 104 i + 4); 105 } 106 107 final InputDevice device = deviceBuilder.build(); 108 109 Parcel parcel = Parcel.obtain(); 110 device.writeToParcel(parcel, 0); 111 parcel.setDataPosition(0); 112 113 InputDevice outDevice = InputDevice.CREATOR.createFromParcel(parcel); 114 assertDeviceEquals(device, outDevice); 115 } 116 117 @Test testParcelUnparcelInputDevice_VirtualCharacterMap()118 public void testParcelUnparcelInputDevice_VirtualCharacterMap() { 119 final KeyCharacterMap keyCharacterMap = 120 KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 121 assertInputDeviceParcelUnparcel(keyCharacterMap); 122 } 123 124 @Test testParcelUnparcelInputDevice_EmptyCharacterMap()125 public void testParcelUnparcelInputDevice_EmptyCharacterMap() { 126 final KeyCharacterMap keyCharacterMap = KeyCharacterMap.obtainEmptyMap(DEVICE_ID); 127 assertInputDeviceParcelUnparcel(keyCharacterMap); 128 } 129 } 130