From 3787bc9cda08749a5fe92a50ea8b4b4ba9b4100e Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Thu, 17 May 2018 12:41:17 -0400 Subject: [PATCH 1/3] Added gesture listeners to NumberButtonView --- .../habits/list/views/NumberButtonView.kt | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 53defd457..411300ab9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -21,7 +21,9 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.* import android.graphics.* +import android.support.v4.view.GestureDetectorCompat import android.text.* +import android.util.Log import android.view.* import android.view.View.* import com.google.auto.factory.* @@ -53,9 +55,7 @@ fun Double.toShortString(): String = when { class NumberButtonView( @Provided @ActivityContext context: Context, @Provided val preferences: Preferences -) : View(context), - OnClickListener, - OnLongClickListener { +) : View(context) { var color = 0 set(value) { @@ -83,21 +83,29 @@ class NumberButtonView( var onEdit: () -> Unit = {} private var drawer: Drawer = Drawer(context) - - init { - setOnClickListener(this) - setOnLongClickListener(this) - } - - override fun onClick(v: View) { - if (preferences.isShortToggleEnabled) onEdit() - else showMessage(R.string.long_press_to_edit) - } - - override fun onLongClick(v: View): Boolean { - onEdit() - return true - } + private val detector: GestureDetector = GestureDetector( + context, + object: GestureDetector.SimpleOnGestureListener() + { + override fun onDown(e: MotionEvent?): Boolean = true + + override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { + Log.d("YOUREIT", "onSingleTapConfirmed") + if (preferences.isShortToggleEnabled) onEdit() + else showMessage(R.string.long_press_to_edit) + return true + } + + override fun onDoubleTap(e: MotionEvent?): Boolean { + Log.d("YOUREIT", "onDoubleTap") + return true + } + + override fun onLongPress(e: MotionEvent?) { + Log.d("YOUREIT", "onLongPress") + onEdit() + } + }) override fun onDraw(canvas: Canvas) { super.onDraw(canvas) @@ -110,6 +118,11 @@ class NumberButtonView( setMeasuredDimension(width, height) } + override fun onTouchEvent(event: MotionEvent?): Boolean { + detector.onTouchEvent(event) + return true + } + private inner class Drawer(context: Context) { private val em: Float From f1d9a019dd1f643b120555ca5217dbbe62358281 Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Thu, 17 May 2018 17:02:38 -0400 Subject: [PATCH 2/3] Increment and decrement gestures from HabitList --- .../habits/list/views/HabitCardView.kt | 8 ++++++++ .../habits/list/views/NumberButtonView.kt | 12 ++++++----- .../habits/list/views/NumberPanelView.kt | 14 +++++++++++++ .../habits/list/ListHabitsBehavior.java | 20 +++++++++++++++++++ 4 files changed, 49 insertions(+), 5 deletions(-) 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 f6adfcc16..75ec8da31 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 @@ -129,6 +129,14 @@ class HabitCardView( numberPanel = numberPanelFactory.create().apply { visibility = GONE + onIncrement = { timestamp -> + triggerRipple(timestamp) + habit?.let { behavior.onIncrement(it, timestamp)} + } + onDecrement = { timestamp -> + triggerRipple(timestamp) + habit?.let { behavior.onDecrement(it, timestamp)} + } onEdit = { timestamp -> triggerRipple(timestamp) habit?.let { behavior.onEdit(it, timestamp) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 411300ab9..81b8cdd63 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -81,6 +81,8 @@ class NumberButtonView( invalidate() } + var onIncrement: () -> Unit = {} + var onDecrement: () -> Unit = {} var onEdit: () -> Unit = {} private var drawer: Drawer = Drawer(context) private val detector: GestureDetector = GestureDetector( @@ -90,19 +92,19 @@ class NumberButtonView( override fun onDown(e: MotionEvent?): Boolean = true override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { - Log.d("YOUREIT", "onSingleTapConfirmed") - if (preferences.isShortToggleEnabled) onEdit() - else showMessage(R.string.long_press_to_edit) + onIncrement() + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) return true } override fun onDoubleTap(e: MotionEvent?): Boolean { - Log.d("YOUREIT", "onDoubleTap") + onDecrement() + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) return true } override fun onLongPress(e: MotionEvent?) { - Log.d("YOUREIT", "onLongPress") + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) onEdit() } }) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt index 81b082209..e103e8db8 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt @@ -57,6 +57,18 @@ class NumberPanelView( setupButtons() } + var onIncrement: (Timestamp) -> Unit = {} + set(value) { + field = value + setupButtons() + } + + var onDecrement: (Timestamp) -> Unit = {} + set(value) { + field = value + setupButtons() + } + var onEdit: (Timestamp) -> Unit = {} set(value) { field = value @@ -78,6 +90,8 @@ class NumberPanelView( button.color = color button.threshold = threshold button.units = units + button.onIncrement = { onIncrement(timestamp) } + button.onDecrement = { onDecrement(timestamp) } button.onEdit = { onEdit(timestamp) } } } diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java index 45dcc18f1..87b3608b0 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java @@ -78,6 +78,26 @@ public class ListHabitsBehavior screen.showHabitScreen(h); } + public void onIncrement(@NonNull Habit habit, Timestamp timestamp) + { + CheckmarkList checkmarks = habit.getCheckmarks(); + double oldValue = checkmarks.getValues(timestamp, timestamp)[0]; + commandRunner.execute( + new CreateRepetitionCommand(habit, timestamp, (int)(oldValue + 1000)), + habit.getId()); + } + + public void onDecrement(@NonNull Habit habit, Timestamp timestamp) + { + CheckmarkList checkmarks = habit.getCheckmarks(); + double oldValue = checkmarks.getValues(timestamp, timestamp)[0]; + double newValue = oldValue - 1000; + if (newValue < 0) return; + commandRunner.execute( + new CreateRepetitionCommand(habit, timestamp, (int)newValue), + habit.getId()); + } + public void onEdit(@NonNull Habit habit, Timestamp timestamp) { CheckmarkList checkmarks = habit.getCheckmarks(); From 44632b9455ba17b226c64df863b430ef60279e5d Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Fri, 18 May 2018 10:51:48 -0400 Subject: [PATCH 3/3] Added increment/decrement behavior tests --- .../habits/list/ListHabitsBehaviorTest.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java index 0ed3fbbab..077a73cbc 100644 --- a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java @@ -20,6 +20,7 @@ package org.isoron.uhabits.core.ui.screens.habits.list; import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.commands.CreateRepetitionCommand; import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.core.utils.*; @@ -36,6 +37,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior.Message.COULD_NOT_EXPORT; import static org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior.Message.COULD_NOT_GENERATE_BUG_REPORT; import static org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior.Message.DATABASE_REPAIRED; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; @@ -177,4 +179,33 @@ public class ListHabitsBehaviorTest extends BaseUnitTest assertFalse(habit1.isCompletedToday()); } + @Test + public void testOnIncrement() + { + assertTrue(habit2.isCompletedToday()); + assertEquals(habit2.getRepetitions().getNewest().getValue(), 100); + behavior.onIncrement(habit2, DateUtils.getToday()); + assertEquals(habit2.getRepetitions().getNewest().getValue(), 1100); + } + + @Test + public void testOnDecrement_belowZero() { + assertTrue(habit2.isCompletedToday()); + assertEquals(habit2.getRepetitions().getNewest().getValue(), 100); + behavior.onDecrement(habit2, DateUtils.getToday()); + assertEquals(habit2.getRepetitions().getNewest().getValue(), 100); + } + + @Test + public void testOnDecrement() + { + assertTrue(habit2.isCompletedToday()); + commandRunner.execute( + new CreateRepetitionCommand(habit2, DateUtils.getToday(), 4000), + habit2.getId()); + assertEquals(habit2.getRepetitions().getNewest().getValue(), 4000); + + behavior.onDecrement(habit2, DateUtils.getToday()); + assertEquals(habit2.getRepetitions().getNewest().getValue(), 3000); + } } \ No newline at end of file