diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2020-08-20 16:23:10 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-08-20 16:23:10 +0000 |
commit | 5267d9227289a074aa4c4a972586d182ce4c76a5 (patch) | |
tree | f0ec76f25f4a69dd2e3dfe510c932e482ce906b5 /libs/input/MouseCursorController.cpp | |
parent | 525ed1c275ce445093448566eb72a55a1bdf939c (diff) | |
parent | 51060f3f7a322d8b670c434a962f5f1095bdf14d (diff) |
Merge "Switch to callback animation" am: 51060f3f7a
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1399752
Change-Id: I48d71f9f156430fc62016e2cdc8fcd2498a3363b
Diffstat (limited to 'libs/input/MouseCursorController.cpp')
-rw-r--r-- | libs/input/MouseCursorController.cpp | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/libs/input/MouseCursorController.cpp b/libs/input/MouseCursorController.cpp index 80b555be97dd..45da008c3e8e 100644 --- a/libs/input/MouseCursorController.cpp +++ b/libs/input/MouseCursorController.cpp @@ -168,7 +168,7 @@ void MouseCursorController::fade(PointerControllerInterface::Transition transiti updatePointerLocked(); } else { mLocked.pointerFadeDirection = -1; - mContext.startAnimation(); + startAnimationLocked(); } } @@ -185,7 +185,7 @@ void MouseCursorController::unfade(PointerControllerInterface::Transition transi updatePointerLocked(); } else { mLocked.pointerFadeDirection = 1; - mContext.startAnimation(); + startAnimationLocked(); } } @@ -312,10 +312,9 @@ void MouseCursorController::setCustomPointerIcon(const SpriteIcon& icon) { updatePointerLocked(); } -bool MouseCursorController::doFadingAnimation(nsecs_t timestamp, bool keepAnimating) { +bool MouseCursorController::doFadingAnimationLocked(nsecs_t timestamp) REQUIRES(mLock) { nsecs_t frameDelay = timestamp - mContext.getAnimationTime(); - - std::scoped_lock lock(mLock); + bool keepAnimating = false; // Animate pointer fade. if (mLocked.pointerFadeDirection < 0) { @@ -337,13 +336,10 @@ bool MouseCursorController::doFadingAnimation(nsecs_t timestamp, bool keepAnimat } updatePointerLocked(); } - return keepAnimating; } -bool MouseCursorController::doBitmapAnimation(nsecs_t timestamp) { - std::scoped_lock lock(mLock); - +bool MouseCursorController::doBitmapAnimationLocked(nsecs_t timestamp) REQUIRES(mLock) { std::map<int32_t, PointerAnimation>::const_iterator iter = mLocked.animationResources.find(mLocked.requestedPointerType); if (iter == mLocked.animationResources.end()) { @@ -364,7 +360,6 @@ bool MouseCursorController::doBitmapAnimation(nsecs_t timestamp) { spriteController->closeTransaction(); } - // Keep animating. return true; } @@ -399,7 +394,7 @@ void MouseCursorController::updatePointerLocked() REQUIRES(mLock) { if (anim_iter != mLocked.animationResources.end()) { mLocked.animationFrameIndex = 0; mLocked.lastFrameUpdatedTime = systemTime(SYSTEM_TIME_MONOTONIC); - mContext.startAnimation(); + startAnimationLocked(); } mLocked.pointerSprite->setIcon(iter->second); } else { @@ -457,4 +452,38 @@ bool MouseCursorController::resourcesLoaded() { return mLocked.resourcesLoaded; } +bool MouseCursorController::doAnimations(nsecs_t timestamp) { + std::scoped_lock lock(mLock); + bool keepFading = doFadingAnimationLocked(timestamp); + bool keepBitmap = doBitmapAnimationLocked(timestamp); + bool keepAnimating = keepFading || keepBitmap; + if (!keepAnimating) { + /* + * We know that this callback will be removed before another + * is added. mLock in PointerAnimator will not be released + * until after this is removed, and adding another callback + * requires that lock. Thus it's safe to set mLocked.animating + * here. + */ + mLocked.animating = false; + } + return keepAnimating; +} + +void MouseCursorController::startAnimationLocked() REQUIRES(mLock) { + using namespace std::placeholders; + + if (mLocked.animating) { + return; + } + mLocked.animating = true; + + std::function<bool(nsecs_t)> func = std::bind(&MouseCursorController::doAnimations, this, _1); + /* + * Using -1 for displayId here to avoid removing the callback + * if a TouchSpotController with the same display is removed. + */ + mContext.addAnimationCallback(-1, func); +} + } // namespace android |