Skip to content

Commit

Permalink
chore: Better split logic for reusability
Browse files Browse the repository at this point in the history
  • Loading branch information
LunarX committed Feb 17, 2025
1 parent e18b35f commit ea5f8ad
Showing 1 changed file with 23 additions and 20 deletions.
43 changes: 23 additions & 20 deletions app/src/main/java/com/infomaniak/mail/ui/main/folder/DateDisplay.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import android.text.format.DateUtils
import androidx.annotation.DrawableRes
import com.infomaniak.lib.core.utils.*
import com.infomaniak.mail.R
import com.infomaniak.mail.data.models.thread.Thread.Companion.FORMAT_DAY_OF_THE_WEEK
import com.infomaniak.mail.utils.extensions.isSmallerThanDays
import com.infomaniak.mail.utils.extensions.toDate
import io.realm.kotlin.types.RealmInstant
Expand All @@ -37,36 +38,38 @@ sealed interface DateDisplay {

data object Default : DateDisplay {
override val icon: Int? = null
override fun formatDate(date: RealmInstant, context: Context): String = with(date.toDate()) {
when {
isInTheFuture() -> formatNumericalDayMonthYear()
isToday() -> format(FORMAT_DATE_HOUR_MINUTE)
isYesterday() -> context.getString(com.infomaniak.mail.R.string.messageDetailsYesterday)
isSmallerThanDays(6) -> format(com.infomaniak.mail.data.models.thread.Thread.FORMAT_DAY_OF_THE_WEEK)
isThisYear() -> format(FORMAT_DATE_SHORT_DAY_ONE_CHAR)
else -> formatNumericalDayMonthYear()
}
}

private fun Date.formatNumericalDayMonthYear(): String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
formatWithLocal(FormatData.DATE, FormatStyle.SHORT)
} else {
format(FORMAT_DATE_CLEAR_MONTH_DAY_ONE_CHAR) // Fallback on unambiguous date format for any local
}
}
override fun formatDate(date: RealmInstant, context: Context): String = formatPastDate(context, date)
}

data object Scheduled : DateDisplay {
override val icon: Int = R.drawable.ic_scheduled_messages
override fun formatDate(date: RealmInstant, context: Context): String = relativeFutureDate(context, date)
override fun formatDate(date: RealmInstant, context: Context): String = formatRelativeFutureDate(context, date)
}
}

private fun relativeFutureDate(context: Context, date: RealmInstant) = DateUtils.getRelativeDateTimeString(
private fun formatRelativeFutureDate(context: Context, date: RealmInstant) = DateUtils.getRelativeDateTimeString(
context,
date.epochSeconds * 1000,
DateUtils.DAY_IN_MILLIS,
DateUtils.WEEK_IN_MILLIS,
DateUtils.FORMAT_SHOW_YEAR or DateUtils.FORMAT_ABBREV_MONTH,
)!!.toString()

private fun formatPastDate(context: Context, date: RealmInstant) = with(date.toDate()) {
when {
isInTheFuture() -> formatNumericalDayMonthYear()
isToday() -> format(FORMAT_DATE_HOUR_MINUTE)
isYesterday() -> context.getString(R.string.messageDetailsYesterday)
isSmallerThanDays(6) -> format(FORMAT_DAY_OF_THE_WEEK)
isThisYear() -> format(FORMAT_DATE_SHORT_DAY_ONE_CHAR)
else -> formatNumericalDayMonthYear()
}
}

private fun Date.formatNumericalDayMonthYear(): String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
formatWithLocal(FormatData.DATE, FormatStyle.SHORT)
} else {
format(FORMAT_DATE_CLEAR_MONTH_DAY_ONE_CHAR) // Fallback on unambiguous date format for any local
}
}

0 comments on commit ea5f8ad

Please sign in to comment.