From 53ceff5cb17f1f3c28d7006c33623bc13befb489 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 14 Aug 2025 22:48:03 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[REFACTOR/#321]=20=EC=A0=90=EA=B2=80=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20string=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C=EC=9D=84=20=ED=86=B5=ED=95=9C=20=EA=B5=AD?= =?UTF-8?q?=EC=A0=9C=ED=99=94=EB=A5=BC=20=EC=A7=84=ED=96=89=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/component/dialog/InspectionDialog.kt | 9 +++++---- app/src/main/res/values-ko/strings.xml | 4 ++++ app/src/main/res/values/strings.xml | 4 ++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/component/dialog/InspectionDialog.kt b/app/src/main/java/com/sopt/clody/presentation/ui/component/dialog/InspectionDialog.kt index fb885bf5..5b94a2f6 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/component/dialog/InspectionDialog.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/component/dialog/InspectionDialog.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog @@ -63,14 +64,14 @@ fun InspectionDialog( ) Spacer(modifier = Modifier.height(20.dp)) Text( - text = "보다 안정적인 클로디 서비스를 위해\n시스템 점검 중이에요. 곧 다시 만나요!", + text = stringResource(R.string.dialog_inspection_title), color = ClodyTheme.colors.gray03, textAlign = TextAlign.Center, style = ClodyTheme.typography.body3Medium, ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "점검시간 : $inspectionTime", + text = stringResource(R.string.dialog_inspection_description, inspectionTime), color = ClodyTheme.colors.gray04, textAlign = TextAlign.Center, style = ClodyTheme.typography.body3Medium, @@ -84,7 +85,7 @@ fun InspectionDialog( colors = ButtonDefaults.buttonColors(ClodyTheme.colors.mainYellow), ) { Text( - text = "확인", + text = stringResource(R.string.dialog_inspection_confirm), color = ClodyTheme.colors.gray02, style = ClodyTheme.typography.body3SemiBold, ) @@ -100,7 +101,7 @@ fun InspectionDialog( private fun PreviewInspectionDialog() { BasePreview { InspectionDialog( - inspectionTime = "", + inspectionTime = "Dec 14 (Wed) 12:00 PM ~ Mar 15 (Wed) 10:00 PM", onDismiss = {}, ) } diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 913d128c..b36cb2b7 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -159,6 +159,10 @@ 탈퇴할래요 아니요 + 보다 안정적인 클로디 서비스를 위해\n시스템 점검 중이에요. 곧 다시 만나요! + 점검시간 : %1$s + 확인 + 이어쓰기 알림 설정을 완료했어요. 최대 5개까지 작성할 수 있어요. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5db7f1b3..dbfce628 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -160,6 +160,10 @@ Withdraw Cancel + We\'re conducting system maintenance\nto improve your experience on Clody.\nSee you again soon! + [Maintenance Time]\n%1$s + OK + Continue writing reminders are now on! Field required to send. From b6c5e3904c80a877d3187c3d9e8cbc4d3790e762 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 14 Aug 2025 22:48:50 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[REFACTOR/#321]=20=EC=A0=90=EA=B2=80=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=EC=8B=9C=EA=B0=84/=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=84=20"2025-08-11T18:00:00"=20=ED=98=95?= =?UTF-8?q?=ED=83=9C=20=EA=B7=B8=EB=8C=80=EB=A1=9C=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/appupdate/AppUpdateCheckerImpl.kt | 19 ++++--------------- .../domain/appupdate/AppUpdateChecker.kt | 2 +- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt b/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt index d41f2a0b..eb71132e 100644 --- a/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt +++ b/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt @@ -5,8 +5,6 @@ import com.sopt.clody.domain.appupdate.AppUpdateChecker import com.sopt.clody.domain.model.AppUpdateState import com.sopt.clody.domain.util.VersionComparator import java.time.LocalDateTime -import java.time.format.TextStyle -import java.util.Locale import javax.inject.Inject class AppUpdateCheckerImpl @Inject constructor( @@ -41,22 +39,13 @@ class AppUpdateCheckerImpl @Inject constructor( return now.isAfter(start) && now.isBefore(end) } - override fun getInspectionTimeText(): String? { + override suspend fun getInspectionTimeText(): Pair? { val start = remoteConfigDataSource.getInspectionStart() val end = remoteConfigDataSource.getInspectionEnd() if (start == null || end == null) return null - val startText = formatDateTimeWithDayOfWeek(start) - val endText = formatDateTimeWithDayOfWeek(end) - return "$startText ~ $endText" - } - - private fun formatDateTimeWithDayOfWeek(dateTime: LocalDateTime): String { - val dayOfWeek = dateTime.dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.KOREAN) - val month = dateTime.monthValue - val day = dateTime.dayOfMonth - val hour = dateTime.hour.toString().padStart(2, '0') - - return "$month/$day($dayOfWeek) ${hour}시" + val startText = start.toString() + val endText = end.toString() + return startText to endText } } diff --git a/app/src/main/java/com/sopt/clody/domain/appupdate/AppUpdateChecker.kt b/app/src/main/java/com/sopt/clody/domain/appupdate/AppUpdateChecker.kt index de3f683f..2d2c25d9 100644 --- a/app/src/main/java/com/sopt/clody/domain/appupdate/AppUpdateChecker.kt +++ b/app/src/main/java/com/sopt/clody/domain/appupdate/AppUpdateChecker.kt @@ -5,5 +5,5 @@ import com.sopt.clody.domain.model.AppUpdateState interface AppUpdateChecker { suspend fun getAppUpdateState(currentVersion: String): AppUpdateState suspend fun isUnderInspection(): Boolean - fun getInspectionTimeText(): String? + suspend fun getInspectionTimeText(): Pair? } From 138c5baddf881fb4ec44050601bdc3ec7b955143 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 14 Aug 2025 22:49:24 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[REFACTOR/#321]=20=EC=96=B8=EC=96=B4?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EB=8A=94=20=EC=A0=90=EA=B2=80=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=ED=8F=AC=EB=A7=B7=EC=9D=84=20=EC=A0=9C=EA=B3=B5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=EB=A5=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/language/LanguageProvider.kt | 1 + .../utils/language/LanguageProviderImpl.kt | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProvider.kt b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProvider.kt index 57a7889a..1f3fc771 100644 --- a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProvider.kt +++ b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProvider.kt @@ -5,6 +5,7 @@ import com.sopt.clody.presentation.ui.setting.screen.SettingOptionUrls interface LanguageProvider { fun getCurrentLanguageTag(): String + fun getInspectionTimeText(start: String, end: String): String? fun getLoginType(): OAuthProvider fun getNicknameMaxLength(): Int fun getDiaryMaxLength(): Int diff --git a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt index 933ecc97..d1a8410b 100644 --- a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt +++ b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt @@ -2,6 +2,8 @@ package com.sopt.clody.presentation.utils.language import com.sopt.clody.data.datastore.OAuthProvider import com.sopt.clody.presentation.ui.setting.screen.SettingOptionUrls +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter import java.util.Locale import javax.inject.Inject @@ -13,6 +15,25 @@ class LanguageProviderImpl @Inject constructor() : LanguageProvider { override fun getCurrentLanguageTag(): String = locale.toLanguageTag() // e.g., "ko-KR" or "en-US" + override fun getInspectionTimeText(start: String, end: String): String? { + return runCatching { + val startLdt = LocalDateTime.parse(start, DateTimeFormatter.ISO_LOCAL_DATE_TIME) + val endLdt = LocalDateTime.parse(end, DateTimeFormatter.ISO_LOCAL_DATE_TIME) + + if (isKorean()) { + val koPattern = DateTimeFormatter.ofPattern("M/d(E) HH시mm분", Locale.KOREAN) + "${startLdt.format(koPattern)} ~ ${endLdt.format(koPattern)}" + } else { + val enDatePattern = DateTimeFormatter.ofPattern("MMM d (EEE)", Locale.ENGLISH) + val enTimePattern = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH) + + val left = "${startLdt.format(enDatePattern)}, ${startLdt.format(enTimePattern)}" + val right = "${endLdt.format(enDatePattern)} ${endLdt.format(enTimePattern)}" + "$left ~ $right" + } + }.getOrNull() + } + override fun getLoginType(): OAuthProvider = if (isKorean()) OAuthProvider.KAKAO else OAuthProvider.GOOGLE From 2a0c8e819ad3edaedc45b68bf57b76834fb7be22 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 14 Aug 2025 22:49:40 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[REFACTOR/#321]=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=9D=84=20=EC=A0=81=EC=9A=A9=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/clody/presentation/ui/splash/SplashViewModel.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/splash/SplashViewModel.kt b/app/src/main/java/com/sopt/clody/presentation/ui/splash/SplashViewModel.kt index db366f59..1b302dc3 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/splash/SplashViewModel.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/splash/SplashViewModel.kt @@ -10,6 +10,7 @@ import com.sopt.clody.domain.model.AppUpdateState import com.sopt.clody.domain.repository.TokenRepository import com.sopt.clody.presentation.utils.amplitude.AmplitudeConstraints import com.sopt.clody.presentation.utils.amplitude.AmplitudeUtils +import com.sopt.clody.presentation.utils.language.LanguageProvider import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -25,6 +26,7 @@ class SplashViewModel @AssistedInject constructor( @Assisted initialState: SplashContract.SplashState, private val tokenRepository: TokenRepository, private val appUpdateChecker: AppUpdateChecker, + private val languageProvider: LanguageProvider, ) : MavericksViewModel(initialState) { private val _intents = Channel(BUFFERED) @@ -64,7 +66,10 @@ class SplashViewModel @AssistedInject constructor( private suspend fun checkInspectionAndHandle(): Boolean { if (appUpdateChecker.isUnderInspection()) { - val inspectionText = appUpdateChecker.getInspectionTimeText() + val inspectionTextRaw = appUpdateChecker.getInspectionTimeText() + val inspectionText = inspectionTextRaw?.let { (start, end) -> + languageProvider.getInspectionTimeText(start, end) + } setState { copy( showInspectionDialog = true, From 3b59e195c1f5630b0c8a4dd3b21e620c253cafad Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Fri, 15 Aug 2025 12:10:06 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[REFACTOR/#321]=20=EC=A0=90=EA=B2=80?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=84=20=EC=9C=A0=EC=A0=80=EC=9D=98=20?= =?UTF-8?q?=ED=83=80=EC=9E=84=EC=A1=B4=EC=97=90=20=EB=A7=9E=EC=B6=B0=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=ED=95=9C=20=ED=9B=84=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A4=84=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/appupdate/AppUpdateCheckerImpl.kt | 22 ++++++++++--------- .../utils/language/LanguageProviderImpl.kt | 14 ++++++++---- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt b/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt index eb71132e..c7ab9af5 100644 --- a/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt +++ b/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt @@ -4,7 +4,8 @@ import com.sopt.clody.data.remote.datasource.RemoteConfigDataSource import com.sopt.clody.domain.appupdate.AppUpdateChecker import com.sopt.clody.domain.model.AppUpdateState import com.sopt.clody.domain.util.VersionComparator -import java.time.LocalDateTime +import java.time.ZoneId +import java.time.ZonedDateTime import javax.inject.Inject class AppUpdateCheckerImpl @Inject constructor( @@ -35,17 +36,18 @@ class AppUpdateCheckerImpl @Inject constructor( override suspend fun isUnderInspection(): Boolean { val start = remoteConfigDataSource.getInspectionStart() ?: return false val end = remoteConfigDataSource.getInspectionEnd() ?: return false - val now = LocalDateTime.now() - return now.isAfter(start) && now.isBefore(end) + val serverZone = ZoneId.of("Asia/Seoul") + + val nowServer = ZonedDateTime.now(serverZone) + val startZ = start.atZone(serverZone) + val endZ = end.atZone(serverZone) + + return nowServer.isAfter(startZ) && nowServer.isBefore(endZ) } override suspend fun getInspectionTimeText(): Pair? { - val start = remoteConfigDataSource.getInspectionStart() - val end = remoteConfigDataSource.getInspectionEnd() - if (start == null || end == null) return null - - val startText = start.toString() - val endText = end.toString() - return startText to endText + val start = remoteConfigDataSource.getInspectionStart() ?: return null + val end = remoteConfigDataSource.getInspectionEnd() ?: return null + return start.toString() to end.toString() } } diff --git a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt index d1a8410b..0f8b3705 100644 --- a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt +++ b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt @@ -3,6 +3,7 @@ package com.sopt.clody.presentation.utils.language import com.sopt.clody.data.datastore.OAuthProvider import com.sopt.clody.presentation.ui.setting.screen.SettingOptionUrls import java.time.LocalDateTime +import java.time.ZoneId import java.time.format.DateTimeFormatter import java.util.Locale import javax.inject.Inject @@ -20,15 +21,20 @@ class LanguageProviderImpl @Inject constructor() : LanguageProvider { val startLdt = LocalDateTime.parse(start, DateTimeFormatter.ISO_LOCAL_DATE_TIME) val endLdt = LocalDateTime.parse(end, DateTimeFormatter.ISO_LOCAL_DATE_TIME) + val serverZone = ZoneId.of("Asia/Seoul") + val userZone = ZoneId.systemDefault() + + val startUser = startLdt.atZone(serverZone).withZoneSameInstant(userZone) + val endUser = endLdt.atZone(serverZone).withZoneSameInstant(userZone) + if (isKorean()) { val koPattern = DateTimeFormatter.ofPattern("M/d(E) HH시mm분", Locale.KOREAN) - "${startLdt.format(koPattern)} ~ ${endLdt.format(koPattern)}" + "${startUser.format(koPattern)} ~ ${endUser.format(koPattern)}" } else { val enDatePattern = DateTimeFormatter.ofPattern("MMM d (EEE)", Locale.ENGLISH) val enTimePattern = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH) - - val left = "${startLdt.format(enDatePattern)}, ${startLdt.format(enTimePattern)}" - val right = "${endLdt.format(enDatePattern)} ${endLdt.format(enTimePattern)}" + val left = "${startUser.format(enDatePattern)}, ${startUser.format(enTimePattern)}" + val right = "${endUser.format(enDatePattern)} ${endUser.format(enTimePattern)}" "$left ~ $right" } }.getOrNull() From 7194bfd11f733ca15fdd952d3b3d2a3a85db15ee Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Fri, 15 Aug 2025 16:37:33 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[CHORE/#321]=20=EC=98=81=EC=96=B4=EB=B2=84?= =?UTF-8?q?=EC=A0=84=EB=8F=84=2024=EC=8B=9C=EA=B0=84=20=ED=98=95=EC=8B=9D?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=86=B5=EC=9D=BC=ED=95=A9=EB=8B=88?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clody/presentation/utils/language/LanguageProviderImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt index 0f8b3705..8363220b 100644 --- a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt +++ b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt @@ -32,7 +32,7 @@ class LanguageProviderImpl @Inject constructor() : LanguageProvider { "${startUser.format(koPattern)} ~ ${endUser.format(koPattern)}" } else { val enDatePattern = DateTimeFormatter.ofPattern("MMM d (EEE)", Locale.ENGLISH) - val enTimePattern = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH) + val enTimePattern = DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH) val left = "${startUser.format(enDatePattern)}, ${startUser.format(enTimePattern)}" val right = "${endUser.format(enDatePattern)} ${endUser.format(enTimePattern)}" "$left ~ $right" From 8581b98915bedfc70c814851710e7da2a93d8c56 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Tue, 26 Aug 2025 09:30:55 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[CHORE/#321]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=9D=84=20=EB=B0=98=EC=98=81=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.=20-=20isUnderInspection=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EC=97=90=EC=84=9C=20=EC=A0=90=EA=B2=80=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EA=B2=80=EC=82=AC=EB=A5=BC=20=EC=B4=88=EA=B3=BC/?= =?UTF-8?q?=EB=AF=B8=EB=A7=8C=EC=97=90=EC=84=9C=20=EC=9D=B4=EC=83=81/?= =?UTF-8?q?=EC=9D=B4=ED=95=98=EB=A1=9C=20=EA=B0=9C=EC=84=A0=20+=20companio?= =?UTF-8?q?n=20object=20=EB=B6=84=EB=A6=AC=20-=20getInspectionTimeText=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EC=97=90=EC=84=9C=20=EB=8B=A8=EC=9D=BC=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=20=EC=9B=90=EC=B9=99=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=ED=8F=AC=EB=A7=B7=ED=8C=85=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20+=20companion=20object=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/appupdate/AppUpdateCheckerImpl.kt | 18 ++++++- .../utils/language/LanguageProviderImpl.kt | 50 +++++++++++-------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt b/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt index c7ab9af5..987fd7f1 100644 --- a/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt +++ b/app/src/main/java/com/sopt/clody/data/remote/appupdate/AppUpdateCheckerImpl.kt @@ -33,21 +33,35 @@ class AppUpdateCheckerImpl @Inject constructor( } } + /** + * Firebase RemoteConfig 로부터 점검 시간에 해당 하는지 검사하는 함수. + * + * @return 점검 시간 해당 여부 + * */ override suspend fun isUnderInspection(): Boolean { val start = remoteConfigDataSource.getInspectionStart() ?: return false val end = remoteConfigDataSource.getInspectionEnd() ?: return false - val serverZone = ZoneId.of("Asia/Seoul") + val serverZone = ZoneId.of(SERVER_TIMEZONE) val nowServer = ZonedDateTime.now(serverZone) val startZ = start.atZone(serverZone) val endZ = end.atZone(serverZone) - return nowServer.isAfter(startZ) && nowServer.isBefore(endZ) + return nowServer in startZ..endZ } + /** + * Firebase RemoteConfig 로부터 점검 시간을 가져와 반환하는 함수. + * + * @return 점검 시작 시간과 종료 시간을 "2025-08-11T18:00:00" 형식으로 반환 + * */ override suspend fun getInspectionTimeText(): Pair? { val start = remoteConfigDataSource.getInspectionStart() ?: return null val end = remoteConfigDataSource.getInspectionEnd() ?: return null return start.toString() to end.toString() } + + companion object { + private const val SERVER_TIMEZONE = "Asia/Seoul" + } } diff --git a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt index 8363220b..5abea87b 100644 --- a/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt +++ b/app/src/main/java/com/sopt/clody/presentation/utils/language/LanguageProviderImpl.kt @@ -4,6 +4,7 @@ import com.sopt.clody.data.datastore.OAuthProvider import com.sopt.clody.presentation.ui.setting.screen.SettingOptionUrls import java.time.LocalDateTime import java.time.ZoneId +import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import java.util.Locale import javax.inject.Inject @@ -18,28 +19,29 @@ class LanguageProviderImpl @Inject constructor() : LanguageProvider { override fun getInspectionTimeText(start: String, end: String): String? { return runCatching { - val startLdt = LocalDateTime.parse(start, DateTimeFormatter.ISO_LOCAL_DATE_TIME) - val endLdt = LocalDateTime.parse(end, DateTimeFormatter.ISO_LOCAL_DATE_TIME) - - val serverZone = ZoneId.of("Asia/Seoul") + val serverZone = ZoneId.of(SERVER_TIMEZONE) val userZone = ZoneId.systemDefault() - val startUser = startLdt.atZone(serverZone).withZoneSameInstant(userZone) - val endUser = endLdt.atZone(serverZone).withZoneSameInstant(userZone) - - if (isKorean()) { - val koPattern = DateTimeFormatter.ofPattern("M/d(E) HH시mm분", Locale.KOREAN) - "${startUser.format(koPattern)} ~ ${endUser.format(koPattern)}" - } else { - val enDatePattern = DateTimeFormatter.ofPattern("MMM d (EEE)", Locale.ENGLISH) - val enTimePattern = DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH) - val left = "${startUser.format(enDatePattern)}, ${startUser.format(enTimePattern)}" - val right = "${endUser.format(enDatePattern)} ${endUser.format(enTimePattern)}" - "$left ~ $right" - } + val startUser = LocalDateTime.parse(start).atZone(serverZone).withZoneSameInstant(userZone) + val endUser = LocalDateTime.parse(end).atZone(serverZone).withZoneSameInstant(userZone) + + formatInspectionTime(startUser, endUser) }.getOrNull() } + private fun formatInspectionTime(startUser: ZonedDateTime, endUser: ZonedDateTime): String { + return if (isKorean()) { + val koPattern = DateTimeFormatter.ofPattern(INSPECTION_TIME_FORMAT_KO, Locale.KOREAN) + "${startUser.format(koPattern)} ~ ${endUser.format(koPattern)}" + } else { + val enDateFormatter = DateTimeFormatter.ofPattern(INSPECTION_DATE_FORMAT_EN, Locale.ENGLISH) + val enTimeFormatter = DateTimeFormatter.ofPattern(INSPECTION_TIME_FORMAT_EN, Locale.ENGLISH) + val left = "${startUser.format(enDateFormatter)}, ${startUser.format(enTimeFormatter)}" + val right = "${endUser.format(enDateFormatter)} ${endUser.format(enTimeFormatter)}" + "$left ~ $right" + } + } + override fun getLoginType(): OAuthProvider = if (isKorean()) OAuthProvider.KAKAO else OAuthProvider.GOOGLE @@ -53,10 +55,14 @@ class LanguageProviderImpl @Inject constructor() : LanguageProvider { if (isKorean()) option.koUrl else option.enUrl companion object { - const val LANGUAGE_KO = "ko" - const val NICKNAME_MAX_LENGTH_EN = 15 - const val NICKNAME_MAX_LENGTH_KO = 10 - const val DIARY_MAX_LENGTH_EN = 100 - const val DIARY_MAX_LENGTH_KO = 50 + private const val LANGUAGE_KO = "ko" + private const val SERVER_TIMEZONE = "Asia/Seoul" + private const val INSPECTION_TIME_FORMAT_KO = "M/d(E) HH시mm분" + private const val INSPECTION_DATE_FORMAT_EN = "MMM d (EEE)" + private const val INSPECTION_TIME_FORMAT_EN = "HH:mm" + private const val NICKNAME_MAX_LENGTH_EN = 15 + private const val NICKNAME_MAX_LENGTH_KO = 10 + private const val DIARY_MAX_LENGTH_EN = 100 + private const val DIARY_MAX_LENGTH_KO = 50 } }