forked from penguin86/luna-tracker
		
	Compare commits
	
		
			10 Commits
		
	
	
		
			e566624a29
			...
			62d2f9deb4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 62d2f9deb4 | |||
| 5d2ba2e3f5 | |||
| 999ab96d9d | |||
| 5797159f8f | |||
| e987d9cd40 | |||
| d57cd8b166 | |||
| 2580bc882a | |||
| baea313cbb | |||
| 15a9fab5f5 | |||
| 63a8dde6c5 | 
@@ -39,6 +39,7 @@ import it.danieleverducci.lunatracker.repository.WebDAVLogbookRepository
 | 
			
		||||
import kotlinx.coroutines.Runnable
 | 
			
		||||
import okio.IOException
 | 
			
		||||
import org.json.JSONException
 | 
			
		||||
import utils.DateUtils
 | 
			
		||||
import utils.NumericUtils
 | 
			
		||||
import java.text.DateFormat
 | 
			
		||||
import java.util.Calendar
 | 
			
		||||
@@ -74,9 +75,9 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
        // Show view
 | 
			
		||||
        setContentView(R.layout.activity_main)
 | 
			
		||||
 | 
			
		||||
        progressIndicator = findViewById<LinearProgressIndicator>(R.id.progress_indicator)
 | 
			
		||||
        buttonsContainer = findViewById<ViewGroup>(R.id.buttons_container)
 | 
			
		||||
        recyclerView = findViewById<RecyclerView>(R.id.list_events)
 | 
			
		||||
        progressIndicator = findViewById(R.id.progress_indicator)
 | 
			
		||||
        buttonsContainer = findViewById(R.id.buttons_container)
 | 
			
		||||
        recyclerView = findViewById(R.id.list_events)
 | 
			
		||||
        recyclerView.setLayoutManager(LinearLayoutManager(applicationContext))
 | 
			
		||||
 | 
			
		||||
        // Set listeners
 | 
			
		||||
@@ -131,7 +132,7 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
        val adapter = LunaEventRecyclerAdapter(this, items)
 | 
			
		||||
        adapter.onItemClickListener = object: LunaEventRecyclerAdapter.OnItemClickListener{
 | 
			
		||||
            override fun onItemClick(event: LunaEvent) {
 | 
			
		||||
                showEventDetailDialog(event)
 | 
			
		||||
                showEventDetailDialog(event, items)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        recyclerView.adapter = adapter
 | 
			
		||||
@@ -308,25 +309,52 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
        alertDialog.show()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun showEventDetailDialog(event: LunaEvent) {
 | 
			
		||||
    fun getPreviousSameEvent(event: LunaEvent, items: ArrayList<LunaEvent>): LunaEvent? {
 | 
			
		||||
        var previousEvent: LunaEvent? = null
 | 
			
		||||
        for (item in items) {
 | 
			
		||||
            if (item.type == event.type && item.time < event.time) {
 | 
			
		||||
                if (previousEvent == null) {
 | 
			
		||||
                    previousEvent = item
 | 
			
		||||
                } else if (previousEvent.time < item.time) {
 | 
			
		||||
                    previousEvent = item
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return previousEvent
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getNextSameEvent(event: LunaEvent, items: ArrayList<LunaEvent>): LunaEvent? {
 | 
			
		||||
        var nextEvent: LunaEvent? = null
 | 
			
		||||
        for (item in items) {
 | 
			
		||||
            if (item.type == event.type && item.time > event.time) {
 | 
			
		||||
                if (nextEvent == null) {
 | 
			
		||||
                    nextEvent = item
 | 
			
		||||
                } else if (nextEvent.time > item.time) {
 | 
			
		||||
                    nextEvent = item
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return nextEvent
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun showEventDetailDialog(event: LunaEvent, items: ArrayList<LunaEvent>) {
 | 
			
		||||
        // Do not update list while the detail is shown, to avoid changing the object below while it is changed by the user
 | 
			
		||||
        pauseLogbookUpdate = true
 | 
			
		||||
        val dateFormat = DateFormat.getDateTimeInstance();
 | 
			
		||||
        val dateFormat = DateFormat.getDateTimeInstance()
 | 
			
		||||
        val d = AlertDialog.Builder(this)
 | 
			
		||||
        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).setText(event.getTypeEmoji(this))
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_description).setText(event.getTypeDescription(this))
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_quantity).setText(
 | 
			
		||||
        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).setText(event.notes)
 | 
			
		||||
        dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_notes).text = event.notes
 | 
			
		||||
 | 
			
		||||
        val currentDateTime = Calendar.getInstance()
 | 
			
		||||
        currentDateTime.time = Date(event.time * 1000)
 | 
			
		||||
        val dateTextView = dialogView.findViewById<TextView>(R.id.dialog_event_detail_type_date)
 | 
			
		||||
        dateTextView.text = String.format(getString(R.string.dialog_event_detail_datetime_icon), dateFormat.format(currentDateTime.time))
 | 
			
		||||
        dateTextView.setOnClickListener({
 | 
			
		||||
        dateTextView.setOnClickListener {
 | 
			
		||||
            // Show datetime picker
 | 
			
		||||
            val startYear = currentDateTime.get(Calendar.YEAR)
 | 
			
		||||
            val startMonth = currentDateTime.get(Calendar.MONTH)
 | 
			
		||||
@@ -334,8 +362,8 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
            val startHour = currentDateTime.get(Calendar.HOUR_OF_DAY)
 | 
			
		||||
            val startMinute = currentDateTime.get(Calendar.MINUTE)
 | 
			
		||||
 | 
			
		||||
            DatePickerDialog(this, DatePickerDialog.OnDateSetListener { _, year, month, day ->
 | 
			
		||||
                TimePickerDialog(this, TimePickerDialog.OnTimeSetListener { _, hour, minute ->
 | 
			
		||||
            DatePickerDialog(this, { _, year, month, day ->
 | 
			
		||||
                TimePickerDialog(this, { _, hour, minute ->
 | 
			
		||||
                    val pickedDateTime = Calendar.getInstance()
 | 
			
		||||
                    pickedDateTime.set(year, month, day, hour, minute)
 | 
			
		||||
                    currentDateTime.time = pickedDateTime.time
 | 
			
		||||
@@ -346,9 +374,9 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
                    logbook?.sort()
 | 
			
		||||
                    recyclerView.adapter?.notifyDataSetChanged()
 | 
			
		||||
                    saveLogbook()
 | 
			
		||||
                }, startHour, startMinute, false).show()
 | 
			
		||||
                }, startHour, startMinute, android.text.format.DateFormat.is24HourFormat(this@MainActivity)).show()
 | 
			
		||||
            }, startYear, startMonth, startDay).show()
 | 
			
		||||
        })
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        d.setView(dialogView)
 | 
			
		||||
        d.setPositiveButton(R.string.dialog_event_detail_close_button) { dialogInterface, i -> dialogInterface.dismiss() }
 | 
			
		||||
@@ -360,6 +388,37 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
            // Resume logbook update
 | 
			
		||||
            pauseLogbookUpdate = false
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        // create next/previous links to events of the same type
 | 
			
		||||
 | 
			
		||||
        val previousTextView = dialogView.findViewById<TextView>(R.id.dialog_event_previous)
 | 
			
		||||
        val nextTextView = dialogView.findViewById<TextView>(R.id.dialog_event_next)
 | 
			
		||||
        val nextEvent = getNextSameEvent(event, items)
 | 
			
		||||
        val previousEvent = getPreviousSameEvent(event, items)
 | 
			
		||||
 | 
			
		||||
        if (previousEvent != null) {
 | 
			
		||||
            val emoji = previousEvent.getTypeEmoji(applicationContext)
 | 
			
		||||
            val time = DateUtils.formatTimeDuration(applicationContext, event.time - previousEvent.time)
 | 
			
		||||
            previousTextView.text = String.format("⬅️ %s %s", emoji, time)
 | 
			
		||||
            previousTextView.setOnClickListener {
 | 
			
		||||
                alertDialog.cancel()
 | 
			
		||||
                showEventDetailDialog(previousEvent, items)
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            previousTextView.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (nextEvent != null) {
 | 
			
		||||
            val emoji = nextEvent.getTypeEmoji(applicationContext)
 | 
			
		||||
            val time = DateUtils.formatTimeDuration(applicationContext, nextEvent.time - event.time)
 | 
			
		||||
            nextTextView.text = String.format("%s %s ➡️", time, emoji)
 | 
			
		||||
            nextTextView.setOnClickListener {
 | 
			
		||||
                alertDialog.cancel()
 | 
			
		||||
                showEventDetailDialog(nextEvent, items)
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            nextTextView.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun showAddLogbookDialog(requestedByUser: Boolean) {
 | 
			
		||||
@@ -398,7 +457,7 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
                    sAdapter.setDropDownViewResource(R.layout.row_logbook_spinner)
 | 
			
		||||
                    for (ln in logbooksNames) {
 | 
			
		||||
                        sAdapter.add(
 | 
			
		||||
                            if (ln.isEmpty()) getString(R.string.default_logbook_name) else ln
 | 
			
		||||
                            ln.ifEmpty { getString(R.string.default_logbook_name) }
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                    spinner.adapter = sAdapter
 | 
			
		||||
@@ -416,7 +475,6 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        override fun onNothingSelected(parent: AdapterView<*>?) {}
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
@@ -566,7 +624,6 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
                    onRepoError(getString(R.string.settings_generic_error) + error.toString())
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -714,10 +771,10 @@ class MainActivity : AppCompatActivity() {
 | 
			
		||||
            isOutsideTouchable = true
 | 
			
		||||
            val inflater = LayoutInflater.from(anchor.context)
 | 
			
		||||
            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 {
 | 
			
		||||
                askNotes(LunaEvent(LunaEvent.TYPE_MEDICINE))
 | 
			
		||||
                dismiss()
 | 
			
		||||
            })
 | 
			
		||||
            }
 | 
			
		||||
            contentView.findViewById<View>(R.id.button_enema).setOnClickListener({
 | 
			
		||||
                logEvent(LunaEvent(LunaEvent.TYPE_ENEMA))
 | 
			
		||||
                dismiss()
 | 
			
		||||
 
 | 
			
		||||
@@ -12,10 +12,8 @@ import com.thegrizzlylabs.sardineandroid.impl.SardineException
 | 
			
		||||
import it.danieleverducci.lunatracker.repository.FileLogbookRepository
 | 
			
		||||
import it.danieleverducci.lunatracker.repository.LocalSettingsRepository
 | 
			
		||||
import it.danieleverducci.lunatracker.repository.LogbookListObtainedListener
 | 
			
		||||
import it.danieleverducci.lunatracker.repository.LogbookRepository
 | 
			
		||||
import it.danieleverducci.lunatracker.repository.WebDAVLogbookRepository
 | 
			
		||||
import okio.IOException
 | 
			
		||||
import org.json.JSONException
 | 
			
		||||
 | 
			
		||||
open class SettingsActivity : AppCompatActivity() {
 | 
			
		||||
    protected lateinit var settingsRepository: LocalSettingsRepository
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package it.danieleverducci.lunatracker.entities
 | 
			
		||||
 | 
			
		||||
class Logbook(val name: String) {
 | 
			
		||||
    companion object {
 | 
			
		||||
        val MAX_SAFE_LOGBOOK_SIZE = 30000
 | 
			
		||||
        const val MAX_SAFE_LOGBOOK_SIZE = 30000
 | 
			
		||||
    }
 | 
			
		||||
    val logs = ArrayList<LunaEvent>()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,20 +14,20 @@ import java.util.Date
 | 
			
		||||
class LunaEvent: Comparable<LunaEvent> {
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        val TYPE_BABY_BOTTLE = "BABY_BOTTLE"
 | 
			
		||||
        val TYPE_WEIGHT = "WEIGHT"
 | 
			
		||||
        val TYPE_BREASTFEEDING_LEFT_NIPPLE = "BREASTFEEDING_LEFT_NIPPLE"
 | 
			
		||||
        val TYPE_BREASTFEEDING_BOTH_NIPPLE = "BREASTFEEDING_BOTH_NIPPLE"
 | 
			
		||||
        val TYPE_BREASTFEEDING_RIGHT_NIPPLE = "BREASTFEEDING_RIGHT_NIPPLE"
 | 
			
		||||
        val TYPE_DIAPERCHANGE_POO = "DIAPERCHANGE_POO"
 | 
			
		||||
        val TYPE_DIAPERCHANGE_PEE = "DIAPERCHANGE_PEE"
 | 
			
		||||
        val TYPE_MEDICINE = "MEDICINE"
 | 
			
		||||
        val TYPE_ENEMA = "ENEMA"
 | 
			
		||||
        val TYPE_NOTE = "NOTE"
 | 
			
		||||
        val TYPE_CUSTOM = "CUSTOM"
 | 
			
		||||
        val TYPE_COLIC = "COLIC"
 | 
			
		||||
        val TYPE_TEMPERATURE = "TEMPERATURE"
 | 
			
		||||
        val TYPE_FOOD = "FOOD"
 | 
			
		||||
        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"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private val jo: JSONObject
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,62 @@ import java.util.Date
 | 
			
		||||
 | 
			
		||||
class DateUtils {
 | 
			
		||||
    companion object {
 | 
			
		||||
        fun formatTimeDuration(context: Context, secondsDiff: Long): String {
 | 
			
		||||
            var seconds = secondsDiff
 | 
			
		||||
 | 
			
		||||
            val years = (seconds / (365 * 24 * 60 * 60F)).toLong()
 | 
			
		||||
            seconds -= years * (365 * 24 * 60 * 60)
 | 
			
		||||
            val days = (seconds / (24 * 60 * 60F)).toLong()
 | 
			
		||||
            seconds -= days * (24 * 60 * 60)
 | 
			
		||||
            val hours = (seconds / (60 * 60F)).toLong()
 | 
			
		||||
            seconds -= hours * (60 * 60)
 | 
			
		||||
            val minutes = (seconds / 60F).toLong()
 | 
			
		||||
            seconds -= minutes * 60
 | 
			
		||||
 | 
			
		||||
            fun format(value1: Long, value2: Long, resIdSingular1: Int, resIdPlural1: Int, resIdSingular2: Int, resIdPlural2: Int): String {
 | 
			
		||||
                val builder = StringBuilder()
 | 
			
		||||
                if (value1 == 0L) {
 | 
			
		||||
                    // omit
 | 
			
		||||
                } else if (value1 == 1L) {
 | 
			
		||||
                    builder.append(value1)
 | 
			
		||||
                    builder.append(" ")
 | 
			
		||||
                    builder.append(context.getString(resIdSingular1))
 | 
			
		||||
                } else {
 | 
			
		||||
                    builder.append(value1)
 | 
			
		||||
                    builder.append(" ")
 | 
			
		||||
                    builder.append(context.getString(resIdPlural1))
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (value1 > 0L && value2 > 0L) {
 | 
			
		||||
                    builder.append(", ")
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (value2 == 0L) {
 | 
			
		||||
                    // omit
 | 
			
		||||
                } else if (value2 == 1L) {
 | 
			
		||||
                    builder.append(value2)
 | 
			
		||||
                    builder.append(" ")
 | 
			
		||||
                    builder.append(context.getString(resIdSingular2))
 | 
			
		||||
                } else {
 | 
			
		||||
                    builder.append(value2)
 | 
			
		||||
                    builder.append(" ")
 | 
			
		||||
                    builder.append(context.getString(resIdPlural2))
 | 
			
		||||
                }
 | 
			
		||||
                return builder.toString()
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (years > 0) {
 | 
			
		||||
                return format(years, days, R.string.year_ago, R.string.years_ago, R.string.day_ago, R.string.days_ago)
 | 
			
		||||
            } else if (days > 0) {
 | 
			
		||||
                return format(days, hours, R.string.day_ago, R.string.days_ago, R.string.hour_ago, R.string.hours_ago)
 | 
			
		||||
            } else if (hours > 0) {
 | 
			
		||||
                return format(hours, minutes, R.string.hour_ago, R.string.hours_ago, R.string.minute_ago, R.string.minutes_ago)
 | 
			
		||||
            } else if (minutes > 0) {
 | 
			
		||||
                return format(minutes, seconds, R.string.minute_ago, R.string.minute_ago, R.string.second_ago, R.string.seconds_ago)
 | 
			
		||||
            } else {
 | 
			
		||||
                return context.getString(R.string.now)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Formats the provided unix timestamp in a string like "3 hours, 26 minutes ago)
 | 
			
		||||
@@ -25,10 +81,10 @@ class DateUtils {
 | 
			
		||||
                return DateFormat.getDateFormat(context).format(Date(unixTime*1000)) + "\n" +
 | 
			
		||||
                        DateFormat.getTimeFormat(context).format(Date(unixTime*1000))
 | 
			
		||||
 | 
			
		||||
            var formattedTime = StringBuilder()
 | 
			
		||||
            val formattedTime = StringBuilder()
 | 
			
		||||
            if (hoursAgo > 0) {
 | 
			
		||||
                formattedTime.append(hoursAgo).append(" ")
 | 
			
		||||
                if (hoursAgo.toInt() == 1)
 | 
			
		||||
                if (hoursAgo == 1)
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.hour_ago))
 | 
			
		||||
                else
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.hours_ago))
 | 
			
		||||
@@ -37,7 +93,7 @@ class DateUtils {
 | 
			
		||||
                if (formattedTime.isNotEmpty())
 | 
			
		||||
                    formattedTime.append(", ")
 | 
			
		||||
                formattedTime.append(minutesAgo).append(" ")
 | 
			
		||||
                if (minutesAgo.toInt() == 1)
 | 
			
		||||
                if (minutesAgo == 1)
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.minute_ago))
 | 
			
		||||
                else
 | 
			
		||||
                    formattedTime.append(context.getString(R.string.minutes_ago))
 | 
			
		||||
 
 | 
			
		||||
@@ -195,21 +195,30 @@
 | 
			
		||||
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.progressindicator.LinearProgressIndicator
 | 
			
		||||
            android:id="@+id/progress_indicator"
 | 
			
		||||
        <LinearLayout
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_margin="10dp"
 | 
			
		||||
            android:indeterminate="true"
 | 
			
		||||
            app:indicatorColor="@color/accent"
 | 
			
		||||
            android:visibility="invisible"/>
 | 
			
		||||
            android:orientation="horizontal">
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:text="@string/logbook"
 | 
			
		||||
            android:textColor="@color/accent"
 | 
			
		||||
            android:textStyle="bold"/>
 | 
			
		||||
            <TextView
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:text="@string/logbook"
 | 
			
		||||
                android:textColor="@color/accent"
 | 
			
		||||
                android:textStyle="bold"/>
 | 
			
		||||
 | 
			
		||||
            <com.google.android.material.progressindicator.LinearProgressIndicator
 | 
			
		||||
                android:id="@+id/progress_indicator"
 | 
			
		||||
                android:layout_width="0dp"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:layout_weight="1"
 | 
			
		||||
                android:layout_gravity="center"
 | 
			
		||||
                android:layout_marginHorizontal="10dp"
 | 
			
		||||
                android:indeterminate="true"
 | 
			
		||||
                app:indicatorColor="@color/accent"
 | 
			
		||||
                android:visibility="invisible"/>
 | 
			
		||||
 | 
			
		||||
        </LinearLayout>
 | 
			
		||||
 | 
			
		||||
        <androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
            android:id="@+id/list_events"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:orientation="vertical"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
@@ -10,18 +11,18 @@
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:textSize="60dp"
 | 
			
		||||
        android:text="@string/event_diaperchange_pee_type"/>
 | 
			
		||||
        android:textSize="60sp"
 | 
			
		||||
        android:text="@string/event_diaperchange_pee_type" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/dialog_event_detail_type_description"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginTop="10dp"
 | 
			
		||||
        android:layout_marginTop="12dp"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:textColor="@color/accent"
 | 
			
		||||
        android:textSize="24dp"
 | 
			
		||||
        android:text="@string/event_diaperchange_pee_desc"/>
 | 
			
		||||
        android:textSize="32sp"
 | 
			
		||||
        android:text="@string/event_diaperchange_pee_desc" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/dialog_event_detail_type_date"
 | 
			
		||||
@@ -30,18 +31,20 @@
 | 
			
		||||
        android:layout_marginTop="20dp"
 | 
			
		||||
        android:layout_gravity="center_horizontal"
 | 
			
		||||
        android:gravity="center_vertical"
 | 
			
		||||
        android:drawableEnd="@drawable/ic_edit"
 | 
			
		||||
        android:drawablePadding="10dp"
 | 
			
		||||
        android:drawableTint="@color/accent"
 | 
			
		||||
        android:textSize="16sp"
 | 
			
		||||
        android:textStyle="bold"
 | 
			
		||||
        android:text="@string/dialog_event_detail_datetime_icon"/>
 | 
			
		||||
        android:text="@string/dialog_event_detail_datetime_icon"
 | 
			
		||||
        app:drawableEndCompat="@drawable/ic_edit" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/dialog_event_detail_type_quantity"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:text="Quantity"/>
 | 
			
		||||
        android:textSize="28sp"
 | 
			
		||||
        android:text="@string/dialog_event_detail_quantity"/>
 | 
			
		||||
 | 
			
		||||
    <ScrollView
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
@@ -53,7 +56,37 @@
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:textStyle="italic"
 | 
			
		||||
            android:text="Notes"/>
 | 
			
		||||
            android:textSize="20sp"
 | 
			
		||||
            android:text="@string/dialog_event_detail_notes"/>
 | 
			
		||||
 | 
			
		||||
    </ScrollView>
 | 
			
		||||
 | 
			
		||||
    <LinearLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:orientation="horizontal">
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/dialog_event_previous"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginStart="10dp"
 | 
			
		||||
            android:textSize="12sp"
 | 
			
		||||
            android:text="" />
 | 
			
		||||
 | 
			
		||||
        <Space
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_weight="1"
 | 
			
		||||
            android:layout_height="match_parent" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/dialog_event_next"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginEnd="10dp"
 | 
			
		||||
            android:textSize="12sp"
 | 
			
		||||
            android:text="" />
 | 
			
		||||
 | 
			
		||||
    </LinearLayout>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:maxLines="2"
 | 
			
		||||
        android:textColor="@color/accent"
 | 
			
		||||
        android:text="Description"/>
 | 
			
		||||
        android:text="@string/row_luna_event_description"/>
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/quantity"
 | 
			
		||||
@@ -35,7 +35,7 @@
 | 
			
		||||
        android:layout_marginLeft="5dp"
 | 
			
		||||
        android:layout_marginRight="5dp"
 | 
			
		||||
        android:gravity="center_horizontal"
 | 
			
		||||
        android:text="Qty"/>
 | 
			
		||||
        android:text="@string/row_luna_event_quantity"/>
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/time"
 | 
			
		||||
@@ -46,6 +46,6 @@
 | 
			
		||||
        android:textStyle="bold"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:maxLines="2"
 | 
			
		||||
        android:text="Time"/>
 | 
			
		||||
        android:text="@string/row_luna_event_time"/>
 | 
			
		||||
 | 
			
		||||
</LinearLayout>
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@
 | 
			
		||||
            android:maxLines="2"
 | 
			
		||||
            android:gravity="center_horizontal"
 | 
			
		||||
            android:textColor="@color/accent"
 | 
			
		||||
            android:text="Description"/>
 | 
			
		||||
            android:text="@string/row_luna_event_description"/>
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/quantity"
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
            android:layout_marginLeft="5dp"
 | 
			
		||||
            android:layout_marginRight="5dp"
 | 
			
		||||
            android:gravity="center_horizontal"
 | 
			
		||||
            android:text="Qty"/>
 | 
			
		||||
            android:text="@string/dialog_event_detail_quantity"/>
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/time"
 | 
			
		||||
@@ -52,7 +52,7 @@
 | 
			
		||||
            android:textStyle="bold"
 | 
			
		||||
            android:ellipsize="end"
 | 
			
		||||
            android:maxLines="2"
 | 
			
		||||
            android:text="Time"/>
 | 
			
		||||
            android:text="@string/row_luna_event_time"/>
 | 
			
		||||
 | 
			
		||||
    </LinearLayout>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -55,10 +55,16 @@
 | 
			
		||||
    <string name="toast_integer_error">Invalid value. Insert an integer.</string>
 | 
			
		||||
 | 
			
		||||
    <string name="now">now</string>
 | 
			
		||||
    <string name="hour_ago">hour</string>
 | 
			
		||||
    <string name="hours_ago">hours</string>
 | 
			
		||||
    <string name="second_ago">sec</string>
 | 
			
		||||
    <string name="seconds_ago">secs</string>
 | 
			
		||||
    <string name="minute_ago">min</string>
 | 
			
		||||
    <string name="minutes_ago">mins</string>
 | 
			
		||||
    <string name="hour_ago">hour</string>
 | 
			
		||||
    <string name="hours_ago">hours</string>
 | 
			
		||||
    <string name="day_ago">year</string>
 | 
			
		||||
    <string name="days_ago">years</string>
 | 
			
		||||
    <string name="year_ago">year</string>
 | 
			
		||||
    <string name="years_ago">years</string>
 | 
			
		||||
 | 
			
		||||
    <string name="no_connection">No connection</string>
 | 
			
		||||
    <string name="no_connection_explain">Unable to reach WebDAV service</string>
 | 
			
		||||
@@ -107,10 +113,16 @@
 | 
			
		||||
    <string name="measurement_unit_temperature_base_imperial" translatable="false">°F</string>
 | 
			
		||||
    <string name="measurement_unit_temperature_base_metric" translatable="false">°C</string>
 | 
			
		||||
 | 
			
		||||
    <string name="row_luna_event_description">Description</string>
 | 
			
		||||
    <string name="row_luna_event_quantity">Qty</string>
 | 
			
		||||
    <string name="row_luna_event_time">Time</string>
 | 
			
		||||
 | 
			
		||||
    <string name="dialog_event_detail_title">Event detail</string>
 | 
			
		||||
    <string name="dialog_event_detail_datetime_icon" translatable="false">🕒 %s1</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_delete_button">Delete</string>
 | 
			
		||||
    <string name="dialog_event_detail_quantity">Quantity</string>
 | 
			
		||||
    <string name="dialog_event_detail_notes">Notes</string>
 | 
			
		||||
 | 
			
		||||
    <string name="dialog_add_logbook_title">Add logbook</string>
 | 
			
		||||
    <string name="dialog_add_logbook_logbookname">👶 Logbook name</string>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user