From d6441701415c9b6e8799a27c1eb72d3ee3864897 Mon Sep 17 00:00:00 2001 From: Bindu <56578479+vbh@users.noreply.github.com> Date: Tue, 14 Sep 2021 07:28:41 -0700 Subject: [PATCH] Implement dialog for Yes/No Habits --- .../common/dialogs/CheckmarkDialog.kt | 50 +++++++++++++++++++ .../common/dialogs/NumberPickerFactory.kt | 2 +- .../habits/list/ListHabitsScreen.kt | 9 ++++ .../habits/list/views/CheckmarkButtonView.kt | 13 ++++- .../habits/list/views/CheckmarkPanelView.kt | 7 +++ .../habits/list/views/HabitCardView.kt | 8 ++- .../habits/list/views/NumberButtonView.kt | 2 +- .../habits/show/ShowHabitActivity.kt | 8 +++ .../src/main/res/layout/checkmark_dialog.xml | 18 +++++++ .../src/main/res/values/strings.xml | 2 +- .../screens/habits/list/ListHabitsBehavior.kt | 40 +++++++++++---- .../screens/habits/show/views/HistoryCard.kt | 4 ++ 12 files changed, 146 insertions(+), 17 deletions(-) create mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkDialog.kt create mode 100644 uhabits-android/src/main/res/layout/checkmark_dialog.xml 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 new file mode 100644 index 000000000..7b7853d3b --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkDialog.kt @@ -0,0 +1,50 @@ +package org.isoron.uhabits.activities.common.dialogs + +import androidx.appcompat.app.AlertDialog +import android.content.Context +import android.view.LayoutInflater +import android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE +import android.widget.EditText +import org.isoron.uhabits.R +import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior +import org.isoron.uhabits.inject.ActivityContext +import javax.inject.Inject + +class CheckmarkDialog +@Inject constructor( + @ActivityContext private val context: Context +) { + + fun create( + notes: String, + callback: ListHabitsBehavior.CheckMarkDialogCallback + ): AlertDialog { + val inflater = LayoutInflater.from(context) + val view = inflater.inflate(R.layout.checkmark_dialog, null) + + val etNotes = view.findViewById(R.id.etNotes) + + etNotes.setText(notes) + val dialog = AlertDialog.Builder(context) + .setView(view) + .setTitle(R.string.edit_notes) + .setPositiveButton(R.string.save) { _, _ -> + val note = etNotes.text.toString() + callback.onNotesSaved(note) + } + .setNegativeButton(android.R.string.cancel) { _, _ -> + callback.onNotesDismissed() + } + .setOnDismissListener { + callback.onNotesDismissed() + } + .create() + + dialog.setOnShowListener { + etNotes.requestFocus() + dialog.window?.setSoftInputMode(SOFT_INPUT_STATE_ALWAYS_VISIBLE) + } + + return dialog + } +} \ No newline at end of file diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt index e62abc1a5..58db019a3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt @@ -89,7 +89,7 @@ class NumberPickerFactory val note = etNotes.text.toString() callback.onNumberPicked(v, note) } - .setNegativeButton(R.string.cancel) { _, _ -> + .setNegativeButton(android.R.string.cancel) { _, _ -> callback.onNumberPickerDismissed() } .setOnDismissListener { 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 7746285de..ea2ad85b0 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 @@ -25,6 +25,7 @@ import android.content.Intent import androidx.appcompat.app.AppCompatActivity import dagger.Lazy import org.isoron.uhabits.R +import org.isoron.uhabits.activities.common.dialogs.CheckmarkDialog import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialogFactory import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.NumberPickerFactory @@ -89,6 +90,7 @@ class ListHabitsScreen private val importTaskFactory: ImportDataTaskFactory, private val colorPickerFactory: ColorPickerDialogFactory, private val numberPickerFactory: NumberPickerFactory, + private val checkMarkDialog: CheckmarkDialog, private val behavior: Lazy ) : CommandRunner.Listener, ListHabitsBehavior.Screen, @@ -231,6 +233,13 @@ class ListHabitsScreen numberPickerFactory.create(value, unit, notes, callback).show() } + override fun showCheckmarkDialog( + notes: String, + callback: ListHabitsBehavior.CheckMarkDialogCallback + ) { + checkMarkDialog.create(notes, callback).show() + } + private fun getExecuteString(command: Command): String? { when (command) { is ArchiveHabitsCommand -> { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt index 26735f865..bd1b45715 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt @@ -39,7 +39,6 @@ import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.utils.dim import org.isoron.uhabits.utils.getFontAwesome -import org.isoron.uhabits.utils.showMessage import org.isoron.uhabits.utils.sres import org.isoron.uhabits.utils.toMeasureSpec import javax.inject.Inject @@ -78,6 +77,8 @@ class CheckmarkButtonView( } var onToggle: (Int) -> Unit = {} + + var onEdit: () -> Unit = {} private var drawer = Drawer() init { @@ -99,7 +100,7 @@ class CheckmarkButtonView( override fun onClick(v: View) { if (preferences.isShortToggleEnabled) performToggle() - else showMessage(resources.getString(R.string.long_press_to_toggle)) + else onEdit() } override fun onLongClick(v: View): Boolean { @@ -133,6 +134,8 @@ class CheckmarkButtonView( textAlign = Paint.Align.CENTER } + private val pNotesIndicator: Paint = Paint() + fun draw(canvas: Canvas) { paint.color = when (value) { YES_MANUAL, YES_AUTO, SKIP -> color @@ -142,6 +145,7 @@ class CheckmarkButtonView( } else -> lowContrastColor } + pNotesIndicator.color = color val id = when (value) { SKIP -> R.string.fa_skipped NO -> R.string.fa_times @@ -176,6 +180,11 @@ class CheckmarkButtonView( paint.style = Paint.Style.FILL canvas.drawText(label, rect.centerX(), rect.centerY(), paint) } + + if (hasNotes) { + val cy = 0.8f * em + canvas.drawCircle(width.toFloat() - cy, cy, 8f, pNotesIndicator) + } } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt index 9dba30f31..dabbdc9c0 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt @@ -66,6 +66,12 @@ class CheckmarkPanelView( setupButtons() } + var onEdit: (Timestamp) -> Unit = {} + set(value) { + field = value + setupButtons() + } + override fun createButton(): CheckmarkButtonView = buttonFactory.create() @Synchronized @@ -84,6 +90,7 @@ class CheckmarkPanelView( } button.color = color button.onToggle = { value -> onToggle(timestamp, value) } + button.onEdit = { onEdit(timestamp) } } } } 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 1d3b8c685..82dc31930 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 @@ -116,7 +116,7 @@ class HabitCardView( } var notes - get() = numberPanel.notes + get() = checkmarkPanel.notes set(values) { checkmarkPanel.notes = values numberPanel.notes = values @@ -150,7 +150,11 @@ class HabitCardView( checkmarkPanel = checkmarkPanelFactory.create().apply { onToggle = { timestamp, value -> triggerRipple(timestamp) - habit?.let { behavior.onToggle(it, timestamp, value, "") } + habit?.let { behavior.onToggle(it, timestamp, value) } + } + 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 7e386df48..3213e5a68 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 @@ -206,7 +206,7 @@ class NumberButtonView( pNumber.color = activeColor pNumber.typeface = typeface pUnit.color = activeColor - pNotesIndicator.color = activeColor + pNotesIndicator.color = color if (units.isBlank()) { rect.set(0f, 0f, width.toFloat(), height.toFloat()) 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 5ecfeea66..9dd01b521 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 @@ -32,6 +32,7 @@ import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.R import org.isoron.uhabits.activities.AndroidThemeSwitcher import org.isoron.uhabits.activities.HabitsDirFinder +import org.isoron.uhabits.activities.common.dialogs.CheckmarkDialog import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.HistoryEditorDialog import org.isoron.uhabits.activities.common.dialogs.NumberPickerFactory @@ -170,6 +171,13 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { NumberPickerFactory(this@ShowHabitActivity).create(value, unit, notes, callback).show() } + override fun showCheckmarkDialog( + notes: String, + callback: ListHabitsBehavior.CheckMarkDialogCallback + ) { + CheckmarkDialog(this@ShowHabitActivity).create(notes, callback).show() + } + override fun showEditHabitScreen(habit: Habit) { startActivity(IntentFactory().startEditActivity(this@ShowHabitActivity, habit)) } diff --git a/uhabits-android/src/main/res/layout/checkmark_dialog.xml b/uhabits-android/src/main/res/layout/checkmark_dialog.xml new file mode 100644 index 000000000..765b23776 --- /dev/null +++ b/uhabits-android/src/main/res/layout/checkmark_dialog.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index 36be8d1b3..c908816c1 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -55,7 +55,6 @@ Clear Reminder Save - Cancel Streaks You have no active habits You\'re all done for today! @@ -233,4 +232,5 @@ No app was found to support this action Extend day a few hours past midnight Wait until 3:00 AM to show a new day. Useful if you typically go to sleep after midnight. Requires app restart. + Edit notes 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 2d00b8fbf..5d0bff931 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 @@ -22,6 +22,7 @@ import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CreateRepetitionCommand import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList +import org.isoron.uhabits.core.models.HabitType import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.tasks.ExportCSVTask @@ -48,15 +49,24 @@ open class ListHabitsBehavior @Inject constructor( fun onEdit(habit: Habit, timestamp: Timestamp?) { val entries = habit.computedEntries.get(timestamp!!) - val oldValue = entries.value.toDouble() val notes = entries.notes - screen.showNumberPicker( - oldValue / 1000, - habit.unit, - notes - ) { newValue: Double, newNotes:String, -> - val value = (newValue * 1000).roundToInt() - commandRunner.run(CreateRepetitionCommand(habitList, habit, timestamp, value, newNotes)) + if (habit.type == HabitType.NUMERICAL) { + val oldValue = entries.value.toDouble() + screen.showNumberPicker( + oldValue / 1000, + habit.unit, + notes + ) { newValue: Double, newNotes:String, -> + val value = (newValue * 1000).roundToInt() + commandRunner.run(CreateRepetitionCommand(habitList, habit, timestamp, value, newNotes)) + } + } else { + val value = entries.value + screen.showCheckmarkDialog( + notes + ) { newNotes -> + commandRunner.run(CreateRepetitionCommand(habitList, habit, timestamp, value, newNotes)) + } } } @@ -106,9 +116,10 @@ open class ListHabitsBehavior @Inject constructor( if (prefs.isFirstRun) onFirstRun() } - fun onToggle(habit: Habit, timestamp: Timestamp?, value: Int, notes: String) { + fun onToggle(habit: Habit, timestamp: Timestamp?, value: Int) { + val notes = habit.computedEntries.get(timestamp!!).notes commandRunner.run( - CreateRepetitionCommand(habitList, habit, timestamp!!, value, notes) + CreateRepetitionCommand(habitList, habit, timestamp, value, notes) ) } @@ -137,6 +148,11 @@ open class ListHabitsBehavior @Inject constructor( fun onNumberPickerDismissed() {} } + fun interface CheckMarkDialogCallback { + fun onNotesSaved(notes: String) + fun onNotesDismissed() {} + } + interface Screen { fun showHabitScreen(h: Habit) fun showIntroScreen() @@ -147,6 +163,10 @@ open class ListHabitsBehavior @Inject constructor( notes: String, callback: NumberPickerCallback ) + fun showCheckmarkDialog( + notes: String, + callback: CheckMarkDialogCallback + ) fun showSendBugReportToDeveloperScreen(log: String) fun showSendFileScreen(filename: String) 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 358e776aa..899734956 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 @@ -162,5 +162,9 @@ class HistoryCardPresenter( notes: String, callback: ListHabitsBehavior.NumberPickerCallback, ) + fun showCheckmarkDialog( + notes: String, + callback: ListHabitsBehavior.CheckMarkDialogCallback, + ) } }