Bounce keys doesnt work for already connected keyboards
Test: manual
Bug: 294546335
Change-Id: Ie9db44d9203763c3743c63d5e27be98d45127faf
diff --git a/services/inputflinger/InputFilter.cpp b/services/inputflinger/InputFilter.cpp
index 5d87d34..43ebc69 100644
--- a/services/inputflinger/InputFilter.cpp
+++ b/services/inputflinger/InputFilter.cpp
@@ -52,15 +52,15 @@
}
void InputFilter::notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs& args) {
+ mDeviceInfos.clear();
+ mDeviceInfos.reserve(args.inputDeviceInfos.size());
+ for (auto info : args.inputDeviceInfos) {
+ AidlDeviceInfo& aidlInfo = mDeviceInfos.emplace_back();
+ aidlInfo.deviceId = info.getId();
+ aidlInfo.external = info.isExternal();
+ }
if (isFilterEnabled()) {
- std::vector<AidlDeviceInfo> deviceInfos;
- for (auto info : args.inputDeviceInfos) {
- AidlDeviceInfo aidlInfo;
- aidlInfo.deviceId = info.getId();
- aidlInfo.external = info.isExternal();
- deviceInfos.push_back(aidlInfo);
- }
- LOG_ALWAYS_FATAL_IF(!mInputFilterRust->notifyInputDevicesChanged(deviceInfos).isOk());
+ LOG_ALWAYS_FATAL_IF(!mInputFilterRust->notifyInputDevicesChanged(mDeviceInfos).isOk());
}
mNextListener.notify(args);
}
@@ -74,7 +74,7 @@
LOG_ALWAYS_FATAL_IF(!mInputFilterRust->notifyKey(notifyKeyArgsToKeyEvent(args)).isOk());
return;
}
- mNextListener.notifyKey(args);
+ mNextListener.notify(args);
}
void InputFilter::notifyMotion(const NotifyMotionArgs& args) {
@@ -112,7 +112,7 @@
if (mConfig.bounceKeysThresholdNs != threshold) {
mConfig.bounceKeysThresholdNs = threshold;
- LOG_ALWAYS_FATAL_IF(!mInputFilterRust->notifyConfigurationChanged(mConfig).isOk());
+ notifyConfigurationChangedLocked();
}
}
@@ -121,7 +121,14 @@
if (mConfig.stickyKeysEnabled != enabled) {
mConfig.stickyKeysEnabled = enabled;
- LOG_ALWAYS_FATAL_IF(!mInputFilterRust->notifyConfigurationChanged(mConfig).isOk());
+ notifyConfigurationChangedLocked();
+ }
+}
+
+void InputFilter::notifyConfigurationChangedLocked() {
+ LOG_ALWAYS_FATAL_IF(!mInputFilterRust->notifyConfigurationChanged(mConfig).isOk());
+ if (isFilterEnabled()) {
+ LOG_ALWAYS_FATAL_IF(!mInputFilterRust->notifyInputDevicesChanged(mDeviceInfos).isOk());
}
}
diff --git a/services/inputflinger/InputFilter.h b/services/inputflinger/InputFilter.h
index 9fa7a87..a38fbf6 100644
--- a/services/inputflinger/InputFilter.h
+++ b/services/inputflinger/InputFilter.h
@@ -45,6 +45,7 @@
aidl::com::android::server::inputflinger::IInputFilter::IInputFilterCallbacks;
using InputFilterConfiguration =
aidl::com::android::server::inputflinger::InputFilterConfiguration;
+ using AidlDeviceInfo = aidl::com::android::server::inputflinger::DeviceInfo;
explicit InputFilter(InputListenerInterface& listener, IInputFlingerRust&);
~InputFilter() override = default;
@@ -65,10 +66,14 @@
InputListenerInterface& mNextListener;
std::shared_ptr<InputFilterCallbacks> mCallbacks;
std::shared_ptr<IInputFilter> mInputFilterRust;
+ // Keep track of connected peripherals, so that if filters are enabled later, we can pass that
+ // info to the filters
+ std::vector<AidlDeviceInfo> mDeviceInfos;
mutable std::mutex mLock;
InputFilterConfiguration mConfig GUARDED_BY(mLock);
bool isFilterEnabled();
+ void notifyConfigurationChangedLocked() REQUIRES(mLock);
};
} // namespace android