Compare commits
53
Commits
v0.7
...
9ad9aa7754
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ad9aa7754 | ||
|
|
5109e15a09 | ||
|
|
9c3373ab35 | ||
|
|
5cd14cd726 | ||
|
|
98045da201 | ||
|
|
718af91315 | ||
|
|
ac6b6c7a25 | ||
|
|
6fe0135bef | ||
|
|
c7f2d4cf3f | ||
|
|
d39a0426b0 | ||
|
|
10c59175f4 | ||
|
|
ef1420b313 | ||
|
|
4ae44aa261 | ||
|
|
81fba8e2b5 | ||
|
|
01e7ad07c8 | ||
|
|
3ccd2db7b1 | ||
|
|
b6823bbdfb | ||
|
|
b3ff9f4bb9 | ||
|
|
ee5b9fa24b | ||
|
|
cd523f8282 | ||
|
|
06180f95a8 | ||
|
|
dbfc7fb866 | ||
|
|
0e655371c7 | ||
|
|
d776b479fa | ||
|
|
1613aeb3f4 | ||
|
|
e378f1e6ea | ||
|
|
70800ee850 | ||
|
|
984bcc1698 | ||
|
|
79275f5704 | ||
|
|
ad5bb5537b | ||
|
|
85896d0f97 | ||
|
|
386586ccae | ||
|
|
4fc327342d | ||
|
|
500d58eb74 | ||
|
|
1368c09c58 | ||
|
|
24a73969be | ||
|
|
5d0b2af665 | ||
|
|
8c906369df | ||
|
|
5eeb462836 | ||
|
|
5b777c0b88 | ||
|
|
6f3061974d | ||
|
|
3ea396c045 | ||
|
|
193e21ce25 | ||
|
|
7f67c758c9 | ||
|
|
dfa64d71a8 | ||
|
|
b7180068f3 | ||
|
|
36b848b95e | ||
|
|
a1bde917f8 | ||
|
|
4f4ff5ed21 | ||
|
|
453d838470 | ||
|
|
34aa092722 | ||
|
|
961e7b90e7 | ||
|
|
be77c7fb22 |
@@ -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,24 @@ Dedicated to my daughter Luna.
|
||||
|
||||

|
||||
|
||||
## Thanks for the valuable contributions to:
|
||||
## Contributions
|
||||
|
||||
### Why isn't this hosted on GitHub?
|
||||
|
||||
I'm using a private git server just because I'm worried for the vast majority of open source code being hosted in a server property of Microsoft and being used to train theirs AI.
|
||||
I didn't find a better option, BTW the Gitea project is working on implementing federation, so soon it will be possible to contribute using any other gitea server, selfhosted or not.
|
||||
|
||||
### How to contribute
|
||||
|
||||
The project is open to contribution, but with some limits:
|
||||
|
||||
- I'm sorry I can't accept AI-generated contributions. Reviewing a contribution requires time and effort from my side, while generating code with AI requires very little time and produces non reliable code that must be reviewed in detail. This is effectively shifting the work on my side, and in a forced way. If you feel you need a feature but you're not able to implement it by yourself, I prefer you to create an issue in the repository so I can implement it when I can, in a more mantainable way.
|
||||
- I prefer to make project-wide changes (i.e. updating Android target, app name and icon, release number...) by myself.
|
||||
|
||||
To contribute, you'll have to create an account on this git instance. Unfortunately, I had to disable registration to avoid huge waves of fake accounts created by bots.
|
||||
You can request an account writing to daniele.verducci@ichibi.eu
|
||||
|
||||
### Thanks for the valuable contributions to:
|
||||
|
||||
- Chepycou (French translation)
|
||||
- Daniel Neubauer (German translation)
|
||||
|
||||
+11
-6
@@ -6,14 +6,14 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "it.danieleverducci.lunatracker"
|
||||
compileSdk = 34
|
||||
compileSdk = 36
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "it.danieleverducci.lunatracker"
|
||||
minSdk = 21
|
||||
targetSdk = 34
|
||||
versionCode = 5
|
||||
versionName = "0.7"
|
||||
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)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,9 @@ 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
|
||||
@@ -23,7 +25,8 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
protected lateinit var textViewWebDAVUser: TextView
|
||||
protected lateinit var textViewWebDAVPass: TextView
|
||||
protected lateinit var progressIndicator: LinearProgressIndicator
|
||||
protected lateinit var switchNoBreastfeeding: SwitchMaterial
|
||||
protected lateinit var switchDynamicMenu: SwitchMaterial
|
||||
protected lateinit var textViewSignature: EditText
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -35,7 +38,8 @@ 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)
|
||||
switchNoBreastfeeding = findViewById(R.id.switch_no_breastfeeding)
|
||||
switchDynamicMenu = findViewById(R.id.switch_dynamic_menu)
|
||||
textViewSignature = findViewById(R.id.settings_signature)
|
||||
|
||||
findViewById<View>(R.id.settings_save).setOnClickListener({
|
||||
validateAndSave()
|
||||
@@ -51,19 +55,21 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
fun loadSettings() {
|
||||
val dataRepo = settingsRepository.loadDataRepository()
|
||||
val webDavCredentials = settingsRepository.loadWebdavCredentials()
|
||||
val noBreastfeeding = settingsRepository.loadNoBreastfeeding()
|
||||
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
|
||||
}
|
||||
|
||||
switchNoBreastfeeding.isChecked = noBreastfeeding
|
||||
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]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,7 +161,8 @@ open class SettingsActivity : AppCompatActivity() {
|
||||
if (radioDataWebDAV.isChecked) LocalSettingsRepository.DATA_REPO.WEBDAV
|
||||
else LocalSettingsRepository.DATA_REPO.LOCAL_FILE
|
||||
)
|
||||
settingsRepository.saveNoBreastfeeding(switchNoBreastfeeding.isChecked)
|
||||
settingsRepository.saveDynamicMenu(switchDynamicMenu.isChecked)
|
||||
settingsRepository.saveSignature(textViewSignature.text.toString())
|
||||
settingsRepository.saveWebdavCredentials(
|
||||
textViewWebDAVUrl.text.toString(),
|
||||
textViewWebDAVUser.text.toString(),
|
||||
@@ -170,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) {
|
||||
|
||||
+23
-11
@@ -52,19 +52,18 @@ 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)
|
||||
holder.time.text = DateUtils.formatTimeAgo(context, item.getEndTime())
|
||||
var quantityText = numericUtils.formatEventQuantity(item)
|
||||
|
||||
// if the event is weight, show difference with the last one
|
||||
if (item.type == LunaEvent.TYPE_WEIGHT) {
|
||||
val lastWeight = getPreviousWeightEvent(position)
|
||||
if (item.type == LunaEvent.Type.WEIGHT) {
|
||||
val lastWeight = getPreviousEvent(position, LunaEvent.Type.WEIGHT)
|
||||
if (lastWeight != null) {
|
||||
val differenceInWeight = item.quantity - lastWeight.quantity
|
||||
val sign = if (differenceInWeight > 0) "+" else ""
|
||||
@@ -75,6 +74,19 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
|
||||
}
|
||||
}
|
||||
|
||||
// if the event is height, show difference with the last one
|
||||
if (item.type == LunaEvent.Type.HEIGHT) {
|
||||
val lastHeight = getPreviousEvent(position, LunaEvent.Type.HEIGHT)
|
||||
if (lastHeight != null) {
|
||||
val differenceInHeight = item.quantity - lastHeight.quantity
|
||||
val sign = if (differenceInHeight > 0) "+" else ""
|
||||
quantityText += "\n($sign$differenceInHeight)"
|
||||
if (differenceInHeight < 0) {
|
||||
holder.quantity.setTextColor(ContextCompat.getColor(context, R.color.danger))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
holder.quantity.text = quantityText
|
||||
|
||||
// Listeners
|
||||
@@ -89,12 +101,12 @@ class LunaEventRecyclerAdapter: RecyclerView.Adapter<LunaEventRecyclerAdapter.Lu
|
||||
return items.size
|
||||
}
|
||||
|
||||
private fun getPreviousWeightEvent(startFromPosition: Int): LunaEvent? {
|
||||
private fun getPreviousEvent(startFromPosition: Int, type: LunaEvent.Type): LunaEvent? {
|
||||
if (startFromPosition == items.size - 1)
|
||||
return null
|
||||
for (pos in startFromPosition + 1 until items.size) {
|
||||
val item = items.get(pos)
|
||||
if (item.type != LunaEvent.TYPE_WEIGHT)
|
||||
if (item.type != type)
|
||||
continue
|
||||
return item
|
||||
}
|
||||
|
||||
@@ -12,22 +12,25 @@ import java.util.Date
|
||||
* release, it is simply ignored by previous ones).
|
||||
*/
|
||||
class LunaEvent: Comparable<LunaEvent> {
|
||||
|
||||
companion object {
|
||||
const val TYPE_BABY_BOTTLE = "BABY_BOTTLE"
|
||||
const val TYPE_WEIGHT = "WEIGHT"
|
||||
const val TYPE_BREASTFEEDING_LEFT_NIPPLE = "BREASTFEEDING_LEFT_NIPPLE"
|
||||
const val TYPE_BREASTFEEDING_BOTH_NIPPLE = "BREASTFEEDING_BOTH_NIPPLE"
|
||||
const val TYPE_BREASTFEEDING_RIGHT_NIPPLE = "BREASTFEEDING_RIGHT_NIPPLE"
|
||||
const val TYPE_DIAPERCHANGE_POO = "DIAPERCHANGE_POO"
|
||||
const val TYPE_DIAPERCHANGE_PEE = "DIAPERCHANGE_PEE"
|
||||
const val TYPE_MEDICINE = "MEDICINE"
|
||||
const val TYPE_ENEMA = "ENEMA"
|
||||
const val TYPE_NOTE = "NOTE"
|
||||
const val TYPE_CUSTOM = "CUSTOM"
|
||||
const val TYPE_COLIC = "COLIC"
|
||||
const val TYPE_TEMPERATURE = "TEMPERATURE"
|
||||
const val TYPE_FOOD = "FOOD"
|
||||
enum class Type {
|
||||
BABY_BOTTLE,
|
||||
FOOD,
|
||||
BREASTFEEDING_LEFT_NIPPLE,
|
||||
BREASTFEEDING_BOTH_NIPPLE,
|
||||
BREASTFEEDING_RIGHT_NIPPLE,
|
||||
DIAPERCHANGE_POO,
|
||||
DIAPERCHANGE_PEE,
|
||||
SLEEP,
|
||||
WEIGHT,
|
||||
HEIGHT,
|
||||
MEDICINE,
|
||||
ENEMA,
|
||||
NOTE,
|
||||
COLIC,
|
||||
TEMPERATURE,
|
||||
PUKE,
|
||||
BATH,
|
||||
UNKNOWN
|
||||
}
|
||||
|
||||
private val jo: JSONObject
|
||||
@@ -37,22 +40,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,65 +78,53 @@ 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 getStartTime(): Long {
|
||||
return time
|
||||
}
|
||||
|
||||
fun getEndTime(): Long {
|
||||
return if (type == Type.SLEEP) {
|
||||
time + quantity
|
||||
} else {
|
||||
time
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,10 +133,105 @@ 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.HEIGHT -> R.string.event_height_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.HEIGHT -> R.string.log_height_dialog_description
|
||||
Type.SLEEP -> R.string.log_duration_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.HEIGHT -> R.string.event_height_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.HEIGHT -> R.string.event_type_item_height
|
||||
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
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -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
|
||||
|
||||
+24
-23
@@ -7,13 +7,14 @@ 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"
|
||||
val SHARED_PREFS_NO_BREASTFEEDING = "no_breastfeeding"
|
||||
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
|
||||
@@ -22,32 +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 saveNoBreastfeeding(content: Boolean) {
|
||||
sharedPreferences.edit().putBoolean(SHARED_PREFS_NO_BREASTFEEDING, content).apply()
|
||||
fun saveDynamicMenu(content: Boolean) {
|
||||
sharedPreferences.edit { putBoolean(SHARED_PREFS_DYNAMIC_MENU, content) }
|
||||
}
|
||||
|
||||
fun loadNoBreastfeeding(): Boolean {
|
||||
return sharedPreferences.getBoolean(SHARED_PREFS_NO_BREASTFEEDING, false)
|
||||
fun loadDynamicMenu(): Boolean {
|
||||
return sharedPreferences.getBoolean(SHARED_PREFS_DYNAMIC_MENU, false)
|
||||
}
|
||||
|
||||
fun saveDataRepository(repo: DATA_REPO) {
|
||||
val spe = sharedPreferences.edit()
|
||||
spe.putString(
|
||||
sharedPreferences.edit(commit = true) {
|
||||
putString(
|
||||
SHARED_PREFS_DATA_REPO,
|
||||
when (repo) {
|
||||
DATA_REPO.WEBDAV -> "webdav"
|
||||
DATA_REPO.LOCAL_FILE -> "localfile"
|
||||
}
|
||||
)
|
||||
spe.commit()
|
||||
}
|
||||
}
|
||||
|
||||
fun loadDataRepository(): DATA_REPO {
|
||||
@@ -60,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,13 +1,23 @@
|
||||
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", rounded to minutes.
|
||||
* Used for the duration to the next/previous event in the event details dialog.
|
||||
*/
|
||||
fun formatTimeDuration(context: Context, secondsDiff: Long): String {
|
||||
val adjusted = (secondsDiff + 30) - (secondsDiff + 30) % 60
|
||||
return formatTimeDurationExact(context, adjusted)
|
||||
}
|
||||
|
||||
fun formatTimeDurationExact(context: Context, secondsDiff: Long): String {
|
||||
var seconds = secondsDiff
|
||||
|
||||
val years = (seconds / (365 * 24 * 60 * 60F)).toLong()
|
||||
@@ -51,21 +61,20 @@ class DateUtils {
|
||||
return builder.toString()
|
||||
}
|
||||
|
||||
if (years > 0) {
|
||||
if (years != 0L) {
|
||||
return format(years, days, R.string.year_ago, R.string.years_ago, R.string.day_ago, R.string.days_ago)
|
||||
} else if (days > 0) {
|
||||
} else if (days != 0L) {
|
||||
return format(days, hours, R.string.day_ago, R.string.days_ago, R.string.hour_ago, R.string.hours_ago)
|
||||
} else if (hours > 0) {
|
||||
} else if (hours != 0L) {
|
||||
return format(hours, minutes, R.string.hour_ago, R.string.hours_ago, R.string.minute_ago, R.string.minutes_ago)
|
||||
} else if (minutes > 0) {
|
||||
return format(minutes, seconds, R.string.minute_ago, R.string.minute_ago, R.string.second_ago, R.string.seconds_ago)
|
||||
} else {
|
||||
return context.getString(R.string.now)
|
||||
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
|
||||
@@ -100,5 +109,21 @@ class DateUtils {
|
||||
}
|
||||
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,77 +3,121 @@ 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) {
|
||||
val numberFormat: NumberFormat
|
||||
val measurement_unit_liquid_base: String
|
||||
val measurement_unit_weight_base: String
|
||||
val measurement_unit_weight_tiny: String
|
||||
val measurement_unit_height_base: String
|
||||
val measurement_unit_temperature_base: String
|
||||
|
||||
init {
|
||||
this.numberFormat = NumberFormat.getInstance()
|
||||
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.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_height_base = context.getString(
|
||||
if (isMetricSystem())
|
||||
R.string.measurement_unit_height_base_metric
|
||||
else
|
||||
R.string.measurement_unit_height_base_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.HEIGHT -> measurement_unit_height_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>
|
||||
@@ -86,15 +86,16 @@
|
||||
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:id="@+id/button1_row1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="2"
|
||||
android:layout_weight="1"
|
||||
android:layout_margin="5dp"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
@@ -102,7 +103,7 @@
|
||||
android:text="@string/event_bottle_type"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_food"
|
||||
android:id="@+id/button2_row1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
@@ -115,80 +116,77 @@
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/layout_nipples">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_nipple_left"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"
|
||||
android:text="🤱⬅️"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_nipple_both"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"
|
||||
android:text="🤱↔️"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_nipple_right"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"
|
||||
android:text="🤱➡️️"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linear_layout_row2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_change_poo"
|
||||
android:id="@+id/button1_row2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="2"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"
|
||||
android:text="🚼 💩"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_change_pee"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="2"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"
|
||||
android:text="🚼 💧"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/button_more"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
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"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button2_row2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button3_row2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
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/button1_row3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="2"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button2_row3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="2"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/button_more"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/button_background"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="30sp"
|
||||
android:text="☰"
|
||||
app:tint="@android:color/darker_gray"/>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -261,6 +259,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginHorizontal="10dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="@string/no_connection_explain"/>
|
||||
|
||||
|
||||
@@ -119,28 +119,57 @@
|
||||
android:visibility="invisible"/>
|
||||
</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="5dp"
|
||||
android:layout_marginEnd="30dp">
|
||||
android:layout_marginTop="20dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/no_breastfeeding" />
|
||||
android:text="@string/settings_dynamic_menu" />
|
||||
|
||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||
android:id="@+id/switch_no_breastfeeding"
|
||||
android:layout_width="0dp"
|
||||
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"
|
||||
|
||||
+9
-9
@@ -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_marginStart="10dp"
|
||||
android:text="g"/>
|
||||
android:layout_marginTop="20dp"/>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,36 @@
|
||||
<?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:id="@+id/dialog_number_picker_unit"
|
||||
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>
|
||||
@@ -0,0 +1,75 @@
|
||||
<?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:layout_marginTop="10dp"
|
||||
android:textSize="20sp"
|
||||
android:text="💤"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/duration_buttons"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:gravity="center"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginHorizontal="10dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<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/dialog_duration_button_now"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/dialog_date_duration_clear"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/dialog_duration_button_clear"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:gravity="center"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginHorizontal="10dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_date_picker_begin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_weight="1"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_date_range_delimiter"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:text="-"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_date_picker_end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_weight="1"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,39 @@
|
||||
<?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:id="@+id/dialog_number_unit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="10dp"
|
||||
android:text="cm"/>
|
||||
|
||||
</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>
|
||||
+30
@@ -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>
|
||||
+5
-9
@@ -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_marginStart="10dp"
|
||||
android:text="ml"/>
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</LinearLayout>
|
||||
+7
@@ -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>
|
||||
@@ -0,0 +1,39 @@
|
||||
<?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:id="@+id/dialog_number_unit"
|
||||
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>
|
||||
+24
-5
@@ -1,10 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="20dp">
|
||||
android:paddingTop="20dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:paddingHorizontal="20dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_emoji"
|
||||
@@ -34,9 +35,7 @@
|
||||
android:drawablePadding="10dp"
|
||||
android:drawableTint="@color/accent"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/dialog_event_detail_datetime_icon"
|
||||
app:drawableEndCompat="@drawable/ic_edit" />
|
||||
android:textStyle="bold"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dialog_event_detail_type_quantity"
|
||||
@@ -46,6 +45,18 @@
|
||||
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"
|
||||
@@ -61,6 +72,14 @@
|
||||
|
||||
</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"
|
||||
@@ -2,73 +2,15 @@
|
||||
<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:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="20dp"
|
||||
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"/>
|
||||
|
||||
<!-- Buttons are inserted dynamically -->
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
@@ -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"/>
|
||||
@@ -3,18 +3,9 @@
|
||||
<string name="title">🌜 LunaTracker 🌛</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>
|
||||
@@ -27,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>
|
||||
@@ -50,8 +34,6 @@
|
||||
<string name="no_connection_go_to_settings">Einstellungen</string>
|
||||
<string name="no_connection_retry">Erneut versuchen</string>
|
||||
|
||||
<string name="no_breastfeeding">Kein Stillen</string>
|
||||
|
||||
<string name="settings_title">Einstellungen</string>
|
||||
<string name="settings_storage">Speicherort für Daten auswählen</string>
|
||||
<string name="settings_storage_local">Auf dem Gerät</string>
|
||||
@@ -78,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>
|
||||
|
||||
@@ -3,18 +3,9 @@
|
||||
<string name="title">🌜 LunaTracker 🌛</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>
|
||||
@@ -27,13 +18,6 @@
|
||||
<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>
|
||||
@@ -76,10 +60,13 @@
|
||||
<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_close_button">OK</string>
|
||||
|
||||
@@ -3,25 +3,9 @@
|
||||
<string name="title">🌜 LunaTracker 🌛</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>
|
||||
@@ -76,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>
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<?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>
|
||||
</resources>
|
||||
@@ -3,21 +3,14 @@
|
||||
<string name="title">🌜 LunaTracker 🌛</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_height_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>
|
||||
@@ -25,34 +18,56 @@
|
||||
<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_height">📏 Height</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_height_desc">Height</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="second_ago">sec</string>
|
||||
@@ -66,14 +81,21 @@
|
||||
<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="no_breastfeeding">No Breastfeeding</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>
|
||||
@@ -99,30 +121,52 @@
|
||||
<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_height_dialog_description">Insert the height:</string>
|
||||
<string name="log_duration_dialog_description">Set duration:</string>
|
||||
|
||||
<string name="measurement_unit_liquid_base_metric" translatable="false">ml</string>
|
||||
<string name="measurement_unit_weight_base_metric" translatable="false">g</string>
|
||||
<string name="measurement_unit_weight_tiny_metric" translatable="false">mg</string>
|
||||
<string name="measurement_unit_height_base_metric" translatable="false">cm</string>
|
||||
<string name="measurement_unit_liquid_base_imperial" translatable="false">fl oz.</string>
|
||||
<string name="measurement_unit_weight_base_imperial" translatable="false">oz</string>
|
||||
<string name="measurement_unit_weight_tiny_imperial" translatable="false">gr</string>
|
||||
<string name="measurement_unit_height_base_imperial" translatable="false">in</string>
|
||||
<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">🕒 %s</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_duration_button_clear">Clear</string>
|
||||
<string name="dialog_duration_button_minus_5">-5 min</string>
|
||||
<string name="dialog_duration_button_now">Now</string>
|
||||
<string name="dialog_duration_button_plus_5">+5 min</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">
|
||||
|
||||
@@ -11,6 +11,7 @@ composeBom = "2024.04.01"
|
||||
appcompat = "1.7.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 +31,7 @@ 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" }
|
||||
sardine-android = { module = "com.github.thegrizzlylabs:sardine-android", version.ref = "sardineAndroid" }
|
||||
|
||||
[plugins]
|
||||
android-application = { id = "com.android.application", version.ref = "agp" }
|
||||
|
||||
+1
-1
@@ -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