From c7ef27eeccb801ed6d82b62a1d743f246f66eec9 Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Mon, 3 Feb 2020 19:19:15 -0800 Subject: Let InputReaderContext hold a single PointerController InputMappers obtain the pointer controller directly from the policy, which, when we support multiple pointer controller, makes it natural to have one pointer controller for an input device. Rather than that, we want to build a system that makes it more natural to have one pointer per display. To give more control over the management of pointers, we make it so that InputReaderContext is responsible for managing the pointer controller. Bug: 146385350 Test: atest inputflinger_tests Change-Id: I0b9276ed4a7f55f04f910dd484ecc7f767b8723b --- services/inputflinger/reader/InputDevice.cpp | 4 -- services/inputflinger/reader/InputReader.cpp | 48 ++++++++++++++++++++-- services/inputflinger/reader/include/InputDevice.h | 2 - services/inputflinger/reader/include/InputReader.h | 6 +++ .../reader/include/InputReaderContext.h | 2 + .../reader/mapper/CursorInputMapper.cpp | 32 +-------------- .../inputflinger/reader/mapper/CursorInputMapper.h | 3 -- .../inputflinger/reader/mapper/InputMapper.cpp | 2 - services/inputflinger/reader/mapper/InputMapper.h | 1 - .../reader/mapper/TouchInputMapper.cpp | 17 ++------ .../inputflinger/reader/mapper/TouchInputMapper.h | 1 - services/inputflinger/tests/InputReader_test.cpp | 26 ++++++++++++ 12 files changed, 83 insertions(+), 61 deletions(-) diff --git a/services/inputflinger/reader/InputDevice.cpp b/services/inputflinger/reader/InputDevice.cpp index d0eee64b0c..f2afc818ff 100644 --- a/services/inputflinger/reader/InputDevice.cpp +++ b/services/inputflinger/reader/InputDevice.cpp @@ -449,10 +449,6 @@ void InputDevice::updateMetaState(int32_t keyCode) { for_each_mapper([keyCode](InputMapper& mapper) { mapper.updateMetaState(keyCode); }); } -void InputDevice::fadePointer() { - for_each_mapper([](InputMapper& mapper) { mapper.fadePointer(); }); -} - void InputDevice::bumpGeneration() { mGeneration = mContext->bumpGeneration(); } diff --git a/services/inputflinger/reader/InputReader.cpp b/services/inputflinger/reader/InputReader.cpp index cbfa702015..6ab5902bb7 100644 --- a/services/inputflinger/reader/InputReader.cpp +++ b/services/inputflinger/reader/InputReader.cpp @@ -326,6 +326,10 @@ void InputReader::refreshConfigurationLocked(uint32_t changes) { InputReaderConfiguration::changesToString(changes).c_str()); nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); + if (changes & InputReaderConfiguration::CHANGE_DISPLAY_INFO) { + updatePointerDisplayLocked(); + } + if (changes & InputReaderConfiguration::CHANGE_MUST_REOPEN) { mEventHub->requestReopenDevices(); } else { @@ -387,10 +391,43 @@ bool InputReader::shouldDropVirtualKeyLocked(nsecs_t now, int32_t keyCode, int32 } } +sp InputReader::getPointerControllerLocked(int32_t deviceId) { + sp controller = mPointerController.promote(); + if (controller == nullptr) { + controller = mPolicy->obtainPointerController(deviceId); + mPointerController = controller; + updatePointerDisplayLocked(); + } + return controller; +} + +void InputReader::updatePointerDisplayLocked() { + sp controller = mPointerController.promote(); + if (controller == nullptr) { + return; + } + + std::optional viewport = + mConfig.getDisplayViewportById(mConfig.defaultPointerDisplayId); + if (!viewport) { + ALOGW("Can't find the designated viewport with ID %" PRId32 " to update cursor input " + "mapper. Fall back to default display", + mConfig.defaultPointerDisplayId); + viewport = mConfig.getDisplayViewportById(ADISPLAY_ID_DEFAULT); + } + if (!viewport) { + ALOGE("Still can't find a viable viewport to update cursor input mapper. Skip setting it to" + " PointerController."); + return; + } + + controller->setDisplayViewport(*viewport); +} + void InputReader::fadePointerLocked() { - for (auto& devicePair : mDevices) { - std::shared_ptr& device = devicePair.second; - device->fadePointer(); + sp controller = mPointerController.promote(); + if (controller != nullptr) { + controller->fade(PointerControllerInterface::TRANSITION_GRADUAL); } } @@ -688,6 +725,11 @@ void InputReader::ContextImpl::fadePointer() { mReader->fadePointerLocked(); } +sp InputReader::ContextImpl::getPointerController(int32_t deviceId) { + // lock is already held by the input loop + return mReader->getPointerControllerLocked(deviceId); +} + void InputReader::ContextImpl::requestTimeoutAtTime(nsecs_t when) { // lock is already held by the input loop mReader->requestTimeoutAtTimeLocked(when); diff --git a/services/inputflinger/reader/include/InputDevice.h b/services/inputflinger/reader/include/InputDevice.h index aaa0d268b3..71313fc86f 100644 --- a/services/inputflinger/reader/include/InputDevice.h +++ b/services/inputflinger/reader/include/InputDevice.h @@ -88,8 +88,6 @@ public: int32_t getMetaState(); void updateMetaState(int32_t keyCode); - void fadePointer(); - void bumpGeneration(); void notifyReset(nsecs_t when); diff --git a/services/inputflinger/reader/include/InputReader.h b/services/inputflinger/reader/include/InputReader.h index 31d82f1abe..ca1a081e48 100644 --- a/services/inputflinger/reader/include/InputReader.h +++ b/services/inputflinger/reader/include/InputReader.h @@ -23,6 +23,7 @@ #include "InputReaderContext.h" #include "InputThread.h" +#include #include #include @@ -102,6 +103,7 @@ protected: virtual void disableVirtualKeysUntil(nsecs_t time) override; virtual bool shouldDropVirtualKey(nsecs_t now, int32_t keyCode, int32_t scanCode) override; virtual void fadePointer() override; + virtual sp getPointerController(int32_t deviceId) override; virtual void requestTimeoutAtTime(nsecs_t when) override; virtual int32_t bumpGeneration() override; virtual void getExternalStylusDevices(std::vector& outDevices) override; @@ -159,6 +161,10 @@ private: void getExternalStylusDevicesLocked(std::vector& outDevices); void dispatchExternalStylusState(const StylusState& state); + // The PointerController that is shared among all the input devices that need it. + wp mPointerController; + sp getPointerControllerLocked(int32_t deviceId); + void updatePointerDisplayLocked(); void fadePointerLocked(); int32_t mGeneration; diff --git a/services/inputflinger/reader/include/InputReaderContext.h b/services/inputflinger/reader/include/InputReaderContext.h index e14fbbec3d..d5527cf926 100644 --- a/services/inputflinger/reader/include/InputReaderContext.h +++ b/services/inputflinger/reader/include/InputReaderContext.h @@ -28,6 +28,7 @@ class InputDevice; class InputListenerInterface; class InputMapper; class InputReaderPolicyInterface; +class PointerControllerInterface; struct StylusState; /* Internal interface used by individual input devices to access global input device state @@ -45,6 +46,7 @@ public: virtual bool shouldDropVirtualKey(nsecs_t now, int32_t keyCode, int32_t scanCode) = 0; virtual void fadePointer() = 0; + virtual sp getPointerController(int32_t deviceId) = 0; virtual void requestTimeoutAtTime(nsecs_t when) = 0; virtual int32_t bumpGeneration() = 0; diff --git a/services/inputflinger/reader/mapper/CursorInputMapper.cpp b/services/inputflinger/reader/mapper/CursorInputMapper.cpp index 78f33823d0..c74987dfec 100644 --- a/services/inputflinger/reader/mapper/CursorInputMapper.cpp +++ b/services/inputflinger/reader/mapper/CursorInputMapper.cpp @@ -132,7 +132,7 @@ void CursorInputMapper::configure(nsecs_t when, const InputReaderConfiguration* mYPrecision = 1.0f; mXScale = 1.0f; mYScale = 1.0f; - mPointerController = getPolicy()->obtainPointerController(getDeviceId()); + mPointerController = getContext()->getPointerController(getDeviceId()); break; case Parameters::MODE_NAVIGATION: mSource = AINPUT_SOURCE_TRACKBALL; @@ -189,34 +189,10 @@ void CursorInputMapper::configure(nsecs_t when, const InputReaderConfiguration* } } - // Update the PointerController if viewports changed. - if (mParameters.mode == Parameters::MODE_POINTER) { - updatePointerControllerDisplayViewport(*config); - } bumpGeneration(); } } -void CursorInputMapper::updatePointerControllerDisplayViewport( - const InputReaderConfiguration& config) { - std::optional viewport = - config.getDisplayViewportById(config.defaultPointerDisplayId); - if (!viewport) { - ALOGW("Can't find the designated viewport with ID %" PRId32 " to update cursor input " - "mapper. Fall back to default display", - config.defaultPointerDisplayId); - viewport = config.getDisplayViewportById(ADISPLAY_ID_DEFAULT); - } - - if (!viewport) { - ALOGE("Still can't find a viable viewport to update cursor input mapper. Skip setting it to" - " PointerController."); - return; - } - - mPointerController->setDisplayViewport(*viewport); -} - void CursorInputMapper::configureParameters() { mParameters.mode = Parameters::MODE_POINTER; String8 cursorModeString; @@ -481,12 +457,6 @@ int32_t CursorInputMapper::getScanCodeState(uint32_t sourceMask, int32_t scanCod } } -void CursorInputMapper::fadePointer() { - if (mPointerController != nullptr) { - mPointerController->fade(PointerControllerInterface::TRANSITION_GRADUAL); - } -} - std::optional CursorInputMapper::getAssociatedDisplayId() { if (mParameters.hasAssociatedDisplay) { if (mParameters.mode == Parameters::MODE_POINTER) { diff --git a/services/inputflinger/reader/mapper/CursorInputMapper.h b/services/inputflinger/reader/mapper/CursorInputMapper.h index 94ab30674d..f65ac3934a 100644 --- a/services/inputflinger/reader/mapper/CursorInputMapper.h +++ b/services/inputflinger/reader/mapper/CursorInputMapper.h @@ -66,8 +66,6 @@ public: virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) override; - virtual void fadePointer() override; - virtual std::optional getAssociatedDisplayId() override; private: @@ -117,7 +115,6 @@ private: void dumpParameters(std::string& dump); void sync(nsecs_t when); - void updatePointerControllerDisplayViewport(const InputReaderConfiguration& config); }; } // namespace android diff --git a/services/inputflinger/reader/mapper/InputMapper.cpp b/services/inputflinger/reader/mapper/InputMapper.cpp index 92af6123cc..a5b98967e7 100644 --- a/services/inputflinger/reader/mapper/InputMapper.cpp +++ b/services/inputflinger/reader/mapper/InputMapper.cpp @@ -71,8 +71,6 @@ void InputMapper::updateMetaState(int32_t keyCode) {} void InputMapper::updateExternalStylusState(const StylusState& state) {} -void InputMapper::fadePointer() {} - status_t InputMapper::getAbsoluteAxisInfo(int32_t axis, RawAbsoluteAxisInfo* axisInfo) { return getDeviceContext().getAbsoluteAxisInfo(axis, axisInfo); } diff --git a/services/inputflinger/reader/mapper/InputMapper.h b/services/inputflinger/reader/mapper/InputMapper.h index 09888bfe20..949c7ea34e 100644 --- a/services/inputflinger/reader/mapper/InputMapper.h +++ b/services/inputflinger/reader/mapper/InputMapper.h @@ -71,7 +71,6 @@ public: virtual void updateExternalStylusState(const StylusState& state); - virtual void fadePointer(); virtual std::optional getAssociatedDisplayId() { return std::nullopt; } protected: diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index e832804e16..9cbbf0c376 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -756,16 +756,11 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) { mOrientedRanges.clear(); } - // Create or update pointer controller if needed. + // Create pointer controller if needed. if (mDeviceMode == DEVICE_MODE_POINTER || (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) { - if (mPointerController == nullptr || viewportChanged) { - mPointerController = getPolicy()->obtainPointerController(getDeviceId()); - // Set the DisplayViewport for the PointerController to the default pointer display - // that is recommended by the configuration before using it. - std::optional defaultViewport = - mConfig.getDisplayViewportById(mConfig.defaultPointerDisplayId); - mPointerController->setDisplayViewport(defaultViewport.value_or(mViewport)); + if (mPointerController == nullptr) { + mPointerController = getContext()->getPointerController(getDeviceId()); } } else { mPointerController.clear(); @@ -3624,12 +3619,6 @@ bool TouchInputMapper::updateMovedPointers(const PointerProperties* inProperties return changed; } -void TouchInputMapper::fadePointer() { - if (mPointerController != nullptr) { - mPointerController->fade(PointerControllerInterface::TRANSITION_GRADUAL); - } -} - void TouchInputMapper::cancelTouch(nsecs_t when) { abortPointerUsage(when, 0 /*policyFlags*/); abortTouches(when, 0 /* policyFlags*/); diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.h b/services/inputflinger/reader/mapper/TouchInputMapper.h index 3a61206481..e21a33abed 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.h +++ b/services/inputflinger/reader/mapper/TouchInputMapper.h @@ -148,7 +148,6 @@ public: virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) override; - virtual void fadePointer() override; virtual void cancelTouch(nsecs_t when) override; virtual void timeoutExpired(nsecs_t when) override; virtual void updateExternalStylusState(const StylusState& state) override; diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index 578605fa40..752213a499 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -830,6 +830,7 @@ class FakeInputReaderContext : public InputReaderContext { bool mUpdateGlobalMetaStateWasCalled; int32_t mGeneration; uint32_t mNextSequenceNum; + wp mPointerController; public: FakeInputReaderContext(std::shared_ptr eventHub, @@ -857,6 +858,18 @@ public: return mGeneration; } + void updatePointerDisplay() { + sp controller = mPointerController.promote(); + if (controller != nullptr) { + InputReaderConfiguration config; + mPolicy->getReaderConfiguration(&config); + auto viewport = config.getDisplayViewportById(config.defaultPointerDisplayId); + if (viewport) { + controller->setDisplayViewport(*viewport); + } + } + } + private: virtual void updateGlobalMetaState() { mUpdateGlobalMetaStateWasCalled = true; @@ -883,6 +896,16 @@ private: virtual bool shouldDropVirtualKey(nsecs_t, int32_t, int32_t) { return false; } + virtual sp getPointerController(int32_t deviceId) { + sp controller = mPointerController.promote(); + if (controller == nullptr) { + controller = mPolicy->obtainPointerController(deviceId); + mPointerController = controller; + updatePointerDisplay(); + } + return controller; + } + virtual void fadePointer() { } @@ -1965,6 +1988,9 @@ protected: } void configureDevice(uint32_t changes) { + if (!changes || (changes & InputReaderConfiguration::CHANGE_DISPLAY_INFO)) { + mFakeContext->updatePointerDisplay(); + } mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes); } -- cgit v1.2.3-59-g8ed1b