Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e948d4b1 authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Add callbacks and policy to listen to sticky modifier state

DD: go/pk_accessibility
Test: None
Bug: 294546335
Change-Id: I7596fb61d8b8c1b29f51550f94bc0e6302feae67
parent ddf9ac85
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -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);
        }
    }
}

+4 −1
Original line number Diff line number Diff line
@@ -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
+4 −2
Original line number Diff line number Diff line
@@ -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();
+4 −1
Original line number Diff line number Diff line
@@ -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;
+4 −2
Original line number Diff line number Diff line
@@ -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));
    }
Loading