forked from penguin86/luna-tracker
Compare commits
1 Commits
b271f63cb7
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 8c906369df |
19
README.md
19
README.md
@@ -13,7 +13,24 @@ Dedicated to my daughter Luna.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Thanks for the valuable contributions to:
|
## Contributions
|
||||||
|
|
||||||
|
### Why isn't this hosted on GitHub?
|
||||||
|
|
||||||
|
I'm using a private git server just because I'm worried for the vast majority of open source code being hosted in a server property of Microsoft and being used to train theirs AI.
|
||||||
|
I didn't find a better option, BTW the Gitea project is working on implementing federation, so soon it will be possible to contribute using any other gitea server, selfhosted or not.
|
||||||
|
|
||||||
|
### How to contribute
|
||||||
|
|
||||||
|
The project is open to contribution, but with some limits:
|
||||||
|
|
||||||
|
- I'm sorry I can't accept AI-generated contributions. Reviewing a contribution requires time and effort from my side, while generating code with AI requires very little time and produces non reliable code that must be reviewed in detail. This is effectively shifting the work on my side, and in a forced way. If you feel you need a feature but you're not able to implement it by yourself, I prefer you to create an issue in the repository so I can implement it when I can, in a more mantainable way.
|
||||||
|
- I prefer to make project-wide changes (i.e. updating Android target, app name and icon, release number...) by myself.
|
||||||
|
|
||||||
|
To contribute, you'll have to create an account on this git instance. Unfortunately, I had to disable registration to avoid huge waves of fake accounts created by bots.
|
||||||
|
You can request an account writing to daniele.verducci@ichibi.eu
|
||||||
|
|
||||||
|
### Thanks for the valuable contributions to:
|
||||||
|
|
||||||
- Chepycou (French translation)
|
- Chepycou (French translation)
|
||||||
- Daniel Neubauer (German translation)
|
- Daniel Neubauer (German translation)
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
val updateListRunnable: Runnable = Runnable {
|
val updateListRunnable: Runnable = Runnable {
|
||||||
if (logbook != null && !pauseLogbookUpdate)
|
if (logbook != null && !pauseLogbookUpdate)
|
||||||
loadLogbook(logbook!!.name)
|
loadLogbook(logbook!!.name)
|
||||||
handler.postDelayed(updateListRunnable, 1000 * 60)
|
handler.postDelayed(updateListRunnable, 1000*60)
|
||||||
}
|
}
|
||||||
var logbookRepo: LogbookRepository? = null
|
var logbookRepo: LogbookRepository? = null
|
||||||
var showingOverflowPopupWindow = false
|
var showingOverflowPopupWindow = false
|
||||||
@@ -81,30 +81,34 @@ class MainActivity : AppCompatActivity() {
|
|||||||
recyclerView.setLayoutManager(LinearLayoutManager(applicationContext))
|
recyclerView.setLayoutManager(LinearLayoutManager(applicationContext))
|
||||||
|
|
||||||
// Set listeners
|
// Set listeners
|
||||||
findViewById<View>(R.id.logbooks_add_button).setOnClickListener {
|
findViewById<View>(R.id.logbooks_add_button).setOnClickListener { showAddLogbookDialog(true) }
|
||||||
showAddLogbookDialog(true)
|
findViewById<View>(R.id.button_bottle).setOnClickListener { askBabyBottleContent() }
|
||||||
}
|
findViewById<View>(R.id.button_food).setOnClickListener { askNotes(LunaEvent(LunaEvent.TYPE_FOOD)) }
|
||||||
findViewById<View>(R.id.button_bottle).setOnClickListener {
|
findViewById<View>(R.id.button_nipple_left).setOnClickListener { logEvent(
|
||||||
addBabyBottleEvent(LunaEvent(LunaEvent.TYPE_BABY_BOTTLE))
|
LunaEvent(
|
||||||
}
|
LunaEvent.TYPE_BREASTFEEDING_LEFT_NIPPLE
|
||||||
findViewById<View>(R.id.button_food).setOnClickListener {
|
)
|
||||||
addNoteEvent(LunaEvent(LunaEvent.TYPE_FOOD))
|
) }
|
||||||
}
|
findViewById<View>(R.id.button_nipple_both).setOnClickListener { logEvent(
|
||||||
findViewById<View>(R.id.button_nipple_left).setOnClickListener {
|
LunaEvent(
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_BREASTFEEDING_LEFT_NIPPLE))
|
LunaEvent.TYPE_BREASTFEEDING_BOTH_NIPPLE
|
||||||
}
|
)
|
||||||
findViewById<View>(R.id.button_nipple_both).setOnClickListener {
|
) }
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_BREASTFEEDING_BOTH_NIPPLE))
|
findViewById<View>(R.id.button_nipple_right).setOnClickListener { logEvent(
|
||||||
}
|
LunaEvent(
|
||||||
findViewById<View>(R.id.button_nipple_right).setOnClickListener {
|
LunaEvent.TYPE_BREASTFEEDING_RIGHT_NIPPLE
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_BREASTFEEDING_RIGHT_NIPPLE))
|
)
|
||||||
}
|
) }
|
||||||
findViewById<View>(R.id.button_change_poo).setOnClickListener {
|
findViewById<View>(R.id.button_change_poo).setOnClickListener { logEvent(
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_DIAPERCHANGE_POO))
|
LunaEvent(
|
||||||
}
|
LunaEvent.TYPE_DIAPERCHANGE_POO
|
||||||
findViewById<View>(R.id.button_change_pee).setOnClickListener {
|
)
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_DIAPERCHANGE_PEE))
|
) }
|
||||||
}
|
findViewById<View>(R.id.button_change_pee).setOnClickListener { logEvent(
|
||||||
|
LunaEvent(
|
||||||
|
LunaEvent.TYPE_DIAPERCHANGE_PEE
|
||||||
|
)
|
||||||
|
) }
|
||||||
val moreButton = findViewById<View>(R.id.button_more)
|
val moreButton = findViewById<View>(R.id.button_more)
|
||||||
moreButton.setOnClickListener {
|
moreButton.setOnClickListener {
|
||||||
showOverflowPopupWindow(moreButton)
|
showOverflowPopupWindow(moreButton)
|
||||||
@@ -126,9 +130,9 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private fun setListAdapter(items: ArrayList<LunaEvent>) {
|
private fun setListAdapter(items: ArrayList<LunaEvent>) {
|
||||||
val adapter = LunaEventRecyclerAdapter(this, items)
|
val adapter = LunaEventRecyclerAdapter(this, items)
|
||||||
adapter.onItemClickListener = object : LunaEventRecyclerAdapter.OnItemClickListener {
|
adapter.onItemClickListener = object: LunaEventRecyclerAdapter.OnItemClickListener {
|
||||||
override fun onItemClick(event: LunaEvent) {
|
override fun onItemClick(event: LunaEvent) {
|
||||||
showEventDetailDialog(event)
|
showEventDetailDialog(event, items)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
@@ -191,315 +195,118 @@ class MainActivity : AppCompatActivity() {
|
|||||||
super.onStop()
|
super.onStop()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getAllEvents(): ArrayList<LunaEvent> {
|
fun askBabyBottleContent() {
|
||||||
return logbook?.logs ?: arrayListOf()
|
// Show number picker dialog
|
||||||
}
|
val localSettings = LocalSettingsRepository(this)
|
||||||
|
|
||||||
fun addBabyBottleEvent(event: LunaEvent) {
|
|
||||||
setToPreviousQuantity(event)
|
|
||||||
askBabyBottleContent(event, true) {
|
|
||||||
saveEvent(event)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun askBabyBottleContent(event: LunaEvent, showTime: Boolean, onPositive: () -> Unit) {
|
|
||||||
val d = AlertDialog.Builder(this)
|
val d = AlertDialog.Builder(this)
|
||||||
val dialogView = layoutInflater.inflate(R.layout.dialog_edit_bottle, null)
|
val dialogView = layoutInflater.inflate(R.layout.number_picker_dialog, null)
|
||||||
d.setTitle(R.string.log_bottle_dialog_title)
|
d.setTitle(R.string.log_bottle_dialog_title)
|
||||||
d.setMessage(R.string.log_bottle_dialog_description)
|
d.setMessage(R.string.log_bottle_dialog_description)
|
||||||
d.setView(dialogView)
|
d.setView(dialogView)
|
||||||
|
|
||||||
val numberPicker = dialogView.findViewById<NumberPicker>(R.id.dialog_number_picker)
|
val numberPicker = dialogView.findViewById<NumberPicker>(R.id.dialog_number_picker)
|
||||||
numberPicker.minValue = 1 // "10"
|
numberPicker.minValue = 1 // "10"
|
||||||
numberPicker.maxValue = 25 // "250
|
numberPicker.maxValue = 25 // "250
|
||||||
numberPicker.displayedValues = ((10..250 step 10).map { it.toString() }.toTypedArray())
|
numberPicker.displayedValues = ((10..250 step 10).map { it.toString() }.toTypedArray())
|
||||||
numberPicker.wrapSelectorWheel = false
|
numberPicker.wrapSelectorWheel = false
|
||||||
numberPicker.value = event.quantity / 10
|
numberPicker.value = localSettings.loadBabyBottleContent()
|
||||||
|
|
||||||
val dateTV = dialogView.findViewById<TextView>(R.id.dialog_date_picker)
|
|
||||||
val pickedTime = datePickerHelper(event.time, dateTV)
|
|
||||||
|
|
||||||
if (!showTime) {
|
|
||||||
dateTV.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
||||||
event.time = pickedTime.time.time / 1000
|
logEvent(LunaEvent(LunaEvent.TYPE_BABY_BOTTLE, numberPicker.value * 10))
|
||||||
event.quantity = numberPicker.value * 10
|
localSettings.saveBabyBottleContent(numberPicker.value)
|
||||||
onPositive()
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
}
|
||||||
|
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> dialogInterface.dismiss() }
|
||||||
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i ->
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
val alertDialog = d.create()
|
val alertDialog = d.create()
|
||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addWeightEvent(event: LunaEvent) {
|
fun askWeightValue() {
|
||||||
setToPreviousQuantity(event)
|
|
||||||
askWeightValue(event, true) { saveEvent(event) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun askWeightValue(event: LunaEvent, showTime: Boolean, onPositive: () -> Unit) {
|
|
||||||
// Show number picker dialog
|
// Show number picker dialog
|
||||||
val d = AlertDialog.Builder(this)
|
val d = AlertDialog.Builder(this)
|
||||||
val dialogView = layoutInflater.inflate(R.layout.dialog_edit_weight, null)
|
val dialogView = layoutInflater.inflate(R.layout.number_edit_dialog, null)
|
||||||
d.setTitle(R.string.log_weight_dialog_title)
|
d.setTitle(R.string.log_weight_dialog_title)
|
||||||
d.setMessage(R.string.log_weight_dialog_description)
|
d.setMessage(R.string.log_weight_dialog_description)
|
||||||
d.setView(dialogView)
|
d.setView(dialogView)
|
||||||
|
|
||||||
val weightET = dialogView.findViewById<EditText>(R.id.dialog_number_edittext)
|
val weightET = dialogView.findViewById<EditText>(R.id.dialog_number_edittext)
|
||||||
weightET.setText(event.quantity.toString())
|
|
||||||
|
|
||||||
val dateTV = dialogView.findViewById<TextView>(R.id.dialog_date_picker)
|
|
||||||
val pickedTime = datePickerHelper(event.time, dateTV)
|
|
||||||
|
|
||||||
if (!showTime) {
|
|
||||||
dateTV.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
||||||
val weight = weightET.text.toString().toIntOrNull()
|
val weight = weightET.text.toString().toIntOrNull()
|
||||||
if (weight != null) {
|
if (weight != null)
|
||||||
event.time = pickedTime.time.time / 1000
|
logEvent(LunaEvent(LunaEvent.TYPE_WEIGHT, weight))
|
||||||
event.quantity = weight
|
else
|
||||||
onPositive()
|
|
||||||
} else {
|
|
||||||
Toast.makeText(this, R.string.toast_integer_error, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, R.string.toast_integer_error, Toast.LENGTH_SHORT).show()
|
||||||
}
|
|
||||||
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
}
|
||||||
|
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> dialogInterface.dismiss() }
|
||||||
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i ->
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
val alertDialog = d.create()
|
val alertDialog = d.create()
|
||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addTemperatureEvent(event: LunaEvent) {
|
fun askTemperatureValue() {
|
||||||
setToPreviousQuantity(event)
|
|
||||||
askTemperatureValue(event, true) { saveEvent(event) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun askTemperatureValue(event: LunaEvent, showTime: Boolean, onPositive: () -> Unit) {
|
|
||||||
// Show number picker dialog
|
// Show number picker dialog
|
||||||
val d = AlertDialog.Builder(this)
|
val d = AlertDialog.Builder(this)
|
||||||
val dialogView = layoutInflater.inflate(R.layout.dialog_edit_temperature, null)
|
val dialogView = layoutInflater.inflate(R.layout.temperature_dialog, null)
|
||||||
d.setTitle(R.string.log_temperature_dialog_title)
|
d.setTitle(R.string.log_temperature_dialog_title)
|
||||||
d.setMessage(R.string.log_temperature_dialog_description)
|
d.setMessage(R.string.log_temperature_dialog_description)
|
||||||
d.setView(dialogView)
|
d.setView(dialogView)
|
||||||
|
|
||||||
val tempSlider = dialogView.findViewById<Slider>(R.id.dialog_temperature_value)
|
val tempSlider = dialogView.findViewById<Slider>(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.valueFrom = range.first.toFloat()
|
||||||
tempSlider.valueTo = range.second.toFloat()
|
tempSlider.valueTo = range.second.toFloat()
|
||||||
tempSlider.value = if (event.quantity == 0) {
|
tempSlider.value = range.third.toFloat()
|
||||||
range.third.toFloat() // default
|
|
||||||
} else {
|
|
||||||
event.quantity.toFloat() / 10
|
|
||||||
}
|
|
||||||
|
|
||||||
val dateTV = dialogView.findViewById<TextView>(R.id.dialog_date_picker)
|
|
||||||
val pickedTime = datePickerHelper(event.time, dateTV)
|
|
||||||
if (!showTime) {
|
|
||||||
dateTV.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
val tempTextView = dialogView.findViewById<TextView>(R.id.dialog_temperature_display)
|
val tempTextView = dialogView.findViewById<TextView>(R.id.dialog_temperature_display)
|
||||||
tempTextView.text = tempSlider.value.toString()
|
tempTextView.text = range.third.toString()
|
||||||
tempSlider.addOnChangeListener({ s, v, b -> tempTextView.text = v.toString() })
|
tempSlider.addOnChangeListener({s, v, b -> tempTextView.text = v.toString()})
|
||||||
|
|
||||||
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
||||||
event.time = pickedTime.time.time / 1000
|
val temperature = (tempSlider.value * 10).toInt() // In tenth of a grade
|
||||||
event.quantity = (tempSlider.value * 10).toInt() // temperature in tenth of a grade
|
logEvent(LunaEvent(LunaEvent.TYPE_TEMPERATURE, temperature))
|
||||||
onPositive()
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
}
|
||||||
|
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> dialogInterface.dismiss() }
|
||||||
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i ->
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
val alertDialog = d.create()
|
val alertDialog = d.create()
|
||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun datePickerHelper(time: Long, dateTextView: TextView): Calendar {
|
fun askPukeValue() {
|
||||||
dateTextView.text = DateUtils.formatDateTime(time)
|
|
||||||
|
|
||||||
val dateTime = Calendar.getInstance()
|
|
||||||
dateTime.time = Date(time * 1000)
|
|
||||||
dateTextView.setOnClickListener {
|
|
||||||
// Show datetime picker
|
|
||||||
val startYear = dateTime.get(Calendar.YEAR)
|
|
||||||
val startMonth = dateTime.get(Calendar.MONTH)
|
|
||||||
val startDay = dateTime.get(Calendar.DAY_OF_MONTH)
|
|
||||||
val startHour = dateTime.get(Calendar.HOUR_OF_DAY)
|
|
||||||
val startMinute = dateTime.get(Calendar.MINUTE)
|
|
||||||
|
|
||||||
DatePickerDialog(this, { _, year, month, day ->
|
|
||||||
TimePickerDialog(
|
|
||||||
this,
|
|
||||||
{ _, hour, minute ->
|
|
||||||
dateTime.set(year, month, day, hour, minute)
|
|
||||||
dateTextView.text = DateUtils.formatDateTime(dateTime.time.time / 1000)
|
|
||||||
},
|
|
||||||
startHour,
|
|
||||||
startMinute,
|
|
||||||
android.text.format.DateFormat.is24HourFormat(this@MainActivity)
|
|
||||||
).show()
|
|
||||||
}, startYear, startMonth, startDay).show()
|
|
||||||
}
|
|
||||||
|
|
||||||
return dateTime
|
|
||||||
}
|
|
||||||
|
|
||||||
fun saveEvent(event: LunaEvent) {
|
|
||||||
if (!getAllEvents().contains(event)) {
|
|
||||||
// new event
|
|
||||||
logEvent(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
logbook?.sort()
|
|
||||||
recyclerView.adapter?.notifyDataSetChanged()
|
|
||||||
saveLogbook()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun addPukeEvent(event: LunaEvent) {
|
|
||||||
askPukeValue(event, true) { saveEvent(event) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun askPukeValue(event: LunaEvent, showTime: Boolean, onPositive: () -> Unit) {
|
|
||||||
val d = AlertDialog.Builder(this)
|
val d = AlertDialog.Builder(this)
|
||||||
val dialogView = layoutInflater.inflate(R.layout.dialog_edit_puke, null)
|
val dialogView = layoutInflater.inflate(R.layout.puke_dialog, null)
|
||||||
d.setTitle(R.string.log_puke_dialog_title)
|
d.setTitle(R.string.log_puke_dialog_title)
|
||||||
d.setMessage(R.string.log_puke_dialog_description)
|
d.setMessage(R.string.log_puke_dialog_description)
|
||||||
d.setView(dialogView)
|
d.setView(dialogView)
|
||||||
|
|
||||||
val spinner = dialogView.findViewById<Spinner>(R.id.dialog_puke_value)
|
val spinner = dialogView.findViewById<Spinner>(R.id.dialog_puke_value)
|
||||||
spinner.adapter = ArrayAdapter.createFromResource(
|
spinner.adapter = ArrayAdapter.createFromResource(this, R.array.AmountLabels, android.R.layout.simple_spinner_dropdown_item)
|
||||||
this,
|
spinner.setSelection(1)
|
||||||
R.array.AmountLabels,
|
|
||||||
android.R.layout.simple_spinner_dropdown_item
|
|
||||||
)
|
|
||||||
spinner.setSelection(event.quantity - 1)
|
|
||||||
|
|
||||||
val dateTV = dialogView.findViewById<TextView>(R.id.dialog_date_picker)
|
|
||||||
val pickedTime = datePickerHelper(event.time, dateTV)
|
|
||||||
if (!showTime) {
|
|
||||||
dateTV.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
||||||
event.time = pickedTime.time.time / 1000
|
val pos = spinner.selectedItemPosition
|
||||||
event.quantity = spinner.selectedItemPosition + 1
|
logEvent(LunaEvent(LunaEvent.TYPE_PUKE, pos + 1))
|
||||||
onPositive()
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
}
|
||||||
|
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> dialogInterface.dismiss() }
|
||||||
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i ->
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
val alertDialog = d.create()
|
val alertDialog = d.create()
|
||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addPlainEvent(event: LunaEvent) {
|
fun askNotes(lunaEvent: LunaEvent) {
|
||||||
askDateValue(event, true) { saveEvent(event) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ask to edit events to be edited (only affects date)
|
|
||||||
fun askDateValue(event: LunaEvent, showTime: Boolean, onPositive: () -> Unit) {
|
|
||||||
val d = AlertDialog.Builder(this)
|
val d = AlertDialog.Builder(this)
|
||||||
val dialogView = layoutInflater.inflate(R.layout.dialog_edit_plain, null)
|
val dialogView = layoutInflater.inflate(R.layout.dialog_notes, null)
|
||||||
d.setTitle(event.getTypeDescription(this))
|
d.setTitle(lunaEvent.getTypeDescription(this))
|
||||||
d.setMessage(event.getDialogMessage(this))
|
d.setMessage(lunaEvent.getDialogMessage(this))
|
||||||
d.setView(dialogView)
|
|
||||||
|
|
||||||
val dateTV = dialogView.findViewById<TextView>(R.id.dialog_date_picker)
|
|
||||||
val pickedDateTime = datePickerHelper(event.time, dateTV)
|
|
||||||
if (!showTime) {
|
|
||||||
dateTV.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
|
||||||
event.time = pickedDateTime.time.time / 1000
|
|
||||||
onPositive()
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i ->
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
val alertDialog = d.create()
|
|
||||||
alertDialog.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun addNoteEvent(event: LunaEvent) {
|
|
||||||
askNotes(event, true) { saveEvent(event) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun askNotes(event: LunaEvent, showTime: Boolean, onPositive: () -> Unit) {
|
|
||||||
val useQuantity = (event.type != LunaEvent.TYPE_NOTE && event.type != LunaEvent.TYPE_CUSTOM)
|
|
||||||
|
|
||||||
val d = AlertDialog.Builder(this)
|
|
||||||
val dialogView = layoutInflater.inflate(R.layout.dialog_edit_notes, null)
|
|
||||||
d.setTitle(event.getTypeDescription(this))
|
|
||||||
d.setMessage(event.getDialogMessage(this))
|
|
||||||
d.setView(dialogView)
|
d.setView(dialogView)
|
||||||
val notesET = dialogView.findViewById<EditText>(R.id.notes_edittext)
|
val notesET = dialogView.findViewById<EditText>(R.id.notes_edittext)
|
||||||
val qtyET = dialogView.findViewById<EditText>(R.id.notes_qty_edittext)
|
val qtyET = dialogView.findViewById<EditText>(R.id.notes_qty_edittext)
|
||||||
|
if (lunaEvent.type == LunaEvent.TYPE_NOTE || lunaEvent.type == LunaEvent.TYPE_CUSTOM)
|
||||||
val dateTV = dialogView.findViewById<TextView>(R.id.dialog_date_picker)
|
|
||||||
val pickedTime = datePickerHelper(event.time, dateTV)
|
|
||||||
|
|
||||||
if (!showTime) {
|
|
||||||
dateTV.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
notesET.setText(event.notes)
|
|
||||||
|
|
||||||
if (useQuantity) {
|
|
||||||
qtyET.setText(event.quantity.toString())
|
|
||||||
} else {
|
|
||||||
qtyET.visibility = View.GONE
|
qtyET.visibility = View.GONE
|
||||||
}
|
|
||||||
|
|
||||||
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
d.setPositiveButton(android.R.string.ok) { dialogInterface, i ->
|
||||||
val notes = notesET.text.toString()
|
val qtyStr = qtyET.text.toString()
|
||||||
|
if (qtyStr.isNotEmpty()) {
|
||||||
if (useQuantity) {
|
val qty = qtyStr.toIntOrNull()
|
||||||
val quantity = qtyET.text.toString().toIntOrNull()
|
if (qty == null) {
|
||||||
if (quantity != null) {
|
Toast.makeText(this, R.string.toast_integer_error, Toast.LENGTH_SHORT).show()
|
||||||
event.time = pickedTime.time.time / 1000
|
return@setPositiveButton
|
||||||
event.notes = notes
|
|
||||||
event.quantity = quantity
|
|
||||||
onPositive()
|
|
||||||
} else {
|
|
||||||
Toast.makeText(applicationContext, R.string.toast_integer_error, Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
}
|
||||||
|
lunaEvent.quantity = qty
|
||||||
} else {
|
|
||||||
event.time = pickedTime.time.time / 1000
|
|
||||||
event.notes = notes
|
|
||||||
onPositive()
|
|
||||||
}
|
}
|
||||||
|
val notes = notesET.text.toString()
|
||||||
dialogInterface.dismiss()
|
lunaEvent.notes = notes
|
||||||
|
logEvent(lunaEvent)
|
||||||
}
|
}
|
||||||
|
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> dialogInterface.dismiss() }
|
||||||
d.setNegativeButton(android.R.string.cancel) { dialogInterface, i ->
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
val alertDialog = d.create()
|
val alertDialog = d.create()
|
||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
@@ -524,13 +331,6 @@ class MainActivity : AppCompatActivity() {
|
|||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setToPreviousQuantity(event: LunaEvent) {
|
|
||||||
val prev = getPreviousSameEvent(event, getAllEvents())
|
|
||||||
if (prev != null) {
|
|
||||||
event.quantity = prev.quantity
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getPreviousSameEvent(event: LunaEvent, items: ArrayList<LunaEvent>): LunaEvent? {
|
fun getPreviousSameEvent(event: LunaEvent, items: ArrayList<LunaEvent>): LunaEvent? {
|
||||||
var previousEvent: LunaEvent? = null
|
var previousEvent: LunaEvent? = null
|
||||||
for (item in items) {
|
for (item in items) {
|
||||||
@@ -559,83 +359,55 @@ class MainActivity : AppCompatActivity() {
|
|||||||
return nextEvent
|
return nextEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
fun showEventDetailDialog(originalEvent: LunaEvent) {
|
fun showEventDetailDialog(event: LunaEvent, items: ArrayList<LunaEvent>) {
|
||||||
val event = LunaEvent(originalEvent)
|
|
||||||
|
|
||||||
// Do not update list while the detail is shown, to avoid changing the object below while it is changed by the user
|
// Do not update list while the detail is shown, to avoid changing the object below while it is changed by the user
|
||||||
pauseLogbookUpdate = true
|
pauseLogbookUpdate = true
|
||||||
|
|
||||||
val d = AlertDialog.Builder(this)
|
val d = AlertDialog.Builder(this)
|
||||||
d.setTitle(R.string.dialog_event_detail_title)
|
d.setTitle(R.string.dialog_event_detail_title)
|
||||||
|
val dialogView = layoutInflater.inflate(R.layout.dialog_event_detail, null)
|
||||||
|
dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_emoji).text = event.getTypeEmoji(this)
|
||||||
|
dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_description).text = event.getTypeDescription(this)
|
||||||
|
dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_quantity).text =
|
||||||
|
NumericUtils(this).formatEventQuantity(event)
|
||||||
|
dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_notes).text = event.notes
|
||||||
|
|
||||||
|
val currentDateTime = Calendar.getInstance()
|
||||||
|
currentDateTime.time = Date(event.time * 1000)
|
||||||
|
|
||||||
val dialogView = layoutInflater.inflate(R.layout.dialog_event_details, null)
|
|
||||||
val emojiTextView = dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_emoji)
|
|
||||||
val descriptionTextView = dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_description)
|
|
||||||
val dateTextView = dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_date)
|
val dateTextView = dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_date)
|
||||||
val quantityTextView = dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_quantity)
|
dateTextView.text = String.format(getString(R.string.dialog_event_detail_datetime_icon), DateUtils.formatDateTime(event.time))
|
||||||
val notesTextView = dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_notes)
|
dateTextView.setOnClickListener {
|
||||||
|
// Show datetime picker
|
||||||
|
val startYear = currentDateTime.get(Calendar.YEAR)
|
||||||
|
val startMonth = currentDateTime.get(Calendar.MONTH)
|
||||||
|
val startDay = currentDateTime.get(Calendar.DAY_OF_MONTH)
|
||||||
|
val startHour = currentDateTime.get(Calendar.HOUR_OF_DAY)
|
||||||
|
val startMinute = currentDateTime.get(Calendar.MINUTE)
|
||||||
|
|
||||||
emojiTextView.text = event.getTypeEmoji(this)
|
DatePickerDialog(this, { _, year, month, day ->
|
||||||
descriptionTextView.text = event.getTypeDescription(this)
|
TimePickerDialog(this, { _, hour, minute ->
|
||||||
|
val pickedDateTime = Calendar.getInstance()
|
||||||
val pickedTime = datePickerHelper(event.time, dateTextView)
|
pickedDateTime.set(year, month, day, hour, minute)
|
||||||
val updateValues = {
|
// Save event and move it to the right position in the logbook
|
||||||
quantityTextView.text = NumericUtils(this).formatEventQuantity(event)
|
event.time = pickedDateTime.time.time / 1000 // Seconds since epoch
|
||||||
notesTextView.text = event.notes
|
dateTextView.text = String.format(getString(R.string.dialog_event_detail_datetime_icon), DateUtils.formatDateTime(event.time))
|
||||||
}
|
logbook?.sort()
|
||||||
updateValues()
|
recyclerView.adapter?.notifyDataSetChanged()
|
||||||
|
saveLogbook()
|
||||||
quantityTextView.setOnClickListener {
|
}, startHour, startMinute, android.text.format.DateFormat.is24HourFormat(this@MainActivity)).show()
|
||||||
when (event.type) {
|
}, startYear, startMonth, startDay).show()
|
||||||
LunaEvent.TYPE_BABY_BOTTLE -> askBabyBottleContent(event, false, updateValues)
|
|
||||||
LunaEvent.TYPE_WEIGHT -> askWeightValue(event, false, updateValues)
|
|
||||||
LunaEvent.TYPE_PUKE -> askPukeValue(event, false, updateValues)
|
|
||||||
LunaEvent.TYPE_TEMPERATURE -> askTemperatureValue(event, false, updateValues)
|
|
||||||
LunaEvent.TYPE_NOTE -> askNotes(event, false, updateValues)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
notesTextView.setOnClickListener {
|
|
||||||
when (event.type) {
|
|
||||||
LunaEvent.TYPE_FOOD,
|
|
||||||
LunaEvent.TYPE_MEDICINE,
|
|
||||||
LunaEvent.TYPE_NOTE -> askNotes(event, false, updateValues)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
d.setView(dialogView)
|
d.setView(dialogView)
|
||||||
|
d.setPositiveButton(R.string.dialog_event_detail_close_button) { dialogInterface, i -> dialogInterface.dismiss() }
|
||||||
d.setNeutralButton(R.string.dialog_event_detail_delete_button) { dialogInterface, i ->
|
d.setNeutralButton(R.string.dialog_event_detail_delete_button) { dialogInterface, i -> deleteEvent(event) }
|
||||||
deleteEvent(originalEvent)
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
d.setPositiveButton(R.string.dialog_event_detail_close_button) { dialogInterface, i ->
|
|
||||||
event.time = pickedTime.time.time / 1000
|
|
||||||
|
|
||||||
if (event.time != originalEvent.time
|
|
||||||
|| event.quantity != originalEvent.quantity
|
|
||||||
|| event.notes != originalEvent.notes) {
|
|
||||||
originalEvent.time = event.time
|
|
||||||
originalEvent.quantity = event.quantity
|
|
||||||
originalEvent.notes = event.notes
|
|
||||||
saveEvent(originalEvent)
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogInterface.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
val alertDialog = d.create()
|
val alertDialog = d.create()
|
||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
|
alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(ContextCompat.getColor(this, R.color.danger))
|
||||||
alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(
|
alertDialog.setOnDismissListener({
|
||||||
ContextCompat.getColor(this, R.color.danger)
|
|
||||||
)
|
|
||||||
|
|
||||||
alertDialog.setOnDismissListener {
|
|
||||||
// Resume logbook update
|
// Resume logbook update
|
||||||
pauseLogbookUpdate = false
|
pauseLogbookUpdate = false
|
||||||
}
|
})
|
||||||
|
|
||||||
// show optional signature
|
// show optional signature
|
||||||
if (event.signature.isNotEmpty()) {
|
if (event.signature.isNotEmpty()) {
|
||||||
@@ -644,33 +416,32 @@ class MainActivity : AppCompatActivity() {
|
|||||||
signatureTextEdit.visibility = View.VISIBLE
|
signatureTextEdit.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
val allEvents = getAllEvents()
|
// create next/previous links to events of the same type
|
||||||
|
|
||||||
// create link to prevent event of the same type
|
|
||||||
val previousTextView = dialogView.findViewById<TextView>(R.id.dialog_event_previous)
|
val previousTextView = dialogView.findViewById<TextView>(R.id.dialog_event_previous)
|
||||||
val previousEvent = getPreviousSameEvent(event, allEvents)
|
val nextTextView = dialogView.findViewById<TextView>(R.id.dialog_event_next)
|
||||||
|
val nextEvent = getNextSameEvent(event, items)
|
||||||
|
val previousEvent = getPreviousSameEvent(event, items)
|
||||||
|
|
||||||
if (previousEvent != null) {
|
if (previousEvent != null) {
|
||||||
val emoji = previousEvent.getTypeEmoji(applicationContext)
|
val emoji = previousEvent.getTypeEmoji(applicationContext)
|
||||||
val time = DateUtils.formatTimeDuration(applicationContext, event.time - previousEvent.time)
|
val time = DateUtils.formatTimeDuration(applicationContext, event.time - previousEvent.time)
|
||||||
previousTextView.text = String.format("⬅️ %s %s", emoji, time)
|
previousTextView.text = String.format("⬅️ %s %s", emoji, time)
|
||||||
previousTextView.setOnClickListener {
|
previousTextView.setOnClickListener {
|
||||||
alertDialog.cancel()
|
alertDialog.cancel()
|
||||||
showEventDetailDialog(previousEvent)
|
showEventDetailDialog(previousEvent, items)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
previousTextView.visibility = View.GONE
|
previousTextView.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
|
||||||
// create link to next event of the same type
|
|
||||||
val nextTextView = dialogView.findViewById<TextView>(R.id.dialog_event_next)
|
|
||||||
val nextEvent = getNextSameEvent(event, allEvents)
|
|
||||||
if (nextEvent != null) {
|
if (nextEvent != null) {
|
||||||
val emoji = nextEvent.getTypeEmoji(applicationContext)
|
val emoji = nextEvent.getTypeEmoji(applicationContext)
|
||||||
val time = DateUtils.formatTimeDuration(applicationContext, nextEvent.time - event.time)
|
val time = DateUtils.formatTimeDuration(applicationContext, nextEvent.time - event.time)
|
||||||
nextTextView.text = String.format("%s %s ➡️", time, emoji)
|
nextTextView.text = String.format("%s %s ➡️", time, emoji)
|
||||||
nextTextView.setOnClickListener {
|
nextTextView.setOnClickListener {
|
||||||
alertDialog.cancel()
|
alertDialog.cancel()
|
||||||
showEventDetailDialog(nextEvent)
|
showEventDetailDialog(nextEvent, items)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nextTextView.visibility = View.GONE
|
nextTextView.visibility = View.GONE
|
||||||
@@ -778,7 +549,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
runOnUiThread({
|
runOnUiThread({
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
loadLogbookList()
|
loadLogbookList()
|
||||||
Toast.makeText(applicationContext, getString(R.string.logbook_created) + logbookName, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@MainActivity, getString(R.string.logbook_created) + logbookName, Toast.LENGTH_SHORT).show()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -935,7 +706,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
setLoading(false)
|
setLoading(false)
|
||||||
|
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
applicationContext,
|
this@MainActivity,
|
||||||
if (lastEventAdded != null)
|
if (lastEventAdded != null)
|
||||||
R.string.toast_event_added
|
R.string.toast_event_added
|
||||||
else
|
else
|
||||||
@@ -997,7 +768,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
runOnUiThread({
|
runOnUiThread({
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
|
|
||||||
Toast.makeText(applicationContext, R.string.toast_event_add_error, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@MainActivity, R.string.toast_event_add_error, Toast.LENGTH_SHORT).show()
|
||||||
recyclerView.adapter?.notifyDataSetChanged()
|
recyclerView.adapter?.notifyDataSetChanged()
|
||||||
savingEvent(false)
|
savingEvent(false)
|
||||||
})
|
})
|
||||||
@@ -1030,37 +801,41 @@ class MainActivity : AppCompatActivity() {
|
|||||||
val inflater = LayoutInflater.from(anchor.context)
|
val inflater = LayoutInflater.from(anchor.context)
|
||||||
contentView = inflater.inflate(R.layout.more_events_popup, null)
|
contentView = inflater.inflate(R.layout.more_events_popup, null)
|
||||||
contentView.findViewById<View>(R.id.button_medicine).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_medicine).setOnClickListener {
|
||||||
addNoteEvent(LunaEvent(LunaEvent.TYPE_MEDICINE))
|
askNotes(LunaEvent(LunaEvent.TYPE_MEDICINE))
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
contentView.findViewById<View>(R.id.button_enema).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_enema).setOnClickListener({
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_ENEMA))
|
logEvent(LunaEvent(LunaEvent.TYPE_ENEMA))
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
})
|
||||||
contentView.findViewById<View>(R.id.button_note).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_note).setOnClickListener({
|
||||||
addNoteEvent(LunaEvent(LunaEvent.TYPE_NOTE))
|
askNotes(LunaEvent(LunaEvent.TYPE_NOTE))
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
})
|
||||||
contentView.findViewById<View>(R.id.button_temperature).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_temperature).setOnClickListener({
|
||||||
addTemperatureEvent(LunaEvent(LunaEvent.TYPE_TEMPERATURE))
|
askTemperatureValue()
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
})
|
||||||
contentView.findViewById<View>(R.id.button_puke).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_puke).setOnClickListener({
|
||||||
addPukeEvent(LunaEvent(LunaEvent.TYPE_PUKE, 1))
|
askPukeValue()
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
})
|
||||||
contentView.findViewById<View>(R.id.button_colic).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_colic).setOnClickListener({
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_COLIC))
|
logEvent(
|
||||||
|
LunaEvent(LunaEvent.TYPE_COLIC)
|
||||||
|
)
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
})
|
||||||
contentView.findViewById<View>(R.id.button_scale).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_scale).setOnClickListener({
|
||||||
addWeightEvent(LunaEvent(LunaEvent.TYPE_WEIGHT))
|
askWeightValue()
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
})
|
||||||
contentView.findViewById<View>(R.id.button_bath).setOnClickListener {
|
contentView.findViewById<View>(R.id.button_bath).setOnClickListener({
|
||||||
addPlainEvent(LunaEvent(LunaEvent.TYPE_BATH))
|
logEvent(
|
||||||
|
LunaEvent(LunaEvent.TYPE_BATH)
|
||||||
|
)
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
})
|
||||||
}.also { popupWindow ->
|
}.also { popupWindow ->
|
||||||
popupWindow.setOnDismissListener({
|
popupWindow.setOnDismissListener({
|
||||||
Handler(mainLooper).postDelayed({
|
Handler(mainLooper).postDelayed({
|
||||||
|
|||||||
@@ -69,15 +69,6 @@ class LunaEvent: Comparable<LunaEvent> {
|
|||||||
throw IllegalArgumentException("JSONObject is not a LunaEvent")
|
throw IllegalArgumentException("JSONObject is not a LunaEvent")
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(event: LunaEvent) {
|
|
||||||
this.jo = JSONObject()
|
|
||||||
this.type = event.type
|
|
||||||
this.time = event.time
|
|
||||||
this.quantity = event.quantity
|
|
||||||
this.notes = event.notes
|
|
||||||
this.signature = event.signature
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(type: String) {
|
constructor(type: String) {
|
||||||
this.jo = JSONObject()
|
this.jo = JSONObject()
|
||||||
this.time = System.currentTimeMillis() / 1000
|
this.time = System.currentTimeMillis() / 1000
|
||||||
|
|||||||
@@ -23,6 +23,14 @@ class LocalSettingsRepository(val context: Context) {
|
|||||||
sharedPreferences = context.getSharedPreferences(SHARED_PREFS_FILE_NAME, MODE_PRIVATE)
|
sharedPreferences = context.getSharedPreferences(SHARED_PREFS_FILE_NAME, MODE_PRIVATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun saveBabyBottleContent(content: Int) {
|
||||||
|
sharedPreferences.edit { putInt(SHARED_PREFS_BB_CONTENT, content) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun loadBabyBottleContent(): Int {
|
||||||
|
return sharedPreferences.getInt(SHARED_PREFS_BB_CONTENT, 1)
|
||||||
|
}
|
||||||
|
|
||||||
fun saveSignature(content: String) {
|
fun saveSignature(content: String) {
|
||||||
sharedPreferences.edit { putString(SHARED_PREFS_SIGNATURE, content) }
|
sharedPreferences.edit { putString(SHARED_PREFS_SIGNATURE, content) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,21 +60,21 @@ class NumericUtils (val context: Context) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun formatEventQuantity(event: LunaEvent): String {
|
fun formatEventQuantity(item: LunaEvent): String {
|
||||||
val formatted = StringBuilder()
|
val formatted = StringBuilder()
|
||||||
if (event.quantity > 0) {
|
if (item.quantity > 0) {
|
||||||
formatted.append(when (event.type) {
|
formatted.append(when (item.type) {
|
||||||
LunaEvent.TYPE_TEMPERATURE ->
|
LunaEvent.TYPE_TEMPERATURE ->
|
||||||
(event.quantity / 10.0f).toString()
|
(item.quantity / 10.0f).toString()
|
||||||
LunaEvent.TYPE_PUKE ->
|
LunaEvent.TYPE_PUKE ->
|
||||||
context.resources.getStringArray(R.array.AmountLabels)[event.quantity - 1]
|
context.resources.getStringArray(R.array.AmountLabels)[item.quantity - 1]
|
||||||
else ->
|
else ->
|
||||||
event.quantity
|
item.quantity
|
||||||
})
|
})
|
||||||
|
|
||||||
formatted.append(" ")
|
formatted.append(" ")
|
||||||
formatted.append(
|
formatted.append(
|
||||||
when (event.type) {
|
when (item.type) {
|
||||||
LunaEvent.TYPE_BABY_BOTTLE -> measurement_unit_liquid_base
|
LunaEvent.TYPE_BABY_BOTTLE -> measurement_unit_liquid_base
|
||||||
LunaEvent.TYPE_WEIGHT -> measurement_unit_weight_base
|
LunaEvent.TYPE_WEIGHT -> measurement_unit_weight_base
|
||||||
LunaEvent.TYPE_MEDICINE -> measurement_unit_weight_tiny
|
LunaEvent.TYPE_MEDICINE -> measurement_unit_weight_tiny
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<NumberPicker
|
|
||||||
android:id="@+id/dialog_number_picker"
|
|
||||||
android:layout_width="150dp"
|
|
||||||
android:layout_height="wrap_content"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="10dp"
|
|
||||||
android:text="ml"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/dialog_date_picker"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_marginTop="20dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/dialog_number_edittext"
|
|
||||||
android:layout_width="150dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="number"
|
|
||||||
android:hint="0"
|
|
||||||
android:background="@drawable/textview_background"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="10dp"
|
|
||||||
android:text="g"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/dialog_date_picker"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_marginTop="20dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -36,7 +36,9 @@
|
|||||||
android:drawablePadding="10dp"
|
android:drawablePadding="10dp"
|
||||||
android:drawableTint="@color/accent"
|
android:drawableTint="@color/accent"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:textStyle="bold"/>
|
android:textStyle="bold"
|
||||||
|
android:text="@string/dialog_event_detail_datetime_icon"
|
||||||
|
app:drawableEndCompat="@drawable/ic_edit" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/dialog_event_detail_type_quantity"
|
android:id="@+id/dialog_event_detail_type_quantity"
|
||||||
@@ -24,11 +24,4 @@
|
|||||||
android:hint="@string/log_notes_dialog_note_hint"
|
android:hint="@string/log_notes_dialog_note_hint"
|
||||||
android:background="@drawable/textview_background"/>
|
android:background="@drawable/textview_background"/>
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/dialog_date_picker"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_marginTop="20dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
22
app/src/main/res/layout/number_edit_dialog.xml
Normal file
22
app/src/main/res/layout/number_edit_dialog.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/dialog_number_edittext"
|
||||||
|
android:layout_width="150dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:inputType="number"
|
||||||
|
android:hint="0"
|
||||||
|
android:background="@drawable/textview_background"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:text="g"/>
|
||||||
|
</LinearLayout>
|
||||||
@@ -4,13 +4,16 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:gravity="center"
|
android:gravity="center">
|
||||||
android:orientation="vertical">
|
|
||||||
|
<NumberPicker
|
||||||
|
android:id="@+id/dialog_number_picker"
|
||||||
|
android:layout_width="150dp"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/dialog_date_picker"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="20dp"/>
|
android:layout_marginStart="10dp"
|
||||||
|
android:text="ml"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
@@ -14,10 +14,4 @@
|
|||||||
android:paddingHorizontal="16dp"
|
android:paddingHorizontal="16dp"
|
||||||
android:paddingVertical="8dp"/>
|
android:paddingVertical="8dp"/>
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/dialog_date_picker"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="20dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
@@ -23,11 +23,4 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textSize="30sp"
|
android:textSize="30sp"
|
||||||
android:textColor="@color/accent"/>
|
android:textColor="@color/accent"/>
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/dialog_date_picker"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="20dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
@@ -133,6 +133,7 @@
|
|||||||
<string name="row_luna_event_time">Time</string>
|
<string name="row_luna_event_time">Time</string>
|
||||||
|
|
||||||
<string name="dialog_event_detail_title">Event detail</string>
|
<string name="dialog_event_detail_title">Event detail</string>
|
||||||
|
<string name="dialog_event_detail_datetime_icon" translatable="false">🕒 %s</string>
|
||||||
<string name="dialog_event_detail_close_button">OK</string>
|
<string name="dialog_event_detail_close_button">OK</string>
|
||||||
<string name="dialog_event_detail_delete_button">Delete</string>
|
<string name="dialog_event_detail_delete_button">Delete</string>
|
||||||
<string name="dialog_event_detail_quantity">Quantity</string>
|
<string name="dialog_event_detail_quantity">Quantity</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user