diff options
author | 2023-12-28 13:41:32 +0000 | |
---|---|---|
committer | 2024-01-02 13:22:06 +0000 | |
commit | e948d4b172781acb2a999ae1cd5d64da004aad7a (patch) | |
tree | cf00a2de04ac3fe41e93c5ceac21def781e415a4 | |
parent | ddf9ac85e810bb7f9a049d07251d8b6215471214 (diff) |
Add callbacks and policy to listen to sticky modifier state
DD: go/pk_accessibility
Test: None
Bug: 294546335
Change-Id: I7596fb61d8b8c1b29f51550f94bc0e6302feae67
-rw-r--r-- | services/inputflinger/InputFilter.cpp | 10 | ||||
-rw-r--r-- | services/inputflinger/InputFilter.h | 5 | ||||
-rw-r--r-- | services/inputflinger/InputFilterCallbacks.cpp | 6 | ||||
-rw-r--r-- | services/inputflinger/InputFilterCallbacks.h | 5 | ||||
-rw-r--r-- | services/inputflinger/InputManager.cpp | 6 | ||||
-rw-r--r-- | services/inputflinger/InputManager.h | 4 | ||||
-rw-r--r-- | services/inputflinger/include/InputFilterPolicyInterface.h | 47 |
7 files changed, 74 insertions, 9 deletions
diff --git a/services/inputflinger/InputFilter.cpp b/services/inputflinger/InputFilter.cpp index 43ebc69c46..72c6f1a73b 100644 --- a/services/inputflinger/InputFilter.cpp +++ b/services/inputflinger/InputFilter.cpp @@ -44,9 +44,11 @@ AidlKeyEvent notifyKeyArgsToKeyEvent(const NotifyKeyArgs& args) { return event; } -InputFilter::InputFilter(InputListenerInterface& listener, IInputFlingerRust& rust) +InputFilter::InputFilter(InputListenerInterface& listener, IInputFlingerRust& rust, + InputFilterPolicyInterface& policy) : mNextListener(listener), - mCallbacks(ndk::SharedRefBase::make<InputFilterCallbacks>(listener)) { + mCallbacks(ndk::SharedRefBase::make<InputFilterCallbacks>(listener, policy)), + mPolicy(policy) { LOG_ALWAYS_FATAL_IF(!rust.createInputFilter(mCallbacks, &mInputFilterRust).isOk()); LOG_ALWAYS_FATAL_IF(!mInputFilterRust); } @@ -122,6 +124,10 @@ void InputFilter::setAccessibilityStickyKeysEnabled(bool enabled) { if (mConfig.stickyKeysEnabled != enabled) { mConfig.stickyKeysEnabled = enabled; notifyConfigurationChangedLocked(); + if (!enabled) { + // When Sticky keys is disabled, send callback to clear any saved sticky state. + mPolicy.notifyStickyModifierStateChanged(0, 0); + } } } diff --git a/services/inputflinger/InputFilter.h b/services/inputflinger/InputFilter.h index a38fbf6f61..153d29dd53 100644 --- a/services/inputflinger/InputFilter.h +++ b/services/inputflinger/InputFilter.h @@ -19,6 +19,7 @@ #include <aidl/com/android/server/inputflinger/IInputFlingerRust.h> #include <utils/Mutex.h> #include "InputFilterCallbacks.h" +#include "InputFilterPolicyInterface.h" #include "InputListener.h" #include "NotifyArgs.h" @@ -47,7 +48,8 @@ public: aidl::com::android::server::inputflinger::InputFilterConfiguration; using AidlDeviceInfo = aidl::com::android::server::inputflinger::DeviceInfo; - explicit InputFilter(InputListenerInterface& listener, IInputFlingerRust&); + explicit InputFilter(InputListenerInterface& listener, IInputFlingerRust& rust, + InputFilterPolicyInterface& policy); ~InputFilter() override = default; void notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs& args) override; void notifyConfigurationChanged(const NotifyConfigurationChangedArgs& args) override; @@ -65,6 +67,7 @@ public: private: InputListenerInterface& mNextListener; std::shared_ptr<InputFilterCallbacks> mCallbacks; + InputFilterPolicyInterface& mPolicy; 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 diff --git a/services/inputflinger/InputFilterCallbacks.cpp b/services/inputflinger/InputFilterCallbacks.cpp index 8c8f5e8f71..a8759b7cbd 100644 --- a/services/inputflinger/InputFilterCallbacks.cpp +++ b/services/inputflinger/InputFilterCallbacks.cpp @@ -29,8 +29,9 @@ NotifyKeyArgs keyEventToNotifyKeyArgs(const AidlKeyEvent& event) { event.scanCode, event.metaState, event.downTime); } -InputFilterCallbacks::InputFilterCallbacks(InputListenerInterface& listener) - : mNextListener(listener) {} +InputFilterCallbacks::InputFilterCallbacks(InputListenerInterface& listener, + InputFilterPolicyInterface& policy) + : mNextListener(listener), mPolicy(policy) {} ndk::ScopedAStatus InputFilterCallbacks::sendKeyEvent(const AidlKeyEvent& event) { mNextListener.notifyKey(keyEventToNotifyKeyArgs(event)); @@ -42,6 +43,7 @@ ndk::ScopedAStatus InputFilterCallbacks::onModifierStateChanged(int32_t modifier std::scoped_lock _l(mLock); mStickyModifierState.modifierState = modifierState; mStickyModifierState.lockedModifierState = lockedModifierState; + mPolicy.notifyStickyModifierStateChanged(modifierState, lockedModifierState); ALOGI("Sticky keys modifier state changed: modifierState=%d, lockedModifierState=%d", modifierState, lockedModifierState); return ndk::ScopedAStatus::ok(); diff --git a/services/inputflinger/InputFilterCallbacks.h b/services/inputflinger/InputFilterCallbacks.h index c0a80fb6dc..31c160aeb9 100644 --- a/services/inputflinger/InputFilterCallbacks.h +++ b/services/inputflinger/InputFilterCallbacks.h @@ -20,6 +20,7 @@ #include <android/binder_auto_utils.h> #include <utils/Mutex.h> #include <mutex> +#include "InputFilterPolicyInterface.h" #include "InputListener.h" #include "NotifyArgs.h" @@ -33,7 +34,8 @@ using AidlKeyEvent = aidl::com::android::server::inputflinger::KeyEvent; class InputFilterCallbacks : public IInputFilter::BnInputFilterCallbacks { public: - explicit InputFilterCallbacks(InputListenerInterface& listener); + explicit InputFilterCallbacks(InputListenerInterface& listener, + InputFilterPolicyInterface& policy); ~InputFilterCallbacks() override = default; uint32_t getModifierState(); @@ -41,6 +43,7 @@ public: private: InputListenerInterface& mNextListener; + InputFilterPolicyInterface& mPolicy; mutable std::mutex mLock; struct StickyModifierState { uint32_t modifierState; diff --git a/services/inputflinger/InputManager.cpp b/services/inputflinger/InputManager.cpp index 296f2449ea..4863513eb5 100644 --- a/services/inputflinger/InputManager.cpp +++ b/services/inputflinger/InputManager.cpp @@ -127,7 +127,8 @@ std::shared_ptr<IInputFlingerRust> createInputFlingerRust() { */ InputManager::InputManager(const sp<InputReaderPolicyInterface>& readerPolicy, InputDispatcherPolicyInterface& dispatcherPolicy, - PointerChoreographerPolicyInterface& choreographerPolicy) { + PointerChoreographerPolicyInterface& choreographerPolicy, + InputFilterPolicyInterface& inputFilterPolicy) { mInputFlingerRust = createInputFlingerRust(); mDispatcher = createInputDispatcher(dispatcherPolicy); @@ -135,7 +136,8 @@ InputManager::InputManager(const sp<InputReaderPolicyInterface>& readerPolicy, std::make_unique<TracedInputListener>("InputDispatcher", *mDispatcher)); if (ENABLE_INPUT_FILTER_RUST) { - mInputFilter = std::make_unique<InputFilter>(*mTracingStages.back(), *mInputFlingerRust); + mInputFilter = std::make_unique<InputFilter>(*mTracingStages.back(), *mInputFlingerRust, + inputFilterPolicy); mTracingStages.emplace_back( std::make_unique<TracedInputListener>("InputFilter", *mInputFilter)); } diff --git a/services/inputflinger/InputManager.h b/services/inputflinger/InputManager.h index fa7db379e0..df944ef807 100644 --- a/services/inputflinger/InputManager.h +++ b/services/inputflinger/InputManager.h @@ -29,6 +29,7 @@ #include <InputDispatcherInterface.h> #include <InputDispatcherPolicyInterface.h> +#include <InputFilterPolicyInterface.h> #include <PointerChoreographerPolicyInterface.h> #include <input/Input.h> #include <input/InputTransport.h> @@ -119,7 +120,8 @@ protected: public: InputManager(const sp<InputReaderPolicyInterface>& readerPolicy, InputDispatcherPolicyInterface& dispatcherPolicy, - PointerChoreographerPolicyInterface& choreographerPolicy); + PointerChoreographerPolicyInterface& choreographerPolicy, + InputFilterPolicyInterface& inputFilterPolicy); status_t start() override; status_t stop() override; diff --git a/services/inputflinger/include/InputFilterPolicyInterface.h b/services/inputflinger/include/InputFilterPolicyInterface.h new file mode 100644 index 0000000000..4d39b977d5 --- /dev/null +++ b/services/inputflinger/include/InputFilterPolicyInterface.h @@ -0,0 +1,47 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +namespace android { + +/** + * The InputFilter policy interface. + * + * This is the interface that InputFilter uses to talk to Input Manager and other system components. + */ +class InputFilterPolicyInterface { +public: + virtual ~InputFilterPolicyInterface() = default; + + /** + * A callback to notify about sticky modifier state changes when Sticky keys feature is enabled. + * + * modifierState: Current sticky modifier state which will be sent with all subsequent + * KeyEvents. This only includes modifiers that can be 'Sticky' which includes: Meta, Ctrl, + * Shift, Alt and AltGr. + * + * lockedModifierState: Current locked modifier state representing modifiers that don't get + * cleared after non-modifier key press. This only includes modifiers that can be 'Sticky' which + * includes: Meta, Ctrl, Shift, Alt and AltGr. + * + * For more information {@see sticky_keys_filter.rs} + */ + virtual void notifyStickyModifierStateChanged(uint32_t modifierState, + uint32_t lockedModifierState) = 0; +}; + +} // namespace android |