Compare commits
8 Commits
897b7bcf93
...
v0.7
Author | SHA1 | Date | |
---|---|---|---|
a7c44df553 | |||
928112adb8 | |||
b90dc92874 | |||
36481a1194 | |||
d4adb9d981 | |||
5df3b31e64 | |||
0a96fb91d7 | |||
f4c526ff8d |
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>
|
@@ -11,7 +11,8 @@ Dedicated to my daughter Luna.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Thanks for the valuable contributions to:
|
## Thanks for the valuable contributions to:
|
||||||
|
|
||||||
Chepycou (French translation)
|
- Chepycou (French translation)
|
||||||
Daniel Neubauer (German translation)
|
- Daniel Neubauer (German translation)
|
||||||
|
- Moritz Warning (Various bugfixes and new features)
|
||||||
|
@@ -12,8 +12,8 @@ android {
|
|||||||
applicationId = "it.danieleverducci.lunatracker"
|
applicationId = "it.danieleverducci.lunatracker"
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
targetSdk = 34
|
targetSdk = 34
|
||||||
versionCode = 4
|
versionCode = 5
|
||||||
versionName = "0.6"
|
versionName = "0.7"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
@@ -39,6 +39,7 @@ import it.danieleverducci.lunatracker.repository.WebDAVLogbookRepository
|
|||||||
import kotlinx.coroutines.Runnable
|
import kotlinx.coroutines.Runnable
|
||||||
import okio.IOException
|
import okio.IOException
|
||||||
import org.json.JSONException
|
import org.json.JSONException
|
||||||
|
import utils.DateUtils
|
||||||
import utils.NumericUtils
|
import utils.NumericUtils
|
||||||
import java.text.DateFormat
|
import java.text.DateFormat
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
@@ -131,7 +132,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
val adapter = LunaEventRecyclerAdapter(this, items)
|
val adapter = LunaEventRecyclerAdapter(this, items)
|
||||||
adapter.onItemClickListener = object: LunaEventRecyclerAdapter.OnItemClickListener{
|
adapter.onItemClickListener = object: LunaEventRecyclerAdapter.OnItemClickListener{
|
||||||
override fun onItemClick(event: LunaEvent) {
|
override fun onItemClick(event: LunaEvent) {
|
||||||
showEventDetailDialog(event)
|
showEventDetailDialog(event, items)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
@@ -308,7 +309,35 @@ class MainActivity : AppCompatActivity() {
|
|||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun showEventDetailDialog(event: LunaEvent) {
|
fun getPreviousSameEvent(event: LunaEvent, items: ArrayList<LunaEvent>): LunaEvent? {
|
||||||
|
var previousEvent: LunaEvent? = null
|
||||||
|
for (item in items) {
|
||||||
|
if (item.type == event.type && item.time < event.time) {
|
||||||
|
if (previousEvent == null) {
|
||||||
|
previousEvent = item
|
||||||
|
} else if (previousEvent.time < item.time) {
|
||||||
|
previousEvent = item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return previousEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getNextSameEvent(event: LunaEvent, items: ArrayList<LunaEvent>): LunaEvent? {
|
||||||
|
var nextEvent: LunaEvent? = null
|
||||||
|
for (item in items) {
|
||||||
|
if (item.type == event.type && item.time > event.time) {
|
||||||
|
if (nextEvent == null) {
|
||||||
|
nextEvent = item
|
||||||
|
} else if (nextEvent.time > item.time) {
|
||||||
|
nextEvent = item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nextEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
fun showEventDetailDialog(event: LunaEvent, items: ArrayList<LunaEvent>) {
|
||||||
// Do not update list while the detail is shown, to avoid changing the object below while it is changed by the user
|
// Do not update list while the detail is shown, to avoid changing the object below while it is changed by the user
|
||||||
pauseLogbookUpdate = true
|
pauseLogbookUpdate = true
|
||||||
val dateFormat = DateFormat.getDateTimeInstance()
|
val dateFormat = DateFormat.getDateTimeInstance()
|
||||||
@@ -359,6 +388,37 @@ class MainActivity : AppCompatActivity() {
|
|||||||
// Resume logbook update
|
// Resume logbook update
|
||||||
pauseLogbookUpdate = false
|
pauseLogbookUpdate = false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// create next/previous links to events of the same type
|
||||||
|
|
||||||
|
val previousTextView = dialogView.findViewById<TextView>(R.id.dialog_event_previous)
|
||||||
|
val nextTextView = dialogView.findViewById<TextView>(R.id.dialog_event_next)
|
||||||
|
val nextEvent = getNextSameEvent(event, items)
|
||||||
|
val previousEvent = getPreviousSameEvent(event, items)
|
||||||
|
|
||||||
|
if (previousEvent != null) {
|
||||||
|
val emoji = previousEvent.getTypeEmoji(applicationContext)
|
||||||
|
val time = DateUtils.formatTimeDuration(applicationContext, event.time - previousEvent.time)
|
||||||
|
previousTextView.text = String.format("⬅️ %s %s", emoji, time)
|
||||||
|
previousTextView.setOnClickListener {
|
||||||
|
alertDialog.cancel()
|
||||||
|
showEventDetailDialog(previousEvent, items)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
previousTextView.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextEvent != null) {
|
||||||
|
val emoji = nextEvent.getTypeEmoji(applicationContext)
|
||||||
|
val time = DateUtils.formatTimeDuration(applicationContext, nextEvent.time - event.time)
|
||||||
|
nextTextView.text = String.format("%s %s ➡️", time, emoji)
|
||||||
|
nextTextView.setOnClickListener {
|
||||||
|
alertDialog.cancel()
|
||||||
|
showEventDetailDialog(nextEvent, items)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nextTextView.visibility = View.GONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun showAddLogbookDialog(requestedByUser: Boolean) {
|
fun showAddLogbookDialog(requestedByUser: Boolean) {
|
||||||
|
@@ -7,6 +7,62 @@ import java.util.Date
|
|||||||
|
|
||||||
class DateUtils {
|
class DateUtils {
|
||||||
companion object {
|
companion object {
|
||||||
|
fun formatTimeDuration(context: Context, secondsDiff: Long): String {
|
||||||
|
var seconds = secondsDiff
|
||||||
|
|
||||||
|
val years = (seconds / (365 * 24 * 60 * 60F)).toLong()
|
||||||
|
seconds -= years * (365 * 24 * 60 * 60)
|
||||||
|
val days = (seconds / (24 * 60 * 60F)).toLong()
|
||||||
|
seconds -= days * (24 * 60 * 60)
|
||||||
|
val hours = (seconds / (60 * 60F)).toLong()
|
||||||
|
seconds -= hours * (60 * 60)
|
||||||
|
val minutes = (seconds / 60F).toLong()
|
||||||
|
seconds -= minutes * 60
|
||||||
|
|
||||||
|
fun format(value1: Long, value2: Long, resIdSingular1: Int, resIdPlural1: Int, resIdSingular2: Int, resIdPlural2: Int): String {
|
||||||
|
val builder = StringBuilder()
|
||||||
|
if (value1 == 0L) {
|
||||||
|
// omit
|
||||||
|
} else if (value1 == 1L) {
|
||||||
|
builder.append(value1)
|
||||||
|
builder.append(" ")
|
||||||
|
builder.append(context.getString(resIdSingular1))
|
||||||
|
} else {
|
||||||
|
builder.append(value1)
|
||||||
|
builder.append(" ")
|
||||||
|
builder.append(context.getString(resIdPlural1))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value1 > 0L && value2 > 0L) {
|
||||||
|
builder.append(", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value2 == 0L) {
|
||||||
|
// omit
|
||||||
|
} else if (value2 == 1L) {
|
||||||
|
builder.append(value2)
|
||||||
|
builder.append(" ")
|
||||||
|
builder.append(context.getString(resIdSingular2))
|
||||||
|
} else {
|
||||||
|
builder.append(value2)
|
||||||
|
builder.append(" ")
|
||||||
|
builder.append(context.getString(resIdPlural2))
|
||||||
|
}
|
||||||
|
return builder.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (years > 0) {
|
||||||
|
return format(years, days, R.string.year_ago, R.string.years_ago, R.string.day_ago, R.string.days_ago)
|
||||||
|
} else if (days > 0) {
|
||||||
|
return format(days, hours, R.string.day_ago, R.string.days_ago, R.string.hour_ago, R.string.hours_ago)
|
||||||
|
} else if (hours > 0) {
|
||||||
|
return format(hours, minutes, R.string.hour_ago, R.string.hours_ago, R.string.minute_ago, R.string.minutes_ago)
|
||||||
|
} else if (minutes > 0) {
|
||||||
|
return format(minutes, seconds, R.string.minute_ago, R.string.minute_ago, R.string.second_ago, R.string.seconds_ago)
|
||||||
|
} else {
|
||||||
|
return context.getString(R.string.now)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats the provided unix timestamp in a string like "3 hours, 26 minutes ago)
|
* Formats the provided unix timestamp in a string like "3 hours, 26 minutes ago)
|
||||||
@@ -25,10 +81,10 @@ class DateUtils {
|
|||||||
return DateFormat.getDateFormat(context).format(Date(unixTime*1000)) + "\n" +
|
return DateFormat.getDateFormat(context).format(Date(unixTime*1000)) + "\n" +
|
||||||
DateFormat.getTimeFormat(context).format(Date(unixTime*1000))
|
DateFormat.getTimeFormat(context).format(Date(unixTime*1000))
|
||||||
|
|
||||||
var formattedTime = StringBuilder()
|
val formattedTime = StringBuilder()
|
||||||
if (hoursAgo > 0) {
|
if (hoursAgo > 0) {
|
||||||
formattedTime.append(hoursAgo).append(" ")
|
formattedTime.append(hoursAgo).append(" ")
|
||||||
if (hoursAgo.toInt() == 1)
|
if (hoursAgo == 1)
|
||||||
formattedTime.append(context.getString(R.string.hour_ago))
|
formattedTime.append(context.getString(R.string.hour_ago))
|
||||||
else
|
else
|
||||||
formattedTime.append(context.getString(R.string.hours_ago))
|
formattedTime.append(context.getString(R.string.hours_ago))
|
||||||
@@ -37,7 +93,7 @@ class DateUtils {
|
|||||||
if (formattedTime.isNotEmpty())
|
if (formattedTime.isNotEmpty())
|
||||||
formattedTime.append(", ")
|
formattedTime.append(", ")
|
||||||
formattedTime.append(minutesAgo).append(" ")
|
formattedTime.append(minutesAgo).append(" ")
|
||||||
if (minutesAgo.toInt() == 1)
|
if (minutesAgo == 1)
|
||||||
formattedTime.append(context.getString(R.string.minute_ago))
|
formattedTime.append(context.getString(R.string.minute_ago))
|
||||||
else
|
else
|
||||||
formattedTime.append(context.getString(R.string.minutes_ago))
|
formattedTime.append(context.getString(R.string.minutes_ago))
|
||||||
|
@@ -47,7 +47,7 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="38dp"
|
android:layout_height="38dp"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:gravity="center_vertical">
|
android:gravity="center_vertical">
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="2"
|
android:layout_weight="2"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
android:textSize="50sp"
|
android:textSize="50sp"
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
android:textSize="50sp"
|
android:textSize="50sp"
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
android:id="@+id/button_nipple_left"
|
android:id="@+id/button_nipple_left"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
android:id="@+id/button_nipple_both"
|
android:id="@+id/button_nipple_both"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
@@ -145,7 +145,7 @@
|
|||||||
android:id="@+id/button_nipple_right"
|
android:id="@+id/button_nipple_right"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
@@ -162,7 +162,7 @@
|
|||||||
android:id="@+id/button_change_poo"
|
android:id="@+id/button_change_poo"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:layout_weight="2"
|
android:layout_weight="2"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
android:id="@+id/button_change_pee"
|
android:id="@+id/button_change_pee"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:layout_weight="2"
|
android:layout_weight="2"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
android:id="@+id/button_more"
|
android:id="@+id/button_more"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_margin="10dp"
|
android:layout_margin="5dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:background="@drawable/button_background"
|
android:background="@drawable/button_background"
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
@@ -198,6 +198,7 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
@@ -60,4 +60,33 @@
|
|||||||
android:text="@string/dialog_event_detail_notes"/>
|
android:text="@string/dialog_event_detail_notes"/>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/dialog_event_previous"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:text="" />
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/dialog_event_next"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="10dp"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:text="" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
@@ -55,10 +55,16 @@
|
|||||||
<string name="toast_integer_error">Invalid value. Insert an integer.</string>
|
<string name="toast_integer_error">Invalid value. Insert an integer.</string>
|
||||||
|
|
||||||
<string name="now">now</string>
|
<string name="now">now</string>
|
||||||
<string name="hour_ago">hour</string>
|
<string name="second_ago">sec</string>
|
||||||
<string name="hours_ago">hours</string>
|
<string name="seconds_ago">secs</string>
|
||||||
<string name="minute_ago">min</string>
|
<string name="minute_ago">min</string>
|
||||||
<string name="minutes_ago">mins</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="no_connection">No connection</string>
|
<string name="no_connection">No connection</string>
|
||||||
<string name="no_connection_explain">Unable to reach WebDAV service</string>
|
<string name="no_connection_explain">Unable to reach WebDAV service</string>
|
||||||
|
@@ -6,6 +6,7 @@ This app is meant to log all the relevant events (diaper change, breastfeeding,
|
|||||||
Dedicated to my daughter Luna.
|
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.
|
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
|
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.
|
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é.
|
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
|
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.
|
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.
|
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
|
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]
|
[versions]
|
||||||
agp = "8.7.2"
|
agp = "8.13.0"
|
||||||
kotlin = "2.0.0"
|
kotlin = "2.0.0"
|
||||||
coreKtx = "1.10.1"
|
coreKtx = "1.10.1"
|
||||||
junit = "4.13.2"
|
junit = "4.13.2"
|
||||||
|
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
|
#Sat Nov 02 10:58:51 CET 2024
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
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
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
Reference in New Issue
Block a user