Merge pull request #2261 from fictiontoreality/auto-save-notes

Auto-save notes when dismissing checkmark and number dialogs
This commit is contained in:
Alinson S. Xavier 2026-01-19 05:01:05 -06:00 committed by GitHub
commit bf192e1506
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 4 deletions

View File

@ -20,6 +20,7 @@
package org.isoron.uhabits.activities.common.dialogs package org.isoron.uhabits.activities.common.dialogs
import android.app.Dialog import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View.GONE import android.view.View.GONE
@ -37,11 +38,17 @@ import org.isoron.uhabits.utils.sres
class CheckmarkDialog : AppCompatDialogFragment() { class CheckmarkDialog : AppCompatDialogFragment() {
var onToggle: (Int, String) -> Unit = { _, _ -> } var onToggle: (Int, String) -> Unit = { _, _ -> }
var onDismiss: () -> Unit = {}
private var dismissedViaSaveAction = false
private var originalNotes: String = ""
private var originalValue: Int = 0
private lateinit var view: CheckmarkPopupBinding
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val appComponent = (requireActivity().application as HabitsApplication).component val appComponent = (requireActivity().application as HabitsApplication).component
val prefs = appComponent.preferences val prefs = appComponent.preferences
val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)) view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context))
val color = requireArguments().getInt("color") val color = requireArguments().getInt("color")
arrayOf(view.yesBtn, view.skipBtn).forEach { arrayOf(view.yesBtn, view.skipBtn).forEach {
it.setTextColor(color) it.setTextColor(color)
@ -52,7 +59,9 @@ class CheckmarkDialog : AppCompatDialogFragment() {
arrayOf(view.yesBtn, view.noBtn, view.skipBtn, view.unknownBtn).forEach { arrayOf(view.yesBtn, view.noBtn, view.skipBtn, view.unknownBtn).forEach {
it.typeface = getFontAwesome(requireContext()) it.typeface = getFontAwesome(requireContext())
} }
view.notes.setText(requireArguments().getString("notes")!!) originalNotes = requireArguments().getString("notes")!!
originalValue = requireArguments().getInt("value")
view.notes.setText(originalNotes)
if (!prefs.isSkipEnabled) view.skipBtn.visibility = GONE if (!prefs.isSkipEnabled) view.skipBtn.visibility = GONE
if (!prefs.areQuestionMarksEnabled) view.unknownBtn.visibility = GONE if (!prefs.areQuestionMarksEnabled) view.unknownBtn.visibility = GONE
view.booleanButtons.visibility = VISIBLE view.booleanButtons.visibility = VISIBLE
@ -62,6 +71,7 @@ class CheckmarkDialog : AppCompatDialogFragment() {
setBackgroundDrawableResource(android.R.color.transparent) setBackgroundDrawableResource(android.R.color.transparent)
} }
fun onClick(v: Int) { fun onClick(v: Int) {
dismissedViaSaveAction = true
val notes = view.notes.text.toString().trim() val notes = view.notes.text.toString().trim()
onToggle(v, notes) onToggle(v, notes)
requireDialog().dismiss() requireDialog().dismiss()
@ -77,4 +87,16 @@ class CheckmarkDialog : AppCompatDialogFragment() {
return dialog return dialog
} }
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
if (!dismissedViaSaveAction) {
val currentNotes = view.notes.text.toString().trim()
if (currentNotes != originalNotes) {
onToggle(originalValue, currentNotes)
}
}
onDismiss()
}
} }

View File

@ -1,6 +1,7 @@
package org.isoron.uhabits.activities.common.dialogs package org.isoron.uhabits.activities.common.dialogs
import android.app.Dialog import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.text.method.DigitsKeyListener import android.text.method.DigitsKeyListener
@ -28,6 +29,7 @@ class NumberDialog : AppCompatDialogFragment() {
var onToggle: (Double, String) -> Unit = { _, _ -> } var onToggle: (Double, String) -> Unit = { _, _ -> }
var onDismiss: () -> Unit = {} var onDismiss: () -> Unit = {}
private var dismissedViaSaveAction = false
private var originalNotes: String = "" private var originalNotes: String = ""
private var originalValue: Double = 0.0 private var originalValue: Double = 0.0
private lateinit var view: CheckmarkPopupBinding private lateinit var view: CheckmarkPopupBinding
@ -88,10 +90,21 @@ class NumberDialog : AppCompatDialogFragment() {
dialog.window?.apply { dialog.window?.apply {
setBackgroundDrawableResource(android.R.color.transparent) setBackgroundDrawableResource(android.R.color.transparent)
} }
dialog.setOnDismissListener { onDismiss() }
return dialog return dialog
} }
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
if (!dismissedViaSaveAction) {
val currentNotes = view.notes.text.toString().trim()
if (currentNotes != originalNotes) {
onToggle(originalValue, currentNotes)
}
}
onDismiss()
}
private fun fixDecimalSeparator(view: CheckmarkPopupBinding) { private fun fixDecimalSeparator(view: CheckmarkPopupBinding) {
// https://stackoverflow.com/a/34256139 // https://stackoverflow.com/a/34256139
val separator = DecimalFormatSymbols.getInstance().decimalSeparator val separator = DecimalFormatSymbols.getInstance().decimalSeparator
@ -108,6 +121,7 @@ class NumberDialog : AppCompatDialogFragment() {
} }
fun save() { fun save() {
dismissedViaSaveAction = true
var value = originalValue var value = originalValue
try { try {
val numberFormat = NumberFormat.getInstance() val numberFormat = NumberFormat.getInstance()
@ -120,7 +134,7 @@ class NumberDialog : AppCompatDialogFragment() {
} catch (e: ParseException) { } catch (e: ParseException) {
// NOP // NOP
} }
val notes = view.notes.text.toString() val notes = view.notes.text.toString().trim()
val location = view.saveBtn.getCenter() val location = view.saveBtn.getCenter()
onToggle(value, notes) onToggle(value, notes)
requireDialog().dismiss() requireDialog().dismiss()