forked from penguin86/luna-tracker
Compare commits
59 Commits
62d2f9deb4
...
bottle_tim
| Author | SHA1 | Date | |
|---|---|---|---|
| a4b5ae7cd0 | |||
| bed3350113 | |||
| 758f37b510 | |||
| c8c678b294 | |||
| 45e798ac3b | |||
| a06264091b | |||
| 1e82c94d83 | |||
| 85567cce77 | |||
| 80a51ea8ef | |||
| 28679a4a66 | |||
| f73d3562a9 | |||
| 8a2932b1e7 | |||
| 2af8989777 | |||
| b417fe48a6 | |||
| a887d9f29f | |||
| 44748506ff | |||
| 9f8f277d75 | |||
| 742c5515b1 | |||
| d49701a488 | |||
| fb6edf981b | |||
| 52b23151d6 | |||
| 23372408d5 | |||
| 5eeb462836 | |||
| 5b777c0b88 | |||
| 6f3061974d | |||
| 3ea396c045 | |||
| 193e21ce25 | |||
| 7f67c758c9 | |||
| dfa64d71a8 | |||
| b7180068f3 | |||
| 36b848b95e | |||
| a1bde917f8 | |||
| 4f4ff5ed21 | |||
| 453d838470 | |||
| 34aa092722 | |||
| 961e7b90e7 | |||
| be77c7fb22 | |||
| a7c44df553 | |||
| 928112adb8 | |||
| b90dc92874 | |||
| 36481a1194 | |||
| d4adb9d981 | |||
| 5df3b31e64 | |||
| 0a96fb91d7 | |||
| f4c526ff8d | |||
| ea88fd6bb6 | |||
| 3e2bdca083 | |||
| e5e486c315 | |||
| 3f648a6490 | |||
| cc6ebc398c | |||
| e1f48e6524 | |||
| 5e1c67d52d | |||
| 3a457b2ae6 | |||
| a2fd04d233 | |||
| f1f73b65f7 | |||
| 5c247f5948 | |||
| 83b77b40d6 | |||
| 25f7b1fc00 | |||
| a635e46180 |
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
||||
LunaTracker
|
||||
6
.idea/AndroidProjectSystem.xml
generated
Normal file
6
.idea/AndroidProjectSystem.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AndroidProjectSystem">
|
||||
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/compiler.xml
generated
Normal file
6
.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<bytecodeTargetLevel target="21" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,5 +1,7 @@
|
||||
# 🌜 LunaTracker 🌛
|
||||
|
||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80">](https://f-droid.org/it/packages/it.danieleverducci.lunatracker/)
|
||||
|
||||
LunaTracker is a newborn baby tracking app.
|
||||
|
||||
Parenting can be tough. You get home from the hospital, exhausted, with this little fragile unknown thingy that has no user manual and a single way to let you know something's not ok: crying.
|
||||
@@ -11,7 +13,8 @@ Dedicated to my daughter Luna.
|
||||
|
||||

|
||||
|
||||
Thanks for the valuable contributions to:
|
||||
## Thanks for the valuable contributions to:
|
||||
|
||||
Chepycou (French translation)
|
||||
Daniel Neubauer (German translation)
|
||||
- Chepycou (French translation)
|
||||
- Daniel Neubauer (German translation)
|
||||
- Moritz Warning (Various bugfixes and new features)
|
||||
|
||||
@@ -6,14 +6,14 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "it.danieleverducci.lunatracker"
|
||||
compileSdk = 34
|
||||
compileSdk = 36
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "it.danieleverducci.lunatracker"
|
||||
minSdk = 21
|
||||
targetSdk = 34
|
||||
versionCode = 4
|
||||
versionName = "0.6"
|
||||
targetSdk = 36
|
||||
versionCode = 7
|
||||
versionName = "0.9"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@@ -31,6 +31,12 @@ android {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
dependenciesInfo {
|
||||
// Disables dependency metadata when building APKs.
|
||||
includeInApk = false
|
||||
// Disables dependency metadata when building Android App Bundles.
|
||||
includeInBundle = false
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = "11"
|
||||
}
|
||||
@@ -40,7 +46,6 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
implementation(libs.androidx.core.ktx)
|
||||
implementation(libs.androidx.lifecycle.runtime.ktx)
|
||||
implementation(libs.androidx.activity.compose)
|
||||
@@ -51,7 +56,7 @@ dependencies {
|
||||
implementation(libs.androidx.material3)
|
||||
implementation(libs.androidx.appcompat)
|
||||
implementation(libs.androidx.recyclerview)
|
||||
implementation("com.github.thegrizzlylabs:sardine-android:v0.9")
|
||||
implementation(libs.sardine.android)
|
||||
implementation(libs.material)
|
||||
testImplementation(libs.junit)
|
||||
androidTestImplementation(libs.androidx.junit)
|
||||
@@ -60,4 +65,5 @@ dependencies {
|
||||
androidTestImplementation(libs.androidx.ui.test.junit4)
|
||||
debugImplementation(libs.androidx.ui.tooling)
|
||||
debugImplementation(libs.androidx.ui.test.manifest)
|
||||
implementation(libs.mpandroidchart.vv310)
|
||||
}
|
||||
@@ -30,6 +30,10 @@
|
||||
android:name=".SettingsActivity"
|
||||
android:label="@string/settings_title"
|
||||
android:theme="@style/Theme.LunaTracker"/>
|
||||
<activity
|
||||
android:name=".StatisticsActivity"
|
||||
android:label="@string/statistics_title"
|
||||
android:theme="@style/Theme.LunaTracker"/>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,19 +2,20 @@ package it.danieleverducci.lunatracker
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.widget.EditText
|
||||
import android.widget.RadioButton
|
||||
import android.widget.Spinner
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
import com.google.android.material.switchmaterial.SwitchMaterial
|
||||
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
|
||||
@@ -24,6 +25,8 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
protected lateinit var textViewWebDAVUser: TextView
|
||||
protected lateinit var textViewWebDAVPass: TextView
|
||||
protected lateinit var progressIndicator: LinearProgressIndicator
|
||||
protected lateinit var switchDynamicMenu: SwitchMaterial
|
||||
protected lateinit var textViewSignature: EditText
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -35,6 +38,9 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
textViewWebDAVUser = findViewById(R.id.settings_data_webdav_user)
|
||||
textViewWebDAVPass = findViewById(R.id.settings_data_webdav_pass)
|
||||
progressIndicator = findViewById(R.id.progress_indicator)
|
||||
switchDynamicMenu = findViewById(R.id.switch_dynamic_menu)
|
||||
textViewSignature = findViewById(R.id.settings_signature)
|
||||
|
||||
findViewById<View>(R.id.settings_save).setOnClickListener({
|
||||
validateAndSave()
|
||||
})
|
||||
@@ -49,15 +55,21 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
fun loadSettings() {
|
||||
val dataRepo = settingsRepository.loadDataRepository()
|
||||
val webDavCredentials = settingsRepository.loadWebdavCredentials()
|
||||
val dynamicMenu = settingsRepository.loadDynamicMenu()
|
||||
val signature = settingsRepository.loadSignature()
|
||||
|
||||
when (dataRepo) {
|
||||
LocalSettingsRepository.DATA_REPO.LOCAL_FILE -> radioDataLocal.isChecked = true
|
||||
LocalSettingsRepository.DATA_REPO.WEBDAV -> radioDataWebDAV.isChecked = true
|
||||
}
|
||||
|
||||
textViewSignature.setText(signature)
|
||||
switchDynamicMenu.isChecked = dynamicMenu
|
||||
|
||||
if (webDavCredentials != null) {
|
||||
textViewWebDAVUrl.setText(webDavCredentials[0])
|
||||
textViewWebDAVUser.setText(webDavCredentials[1])
|
||||
textViewWebDAVPass.setText(webDavCredentials[2])
|
||||
textViewWebDAVUrl.text = webDavCredentials[0]
|
||||
textViewWebDAVUser.text = webDavCredentials[1]
|
||||
textViewWebDAVPass.text = webDavCredentials[2]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,6 +161,8 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
if (radioDataWebDAV.isChecked) LocalSettingsRepository.DATA_REPO.WEBDAV
|
||||
else LocalSettingsRepository.DATA_REPO.LOCAL_FILE
|
||||
)
|
||||
settingsRepository.saveDynamicMenu(switchDynamicMenu.isChecked)
|
||||
settingsRepository.saveSignature(textViewSignature.text.toString())
|
||||
settingsRepository.saveWebdavCredentials(
|
||||
textViewWebDAVUrl.text.toString(),
|
||||
textViewWebDAVUser.text.toString(),
|
||||
@@ -163,7 +177,7 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
*/
|
||||
private fun copyLocalLogbooksToWebdav(webDAVLogbookRepository: WebDAVLogbookRepository, listener: OnCopyLocalLogbooksToWebdavFinishedListener) {
|
||||
Thread(Runnable {
|
||||
var errors = StringBuilder()
|
||||
val errors = StringBuilder()
|
||||
val fileLogbookRepo = FileLogbookRepository()
|
||||
val logbooks = fileLogbookRepo.getAllLogbooks(this)
|
||||
for (logbook in logbooks) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -52,18 +52,22 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
|
||||
)
|
||||
holder.quantity.setTextColor(ContextCompat.getColor(context, R.color.textColor))
|
||||
// Contents
|
||||
holder.type.text = item.getTypeEmoji(context)
|
||||
holder.description.text = when(item.type) {
|
||||
LunaEvent.TYPE_MEDICINE -> item.notes
|
||||
LunaEvent.TYPE_NOTE -> item.notes
|
||||
LunaEvent.TYPE_CUSTOM -> item.notes
|
||||
else -> item.getTypeDescription(context)
|
||||
holder.type.text = item.getHeaderEmoji(context)
|
||||
holder.description.text = when (item.type) {
|
||||
LunaEvent.Type.MEDICINE -> item.notes
|
||||
LunaEvent.Type.NOTE -> item.notes
|
||||
else -> item.getRowItemTitle(context)
|
||||
}
|
||||
holder.time.text = DateUtils.formatTimeAgo(context, item.time)
|
||||
val endTime = if (item.type == LunaEvent.Type.SLEEP) {
|
||||
item.quantity + item.time
|
||||
} else {
|
||||
item.time
|
||||
}
|
||||
holder.time.text = DateUtils.formatTimeAgo(context, endTime)
|
||||
var quantityText = numericUtils.formatEventQuantity(item)
|
||||
|
||||
// if the event is weight, show difference with the last one
|
||||
if (item.type == LunaEvent.TYPE_WEIGHT) {
|
||||
if (item.type == LunaEvent.Type.WEIGHT) {
|
||||
val lastWeight = getPreviousWeightEvent(position)
|
||||
if (lastWeight != null) {
|
||||
val differenceInWeight = item.quantity - lastWeight.quantity
|
||||
@@ -94,7 +98,7 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
|
||||
return null
|
||||
for (pos in startFromPosition + 1 until items.size) {
|
||||
val item = items.get(pos)
|
||||
if (item.type != LunaEvent.TYPE_WEIGHT)
|
||||
if (item.type != LunaEvent.Type.WEIGHT)
|
||||
continue
|
||||
return item
|
||||
}
|
||||
|
||||
@@ -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>()
|
||||
|
||||
|
||||
@@ -12,22 +12,24 @@ import java.util.Date
|
||||
* release, it is simply ignored by previous ones).
|
||||
*/
|
||||
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"
|
||||
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
|
||||
}
|
||||
|
||||
private val jo: JSONObject
|
||||
@@ -37,22 +39,36 @@ class LunaEvent: Comparable<LunaEvent> {
|
||||
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")
|
||||
set(value) {
|
||||
if (value > 0)
|
||||
jo.put("quantity", value)
|
||||
else
|
||||
jo.remove("quantity")
|
||||
}
|
||||
var notes: String
|
||||
get(): String = jo.optString("notes")
|
||||
set(value) {
|
||||
jo.put("notes", value)
|
||||
}
|
||||
var signature: String
|
||||
get(): String = jo.optString("signature")
|
||||
set(value) {
|
||||
if (value.isNotEmpty())
|
||||
jo.put("signature", value)
|
||||
}
|
||||
|
||||
constructor(jo: JSONObject) {
|
||||
this.jo = jo
|
||||
@@ -61,66 +77,42 @@ class LunaEvent: Comparable<LunaEvent> {
|
||||
throw IllegalArgumentException("JSONObject is not a LunaEvent")
|
||||
}
|
||||
|
||||
constructor(type: String) {
|
||||
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: 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
|
||||
this.quantity = quantity
|
||||
}
|
||||
|
||||
fun getTypeEmoji(context: Context): String {
|
||||
return context.getString(
|
||||
when (type) {
|
||||
TYPE_BABY_BOTTLE -> R.string.event_bottle_type
|
||||
TYPE_WEIGHT -> R.string.event_scale_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
|
||||
else -> R.string.event_unknown_type
|
||||
}
|
||||
)
|
||||
fun getHeaderEmoji(context: Context): String {
|
||||
return getHeaderEmoji(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_scale_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
|
||||
else -> R.string.event_unknown_desc
|
||||
}
|
||||
)
|
||||
fun getDialogTitle(context: Context): String {
|
||||
return getDialogTitle(context, type)
|
||||
}
|
||||
|
||||
fun getDialogMessage(context: Context): String? {
|
||||
return when(type) {
|
||||
TYPE_MEDICINE -> context.getString(R.string.log_medicine_dialog_description)
|
||||
else -> null
|
||||
}
|
||||
fun getRowItemTitle(context: Context): String {
|
||||
return getPopupItemTitle(context, type).split(" ", limit = 2).last() // remove emoji
|
||||
}
|
||||
|
||||
fun getDialogMessage(context: Context): String {
|
||||
return getDialogMessage(context, type)
|
||||
}
|
||||
|
||||
fun toJson(): JSONObject {
|
||||
@@ -128,10 +120,101 @@ class LunaEvent: Comparable<LunaEvent> {
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "${type} qty: $quantity time: ${Date(time * 1000)}"
|
||||
return "$type qty: $quantity time: ${Date(time * 1000)}"
|
||||
}
|
||||
|
||||
override fun compareTo(other: LunaEvent): Int {
|
||||
return (this.time - other.time).toInt()
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun getHeaderEmoji(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 getDialogMessage(context: Context, type: Type): 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
|
||||
else -> R.string.log_unknown_dialog_description
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun getDialogTitle(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
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
// Entries for for popup list
|
||||
fun getPopupItemTitle(context: Context, type: Type): String {
|
||||
return context.getString(
|
||||
when (type) {
|
||||
Type.BABY_BOTTLE -> R.string.event_type_item_bottle
|
||||
Type.WEIGHT -> R.string.event_type_item_weight
|
||||
Type.BREASTFEEDING_LEFT_NIPPLE -> R.string.event_type_item_breastfeeding_left
|
||||
Type.BREASTFEEDING_BOTH_NIPPLE -> R.string.event_type_item_breastfeeding_both
|
||||
Type.BREASTFEEDING_RIGHT_NIPPLE -> R.string.event_type_item_breastfeeding_right
|
||||
Type.DIAPERCHANGE_POO -> R.string.event_type_item_diaperchange_poo
|
||||
Type.DIAPERCHANGE_PEE -> R.string.event_type_item_diaperchange_pee
|
||||
Type.MEDICINE -> R.string.event_type_item_medicine
|
||||
Type.ENEMA -> R.string.event_type_item_enema
|
||||
Type.NOTE -> R.string.event_type_item_note
|
||||
Type.TEMPERATURE -> R.string.event_type_item_temperature
|
||||
Type.COLIC -> R.string.event_type_item_colic
|
||||
Type.FOOD -> R.string.event_type_item_food
|
||||
Type.PUKE -> R.string.event_type_item_puke
|
||||
Type.BATH -> R.string.event_type_item_bath
|
||||
Type.SLEEP -> R.string.event_type_item_sleep
|
||||
Type.UNKNOWN -> R.string.event_type_item_unknown
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,9 +13,9 @@ import java.io.FilenameFilter
|
||||
|
||||
class FileLogbookRepository: LogbookRepository {
|
||||
companion object {
|
||||
val TAG = "FileLogbookRepository"
|
||||
val FILE_NAME_START = "data"
|
||||
val FILE_NAME_END = ".json"
|
||||
const val TAG = "FileLogbookRepository"
|
||||
const val FILE_NAME_START = "data"
|
||||
const val FILE_NAME_END = ".json"
|
||||
}
|
||||
|
||||
override fun loadLogbook(context: Context, name: String, listener: LogbookLoadedListener) {
|
||||
@@ -32,7 +32,7 @@ class FileLogbookRepository: LogbookRepository {
|
||||
fun loadLogbook(context: Context, name: String): Logbook {
|
||||
val logbook = Logbook(name)
|
||||
val fileName = getFileName(name)
|
||||
val file = File(context.getFilesDir(), fileName)
|
||||
val file = File(context.filesDir, fileName)
|
||||
val json = FileInputStream(file).bufferedReader().use { it.readText() }
|
||||
val ja = JSONArray(json)
|
||||
for (i in 0 until ja.length()) {
|
||||
@@ -58,7 +58,7 @@ class FileLogbookRepository: LogbookRepository {
|
||||
|
||||
fun saveLogbook(context: Context, logbook: Logbook) {
|
||||
val fileName = getFileName(logbook.name)
|
||||
val file = File(context.getFilesDir(), fileName)
|
||||
val file = File(context.filesDir, fileName)
|
||||
val ja = JSONArray()
|
||||
for (l in logbook.logs) {
|
||||
ja.put(l.toJson())
|
||||
@@ -82,7 +82,7 @@ class FileLogbookRepository: LogbookRepository {
|
||||
}
|
||||
|
||||
private fun listLogbooks(context: Context): ArrayList<String> {
|
||||
val logbooksFileNames = context.getFilesDir().list(object: FilenameFilter {
|
||||
val logbooksFileNames = context.filesDir.list(object: FilenameFilter {
|
||||
override fun accept(dir: File?, name: String?): Boolean {
|
||||
if (name == null)
|
||||
return false
|
||||
|
||||
@@ -3,15 +3,18 @@ package it.danieleverducci.lunatracker.repository
|
||||
import android.content.Context
|
||||
import android.content.Context.MODE_PRIVATE
|
||||
import android.content.SharedPreferences
|
||||
import androidx.core.content.edit
|
||||
|
||||
class LocalSettingsRepository(val context: Context) {
|
||||
companion object {
|
||||
val SHARED_PREFS_FILE_NAME = "lunasettings"
|
||||
val SHARED_PREFS_BB_CONTENT = "bbcontent"
|
||||
val SHARED_PREFS_DATA_REPO = "data_repo"
|
||||
val SHARED_PREFS_DAV_URL = "webdav_url"
|
||||
val SHARED_PREFS_DAV_USER = "webdav_user"
|
||||
val SHARED_PREFS_DAV_PASS = "webdav_password"
|
||||
const val SHARED_PREFS_FILE_NAME = "lunasettings"
|
||||
const val SHARED_PREFS_BB_CONTENT = "bbcontent"
|
||||
const val SHARED_PREFS_DATA_REPO = "data_repo"
|
||||
const val SHARED_PREFS_DAV_URL = "webdav_url"
|
||||
const val SHARED_PREFS_DAV_USER = "webdav_user"
|
||||
const val SHARED_PREFS_DAV_PASS = "webdav_password"
|
||||
const val SHARED_PREFS_DYNAMIC_MENU = "dynamic_menu"
|
||||
const val SHARED_PREFS_SIGNATURE = "signature"
|
||||
}
|
||||
enum class DATA_REPO {LOCAL_FILE, WEBDAV}
|
||||
val sharedPreferences: SharedPreferences
|
||||
@@ -20,24 +23,32 @@ class LocalSettingsRepository(val context: Context) {
|
||||
sharedPreferences = context.getSharedPreferences(SHARED_PREFS_FILE_NAME, MODE_PRIVATE)
|
||||
}
|
||||
|
||||
fun saveBabyBottleContent(content: Int) {
|
||||
sharedPreferences.edit().putInt(SHARED_PREFS_BB_CONTENT, content).apply()
|
||||
fun saveSignature(content: String) {
|
||||
sharedPreferences.edit { putString(SHARED_PREFS_SIGNATURE, content) }
|
||||
}
|
||||
|
||||
fun loadBabyBottleContent(): Int {
|
||||
return sharedPreferences.getInt(SHARED_PREFS_BB_CONTENT, 1)
|
||||
fun loadSignature(): String {
|
||||
return sharedPreferences.getString(SHARED_PREFS_SIGNATURE, "") ?: ""
|
||||
}
|
||||
|
||||
fun saveDynamicMenu(content: Boolean) {
|
||||
sharedPreferences.edit { putBoolean(SHARED_PREFS_DYNAMIC_MENU, content) }
|
||||
}
|
||||
|
||||
fun loadDynamicMenu(): Boolean {
|
||||
return sharedPreferences.getBoolean(SHARED_PREFS_DYNAMIC_MENU, false)
|
||||
}
|
||||
|
||||
fun saveDataRepository(repo: DATA_REPO) {
|
||||
val spe = sharedPreferences.edit()
|
||||
spe.putString(
|
||||
SHARED_PREFS_DATA_REPO,
|
||||
when (repo) {
|
||||
DATA_REPO.WEBDAV -> "webdav"
|
||||
DATA_REPO.LOCAL_FILE -> "localfile"
|
||||
}
|
||||
)
|
||||
spe.commit()
|
||||
sharedPreferences.edit(commit = true) {
|
||||
putString(
|
||||
SHARED_PREFS_DATA_REPO,
|
||||
when (repo) {
|
||||
DATA_REPO.WEBDAV -> "webdav"
|
||||
DATA_REPO.LOCAL_FILE -> "localfile"
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun loadDataRepository(): DATA_REPO {
|
||||
@@ -50,11 +61,11 @@ class LocalSettingsRepository(val context: Context) {
|
||||
}
|
||||
|
||||
fun saveWebdavCredentials(url: String, username: String, password: String) {
|
||||
val spe = sharedPreferences.edit()
|
||||
spe.putString(SHARED_PREFS_DAV_URL, url)
|
||||
spe.putString(SHARED_PREFS_DAV_USER, username)
|
||||
spe.putString(SHARED_PREFS_DAV_PASS, password)
|
||||
spe.commit()
|
||||
sharedPreferences.edit(commit = true) {
|
||||
putString(SHARED_PREFS_DAV_URL, url)
|
||||
putString(SHARED_PREFS_DAV_USER, username)
|
||||
putString(SHARED_PREFS_DAV_PASS, password)
|
||||
}
|
||||
}
|
||||
|
||||
fun loadWebdavCredentials(): Array<String>? {
|
||||
|
||||
@@ -1,15 +1,75 @@
|
||||
package utils
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.text.format.DateFormat
|
||||
import it.danieleverducci.lunatracker.R
|
||||
import java.util.Date
|
||||
|
||||
class DateUtils {
|
||||
companion object {
|
||||
/**
|
||||
* Format time duration in seconds as e.g. "2 hours, 1 min".
|
||||
* Used for the duration to the next/previous event in the event details dialog.
|
||||
*/
|
||||
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 {
|
||||
return format(minutes, seconds, R.string.minute_ago, R.string.minute_ago, R.string.second_ago, R.string.seconds_ago)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the provided unix timestamp in a string like "3 hours, 26 minutes ago)
|
||||
* Formats the provided unix timestamp in a string like "3 hours, 26 minutes ago".
|
||||
* Used for the event list.
|
||||
*/
|
||||
fun formatTimeAgo(context: Context, unixTime: Long): String {
|
||||
val secondsDiff = (System.currentTimeMillis() / 1000) - unixTime
|
||||
@@ -25,10 +85,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,12 +97,28 @@ 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))
|
||||
}
|
||||
return formattedTime.toString()
|
||||
}
|
||||
|
||||
/**
|
||||
* Format time as localized string without seconds. E.g. "Sept 18, 2025, 03:36 PM".
|
||||
* Used in the event detail dialog.
|
||||
*/
|
||||
fun formatDateTime(unixTime: Long): String {
|
||||
val date = Date(unixTime * 1000)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
val dateFormat = android.icu.text.DateFormat.getDateTimeInstance(android.icu.text.DateFormat.DEFAULT, android.icu.text.DateFormat.SHORT)
|
||||
return dateFormat.format(date)
|
||||
} else {
|
||||
// fallback
|
||||
val dateFormat = java.text.DateFormat.getDateTimeInstance()
|
||||
return dateFormat.format(date)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,8 +3,11 @@ package utils
|
||||
import android.content.Context
|
||||
import android.icu.util.LocaleData
|
||||
import android.icu.util.ULocale
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import it.danieleverducci.lunatracker.R
|
||||
import it.danieleverducci.lunatracker.entities.LunaEvent
|
||||
import utils.DateUtils.Companion.formatTimeDuration
|
||||
import java.text.NumberFormat
|
||||
|
||||
class NumericUtils (val context: Context) {
|
||||
@@ -14,66 +17,101 @@ class NumericUtils (val context: Context) {
|
||||
val measurement_unit_weight_tiny: String
|
||||
val measurement_unit_temperature_base: String
|
||||
|
||||
private fun isMetricSystem(): Boolean {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
val measurementSystem = LocaleData.getMeasurementSystem(ULocale.getDefault())
|
||||
return (measurementSystem == LocaleData.MeasurementSystem.SI)
|
||||
} else {
|
||||
val locale = context.resources.configuration.locale
|
||||
return when (locale.country) {
|
||||
// https://en.wikipedia.org/wiki/United_States_customary_units
|
||||
// https://en.wikipedia.org/wiki/Imperial_units
|
||||
"US" -> false // US IMPERIAL
|
||||
// UK, Myanmar, Liberia,
|
||||
"GB", "MM", "LR" -> false // IMPERIAL
|
||||
else -> true // METRIC
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
this.numberFormat = NumberFormat.getInstance()
|
||||
val measurementSystem = LocaleData.getMeasurementSystem(ULocale.getDefault())
|
||||
this.measurement_unit_liquid_base = context.getString(
|
||||
if (measurementSystem == LocaleData. MeasurementSystem.SI)
|
||||
if (isMetricSystem())
|
||||
R.string.measurement_unit_liquid_base_metric
|
||||
else
|
||||
R.string.measurement_unit_liquid_base_imperial
|
||||
)
|
||||
this.measurement_unit_weight_base = context.getString(
|
||||
if (measurementSystem == LocaleData. MeasurementSystem.SI)
|
||||
if (isMetricSystem())
|
||||
R.string.measurement_unit_weight_base_metric
|
||||
else
|
||||
R.string.measurement_unit_weight_base_imperial
|
||||
)
|
||||
this.measurement_unit_weight_tiny = context.getString(
|
||||
if (measurementSystem == LocaleData. MeasurementSystem.SI)
|
||||
if (isMetricSystem())
|
||||
R.string.measurement_unit_weight_tiny_metric
|
||||
else
|
||||
R.string.measurement_unit_weight_tiny_imperial
|
||||
)
|
||||
this.measurement_unit_temperature_base = context.getString(
|
||||
if (measurementSystem == LocaleData. MeasurementSystem.SI)
|
||||
if (isMetricSystem())
|
||||
R.string.measurement_unit_temperature_base_metric
|
||||
else
|
||||
R.string.measurement_unit_temperature_base_imperial
|
||||
)
|
||||
}
|
||||
|
||||
fun formatEventQuantity(item: LunaEvent): String {
|
||||
fun formatEventQuantity(event: LunaEvent): String {
|
||||
return formatEventQuantity(event.type, event.quantity)
|
||||
}
|
||||
|
||||
fun formatEventQuantity(type: LunaEvent.Type, quantity: Int): String {
|
||||
val formatted = StringBuilder()
|
||||
if ((item.quantity ?: 0) > 0) {
|
||||
if (item.type == LunaEvent.TYPE_TEMPERATURE)
|
||||
formatted.append((item.quantity / 10.0f).toString())
|
||||
else
|
||||
formatted.append(item.quantity)
|
||||
if (quantity > 0) {
|
||||
formatted.append(when (type) {
|
||||
LunaEvent.Type.TEMPERATURE ->
|
||||
(quantity / 10.0f).toString()
|
||||
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())
|
||||
else -> quantity
|
||||
})
|
||||
|
||||
formatted.append(" ")
|
||||
formatted.append(
|
||||
when (item.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
|
||||
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
|
||||
else -> ""
|
||||
}
|
||||
)
|
||||
} else {
|
||||
formatted.append(when (type) {
|
||||
LunaEvent.Type.SLEEP -> "💤" // baby is sleeping
|
||||
else -> ""
|
||||
})
|
||||
}
|
||||
return formatted.toString()
|
||||
return formatted.toString().trim()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a valid quantity range for the event type.
|
||||
* @return min, max, normal
|
||||
*/
|
||||
fun getValidEventQuantityRange(lunaEventType: String): Triple<Int, Int, Int>? {
|
||||
val measurementSystem = LocaleData.getMeasurementSystem(ULocale.getDefault())
|
||||
fun getValidEventQuantityRange(lunaEventType: LunaEvent.Type): Triple<Int, Int, Int>? {
|
||||
return when (lunaEventType) {
|
||||
LunaEvent.TYPE_TEMPERATURE -> {
|
||||
if (measurementSystem == LocaleData. MeasurementSystem.SI)
|
||||
LunaEvent.Type.TEMPERATURE -> {
|
||||
if (isMetricSystem())
|
||||
Triple(
|
||||
context.resources.getInteger(R.integer.human_body_temp_min_metric),
|
||||
context.resources.getInteger(R.integer.human_body_temp_max_metric),
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||
|
||||
<path android:fillColor="@android:color/white" android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
|
||||
|
||||
</vector>
|
||||
@@ -30,7 +30,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/title"
|
||||
android:textSize="26dp"
|
||||
android:textSize="26sp"
|
||||
android:gravity="center"/>
|
||||
|
||||
<ImageView
|
||||
@@ -47,7 +47,7 @@
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="38dp"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_margin="5dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
@@ -68,23 +68,17 @@
|
||||
android:id="@+id/logbooks_add_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginStart="10dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="@color/accent"
|
||||
android:textSize="20dp"
|
||||
android:textSize="20sp"
|
||||
android:text="+"
|
||||
android:background="@drawable/button_background"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/log_an_event"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/buttons_container"
|
||||
android:layout_width="match_parent"
|
||||
@@ -92,129 +86,138 @@
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linear_layout_row1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_bottle"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="2"
|
||||
android:layout_margin="10dp"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="50dp"
|
||||
android:text="@string/event_bottle_type"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_food"
|
||||
android:id="@+id/button1_row1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_margin="5dp"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="50dp"
|
||||
android:textSize="50sp"
|
||||
android:text="@string/event_bottle_type"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button2_row1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_margin="5dp"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="50sp"
|
||||
android:text="@string/event_food_type"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linear_layout_row2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_nipple_left"
|
||||
android:id="@+id/button1_row2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30dp"
|
||||
android:text="🤱⬅️"/>
|
||||
android:textSize="30sp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_nipple_both"
|
||||
android:id="@+id/button2_row2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30dp"
|
||||
android:text="🤱↔️"/>
|
||||
android:textSize="30sp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_nipple_right"
|
||||
android:id="@+id/button3_row2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30dp"
|
||||
android:text="🤱➡️️"/>
|
||||
android:textSize="30sp"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linear_layout_row3"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_change_poo"
|
||||
android:id="@+id/button1_row3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="2"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30dp"
|
||||
android:text="🚼 💩"/>
|
||||
android:textSize="30sp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_change_pee"
|
||||
android:id="@+id/button2_row3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="2"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30dp"
|
||||
android:text="🚼 💧"/>
|
||||
android:textSize="30sp"/>
|
||||
|
||||
<ImageView
|
||||
<TextView
|
||||
android:id="@+id/button_more"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:src="@drawable/ic_more"
|
||||
android:textSize="30sp"
|
||||
android:text="☰"
|
||||
app:tint="@android:color/darker_gray"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</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:layout_marginTop="5dp"
|
||||
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"
|
||||
@@ -247,7 +250,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30dp"
|
||||
android:textSize="30sp"
|
||||
android:textColor="@color/accent"
|
||||
android:text="@string/no_connection"/>
|
||||
|
||||
@@ -264,7 +267,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:drawableLeft="@drawable/ic_sync"
|
||||
android:drawableStart="@drawable/ic_sync"
|
||||
android:drawableTint="@color/white"
|
||||
android:drawablePadding="10dp"
|
||||
android:text="@string/no_connection_retry"
|
||||
@@ -275,7 +278,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:drawableLeft="@drawable/ic_settings"
|
||||
android:drawableStart="@drawable/ic_settings"
|
||||
android:drawableTint="@color/white"
|
||||
android:drawablePadding="10dp"
|
||||
android:text="@string/no_connection_go_to_settings"
|
||||
|
||||
@@ -39,26 +39,26 @@
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:text="@string/settings_storage_local_desc"/>
|
||||
|
||||
<RadioButton android:id="@+id/settings_data_webdav"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="30dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:text="@string/settings_storage_dav"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:text="@string/settings_storage_dav_desc"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/settings_storage_dav_url"/>
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
android:id="@+id/settings_data_webdav_url"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:hint="@string/settings_storage_dav_url_hint"
|
||||
android:inputType="textUri"
|
||||
android:background="@drawable/textview_background"/>
|
||||
@@ -75,7 +75,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/settings_storage_dav_user"/>
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
android:id="@+id/settings_data_webdav_user"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:inputType="textEmailAddress"
|
||||
android:background="@drawable/textview_background"/>
|
||||
|
||||
@@ -91,17 +91,23 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/settings_storage_dav_pass"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/settings_data_webdav_pass"
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:inputType="textPassword"
|
||||
android:background="@drawable/textview_background"/>
|
||||
android:layout_marginStart="30dp"
|
||||
app:passwordToggleEnabled="true">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/settings_data_webdav_pass"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/textview_background"
|
||||
android:inputType="textPassword" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||
android:id="@+id/progress_indicator"
|
||||
@@ -109,36 +115,88 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:indeterminate="true"
|
||||
app:indicatorColor="@color/accent"
|
||||
android:layout_margin="20dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:visibility="invisible"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Button
|
||||
android:id="@+id/settings_cancel"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginRight="20dp"
|
||||
android:background="@drawable/button_background"
|
||||
android:textColor="@color/accent"
|
||||
android:text="@android:string/cancel"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/settings_save"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textColor="@color/accent"
|
||||
android:background="@drawable/button_background"
|
||||
android:text="@android:string/ok"/>
|
||||
|
||||
</LinearLayout>
|
||||
</RadioGroup>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/settings_signature" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/settings_signature"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:inputType="textEmailAddress"
|
||||
android:background="@drawable/textview_background"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:text="@string/settings_signature_desc"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginTop="20dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/settings_dynamic_menu" />
|
||||
|
||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||
android:id="@+id/switch_dynamic_menu"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="20dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:text="@string/settings_dynamic_menu_desc"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Button
|
||||
android:id="@+id/settings_cancel"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginEnd="20dp"
|
||||
android:background="@drawable/button_background"
|
||||
android:textColor="@color/accent"
|
||||
android:text="@android:string/cancel"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/settings_save"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textColor="@color/accent"
|
||||
android:background="@drawable/button_background"
|
||||
android:text="@android:string/ok"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
50
app/src/main/res/layout/activity_statistics.xml
Normal file
50
app/src/main/res/layout/activity_statistics.xml
Normal file
@@ -0,0 +1,50 @@
|
||||
<?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"
|
||||
android:padding="10dp">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1">
|
||||
|
||||
<com.github.mikephil.charting.charts.HorizontalBarChart
|
||||
android:id="@+id/bar_chart"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/no_data"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="gone"
|
||||
android:gravity="center"
|
||||
android:text="@string/statistics_no_data"/>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/graph_type_selection"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"/>
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/time_range_selection"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -4,19 +4,19 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center">
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/dialog_number_edittext"
|
||||
android:layout_width="150dp"
|
||||
<Spinner
|
||||
android:id="@+id/dialog_amount_value"
|
||||
android:layout_width="250dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="number"
|
||||
android:hint="0"
|
||||
android:background="@drawable/textview_background"/>
|
||||
android:paddingHorizontal="16dp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_date_picker"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:text="g"/>
|
||||
android:layout_marginTop="20dp"/>
|
||||
|
||||
</LinearLayout>
|
||||
35
app/src/main/res/layout/dialog_edit_bottle.xml
Normal file
35
app/src/main/res/layout/dialog_edit_bottle.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?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>
|
||||
56
app/src/main/res/layout/dialog_edit_duration.xml
Normal file
56
app/src/main/res/layout/dialog_edit_duration.xml
Normal file
@@ -0,0 +1,56 @@
|
||||
<?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"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_date_duration"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="20sp"
|
||||
android:text="💤"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/duration_buttons"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginHorizontal="10dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Button
|
||||
android:id="@+id/dialog_date_duration_minus5"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="-5"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/dialog_date_duration_now"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/now"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/dialog_date_duration_plus5"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="+5"/>
|
||||
|
||||
</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>
|
||||
@@ -24,4 +24,34 @@
|
||||
android:hint="@string/log_notes_dialog_note_hint"
|
||||
android:background="@drawable/textview_background"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:gravity="end"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notes_template_prev"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18dp"
|
||||
android:text="⬅️"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notes_template_next"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18dp"
|
||||
android:text="➡️"/>
|
||||
|
||||
</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="15dp"/>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -4,16 +4,12 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center">
|
||||
|
||||
<NumberPicker
|
||||
android:id="@+id/dialog_number_picker"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_date_picker"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:text="ml"/>
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -23,4 +23,11 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="30sp"
|
||||
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>
|
||||
38
app/src/main/res/layout/dialog_edit_weight.xml
Normal file
38
app/src/main/res/layout/dialog_edit_weight.xml
Normal file
@@ -0,0 +1,38 @@
|
||||
<?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>
|
||||
@@ -1,59 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="20dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_emoji"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="60dp"
|
||||
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:gravity="center_horizontal"
|
||||
android:textColor="@color/accent"
|
||||
android:textSize="24dp"
|
||||
android:text="@string/event_diaperchange_pee_desc"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="40dp"
|
||||
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:textStyle="bold"
|
||||
android:text="@string/dialog_event_detail_datetime_icon"/>
|
||||
|
||||
<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"/>
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="200dp"
|
||||
android:layout_marginTop="20dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_notes"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textStyle="italic"
|
||||
android:text="Notes"/>
|
||||
|
||||
</ScrollView>
|
||||
</LinearLayout>
|
||||
111
app/src/main/res/layout/dialog_event_details.xml
Normal file
111
app/src/main/res/layout/dialog_event_details.xml
Normal file
@@ -0,0 +1,111 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="20dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:paddingHorizontal="20dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_emoji"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
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="12dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:textColor="@color/accent"
|
||||
android:textSize="32sp"
|
||||
android:text="@string/event_diaperchange_pee_desc" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="40dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:drawablePadding="10dp"
|
||||
android:drawableTint="@color/accent"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_quantity"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="28sp"
|
||||
android:text="@string/dialog_event_detail_quantity"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_date_end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="40dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:drawablePadding="10dp"
|
||||
android:drawableTint="@color/accent"
|
||||
android:visibility="gone"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"/>
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="200dp"
|
||||
android:layout_marginTop="20dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_notes"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textStyle="italic"
|
||||
android:textSize="20sp"
|
||||
android:text="@string/dialog_event_detail_notes"/>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:id="@+id/dialog_event_detail_type_signature"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<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>
|
||||
@@ -2,73 +2,25 @@
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="20dp"
|
||||
android:padding="10dp"
|
||||
android:background="@color/transparent">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_medicine"
|
||||
android:id="@+id/button_statistics"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="20dp"
|
||||
android:padding="10dp"
|
||||
android:background="@drawable/dropdown_list_item_background"
|
||||
style="@style/OverflowMenuText"
|
||||
android:text="@string/overflow_event_medicine"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_enema"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:padding="20dp"
|
||||
android:background="@drawable/dropdown_list_item_background"
|
||||
style="@style/OverflowMenuText"
|
||||
android:text="@string/overflow_event_enema"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_note"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:padding="20dp"
|
||||
android:background="@drawable/dropdown_list_item_background"
|
||||
style="@style/OverflowMenuText"
|
||||
android:text="@string/overflow_event_note"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_temperature"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:padding="20dp"
|
||||
android:background="@drawable/dropdown_list_item_background"
|
||||
style="@style/OverflowMenuText"
|
||||
android:text="@string/overflow_event_temperature"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_colic"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:padding="20dp"
|
||||
android:background="@drawable/dropdown_list_item_background"
|
||||
style="@style/OverflowMenuText"
|
||||
android:text="@string/overflow_event_colic"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_scale"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:padding="20dp"
|
||||
android:background="@drawable/dropdown_list_item_background"
|
||||
style="@style/OverflowMenuText"
|
||||
android:text="@string/overflow_event_scale"/>
|
||||
android:text="📊 Statistics"/>
|
||||
|
||||
<!-- Other buttons are inserted dynamically -->
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
11
app/src/main/res/layout/more_events_popup_item.xml
Normal file
11
app/src/main/res/layout/more_events_popup_item.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/tv"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:padding="10dp"
|
||||
android:background="@drawable/dropdown_list_item_background"
|
||||
style="@style/OverflowMenuText"
|
||||
android:text="Item Template"/>
|
||||
@@ -11,7 +11,7 @@
|
||||
android:id="@+id/type"
|
||||
android:layout_width="90dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingStart="10dp"
|
||||
android:textSize="28sp"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
@@ -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>
|
||||
|
||||
|
||||
8
app/src/main/res/layout/statistics_spinner_item.xml
Normal file
8
app/src/main/res/layout/statistics_spinner_item.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="20sp"
|
||||
android:gravity="center"
|
||||
android:padding="5dip" />
|
||||
@@ -1,21 +1,11 @@
|
||||
<resources>
|
||||
<string name="app_name">LunaTracker</string>
|
||||
<string name="title">🌜 LunaTracker 🌛</string>
|
||||
<string name="log_an_event">Ereignis protokollieren:</string>
|
||||
<string name="logbook">Ereignisprotokoll</string>
|
||||
|
||||
<string name="log_bottle_dialog_title">Fläschchen</string>
|
||||
<string name="log_bottle_dialog_description">Trinkmenge eingeben</string>
|
||||
|
||||
<string name="log_weight_dialog_title">Gewicht</string>
|
||||
<string name="log_weight_dialog_description">Gewicht eingeben</string>
|
||||
|
||||
<string name="log_temperature_dialog_title">Temperatur</string>
|
||||
<string name="log_temperature_dialog_description">Temperatur eingeben</string>
|
||||
|
||||
<string name="event_bottle_desc">Fläschchen</string>
|
||||
<string name="event_food_desc">Essen</string>
|
||||
<string name="event_scale_desc">Gewicht</string>
|
||||
<string name="event_weight_desc">Gewicht</string>
|
||||
<string name="event_breastfeeding_left_desc">Stillen (links)</string>
|
||||
<string name="event_breastfeeding_both_desc">Stillen</string>
|
||||
<string name="event_breastfeeding_right_desc">Stillen (rechts)</string>
|
||||
@@ -28,13 +18,6 @@
|
||||
<string name="event_colic_desc">Blähungskolik</string>
|
||||
<string name="event_unknown_desc"></string>
|
||||
|
||||
<string name="overflow_event_scale">⚖️ Gewicht</string>
|
||||
<string name="overflow_event_medicine">💊 Medikament</string>
|
||||
<string name="overflow_event_enema">🪠 Einlauf</string>
|
||||
<string name="overflow_event_note">📝 Notiz</string>
|
||||
<string name="overflow_event_temperature">🌡️ Temperatur</string>
|
||||
<string name="overflow_event_colic">💨 Blähungskolik</string>
|
||||
|
||||
<string name="toast_event_added">Ereignis gespeichert</string>
|
||||
<string name="toast_logbook_saved">Logbuch gespeichert</string>
|
||||
<string name="toast_event_add_error">Ereignis konnte nicht protokolliert werden</string>
|
||||
@@ -77,10 +60,13 @@
|
||||
<string name="trim_logbook_dialog_button_ok">Jetzt bereinigen</string>
|
||||
<string name="trim_logbook_dialog_button_cancel">Später erinnern</string>
|
||||
|
||||
<string name="log_notes_dialog_description">Notizen:</string>
|
||||
<string name="log_bottle_dialog_description">Trinkmenge eingeben</string>
|
||||
<string name="log_medicine_dialog_description">Medikamentenname, Menge, Art, Notizen, …:</string>
|
||||
<string name="log_notes_dialog_qty_hint">Menge (optional)</string>
|
||||
<string name="log_notes_dialog_description">Notizen:</string>
|
||||
<string name="log_notes_dialog_note_hint">Notiz eingeben</string>
|
||||
<string name="log_notes_dialog_qty_hint">Menge (optional)</string>
|
||||
<string name="log_temperature_dialog_description">Temperatur eingeben</string>
|
||||
<string name="log_weight_dialog_description">Gewicht eingeben</string>
|
||||
|
||||
<string name="dialog_event_detail_title">Ereignisdetails</string>
|
||||
<string name="dialog_event_detail_close_button">OK</string>
|
||||
|
||||
@@ -1,21 +1,11 @@
|
||||
<resources>
|
||||
<string name="app_name">LunaTracker</string>
|
||||
<string name="title">🌜 LunaTracker 🌛</string>
|
||||
<string name="log_an_event">Ajouter une entrée:</string>
|
||||
<string name="logbook">Entrées enregistrées</string>
|
||||
|
||||
<string name="log_bottle_dialog_title">Biberon</string>
|
||||
<string name="log_bottle_dialog_description">Renseignez la quantité contenue dans le biberon</string>
|
||||
|
||||
<string name="log_weight_dialog_title">Poids</string>
|
||||
<string name="log_weight_dialog_description">Renseignez le poids</string>
|
||||
|
||||
<string name="log_temperature_dialog_title">Température</string>
|
||||
<string name="log_temperature_dialog_description">Renseignez la Température</string>
|
||||
|
||||
<string name="event_bottle_desc">Biberon</string>
|
||||
<string name="event_food_desc">Nourriture</string>
|
||||
<string name="event_scale_desc">Poids</string>
|
||||
<string name="event_weight_desc">Poids</string>
|
||||
<string name="event_breastfeeding_left_desc">Allaitement (sein gauche)</string>
|
||||
<string name="event_breastfeeding_both_desc">Allaitement</string>
|
||||
<string name="event_breastfeeding_right_desc">Allaitement (sein droit)</string>
|
||||
@@ -28,16 +18,9 @@
|
||||
<string name="event_colic_desc">Colique gazeuse</string>
|
||||
<string name="event_unknown_desc"></string>
|
||||
|
||||
<string name="overflow_event_scale">⚖️ Poids</string>
|
||||
<string name="overflow_event_medicine">💊 Médicament</string>
|
||||
<string name="overflow_event_enema">🪠 Lavement</string>
|
||||
<string name="overflow_event_note">📝 Note</string>
|
||||
<string name="overflow_event_temperature">🌡️ Température</string>
|
||||
<string name="overflow_event_colic">💨 Colique gazeuse</string>
|
||||
|
||||
<string name="toast_event_added">Entrée ajoutée</string>
|
||||
<string name="toast_logbook_saved">Journal ajouté</string>
|
||||
<string name="toast_event_add_error">Impossible d'enregistrer cette entrée</string>
|
||||
<string name="toast_event_add_error">Impossible d\'enregistrer cette entrée</string>
|
||||
<string name="toast_integer_error">Valeur invalide. Renseignez un nombre.</string>
|
||||
|
||||
<string name="now">maintenant </string>
|
||||
@@ -53,18 +36,18 @@
|
||||
|
||||
<string name="settings_title">Paramètres</string>
|
||||
<string name="settings_storage">Choisir le lieu de stockage des données</string>
|
||||
<string name="settings_storage_local">Sur l'appareil'</string>
|
||||
<string name="settings_storage_local_desc">La solution la plus respectueuse de la vie privée : les données ne quittent pas l'appareil</string>
|
||||
<string name="settings_storage_local">Sur l\'appareil\'</string>
|
||||
<string name="settings_storage_local_desc">La solution la plus respectueuse de la vie privée : les données ne quittent pas l\'appareil</string>
|
||||
<string name="settings_storage_dav">Sur un serveur WebDAV</string>
|
||||
<string name="settings_storage_dav_desc">Vous pouvez utiliser n'importe quel service WebDAV (par exemple Nextcloud, Owncloud, Dropbox, Box...) pour sauvegarder les données. De cette façon, vous pouvez les synchroniser entre plusieurs appareils (Ex : celui de papa, celui de maman, celui de grand-mère...). Vous aurez besoin de l'adresse WebDAV, que vous trouverez dans la documentation de votre fournisseur (par exemple, pour Nextcloud web, vous la trouverez dans les paramètres de l'application Fichiers).</string>
|
||||
<string name="settings_storage_dav_desc">Vous pouvez utiliser n\'importe quel service WebDAV (par exemple Nextcloud, Owncloud, Dropbox, Box...) pour sauvegarder les données. De cette façon, vous pouvez les synchroniser entre plusieurs appareils (Ex : celui de papa, celui de maman, celui de grand-mère...). Vous aurez besoin de l\'adresse WebDAV, que vous trouverez dans la documentation de votre fournisseur (par exemple, pour Nextcloud web, vous la trouverez dans les paramètres de l\'application Fichiers).</string>
|
||||
<string name="settings_storage_dav_url">URL WebDAV</string>
|
||||
<string name="settings_storage_dav_url_hint">https://</string>
|
||||
<string name="settings_storage_dav_user">Nom d'utilisateur</string>
|
||||
<string name="settings_storage_dav_user">Nom d\'utilisateur</string>
|
||||
<string name="settings_storage_dav_pass">Mot de passe</string>
|
||||
<string name="settings_network_error">Impossible d'accéder au serveur: </string>
|
||||
<string name="settings_webdav_error_denied">Nom d'utilisateur ou mot de passe incorrect pour le service WebDAV</string>
|
||||
<string name="settings_webdav_error_server_offline">Impossible d'accéder au serveur WebDAV</string>
|
||||
<string name="settings_webdav_error_generic">Une erreur est survenue en essayant d'accéder au serveur WebDAV:</string>
|
||||
<string name="settings_network_error">Impossible d\'accéder au serveur: </string>
|
||||
<string name="settings_webdav_error_denied">Nom d\'utilisateur ou mot de passe incorrect pour le service WebDAV</string>
|
||||
<string name="settings_webdav_error_server_offline">Impossible d\'accéder au serveur WebDAV</string>
|
||||
<string name="settings_webdav_error_generic">Une erreur est survenue en essayant d\'accéder au serveur WebDAV:</string>
|
||||
<string name="settings_webdav_creation_error_generic">Impossible de sauvegarder un fichier sur le serveur WebDAV:</string>
|
||||
<string name="settings_webdav_creation_ok">Connexion réussie avec le serveur WebDAV</string>
|
||||
<string name="settings_json_error">Il y a un fichier sur le serveur WebDAV, toutefois il est corronpu ou illisible. Merci de le supprimer et réessayer</string>
|
||||
@@ -72,25 +55,28 @@
|
||||
<string name="settings_webdav_upload_error">Une erreur est survenue en téléversant le journal local %1$s sur %2$s</string>
|
||||
|
||||
<string name="trim_logbook_dialog_title">Votre journal grossit !</string>
|
||||
<string name="trim_logbook_dialog_message_local">Le fichier de votre journal a beaucoup grossi. Nous recommandons de supprimer les entrées les plus vieilles pour éviter des crashs de l'application.</string>
|
||||
<string name="trim_logbook_dialog_message_dav">Le fichier de votre journal a beaucoup grossi. Nous recommandons de supprimer les entrées les plus vieilles pour éviter des crashs de l'application. Si vous voulez garder un historique, vous pouvez sauvegarder le fichier "lunatracker_logbook.json" ou le renommer pour créer un nouveau journal.</string>
|
||||
<string name="trim_logbook_dialog_message_local">Le fichier de votre journal a beaucoup grossi. Nous recommandons de supprimer les entrées les plus vieilles pour éviter des crashs de l\'application.</string>
|
||||
<string name="trim_logbook_dialog_message_dav">Le fichier de votre journal a beaucoup grossi. Nous recommandons de supprimer les entrées les plus vieilles pour éviter des crashs de l\'application. Si vous voulez garder un historique, vous pouvez sauvegarder le fichier "lunatracker_logbook.json" ou le renommer pour créer un nouveau journal.</string>
|
||||
<string name="trim_logbook_dialog_button_ok">Supprimer les vieilles entrées maintenant</string>
|
||||
<string name="trim_logbook_dialog_button_cancel">Me rappeller plus tard</string>
|
||||
|
||||
<string name="log_notes_dialog_description">Notes:</string>
|
||||
<string name="log_bottle_dialog_description">Renseignez la quantité contenue dans le biberon</string>
|
||||
<string name="log_medicine_dialog_description">nom du médicament, quantité, type, notes …:</string>
|
||||
<string name="log_notes_dialog_qty_hint">Quantité (ou vide)</string>
|
||||
<string name="log_notes_dialog_description">Notes:</string>
|
||||
<string name="log_notes_dialog_note_hint">Notes ...</string>
|
||||
<string name="log_notes_dialog_qty_hint">Quantité (ou vide)</string>
|
||||
<string name="log_temperature_dialog_description">Renseignez la Température</string>
|
||||
<string name="log_weight_dialog_description">Renseignez le poids</string>
|
||||
|
||||
<string name="dialog_event_detail_title">Détails de l'entrée</string>
|
||||
<string name="dialog_event_detail_title">Détails de l\'entrée</string>
|
||||
<string name="dialog_event_detail_close_button">OK</string>
|
||||
<string name="dialog_event_detail_delete_button">Supprimer</string>
|
||||
|
||||
<string name="dialog_add_logbook_title">Ajouter un journal</string>
|
||||
<string name="dialog_add_logbook_logbookname">👶 Nom du journal</string>
|
||||
<string name="dialog_add_logbook_message">Renseignez un nom pour identifier ce journal. Ce nom apparaîtra en haut de l'écran et, si vous utilisez WebDAV, il figurera également dans le nom du fichier enreigstré.</string>
|
||||
<string name="dialog_add_logbook_message_intro">Bienvenue ! Pour utiliser cette application, vous devez créer au moins un carnet de bord. Vous voudrez probablement l'appeler avec le nom de votre enfant.</string>
|
||||
|
||||
<string name="dialog_add_logbook_message">Renseignez un nom pour identifier ce journal. Ce nom apparaîtra en haut de l\'écran et, si vous utilisez WebDAV, il figurera également dans le nom du fichier enreigstré.</string>
|
||||
<string name="dialog_add_logbook_message_intro">Bienvenue ! Pour utiliser cette application, vous devez créer au moins un carnet de bord. Vous voudrez probablement l\'appeler avec le nom de votre enfant.</string>
|
||||
<string name="default_logbook_name">👶 Mon premier carnet de bord</string>
|
||||
<string name="logbook_created">Journal ajouté: </string>
|
||||
|
||||
|
||||
@@ -1,28 +1,11 @@
|
||||
<resources>
|
||||
<string name="app_name">LunaTracker</string>
|
||||
<string name="title">🌜 LunaTracker 🌛</string>
|
||||
<string name="log_an_event">Logga un evento:</string>
|
||||
<string name="logbook">Diario di bordo</string>
|
||||
|
||||
<string name="log_bottle_dialog_title">Biberon</string>
|
||||
<string name="log_bottle_dialog_description">Inserisci la quantità contenuta nel biberon</string>
|
||||
|
||||
<string name="log_weight_dialog_title">Pesata</string>
|
||||
<string name="log_weight_dialog_description">Inserisci il peso rilevato</string>
|
||||
|
||||
<string name="log_temperature_dialog_title">Temperatura</string>
|
||||
<string name="log_temperature_dialog_description">Inserisci la temperatura</string>
|
||||
|
||||
<string name="overflow_event_scale">⚖️ Peso</string>
|
||||
<string name="overflow_event_medicine">💊 Medicina</string>
|
||||
<string name="overflow_event_enema">🪠 Clistere</string>
|
||||
<string name="overflow_event_note">📝 Nota</string>
|
||||
<string name="overflow_event_temperature">🌡️ Temperatura</string>
|
||||
<string name="overflow_event_colic">💨 Colichette</string>
|
||||
|
||||
<string name="event_bottle_desc">Biberon</string>
|
||||
<string name="event_food_desc">Cibo</string>
|
||||
<string name="event_scale_desc">Pesata</string>
|
||||
<string name="event_weight_desc">Pesata</string>
|
||||
<string name="event_breastfeeding_left_desc">Allatt. al seno (sx)</string>
|
||||
<string name="event_breastfeeding_both_desc">Allatt. al seno</string>
|
||||
<string name="event_breastfeeding_right_desc">Allatt. al seno (dx)</string>
|
||||
@@ -77,10 +60,13 @@
|
||||
<string name="trim_logbook_dialog_button_ok">Cancella i più vecchi</string>
|
||||
<string name="trim_logbook_dialog_button_cancel">Ricordamelo dopo</string>
|
||||
|
||||
<string name="log_notes_dialog_description">Note:</string>
|
||||
<string name="log_bottle_dialog_description">Inserisci la quantità contenuta nel biberon</string>
|
||||
<string name="log_medicine_dialog_description">Nome della medicina, quantità, formato, note…:</string>
|
||||
<string name="log_notes_dialog_qty_hint">Quantità, o vuoto</string>
|
||||
<string name="log_notes_dialog_description">Note:</string>
|
||||
<string name="log_notes_dialog_note_hint">Inserisci le note</string>
|
||||
<string name="log_notes_dialog_qty_hint">Quantità, o vuoto</string>
|
||||
<string name="log_temperature_dialog_description">Inserisci la temperatura</string>
|
||||
<string name="log_weight_dialog_description">Inserisci il peso rilevato</string>
|
||||
|
||||
<string name="dialog_event_detail_title">Dettaglio evento</string>
|
||||
<string name="dialog_event_detail_close_button">OK</string>
|
||||
|
||||
39
app/src/main/res/values/arrays.xml
Normal file
39
app/src/main/res/values/arrays.xml
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="AmountLabels">
|
||||
<item>@string/amount_unspecified</item>
|
||||
<item>@string/amount_little</item>
|
||||
<item>@string/amount_normal</item>
|
||||
<item>@string/amount_plenty</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="StatisticsTypeLabels">
|
||||
<item>@string/statistics_bottle_sum</item>
|
||||
<item>@string/statistics_bottle_events</item>
|
||||
<item>@string/statistics_sleep_sum</item>
|
||||
<item>@string/statistics_sleep_events</item>
|
||||
<item>@string/statistics_sleep_pattern</item>
|
||||
<item>@string/statistics_medicine_events</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="StatisticsTypeValues">
|
||||
<item>BOTTLE_SUM</item>
|
||||
<item>BOTTLE_EVENTS</item>
|
||||
<item>SLEEP_SUM</item>
|
||||
<item>SLEEP_EVENTS</item>
|
||||
<item>SLEEP_PATTERN</item>
|
||||
<item>MEDICINE_EVENTS</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="StatisticsTimeLabels">
|
||||
<item>Day</item>
|
||||
<item>Week</item>
|
||||
<item>Month</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="StatisticsTimeValues">
|
||||
<item>DAY</item>
|
||||
<item>WEEK</item>
|
||||
<item>MONTH</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
@@ -1,24 +1,15 @@
|
||||
<resources>
|
||||
<string name="app_name">LunaTracker</string>
|
||||
<string name="title">🌜 LunaTracker 🌛</string>
|
||||
<string name="log_an_event">Log an event:</string>
|
||||
<string name="logbook">Logged events</string>
|
||||
|
||||
<string name="log_bottle_dialog_title">Baby bottle</string>
|
||||
<string name="log_bottle_dialog_description">Insert the quantity contained in the baby bottle</string>
|
||||
|
||||
<string name="log_weight_dialog_title">Weight</string>
|
||||
<string name="log_weight_dialog_description">Insert the weight</string>
|
||||
|
||||
<string name="log_temperature_dialog_title">Temperature</string>
|
||||
<string name="log_temperature_dialog_description">Insert the temperature</string>
|
||||
|
||||
<!-- menu header items -->
|
||||
<string name="event_bottle_type" translatable="false">🍼</string>
|
||||
<string name="event_food_type" translatable="false">🥣</string>
|
||||
<string name="event_scale_type" translatable="false">⚖️</string>
|
||||
<string name="event_breastfeeding_left_type" translatable="false">🤱 ←</string>
|
||||
<string name="event_breastfeeding_both_type" translatable="false">🤱 ↔</string>
|
||||
<string name="event_breastfeeding_right_type" translatable="false">🤱 →</string>
|
||||
<string name="event_weight_type" translatable="false">⚖️</string>
|
||||
<string name="event_breastfeeding_left_type" translatable="false">🤱⬅️</string>
|
||||
<string name="event_breastfeeding_both_type" translatable="false">🤱↔️</string>
|
||||
<string name="event_breastfeeding_right_type" translatable="false">🤱➡️️</string>
|
||||
<string name="event_diaperchange_poo_type" translatable="false">🚼 💩</string>
|
||||
<string name="event_diaperchange_pee_type" translatable="false">🚼 💧</string>
|
||||
<string name="event_medicine_type" translatable="false">💊</string>
|
||||
@@ -26,52 +17,90 @@
|
||||
<string name="event_note_type" translatable="false">📝</string>
|
||||
<string name="event_temperature_type" translatable="false">🌡️</string>
|
||||
<string name="event_colic_type" translatable="false">💨</string>
|
||||
<string name="event_unknown_type" translatable="false">\?</string>
|
||||
<string name="event_puke_type" translatable="false">🤮</string>
|
||||
<string name="event_bath_type" translatable="false">🛁</string>
|
||||
<string name="event_sleep_type" translatable="false">💤</string>
|
||||
<string name="event_unknown_type" translatable="false">❓</string>
|
||||
|
||||
<string name="event_bottle_desc">Baby bottle</string>
|
||||
<!-- dropdown menu item -->
|
||||
<string name="event_type_item_bottle">🍼 Bottle</string>
|
||||
<string name="event_type_item_food">🥣 Food</string>
|
||||
<string name="event_type_item_weight">⚖️ Weight</string>
|
||||
<string name="event_type_item_breastfeeding_left">🤱⬅️ Nursing</string>
|
||||
<string name="event_type_item_breastfeeding_both">🤱↔️ Nursing</string>
|
||||
<string name="event_type_item_breastfeeding_right">🤱➡️️ Nursing</string>
|
||||
<string name="event_type_item_diaperchange_poo">🚼💩 Diaper</string>
|
||||
<string name="event_type_item_diaperchange_pee">🚼💧 Diaper</string>
|
||||
<string name="event_type_item_medicine">💊 Medicine</string>
|
||||
<string name="event_type_item_enema">🪠 Enema</string>
|
||||
<string name="event_type_item_note">📝 Note</string>
|
||||
<string name="event_type_item_temperature">🌡️ Temperature</string>
|
||||
<string name="event_type_item_colic">💨 Colic</string>
|
||||
<string name="event_type_item_puke">🤮 Puke</string>
|
||||
<string name="event_type_item_sleep">💤 Sleep</string>
|
||||
<string name="event_type_item_bath">🛁 Bath</string>
|
||||
<string name="event_type_item_unknown">❓ Unknown</string>
|
||||
|
||||
<!-- dialog titles -->
|
||||
<string name="event_bottle_desc">Milk Bottle</string>
|
||||
<string name="event_food_desc">Food</string>
|
||||
<string name="event_scale_desc">Weight</string>
|
||||
<string name="event_breastfeeding_left_desc">Breastfeeding (left)</string>
|
||||
<string name="event_breastfeeding_both_desc">Breastfeeding</string>
|
||||
<string name="event_breastfeeding_right_desc">Breastfeeding (right)</string>
|
||||
<string name="event_diaperchange_poo_desc">Diaper chg (poo)</string>
|
||||
<string name="event_diaperchange_pee_desc">Diaper chg (pee)</string>
|
||||
<string name="event_weight_desc">Weight</string>
|
||||
<string name="event_breastfeeding_left_desc">Nursing (left)</string>
|
||||
<string name="event_breastfeeding_both_desc">Nursing (both)</string>
|
||||
<string name="event_breastfeeding_right_desc">Nursing (right)</string>
|
||||
<string name="event_diaperchange_poo_desc">Diaper Change (poo)</string>
|
||||
<string name="event_diaperchange_pee_desc">Diaper Change (pee)</string>
|
||||
<string name="event_medicine_desc">Medicine</string>
|
||||
<string name="event_enema_desc">Enema</string>
|
||||
<string name="event_note_desc">Note</string>
|
||||
<string name="event_temperature_desc">Temperature</string>
|
||||
<string name="event_colic_desc">Gaseous colic</string>
|
||||
<string name="event_unknown_desc"></string>
|
||||
|
||||
<string name="overflow_event_scale">⚖️ Weight</string>
|
||||
<string name="overflow_event_medicine">💊 Medicine</string>
|
||||
<string name="overflow_event_enema">🪠 Enema</string>
|
||||
<string name="overflow_event_note">📝 Note</string>
|
||||
<string name="overflow_event_temperature">🌡️ Temperature</string>
|
||||
<string name="overflow_event_colic">💨 Gaseous colic</string>
|
||||
<string name="event_puke_desc">Puke</string>
|
||||
<string name="event_bath_desc">Bath</string>
|
||||
<string name="event_sleep_desc">Sleep</string>
|
||||
<string name="event_unknown_desc">Unknown</string>
|
||||
|
||||
<string name="toast_event_added">Event logged</string>
|
||||
<string name="toast_logbook_saved">Logbook saved</string>
|
||||
<string name="toast_event_add_error">Unable to log the event</string>
|
||||
<string name="toast_integer_error">Invalid value. Insert an integer.</string>
|
||||
<string name="toast_date_error">Invalid date.</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">day</string>
|
||||
<string name="days_ago">days</string>
|
||||
<string name="year_ago">year</string>
|
||||
<string name="years_ago">years</string>
|
||||
|
||||
<string name="amount_unspecified"></string>
|
||||
<string name="amount_little">Little</string>
|
||||
<string name="amount_normal">Normal</string>
|
||||
<string name="amount_plenty">Plenty</string>
|
||||
|
||||
<string name="no_connection">No connection</string>
|
||||
<string name="no_connection_explain">Unable to reach WebDAV service</string>
|
||||
<string name="no_connection_go_to_settings">Settings</string>
|
||||
<string name="no_connection_retry">Retry</string>
|
||||
|
||||
<string name="statistics_title">Statistics</string>
|
||||
<string name="statistics_no_data">No Data</string>
|
||||
|
||||
<string name="settings_dynamic_menu">Dynamic Menu</string>
|
||||
<string name="settings_dynamic_menu_desc">Populate the header menu with the most used events.</string>
|
||||
<string name="settings_title">Settings</string>
|
||||
<string name="settings_signature">Signature</string>
|
||||
<string name="settings_signature_desc">Attach a signature to each event you create and for others to see. Useful if multiple people add events.</string>
|
||||
<string name="settings_storage">Choose where to save data</string>
|
||||
<string name="settings_storage_local">On device</string>
|
||||
<string name="settings_storage_local_desc">Most privacy-friendly solution: data doesn\'t leave your device</string>
|
||||
<string name="settings_storage_dav">On a WebDAV server</string>
|
||||
<string name="settings_storage_dav_desc">You can use any WebDAV service (i.e. Nextcloud, Owncloud, Dropbox, Box…) to save the data. In this way, you can syncronize it between more devices, i.e., the dad\'s, the mom\'s, the grandma\'s… You will need the WebDAV url, you can find it in your provider\'s documentation (i.e. in Nextcloud web is in the Files app settings)</string>
|
||||
<string name="settings_storage_dav_desc">You can use any WebDAV service (i.e. Nextcloud, Owncloud, Dropbox, Box…) to save the data. In this way, you can syncronize it between more devices, i.e., the dad\'s, the mom\'s, the grandma\'s… You will need the WebDAV URL, you can find it in your provider\'s documentation (i.e. in Nextcloud web is in the Files app settings)</string>
|
||||
<string name="settings_storage_dav_url">WebDAV URL</string>
|
||||
<string name="settings_storage_dav_url_hint">https://</string>
|
||||
<string name="settings_storage_dav_user">Username</string>
|
||||
@@ -92,10 +121,17 @@
|
||||
<string name="trim_logbook_dialog_button_ok">Trim it now</string>
|
||||
<string name="trim_logbook_dialog_button_cancel">Remind me later</string>
|
||||
|
||||
<string name="log_notes_dialog_description">Notes:</string>
|
||||
<string name="log_amount_dialog_description">Select the amount:</string>
|
||||
<string name="log_bottle_dialog_description">Insert the quantity contained in the baby bottle:</string>
|
||||
<string name="log_medicine_dialog_description">Medicine name, quantity, type, notes…:</string>
|
||||
<string name="log_notes_dialog_qty_hint">Quantity (or empty)</string>
|
||||
<string name="log_notes_dialog_description">Notes:</string>
|
||||
<string name="log_notes_dialog_note_hint">Write some notes</string>
|
||||
<string name="log_notes_dialog_qty_hint">Quantity (or empty)</string>
|
||||
<string name="log_temperature_dialog_description">Select the temperature:</string>
|
||||
<string name="log_unknown_dialog_description"></string>
|
||||
<string name="log_weight_dialog_description">Insert the weight:</string>
|
||||
<string name="log_sleep_dialog_description">Set sleep duration:</string>
|
||||
<string name="log_sleep_dialog_description_start">Start sleep cycle:</string>
|
||||
|
||||
<string name="measurement_unit_liquid_base_metric" translatable="false">ml</string>
|
||||
<string name="measurement_unit_weight_base_metric" translatable="false">g</string>
|
||||
@@ -106,10 +142,24 @@
|
||||
<string name="measurement_unit_temperature_base_imperial" translatable="false">°F</string>
|
||||
<string name="measurement_unit_temperature_base_metric" translatable="false">°C</string>
|
||||
|
||||
<string name="statistics_bottle_events">Bottle Events</string>
|
||||
<string name="statistics_bottle_sum">Bottle Per Day</string>
|
||||
<string name="statistics_medicine_events">Medicine Events</string>
|
||||
<string name="statistics_sleep_sum">Sleep Per Day</string>
|
||||
<string name="statistics_sleep_events">Sleep Events</string>
|
||||
<string name="statistics_sleep_pattern">Sleep Pattern</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_close_button">OK</string>
|
||||
<string name="dialog_event_detail_close_button">Close</string>
|
||||
<string name="dialog_event_detail_save_button">Save</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_event_detail_signature">by %s</string>
|
||||
|
||||
<string name="dialog_add_logbook_title">Add logbook</string>
|
||||
<string name="dialog_add_logbook_logbookname">👶 Logbook name</string>
|
||||
|
||||
@@ -4,6 +4,11 @@
|
||||
<style name="Theme.LunaTracker" parent="Theme.AppCompat.NoActionBar">
|
||||
<item name="colorAccent">@color/accent</item>
|
||||
<item name="android:textColor">@color/textColor</item>
|
||||
|
||||
<!-- make the screen not overlap with the system bars -->
|
||||
<item name="android:fitsSystemWindows">true</item>
|
||||
<item name="android:windowTranslucentStatus">true</item>
|
||||
<item name="android:windowTranslucentNavigation">true</item>
|
||||
</style>
|
||||
|
||||
<style name="OverflowMenuText">
|
||||
|
||||
@@ -6,6 +6,7 @@ This app is meant to log all the relevant events (diaper change, breastfeeding,
|
||||
Dedicated to my daughter Luna.
|
||||
|
||||
|
||||
A HUGE thanks to all our contributors. See https://git.ichibi.eu/penguin86/luna-tracker/src/branch/master/README.md
|
||||
|
||||
NOTE: The content on this app is for informational or educational purposes only and does not substitute professional medical advice or consultations with healthcare professionals.
|
||||
Feature graphic ("Baby and baby milk bottle. Baby feeding."): © Vyacheslav Argenberg / http://www.vascoplanet.com/, CC BY 4.0 <https://creativecommons.org/licenses/by/4.0>, via Wikimedia Commons
|
||||
|
||||
@@ -8,6 +8,8 @@ Elle permet de synchroniser les données entre différents appareils (en utilisa
|
||||
Dédié à ma fille Luna.
|
||||
|
||||
|
||||
Un grand merci à tous nos contributeurs. Voir https://git.ichibi.eu/penguin86/luna-tracker/src/branch/master/README.md
|
||||
|
||||
REMARQUE : le contenu de cette application est fourni à titre informatif ou éducatif uniquement et ne remplace pas les conseils médicaux professionnels ou les consultations avec des professionnels de la santé.
|
||||
|
||||
Crédit image ("Baby and baby milk bottle. Baby feeding."): © Vyacheslav Argenberg / http://www.vascoplanet.com/, CC BY 4.0 <https://creativecommons.org/licenses/by/4.0>, via Wikimedia Commons
|
||||
@@ -6,6 +6,7 @@ Quest'app è pensata per memorizzare tutti gli eventi del bambino (cambio di pan
|
||||
Dedicato a mia figlia Luna.
|
||||
|
||||
|
||||
Un grandissimo ringraziamento a tutti i contributors! Vedi https://git.ichibi.eu/penguin86/luna-tracker/src/branch/master/README.md
|
||||
|
||||
NOTA: il contenuto di quest'app ha solo scopo informativo o didattico e non sostituisce il consulto medico professionale o le consulenze con operatori sanitari.
|
||||
Feature graphic ("Baby and baby milk bottle. Baby feeding."): © Vyacheslav Argenberg / http://www.vascoplanet.com/, CC BY 4.0 <https://creativecommons.org/licenses/by/4.0>, via Wikimedia Commons
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[versions]
|
||||
agp = "8.7.2"
|
||||
agp = "8.13.0"
|
||||
kotlin = "2.0.0"
|
||||
coreKtx = "1.10.1"
|
||||
junit = "4.13.2"
|
||||
@@ -9,8 +9,11 @@ lifecycleRuntimeKtx = "2.6.1"
|
||||
activityCompose = "1.8.0"
|
||||
composeBom = "2024.04.01"
|
||||
appcompat = "1.7.0"
|
||||
mpandroidchart = "v4.2.2"
|
||||
mpandroidchartVersion = "v3.1.0"
|
||||
recyclerview = "1.3.2"
|
||||
material = "1.12.0"
|
||||
sardineAndroid = "v0.9"
|
||||
|
||||
[libraries]
|
||||
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
||||
@@ -30,6 +33,9 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit
|
||||
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
|
||||
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
|
||||
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
|
||||
mpandroidchart = { module = "com.github.PhilJay:MPAndroidChart", version.ref = "mpandroidchart" }
|
||||
mpandroidchart-vv310 = { module = "com.github.PhilJay:MPAndroidChart", version.ref = "mpandroidchartVersion" }
|
||||
sardine-android = { module = "com.github.thegrizzlylabs:sardine-android", version.ref = "sardineAndroid" }
|
||||
|
||||
[plugins]
|
||||
android-application = { id = "com.android.application", version.ref = "agp" }
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
||||
#Sat Nov 02 10:58:51 CET 2024
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -16,7 +16,7 @@ dependencyResolutionManagement {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
maven(url = "https://jitpack.io")
|
||||
maven(url = uri("https://jitpack.io"))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user