From 12cc70a51ab544fad20b65d59e2596bbdb736356 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 23 Mar 2025 07:06:45 -0500 Subject: [PATCH] Confetti: Always emit from checkmark, not popup button --- .../activities/common/dialogs/CheckmarkDialog.kt | 6 ++---- .../activities/common/dialogs/NumberDialog.kt | 4 ++-- .../activities/habits/list/ListHabitsActivity.kt | 2 +- .../activities/habits/list/ListHabitsScreen.kt | 5 +++-- .../activities/habits/list/views/HabitCardView.kt | 14 ++++++++++---- .../activities/habits/show/ShowHabitActivity.kt | 4 ++-- .../ui/screens/habits/list/ListHabitsBehavior.kt | 14 +++++--------- .../ui/screens/habits/show/views/HistoryCard.kt | 4 ++-- .../screens/habits/list/ListHabitsBehaviorTest.kt | 4 ++-- 9 files changed, 29 insertions(+), 28 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkDialog.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkDialog.kt index 13e5f55f6..5bebfb08d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkDialog.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkDialog.kt @@ -33,11 +33,10 @@ import org.isoron.uhabits.core.models.Entry.Companion.UNKNOWN import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL import org.isoron.uhabits.databinding.CheckmarkPopupBinding import org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome -import org.isoron.uhabits.utils.getCenter import org.isoron.uhabits.utils.sres class CheckmarkDialog : AppCompatDialogFragment() { - var onToggle: (Int, String, Float, Float) -> Unit = { _, _, _, _ -> } + var onToggle: (Int, String) -> Unit = { _, _ -> } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val appComponent = (requireActivity().application as HabitsApplication).component @@ -64,8 +63,7 @@ class CheckmarkDialog : AppCompatDialogFragment() { } fun onClick(v: Int) { val notes = view.notes.text.toString().trim() - val location = view.yesBtn.getCenter() - onToggle(v, notes, location.x, location.y) + onToggle(v, notes) requireDialog().dismiss() } view.yesBtn.setOnClickListener { onClick(YES_MANUAL) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberDialog.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberDialog.kt index 81eb53d21..4025bc2e6 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberDialog.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberDialog.kt @@ -25,7 +25,7 @@ import java.text.ParseException class NumberDialog : AppCompatDialogFragment() { - var onToggle: (Double, String, Float, Float) -> Unit = { _, _, _, _ -> } + var onToggle: (Double, String) -> Unit = { _, _ -> } var onDismiss: () -> Unit = {} private var originalNotes: String = "" @@ -122,7 +122,7 @@ class NumberDialog : AppCompatDialogFragment() { } val notes = view.notes.text.toString() val location = view.saveBtn.getCenter() - onToggle(value, notes, location.x, location.y) + onToggle(value, notes) requireDialog().dismiss() } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index d16f7d702..d4e2ffa69 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -180,7 +180,7 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { val timestamp = intent.extras?.getLong("timestamp") if (habitId != null && timestamp != null) { val habit = appComponent.habitList.getById(habitId)!! - component.listHabitsBehavior.onEdit(habit, Timestamp(timestamp)) + component.listHabitsBehavior.onEdit(habit, Timestamp(timestamp), 0f, 0f) } } intent = null diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index c12939b1e..074f22f75 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -224,6 +224,7 @@ class ListHabitsScreen } override fun showConfetti(color: PaletteColor, x: Float, y: Float) { + if (x == 0f && y == 0f) return if (preferences.isConfettiAnimationDisabled) return val baseColor = themeSwitcher.currentTheme!!.color(color).toInt() rootView.get().konfettiView.start( @@ -268,7 +269,7 @@ class ListHabitsScreen putDouble("value", value) putString("notes", notes) } - dialog.onToggle = { v, n, x, y -> callback.onNumberPicked(v, n, x, y) } + dialog.onToggle = { v, n -> callback.onNumberPicked(v, n) } dialog.dismissCurrentAndShow(fm, "numberDialog") } @@ -286,7 +287,7 @@ class ListHabitsScreen putInt("value", selectedValue) putString("notes", notes) } - dialog.onToggle = { v, n, x, y -> callback.onNotesSaved(v, n, x, y) } + dialog.onToggle = { v, n -> callback.onNotesSaved(v, n) } dialog.dismissCurrentAndShow(fm, "checkmarkDialog") } 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 e06751274..eea1244eb 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 @@ -169,7 +169,8 @@ class HabitCardView( } onEdit = { timestamp -> triggerRipple(timestamp) - habit?.let { behavior.onEdit(it, timestamp) } + val location = getAbsoluteButtonLocation(timestamp) + habit?.let { behavior.onEdit(it, timestamp, location.x, location.y) } } } @@ -177,7 +178,8 @@ class HabitCardView( visibility = GONE onEdit = { timestamp -> triggerRipple(timestamp) - habit?.let { behavior.onEdit(it, timestamp) } + val location = getAbsoluteButtonLocation(timestamp) + habit?.let { behavior.onEdit(it, timestamp, location.x, location.y) } } } @@ -224,9 +226,13 @@ class HabitCardView( private fun getRelativeButtonLocation(timestamp: Timestamp): PointF { val today = DateUtils.getTodayWithOffset() val offset = timestamp.daysUntil(today) - dataOffset - val button = checkmarkPanel.buttons[offset] + val panel = when (habit!!.isNumerical) { + true -> numberPanel + false -> checkmarkPanel + } + val button = panel.buttons[offset] val y = button.height / 2.0f - val x = checkmarkPanel.x + button.x + (button.width / 2).toFloat() + val x = panel.x + button.x + (button.width / 2).toFloat() return PointF(x, y) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt index a7d07db53..fb7e3382c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt @@ -181,7 +181,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { putDouble("value", value) putString("notes", notes) } - dialog.onToggle = { v, n, x, y -> callback.onNumberPicked(v, n, x, y) } + dialog.onToggle = { v, n -> callback.onNumberPicked(v, n) } dialog.dismissCurrentAndShow(supportFragmentManager, "numberDialog") } @@ -198,7 +198,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { putInt("value", selectedValue) putString("notes", notes) } - dialog.onToggle = { v, n, x, y -> callback.onNotesSaved(v, n, x, y) } + dialog.onToggle = { v, n -> callback.onNotesSaved(v, n) } dialog.dismissCurrentAndShow(supportFragmentManager, "checkmarkDialog") } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt index b66b08be6..e412d04d1 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt @@ -51,11 +51,11 @@ open class ListHabitsBehavior @Inject constructor( screen.showHabitScreen(h) } - fun onEdit(habit: Habit, timestamp: Timestamp?) { + fun onEdit(habit: Habit, timestamp: Timestamp?, x: Float, y: Float) { val entry = habit.computedEntries.get(timestamp!!) if (habit.type == HabitType.NUMERICAL) { val oldValue = entry.value.toDouble() / 1000 - screen.showNumberPopup(oldValue, entry.notes) { newValue: Double, newNotes: String, x: Float, y: Float -> + screen.showNumberPopup(oldValue, entry.notes) { newValue: Double, newNotes: String -> val value = (newValue * 1000).roundToInt() if (newValue != oldValue) { if ( @@ -72,7 +72,7 @@ open class ListHabitsBehavior @Inject constructor( entry.value, entry.notes, habit.color - ) { newValue: Int, newNotes: String, x: Float, y: Float -> + ) { newValue: Int, newNotes: String -> if (newValue != entry.value && newValue == YES_MANUAL) screen.showConfetti(habit.color, x, y) commandRunner.run(CreateRepetitionCommand(habitList, habit, timestamp, newValue, newNotes)) } @@ -159,9 +159,7 @@ open class ListHabitsBehavior @Inject constructor( fun interface NumberPickerCallback { fun onNumberPicked( newValue: Double, - notes: String, - x: Float, - y: Float + notes: String ) fun onNumberPickerDismissed() {} } @@ -169,9 +167,7 @@ open class ListHabitsBehavior @Inject constructor( fun interface CheckMarkDialogCallback { fun onNotesSaved( value: Int, - notes: String, - x: Float, - y: Float + notes: String ) fun onNotesDismissed() {} } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt index 0a28c801f..cfbe5e0f3 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt @@ -98,7 +98,7 @@ class HistoryCardPresenter( entry.value, entry.notes, habit.color - ) { newValue, newNotes, _: Float, _: Float -> + ) { newValue, newNotes -> commandRunner.run( CreateRepetitionCommand( habitList, @@ -135,7 +135,7 @@ class HistoryCardPresenter( screen.showNumberPopup( value = oldValue / 1000.0, notes = entry.notes - ) { newValue: Double, newNotes: String, _: Float, _: Float -> + ) { newValue: Double, newNotes: String -> val thousands = (newValue * 1000).roundToInt() commandRunner.run( CreateRepetitionCommand( diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt index 26dd82df8..19f49a8a4 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt @@ -78,13 +78,13 @@ class ListHabitsBehaviorTest : BaseUnitTest() { @Test fun testOnEdit() { - behavior.onEdit(habit2, getToday()) + behavior.onEdit(habit2, getToday(), 0f, 0f) verify(screen).showNumberPopup( eq(0.1), eq(""), picker.capture() ) - picker.lastValue.onNumberPicked(100.0, "", 0f, 0f) + picker.lastValue.onNumberPicked(100.0, "") val today = getTodayWithOffset() assertThat(habit2.computedEntries.get(today).value, equalTo(100000)) }