diff options
| author | 2022-10-27 18:03:34 +0000 | |
|---|---|---|
| committer | 2022-10-27 18:03:34 +0000 | |
| commit | b54ffb2a4b2504a39f333b683f83262a70206953 (patch) | |
| tree | 7984e52f5c8a9e31ff05397df9bc124e06f3e6bc | |
| parent | 07525ef5964f8a0a5b4d9949ab5f7fd17f0e2393 (diff) | |
InputReader: Get Bluetooth address from InputDeviceIdentifier
The InputDevice class in Reader stores the InputDeviceIdentifier. When
the policy wants to get the Bluetooth address of an InputDevice, fetch
it from there.
Bug: 243005009
Test: atest inputflinger_tests
Change-Id: I5d881a11cb1bc318258faf1f498db1ca29ae8537
6 files changed, 32 insertions, 0 deletions
diff --git a/services/inputflinger/include/InputReaderBase.h b/services/inputflinger/include/InputReaderBase.h index 8c586b5290..3b0f2ac5a2 100644 --- a/services/inputflinger/include/InputReaderBase.h +++ b/services/inputflinger/include/InputReaderBase.h @@ -142,6 +142,9 @@ public: virtual std::optional<int32_t> getLightColor(int32_t deviceId, int32_t lightId) = 0; /* Get light player ID */ virtual std::optional<int32_t> getLightPlayerId(int32_t deviceId, int32_t lightId) = 0; + + /* Get the Bluetooth address of an input device, if known. */ + virtual std::optional<std::string> getBluetoothAddress(int32_t deviceId) const = 0; }; // --- InputReaderConfiguration --- diff --git a/services/inputflinger/reader/InputReader.cpp b/services/inputflinger/reader/InputReader.cpp index 903d072c96..f8b1b3fa6e 100644 --- a/services/inputflinger/reader/InputReader.cpp +++ b/services/inputflinger/reader/InputReader.cpp @@ -875,6 +875,16 @@ std::optional<int32_t> InputReader::getLightPlayerId(int32_t deviceId, int32_t l return std::nullopt; } +std::optional<std::string> InputReader::getBluetoothAddress(int32_t deviceId) const { + std::scoped_lock _l(mLock); + + InputDevice* device = findInputDeviceLocked(deviceId); + if (device) { + return device->getBluetoothAddress(); + } + return std::nullopt; +} + bool InputReader::isInputDeviceEnabled(int32_t deviceId) { std::scoped_lock _l(mLock); diff --git a/services/inputflinger/reader/include/InputDevice.h b/services/inputflinger/reader/include/InputDevice.h index afb1bed1f2..b9a2b4ce92 100644 --- a/services/inputflinger/reader/include/InputDevice.h +++ b/services/inputflinger/reader/include/InputDevice.h @@ -51,6 +51,9 @@ public: inline int32_t getGeneration() const { return mGeneration; } inline const std::string getName() const { return mIdentifier.name; } inline const std::string getDescriptor() { return mIdentifier.descriptor; } + inline std::optional<std::string> getBluetoothAddress() const { + return mIdentifier.bluetoothAddress; + } inline ftl::Flags<InputDeviceClass> getClasses() const { return mClasses; } inline uint32_t getSources() const { return mSources; } inline bool hasEventHubDevices() const { return !mDevices.empty(); } diff --git a/services/inputflinger/reader/include/InputReader.h b/services/inputflinger/reader/include/InputReader.h index de268cf66c..4f2503ad5c 100644 --- a/services/inputflinger/reader/include/InputReader.h +++ b/services/inputflinger/reader/include/InputReader.h @@ -113,6 +113,8 @@ public: std::optional<int32_t> getLightPlayerId(int32_t deviceId, int32_t lightId) override; + std::optional<std::string> getBluetoothAddress(int32_t deviceId) const override; + protected: // These members are protected so they can be instrumented by test cases. virtual std::shared_ptr<InputDevice> createDeviceLocked(int32_t deviceId, diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index e51379c38f..f333306f26 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -2782,6 +2782,7 @@ protected: static const int32_t DEVICE_CONTROLLER_NUMBER; static const ftl::Flags<InputDeviceClass> DEVICE_CLASSES; static const int32_t EVENTHUB_ID; + static const std::string DEVICE_BLUETOOTH_ADDRESS; std::shared_ptr<FakeEventHub> mFakeEventHub; sp<FakeInputReaderPolicy> mFakePolicy; @@ -2798,6 +2799,7 @@ protected: InputDeviceIdentifier identifier; identifier.name = DEVICE_NAME; identifier.location = DEVICE_LOCATION; + identifier.bluetoothAddress = DEVICE_BLUETOOTH_ADDRESS; mDevice = std::make_shared<InputDevice>(mReader->getContext(), DEVICE_ID, DEVICE_GENERATION, identifier); mReader->pushNextDevice(mDevice); @@ -2819,6 +2821,7 @@ const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0; const ftl::Flags<InputDeviceClass> InputDeviceTest::DEVICE_CLASSES = InputDeviceClass::KEYBOARD | InputDeviceClass::TOUCH | InputDeviceClass::JOYSTICK; const int32_t InputDeviceTest::EVENTHUB_ID = 1; +const std::string InputDeviceTest::DEVICE_BLUETOOTH_ADDRESS = "11:AA:22:BB:33:CC"; TEST_F(InputDeviceTest, ImmutableProperties) { ASSERT_EQ(DEVICE_ID, mDevice->getId()); @@ -3085,6 +3088,12 @@ TEST_F(InputDeviceTest, DumpDoesNotCrash) { device.dump(dumpStr, eventHubDevStr); } +TEST_F(InputDeviceTest, GetBluetoothAddress) { + const auto& address = mReader->getBluetoothAddress(DEVICE_ID); + ASSERT_TRUE(address); + ASSERT_EQ(DEVICE_BLUETOOTH_ADDRESS, *address); +} + // --- InputMapperTest --- class InputMapperTest : public testing::Test { diff --git a/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp b/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp index a9f5a3ac86..2eed9977be 100644 --- a/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp +++ b/services/inputflinger/tests/fuzzers/InputReaderFuzzer.cpp @@ -157,6 +157,10 @@ public: return reader->getKeyCodeForKeyLocation(deviceId, locationKeyCode); } + std::optional<std::string> getBluetoothAddress(int32_t deviceId) const { + return reader->getBluetoothAddress(deviceId); + } + private: std::unique_ptr<InputReaderInterface> reader; }; @@ -273,6 +277,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t* data, size_t size) { std::chrono::microseconds(fdp->ConsumeIntegral<size_t>()), std::chrono::microseconds(fdp->ConsumeIntegral<size_t>())); }, + [&]() -> void { reader->getBluetoothAddress(fdp->ConsumeIntegral<int32_t>()); }, })(); } |