From 8aa9edf2e183cb974911383bfae45ae3673af73d Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sun, 7 Dec 2025 21:54:05 +0700 Subject: [PATCH] feat: Add Chinese calendar to smartspace --- lawnchair/res/values/strings.xml | 2 +- .../lawnchair/smartspace/IcuDateTextView.kt | 27 +++++++++++++++++++ .../smartspace/model/SmartspaceCalendar.kt | 7 ++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index bad6185574..273d1676ee 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -410,7 +410,7 @@ Gregorian Persian - Buddhist + Chinese %1$s, %2$s EEEMMMd diff --git a/lawnchair/src/app/lawnchair/smartspace/IcuDateTextView.kt b/lawnchair/src/app/lawnchair/smartspace/IcuDateTextView.kt index 724f2fb396..3b3717ce3d 100644 --- a/lawnchair/src/app/lawnchair/smartspace/IcuDateTextView.kt +++ b/lawnchair/src/app/lawnchair/smartspace/IcuDateTextView.kt @@ -93,12 +93,39 @@ class IcuDateTextView @JvmOverloads constructor( } val formatter = when (calendar) { SmartspaceCalendar.Persian -> createPersianFormatter() + SmartspaceCalendar.Chinese -> createChineseLunarFormatter() else -> createGregorianFormatter() } formatterFunction = formatter return formatter } + private fun createChineseLunarFormatter(): FormatterFunction { + var format: String + if (dateTimeOptions.showTime) { + format = context.getString( + when { + dateTimeOptions.timeFormat is SmartspaceTimeFormat.TwelveHourFormat -> R.string.smartspace_icu_date_pattern_gregorian_time_12h + dateTimeOptions.timeFormat is SmartspaceTimeFormat.TwentyFourHourFormat -> R.string.smartspace_icu_date_pattern_gregorian_time + is24HourFormat(context) -> R.string.smartspace_icu_date_pattern_gregorian_time + else -> R.string.smartspace_icu_date_pattern_gregorian_time_12h + }, + ) + if (dateTimeOptions.showDate) format += context.getString(R.string.smartspace_icu_date_pattern_gregorian_date) + } else { + format = context.getString(R.string.smartspace_icu_date_pattern_gregorian_wday_month_day_no_year) + } + + val chineseLocale = Locale.Builder() + .setLocale(Locale.CHINESE) + .setUnicodeLocaleKeyword("ca", "chinese") + .build() + + val formatter = DateFormat.getInstanceForSkeleton(format, chineseLocale) + formatter.setContext(DisplayContext.CAPITALIZATION_FOR_STANDALONE) + return { formatter.format(it) } + } + private fun createPersianFormatter(): FormatterFunction { var format: String if (dateTimeOptions.showTime) { diff --git a/lawnchair/src/app/lawnchair/smartspace/model/SmartspaceCalendar.kt b/lawnchair/src/app/lawnchair/smartspace/model/SmartspaceCalendar.kt index e10e873b1a..7a93b89284 100644 --- a/lawnchair/src/app/lawnchair/smartspace/model/SmartspaceCalendar.kt +++ b/lawnchair/src/app/lawnchair/smartspace/model/SmartspaceCalendar.kt @@ -14,13 +14,14 @@ sealed class SmartspaceCalendar(@StringRes val nameResourceId: Int, val formatCu fun fromString(value: String): SmartspaceCalendar = when (value) { "persian" -> Persian + "chinese" -> Chinese else -> Gregorian } /** * @return The list of all calendars. */ - fun values() = listOf(Gregorian, Persian) + fun values() = listOf(Gregorian, Persian, Chinese) } object Gregorian : SmartspaceCalendar(nameResourceId = R.string.smartspace_calendar_gregorian) { @@ -30,4 +31,8 @@ sealed class SmartspaceCalendar(@StringRes val nameResourceId: Int, val formatCu // Officially known as Solar Hijri override fun toString() = "persian" } + + object Chinese : SmartspaceCalendar(nameResourceId = R.string.smartspace_calendar_chinese) { + override fun toString() = "chinese" + } }