diff options
author | 2023-03-08 14:15:49 +0000 | |
---|---|---|
committer | 2023-03-14 16:19:46 +0000 | |
commit | f13161a18414986a44354485126473bd8d5c36e6 (patch) | |
tree | adb8bea74347b9efcfd9f8cd1ecd86872a346d28 | |
parent | 68782cf40caa44734ed29a63dc35a48014536bf1 (diff) |
input: use optionals for PropertyMap getters
Using optionals rather than returning a boolean forces the caller to
check whether the property is present, enforced by the compiler, and
also allows a more succinct syntax in some cases.
Bug: 245989146
Test: atest inputflinger_test
Test: connect Apple Magic Trackpad 2, check that gesture properties are
set correctly in dumpsys input
Change-Id: Ia0fde1f67269e6e7149f297def626e572fd7790f
-rw-r--r-- | include/input/PropertyMap.h | 17 | ||||
-rw-r--r-- | libs/input/Keyboard.cpp | 28 | ||||
-rw-r--r-- | libs/input/PropertyMap.cpp | 71 | ||||
-rw-r--r--[-rwxr-xr-x] | libs/input/PropertyMap_fuzz.cpp | 3 | ||||
-rw-r--r-- | services/inputflinger/host/InputDriver.cpp | 8 | ||||
-rw-r--r-- | services/inputflinger/reader/EventHub.cpp | 17 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/CursorInputMapper.cpp | 17 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/KeyboardInputMapper.cpp | 11 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/RotaryEncoderInputMapper.cpp | 15 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/SensorInputMapper.cpp | 48 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/SensorInputMapper.h | 6 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/TouchInputMapper.cpp | 153 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/TouchInputMapper.h | 3 | ||||
-rw-r--r-- | services/inputflinger/reader/mapper/gestures/PropertyProvider.cpp | 27 | ||||
-rw-r--r-- | services/inputflinger/tests/InputReader_test.cpp | 7 |
15 files changed, 198 insertions, 233 deletions
diff --git a/include/input/PropertyMap.h b/include/input/PropertyMap.h index 18ce16df36..2e44142927 100644 --- a/include/input/PropertyMap.h +++ b/include/input/PropertyMap.h @@ -19,6 +19,7 @@ #include <android-base/result.h> #include <utils/Tokenizer.h> +#include <optional> #include <string> #include <unordered_map> #include <unordered_set> @@ -63,15 +64,15 @@ public: /* Returns a set of all property keys starting with the given prefix. */ std::unordered_set<std::string> getKeysWithPrefix(const std::string& prefix) const; - /* Gets the value of a property and parses it. - * Returns true and sets outValue if the key was found and its value was parsed successfully. - * Otherwise returns false and does not modify outValue. (Also logs a warning.) + /* Gets the value of a property and parses it. Returns nullopt if the key wasn't found or + * couldn't be parsed as the requested type. (Warnings are also logged in the case of parsing + * failures.) */ - bool tryGetProperty(const std::string& key, std::string& outValue) const; - bool tryGetProperty(const std::string& key, bool& outValue) const; - bool tryGetProperty(const std::string& key, int32_t& outValue) const; - bool tryGetProperty(const std::string& key, float& outValue) const; - bool tryGetProperty(const std::string& key, double& outValue) const; + std::optional<std::string> getString(const std::string& key) const; + std::optional<bool> getBool(const std::string& key) const; + std::optional<int32_t> getInt(const std::string& key) const; + std::optional<float> getFloat(const std::string& key) const; + std::optional<double> getDouble(const std::string& key) const; /* Adds all values from the specified property map. */ void addAll(const PropertyMap* map); diff --git a/libs/input/Keyboard.cpp b/libs/input/Keyboard.cpp index 3f8467d818..0b5c7ff785 100644 --- a/libs/input/Keyboard.cpp +++ b/libs/input/Keyboard.cpp @@ -16,9 +16,10 @@ #define LOG_TAG "Keyboard" +#include <limits.h> #include <stdlib.h> #include <unistd.h> -#include <limits.h> +#include <optional> #include <input/InputDevice.h> #include <input/InputEventLabels.h> @@ -49,23 +50,25 @@ status_t KeyMap::load(const InputDeviceIdentifier& deviceIdentifier, const PropertyMap* deviceConfiguration) { // Use the configured key layout if available. if (deviceConfiguration) { - std::string keyLayoutName; - if (deviceConfiguration->tryGetProperty("keyboard.layout", keyLayoutName)) { - status_t status = loadKeyLayout(deviceIdentifier, keyLayoutName.c_str()); + std::optional<std::string> keyLayoutName = + deviceConfiguration->getString("keyboard.layout"); + if (keyLayoutName.has_value()) { + status_t status = loadKeyLayout(deviceIdentifier, *keyLayoutName); if (status == NAME_NOT_FOUND) { ALOGE("Configuration for keyboard device '%s' requested keyboard layout '%s' but " "it was not found.", - deviceIdentifier.name.c_str(), keyLayoutName.c_str()); + deviceIdentifier.name.c_str(), keyLayoutName->c_str()); } } - std::string keyCharacterMapName; - if (deviceConfiguration->tryGetProperty("keyboard.characterMap", keyCharacterMapName)) { - status_t status = loadKeyCharacterMap(deviceIdentifier, keyCharacterMapName.c_str()); + std::optional<std::string> keyCharacterMapName = + deviceConfiguration->getString("keyboard.characterMap"); + if (keyCharacterMapName.has_value()) { + status_t status = loadKeyCharacterMap(deviceIdentifier, *keyCharacterMapName); if (status == NAME_NOT_FOUND) { ALOGE("Configuration for keyboard device '%s' requested keyboard character " "map '%s' but it was not found.", - deviceIdentifier.name.c_str(), keyCharacterMapName.c_str()); + deviceIdentifier.name.c_str(), keyCharacterMapName->c_str()); } } @@ -162,9 +165,7 @@ bool isKeyboardSpecialFunction(const PropertyMap* config) { if (config == nullptr) { return false; } - bool isSpecialFunction = false; - config->tryGetProperty("keyboard.specialFunction", isSpecialFunction); - return isSpecialFunction; + return config->getBool("keyboard.specialFunction").value_or(false); } bool isEligibleBuiltInKeyboard(const InputDeviceIdentifier& deviceIdentifier, @@ -177,8 +178,7 @@ bool isEligibleBuiltInKeyboard(const InputDeviceIdentifier& deviceIdentifier, } if (deviceConfiguration) { - bool builtIn = false; - if (deviceConfiguration->tryGetProperty("keyboard.builtIn", builtIn) && builtIn) { + if (deviceConfiguration->getBool("keyboard.builtIn").value_or(false)) { return true; } } diff --git a/libs/input/PropertyMap.cpp b/libs/input/PropertyMap.cpp index 9a4f10b21d..548f894d22 100644 --- a/libs/input/PropertyMap.cpp +++ b/libs/input/PropertyMap.cpp @@ -60,75 +60,62 @@ bool PropertyMap::hasProperty(const std::string& key) const { return mProperties.find(key) != mProperties.end(); } -bool PropertyMap::tryGetProperty(const std::string& key, std::string& outValue) const { +std::optional<std::string> PropertyMap::getString(const std::string& key) const { auto it = mProperties.find(key); - if (it == mProperties.end()) { - return false; - } - - outValue = it->second; - return true; + return it != mProperties.end() ? std::make_optional(it->second) : std::nullopt; } -bool PropertyMap::tryGetProperty(const std::string& key, bool& outValue) const { - int32_t intValue; - if (!tryGetProperty(key, intValue)) { - return false; - } - - outValue = intValue; - return true; +std::optional<bool> PropertyMap::getBool(const std::string& key) const { + std::optional<int32_t> intValue = getInt(key); + return intValue.has_value() ? std::make_optional(*intValue != 0) : std::nullopt; } -bool PropertyMap::tryGetProperty(const std::string& key, int32_t& outValue) const { - std::string stringValue; - if (!tryGetProperty(key, stringValue) || stringValue.length() == 0) { - return false; +std::optional<int32_t> PropertyMap::getInt(const std::string& key) const { + std::optional<std::string> stringValue = getString(key); + if (!stringValue.has_value() || stringValue->length() == 0) { + return std::nullopt; } char* end; - int32_t value = static_cast<int32_t>(strtol(stringValue.c_str(), &end, 10)); + int32_t value = static_cast<int32_t>(strtol(stringValue->c_str(), &end, 10)); if (*end != '\0') { ALOGW("Property key '%s' has invalid value '%s'. Expected an integer.", key.c_str(), - stringValue.c_str()); - return false; + stringValue->c_str()); + return std::nullopt; } - outValue = value; - return true; + return value; } -bool PropertyMap::tryGetProperty(const std::string& key, float& outValue) const { - std::string stringValue; - if (!tryGetProperty(key, stringValue) || stringValue.length() == 0) { - return false; +std::optional<float> PropertyMap::getFloat(const std::string& key) const { + std::optional<std::string> stringValue = getString(key); + if (!stringValue.has_value() || stringValue->length() == 0) { + return std::nullopt; } char* end; - float value = strtof(stringValue.c_str(), &end); + float value = strtof(stringValue->c_str(), &end); if (*end != '\0') { ALOGW("Property key '%s' has invalid value '%s'. Expected a float.", key.c_str(), - stringValue.c_str()); - return false; + stringValue->c_str()); + return std::nullopt; } - outValue = value; - return true; + return value; } -bool PropertyMap::tryGetProperty(const std::string& key, double& outValue) const { - std::string stringValue; - if (!tryGetProperty(key, stringValue) || stringValue.length() == 0) { - return false; +std::optional<double> PropertyMap::getDouble(const std::string& key) const { + std::optional<std::string> stringValue = getString(key); + if (!stringValue.has_value() || stringValue->length() == 0) { + return std::nullopt; } char* end; - double value = strtod(stringValue.c_str(), &end); + double value = strtod(stringValue->c_str(), &end); if (*end != '\0') { ALOGW("Property key '%s' has invalid value '%s'. Expected a double.", key.c_str(), - stringValue.c_str()); - return false; + stringValue->c_str()); + return std::nullopt; } - outValue = value; - return true; + return value; } void PropertyMap::addAll(const PropertyMap* map) { diff --git a/libs/input/PropertyMap_fuzz.cpp b/libs/input/PropertyMap_fuzz.cpp index d985dc1748..6299ca8ef9 100755..100644 --- a/libs/input/PropertyMap_fuzz.cpp +++ b/libs/input/PropertyMap_fuzz.cpp @@ -29,8 +29,7 @@ static const std::vector<std::function<void(FuzzedDataProvider*, android::Proper }, [](FuzzedDataProvider* dataProvider, android::PropertyMap& propertyMap) -> void { std::string key = dataProvider->ConsumeRandomLengthString(MAX_STR_LEN); - std::string out; - propertyMap.tryGetProperty(key, out); + propertyMap.getString(key); }, [](FuzzedDataProvider* dataProvider, android::PropertyMap& /*unused*/) -> void { TemporaryFile tf; diff --git a/services/inputflinger/host/InputDriver.cpp b/services/inputflinger/host/InputDriver.cpp index 97d57e4bd0..ec0388d500 100644 --- a/services/inputflinger/host/InputDriver.cpp +++ b/services/inputflinger/host/InputDriver.cpp @@ -242,13 +242,13 @@ input_property_map_t* InputDriver::inputGetDevicePropertyMap(input_device_identi input_property_t* InputDriver::inputGetDeviceProperty(input_property_map_t* map, const char* key) { if (map != nullptr) { - std::string value; - auto prop = std::make_unique<input_property_t>(); - if (!map->propertyMap->tryGetProperty(key, value)) { + std::optional<std::string> value = map->propertyMap->getString(key); + if (!value.has_value()) { return nullptr; } + auto prop = std::make_unique<input_property_t>(); prop->key = key; - prop->value = value.c_str(); + prop->value = value->c_str(); return prop.release(); } return nullptr; diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp index 3d3a8ea42d..e65f3af107 100644 --- a/services/inputflinger/reader/EventHub.cpp +++ b/services/inputflinger/reader/EventHub.cpp @@ -52,6 +52,7 @@ #include <utils/Timers.h> #include <filesystem> +#include <optional> #include <regex> #include <utility> @@ -673,9 +674,9 @@ status_t EventHub::Device::loadKeyMapLocked() { bool EventHub::Device::isExternalDeviceLocked() { if (configuration) { - bool value; - if (configuration->tryGetProperty("device.internal", value)) { - return !value; + std::optional<bool> isInternal = configuration->getBool("device.internal"); + if (isInternal.has_value()) { + return !isInternal.value(); } } return identifier.bus == BUS_USB || identifier.bus == BUS_BLUETOOTH; @@ -683,9 +684,9 @@ bool EventHub::Device::isExternalDeviceLocked() { bool EventHub::Device::deviceHasMicLocked() { if (configuration) { - bool value; - if (configuration->tryGetProperty("audio.mic", value)) { - return value; + std::optional<bool> hasMic = configuration->getBool("audio.mic"); + if (hasMic.has_value()) { + return hasMic.value(); } } return false; @@ -2281,8 +2282,8 @@ void EventHub::openDeviceLocked(const std::string& devicePath) { } // See if the device is specially configured to be of a certain type. - std::string deviceType; - if (device->configuration && device->configuration->tryGetProperty("device.type", deviceType)) { + if (device->configuration) { + std::string deviceType = device->configuration->getString("device.type").value_or(""); if (deviceType == "rotaryEncoder") { device->classes |= InputDeviceClass::ROTARY_ENCODER; } else if (deviceType == "externalStylus") { diff --git a/services/inputflinger/reader/mapper/CursorInputMapper.cpp b/services/inputflinger/reader/mapper/CursorInputMapper.cpp index 13e4d0cfbe..6b9bf52e24 100644 --- a/services/inputflinger/reader/mapper/CursorInputMapper.cpp +++ b/services/inputflinger/reader/mapper/CursorInputMapper.cpp @@ -20,6 +20,8 @@ #include "CursorInputMapper.h" +#include <optional> + #include "CursorButtonAccumulator.h" #include "CursorScrollAccumulator.h" #include "PointerControllerInterface.h" @@ -250,18 +252,17 @@ std::list<NotifyArgs> CursorInputMapper::configure(nsecs_t when, void CursorInputMapper::configureParameters() { mParameters.mode = Parameters::Mode::POINTER; - std::string cursorModeString; - if (getDeviceContext().getConfiguration().tryGetProperty("cursor.mode", cursorModeString)) { - if (cursorModeString == "navigation") { + const PropertyMap& config = getDeviceContext().getConfiguration(); + std::optional<std::string> cursorModeString = config.getString("cursor.mode"); + if (cursorModeString.has_value()) { + if (*cursorModeString == "navigation") { mParameters.mode = Parameters::Mode::NAVIGATION; - } else if (cursorModeString != "pointer" && cursorModeString != "default") { - ALOGW("Invalid value for cursor.mode: '%s'", cursorModeString.c_str()); + } else if (*cursorModeString != "pointer" && *cursorModeString != "default") { + ALOGW("Invalid value for cursor.mode: '%s'", cursorModeString->c_str()); } } - mParameters.orientationAware = false; - getDeviceContext().getConfiguration().tryGetProperty("cursor.orientationAware", - mParameters.orientationAware); + mParameters.orientationAware = config.getBool("cursor.orientationAware").value_or(false); mParameters.hasAssociatedDisplay = false; if (mParameters.mode == Parameters::Mode::POINTER || mParameters.orientationAware) { diff --git a/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp b/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp index dc0454dc04..f39e004882 100644 --- a/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp +++ b/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp @@ -154,15 +154,10 @@ std::list<NotifyArgs> KeyboardInputMapper::configure(nsecs_t when, } void KeyboardInputMapper::configureParameters() { - mParameters.orientationAware = false; const PropertyMap& config = getDeviceContext().getConfiguration(); - config.tryGetProperty("keyboard.orientationAware", mParameters.orientationAware); - - mParameters.handlesKeyRepeat = false; - config.tryGetProperty("keyboard.handlesKeyRepeat", mParameters.handlesKeyRepeat); - - mParameters.doNotWakeByDefault = false; - config.tryGetProperty("keyboard.doNotWakeByDefault", mParameters.doNotWakeByDefault); + mParameters.orientationAware = config.getBool("keyboard.orientationAware").value_or(false); + mParameters.handlesKeyRepeat = config.getBool("keyboard.handlesKeyRepeat").value_or(false); + mParameters.doNotWakeByDefault = config.getBool("keyboard.doNotWakeByDefault").value_or(false); } void KeyboardInputMapper::dumpParameters(std::string& dump) const { diff --git a/services/inputflinger/reader/mapper/RotaryEncoderInputMapper.cpp b/services/inputflinger/reader/mapper/RotaryEncoderInputMapper.cpp index 19a79d7751..2ff26ed98a 100644 --- a/services/inputflinger/reader/mapper/RotaryEncoderInputMapper.cpp +++ b/services/inputflinger/reader/mapper/RotaryEncoderInputMapper.cpp @@ -20,6 +20,8 @@ #include "RotaryEncoderInputMapper.h" +#include <optional> + #include "CursorScrollAccumulator.h" namespace android { @@ -39,18 +41,19 @@ void RotaryEncoderInputMapper::populateDeviceInfo(InputDeviceInfo* info) { InputMapper::populateDeviceInfo(info); if (mRotaryEncoderScrollAccumulator.haveRelativeVWheel()) { - float res = 0.0f; - if (!getDeviceContext().getConfiguration().tryGetProperty("device.res", res)) { + const PropertyMap& config = getDeviceContext().getConfiguration(); + std::optional<float> res = config.getFloat("device.res"); + if (!res.has_value()) { ALOGW("Rotary Encoder device configuration file didn't specify resolution!\n"); } - if (!getDeviceContext().getConfiguration().tryGetProperty("device.scalingFactor", - mScalingFactor)) { + std::optional<float> scalingFactor = config.getFloat("device.scalingFactor"); + if (!scalingFactor.has_value()) { ALOGW("Rotary Encoder device configuration file didn't specify scaling factor," "default to 1.0!\n"); - mScalingFactor = 1.0f; } + mScalingFactor = scalingFactor.value_or(1.0f); info->addMotionRange(AMOTION_EVENT_AXIS_SCROLL, mSource, -1.0f, 1.0f, 0.0f, 0.0f, - res * mScalingFactor); + res.value_or(0.0f) * mScalingFactor); } } diff --git a/services/inputflinger/reader/mapper/SensorInputMapper.cpp b/services/inputflinger/reader/mapper/SensorInputMapper.cpp index 3d60bfdfb8..ba088232bc 100644 --- a/services/inputflinger/reader/mapper/SensorInputMapper.cpp +++ b/services/inputflinger/reader/mapper/SensorInputMapper.cpp @@ -61,12 +61,6 @@ uint32_t SensorInputMapper::getSources() const { return AINPUT_SOURCE_SENSOR; } -template <typename T> -bool SensorInputMapper::tryGetProperty(std::string keyName, T& outValue) { - const auto& config = getDeviceContext().getConfiguration(); - return config.tryGetProperty(keyName, outValue); -} - void SensorInputMapper::parseSensorConfiguration(InputDeviceSensorType sensorType, int32_t absCode, int32_t sensorDataIndex, const Axis& axis) { auto it = mSensors.find(sensorType); @@ -201,6 +195,17 @@ std::list<NotifyArgs> SensorInputMapper::reset(nsecs_t when) { SensorInputMapper::Sensor SensorInputMapper::createSensor(InputDeviceSensorType sensorType, const Axis& axis) { InputDeviceIdentifier identifier = getDeviceContext().getDeviceIdentifier(); + const auto& config = getDeviceContext().getConfiguration(); + + std::string prefix = "sensor." + ftl::enum_string(sensorType); + transform(prefix.begin(), prefix.end(), prefix.begin(), ::tolower); + + int32_t flags = 0; + std::optional<int32_t> reportingMode = config.getInt(prefix + ".reportingMode"); + if (reportingMode.has_value()) { + flags |= (*reportingMode & REPORTING_MODE_MASK) << REPORTING_MODE_SHIFT; + } + // Sensor Id will be assigned to device Id to distinguish same sensor from multiple input // devices, in such a way that the sensor Id will be same as input device Id. // The sensorType is to distinguish different sensors within one device. @@ -209,28 +214,15 @@ SensorInputMapper::Sensor SensorInputMapper::createSensor(InputDeviceSensorType identifier.version, sensorType, InputDeviceSensorAccuracy::ACCURACY_HIGH, /*maxRange=*/axis.max, /*resolution=*/axis.scale, - /*power=*/0.0f, /*minDelay=*/0, - /*fifoReservedEventCount=*/0, /*fifoMaxEventCount=*/0, - ftl::enum_string(sensorType), /*maxDelay=*/0, /*flags=*/0, - getDeviceId()); - - std::string prefix = "sensor." + ftl::enum_string(sensorType); - transform(prefix.begin(), prefix.end(), prefix.begin(), ::tolower); - - int32_t reportingMode = 0; - if (tryGetProperty(prefix + ".reportingMode", reportingMode)) { - sensorInfo.flags |= (reportingMode & REPORTING_MODE_MASK) << REPORTING_MODE_SHIFT; - } - - tryGetProperty(prefix + ".maxDelay", sensorInfo.maxDelay); - - tryGetProperty(prefix + ".minDelay", sensorInfo.minDelay); - - tryGetProperty(prefix + ".power", sensorInfo.power); - - tryGetProperty(prefix + ".fifoReservedEventCount", sensorInfo.fifoReservedEventCount); - - tryGetProperty(prefix + ".fifoMaxEventCount", sensorInfo.fifoMaxEventCount); + /*power=*/config.getFloat(prefix + ".power").value_or(0.0f), + /*minDelay=*/config.getInt(prefix + ".minDelay").value_or(0), + /*fifoReservedEventCount=*/ + config.getInt(prefix + ".fifoReservedEventCount").value_or(0), + /*fifoMaxEventCount=*/ + config.getInt(prefix + ".fifoMaxEventCount").value_or(0), + ftl::enum_string(sensorType), + /*maxDelay=*/config.getInt(prefix + ".maxDelay").value_or(0), + /*flags=*/flags, getDeviceId()); return Sensor(sensorInfo); } diff --git a/services/inputflinger/reader/mapper/SensorInputMapper.h b/services/inputflinger/reader/mapper/SensorInputMapper.h index 457567ba7b..043a8956cb 100644 --- a/services/inputflinger/reader/mapper/SensorInputMapper.h +++ b/services/inputflinger/reader/mapper/SensorInputMapper.h @@ -16,6 +16,9 @@ #pragma once +#include <optional> +#include <string> + #include "InputMapper.h" namespace android { @@ -120,9 +123,6 @@ private: [[nodiscard]] std::list<NotifyArgs> sync(nsecs_t when, bool force); - template <typename T> - bool tryGetProperty(std::string keyName, T& outValue); - void parseSensorConfiguration(InputDeviceSensorType sensorType, int32_t absCode, int32_t sensorDataIndex, const Axis& axis); diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index 96c163dc3c..ac7bb89d06 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -366,15 +366,15 @@ void TouchInputMapper::configureParameters() { ? Parameters::GestureMode::SINGLE_TOUCH : Parameters::GestureMode::MULTI_TOUCH; - std::string gestureModeString; - if (getDeviceContext().getConfiguration().tryGetProperty("touch.gestureMode", - gestureModeString)) { - if (gestureModeString == "single-touch") { + const PropertyMap& config = getDeviceContext().getConfiguration(); + std::optional<std::string> gestureModeString = config.getString("touch.gestureMode"); + if (gestureModeString.has_value()) { + if (*gestureModeString == "single-touch") { mParameters.gestureMode = Parameters::GestureMode::SINGLE_TOUCH; - } else if (gestureModeString == "multi-touch") { + } else if (*gestureModeString == "multi-touch") { mParameters.gestureMode = Parameters::GestureMode::MULTI_TOUCH; - } else if (gestureModeString != "default") { - ALOGW("Invalid value for touch.gestureMode: '%s'", gestureModeString.c_str()); + } else if (*gestureModeString != "default") { + ALOGW("Invalid value for touch.gestureMode: '%s'", gestureModeString->c_str()); } } @@ -382,24 +382,23 @@ void TouchInputMapper::configureParameters() { mParameters.hasButtonUnderPad = getDeviceContext().hasInputProperty(INPUT_PROP_BUTTONPAD); - mParameters.orientationAware = mParameters.deviceType == Parameters::DeviceType::TOUCH_SCREEN; - getDeviceContext().getConfiguration().tryGetProperty("touch.orientationAware", - mParameters.orientationAware); + mParameters.orientationAware = + config.getBool("touch.orientationAware") + .value_or(mParameters.deviceType == Parameters::DeviceType::TOUCH_SCREEN); mParameters.orientation = ui::ROTATION_0; - std::string orientationString; - if (getDeviceContext().getConfiguration().tryGetProperty("touch.orientation", - orientationString)) { + std::optional<std::string> orientationString = config.getString("touch.orientation"); + if (orientationString.has_value()) { if (mParameters.deviceType != Parameters::DeviceType::TOUCH_SCREEN) { ALOGW("The configuration 'touch.orientation' is only supported for touchscreens."); - } else if (orientationString == "ORIENTATION_90") { + } else if (*orientationString == "ORIENTATION_90") { mParameters.orientation = ui::ROTATION_90; - } else if (orientationString == "ORIENTATION_180") { + } else if (*orientationString == "ORIENTATION_180") { mParameters.orientation = ui::ROTATION_180; - } else if (orientationString == "ORIENTATION_270") { + } else if (*orientationString == "ORIENTATION_270") { mParameters.orientation = ui::ROTATION_270; - } else if (orientationString != "ORIENTATION_0") { - ALOGW("Invalid value for touch.orientation: '%s'", orientationString.c_str()); + } else if (*orientationString != "ORIENTATION_0") { + ALOGW("Invalid value for touch.orientation: '%s'", orientationString->c_str()); } } @@ -413,10 +412,7 @@ void TouchInputMapper::configureParameters() { mParameters.hasAssociatedDisplay = true; if (mParameters.deviceType == Parameters::DeviceType::TOUCH_SCREEN) { mParameters.associatedDisplayIsExternal = getDeviceContext().isExternal(); - std::string uniqueDisplayId; - getDeviceContext().getConfiguration().tryGetProperty("touch.displayId", - uniqueDisplayId); - mParameters.uniqueDisplayId = uniqueDisplayId.c_str(); + mParameters.uniqueDisplayId = config.getString("touch.displayId").value_or("").c_str(); } } if (getDeviceContext().getAssociatedDisplayPort()) { @@ -426,20 +422,19 @@ void TouchInputMapper::configureParameters() { // Initial downs on external touch devices should wake the device. // Normally we don't do this for internal touch screens to prevent them from waking // up in your pocket but you can enable it using the input device configuration. - mParameters.wake = getDeviceContext().isExternal(); - getDeviceContext().getConfiguration().tryGetProperty("touch.wake", mParameters.wake); - - InputDeviceUsiVersion usiVersion; - if (getDeviceContext().getConfiguration().tryGetProperty("touch.usiVersionMajor", - usiVersion.majorVersion) && - getDeviceContext().getConfiguration().tryGetProperty("touch.usiVersionMinor", - usiVersion.minorVersion)) { - mParameters.usiVersion = usiVersion; + mParameters.wake = config.getBool("touch.wake").value_or(getDeviceContext().isExternal()); + + std::optional<int32_t> usiVersionMajor = config.getInt("touch.usiVersionMajor"); + std::optional<int32_t> usiVersionMinor = config.getInt("touch.usiVersionMinor"); + if (usiVersionMajor.has_value() && usiVersionMinor.has_value()) { + mParameters.usiVersion = { + .majorVersion = *usiVersionMajor, + .minorVersion = *usiVersionMinor, + }; } - mParameters.enableForInactiveViewport = false; - getDeviceContext().getConfiguration().tryGetProperty("touch.enableForInactiveViewport", - mParameters.enableForInactiveViewport); + mParameters.enableForInactiveViewport = + config.getBool("touch.enableForInactiveViewport").value_or(false); } void TouchInputMapper::configureDeviceType() { @@ -457,7 +452,8 @@ void TouchInputMapper::configureDeviceType() { // Type association takes precedence over the device type found in the idc file. std::string deviceTypeString = getDeviceContext().getDeviceTypeAssociation().value_or(""); if (deviceTypeString.empty()) { - getDeviceContext().getConfiguration().tryGetProperty("touch.deviceType", deviceTypeString); + deviceTypeString = + getDeviceContext().getConfiguration().getString("touch.deviceType").value_or(""); } if (deviceTypeString == "touchScreen") { mParameters.deviceType = Parameters::DeviceType::TOUCH_SCREEN; @@ -1160,92 +1156,79 @@ void TouchInputMapper::parseCalibration() { // Size out.sizeCalibration = Calibration::SizeCalibration::DEFAULT; - std::string sizeCalibrationString; - if (in.tryGetProperty("touch.size.calibration", sizeCalibrationString)) { - if (sizeCalibrationString == "none") { + std::optional<std::string> sizeCalibrationString = in.getString("touch.size.calibration"); + if (sizeCalibrationString.has_value()) { + if (*sizeCalibrationString == "none") { out.sizeCalibration = Calibration::SizeCalibration::NONE; - } else if (sizeCalibrationString == "geometric") { + } else if (*sizeCalibrationString == "geometric") { out.sizeCalibration = Calibration::SizeCalibration::GEOMETRIC; - } else if (sizeCalibrationString == "diameter") { + } else if (*sizeCalibrationString == "diameter") { out.sizeCalibration = Calibration::SizeCalibration::DIAMETER; - } else if (sizeCalibrationString == "box") { + } else if (*sizeCalibrationString == "box") { out.sizeCalibration = Calibration::SizeCalibration::BOX; - } else if (sizeCalibrationString == "area") { + } else if (*sizeCalibrationString == "area") { out.sizeCalibration = Calibration::SizeCalibration::AREA; - } else if (sizeCalibrationString != "default") { - ALOGW("Invalid value for touch.size.calibration: '%s'", sizeCalibrationString.c_str()); + } else if (*sizeCalibrationString != "default") { + ALOGW("Invalid value for touch.size.calibration: '%s'", sizeCalibrationString->c_str()); } } - float sizeScale; - - if (in.tryGetProperty("touch.size.scale", sizeScale)) { - out.sizeScale = sizeScale; - } - float sizeBias; - if (in.tryGetProperty("touch.size.bias", sizeBias)) { - out.sizeBias = sizeBias; - } - bool sizeIsSummed; - if (in.tryGetProperty("touch.size.isSummed", sizeIsSummed)) { - out.sizeIsSummed = sizeIsSummed; - } + out.sizeScale = in.getFloat("touch.size.scale"); + out.sizeBias = in.getFloat("touch.size.bias"); + out.sizeIsSummed = in.getBool("touch.size.isSummed"); // Pressure out.pressureCalibration = Calibration::PressureCalibration::DEFAULT; - std::string pressureCalibrationString; - if (in.tryGetProperty("touch.pressure.calibration", pressureCalibrationString)) { - if (pressureCalibrationString == "none") { + std::optional<std::string> pressureCalibrationString = + in.getString("touch.pressure.calibration"); + if (pressureCalibrationString.has_value()) { + if (*pressureCalibrationString == "none") { out.pressureCalibration = Calibration::PressureCalibration::NONE; - } else if (pressureCalibrationString == "physical") { + } else if (*pressureCalibrationString == "physical") { out.pressureCalibration = Calibration::PressureCalibration::PHYSICAL; - } else if (pressureCalibrationString == "amplitude") { + } else if (*pressureCalibrationString == "amplitude") { out.pressureCalibration = Calibration::PressureCalibration::AMPLITUDE; - } else if (pressureCalibrationString != "default") { + } else if (*pressureCalibrationString != "default") { ALOGW("Invalid value for touch.pressure.calibration: '%s'", - pressureCalibrationString.c_str()); + pressureCalibrationString->c_str()); } } - float pressureScale; - if (in.tryGetProperty("touch.pressure.scale", pressureScale)) { - out.pressureScale = pressureScale; - } + out.pressureScale = in.getFloat("touch.pressure.scale"); // Orientation out.orientationCalibration = Calibration::OrientationCalibration::DEFAULT; - std::string orientationCalibrationString; - if (in.tryGetProperty("touch.orientation.calibration", orientationCalibrationString)) { - if (orientationCalibrationString == "none") { + std::optional<std::string> orientationCalibrationString = + in.getString("touch.orientation.calibration"); + if (orientationCalibrationString.has_value()) { + if (*orientationCalibrationString == "none") { out.orientationCalibration = Calibration::OrientationCalibration::NONE; - } else if (orientationCalibrationString == "interpolated") { + } else if (*orientationCalibrationString == "interpolated") { out.orientationCalibration = Calibration::OrientationCalibration::INTERPOLATED; - } else if (orientationCalibrationString == "vector") { + } else if (*orientationCalibrationString == "vector") { out.orientationCalibration = Calibration::OrientationCalibration::VECTOR; - } else if (orientationCalibrationString != "default") { + } else if (*orientationCalibrationString != "default") { ALOGW("Invalid value for touch.orientation.calibration: '%s'", - orientationCalibrationString.c_str()); + orientationCalibrationString->c_str()); } } // Distance out.distanceCalibration = Calibration::DistanceCalibration::DEFAULT; - std::string distanceCalibrationString; - if (in.tryGetProperty("touch.distance.calibration", distanceCalibrationString)) { - if (distanceCalibrationString == "none") { + std::optional<std::string> distanceCalibrationString = + in.getString("touch.distance.calibration"); + if (distanceCalibrationString.has_value()) { + if (*distanceCalibrationString == "none") { out.distanceCalibration = Calibration::DistanceCalibration::NONE; - } else if (distanceCalibrationString == "scaled") { + } else if (*distanceCalibrationString == "scaled") { out.distanceCalibration = Calibration::DistanceCalibration::SCALED; - } else if (distanceCalibrationString != "default") { + } else if (*distanceCalibrationString != "default") { ALOGW("Invalid value for touch.distance.calibration: '%s'", - distanceCalibrationString.c_str()); + distanceCalibrationString->c_str()); } } - float distanceScale; - if (in.tryGetProperty("touch.distance.scale", distanceScale)) { - out.distanceScale = distanceScale; - } + out.distanceScale = in.getFloat("touch.distance.scale"); } void TouchInputMapper::resolveCalibration() { diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.h b/services/inputflinger/reader/mapper/TouchInputMapper.h index 7b464efccb..df66846f9d 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.h +++ b/services/inputflinger/reader/mapper/TouchInputMapper.h @@ -16,6 +16,9 @@ #pragma once +#include <optional> +#include <string> + #include <stdint.h> #include <ui/Rotation.h> diff --git a/services/inputflinger/reader/mapper/gestures/PropertyProvider.cpp b/services/inputflinger/reader/mapper/gestures/PropertyProvider.cpp index 3d883389c9..be2bfed691 100644 --- a/services/inputflinger/reader/mapper/gestures/PropertyProvider.cpp +++ b/services/inputflinger/reader/mapper/gestures/PropertyProvider.cpp @@ -19,6 +19,7 @@ #include "gestures/PropertyProvider.h" #include <algorithm> +#include <optional> #include <utility> #include <android-base/stringprintf.h> @@ -255,36 +256,34 @@ void GesturesProp::trySetFromIdcProperty(const android::PropertyMap& idcProperti bool parsedSuccessfully = false; Visitor setVisitor{ [&](int*) { - int32_t value; - parsedSuccessfully = idcProperties.tryGetProperty(propertyName, value); - if (parsedSuccessfully) { - setIntValues({value}); + if (std::optional<int32_t> value = idcProperties.getInt(propertyName); value) { + parsedSuccessfully = true; + setIntValues({*value}); } }, [&](GesturesPropBool*) { - bool value; - parsedSuccessfully = idcProperties.tryGetProperty(propertyName, value); - if (parsedSuccessfully) { - setBoolValues({value}); + if (std::optional<bool> value = idcProperties.getBool(propertyName); value) { + parsedSuccessfully = true; + setBoolValues({*value}); } }, [&](double*) { - double value; - parsedSuccessfully = idcProperties.tryGetProperty(propertyName, value); - if (parsedSuccessfully) { - setRealValues({value}); + if (std::optional<double> value = idcProperties.getDouble(propertyName); value) { + parsedSuccessfully = true; + setRealValues({*value}); } }, [&](const char**) { ALOGE("Gesture property \"%s\" is a string, and so cannot be set in an IDC file.", mName.c_str()); + // We've already reported the type mismatch, so set parsedSuccessfully. + parsedSuccessfully = true; }, }; std::visit(setVisitor, mDataPointer); - ALOGE_IF(!parsedSuccessfully, "Gesture property \"%s\" could set due to a type mismatch.", + ALOGE_IF(!parsedSuccessfully, "Gesture property \"%s\" couldn't be set due to a type mismatch.", mName.c_str()); - return; } template <typename T, typename U> diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index eb58d0bd95..cdd24399ec 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -16,6 +16,7 @@ #include <cinttypes> #include <memory> +#include <optional> #include <CursorInputMapper.h> #include <InputDevice.h> @@ -2355,10 +2356,10 @@ TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRe InputReaderConfiguration config; std::list<NotifyArgs> unused = mDevice->configure(ARBITRARY_TIME, &config, 0); - std::string propertyValue; - ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty("key", propertyValue)) + std::optional<std::string> propertyValue = mDevice->getConfiguration().getString("key"); + ASSERT_TRUE(propertyValue.has_value()) << "Device should have read configuration during configuration phase."; - ASSERT_EQ("value", propertyValue); + ASSERT_EQ("value", *propertyValue); ASSERT_NO_FATAL_FAILURE(mapper1.assertConfigureWasCalled()); ASSERT_NO_FATAL_FAILURE(mapper2.assertConfigureWasCalled()); |