From 0e3d66523da54a5df03cd7a73a797c1812b1dd0e Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Thu, 10 Mar 2022 14:39:46 +0000 Subject: Synchronize pointer display change requests Previously, when InputManagerService requests for PointerController to change the pointer display, there was no way to know when the request was completed or whether it succeeded. This could lead to a few issues: - WM's MousePositionTracker's coordinates would not be updated until the next mouse event was generated, meaning the position would be out of sync. - The creation of a virtual mouse device moves the pointer to a specific displayId. In order to test this behavior, we would need to sleep in the test code to wait for the system to update the pointer display and position, resulting in generally flaky tests. Here, we add a way to synchonize changes to the pointer display so that InputMangerService can know the current pointer display with certainty. PointerController, which is updated in the InputReader thread, is the source of truth of the pointer display. We add a policy call to notify IMS when the pointer display changes. When the pointer display is changed, the cursor position on the updated display is also updated so that the VirtualMouse#getCursorPosition() API is synchronized to the pointer display change. Bug: 216792538 Test: atest FrameworksServicesTests:InputManagerServiceTests Test: atest PointerIconTest Change-Id: I578fd1aba9335e2e078d749321e55a6d05299f3b --- libs/input/PointerController.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 1dc74e5f7740..10ea6512c724 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -106,6 +106,7 @@ PointerController::PointerController(const sp& PointerController::~PointerController() { mDisplayInfoListener->onPointerControllerDestroyed(); mUnregisterWindowInfosListener(mDisplayInfoListener); + mContext.getPolicy()->onPointerDisplayIdChanged(ADISPLAY_ID_NONE, 0, 0); } std::mutex& PointerController::getLock() const { @@ -255,6 +256,12 @@ void PointerController::setDisplayViewport(const DisplayViewport& viewport) { getAdditionalMouseResources = true; } mCursorController.setDisplayViewport(viewport, getAdditionalMouseResources); + if (viewport.displayId != mLocked.pointerDisplayId) { + float xPos, yPos; + mCursorController.getPosition(&xPos, &yPos); + mContext.getPolicy()->onPointerDisplayIdChanged(viewport.displayId, xPos, yPos); + mLocked.pointerDisplayId = viewport.displayId; + } } void PointerController::updatePointerIcon(int32_t iconId) { -- cgit v1.2.3-59-g8ed1b From 015f5d9d5c31f94fa44927b5a3c5734a71dcb8eb Mon Sep 17 00:00:00 2001 From: Brandon Pollack Date: Thu, 2 Jun 2022 06:59:33 +0000 Subject: Change POINTER_ICON_STYLE enum to a type safe enum class Test: Current tests all pass, this is a static type change, not a functional change. Change-Id: I8f0e8e43ea64f5abab163e4ef5444a8cb3d4fa78 --- core/jni/android_view_PointerIcon.cpp | 10 +-- core/jni/android_view_PointerIcon.h | 11 ++-- libs/input/MouseCursorController.cpp | 11 ++-- libs/input/MouseCursorController.h | 8 +-- libs/input/PointerController.cpp | 2 +- libs/input/PointerController.h | 2 +- libs/input/PointerControllerContext.h | 9 +-- libs/input/SpriteController.cpp | 2 +- libs/input/SpriteIcon.h | 10 +-- libs/input/tests/PointerController_test.cpp | 75 +++++++++++----------- ...om_android_server_input_InputManagerService.cpp | 67 ++++++++++--------- 11 files changed, 111 insertions(+), 96 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index 20832514a306..d57ec1528c69 100644 --- a/core/jni/android_view_PointerIcon.cpp +++ b/core/jni/android_view_PointerIcon.cpp @@ -44,7 +44,8 @@ static struct { // --- Global Functions --- -jobject android_view_PointerIcon_getSystemIcon(JNIEnv* env, jobject contextObj, int32_t style) { +jobject android_view_PointerIcon_getSystemIcon(JNIEnv* env, jobject contextObj, + PointerIconStyle style) { jobject pointerIconObj = env->CallStaticObjectMethod(gPointerIconClassInfo.clazz, gPointerIconClassInfo.getSystemIcon, contextObj, style); if (env->ExceptionCheck()) { @@ -80,7 +81,8 @@ status_t android_view_PointerIcon_getLoadedIcon(JNIEnv* env, jobject pointerIcon if (!pointerIconObj) { return BAD_VALUE; } - outPointerIcon->style = env->GetIntField(pointerIconObj, gPointerIconClassInfo.mType); + outPointerIcon->style = static_cast( + env->GetIntField(pointerIconObj, gPointerIconClassInfo.mType)); outPointerIcon->hotSpotX = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotX); outPointerIcon->hotSpotY = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotY); @@ -107,7 +109,8 @@ status_t android_view_PointerIcon_getLoadedIcon(JNIEnv* env, jobject pointerIcon } status_t android_view_PointerIcon_loadSystemIcon(JNIEnv* env, jobject contextObj, - int32_t style, PointerIcon* outPointerIcon) { + PointerIconStyle style, + PointerIcon* outPointerIcon) { jobject pointerIconObj = android_view_PointerIcon_getSystemIcon(env, contextObj, style); if (!pointerIconObj) { outPointerIcon->reset(); @@ -120,7 +123,6 @@ status_t android_view_PointerIcon_loadSystemIcon(JNIEnv* env, jobject contextObj return status; } - // --- JNI Registration --- int register_android_view_PointerIcon(JNIEnv* env) { diff --git a/core/jni/android_view_PointerIcon.h b/core/jni/android_view_PointerIcon.h index a87db1df8461..f3eaad3d0a9f 100644 --- a/core/jni/android_view_PointerIcon.h +++ b/core/jni/android_view_PointerIcon.h @@ -33,17 +33,17 @@ namespace android { struct PointerIcon { inline PointerIcon() { reset(); } - int32_t style; + PointerIconStyle style; graphics::Bitmap bitmap; float hotSpotX; float hotSpotY; std::vector bitmapFrames; int32_t durationPerFrame; - inline bool isNullIcon() { return style == POINTER_ICON_STYLE_NULL; } + inline bool isNullIcon() { return style == PointerIconStyle::TYPE_NULL; } inline void reset() { - style = POINTER_ICON_STYLE_NULL; + style = PointerIconStyle::TYPE_NULL; bitmap.reset(); hotSpotX = 0; hotSpotY = 0; @@ -54,7 +54,7 @@ struct PointerIcon { /* Gets a system pointer icon with the specified style. */ extern jobject android_view_PointerIcon_getSystemIcon(JNIEnv* env, jobject contextObj, - int32_t style); + PointerIconStyle style); /* Loads the bitmap associated with a pointer icon. * If pointerIconObj is NULL, returns OK and a pointer icon with POINTER_ICON_STYLE_NULL. */ @@ -68,7 +68,8 @@ extern status_t android_view_PointerIcon_getLoadedIcon(JNIEnv* env, jobject poin /* Loads the bitmap associated with a pointer icon by style. * If pointerIconObj is NULL, returns OK and a pointer icon with POINTER_ICON_STYLE_NULL. */ extern status_t android_view_PointerIcon_loadSystemIcon(JNIEnv* env, jobject contextObj, - int32_t style, PointerIcon* outPointerIcon); + PointerIconStyle style, + PointerIcon* outPointerIcon); } // namespace android diff --git a/libs/input/MouseCursorController.cpp b/libs/input/MouseCursorController.cpp index 956101e7a2a4..0e7b7ff4319d 100644 --- a/libs/input/MouseCursorController.cpp +++ b/libs/input/MouseCursorController.cpp @@ -22,6 +22,7 @@ #include "MouseCursorController.h" +#include #include namespace { @@ -286,7 +287,7 @@ void MouseCursorController::setDisplayViewport(const DisplayViewport& viewport, updatePointerLocked(); } -void MouseCursorController::updatePointerIcon(int32_t iconId) { +void MouseCursorController::updatePointerIcon(PointerIconStyle iconId) { std::scoped_lock lock(mLock); if (mLocked.requestedPointerType != iconId) { @@ -299,7 +300,7 @@ void MouseCursorController::updatePointerIcon(int32_t iconId) { void MouseCursorController::setCustomPointerIcon(const SpriteIcon& icon) { std::scoped_lock lock(mLock); - const int32_t iconId = mContext.getPolicy()->getCustomPointerIconId(); + const PointerIconStyle iconId = mContext.getPolicy()->getCustomPointerIconId(); mLocked.additionalMouseResources[iconId] = icon; mLocked.requestedPointerType = iconId; mLocked.updatePointerIcon = true; @@ -334,7 +335,7 @@ bool MouseCursorController::doFadingAnimationLocked(nsecs_t timestamp) REQUIRES( } bool MouseCursorController::doBitmapAnimationLocked(nsecs_t timestamp) REQUIRES(mLock) { - std::map::const_iterator iter = + std::map::const_iterator iter = mLocked.animationResources.find(mLocked.requestedPointerType); if (iter == mLocked.animationResources.end()) { return false; @@ -380,10 +381,10 @@ void MouseCursorController::updatePointerLocked() REQUIRES(mLock) { if (mLocked.requestedPointerType == mContext.getPolicy()->getDefaultPointerIconId()) { mLocked.pointerSprite->setIcon(mLocked.pointerIcon); } else { - std::map::const_iterator iter = + std::map::const_iterator iter = mLocked.additionalMouseResources.find(mLocked.requestedPointerType); if (iter != mLocked.additionalMouseResources.end()) { - std::map::const_iterator anim_iter = + std::map::const_iterator anim_iter = mLocked.animationResources.find(mLocked.requestedPointerType); if (anim_iter != mLocked.animationResources.end()) { mLocked.animationFrameIndex = 0; diff --git a/libs/input/MouseCursorController.h b/libs/input/MouseCursorController.h index c0ab58bd2e7e..208d33d7c717 100644 --- a/libs/input/MouseCursorController.h +++ b/libs/input/MouseCursorController.h @@ -54,7 +54,7 @@ public: void unfade(PointerControllerInterface::Transition transition); void setDisplayViewport(const DisplayViewport& viewport, bool getAdditionalMouseResources); - void updatePointerIcon(int32_t iconId); + void updatePointerIcon(PointerIconStyle iconId); void setCustomPointerIcon(const SpriteIcon& icon); void reloadPointerResources(bool getAdditionalMouseResources); @@ -88,10 +88,10 @@ private: bool resourcesLoaded; - std::map additionalMouseResources; - std::map animationResources; + std::map additionalMouseResources; + std::map animationResources; - int32_t requestedPointerType; + PointerIconStyle requestedPointerType; int32_t buttonState; diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 10ea6512c724..54f893e165f7 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -264,7 +264,7 @@ void PointerController::setDisplayViewport(const DisplayViewport& viewport) { } } -void PointerController::updatePointerIcon(int32_t iconId) { +void PointerController::updatePointerIcon(PointerIconStyle iconId) { std::scoped_lock lock(getLock()); mCursorController.updatePointerIcon(iconId); } diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index eab030f71e1a..33480e8fa194 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -65,7 +65,7 @@ public: BitSet32 spotIdBits, int32_t displayId); virtual void clearSpots(); - void updatePointerIcon(int32_t iconId); + void updatePointerIcon(PointerIconStyle iconId); void setCustomPointerIcon(const SpriteIcon& icon); void setInactivityTimeout(InactivityTimeout inactivityTimeout); void doInactivityTimeout(); diff --git a/libs/input/PointerControllerContext.h b/libs/input/PointerControllerContext.h index c2bc1e020279..1797428b343f 100644 --- a/libs/input/PointerControllerContext.h +++ b/libs/input/PointerControllerContext.h @@ -75,10 +75,11 @@ public: virtual void loadPointerIcon(SpriteIcon* icon, int32_t displayId) = 0; virtual void loadPointerResources(PointerResources* outResources, int32_t displayId) = 0; virtual void loadAdditionalMouseResources( - std::map* outResources, - std::map* outAnimationResources, int32_t displayId) = 0; - virtual int32_t getDefaultPointerIconId() = 0; - virtual int32_t getCustomPointerIconId() = 0; + std::map* outResources, + std::map* outAnimationResources, + int32_t displayId) = 0; + virtual PointerIconStyle getDefaultPointerIconId() = 0; + virtual PointerIconStyle getCustomPointerIconId() = 0; virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos) = 0; }; diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp index a5ca49847bb6..cab3f8414d7b 100644 --- a/libs/input/SpriteController.cpp +++ b/libs/input/SpriteController.cpp @@ -242,7 +242,7 @@ void SpriteController::doUpdateSprites() { && (becomingVisible || (update.state.dirty & (DIRTY_HOTSPOT | DIRTY_ICON_STYLE)))) { Parcel p; - p.writeInt32(update.state.icon.style); + p.writeInt32(static_cast(update.state.icon.style)); p.writeFloat(update.state.icon.hotSpotX); p.writeFloat(update.state.icon.hotSpotY); diff --git a/libs/input/SpriteIcon.h b/libs/input/SpriteIcon.h index a257d7e89ebc..5f085bbd2374 100644 --- a/libs/input/SpriteIcon.h +++ b/libs/input/SpriteIcon.h @@ -19,6 +19,7 @@ #include #include +#include namespace android { @@ -26,12 +27,13 @@ namespace android { * Icon that a sprite displays, including its hotspot. */ struct SpriteIcon { - inline SpriteIcon() : style(0), hotSpotX(0), hotSpotY(0) {} - inline SpriteIcon(const graphics::Bitmap& bitmap, int32_t style, float hotSpotX, float hotSpotY) + inline SpriteIcon() : style(PointerIconStyle::TYPE_NULL), hotSpotX(0), hotSpotY(0) {} + inline SpriteIcon(const graphics::Bitmap& bitmap, PointerIconStyle style, float hotSpotX, + float hotSpotY) : bitmap(bitmap), style(style), hotSpotX(hotSpotX), hotSpotY(hotSpotY) {} graphics::Bitmap bitmap; - int32_t style; + PointerIconStyle style; float hotSpotX; float hotSpotY; @@ -41,7 +43,7 @@ struct SpriteIcon { inline void reset() { bitmap.reset(); - style = 0; + style = PointerIconStyle::TYPE_NULL; hotSpotX = 0; hotSpotY = 0; } diff --git a/libs/input/tests/PointerController_test.cpp b/libs/input/tests/PointerController_test.cpp index f9752ed155df..a6a4115476df 100644 --- a/libs/input/tests/PointerController_test.cpp +++ b/libs/input/tests/PointerController_test.cpp @@ -14,17 +14,18 @@ * limitations under the License. */ -#include "mocks/MockSprite.h" -#include "mocks/MockSpriteController.h" - +#include +#include #include #include #include -#include -#include #include +#include "input/Input.h" +#include "mocks/MockSprite.h" +#include "mocks/MockSpriteController.h" + namespace android { enum TestCursorType { @@ -39,7 +40,6 @@ enum TestCursorType { using ::testing::AllOf; using ::testing::Field; -using ::testing::Mock; using ::testing::NiceMock; using ::testing::Return; using ::testing::Test; @@ -52,10 +52,12 @@ class MockPointerControllerPolicyInterface : public PointerControllerPolicyInter public: virtual void loadPointerIcon(SpriteIcon* icon, int32_t displayId) override; virtual void loadPointerResources(PointerResources* outResources, int32_t displayId) override; - virtual void loadAdditionalMouseResources(std::map* outResources, - std::map* outAnimationResources, int32_t displayId) override; - virtual int32_t getDefaultPointerIconId() override; - virtual int32_t getCustomPointerIconId() override; + virtual void loadAdditionalMouseResources( + std::map* outResources, + std::map* outAnimationResources, + int32_t displayId) override; + virtual PointerIconStyle getDefaultPointerIconId() override; + virtual PointerIconStyle getCustomPointerIconId() override; virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos) override; bool allResourcesAreLoaded(); @@ -85,34 +87,33 @@ void MockPointerControllerPolicyInterface::loadPointerResources(PointerResources } void MockPointerControllerPolicyInterface::loadAdditionalMouseResources( - std::map* outResources, - std::map* outAnimationResources, - int32_t) { + std::map* outResources, + std::map* outAnimationResources, int32_t) { SpriteIcon icon; PointerAnimation anim; // CURSOR_TYPE_ADDITIONAL doesn't have animation resource. int32_t cursorType = CURSOR_TYPE_ADDITIONAL; loadPointerIconForType(&icon, cursorType); - (*outResources)[cursorType] = icon; + (*outResources)[static_cast(cursorType)] = icon; // CURSOR_TYPE_ADDITIONAL_ANIM has animation resource. cursorType = CURSOR_TYPE_ADDITIONAL_ANIM; loadPointerIconForType(&icon, cursorType); anim.animationFrames.push_back(icon); anim.durationPerFrame = 10; - (*outResources)[cursorType] = icon; - (*outAnimationResources)[cursorType] = anim; + (*outResources)[static_cast(cursorType)] = icon; + (*outAnimationResources)[static_cast(cursorType)] = anim; additionalMouseResourcesLoaded = true; } -int32_t MockPointerControllerPolicyInterface::getDefaultPointerIconId() { - return CURSOR_TYPE_DEFAULT; +PointerIconStyle MockPointerControllerPolicyInterface::getDefaultPointerIconId() { + return static_cast(CURSOR_TYPE_DEFAULT); } -int32_t MockPointerControllerPolicyInterface::getCustomPointerIconId() { - return CURSOR_TYPE_CUSTOM; +PointerIconStyle MockPointerControllerPolicyInterface::getCustomPointerIconId() { + return static_cast(CURSOR_TYPE_CUSTOM); } bool MockPointerControllerPolicyInterface::allResourcesAreLoaded() { @@ -124,7 +125,7 @@ bool MockPointerControllerPolicyInterface::noResourcesAreLoaded() { } void MockPointerControllerPolicyInterface::loadPointerIconForType(SpriteIcon* icon, int32_t type) { - icon->style = type; + icon->style = static_cast(type); std::pair hotSpot = getHotSpotCoordinatesForType(type); icon->hotSpotX = hotSpot.first; icon->hotSpotY = hotSpot.second; @@ -205,11 +206,11 @@ TEST_F(PointerControllerTest, useDefaultCursorTypeByDefault) { std::pair hotspot = getHotSpotCoordinatesForType(CURSOR_TYPE_DEFAULT); EXPECT_CALL(*mPointerSprite, setVisible(true)); EXPECT_CALL(*mPointerSprite, setAlpha(1.0f)); - EXPECT_CALL(*mPointerSprite, setIcon( - AllOf( - Field(&SpriteIcon::style, CURSOR_TYPE_DEFAULT), - Field(&SpriteIcon::hotSpotX, hotspot.first), - Field(&SpriteIcon::hotSpotY, hotspot.second)))); + EXPECT_CALL(*mPointerSprite, + setIcon(AllOf(Field(&SpriteIcon::style, + static_cast(CURSOR_TYPE_DEFAULT)), + Field(&SpriteIcon::hotSpotX, hotspot.first), + Field(&SpriteIcon::hotSpotY, hotspot.second)))); mPointerController->reloadPointerResources(); } @@ -222,12 +223,11 @@ TEST_F(PointerControllerTest, updatePointerIcon) { std::pair hotspot = getHotSpotCoordinatesForType(type); EXPECT_CALL(*mPointerSprite, setVisible(true)); EXPECT_CALL(*mPointerSprite, setAlpha(1.0f)); - EXPECT_CALL(*mPointerSprite, setIcon( - AllOf( - Field(&SpriteIcon::style, type), - Field(&SpriteIcon::hotSpotX, hotspot.first), - Field(&SpriteIcon::hotSpotY, hotspot.second)))); - mPointerController->updatePointerIcon(type); + EXPECT_CALL(*mPointerSprite, + setIcon(AllOf(Field(&SpriteIcon::style, static_cast(type)), + Field(&SpriteIcon::hotSpotX, hotspot.first), + Field(&SpriteIcon::hotSpotY, hotspot.second)))); + mPointerController->updatePointerIcon(static_cast(type)); } TEST_F(PointerControllerTest, setCustomPointerIcon) { @@ -239,17 +239,16 @@ TEST_F(PointerControllerTest, setCustomPointerIcon) { float hotSpotY = 20; SpriteIcon icon; - icon.style = style; + icon.style = static_cast(style); icon.hotSpotX = hotSpotX; icon.hotSpotY = hotSpotY; EXPECT_CALL(*mPointerSprite, setVisible(true)); EXPECT_CALL(*mPointerSprite, setAlpha(1.0f)); - EXPECT_CALL(*mPointerSprite, setIcon( - AllOf( - Field(&SpriteIcon::style, style), - Field(&SpriteIcon::hotSpotX, hotSpotX), - Field(&SpriteIcon::hotSpotY, hotSpotY)))); + EXPECT_CALL(*mPointerSprite, + setIcon(AllOf(Field(&SpriteIcon::style, static_cast(style)), + Field(&SpriteIcon::hotSpotX, hotSpotX), + Field(&SpriteIcon::hotSpotY, hotSpotY)))); mPointerController->setCustomPointerIcon(icon); } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index a5653d6084ea..c018d96407fe 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -224,8 +224,10 @@ static inline const char* toString(bool value) { return value ? "true" : "false"; } -static void loadSystemIconAsSpriteWithPointerIcon(JNIEnv* env, jobject contextObj, int32_t style, - PointerIcon* outPointerIcon, SpriteIcon* outSpriteIcon) { +static void loadSystemIconAsSpriteWithPointerIcon(JNIEnv* env, jobject contextObj, + PointerIconStyle style, + PointerIcon* outPointerIcon, + SpriteIcon* outSpriteIcon) { status_t status = android_view_PointerIcon_loadSystemIcon(env, contextObj, style, outPointerIcon); if (!status) { @@ -236,7 +238,7 @@ static void loadSystemIconAsSpriteWithPointerIcon(JNIEnv* env, jobject contextOb } } -static void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, int32_t style, +static void loadSystemIconAsSprite(JNIEnv* env, jobject contextObj, PointerIconStyle style, SpriteIcon* outSpriteIcon) { PointerIcon pointerIcon; loadSystemIconAsSpriteWithPointerIcon(env, contextObj, style, &pointerIcon, outSpriteIcon); @@ -290,7 +292,7 @@ public: void setShowTouches(bool enabled); void setInteractive(bool interactive); void reloadCalibration(); - void setPointerIconType(int32_t iconId); + void setPointerIconType(PointerIconStyle iconId); void reloadPointerIcons(); void requestPointerCapture(const sp& windowToken, bool enabled); void setCustomPointerIcon(const SpriteIcon& icon); @@ -346,10 +348,11 @@ public: virtual void loadPointerIcon(SpriteIcon* icon, int32_t displayId); virtual void loadPointerResources(PointerResources* outResources, int32_t displayId); - virtual void loadAdditionalMouseResources(std::map* outResources, - std::map* outAnimationResources, int32_t displayId); - virtual int32_t getDefaultPointerIconId(); - virtual int32_t getCustomPointerIconId(); + virtual void loadAdditionalMouseResources( + std::map* outResources, + std::map* outAnimationResources, int32_t displayId); + virtual PointerIconStyle getDefaultPointerIconId(); + virtual PointerIconStyle getCustomPointerIconId(); virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos); private: @@ -1113,7 +1116,7 @@ void NativeInputManager::reloadCalibration() { InputReaderConfiguration::CHANGE_TOUCH_AFFINE_TRANSFORMATION); } -void NativeInputManager::setPointerIconType(int32_t iconId) { +void NativeInputManager::setPointerIconType(PointerIconStyle iconId) { AutoMutex _l(mLock); std::shared_ptr controller = mLocked.pointerController.lock(); if (controller != nullptr) { @@ -1430,29 +1433,31 @@ void NativeInputManager::loadPointerResources(PointerResources* outResources, in ScopedLocalRef displayContext(env, env->CallObjectMethod( mServiceObj, gServiceClassInfo.getContextForDisplay, displayId)); - loadSystemIconAsSprite(env, displayContext.get(), POINTER_ICON_STYLE_SPOT_HOVER, - &outResources->spotHover); - loadSystemIconAsSprite(env, displayContext.get(), POINTER_ICON_STYLE_SPOT_TOUCH, - &outResources->spotTouch); - loadSystemIconAsSprite(env, displayContext.get(), POINTER_ICON_STYLE_SPOT_ANCHOR, - &outResources->spotAnchor); + loadSystemIconAsSprite(env, displayContext.get(), PointerIconStyle::TYPE_SPOT_HOVER, + &outResources->spotHover); + loadSystemIconAsSprite(env, displayContext.get(), PointerIconStyle::TYPE_SPOT_TOUCH, + &outResources->spotTouch); + loadSystemIconAsSprite(env, displayContext.get(), PointerIconStyle::TYPE_SPOT_ANCHOR, + &outResources->spotAnchor); } -void NativeInputManager::loadAdditionalMouseResources(std::map* outResources, - std::map* outAnimationResources, int32_t displayId) { +void NativeInputManager::loadAdditionalMouseResources( + std::map* outResources, + std::map* outAnimationResources, int32_t displayId) { ATRACE_CALL(); JNIEnv* env = jniEnv(); ScopedLocalRef displayContext(env, env->CallObjectMethod( mServiceObj, gServiceClassInfo.getContextForDisplay, displayId)); - for (int iconId = POINTER_ICON_STYLE_CONTEXT_MENU; iconId <= POINTER_ICON_STYLE_GRABBING; - ++iconId) { + for (int32_t iconId = static_cast(PointerIconStyle::TYPE_CONTEXT_MENU); + iconId <= static_cast(PointerIconStyle::TYPE_GRABBING); ++iconId) { + const PointerIconStyle pointerIconStyle = static_cast(iconId); PointerIcon pointerIcon; - loadSystemIconAsSpriteWithPointerIcon( - env, displayContext.get(), iconId, &pointerIcon, &((*outResources)[iconId])); + loadSystemIconAsSpriteWithPointerIcon(env, displayContext.get(), pointerIconStyle, + &pointerIcon, &((*outResources)[pointerIconStyle])); if (!pointerIcon.bitmapFrames.empty()) { - PointerAnimation& animationData = (*outAnimationResources)[iconId]; + PointerAnimation& animationData = (*outAnimationResources)[pointerIconStyle]; size_t numFrames = pointerIcon.bitmapFrames.size() + 1; animationData.durationPerFrame = milliseconds_to_nanoseconds(pointerIcon.durationPerFrame); @@ -1467,16 +1472,16 @@ void NativeInputManager::loadAdditionalMouseResources(std::map is duplicated as a sealed class (type safe enum + // equivalent in Java). + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); - im->setPointerIconType(iconId); + im->setPointerIconType(static_cast(iconId)); } static void nativeReloadPointerIcons(JNIEnv* env, jobject nativeImplObj) { -- cgit v1.2.3-59-g8ed1b From 72a89137e05ea2c0a51cbe2f10a0e953ae1e5f77 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Sat, 22 Oct 2022 03:16:31 +0100 Subject: Add dump for PointerController. Just a simple dump to start, but start pushing more PointerController information into bugreports. Bug: 254277939 Test: manually inspect `dumpsys input` Change-Id: I7ca637aa8a8f1cc1188eddcf694f7c4aea7d5821 --- libs/input/PointerController.cpp | 15 +++++++++++++++ libs/input/PointerController.h | 3 +++ .../jni/com_android_server_input_InputManagerService.cpp | 4 ++++ 3 files changed, 22 insertions(+) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 54f893e165f7..42606e3ee4df 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -22,10 +22,17 @@ #include #include #include +#include #include +#include + +#include #include "PointerControllerContext.h" +#define INDENT " " +#define INDENT2 " " + namespace android { namespace { @@ -313,4 +320,12 @@ const ui::Transform& PointerController::getTransformForDisplayLocked(int display return it != di.end() ? it->transform : kIdentityTransform; } +void PointerController::dump(std::string& dump) { + dump += INDENT "PointerController:\n"; + std::scoped_lock lock(getLock()); + dump += StringPrintf(INDENT2 "Presentation: %s\n", + ftl::enum_string(mLocked.presentation).c_str()); + dump += StringPrintf(INDENT2 "Pointer Display ID: %" PRIu32 "\n", mLocked.pointerDisplayId); +} + } // namespace android diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 33480e8fa194..48d5a5756a69 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -27,6 +27,7 @@ #include #include +#include #include #include "MouseCursorController.h" @@ -75,6 +76,8 @@ public: void onDisplayInfosChangedLocked(const std::vector& displayInfos) REQUIRES(getLock()); + void dump(std::string& dump); + protected: using WindowListenerConsumer = std::function&)>; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 0d872370dcdc..31971246e9e7 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -450,6 +450,10 @@ void NativeInputManager::dump(std::string& dump) { dump += StringPrintf(INDENT "Pointer Capture: %s, seq=%" PRIu32 "\n", mLocked.pointerCaptureRequest.enable ? "Enabled" : "Disabled", mLocked.pointerCaptureRequest.seq); + auto pointerController = mLocked.pointerController.lock(); + if (pointerController != nullptr) { + pointerController->dump(dump); + } } dump += "\n"; -- cgit v1.2.3-59-g8ed1b From 8357775f16a66d973bb056b277ab4ca125c15544 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Fri, 28 Oct 2022 16:24:33 +0100 Subject: Add viewports to PointerController dump Bug: 254277939 Test: manually inspect `dumpsys input` Change-Id: I3286d4d86c50d1df004f7115ad072ebc62cf12f4 --- libs/input/PointerController.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 42606e3ee4df..3ae613195197 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -32,6 +32,7 @@ #define INDENT " " #define INDENT2 " " +#define INDENT3 " " namespace android { @@ -326,6 +327,10 @@ void PointerController::dump(std::string& dump) { dump += StringPrintf(INDENT2 "Presentation: %s\n", ftl::enum_string(mLocked.presentation).c_str()); dump += StringPrintf(INDENT2 "Pointer Display ID: %" PRIu32 "\n", mLocked.pointerDisplayId); + dump += StringPrintf(INDENT2 "Viewports:\n"); + for (const auto& info : mLocked.mDisplayInfos) { + info.dump(dump, INDENT3); + } } } // namespace android -- cgit v1.2.3-59-g8ed1b From 21401ad9c017b49614743b16164ef4dba5899563 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Sat, 22 Oct 2022 03:23:55 +0100 Subject: s/displayID/displayId Update local variable names in PointerController so they match the general code style. Bug: 254277939 Test: compiles Change-Id: I7f71e12d48cf76ec8ff8fbaa435c18f9c2277096 --- libs/input/PointerController.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 3ae613195197..1f80ba9baa68 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -231,7 +231,7 @@ void PointerController::clearSpots() { } void PointerController::clearSpotsLocked() { - for (auto& [displayID, spotController] : mLocked.spotControllers) { + for (auto& [displayId, spotController] : mLocked.spotControllers) { spotController.clearSpots(); } } @@ -243,7 +243,7 @@ void PointerController::setInactivityTimeout(InactivityTimeout inactivityTimeout void PointerController::reloadPointerResources() { std::scoped_lock lock(getLock()); - for (auto& [displayID, spotController] : mLocked.spotControllers) { + for (auto& [displayId, spotController] : mLocked.spotControllers) { spotController.reloadSpotResources(); } @@ -294,13 +294,13 @@ void PointerController::onDisplayViewportsUpdated(std::vector& std::scoped_lock lock(getLock()); for (auto it = mLocked.spotControllers.begin(); it != mLocked.spotControllers.end();) { - int32_t displayID = it->first; - if (!displayIdSet.count(displayID)) { + int32_t displayId = it->first; + if (!displayIdSet.count(displayId)) { /* * Ensures that an in-progress animation won't dereference * a null pointer to TouchSpotController. */ - mContext.removeAnimationCallback(displayID); + mContext.removeAnimationCallback(displayId); it = mLocked.spotControllers.erase(it); } else { ++it; -- cgit v1.2.3-59-g8ed1b From 20f5fd8744b5f57bc3e8e72e0fe1be94b5297f52 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Fri, 28 Oct 2022 14:12:24 +0100 Subject: Add TouchSpotController to PointerController dump. Bug: 254277939 Test: manually inspect `dumpsys input` Change-Id: I3a50e13885df90253335f013cda28b5ce9d2def7 --- libs/input/PointerController.cpp | 4 ++++ libs/input/TouchSpotController.cpp | 31 +++++++++++++++++++++++++++++++ libs/input/TouchSpotController.h | 3 +++ 3 files changed, 38 insertions(+) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 1f80ba9baa68..099efd3a1a2f 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -331,6 +331,10 @@ void PointerController::dump(std::string& dump) { for (const auto& info : mLocked.mDisplayInfos) { info.dump(dump, INDENT3); } + dump += INDENT2 "Spot Controllers:\n"; + for (const auto& [_, spotController] : mLocked.spotControllers) { + spotController.dump(dump, INDENT3); + } } } // namespace android diff --git a/libs/input/TouchSpotController.cpp b/libs/input/TouchSpotController.cpp index 4ac66c4ffb6a..d9fe5996bcff 100644 --- a/libs/input/TouchSpotController.cpp +++ b/libs/input/TouchSpotController.cpp @@ -21,8 +21,15 @@ #include "TouchSpotController.h" +#include +#include #include +#include + +#define INDENT " " +#define INDENT2 " " + namespace { // Time to spend fading out the spot completely. const nsecs_t SPOT_FADE_DURATION = 200 * 1000000LL; // 200 ms @@ -53,6 +60,12 @@ void TouchSpotController::Spot::updateSprite(const SpriteIcon* icon, float x, fl } } +void TouchSpotController::Spot::dump(std::string& out, const char* prefix) const { + out += prefix; + base::StringAppendF(&out, "Spot{id=%" PRIx32 ", alpha=%f, scale=%f, pos=[%f, %f]}\n", id, alpha, + scale, x, y); +} + // --- TouchSpotController --- TouchSpotController::TouchSpotController(int32_t displayId, PointerControllerContext& context) @@ -255,4 +268,22 @@ void TouchSpotController::startAnimationLocked() REQUIRES(mLock) { mContext.addAnimationCallback(mDisplayId, func); } +void TouchSpotController::dump(std::string& out, const char* prefix) const { + using base::StringAppendF; + out += prefix; + out += "SpotController:\n"; + out += prefix; + StringAppendF(&out, INDENT "DisplayId: %" PRId32 "\n", mDisplayId); + std::scoped_lock lock(mLock); + out += prefix; + StringAppendF(&out, INDENT "Animating: %s\n", toString(mLocked.animating)); + out += prefix; + out += INDENT "Spots:\n"; + std::string spotPrefix = prefix; + spotPrefix += INDENT2; + for (const auto& spot : mLocked.displaySpots) { + spot->dump(out, spotPrefix.c_str()); + } +} + } // namespace android diff --git a/libs/input/TouchSpotController.h b/libs/input/TouchSpotController.h index 703de3603f48..5bbc75d9570b 100644 --- a/libs/input/TouchSpotController.h +++ b/libs/input/TouchSpotController.h @@ -38,6 +38,8 @@ public: void reloadSpotResources(); bool doAnimations(nsecs_t timestamp); + void dump(std::string& out, const char* prefix = "") const; + private: struct Spot { static const uint32_t INVALID_ID = 0xffffffff; @@ -58,6 +60,7 @@ private: mLastIcon(nullptr) {} void updateSprite(const SpriteIcon* icon, float x, float y, int32_t displayId); + void dump(std::string& out, const char* prefix = "") const; private: const SpriteIcon* mLastIcon; -- cgit v1.2.3-59-g8ed1b From 670b33dd9068490e5a177ffa999639e774453b9e Mon Sep 17 00:00:00 2001 From: Seunghwan Choi Date: Fri, 13 Jan 2023 21:12:59 +0900 Subject: Separate default pointer for mouse and stylus (frameworks/base part) PointerIcon.TYPE_NOT_SPECIFIED will be used for requesting default pointer. For the type, MouseCursorController will decide whether to show mouse or stylus icon, based on the active source. Need complement: the resource for default stylus icon should be added. Test: Manual Test(hover pointer on handwriting area) Bug: b/215436642 Change-Id: I6a337cb69bea57427f676e561900802270d206ae --- core/java/android/view/ViewRootImpl.java | 17 +++++++---- libs/input/MouseCursorController.cpp | 33 ++++++++++++++++++---- libs/input/MouseCursorController.h | 3 ++ libs/input/PointerController.cpp | 12 ++++++-- libs/input/PointerControllerContext.h | 1 + libs/input/tests/PointerController_test.cpp | 26 +++++++++++++++++ ...om_android_server_input_InputManagerService.cpp | 6 ++++ 7 files changed, 83 insertions(+), 15 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 125960f0575f..308248cbf735 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -772,7 +772,12 @@ public final class ViewRootImpl implements ViewParent, private long mFpsPrevTime = -1; private int mFpsNumFrames; - private int mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; + /** + * The resolved pointer icon type requested by this window. + * A null value indicates the resolved pointer icon has not yet been calculated. + */ + @Nullable + private Integer mPointerIconType = null; private PointerIcon mCustomPointerIcon = null; /** @@ -6905,13 +6910,13 @@ public final class ViewRootImpl implements ViewParent, || event.getActionMasked() == MotionEvent.ACTION_HOVER_EXIT) { // Other apps or the window manager may change the icon type outside of // this app, therefore the icon type has to be reset on enter/exit event. - mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; + mPointerIconType = null; } if (event.getActionMasked() != MotionEvent.ACTION_HOVER_EXIT) { if (!updatePointerIcon(event) && event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE) { - mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; + mPointerIconType = null; } } } @@ -6950,7 +6955,7 @@ public final class ViewRootImpl implements ViewParent, } private void resetPointerIcon(MotionEvent event) { - mPointerIconType = PointerIcon.TYPE_NOT_SPECIFIED; + mPointerIconType = null; updatePointerIcon(event); } @@ -6980,9 +6985,9 @@ public final class ViewRootImpl implements ViewParent, } final int pointerType = (pointerIcon != null) ? - pointerIcon.getType() : PointerIcon.TYPE_DEFAULT; + pointerIcon.getType() : PointerIcon.TYPE_NOT_SPECIFIED; - if (mPointerIconType != pointerType) { + if (mPointerIconType == null || mPointerIconType != pointerType) { mPointerIconType = pointerType; mCustomPointerIcon = null; if (mPointerIconType != PointerIcon.TYPE_CUSTOM) { diff --git a/libs/input/MouseCursorController.cpp b/libs/input/MouseCursorController.cpp index a83516791f33..24cfc9d70c9b 100644 --- a/libs/input/MouseCursorController.cpp +++ b/libs/input/MouseCursorController.cpp @@ -38,6 +38,8 @@ MouseCursorController::MouseCursorController(PointerControllerContext& context) : mContext(context) { std::scoped_lock lock(mLock); + mLocked.stylusHoverMode = false; + mLocked.animationFrameIndex = 0; mLocked.lastFrameUpdatedTime = 0; @@ -47,7 +49,8 @@ MouseCursorController::MouseCursorController(PointerControllerContext& context) mLocked.pointerAlpha = 0.0f; // pointer is initially faded mLocked.pointerSprite = mContext.getSpriteController()->createSprite(); mLocked.updatePointerIcon = false; - mLocked.requestedPointerType = mContext.getPolicy()->getDefaultPointerIconId(); + mLocked.requestedPointerType = PointerIconStyle::TYPE_NOT_SPECIFIED; + mLocked.resolvedPointerType = PointerIconStyle::TYPE_NOT_SPECIFIED; mLocked.resourcesLoaded = false; @@ -184,6 +187,15 @@ void MouseCursorController::unfade(PointerControllerInterface::Transition transi } } +void MouseCursorController::setStylusHoverMode(bool stylusHoverMode) { + std::scoped_lock lock(mLock); + + if (mLocked.stylusHoverMode != stylusHoverMode) { + mLocked.stylusHoverMode = stylusHoverMode; + mLocked.updatePointerIcon = true; + } +} + void MouseCursorController::reloadPointerResources(bool getAdditionalMouseResources) { std::scoped_lock lock(mLock); @@ -339,7 +351,7 @@ bool MouseCursorController::doFadingAnimationLocked(nsecs_t timestamp) REQUIRES( bool MouseCursorController::doBitmapAnimationLocked(nsecs_t timestamp) REQUIRES(mLock) { std::map::const_iterator iter = - mLocked.animationResources.find(mLocked.requestedPointerType); + mLocked.animationResources.find(mLocked.resolvedPointerType); if (iter == mLocked.animationResources.end()) { return false; } @@ -381,14 +393,23 @@ void MouseCursorController::updatePointerLocked() REQUIRES(mLock) { } if (mLocked.updatePointerIcon) { - if (mLocked.requestedPointerType == mContext.getPolicy()->getDefaultPointerIconId()) { + mLocked.resolvedPointerType = mLocked.requestedPointerType; + const PointerIconStyle defaultPointerIconId = + mContext.getPolicy()->getDefaultPointerIconId(); + if (mLocked.resolvedPointerType == PointerIconStyle::TYPE_NOT_SPECIFIED) { + mLocked.resolvedPointerType = mLocked.stylusHoverMode + ? mContext.getPolicy()->getDefaultStylusIconId() + : defaultPointerIconId; + } + + if (mLocked.resolvedPointerType == defaultPointerIconId) { mLocked.pointerSprite->setIcon(mLocked.pointerIcon); } else { std::map::const_iterator iter = - mLocked.additionalMouseResources.find(mLocked.requestedPointerType); + mLocked.additionalMouseResources.find(mLocked.resolvedPointerType); if (iter != mLocked.additionalMouseResources.end()) { std::map::const_iterator anim_iter = - mLocked.animationResources.find(mLocked.requestedPointerType); + mLocked.animationResources.find(mLocked.resolvedPointerType); if (anim_iter != mLocked.animationResources.end()) { mLocked.animationFrameIndex = 0; mLocked.lastFrameUpdatedTime = systemTime(SYSTEM_TIME_MONOTONIC); @@ -396,7 +417,7 @@ void MouseCursorController::updatePointerLocked() REQUIRES(mLock) { } mLocked.pointerSprite->setIcon(iter->second); } else { - ALOGW("Can't find the resource for icon id %d", mLocked.requestedPointerType); + ALOGW("Can't find the resource for icon id %d", mLocked.resolvedPointerType); mLocked.pointerSprite->setIcon(mLocked.pointerIcon); } } diff --git a/libs/input/MouseCursorController.h b/libs/input/MouseCursorController.h index 208d33d7c717..db0ab56429b2 100644 --- a/libs/input/MouseCursorController.h +++ b/libs/input/MouseCursorController.h @@ -53,6 +53,7 @@ public: void fade(PointerControllerInterface::Transition transition); void unfade(PointerControllerInterface::Transition transition); void setDisplayViewport(const DisplayViewport& viewport, bool getAdditionalMouseResources); + void setStylusHoverMode(bool stylusHoverMode); void updatePointerIcon(PointerIconStyle iconId); void setCustomPointerIcon(const SpriteIcon& icon); @@ -74,6 +75,7 @@ private: struct Locked { DisplayViewport viewport; + bool stylusHoverMode; size_t animationFrameIndex; nsecs_t lastFrameUpdatedTime; @@ -92,6 +94,7 @@ private: std::map animationResources; PointerIconStyle requestedPointerType; + PointerIconStyle resolvedPointerType; int32_t buttonState; diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 099efd3a1a2f..fedf58d7c6d0 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -195,7 +195,11 @@ void PointerController::setPresentation(Presentation presentation) { return; } - if (presentation == Presentation::POINTER) { + if (presentation == Presentation::POINTER || presentation == Presentation::STYLUS_HOVER) { + // For now, we support stylus hover using the mouse cursor implementation. + // TODO: Add proper support for stylus hover icons. + mCursorController.setStylusHoverMode(presentation == Presentation::STYLUS_HOVER); + mCursorController.getAdditionalMouseResources(); clearSpotsLocked(); } @@ -249,7 +253,8 @@ void PointerController::reloadPointerResources() { if (mCursorController.resourcesLoaded()) { bool getAdditionalMouseResources = false; - if (mLocked.presentation == PointerController::Presentation::POINTER) { + if (mLocked.presentation == PointerController::Presentation::POINTER || + mLocked.presentation == PointerController::Presentation::STYLUS_HOVER) { getAdditionalMouseResources = true; } mCursorController.reloadPointerResources(getAdditionalMouseResources); @@ -260,7 +265,8 @@ void PointerController::setDisplayViewport(const DisplayViewport& viewport) { std::scoped_lock lock(getLock()); bool getAdditionalMouseResources = false; - if (mLocked.presentation == PointerController::Presentation::POINTER) { + if (mLocked.presentation == PointerController::Presentation::POINTER || + mLocked.presentation == PointerController::Presentation::STYLUS_HOVER) { getAdditionalMouseResources = true; } mCursorController.setDisplayViewport(viewport, getAdditionalMouseResources); diff --git a/libs/input/PointerControllerContext.h b/libs/input/PointerControllerContext.h index 1797428b343f..96d83a5f0d15 100644 --- a/libs/input/PointerControllerContext.h +++ b/libs/input/PointerControllerContext.h @@ -79,6 +79,7 @@ public: std::map* outAnimationResources, int32_t displayId) = 0; virtual PointerIconStyle getDefaultPointerIconId() = 0; + virtual PointerIconStyle getDefaultStylusIconId() = 0; virtual PointerIconStyle getCustomPointerIconId() = 0; virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos) = 0; }; diff --git a/libs/input/tests/PointerController_test.cpp b/libs/input/tests/PointerController_test.cpp index a6a4115476df..c820d0007a4b 100644 --- a/libs/input/tests/PointerController_test.cpp +++ b/libs/input/tests/PointerController_test.cpp @@ -35,6 +35,7 @@ enum TestCursorType { CURSOR_TYPE_ANCHOR, CURSOR_TYPE_ADDITIONAL, CURSOR_TYPE_ADDITIONAL_ANIM, + CURSOR_TYPE_STYLUS, CURSOR_TYPE_CUSTOM = -1, }; @@ -57,6 +58,7 @@ public: std::map* outAnimationResources, int32_t displayId) override; virtual PointerIconStyle getDefaultPointerIconId() override; + virtual PointerIconStyle getDefaultStylusIconId() override; virtual PointerIconStyle getCustomPointerIconId() override; virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos) override; @@ -105,6 +107,11 @@ void MockPointerControllerPolicyInterface::loadAdditionalMouseResources( (*outResources)[static_cast(cursorType)] = icon; (*outAnimationResources)[static_cast(cursorType)] = anim; + // CURSOR_TYPE_STYLUS doesn't have animation resource. + cursorType = CURSOR_TYPE_STYLUS; + loadPointerIconForType(&icon, cursorType); + (*outResources)[static_cast(cursorType)] = icon; + additionalMouseResourcesLoaded = true; } @@ -112,6 +119,10 @@ PointerIconStyle MockPointerControllerPolicyInterface::getDefaultPointerIconId() return static_cast(CURSOR_TYPE_DEFAULT); } +PointerIconStyle MockPointerControllerPolicyInterface::getDefaultStylusIconId() { + return static_cast(CURSOR_TYPE_STYLUS); +} + PointerIconStyle MockPointerControllerPolicyInterface::getCustomPointerIconId() { return static_cast(CURSOR_TYPE_CUSTOM); } @@ -214,6 +225,21 @@ TEST_F(PointerControllerTest, useDefaultCursorTypeByDefault) { mPointerController->reloadPointerResources(); } +TEST_F(PointerControllerTest, useStylusTypeForStylusHover) { + ensureDisplayViewportIsSet(); + mPointerController->setPresentation(PointerController::Presentation::STYLUS_HOVER); + mPointerController->unfade(PointerController::Transition::IMMEDIATE); + std::pair hotspot = getHotSpotCoordinatesForType(CURSOR_TYPE_STYLUS); + EXPECT_CALL(*mPointerSprite, setVisible(true)); + EXPECT_CALL(*mPointerSprite, setAlpha(1.0f)); + EXPECT_CALL(*mPointerSprite, + setIcon(AllOf(Field(&SpriteIcon::style, + static_cast(CURSOR_TYPE_STYLUS)), + Field(&SpriteIcon::hotSpotX, hotspot.first), + Field(&SpriteIcon::hotSpotY, hotspot.second)))); + mPointerController->reloadPointerResources(); +} + TEST_F(PointerControllerTest, updatePointerIcon) { ensureDisplayViewportIsSet(); mPointerController->setPresentation(PointerController::Presentation::POINTER); diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index f4d1d1ef88d1..56ccf872d2f6 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -363,6 +363,7 @@ public: std::map* outResources, std::map* outAnimationResources, int32_t displayId); virtual PointerIconStyle getDefaultPointerIconId(); + virtual PointerIconStyle getDefaultStylusIconId(); virtual PointerIconStyle getCustomPointerIconId(); virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos); @@ -1605,6 +1606,11 @@ PointerIconStyle NativeInputManager::getDefaultPointerIconId() { return PointerIconStyle::TYPE_ARROW; } +PointerIconStyle NativeInputManager::getDefaultStylusIconId() { + // TODO: add resource for default stylus icon and change this + return PointerIconStyle::TYPE_CROSSHAIR; +} + PointerIconStyle NativeInputManager::getCustomPointerIconId() { return PointerIconStyle::TYPE_CUSTOM; } -- cgit v1.2.3-59-g8ed1b From 692bbdb3a8ec16753ba37b65bba2b1b09eb3dad7 Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Fri, 24 Feb 2023 01:52:13 +0000 Subject: Get mouse cursor position from PointerController instead of WM PointerController is the source of truth of the mouse cursor position. When the VirtualDevice APIs queried the cursor position, we were previously getting the position from WM. WM's values only update once system_server's global monitor has processed the input event, which leads us into a race condition. Remove the race consition by querying the mouse cursor position directly from PointerController. Bug: 266687189 Test: atest VirtualMouseTest Change-Id: Id0e0e20a0d547f969d3a27d43fdfdca34d0fa7c0 --- libs/input/PointerController.cpp | 39 +++++++++++++++------- .../android/server/input/InputManagerInternal.java | 6 +++- .../android/server/input/InputManagerService.java | 9 ++--- .../server/input/NativeInputManagerService.java | 13 ++++++++ .../android/server/wm/InputManagerCallback.java | 6 ---- .../android/server/wm/WindowManagerService.java | 9 ----- ...om_android_server_input_InputManagerService.cpp | 20 +++++++++++ 7 files changed, 70 insertions(+), 32 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index fedf58d7c6d0..e748c692743d 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -262,19 +262,34 @@ void PointerController::reloadPointerResources() { } void PointerController::setDisplayViewport(const DisplayViewport& viewport) { - std::scoped_lock lock(getLock()); + struct PointerDisplayChangeArgs { + int32_t displayId; + float x, y; + }; + std::optional pointerDisplayChanged; - bool getAdditionalMouseResources = false; - if (mLocked.presentation == PointerController::Presentation::POINTER || - mLocked.presentation == PointerController::Presentation::STYLUS_HOVER) { - getAdditionalMouseResources = true; - } - mCursorController.setDisplayViewport(viewport, getAdditionalMouseResources); - if (viewport.displayId != mLocked.pointerDisplayId) { - float xPos, yPos; - mCursorController.getPosition(&xPos, &yPos); - mContext.getPolicy()->onPointerDisplayIdChanged(viewport.displayId, xPos, yPos); - mLocked.pointerDisplayId = viewport.displayId; + { // acquire lock + std::scoped_lock lock(getLock()); + + bool getAdditionalMouseResources = false; + if (mLocked.presentation == PointerController::Presentation::POINTER || + mLocked.presentation == PointerController::Presentation::STYLUS_HOVER) { + getAdditionalMouseResources = true; + } + mCursorController.setDisplayViewport(viewport, getAdditionalMouseResources); + if (viewport.displayId != mLocked.pointerDisplayId) { + float xPos, yPos; + mCursorController.getPosition(&xPos, &yPos); + mLocked.pointerDisplayId = viewport.displayId; + pointerDisplayChanged = {viewport.displayId, xPos, yPos}; + } + } // release lock + + if (pointerDisplayChanged) { + // Notify the policy without holding the pointer controller lock. + mContext.getPolicy()->onPointerDisplayIdChanged(pointerDisplayChanged->displayId, + pointerDisplayChanged->x, + pointerDisplayChanged->y); } } diff --git a/services/core/java/com/android/server/input/InputManagerInternal.java b/services/core/java/com/android/server/input/InputManagerInternal.java index 4d03e44bfd19..7e990c6c2f4a 100644 --- a/services/core/java/com/android/server/input/InputManagerInternal.java +++ b/services/core/java/com/android/server/input/InputManagerInternal.java @@ -96,7 +96,11 @@ public abstract class InputManagerInternal { */ public abstract int getVirtualMousePointerDisplayId(); - /** Gets the current position of the mouse cursor. */ + /** + * Gets the current position of the mouse cursor. + * + * Returns NaN-s as the coordinates if the cursor is not available. + */ public abstract PointF getCursorPosition(); /** diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index b2b22a0a083a..efc4f11168bb 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -2863,9 +2863,6 @@ public class InputManagerService extends IInputManager.Stub int getPointerDisplayId(); - /** Gets the x and y coordinates of the cursor's current position. */ - PointF getCursorPosition(); - /** * Notifies window manager that a {@link android.view.MotionEvent#ACTION_DOWN} pointer event * occurred on a window that did not have focus. @@ -3189,7 +3186,11 @@ public class InputManagerService extends IInputManager.Stub @Override public PointF getCursorPosition() { - return mWindowManagerCallbacks.getCursorPosition(); + final float[] p = mNative.getMouseCursorPosition(); + if (p == null || p.length != 2) { + throw new IllegalStateException("Failed to get mouse cursor position"); + } + return new PointF(p[0], p[1]); } @Override diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index 22226e88f15f..5395302d1c32 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -224,6 +224,16 @@ interface NativeInputManagerService { /** Set whether stylus button reporting through motion events should be enabled. */ void setStylusButtonMotionEventsEnabled(boolean enabled); + /** + * Get the current position of the mouse cursor. + * + * If the mouse cursor is not currently shown, the coordinate values will be NaN-s. + * + * NOTE: This will grab the PointerController's lock, so we must be careful about calling this + * from the InputReader or Display threads, which may result in a deadlock. + */ + float[] getMouseCursorPosition(); + /** The native implementation of InputManagerService methods. */ class NativeImpl implements NativeInputManagerService { /** Pointer to native input manager service object, used by native code. */ @@ -465,5 +475,8 @@ interface NativeInputManagerService { @Override public native void setStylusButtonMotionEventsEnabled(boolean enabled); + + @Override + public native float[] getMouseCursorPosition(); } } diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java index 1e9d451b1a69..0a47fe09dbd9 100644 --- a/services/core/java/com/android/server/wm/InputManagerCallback.java +++ b/services/core/java/com/android/server/wm/InputManagerCallback.java @@ -25,7 +25,6 @@ import static com.android.server.wm.WindowManagerService.H.ON_POINTER_DOWN_OUTSI import android.annotation.NonNull; import android.annotation.Nullable; -import android.graphics.PointF; import android.os.Debug; import android.os.IBinder; import android.util.Slog; @@ -220,11 +219,6 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal } } - @Override - public PointF getCursorPosition() { - return mService.getLatestMousePosition(); - } - @Override public void onPointerDownOutsideFocus(IBinder touchedToken) { mService.mH.obtainMessage(ON_POINTER_DOWN_OUTSIDE_FOCUS, touchedToken).sendToTarget(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 45cdacd503a8..42d23e755b21 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -186,7 +186,6 @@ import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.Point; -import android.graphics.PointF; import android.graphics.Rect; import android.graphics.Region; import android.hardware.configstore.V1_0.OptionalBool; @@ -7361,14 +7360,6 @@ public class WindowManagerService extends IWindowManager.Stub .setPointerIconType(PointerIcon.TYPE_DEFAULT); } } - - PointF getLatestMousePosition() { - synchronized (mMousePositionTracker) { - return new PointF(mMousePositionTracker.mLatestMouseX, - mMousePositionTracker.mLatestMouseY); - } - } - void setMousePointerDisplayId(int displayId) { mMousePositionTracker.setPointerDisplayId(displayId); } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index b4e2fb6ca3e3..dc43949984f0 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -308,6 +308,7 @@ public: void setMotionClassifierEnabled(bool enabled); std::optional getBluetoothAddress(int32_t deviceId); void setStylusButtonMotionEventsEnabled(bool enabled); + std::array getMouseCursorPosition(); /* --- InputReaderPolicyInterface implementation --- */ @@ -1655,6 +1656,16 @@ bool NativeInputManager::isPerDisplayTouchModeEnabled() { return static_cast(enabled); } +std::array NativeInputManager::getMouseCursorPosition() { + AutoMutex _l(mLock); + const auto pc = mLocked.pointerController.lock(); + if (!pc) return {{std::nanf(""), std::nanf("")}}; + + std::array p{}; + pc->getPosition(&p[0], &p[1]); + return p; +} + // ---------------------------------------------------------------------------- static NativeInputManager* getNativeInputManager(JNIEnv* env, jobject clazz) { @@ -2547,6 +2558,14 @@ static void nativeSetStylusButtonMotionEventsEnabled(JNIEnv* env, jobject native im->setStylusButtonMotionEventsEnabled(enabled); } +static jfloatArray nativeGetMouseCursorPosition(JNIEnv* env, jobject nativeImplObj) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + const std::array p = im->getMouseCursorPosition(); + jfloatArray outArr = env->NewFloatArray(2); + env->SetFloatArrayRegion(outArr, 0, p.size(), p.data()); + return outArr; +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -2640,6 +2659,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"getBluetoothAddress", "(I)Ljava/lang/String;", (void*)nativeGetBluetoothAddress}, {"setStylusButtonMotionEventsEnabled", "(Z)V", (void*)nativeSetStylusButtonMotionEventsEnabled}, + {"getMouseCursorPosition", "()[F", (void*)nativeGetMouseCursorPosition}, }; #define FIND_CLASS(var, className) \ -- cgit v1.2.3-59-g8ed1b From b5dadece430fce65b2698ac662c2ee4ff62a5997 Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Tue, 28 Feb 2023 17:43:09 +0000 Subject: Return values in PointerController's getters Rather than passing pointers in to get output from the functions, return values from getPosition() and getBounds(). Bug: 245989146 Bug: 21566609 Test: Build, presubmit Change-Id: Ie5b44a433c94b6c455486922f6894ccde1f1b127 --- libs/input/MouseCursorController.cpp | 58 ++++++++-------------- libs/input/MouseCursorController.h | 6 +-- libs/input/PointerController.cpp | 24 ++++----- libs/input/PointerController.h | 4 +- libs/input/PointerControllerContext.h | 2 +- libs/input/tests/PointerController_test.cpp | 6 +-- ...om_android_server_input_InputManagerService.cpp | 23 ++++----- 7 files changed, 51 insertions(+), 72 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/MouseCursorController.cpp b/libs/input/MouseCursorController.cpp index 24cfc9d70c9b..c3984055a278 100644 --- a/libs/input/MouseCursorController.cpp +++ b/libs/input/MouseCursorController.cpp @@ -63,24 +63,23 @@ MouseCursorController::~MouseCursorController() { mLocked.pointerSprite.clear(); } -bool MouseCursorController::getBounds(float* outMinX, float* outMinY, float* outMaxX, - float* outMaxY) const { +std::optional MouseCursorController::getBounds() const { std::scoped_lock lock(mLock); - return getBoundsLocked(outMinX, outMinY, outMaxX, outMaxY); + return getBoundsLocked(); } -bool MouseCursorController::getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, - float* outMaxY) const REQUIRES(mLock) { +std::optional MouseCursorController::getBoundsLocked() const REQUIRES(mLock) { if (!mLocked.viewport.isValid()) { - return false; + return {}; } - *outMinX = mLocked.viewport.logicalLeft; - *outMinY = mLocked.viewport.logicalTop; - *outMaxX = mLocked.viewport.logicalRight - 1; - *outMaxY = mLocked.viewport.logicalBottom - 1; - return true; + return FloatRect{ + static_cast(mLocked.viewport.logicalLeft), + static_cast(mLocked.viewport.logicalTop), + static_cast(mLocked.viewport.logicalRight - 1), + static_cast(mLocked.viewport.logicalBottom - 1), + }; } void MouseCursorController::move(float deltaX, float deltaY) { @@ -121,31 +120,19 @@ void MouseCursorController::setPosition(float x, float y) { } void MouseCursorController::setPositionLocked(float x, float y) REQUIRES(mLock) { - float minX, minY, maxX, maxY; - if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) { - if (x <= minX) { - mLocked.pointerX = minX; - } else if (x >= maxX) { - mLocked.pointerX = maxX; - } else { - mLocked.pointerX = x; - } - if (y <= minY) { - mLocked.pointerY = minY; - } else if (y >= maxY) { - mLocked.pointerY = maxY; - } else { - mLocked.pointerY = y; - } - updatePointerLocked(); - } + const auto bounds = getBoundsLocked(); + if (!bounds) return; + + mLocked.pointerX = std::max(bounds->left, std::min(bounds->right, x)); + mLocked.pointerY = std::max(bounds->top, std::min(bounds->bottom, y)); + + updatePointerLocked(); } -void MouseCursorController::getPosition(float* outX, float* outY) const { +FloatPoint MouseCursorController::getPosition() const { std::scoped_lock lock(mLock); - *outX = mLocked.pointerX; - *outY = mLocked.pointerY; + return {mLocked.pointerX, mLocked.pointerY}; } int32_t MouseCursorController::getDisplayId() const { @@ -235,10 +222,9 @@ void MouseCursorController::setDisplayViewport(const DisplayViewport& viewport, // Reset cursor position to center if size or display changed. if (oldViewport.displayId != viewport.displayId || oldDisplayWidth != newDisplayWidth || oldDisplayHeight != newDisplayHeight) { - float minX, minY, maxX, maxY; - if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) { - mLocked.pointerX = (minX + maxX) * 0.5f; - mLocked.pointerY = (minY + maxY) * 0.5f; + if (const auto bounds = getBoundsLocked(); bounds) { + mLocked.pointerX = (bounds->left + bounds->right) * 0.5f; + mLocked.pointerY = (bounds->top + bounds->bottom) * 0.5f; // Reload icon resources for density may be changed. loadResourcesLocked(getAdditionalMouseResources); } else { diff --git a/libs/input/MouseCursorController.h b/libs/input/MouseCursorController.h index db0ab56429b2..26be2a858c4e 100644 --- a/libs/input/MouseCursorController.h +++ b/libs/input/MouseCursorController.h @@ -43,12 +43,12 @@ public: MouseCursorController(PointerControllerContext& context); ~MouseCursorController(); - bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const; + std::optional getBounds() const; void move(float deltaX, float deltaY); void setButtonState(int32_t buttonState); int32_t getButtonState() const; void setPosition(float x, float y); - void getPosition(float* outX, float* outY) const; + FloatPoint getPosition() const; int32_t getDisplayId() const; void fade(PointerControllerInterface::Transition transition); void unfade(PointerControllerInterface::Transition transition); @@ -102,7 +102,7 @@ private: } mLocked GUARDED_BY(mLock); - bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const; + std::optional getBoundsLocked() const; void setPositionLocked(float x, float y); void updatePointerLocked(); diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index e748c692743d..544edc2a716f 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -114,16 +114,15 @@ PointerController::PointerController(const sp& PointerController::~PointerController() { mDisplayInfoListener->onPointerControllerDestroyed(); mUnregisterWindowInfosListener(mDisplayInfoListener); - mContext.getPolicy()->onPointerDisplayIdChanged(ADISPLAY_ID_NONE, 0, 0); + mContext.getPolicy()->onPointerDisplayIdChanged(ADISPLAY_ID_NONE, FloatPoint{0, 0}); } std::mutex& PointerController::getLock() const { return mDisplayInfoListener->mLock; } -bool PointerController::getBounds(float* outMinX, float* outMinY, float* outMaxX, - float* outMaxY) const { - return mCursorController.getBounds(outMinX, outMinY, outMaxX, outMaxY); +std::optional PointerController::getBounds() const { + return mCursorController.getBounds(); } void PointerController::move(float deltaX, float deltaY) { @@ -156,15 +155,13 @@ void PointerController::setPosition(float x, float y) { mCursorController.setPosition(transformed.x, transformed.y); } -void PointerController::getPosition(float* outX, float* outY) const { +FloatPoint PointerController::getPosition() const { const int32_t displayId = mCursorController.getDisplayId(); - mCursorController.getPosition(outX, outY); + const auto p = mCursorController.getPosition(); { std::scoped_lock lock(getLock()); const auto& transform = getTransformForDisplayLocked(displayId); - const auto xy = transform.inverse().transform(*outX, *outY); - *outX = xy.x; - *outY = xy.y; + return FloatPoint{transform.inverse().transform(p.x, p.y)}; } } @@ -264,7 +261,7 @@ void PointerController::reloadPointerResources() { void PointerController::setDisplayViewport(const DisplayViewport& viewport) { struct PointerDisplayChangeArgs { int32_t displayId; - float x, y; + FloatPoint cursorPosition; }; std::optional pointerDisplayChanged; @@ -278,18 +275,15 @@ void PointerController::setDisplayViewport(const DisplayViewport& viewport) { } mCursorController.setDisplayViewport(viewport, getAdditionalMouseResources); if (viewport.displayId != mLocked.pointerDisplayId) { - float xPos, yPos; - mCursorController.getPosition(&xPos, &yPos); mLocked.pointerDisplayId = viewport.displayId; - pointerDisplayChanged = {viewport.displayId, xPos, yPos}; + pointerDisplayChanged = {viewport.displayId, mCursorController.getPosition()}; } } // release lock if (pointerDisplayChanged) { // Notify the policy without holding the pointer controller lock. mContext.getPolicy()->onPointerDisplayIdChanged(pointerDisplayChanged->displayId, - pointerDisplayChanged->x, - pointerDisplayChanged->y); + pointerDisplayChanged->cursorPosition); } } diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 48d5a5756a69..6d3557c89cc7 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -50,12 +50,12 @@ public: ~PointerController() override; - virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const; + virtual std::optional getBounds() const; virtual void move(float deltaX, float deltaY); virtual void setButtonState(int32_t buttonState); virtual int32_t getButtonState() const; virtual void setPosition(float x, float y); - virtual void getPosition(float* outX, float* outY) const; + virtual FloatPoint getPosition() const; virtual int32_t getDisplayId() const; virtual void fade(Transition transition); virtual void unfade(Transition transition); diff --git a/libs/input/PointerControllerContext.h b/libs/input/PointerControllerContext.h index 96d83a5f0d15..f6f5d3bc51bd 100644 --- a/libs/input/PointerControllerContext.h +++ b/libs/input/PointerControllerContext.h @@ -81,7 +81,7 @@ public: virtual PointerIconStyle getDefaultPointerIconId() = 0; virtual PointerIconStyle getDefaultStylusIconId() = 0; virtual PointerIconStyle getCustomPointerIconId() = 0; - virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos) = 0; + virtual void onPointerDisplayIdChanged(int32_t displayId, const FloatPoint& position) = 0; }; /* diff --git a/libs/input/tests/PointerController_test.cpp b/libs/input/tests/PointerController_test.cpp index c820d0007a4b..2378d42793a1 100644 --- a/libs/input/tests/PointerController_test.cpp +++ b/libs/input/tests/PointerController_test.cpp @@ -60,7 +60,7 @@ public: virtual PointerIconStyle getDefaultPointerIconId() override; virtual PointerIconStyle getDefaultStylusIconId() override; virtual PointerIconStyle getCustomPointerIconId() override; - virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos) override; + virtual void onPointerDisplayIdChanged(int32_t displayId, const FloatPoint& position) override; bool allResourcesAreLoaded(); bool noResourcesAreLoaded(); @@ -143,8 +143,8 @@ void MockPointerControllerPolicyInterface::loadPointerIconForType(SpriteIcon* ic } void MockPointerControllerPolicyInterface::onPointerDisplayIdChanged(int32_t displayId, - float /*xPos*/, - float /*yPos*/) { + const FloatPoint& /*position*/ +) { latestPointerDisplayId = displayId; } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index dc43949984f0..da44da4f2838 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -308,7 +308,7 @@ public: void setMotionClassifierEnabled(bool enabled); std::optional getBluetoothAddress(int32_t deviceId); void setStylusButtonMotionEventsEnabled(bool enabled); - std::array getMouseCursorPosition(); + FloatPoint getMouseCursorPosition(); /* --- InputReaderPolicyInterface implementation --- */ @@ -367,7 +367,7 @@ public: virtual PointerIconStyle getDefaultPointerIconId(); virtual PointerIconStyle getDefaultStylusIconId(); virtual PointerIconStyle getCustomPointerIconId(); - virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos); + virtual void onPointerDisplayIdChanged(int32_t displayId, const FloatPoint& position); /* --- If touch mode is enabled per display or global --- */ @@ -731,11 +731,11 @@ std::shared_ptr NativeInputManager::obtainPointerCon return controller; } -void NativeInputManager::onPointerDisplayIdChanged(int32_t pointerDisplayId, float xPos, - float yPos) { +void NativeInputManager::onPointerDisplayIdChanged(int32_t pointerDisplayId, + const FloatPoint& position) { JNIEnv* env = jniEnv(); env->CallVoidMethod(mServiceObj, gServiceClassInfo.onPointerDisplayIdChanged, pointerDisplayId, - xPos, yPos); + position.x, position.y); checkAndClearExceptionFromCallback(env, "onPointerDisplayIdChanged"); } @@ -1656,14 +1656,12 @@ bool NativeInputManager::isPerDisplayTouchModeEnabled() { return static_cast(enabled); } -std::array NativeInputManager::getMouseCursorPosition() { +FloatPoint NativeInputManager::getMouseCursorPosition() { AutoMutex _l(mLock); const auto pc = mLocked.pointerController.lock(); - if (!pc) return {{std::nanf(""), std::nanf("")}}; + if (!pc) return {AMOTION_EVENT_INVALID_CURSOR_POSITION, AMOTION_EVENT_INVALID_CURSOR_POSITION}; - std::array p{}; - pc->getPosition(&p[0], &p[1]); - return p; + return pc->getPosition(); } // ---------------------------------------------------------------------------- @@ -2560,9 +2558,10 @@ static void nativeSetStylusButtonMotionEventsEnabled(JNIEnv* env, jobject native static jfloatArray nativeGetMouseCursorPosition(JNIEnv* env, jobject nativeImplObj) { NativeInputManager* im = getNativeInputManager(env, nativeImplObj); - const std::array p = im->getMouseCursorPosition(); + const auto p = im->getMouseCursorPosition(); + const std::array arr = {{p.x, p.y}}; jfloatArray outArr = env->NewFloatArray(2); - env->SetFloatArrayRegion(outArr, 0, p.size(), p.data()); + env->SetFloatArrayRegion(outArr, 0, arr.size(), arr.data()); return outArr; } -- cgit v1.2.3-59-g8ed1b From a21a549d88294715dffdc734d451835a3fbb540f Mon Sep 17 00:00:00 2001 From: Siarhei Vishniakou Date: Wed, 15 Mar 2023 09:29:53 -0700 Subject: Remove getButtonState/setButtonState from PointerController These APIs are not being used. Bug: 217579815 Test: m libinputservice_test Change-Id: I47fb5478caff7d77217c1da600c37556e6a288a8 --- libs/input/MouseCursorController.cpp | 18 ------------------ libs/input/MouseCursorController.h | 4 ---- libs/input/PointerController.cpp | 8 -------- libs/input/PointerController.h | 28 +++++++++++++--------------- 4 files changed, 13 insertions(+), 45 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/MouseCursorController.cpp b/libs/input/MouseCursorController.cpp index c3984055a278..c3ad7670d473 100644 --- a/libs/input/MouseCursorController.cpp +++ b/libs/input/MouseCursorController.cpp @@ -53,8 +53,6 @@ MouseCursorController::MouseCursorController(PointerControllerContext& context) mLocked.resolvedPointerType = PointerIconStyle::TYPE_NOT_SPECIFIED; mLocked.resourcesLoaded = false; - - mLocked.buttonState = 0; } MouseCursorController::~MouseCursorController() { @@ -95,22 +93,6 @@ void MouseCursorController::move(float deltaX, float deltaY) { setPositionLocked(mLocked.pointerX + deltaX, mLocked.pointerY + deltaY); } -void MouseCursorController::setButtonState(int32_t buttonState) { -#if DEBUG_MOUSE_CURSOR_UPDATES - ALOGD("Set button state 0x%08x", buttonState); -#endif - std::scoped_lock lock(mLock); - - if (mLocked.buttonState != buttonState) { - mLocked.buttonState = buttonState; - } -} - -int32_t MouseCursorController::getButtonState() const { - std::scoped_lock lock(mLock); - return mLocked.buttonState; -} - void MouseCursorController::setPosition(float x, float y) { #if DEBUG_MOUSE_CURSOR_UPDATES ALOGD("Set pointer position to x=%0.3f, y=%0.3f", x, y); diff --git a/libs/input/MouseCursorController.h b/libs/input/MouseCursorController.h index 26be2a858c4e..00dc0854440e 100644 --- a/libs/input/MouseCursorController.h +++ b/libs/input/MouseCursorController.h @@ -45,8 +45,6 @@ public: std::optional getBounds() const; void move(float deltaX, float deltaY); - void setButtonState(int32_t buttonState); - int32_t getButtonState() const; void setPosition(float x, float y); FloatPoint getPosition() const; int32_t getDisplayId() const; @@ -96,8 +94,6 @@ private: PointerIconStyle requestedPointerType; PointerIconStyle resolvedPointerType; - int32_t buttonState; - bool animating{false}; } mLocked GUARDED_BY(mLock); diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 544edc2a716f..88e351963148 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -136,14 +136,6 @@ void PointerController::move(float deltaX, float deltaY) { mCursorController.move(transformed.x, transformed.y); } -void PointerController::setButtonState(int32_t buttonState) { - mCursorController.setButtonState(buttonState); -} - -int32_t PointerController::getButtonState() const { - return mCursorController.getButtonState(); -} - void PointerController::setPosition(float x, float y) { const int32_t displayId = mCursorController.getDisplayId(); vec2 transformed; diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 6d3557c89cc7..ca14b6e9bfdc 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -50,21 +50,19 @@ public: ~PointerController() override; - virtual std::optional getBounds() const; - virtual void move(float deltaX, float deltaY); - virtual void setButtonState(int32_t buttonState); - virtual int32_t getButtonState() const; - virtual void setPosition(float x, float y); - virtual FloatPoint getPosition() const; - virtual int32_t getDisplayId() const; - virtual void fade(Transition transition); - virtual void unfade(Transition transition); - virtual void setDisplayViewport(const DisplayViewport& viewport); - - virtual void setPresentation(Presentation presentation); - virtual void setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex, - BitSet32 spotIdBits, int32_t displayId); - virtual void clearSpots(); + std::optional getBounds() const override; + void move(float deltaX, float deltaY) override; + void setPosition(float x, float y) override; + FloatPoint getPosition() const override; + int32_t getDisplayId() const override; + void fade(Transition transition) override; + void unfade(Transition transition) override; + void setDisplayViewport(const DisplayViewport& viewport) override; + + void setPresentation(Presentation presentation) override; + void setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex, + BitSet32 spotIdBits, int32_t displayId) override; + void clearSpots() override; void updatePointerIcon(PointerIconStyle iconId); void setCustomPointerIcon(const SpriteIcon& icon); -- cgit v1.2.3-59-g8ed1b From 8e47a6767140d067ccc9f9b41d62ff6f924de3ed Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Mon, 1 May 2023 11:30:37 -0500 Subject: Add vsync id and timestamp to WindowInfosListener Bug: 279792237 Test: presubmits Change-Id: I6396800fe7673f592a79c0e9a9f43f68c6443300 --- core/jni/android_window_WindowInfosListener.cpp | 10 ++++++---- libs/input/PointerController.cpp | 5 ++--- libs/input/PointerController.h | 4 ++-- libs/input/tests/PointerController_test.cpp | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/core/jni/android_window_WindowInfosListener.cpp b/core/jni/android_window_WindowInfosListener.cpp index 850755a62fa6..55995df299b0 100644 --- a/core/jni/android_window_WindowInfosListener.cpp +++ b/core/jni/android_window_WindowInfosListener.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -91,8 +92,7 @@ struct WindowInfosListener : public gui::WindowInfosListener { WindowInfosListener(JNIEnv* env, jobject listener) : mListener(env->NewWeakGlobalRef(listener)) {} - void onWindowInfosChanged(const std::vector& windowInfos, - const std::vector& displayInfos) override { + void onWindowInfosChanged(const gui::WindowInfosUpdate& update) override { JNIEnv* env = AndroidRuntime::getJNIEnv(); LOG_ALWAYS_FATAL_IF(env == nullptr, "Unable to retrieve JNIEnv in onWindowInfoChanged."); @@ -103,8 +103,10 @@ struct WindowInfosListener : public gui::WindowInfosListener { return; } - ScopedLocalRef jWindowHandlesArray(env, fromWindowInfos(env, windowInfos)); - ScopedLocalRef jDisplayInfoArray(env, fromDisplayInfos(env, displayInfos)); + ScopedLocalRef jWindowHandlesArray(env, + fromWindowInfos(env, update.windowInfos)); + ScopedLocalRef jDisplayInfoArray(env, + fromDisplayInfos(env, update.displayInfos)); env->CallVoidMethod(listener, gListenerClassInfo.onWindowInfosChanged, jWindowHandlesArray.get(), jDisplayInfoArray.get()); diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 88e351963148..e21d6fb2fe14 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -45,14 +45,13 @@ const ui::Transform kIdentityTransform; // --- PointerController::DisplayInfoListener --- void PointerController::DisplayInfoListener::onWindowInfosChanged( - const std::vector&, - const std::vector& displayInfos) { + const gui::WindowInfosUpdate& update) { std::scoped_lock lock(mLock); if (mPointerController == nullptr) return; // PointerController uses DisplayInfoListener's lock. base::ScopedLockAssertion assumeLocked(mPointerController->getLock()); - mPointerController->onDisplayInfosChangedLocked(displayInfos); + mPointerController->onDisplayInfosChangedLocked(update.displayInfos); } void PointerController::DisplayInfoListener::onPointerControllerDestroyed() { diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index ca14b6e9bfdc..62ee74331302 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -114,8 +115,7 @@ private: class DisplayInfoListener : public gui::WindowInfosListener { public: explicit DisplayInfoListener(PointerController* pc) : mPointerController(pc){}; - void onWindowInfosChanged(const std::vector&, - const std::vector&) override; + void onWindowInfosChanged(const gui::WindowInfosUpdate&) override; void onPointerControllerDestroyed(); // This lock is also used by PointerController. See PointerController::getLock(). diff --git a/libs/input/tests/PointerController_test.cpp b/libs/input/tests/PointerController_test.cpp index 2378d42793a1..85747514aa03 100644 --- a/libs/input/tests/PointerController_test.cpp +++ b/libs/input/tests/PointerController_test.cpp @@ -343,7 +343,7 @@ TEST_F(PointerControllerWindowInfoListenerTest, localListenerCopy = registeredListener; } EXPECT_EQ(nullptr, registeredListener) << "WindowInfosListener was not unregistered"; - localListenerCopy->onWindowInfosChanged({}, {}); + localListenerCopy->onWindowInfosChanged({{}, {}, 0, 0}); } } // namespace android -- cgit v1.2.3-59-g8ed1b