Forráskód Böngészése

added alternative date format

sirekanian 3 éve
szülő
commit
d4d6eba8c5

+ 1 - 6
app/src/main/java/com/sirekanian/spacetime/ui/DateField.kt

@@ -4,9 +4,7 @@ import android.util.Log
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.input.OffsetMapping
 import androidx.compose.ui.text.input.TransformedText
-import com.sirekanian.spacetime.ext.currentDate
 import kotlinx.datetime.LocalDate
-import kotlinx.datetime.daysUntil
 
 private val offsetMapping = object : OffsetMapping {
     override fun originalToTransformed(offset: Int): Int =
@@ -34,10 +32,7 @@ class DateField(value: String) {
     fun isValid(): Boolean =
         getLocalDate() != null
 
-    fun getRelativeDays(): Int? =
-        getLocalDate()?.daysUntil(currentDate())
-
-    private fun getLocalDate(): LocalDate? {
+    fun getLocalDate(): LocalDate? {
         if (value.length == 8) {
             try {
                 return LocalDate(year.toInt(), month.toInt(), day.toInt())

+ 39 - 11
app/src/main/java/com/sirekanian/spacetime/ui/ImagePageContent.kt

@@ -1,6 +1,7 @@
 package com.sirekanian.spacetime.ui
 
 import androidx.activity.compose.BackHandler
+import androidx.compose.animation.animateContentSize
 import androidx.compose.animation.core.animateFloatAsState
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.combinedClickable
@@ -25,9 +26,13 @@ import com.sirekanian.spacetime.D
 import com.sirekanian.spacetime.R
 import com.sirekanian.spacetime.ext.DefaultAnimatedVisibility
 import com.sirekanian.spacetime.ext.VectorIconButton
+import com.sirekanian.spacetime.ext.currentDate
 import com.sirekanian.spacetime.model.EditablePage
 import com.sirekanian.spacetime.model.EditablePage.Autofocus
 import com.sirekanian.spacetime.model.ImagePage
+import kotlinx.datetime.daysUntil
+import kotlinx.datetime.periodUntil
+import kotlin.math.abs
 
 @Composable
 fun ImagePageContent(
@@ -107,22 +112,45 @@ fun ImagePageContent(
                 overflow = TextOverflow.Ellipsis,
                 maxLines = 2,
             )
-            DateField(page.date).getRelativeDays()?.let { days ->
+            var isDefaultDateFormat by remember { mutableStateOf(true) }
+            DateField(page.date).getLocalDate()?.let { date ->
+                val current = remember { currentDate() }
                 Text(
-                    text = @OptIn(ExperimentalComposeUiApi::class) when {
-                        days == 0 -> stringResource(R.string.duration_today)
-                        days == -1 -> stringResource(R.string.duration_tomorrow)
-                        days == 1 -> stringResource(R.string.duration_yesterday)
-                        days < 0 -> pluralStringResource(R.plurals.duration_in_days, -days, -days)
-                        else -> pluralStringResource(R.plurals.duration_days, days, days)
+                    text = @OptIn(ExperimentalComposeUiApi::class) if (isDefaultDateFormat) {
+                        val days = date.daysUntil(current)
+                        when {
+                            days == 0 -> stringResource(R.string.duration_today)
+                            days == -1 -> stringResource(R.string.duration_tomorrow)
+                            days == 1 -> stringResource(R.string.duration_yesterday)
+                            days < 0 -> pluralStringResource(R.plurals.duration_in_days, -days, -days)
+                            else -> pluralStringResource(R.plurals.duration_days, days, days)
+                        }
+                    } else {
+                        val period = date.periodUntil(current)
+                        @Suppress("SimplifiableCallChain")
+                        listOf(
+                            R.plurals.duration_years to period.years,
+                            R.plurals.duration_months to period.months,
+                            R.plurals.duration_days to period.days,
+                        )
+                            .filter { (_, value) -> value != 0 }
+                            .ifEmpty { listOf(R.plurals.duration_days to period.days) }
+                            .map { (id, value) -> pluralStringResource(id, abs(value), abs(value)) }
+                            .joinToString(" ", if (date > current) "in " else "")
                     },
                     modifier = @OptIn(ExperimentalFoundationApi::class) Modifier
                         .fillMaxWidth()
                         .clip(MaterialTheme.shapes.small)
-                        .combinedClickable(onLongClick = {
-                            onEdit(EditablePage(page, Autofocus.DATE))
-                            haptic.performHapticFeedback(HapticFeedbackType.LongPress)
-                        }) {}
+                        .animateContentSize()
+                        .combinedClickable(
+                            onClick = {
+                                isDefaultDateFormat = !isDefaultDateFormat
+                            },
+                            onLongClick = {
+                                onEdit(EditablePage(page, Autofocus.DATE))
+                                haptic.performHapticFeedback(HapticFeedbackType.LongPress)
+                            },
+                        )
                         .padding(16.dp),
                     style = textStyle,
                 )

+ 12 - 4
app/src/main/res/values/strings.xml

@@ -10,15 +10,23 @@
         <item>2021-01-17</item>
         <item>2015-02-27</item>
     </string-array>
+    <plurals name="duration_years" translatable="false"><!-- TODO: localization -->
+        <item quantity="one">%d year</item>
+        <item quantity="other">%d years</item>
+    </plurals>
+    <plurals name="duration_months" translatable="false"><!-- TODO: localization -->
+        <item quantity="one">%d month</item>
+        <item quantity="other">%d months</item>
+    </plurals>
     <plurals name="duration_days">
-        <item quantity="one">%d day</item>
-        <item quantity="other">%d days</item>
+        <item quantity="one">%d day</item>
+        <item quantity="other">%d days</item>
     </plurals>
     <string name="duration_yesterday">yesterday</string>
     <string name="duration_today">today</string>
     <string name="duration_tomorrow">tomorrow</string>
     <plurals name="duration_in_days">
-        <item quantity="one">in %d day</item>
-        <item quantity="other">in %d days</item>
+        <item quantity="one">in %d day</item>
+        <item quantity="other">in %d days</item>
     </plurals>
 </resources>