From f7bebf0b3a5990499e8b5c3c198e2671ba0afb14 Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Wed, 16 May 2018 00:06:50 -0400 Subject: [PATCH 1/8] Removes intermediate "Habit type" dialog upon creation Defaults to a Yes/No habit for now. --- .../habits/edit/EditHabitDialog.java | 2 +- .../habits/edit/EditHabitDialogFactory.java | 9 +++---- .../habits/list/ListHabitsScreen.kt | 26 ++----------------- 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index 6ff2bfa6b..f4639e3a3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java @@ -140,7 +140,7 @@ public class EditHabitDialog extends AppCompatDialogFragment private int getTypeFromArguments() { - return getArguments().getInt(BUNDLE_HABIT_TYPE); + return Habit.YES_NO_HABIT; } private void initDependencies() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java index a91c3b14a..5c83a941f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java @@ -35,21 +35,18 @@ public class EditHabitDialogFactory { } - public EditHabitDialog createBoolean() + public EditHabitDialog createNumerical() { EditHabitDialog dialog = new EditHabitDialog(); Bundle args = new Bundle(); - args.putInt(BUNDLE_HABIT_TYPE, Habit.YES_NO_HABIT); + args.putInt(BUNDLE_HABIT_TYPE, Habit.NUMBER_HABIT); dialog.setArguments(args); return dialog; } - public EditHabitDialog createNumerical() + public EditHabitDialog create() { EditHabitDialog dialog = new EditHabitDialog(); - Bundle args = new Bundle(); - args.putInt(BUNDLE_HABIT_TYPE, Habit.NUMBER_HABIT); - dialog.setArguments(args); return dialog; } 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 bda22a46e..b821625a2 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 @@ -137,26 +137,9 @@ class ListHabitsScreen activity.startActivity(intent) } - fun showCreateBooleanHabitScreen() { - val dialog = editHabitDialogFactory.createBoolean() - activity.showDialog(dialog, "editHabit") - } - override fun showCreateHabitScreen() { - if (!preferences.isNumericalHabitsFeatureEnabled) { - showCreateBooleanHabitScreen() - return - } - - val dialog = AlertDialog.Builder(activity) - .setTitle("Type of habit") - .setItems(R.array.habitTypes) { _, which -> - if (which == 0) showCreateBooleanHabitScreen() - else showCreateNumericalHabitScreen() - } - .create() - - dialog.show() + val dialog = editHabitDialogFactory.create() + activity.showDialog(dialog, "editHabit") } override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) { @@ -236,11 +219,6 @@ class ListHabitsScreen } } - private fun showCreateNumericalHabitScreen() { - val dialog = editHabitDialogFactory.createNumerical() - activity.showDialog(dialog, "editHabit") - } - private fun onImportData(file: File, onFinished: () -> Unit) { taskRunner.execute(importTaskFactory.create(file) { result -> if (result == ImportDataTask.SUCCESS) { From 98d09e6d554d67b6122df48a404a7465575534ea Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Wed, 16 May 2018 16:41:30 -0400 Subject: [PATCH 2/8] Added TypePanel ui elements to EditDialog --- .../habits/edit/views/TypePanel.java | 88 +++++++++++++++++++ .../src/main/res/layout/edit_habit.xml | 5 ++ .../src/main/res/layout/edit_habit_type.xml | 40 +++++++++ .../src/main/res/values/constants.xml | 2 +- .../src/main/res/values/strings.xml | 1 + 5 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java create mode 100644 uhabits-android/src/main/res/layout/edit_habit_type.xml diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java new file mode 100644 index 000000000..cdcd18661 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.activities.habits.edit.views; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Resources; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.Spinner; +import android.widget.TextView; + +import org.isoron.uhabits.R; +import org.isoron.uhabits.core.models.Frequency; +import org.isoron.uhabits.core.models.Habit; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnItemSelected; + +import static org.isoron.uhabits.R.id.numerator; + + +public class TypePanel extends FrameLayout +{ + @BindView(R.id.spinner) + Spinner spinner; + + public TypePanel(@NonNull Context context, + @Nullable AttributeSet attrs) + { + super(context, attrs); + + View view = inflate(context, R.layout.edit_habit_type, null); + ButterKnife.bind(this, view); + addView(view); + } + + @NonNull + public Integer getType() + { + Integer type = spinner.getSelectedItemPosition(); + if (type.equals(0)) return Habit.YES_NO_HABIT; + if (type.equals(0)) return Habit.NUMBER_HABIT; + return -1; + } + + public void setType(@NonNull Integer type) + { + int position = getQuickSelectPosition(type); + spinner.setSelection(position); + } + + @OnItemSelected(R.id.spinner) + public void onTypeSelected(int position) + { + if (position < 0 || position > 1) throw new IllegalArgumentException(); + // TODO: A callback? + } + + private int getQuickSelectPosition(@NonNull Integer type) + { + if (type.equals(Habit.YES_NO_HABIT)) return 0; + if (type.equals(Habit.NUMBER_HABIT)) return 1; + return -1; + } +} diff --git a/uhabits-android/src/main/res/layout/edit_habit.xml b/uhabits-android/src/main/res/layout/edit_habit.xml index da5357c7b..15fd1a4f7 100644 --- a/uhabits-android/src/main/res/layout/edit_habit.xml +++ b/uhabits-android/src/main/res/layout/edit_habit.xml @@ -34,6 +34,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content"/> + + + + + + + + + + \ No newline at end of file diff --git a/uhabits-android/src/main/res/values/constants.xml b/uhabits-android/src/main/res/values/constants.xml index 34e8136a5..07282b4ef 100644 --- a/uhabits-android/src/main/res/values/constants.xml +++ b/uhabits-android/src/main/res/values/constants.xml @@ -80,7 +80,7 @@ - Yes or No + Checked/Unchecked Number diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index 5c043b111..78a132290 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -45,6 +45,7 @@ History Clear Question (Did you … today?) + Type Repeat times in days From 6f6a386954640f50f10792c999d4c1fbdbc66542 Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Wed, 16 May 2018 18:49:54 -0400 Subject: [PATCH 3/8] EditHabitDialog adjustments Modified edithabitdialog to populate from Habit object and added Controller to TypePanel --- .../habits/edit/EditHabitDialog.java | 42 ++++++++++++++----- .../habits/edit/views/TypePanel.java | 37 +++++++++++++--- 2 files changed, 63 insertions(+), 16 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index f4639e3a3..f4d8a8149 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java @@ -24,6 +24,7 @@ import android.os.*; import android.support.annotation.*; import android.support.v7.app.*; import android.text.format.*; +import android.util.Log; import android.view.*; import com.android.datetimepicker.time.*; @@ -63,6 +64,9 @@ public class EditHabitDialog extends AppCompatDialogFragment @BindView(R.id.namePanel) NameDescriptionPanel namePanel; + @BindView(R.id.typePanel) + TypePanel typePanel; + @BindView(R.id.reminderPanel) ReminderPanel reminderPanel; @@ -112,6 +116,7 @@ public class EditHabitDialog extends AppCompatDialogFragment populateForm(); setupReminderController(); + setupTypeController(); setupNameController(); return view; @@ -138,11 +143,6 @@ public class EditHabitDialog extends AppCompatDialogFragment } } - private int getTypeFromArguments() - { - return Habit.YES_NO_HABIT; - } - private void initDependencies() { Context appContext = getContext().getApplicationContext(); @@ -164,9 +164,9 @@ public class EditHabitDialog extends AppCompatDialogFragment @OnClick(R.id.buttonSave) void onSaveButtonClick() { - int type = getTypeFromArguments(); - if (!namePanel.validate()) return; + + int type = typePanel.getType(); if (type == Habit.YES_NO_HABIT && !frequencyPanel.validate()) return; if (type == Habit.NUMBER_HABIT && !targetPanel.validate()) return; @@ -204,16 +204,24 @@ public class EditHabitDialog extends AppCompatDialogFragment private void populateForm() { Habit habit = modelFactory.buildHabit(); - habit.setFrequency(Frequency.DAILY); habit.setColor(prefs.getDefaultHabitColor(habit.getColor())); - habit.setType(getTypeFromArguments()); + habit.setType(Habit.YES_NO_HABIT); + habit.setFrequency(Frequency.DAILY); if (originalHabit != null) habit.copyFrom(originalHabit); - if (habit.isNumerical()) frequencyPanel.setVisibility(GONE); - else targetPanel.setVisibility(GONE); + if (habit.isNumerical()) + { + frequencyPanel.setVisibility(GONE); + } + else + { + targetPanel.setVisibility(GONE); + } namePanel.populateFrom(habit); + typePanel.setType(habit.getType()); + typePanel.setEnabled(originalHabit == null); frequencyPanel.setFrequency(habit.getFrequency()); targetPanel.setTargetValue(habit.getTargetValue()); targetPanel.setUnit(habit.getUnit()); @@ -241,6 +249,18 @@ public class EditHabitDialog extends AppCompatDialogFragment }); } + private void setupTypeController() + { + typePanel.setController(new TypePanel.Controller() + { + @Override + public void onTypeSelected(Integer previousType) + { + Log.d("YOUREIT", "Prev: " + previousType.toString() + " Sel: " + typePanel.getType().toString()); + } + }); + } + private void setupReminderController() { reminderPanel.setController(new ReminderPanel.Controller() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java index cdcd18661..dfbe11524 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java @@ -47,6 +47,11 @@ public class TypePanel extends FrameLayout @BindView(R.id.spinner) Spinner spinner; + private Integer type; + + @NonNull + private Controller controller; + public TypePanel(@NonNull Context context, @Nullable AttributeSet attrs) { @@ -55,19 +60,20 @@ public class TypePanel extends FrameLayout View view = inflate(context, R.layout.edit_habit_type, null); ButterKnife.bind(this, view); addView(view); + + setType(Habit.YES_NO_HABIT); + controller = new Controller() {}; } @NonNull public Integer getType() { - Integer type = spinner.getSelectedItemPosition(); - if (type.equals(0)) return Habit.YES_NO_HABIT; - if (type.equals(0)) return Habit.NUMBER_HABIT; - return -1; + return type; } public void setType(@NonNull Integer type) { + this.type = type; int position = getQuickSelectPosition(type); spinner.setSelection(position); } @@ -76,7 +82,28 @@ public class TypePanel extends FrameLayout public void onTypeSelected(int position) { if (position < 0 || position > 1) throw new IllegalArgumentException(); - // TODO: A callback? + Integer previousType = type; + type = getTypeFromQuickSelect(position); + controller.onTypeSelected(previousType); + } + + public void setEnabled(boolean enabled) + { + spinner.setEnabled(enabled); + } + + public void setController(@NonNull Controller controller) { this.controller = controller; } + + public interface Controller + { + default void onTypeSelected(Integer previousType) {} + } + + private Integer getTypeFromQuickSelect(@NonNull Integer position) + { + if (position.equals(0)) return Habit.YES_NO_HABIT; + if (position.equals(1)) return Habit.NUMBER_HABIT; + return -1; } private int getQuickSelectPosition(@NonNull Integer type) From 93ba12cbed32622121638b57217d5dec240fd4f6 Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Wed, 16 May 2018 19:38:50 -0400 Subject: [PATCH 4/8] Change panel visibility based on type --- .../habits/edit/EditHabitDialog.java | 28 ++++++++++++------- .../habits/edit/views/TypePanel.java | 11 ++------ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index f4d8a8149..bffeb1de3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java @@ -41,6 +41,7 @@ import org.isoron.uhabits.core.preferences.*; import butterknife.*; import static android.view.View.GONE; +import static android.view.View.VISIBLE; import static org.isoron.uhabits.core.ui.ThemeSwitcher.THEME_LIGHT; public class EditHabitDialog extends AppCompatDialogFragment @@ -210,24 +211,30 @@ public class EditHabitDialog extends AppCompatDialogFragment if (originalHabit != null) habit.copyFrom(originalHabit); - if (habit.isNumerical()) - { - frequencyPanel.setVisibility(GONE); - } - else - { - targetPanel.setVisibility(GONE); - } - namePanel.populateFrom(habit); typePanel.setType(habit.getType()); typePanel.setEnabled(originalHabit == null); + setPanelsForType(habit.getType()); frequencyPanel.setFrequency(habit.getFrequency()); targetPanel.setTargetValue(habit.getTargetValue()); targetPanel.setUnit(habit.getUnit()); if (habit.hasReminder()) reminderPanel.setReminder(habit.getReminder()); } + private void setPanelsForType(Integer type) + { + if (typePanel.getType() == Habit.NUMBER_HABIT) + { + targetPanel.setVisibility(VISIBLE); + frequencyPanel.setVisibility(GONE); + } + else + { + targetPanel.setVisibility(GONE); + frequencyPanel.setVisibility(VISIBLE); + } + } + private void setupNameController() { namePanel.setController(new NameDescriptionPanel.Controller() @@ -256,7 +263,8 @@ public class EditHabitDialog extends AppCompatDialogFragment @Override public void onTypeSelected(Integer previousType) { - Log.d("YOUREIT", "Prev: " + previousType.toString() + " Sel: " + typePanel.getType().toString()); + Integer currentType = typePanel.getType(); + setPanelsForType(currentType); } }); } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java index dfbe11524..8e7879d8d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TypePanel.java @@ -19,28 +19,21 @@ package org.isoron.uhabits.activities.habits.edit.views; -import android.annotation.SuppressLint; import android.content.Context; -import android.content.res.Resources; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; -import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.Spinner; -import android.widget.TextView; import org.isoron.uhabits.R; -import org.isoron.uhabits.core.models.Frequency; import org.isoron.uhabits.core.models.Habit; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnItemSelected; -import static org.isoron.uhabits.R.id.numerator; - public class TypePanel extends FrameLayout { @@ -83,7 +76,7 @@ public class TypePanel extends FrameLayout { if (position < 0 || position > 1) throw new IllegalArgumentException(); Integer previousType = type; - type = getTypeFromQuickSelect(position); + type = getTypeFromQuickSelectPosition(position); controller.onTypeSelected(previousType); } @@ -99,7 +92,7 @@ public class TypePanel extends FrameLayout default void onTypeSelected(Integer previousType) {} } - private Integer getTypeFromQuickSelect(@NonNull Integer position) + private Integer getTypeFromQuickSelectPosition(@NonNull Integer position) { if (position.equals(0)) return Habit.YES_NO_HABIT; if (position.equals(1)) return Habit.NUMBER_HABIT; From b1a5cfd616a77b1ced8a1be5cb2d4e4b5004b3d0 Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Wed, 16 May 2018 19:41:00 -0400 Subject: [PATCH 5/8] Removed some unnecessary leftover code --- .../activities/habits/edit/EditHabitDialog.java | 2 -- .../activities/habits/edit/EditHabitDialogFactory.java | 10 ---------- 2 files changed, 12 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index bffeb1de3..46b1ee8bd 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java @@ -48,8 +48,6 @@ public class EditHabitDialog extends AppCompatDialogFragment { public static final String BUNDLE_HABIT_ID = "habitId"; - public static final String BUNDLE_HABIT_TYPE = "habitType"; - protected Habit originalHabit; protected Preferences prefs; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java index 5c83a941f..554e6d11c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java @@ -35,15 +35,6 @@ public class EditHabitDialogFactory { } - public EditHabitDialog createNumerical() - { - EditHabitDialog dialog = new EditHabitDialog(); - Bundle args = new Bundle(); - args.putInt(BUNDLE_HABIT_TYPE, Habit.NUMBER_HABIT); - dialog.setArguments(args); - return dialog; - } - public EditHabitDialog create() { EditHabitDialog dialog = new EditHabitDialog(); @@ -58,7 +49,6 @@ public class EditHabitDialogFactory EditHabitDialog dialog = new EditHabitDialog(); Bundle args = new Bundle(); args.putLong(BUNDLE_HABIT_ID, habit.getId()); - args.putInt(BUNDLE_HABIT_TYPE, habit.getType()); dialog.setArguments(args); return dialog; } From 3787bc9cda08749a5fe92a50ea8b4b4ba9b4100e Mon Sep 17 00:00:00 2001 From: Jake Powell Date: Thu, 17 May 2018 12:41:17 -0400 Subject: [PATCH 6/8] 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 7/8] 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 8/8] 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