diff --git a/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt b/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt index 252bb60..b593bbb 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt @@ -330,7 +330,7 @@ class MainActivity : AppCompatActivity() { alertDialog.show() } - fun datePickerHelper(time: Long, dateTextView: TextView): Calendar { + fun datePickerHelper(time: Long, dateTextView: TextView, onChange: () -> Unit = {}): Calendar { dateTextView.text = DateUtils.formatDateTime(time) val dateTime = Calendar.getInstance() @@ -349,6 +349,7 @@ class MainActivity : AppCompatActivity() { { _, hour, minute -> dateTime.set(year, month, day, hour, minute) dateTextView.text = DateUtils.formatDateTime(dateTime.time.time / 1000) + onChange.invoke() }, startHour, startMinute, @@ -371,6 +372,74 @@ class MainActivity : AppCompatActivity() { saveLogbook() } + fun addSleepEvent(event: LunaEvent) { + askSleepValue(event) { saveEvent(event) } + } + + fun askSleepValue(event: LunaEvent, onPositive: () -> Unit) { + val d = AlertDialog.Builder(this) + val dialogView = layoutInflater.inflate(R.layout.dialog_edit_duration, null) + d.setTitle(event.getTypeDescription(this)) + d.setMessage(event.getDialogMessage(this)) + d.setView(dialogView) + + val fromTextView = dialogView.findViewById(R.id.dialog_date_from) + val toTextView = dialogView.findViewById(R.id.dialog_date_to) + val durationTextView = dialogView.findViewById(R.id.dialog_date_duration) + + var pickedFromTime = Calendar.getInstance() + var pickedToTime = Calendar.getInstance() + + fun isValidTime(fromSeconds: Long, toSeconds: Long): Boolean { + if (fromSeconds < toSeconds) { + val durationSeconds = toSeconds - fromSeconds + // sleep between 0 seconds and 12 hours + return durationSeconds > 0 && durationSeconds < (12 * 60 * 60) + } else { + return false + } + } + + val onDateChange = { + val fromSeconds = pickedFromTime.time.time / 1000 + val toSeconds = pickedToTime.time.time / 1000 + + durationTextView.text = DateUtils.formatTimeDuration(applicationContext, toSeconds - fromSeconds) + + if (isValidTime(fromSeconds, toSeconds)) { + // valid duration: set default color + durationTextView.setTextColor(durationTextView.textColors.defaultColor) + } else { + // invalid duration: set danger color + durationTextView.setTextColor(ContextCompat.getColor(this, R.color.danger)) + } + } + + pickedFromTime = datePickerHelper(event.time, fromTextView, onDateChange) + pickedToTime = datePickerHelper(event.time + event.quantity, toTextView, onDateChange) + + d.setPositiveButton(android.R.string.ok) { dialogInterface, i -> + val fromSeconds = pickedFromTime.time.time / 1000 + val toSeconds = pickedToTime.time.time / 1000 + + if (isValidTime(fromSeconds, toSeconds)) { + event.time = fromSeconds + event.quantity = (toSeconds - fromSeconds).toInt() + onPositive() + } else { + Toast.makeText(applicationContext, R.string.toast_date_error, Toast.LENGTH_SHORT).show() + } + dialogInterface.dismiss() + } + + d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> + dialogInterface.dismiss() + } + + val alertDialog = d.create() + alertDialog.show() + } + fun addAmountEvent(event: LunaEvent) { askAmountValue(event, true) { saveEvent(event) } } @@ -643,6 +712,7 @@ class MainActivity : AppCompatActivity() { LunaEvent.TYPE_PUKE -> askAmountValue(event, false, updateValues) LunaEvent.TYPE_TEMPERATURE -> askTemperatureValue(event, false, updateValues) LunaEvent.TYPE_NOTE -> askNotes(event, false, updateValues) + LunaEvent.TYPE_SLEEP -> askSleepValue(event, updateValues) } } @@ -1100,6 +1170,10 @@ class MainActivity : AppCompatActivity() { addAmountEvent(LunaEvent(LunaEvent.TYPE_PUKE)) dismiss() } + contentView.findViewById(R.id.button_sleep).setOnClickListener { + addSleepEvent(LunaEvent(LunaEvent.TYPE_SLEEP)) + dismiss() + } contentView.findViewById(R.id.button_colic).setOnClickListener { addPlainEvent(LunaEvent(LunaEvent.TYPE_COLIC)) dismiss() diff --git a/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt b/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt index 1eade79..63e268b 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt @@ -30,6 +30,7 @@ class LunaEvent: Comparable { const val TYPE_FOOD = "FOOD" const val TYPE_PUKE = "PUKE" const val TYPE_BATH = "BATH" + const val TYPE_SLEEP = "SLEEP" } private val jo: JSONObject @@ -111,6 +112,7 @@ class LunaEvent: Comparable { TYPE_FOOD -> R.string.event_food_type TYPE_PUKE -> R.string.event_puke_type TYPE_BATH -> R.string.event_bath_type + TYPE_SLEEP -> R.string.event_sleep_type else -> R.string.event_unknown_type } ) @@ -134,6 +136,7 @@ class LunaEvent: Comparable { TYPE_FOOD -> R.string.event_food_desc TYPE_PUKE -> R.string.event_puke_desc TYPE_BATH -> R.string.event_bath_desc + TYPE_SLEEP -> R.string.event_sleep_desc else -> R.string.event_unknown_desc } ) @@ -149,6 +152,7 @@ class LunaEvent: Comparable { TYPE_DIAPERCHANGE_PEE, TYPE_PUKE -> R.string.log_amount_dialog_description TYPE_WEIGHT -> R.string.log_weight_dialog_description + TYPE_SLEEP -> R.string.log_sleep_dialog_description else -> R.string.log_unknown_dialog_description } ) diff --git a/app/src/main/java/utils/NumericUtils.kt b/app/src/main/java/utils/NumericUtils.kt index 8d12c35..6b2aa48 100644 --- a/app/src/main/java/utils/NumericUtils.kt +++ b/app/src/main/java/utils/NumericUtils.kt @@ -7,6 +7,7 @@ import android.os.Build import android.util.Log import it.danieleverducci.lunatracker.R import it.danieleverducci.lunatracker.entities.LunaEvent +import utils.DateUtils.Companion.formatTimeDuration import java.text.NumberFormat class NumericUtils (val context: Context) { @@ -76,6 +77,7 @@ class NumericUtils (val context: Context) { return "" } } + LunaEvent.TYPE_SLEEP -> formatTimeDuration(context, event.quantity.toLong()) else -> event.quantity }) diff --git a/app/src/main/res/layout/more_events_popup.xml b/app/src/main/res/layout/more_events_popup.xml index b1dfbea..ef0cdf7 100644 --- a/app/src/main/res/layout/more_events_popup.xml +++ b/app/src/main/res/layout/more_events_popup.xml @@ -49,6 +49,16 @@ style="@style/OverflowMenuText" android:text="@string/overflow_event_puke"/> + + 💨 🤮 🛁 + 💤 \? Baby bottle @@ -35,6 +36,7 @@ Gaseous colic Puke Bath + Sleep ⚖️ Weight @@ -44,12 +46,14 @@ 🌡️ Temperature 💨 Gaseous colic 🤮 Puke + 💤 Sleep 🛁 Bath Event logged Logbook saved Unable to log the event Invalid value. Insert an integer. + Invalid date. now sec @@ -112,6 +116,7 @@ Select the temperature: Insert the weight: + Select sleep range: ml g