diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index 34479beb6..551cb73c3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -36,7 +36,6 @@ import android.widget.TextView import org.isoron.platform.gui.toInt import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.RingView -import org.isoron.uhabits.activities.habits.list.views.HabitCardView.Companion.delay import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.ModelObservable import org.isoron.uhabits.core.models.Timestamp @@ -58,6 +57,12 @@ class HabitCardViewFactory fun create() = HabitCardView(context, checkmarkPanelFactory, numberPanelFactory, behavior) } +data class DelayedToggle( + var habit: Habit, + var timestamp: Timestamp, + var value: Int +) + class HabitCardView( @ActivityContext context: Context, checkmarkPanelFactory: CheckmarkPanelViewFactory, @@ -129,6 +134,9 @@ class HabitCardView( private var label: TextView private var scoreRing: RingView + private var currentToggleTaskId = 0 + private var queuedToggles = mutableListOf() + init { scoreRing = RingView(context).apply { val thickness = dp(3f) @@ -152,9 +160,8 @@ class HabitCardView( onToggle = { timestamp, value -> triggerRipple(timestamp) habit?.let { - { - behavior.onToggle(it, timestamp, value) - }.delay(TOGGLE_DELAY_MILLIS) + val taskId = queueToggle(it, timestamp, value); + { runPendingToggles(taskId) }.delay(TOGGLE_DELAY_MILLIS) } } onEdit = { timestamp -> @@ -195,6 +202,24 @@ class HabitCardView( addView(innerFrame) } + @Synchronized + private fun runPendingToggles(id: Int) { + if (currentToggleTaskId != id) return + for ((h, t, v) in queuedToggles) behavior.onToggle(h, t, v) + queuedToggles.clear() + } + + @Synchronized + private fun queueToggle( + it: Habit, + timestamp: Timestamp, + value: Int + ): Int { + currentToggleTaskId += 1 + queuedToggles.add(DelayedToggle(it, timestamp, value)) + return currentToggleTaskId + } + override fun onModelChange() { Handler(Looper.getMainLooper()).post { habit?.let { copyAttributesFrom(it) }