Skip to content

Commit

Permalink
[viewport] Fix camera jump when default transition is canceled.
Browse files Browse the repository at this point in the history
  • Loading branch information
pengdev committed Apr 6, 2022
1 parent 274236e commit 7b41c98
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.mapbox.maps.plugin.viewport.transition
import android.animation.Animator
import android.animation.AnimatorSet
import android.animation.ValueAnimator
import androidx.core.animation.doOnEnd
import com.mapbox.maps.CameraOptions
import com.mapbox.maps.CameraState
import com.mapbox.maps.ScreenCoordinate
Expand Down Expand Up @@ -93,7 +92,29 @@ internal class DefaultViewportTransitionImpl(
}
initialAnimatorSet.childAnimations.forEach {
val cameraAnimator = it as CameraAnimator<*>
cameraAnimator.doOnEnd { completedChildAnimators.add(cameraAnimator.type) }
cameraAnimator.addListener(
object : Animator.AnimatorListener {
private var isCanceled = false
override fun onAnimationStart(p0: Animator?) {
// no-ops
}

override fun onAnimationEnd(p0: Animator?) {
if(!isCanceled) {
completedChildAnimators.add(cameraAnimator.type)
}
}

override fun onAnimationCancel(p0: Animator?) {
isCanceled = true
}

override fun onAnimationRepeat(p0: Animator?) {
// no-ops
}

}
)
}
startAnimation(initialAnimatorSet, instant = false)
animatorSet = initialAnimatorSet
Expand All @@ -102,6 +123,7 @@ internal class DefaultViewportTransitionImpl(
}
return Cancelable {
isCancelableCalled = true
keepObserving = false
cancelAnimation()
cancelable.cancel()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,13 @@ class DefaultViewportTransitionImplTest {
animatorListenerSlot.captured.onAnimationEnd(animator)
assertTrue(dataObserverSlot.captured.onNewData(cameraOptions))
verify(exactly = 1) { animator.setObjectValues(0.0, 0.0) }
verify { mapCameraManagerDelegate.setCamera(cameraOptions { bearing(cameraOptions.bearing) }) }
verify(exactly = 1) { mapCameraManagerDelegate.setCamera(cameraOptions { bearing(cameraOptions.bearing) }) }

// try to notify if animation is finished successfully
animatorSetListenerSlot.captured.onAnimationEnd(mockk())
// should stop observing data source and return false
assertFalse(dataObserverSlot.captured.onNewData(cameraOptions))
verify(exactly = 2) { mapCameraManagerDelegate.setCamera(cameraOptions { bearing(cameraOptions.bearing) }) }
// verify cleanup
verify { cameraPlugin.unregisterAnimators(animator) }
verify { completionListener.onComplete(true) }
Expand Down Expand Up @@ -160,8 +161,11 @@ class DefaultViewportTransitionImplTest {
verify { cancelable.cancel() }
animatorSetListenerSlot.captured.onAnimationCancel(animator)
animatorSetListenerSlot.captured.onAnimationEnd(animator)
animatorListenerSlot.captured.onAnimationCancel(animator)
animatorListenerSlot.captured.onAnimationEnd(animator)
// should stop observing data source and return false
assertFalse(dataObserverSlot.captured.onNewData(cameraOptions))
verify(exactly = 0) { mapCameraManagerDelegate.setCamera(cameraOptions { bearing(cameraOptions.bearing) }) }
verify { cameraPlugin.unregisterAnimators(animator) }
verify { cameraPlugin.anchor = cachedAnchor }
}
Expand Down

0 comments on commit 7b41c98

Please sign in to comment.