1 /* 2 * Copyright (C) 2012 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 #pragma once 18 19 #include <android/sensor.h> 20 #include <ftl/flags.h> 21 #include <ftl/mixins.h> 22 #include <input/Input.h> 23 #include <input/KeyCharacterMap.h> 24 #include <set> 25 #include <unordered_map> 26 #include <vector> 27 28 #include <android/os/IInputConstants.h> 29 30 namespace android { 31 32 /* 33 * Identifies a device. 34 */ 35 struct InputDeviceIdentifier { InputDeviceIdentifierInputDeviceIdentifier36 inline InputDeviceIdentifier() : 37 bus(0), vendor(0), product(0), version(0) { 38 } 39 40 // Information provided by the kernel. 41 std::string name; 42 std::string location; 43 std::string uniqueId; 44 uint16_t bus; 45 uint16_t vendor; 46 uint16_t product; 47 uint16_t version; 48 49 // A composite input device descriptor string that uniquely identifies the device 50 // even across reboots or reconnections. The value of this field is used by 51 // upper layers of the input system to associate settings with individual devices. 52 // It is hashed from whatever kernel provided information is available. 53 // Ideally, the way this value is computed should not change between Android releases 54 // because that would invalidate persistent settings that rely on it. 55 std::string descriptor; 56 57 // A value added to uniquely identify a device in the absence of a unique id. This 58 // is intended to be a minimum way to distinguish from other active devices and may 59 // reuse values that are not associated with an input anymore. 60 uint16_t nonce; 61 62 // The bluetooth address of the device, if known. 63 std::optional<std::string> bluetoothAddress; 64 65 /** 66 * Return InputDeviceIdentifier.name that has been adjusted as follows: 67 * - all characters besides alphanumerics, dash, 68 * and underscore have been replaced with underscores. 69 * This helps in situations where a file that matches the device name is needed, 70 * while conforming to the filename limitations. 71 */ 72 std::string getCanonicalName() const; 73 74 bool operator==(const InputDeviceIdentifier&) const = default; 75 bool operator!=(const InputDeviceIdentifier&) const = default; 76 }; 77 78 /** 79 * Holds View related behaviors for an InputDevice. 80 */ 81 struct InputDeviceViewBehavior { 82 /** 83 * The smooth scroll behavior that applies for all source/axis, if defined by the device. 84 * Empty optional if the device has not specified the default smooth scroll behavior. 85 */ 86 std::optional<bool> shouldSmoothScroll; 87 }; 88 89 /* Types of input device sensors. Keep sync with core/java/android/hardware/Sensor.java */ 90 enum class InputDeviceSensorType : int32_t { 91 ACCELEROMETER = ASENSOR_TYPE_ACCELEROMETER, 92 MAGNETIC_FIELD = ASENSOR_TYPE_MAGNETIC_FIELD, 93 ORIENTATION = 3, 94 GYROSCOPE = ASENSOR_TYPE_GYROSCOPE, 95 LIGHT = ASENSOR_TYPE_LIGHT, 96 PRESSURE = ASENSOR_TYPE_PRESSURE, 97 TEMPERATURE = 7, 98 PROXIMITY = ASENSOR_TYPE_PROXIMITY, 99 GRAVITY = ASENSOR_TYPE_GRAVITY, 100 LINEAR_ACCELERATION = ASENSOR_TYPE_LINEAR_ACCELERATION, 101 ROTATION_VECTOR = ASENSOR_TYPE_ROTATION_VECTOR, 102 RELATIVE_HUMIDITY = ASENSOR_TYPE_RELATIVE_HUMIDITY, 103 AMBIENT_TEMPERATURE = ASENSOR_TYPE_AMBIENT_TEMPERATURE, 104 MAGNETIC_FIELD_UNCALIBRATED = ASENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 105 GAME_ROTATION_VECTOR = ASENSOR_TYPE_GAME_ROTATION_VECTOR, 106 GYROSCOPE_UNCALIBRATED = ASENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 107 SIGNIFICANT_MOTION = ASENSOR_TYPE_SIGNIFICANT_MOTION, 108 109 ftl_first = ACCELEROMETER, 110 ftl_last = SIGNIFICANT_MOTION 111 }; 112 113 enum class InputDeviceSensorAccuracy : int32_t { 114 NONE = 0, 115 LOW = 1, 116 MEDIUM = 2, 117 HIGH = 3, 118 119 ftl_last = HIGH, 120 }; 121 122 enum class InputDeviceSensorReportingMode : int32_t { 123 CONTINUOUS = 0, 124 ON_CHANGE = 1, 125 ONE_SHOT = 2, 126 SPECIAL_TRIGGER = 3, 127 }; 128 129 enum class InputDeviceLightType : int32_t { 130 INPUT = 0, 131 PLAYER_ID = 1, 132 KEYBOARD_BACKLIGHT = 2, 133 KEYBOARD_MIC_MUTE = 3, 134 KEYBOARD_VOLUME_MUTE = 4, 135 136 ftl_last = KEYBOARD_VOLUME_MUTE 137 }; 138 139 enum class InputDeviceLightCapability : uint32_t { 140 /** Capability to change brightness of the light */ 141 BRIGHTNESS = 0x00000001, 142 /** Capability to change color of the light */ 143 RGB = 0x00000002, 144 }; 145 146 struct InputDeviceSensorInfo { InputDeviceSensorInfoInputDeviceSensorInfo147 explicit InputDeviceSensorInfo(std::string name, std::string vendor, int32_t version, 148 InputDeviceSensorType type, InputDeviceSensorAccuracy accuracy, 149 float maxRange, float resolution, float power, int32_t minDelay, 150 int32_t fifoReservedEventCount, int32_t fifoMaxEventCount, 151 std::string stringType, int32_t maxDelay, int32_t flags, 152 int32_t id) 153 : name(name), 154 vendor(vendor), 155 version(version), 156 type(type), 157 accuracy(accuracy), 158 maxRange(maxRange), 159 resolution(resolution), 160 power(power), 161 minDelay(minDelay), 162 fifoReservedEventCount(fifoReservedEventCount), 163 fifoMaxEventCount(fifoMaxEventCount), 164 stringType(stringType), 165 maxDelay(maxDelay), 166 flags(flags), 167 id(id) {} 168 // Name string of the sensor. 169 std::string name; 170 // Vendor string of this sensor. 171 std::string vendor; 172 // Version of the sensor's module. 173 int32_t version; 174 // Generic type of this sensor. 175 InputDeviceSensorType type; 176 // The current accuracy of sensor event. 177 InputDeviceSensorAccuracy accuracy; 178 // Maximum range of the sensor in the sensor's unit. 179 float maxRange; 180 // Resolution of the sensor in the sensor's unit. 181 float resolution; 182 // The power in mA used by this sensor while in use. 183 float power; 184 // The minimum delay allowed between two events in microsecond or zero if this sensor only 185 // returns a value when the data it's measuring changes. 186 int32_t minDelay; 187 // Number of events reserved for this sensor in the batch mode FIFO. 188 int32_t fifoReservedEventCount; 189 // Maximum number of events of this sensor that could be batched. 190 int32_t fifoMaxEventCount; 191 // The type of this sensor as a string. 192 std::string stringType; 193 // The delay between two sensor events corresponding to the lowest frequency that this sensor 194 // supports. 195 int32_t maxDelay; 196 // Sensor flags 197 int32_t flags; 198 // Sensor id, same as the input device ID it belongs to. 199 int32_t id; 200 }; 201 202 struct BrightnessLevel : ftl::DefaultConstructible<BrightnessLevel, std::uint8_t>, 203 ftl::Equatable<BrightnessLevel>, 204 ftl::Orderable<BrightnessLevel>, 205 ftl::Addable<BrightnessLevel> { 206 using DefaultConstructible::DefaultConstructible; 207 }; 208 209 struct InputDeviceLightInfo { InputDeviceLightInfoInputDeviceLightInfo210 explicit InputDeviceLightInfo(std::string name, int32_t id, InputDeviceLightType type, 211 ftl::Flags<InputDeviceLightCapability> capabilityFlags, 212 int32_t ordinal, 213 std::set<BrightnessLevel> preferredBrightnessLevels) 214 : name(name), 215 id(id), 216 type(type), 217 capabilityFlags(capabilityFlags), 218 ordinal(ordinal), 219 preferredBrightnessLevels(std::move(preferredBrightnessLevels)) {} 220 // Name string of the light. 221 std::string name; 222 // Light id 223 int32_t id; 224 // Type of the light. 225 InputDeviceLightType type; 226 // Light capabilities. 227 ftl::Flags<InputDeviceLightCapability> capabilityFlags; 228 // Ordinal of the light 229 int32_t ordinal; 230 // Custom brightness levels for the light 231 std::set<BrightnessLevel> preferredBrightnessLevels; 232 }; 233 234 struct InputDeviceBatteryInfo { InputDeviceBatteryInfoInputDeviceBatteryInfo235 explicit InputDeviceBatteryInfo(std::string name, int32_t id) : name(name), id(id) {} 236 // Name string of the battery. 237 std::string name; 238 // Battery id 239 int32_t id; 240 }; 241 242 struct KeyboardLayoutInfo { KeyboardLayoutInfoKeyboardLayoutInfo243 explicit KeyboardLayoutInfo(std::string languageTag, std::string layoutType) 244 : languageTag(languageTag), layoutType(layoutType) {} 245 246 // A BCP 47 conformant language tag such as "en-US". 247 std::string languageTag; 248 // The layout type such as QWERTY or AZERTY. 249 std::string layoutType; 250 251 inline bool operator==(const KeyboardLayoutInfo& other) const { 252 return languageTag == other.languageTag && layoutType == other.layoutType; 253 } 254 inline bool operator!=(const KeyboardLayoutInfo& other) const { return !(*this == other); } 255 }; 256 257 // The version of the Universal Stylus Initiative (USI) protocol supported by the input device. 258 struct InputDeviceUsiVersion { 259 int32_t majorVersion = -1; 260 int32_t minorVersion = -1; 261 }; 262 263 /* 264 * Describes the characteristics and capabilities of an input device. 265 */ 266 class InputDeviceInfo { 267 public: 268 InputDeviceInfo(); 269 InputDeviceInfo(const InputDeviceInfo& other); 270 InputDeviceInfo& operator=(const InputDeviceInfo& other); 271 ~InputDeviceInfo(); 272 273 struct MotionRange { 274 int32_t axis; 275 uint32_t source; 276 float min; 277 float max; 278 float flat; 279 float fuzz; 280 float resolution; 281 }; 282 283 void initialize(int32_t id, int32_t generation, int32_t controllerNumber, 284 const InputDeviceIdentifier& identifier, const std::string& alias, 285 bool isExternal, bool hasMic, ui::LogicalDisplayId associatedDisplayId, 286 InputDeviceViewBehavior viewBehavior = {{}}, bool enabled = true); 287 getId()288 inline int32_t getId() const { return mId; } getControllerNumber()289 inline int32_t getControllerNumber() const { return mControllerNumber; } getGeneration()290 inline int32_t getGeneration() const { return mGeneration; } getIdentifier()291 inline const InputDeviceIdentifier& getIdentifier() const { return mIdentifier; } getAlias()292 inline const std::string& getAlias() const { return mAlias; } getDisplayName()293 inline const std::string& getDisplayName() const { 294 return mAlias.empty() ? mIdentifier.name : mAlias; 295 } isExternal()296 inline bool isExternal() const { return mIsExternal; } hasMic()297 inline bool hasMic() const { return mHasMic; } getSources()298 inline uint32_t getSources() const { return mSources; } 299 300 const MotionRange* getMotionRange(int32_t axis, uint32_t source) const; 301 302 void addSource(uint32_t source); 303 void addMotionRange(int32_t axis, uint32_t source, 304 float min, float max, float flat, float fuzz, float resolution); 305 void addMotionRange(const MotionRange& range); 306 void addSensorInfo(const InputDeviceSensorInfo& info); 307 void addBatteryInfo(const InputDeviceBatteryInfo& info); 308 void addLightInfo(const InputDeviceLightInfo& info); 309 310 void setKeyboardType(int32_t keyboardType); getKeyboardType()311 inline int32_t getKeyboardType() const { return mKeyboardType; } 312 313 void setKeyboardLayoutInfo(KeyboardLayoutInfo keyboardLayoutInfo); getKeyboardLayoutInfo()314 inline const std::optional<KeyboardLayoutInfo>& getKeyboardLayoutInfo() const { 315 return mKeyboardLayoutInfo; 316 } 317 getViewBehavior()318 inline const InputDeviceViewBehavior& getViewBehavior() const { return mViewBehavior; } 319 setKeyCharacterMap(std::unique_ptr<KeyCharacterMap> value)320 inline void setKeyCharacterMap(std::unique_ptr<KeyCharacterMap> value) { 321 mKeyCharacterMap = std::move(value); 322 } 323 getKeyCharacterMap()324 inline const KeyCharacterMap* getKeyCharacterMap() const { return mKeyCharacterMap.get(); } 325 setVibrator(bool hasVibrator)326 inline void setVibrator(bool hasVibrator) { mHasVibrator = hasVibrator; } hasVibrator()327 inline bool hasVibrator() const { return mHasVibrator; } 328 setHasBattery(bool hasBattery)329 inline void setHasBattery(bool hasBattery) { mHasBattery = hasBattery; } hasBattery()330 inline bool hasBattery() const { return mHasBattery; } 331 setButtonUnderPad(bool hasButton)332 inline void setButtonUnderPad(bool hasButton) { mHasButtonUnderPad = hasButton; } hasButtonUnderPad()333 inline bool hasButtonUnderPad() const { return mHasButtonUnderPad; } 334 setHasSensor(bool hasSensor)335 inline void setHasSensor(bool hasSensor) { mHasSensor = hasSensor; } hasSensor()336 inline bool hasSensor() const { return mHasSensor; } 337 getMotionRanges()338 inline const std::vector<MotionRange>& getMotionRanges() const { 339 return mMotionRanges; 340 } 341 342 std::vector<InputDeviceSensorInfo> getSensors(); 343 344 std::vector<InputDeviceLightInfo> getLights(); 345 setUsiVersion(std::optional<InputDeviceUsiVersion> usiVersion)346 inline void setUsiVersion(std::optional<InputDeviceUsiVersion> usiVersion) { 347 mUsiVersion = std::move(usiVersion); 348 } getUsiVersion()349 inline std::optional<InputDeviceUsiVersion> getUsiVersion() const { return mUsiVersion; } 350 getAssociatedDisplayId()351 inline ui::LogicalDisplayId getAssociatedDisplayId() const { return mAssociatedDisplayId; } 352 setEnabled(bool enabled)353 inline void setEnabled(bool enabled) { mEnabled = enabled; } isEnabled()354 inline bool isEnabled() const { return mEnabled; } 355 356 private: 357 int32_t mId; 358 int32_t mGeneration; 359 int32_t mControllerNumber; 360 InputDeviceIdentifier mIdentifier; 361 std::string mAlias; 362 bool mIsExternal; 363 bool mHasMic; 364 std::optional<KeyboardLayoutInfo> mKeyboardLayoutInfo; 365 uint32_t mSources; 366 int32_t mKeyboardType; 367 std::unique_ptr<KeyCharacterMap> mKeyCharacterMap; 368 std::optional<InputDeviceUsiVersion> mUsiVersion; 369 ui::LogicalDisplayId mAssociatedDisplayId{ui::LogicalDisplayId::INVALID}; 370 bool mEnabled; 371 372 bool mHasVibrator; 373 bool mHasBattery; 374 bool mHasButtonUnderPad; 375 bool mHasSensor; 376 377 std::vector<MotionRange> mMotionRanges; 378 std::unordered_map<InputDeviceSensorType, InputDeviceSensorInfo> mSensors; 379 /* Map from light ID to light info */ 380 std::unordered_map<int32_t, InputDeviceLightInfo> mLights; 381 /* Map from battery ID to battery info */ 382 std::unordered_map<int32_t, InputDeviceBatteryInfo> mBatteries; 383 /** The View related behaviors for the device. */ 384 InputDeviceViewBehavior mViewBehavior; 385 }; 386 387 /* Types of input device configuration files. */ 388 enum class InputDeviceConfigurationFileType : int32_t { 389 CONFIGURATION = 0, /* .idc file */ 390 KEY_LAYOUT = 1, /* .kl file */ 391 KEY_CHARACTER_MAP = 2, /* .kcm file */ 392 ftl_last = KEY_CHARACTER_MAP, 393 }; 394 395 /* 396 * Gets the path of an input device configuration file, if one is available. 397 * Considers both system provided and user installed configuration files. 398 * The optional suffix is appended to the end of the file name (before the 399 * extension). 400 * 401 * The device identifier is used to construct several default configuration file 402 * names to try based on the device name, vendor, product, and version. 403 * 404 * Returns an empty string if not found. 405 */ 406 extern std::string getInputDeviceConfigurationFilePathByDeviceIdentifier( 407 const InputDeviceIdentifier& deviceIdentifier, InputDeviceConfigurationFileType type, 408 const char* suffix = ""); 409 410 /* 411 * Gets the path of an input device configuration file, if one is available. 412 * Considers both system provided and user installed configuration files. 413 * 414 * The name is case-sensitive and is used to construct the filename to resolve. 415 * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores. 416 * 417 * Returns an empty string if not found. 418 */ 419 extern std::string getInputDeviceConfigurationFilePathByName( 420 const std::string& name, InputDeviceConfigurationFileType type); 421 422 enum ReservedInputDeviceId : int32_t { 423 // Device id representing an invalid device 424 INVALID_INPUT_DEVICE_ID = android::os::IInputConstants::INVALID_INPUT_DEVICE_ID, 425 // Device id of a special "virtual" keyboard that is always present. 426 VIRTUAL_KEYBOARD_ID = -1, 427 // Device id of the "built-in" keyboard if there is one. 428 BUILT_IN_KEYBOARD_ID = 0, 429 // First device id available for dynamic devices 430 END_RESERVED_ID = 1, 431 }; 432 433 } // namespace android 434