diff --git a/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt b/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt index 2ee0ae8..e6fd89f 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt @@ -297,7 +297,7 @@ class MainActivity : AppCompatActivity() { d.setView(dialogView) val tempSlider = dialogView.findViewById(R.id.dialog_temperature_value) - val range = NumericUtils(this).getValidEventQuantityRange(LunaEvent.TYPE_TEMPERATURE)!! + val range = NumericUtils(this).getValidEventQuantityRange(LunaEvent.Type.TEMPERATURE)!! tempSlider.valueFrom = range.first.toFloat() tempSlider.valueTo = range.second.toFloat() tempSlider.value = if (event.quantity == 0) { @@ -537,7 +537,7 @@ class MainActivity : AppCompatActivity() { } fun askNotes(event: LunaEvent, showTime: Boolean, onPositive: () -> Unit) { - val useQuantity = (event.type != LunaEvent.TYPE_NOTE && event.type != LunaEvent.TYPE_CUSTOM) + val useQuantity = (event.type != LunaEvent.Type.NOTE) val d = AlertDialog.Builder(this) val dialogView = layoutInflater.inflate(R.layout.dialog_edit_notes, null) @@ -759,7 +759,7 @@ class MainActivity : AppCompatActivity() { val updateValues = { quantityTextView.text = NumericUtils(this).formatEventQuantity(event) notesTextView.text = event.notes - if (event.type == LunaEvent.TYPE_SLEEP && event.quantity > 0) { + if (event.type == LunaEvent.Type.SLEEP && event.quantity > 0) { dateEndTextView.text = DateUtils.formatDateTime(event.time + event.quantity) dateEndTextView.visibility = View.VISIBLE } else { @@ -781,22 +781,28 @@ class MainActivity : AppCompatActivity() { quantityTextView.setOnClickListener { when (event.type) { - LunaEvent.TYPE_BABY_BOTTLE -> askBabyBottleContent(event, false, updateValues) - LunaEvent.TYPE_WEIGHT -> askWeightValue(event, false, updateValues) - LunaEvent.TYPE_DIAPERCHANGE_POO, - LunaEvent.TYPE_DIAPERCHANGE_PEE, - 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) + LunaEvent.Type.BABY_BOTTLE -> askBabyBottleContent(event, false, updateValues) + LunaEvent.Type.WEIGHT -> askWeightValue(event, false, updateValues) + LunaEvent.Type.DIAPERCHANGE_POO, + LunaEvent.Type.DIAPERCHANGE_PEE, + 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) + else -> { + Log.w(TAG, "Unexpected type: ${event.type}") + } } } notesTextView.setOnClickListener { when (event.type) { - LunaEvent.TYPE_FOOD, - LunaEvent.TYPE_MEDICINE, - LunaEvent.TYPE_NOTE -> askNotes(event, false, updateValues) + LunaEvent.Type.FOOD, + LunaEvent.Type.MEDICINE, + LunaEvent.Type.NOTE -> askNotes(event, false, updateValues) + else -> { + Log.w(TAG, "Unexpected type: ${event.type}") + } } } diff --git a/app/src/main/java/it/danieleverducci/lunatracker/adapters/LunaEventRecyclerAdapter.kt b/app/src/main/java/it/danieleverducci/lunatracker/adapters/LunaEventRecyclerAdapter.kt index e328066..3090c52 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/adapters/LunaEventRecyclerAdapter.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/adapters/LunaEventRecyclerAdapter.kt @@ -54,12 +54,11 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter item.notes - LunaEvent.TYPE_NOTE -> item.notes - LunaEvent.TYPE_CUSTOM -> item.notes + LunaEvent.Type.MEDICINE -> item.notes + LunaEvent.Type.NOTE -> item.notes else -> item.getTypeDescription(context) } - val endTime = if (item.type == LunaEvent.TYPE_SLEEP) { + val endTime = if (item.type == LunaEvent.Type.SLEEP) { item.quantity + item.time } else { item.time @@ -68,7 +67,7 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter { + enum class Type { + BABY_BOTTLE, + FOOD, + BREASTFEEDING_LEFT_NIPPLE, + BREASTFEEDING_BOTH_NIPPLE, + BREASTFEEDING_RIGHT_NIPPLE, + DIAPERCHANGE_POO, + DIAPERCHANGE_PEE, + SLEEP, + WEIGHT, + MEDICINE, + ENEMA, + NOTE, + COLIC, + TEMPERATURE, + PUKE, + BATH, + UNKNOWN + } + companion object { - const val TYPE_BABY_BOTTLE = "BABY_BOTTLE" - const val TYPE_WEIGHT = "WEIGHT" - const val TYPE_BREASTFEEDING_LEFT_NIPPLE = "BREASTFEEDING_LEFT_NIPPLE" - const val TYPE_BREASTFEEDING_BOTH_NIPPLE = "BREASTFEEDING_BOTH_NIPPLE" - const val TYPE_BREASTFEEDING_RIGHT_NIPPLE = "BREASTFEEDING_RIGHT_NIPPLE" - const val TYPE_DIAPERCHANGE_POO = "DIAPERCHANGE_POO" - const val TYPE_DIAPERCHANGE_PEE = "DIAPERCHANGE_PEE" - const val TYPE_MEDICINE = "MEDICINE" - const val TYPE_ENEMA = "ENEMA" - const val TYPE_NOTE = "NOTE" - const val TYPE_CUSTOM = "CUSTOM" - const val TYPE_COLIC = "COLIC" - const val TYPE_TEMPERATURE = "TEMPERATURE" - const val TYPE_FOOD = "FOOD" - const val TYPE_PUKE = "PUKE" - const val TYPE_BATH = "BATH" - const val TYPE_SLEEP = "SLEEP" + fun getTypeEmoji(context: Context, type: Type): String { + return context.getString( + when (type) { + Type.BABY_BOTTLE -> R.string.event_bottle_type + Type.WEIGHT -> R.string.event_weight_type + Type.BREASTFEEDING_LEFT_NIPPLE -> R.string.event_breastfeeding_left_type + Type.BREASTFEEDING_BOTH_NIPPLE -> R.string.event_breastfeeding_both_type + Type.BREASTFEEDING_RIGHT_NIPPLE -> R.string.event_breastfeeding_right_type + Type.DIAPERCHANGE_POO -> R.string.event_diaperchange_poo_type + Type.DIAPERCHANGE_PEE -> R.string.event_diaperchange_pee_type + Type.MEDICINE -> R.string.event_medicine_type + Type.ENEMA -> R.string.event_enema_type + Type.NOTE -> R.string.event_note_type + Type.TEMPERATURE -> R.string.event_temperature_type + Type.COLIC -> R.string.event_colic_type + 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 + Type.UNKNOWN -> R.string.event_unknown_type + } + ) + } + + fun getTypeDescription(context: Context, type: Type): String { + return context.getString( + when (type) { + Type.BABY_BOTTLE -> R.string.event_bottle_desc + Type.WEIGHT -> R.string.event_weight_desc + Type.BREASTFEEDING_LEFT_NIPPLE -> R.string.event_breastfeeding_left_desc + Type.BREASTFEEDING_BOTH_NIPPLE -> R.string.event_breastfeeding_both_desc + Type.BREASTFEEDING_RIGHT_NIPPLE -> R.string.event_breastfeeding_right_desc + Type.DIAPERCHANGE_POO -> R.string.event_diaperchange_poo_desc + Type.DIAPERCHANGE_PEE -> R.string.event_diaperchange_pee_desc + Type.MEDICINE -> R.string.event_medicine_desc + Type.ENEMA -> R.string.event_enema_desc + Type.NOTE -> R.string.event_note_desc + Type.TEMPERATURE -> R.string.event_temperature_desc + Type.COLIC -> R.string.event_colic_desc + 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 + Type.UNKNOWN -> R.string.event_unknown_desc + } + ) + } } private val jo: JSONObject @@ -40,10 +90,16 @@ class LunaEvent: Comparable { set(value) { jo.put("time", value) } - var type: String - get(): String = jo.getString("type") + var type: Type + get(): Type { + return try { + Type.valueOf(jo.getString("type")) + } catch (_: Exception) { + Type.UNKNOWN + } + } set(value) { - jo.put("type", value) + jo.put("type", value.name) } var quantity: Int get() = jo.optInt("quantity") @@ -81,13 +137,13 @@ class LunaEvent: Comparable { this.signature = event.signature } - constructor(type: String) { + constructor(type: Type) { this.jo = JSONObject() this.time = System.currentTimeMillis() / 1000 this.type = type } - constructor(type: String, quantity: Int) { + constructor(type: Type, quantity: Int) { this.jo = JSONObject() this.time = System.currentTimeMillis() / 1000 this.type = type @@ -95,64 +151,24 @@ class LunaEvent: Comparable { } fun getTypeEmoji(context: Context): String { - return context.getString( - when (type) { - TYPE_BABY_BOTTLE -> R.string.event_bottle_type - TYPE_WEIGHT -> R.string.event_weight_type - TYPE_BREASTFEEDING_LEFT_NIPPLE -> R.string.event_breastfeeding_left_type - TYPE_BREASTFEEDING_BOTH_NIPPLE -> R.string.event_breastfeeding_both_type - TYPE_BREASTFEEDING_RIGHT_NIPPLE -> R.string.event_breastfeeding_right_type - TYPE_DIAPERCHANGE_POO -> R.string.event_diaperchange_poo_type - TYPE_DIAPERCHANGE_PEE -> R.string.event_diaperchange_pee_type - TYPE_MEDICINE -> R.string.event_medicine_type - TYPE_ENEMA -> R.string.event_enema_type - TYPE_NOTE -> R.string.event_note_type - TYPE_TEMPERATURE -> R.string.event_temperature_type - TYPE_COLIC -> R.string.event_colic_type - 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 - } - ) + return getTypeEmoji(context, type) } fun getTypeDescription(context: Context): String { - return context.getString( - when (type) { - TYPE_BABY_BOTTLE -> R.string.event_bottle_desc - TYPE_WEIGHT -> R.string.event_weight_desc - TYPE_BREASTFEEDING_LEFT_NIPPLE -> R.string.event_breastfeeding_left_desc - TYPE_BREASTFEEDING_BOTH_NIPPLE -> R.string.event_breastfeeding_both_desc - TYPE_BREASTFEEDING_RIGHT_NIPPLE -> R.string.event_breastfeeding_right_desc - TYPE_DIAPERCHANGE_POO -> R.string.event_diaperchange_poo_desc - TYPE_DIAPERCHANGE_PEE -> R.string.event_diaperchange_pee_desc - TYPE_MEDICINE -> R.string.event_medicine_desc - TYPE_ENEMA -> R.string.event_enema_desc - TYPE_NOTE -> R.string.event_note_desc - TYPE_TEMPERATURE -> R.string.event_temperature_desc - TYPE_COLIC -> R.string.event_colic_desc - 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 - } - ) + return getTypeDescription(context, type) } fun getDialogMessage(context: Context): String? { return context.getString( when(type) { - TYPE_BABY_BOTTLE -> R.string.log_bottle_dialog_description - TYPE_MEDICINE -> R.string.log_medicine_dialog_description - TYPE_TEMPERATURE -> R.string.log_temperature_dialog_description - TYPE_DIAPERCHANGE_POO, - 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 + Type.BABY_BOTTLE -> R.string.log_bottle_dialog_description + Type.MEDICINE -> R.string.log_medicine_dialog_description + Type.TEMPERATURE -> R.string.log_temperature_dialog_description + Type.DIAPERCHANGE_POO, + 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 d35ae4f..6e7df67 100644 --- a/app/src/main/java/utils/NumericUtils.kt +++ b/app/src/main/java/utils/NumericUtils.kt @@ -66,38 +66,38 @@ class NumericUtils (val context: Context) { return formatEventQuantity(event.type, event.quantity) } - fun formatEventQuantity(type: String, quantity: Int): String { + fun formatEventQuantity(type: LunaEvent.Type, quantity: Int): String { val formatted = StringBuilder() if (quantity > 0) { formatted.append(when (type) { - LunaEvent.TYPE_TEMPERATURE -> + LunaEvent.Type.TEMPERATURE -> (quantity / 10.0f).toString() - LunaEvent.TYPE_DIAPERCHANGE_POO, - LunaEvent.TYPE_DIAPERCHANGE_PEE, - LunaEvent.TYPE_PUKE -> { + LunaEvent.Type.DIAPERCHANGE_POO, + LunaEvent.Type.DIAPERCHANGE_PEE, + LunaEvent.Type.PUKE -> { val array = context.resources.getStringArray(R.array.AmountLabels) return array.getOrElse(quantity) { Log.e("NumericUtils", "Invalid index $quantity") return "" } } - LunaEvent.TYPE_SLEEP -> formatTimeDuration(context, quantity.toLong()) + LunaEvent.Type.SLEEP -> formatTimeDuration(context, quantity.toLong()) else -> quantity }) formatted.append(" ") formatted.append( when (type) { - LunaEvent.TYPE_BABY_BOTTLE -> measurement_unit_liquid_base - LunaEvent.TYPE_WEIGHT -> measurement_unit_weight_base - LunaEvent.TYPE_MEDICINE -> measurement_unit_weight_tiny - LunaEvent.TYPE_TEMPERATURE -> measurement_unit_temperature_base + LunaEvent.Type.BABY_BOTTLE -> measurement_unit_liquid_base + LunaEvent.Type.WEIGHT -> measurement_unit_weight_base + LunaEvent.Type.MEDICINE -> measurement_unit_weight_tiny + LunaEvent.Type.TEMPERATURE -> measurement_unit_temperature_base else -> "" } ) } else { formatted.append(when (type) { - LunaEvent.TYPE_SLEEP -> "💤" // baby is sleeping + LunaEvent.Type.SLEEP -> "💤" // baby is sleeping else -> "" }) } @@ -108,9 +108,9 @@ class NumericUtils (val context: Context) { * Returns a valid quantity range for the event type. * @return min, max, normal */ - fun getValidEventQuantityRange(lunaEventType: String): Triple? { + fun getValidEventQuantityRange(lunaEventType: LunaEvent.Type): Triple? { return when (lunaEventType) { - LunaEvent.TYPE_TEMPERATURE -> { + LunaEvent.Type.TEMPERATURE -> { if (isMetricSystem()) Triple( context.resources.getInteger(R.integer.human_body_temp_min_metric),