Skip to content

Commit 378d12e

Browse files
authored
fix(android): clean up polyline animator on view drop (#72)
Notify GoogleMapProvider from LuggPolylineView.onDropViewInstance so the PolylineAnimator (and its infinite-repeat ValueAnimator) gets cancelled even when the view is dropped without going through removeViewAt. Also guards addPolylineViewToMap against an already-registered animator entry and drops a per-frame ArrayList copy in updateAnimatedPolyline.
1 parent a07f01b commit 378d12e

3 files changed

Lines changed: 15 additions & 4 deletions

File tree

android/src/main/java/com/luggmaps/LuggPolylineView.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.google.android.gms.maps.model.Polyline
88

99
interface LuggPolylineViewDelegate {
1010
fun polylineViewDidUpdate(polylineView: LuggPolylineView)
11+
fun polylineViewDidDrop(polylineView: LuggPolylineView)
1112
}
1213

1314
data class AnimatedOptions(val duration: Long = 2150L, val easing: String = "linear", val trailLength: Float = 1f, val delay: Long = 0L)
@@ -67,8 +68,8 @@ class LuggPolylineView(context: Context) : ReactViewGroup(context) {
6768
}
6869

6970
fun onDropViewInstance() {
71+
delegate?.polylineViewDidDrop(this)
7072
delegate = null
71-
polyline?.remove()
7273
polyline = null
7374
}
7475
}

android/src/main/java/com/luggmaps/core/GoogleMapProvider.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,10 @@ class GoogleMapProvider(private val context: Context) :
598598
syncPolylineView(polylineView)
599599
}
600600

601+
override fun polylineViewDidDrop(polylineView: LuggPolylineView) {
602+
teardownPolyline(polylineView)
603+
}
604+
601605
// endregion
602606

603607
// region PolygonViewDelegate
@@ -773,8 +777,12 @@ class GoogleMapProvider(private val context: Context) :
773777
}
774778

775779
override fun removePolylineView(polylineView: LuggPolylineView) {
776-
polylineAnimators[polylineView]?.destroy()
777-
polylineAnimators.remove(polylineView)
780+
teardownPolyline(polylineView)
781+
}
782+
783+
private fun teardownPolyline(polylineView: LuggPolylineView) {
784+
pendingPolylineViews.remove(polylineView)
785+
polylineAnimators.remove(polylineView)?.destroy()
778786
polylineView.polyline?.remove()
779787
polylineView.polyline = null
780788
}
@@ -812,6 +820,8 @@ class GoogleMapProvider(private val context: Context) :
812820
private fun addPolylineViewToMap(polylineView: LuggPolylineView) {
813821
val map = googleMap ?: return
814822

823+
polylineAnimators.remove(polylineView)?.destroy()
824+
815825
val options = PolylineOptions()
816826
.width(polylineView.strokeWidth.dpToPx())
817827
.zIndex(polylineView.zIndex)

android/src/main/java/com/luggmaps/core/PolylineAnimator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ class PolylineAnimator {
249249
// Clear spans before setting points to prevent IndexOutOfBoundsException
250250
// when the new points list is shorter than what existing spans reference
251251
poly.color = strokeColors.firstOrNull() ?: Color.BLACK
252-
poly.points = ArrayList(reusablePoints)
252+
poly.points = reusablePoints
253253

254254
if (strokeColors.size > 1) {
255255
val segmentCount = reusablePoints.size - 1

0 commit comments

Comments
 (0)