From 320930862544a115e6e3745eb9d858772d9d1346 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Fri, 7 Mar 2025 14:14:04 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=8B=9C=EA=B0=84=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=9C=A0=ED=8B=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sharedPreference에서 현재 시간 설정을 가져와 적용하도록 변경 --- .../common/objects/DateFormatter.kt | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/common/objects/DateFormatter.kt b/app/src/main/java/com/example/notimanager/common/objects/DateFormatter.kt index ab5dc33..e08d286 100644 --- a/app/src/main/java/com/example/notimanager/common/objects/DateFormatter.kt +++ b/app/src/main/java/com/example/notimanager/common/objects/DateFormatter.kt @@ -3,14 +3,18 @@ package com.example.notimanager.common.objects import android.content.Context import android.graphics.Bitmap import android.graphics.drawable.Drawable -import android.icu.text.SimpleDateFormat import com.example.notimanager.R -import java.util.Date +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter import java.util.Locale import java.util.concurrent.TimeUnit object DateFormatter { - fun formatTimestamp(context: Context, timestamp: Long, format: String = "relative"): String { + fun formatTimestamp(context: Context, timestamp: Long): String { + val sharedPreferences = context.getSharedPreferences("date_format", Context.MODE_PRIVATE) + val format = sharedPreferences.getString("date_format", "relative") ?: "relative" + return if (format == "relative") { val currentTime = System.currentTimeMillis() val timeDifference = currentTime - timestamp @@ -26,8 +30,25 @@ object DateFormatter { else -> context.getString(R.string.time_year, timeDifference / TimeUnit.DAYS.toMillis(365)) } } else { - SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.getDefault()).format(Date(timestamp)) + formatDate(timestamp) + } + } + + private fun formatDate(timestamp: Long): String { + val currentLocale = Locale.getDefault() + + // 로케일에 따라 포맷터 설정 + val formatter: DateTimeFormatter = if (currentLocale.language == "ko") { + DateTimeFormatter.ofPattern("yyyy년 MM월 dd일 HH시 mm분", currentLocale) + } else { + DateTimeFormatter.ofPattern("MMMM dd, yyyy, hh:mm a", currentLocale) } + + // 타임스탬프를 Instant로 변환 + val instant = Instant.ofEpochMilli(timestamp) + + // 포맷터를 사용하여 날짜 포맷팅 + return formatter.withZone(ZoneId.systemDefault()).format(instant) } fun Drawable.toBitmap(): Bitmap { From d02c4a7a6fc745cdf9b3e129fe7a25382a124501 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Fri, 7 Mar 2025 14:14:52 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=EC=84=A4=EC=A0=95=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=20=EC=8B=9C=EA=B0=84=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20=EB=B3=80=EA=B2=BD=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 언제든 사용자가 시간 설정을 상대/절대 중에서 선택할 수 있도록 페이지 구현 필요한 문자열 리소스 추가 --- .../viewmodel/DateFormatterViewModel.kt | 27 ++++++ .../ui/component/DateFormatterView.kt | 88 +++++++++++++++++++ .../presentation/ui/component/SettingView.kt | 9 ++ .../presentation/ui/navigation/AppNavHost.kt | 4 + .../ui/screen/DateFormatterScreen.kt | 20 +++++ app/src/main/res/values-ko/strings.xml | 9 ++ app/src/main/res/values/strings.xml | 9 +- 7 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/DateFormatterViewModel.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/DateFormatterView.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/screen/DateFormatterScreen.kt diff --git a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/DateFormatterViewModel.kt b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/DateFormatterViewModel.kt new file mode 100644 index 0000000..694c42c --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/DateFormatterViewModel.kt @@ -0,0 +1,27 @@ +package com.example.notimanager.presentation.stateholder.viewmodel + +import android.content.Context +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +@HiltViewModel +class DateFormatterViewModel @Inject constructor( + @ApplicationContext private val appContext: Context +) : ViewModel() { + private val prefs = "date_format" + private val sharedPreferences = appContext.getSharedPreferences(prefs, Context.MODE_PRIVATE) + + val relativeTime = "relative" + val absoluteTime = "absolute" + + fun setDateFormat(format: String) { + if (format == relativeTime || format == absoluteTime) + sharedPreferences.edit().putString(prefs, format).apply() + } + + fun getDateFormat(): String { + return sharedPreferences.getString(prefs, relativeTime) ?: relativeTime + } +} diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/DateFormatterView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/DateFormatterView.kt new file mode 100644 index 0000000..bbee2c5 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/DateFormatterView.kt @@ -0,0 +1,88 @@ +package com.example.notimanager.presentation.ui.component + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.example.notimanager.R +import com.example.notimanager.presentation.stateholder.viewmodel.DateFormatterViewModel + +@Composable +fun DateFormatterView( + innerPadding: PaddingValues, + viewModel: DateFormatterViewModel = hiltViewModel() + ){ + // 언어 설정에 따라 문자열 리소스를 가져오기 + val context = LocalContext.current + val relativeTime = context.getString(R.string.format_relative_time) + val absoluteTime = context.getString(R.string.format_absolute_time) + val relativeExample = context.getString(R.string.format_relative_example) + val absoluteExample = context.getString(R.string.format_absolute_example) + val exampleExplanation = context.getString(R.string.format_example_explanation) + val apply = context.getString(R.string.format_apply) + + Column( + modifier = Modifier + .padding(innerPadding) + ) { + var selectedOption by remember { mutableStateOf(viewModel.getDateFormat()) } + + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + .clickable(onClick = { selectedOption = viewModel.relativeTime }) + ) { + RadioButton( + selected = selectedOption == viewModel.relativeTime, + onClick = { selectedOption = viewModel.relativeTime } + ) + Column{ + Text(relativeTime) + Text(relativeExample) + Text(exampleExplanation) + } + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + .clickable(onClick = { selectedOption = viewModel.absoluteTime }) + ) { + RadioButton( + selected = selectedOption == viewModel.absoluteTime, + onClick = { selectedOption = viewModel.absoluteTime } + ) + Column{ + Text(absoluteTime) + Text(absoluteExample) + Text(exampleExplanation) + } + } + Button( + onClick = { viewModel.setDateFormat(selectedOption) }, + modifier = Modifier + .padding(16.dp) + .fillMaxWidth() + ) { + Text(apply) + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/SettingView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/SettingView.kt index 2d3bbbe..d1c8a57 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/SettingView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/SettingView.kt @@ -26,21 +26,30 @@ fun SettingView( val filteredList = context.getString(R.string.setting_filtered_list) val accessPermission = context.getString(R.string.setting_access_permission) val sendPermission = context.getString(R.string.setting_send_permission) + val dateFormatter = context.getString(R.string.setting_date_format) Column( modifier = Modifier .padding(innerPadding) ) { + // 받지 않는 알림 목록 ClickableTextView(filteredList) { navController.navigate("FilteredListScreen") } + // 알림 접근 권한 ClickableTextView(accessPermission) { servicePermissionViewModel.requestServicePermission() } + // 알림 발송 권한 ClickableTextView(sendPermission) { notificationPermissionViewModel.requestPermission(context as Activity) } + + // 시간 형식 변경 + ClickableTextView(dateFormatter) { + navController.navigate("DateFormatterScreen") + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt index 354adf5..81072d2 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt @@ -5,6 +5,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.example.notimanager.common.objects.Encoder.getDecodeString +import com.example.notimanager.presentation.ui.screen.DateFormatterScreen import com.example.notimanager.presentation.ui.screen.FilteredListScreen import com.example.notimanager.presentation.ui.screen.MainScreen import com.example.notimanager.presentation.ui.screen.NotificationScreen @@ -38,5 +39,8 @@ fun AppNavHost(navController: NavHostController) { composable("FilteredListScreen") { FilteredListScreen(navController) } + composable("DateFormatterScreen") { + DateFormatterScreen(navController) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/screen/DateFormatterScreen.kt b/app/src/main/java/com/example/notimanager/presentation/ui/screen/DateFormatterScreen.kt new file mode 100644 index 0000000..bf1f89d --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/DateFormatterScreen.kt @@ -0,0 +1,20 @@ +package com.example.notimanager.presentation.ui.screen + +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.navigation.NavController +import com.example.notimanager.presentation.ui.component.DateFormatterView +import com.example.notimanager.presentation.ui.component.SettingTopAppBar + +@Composable +fun DateFormatterScreen( + navController: NavController, +) { + Scaffold( + topBar = { + SettingTopAppBar{ navController.popBackStack() } + } + ) { innerPadding -> + DateFormatterView(innerPadding) + } +} \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index bd405f7..d9b0734 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -20,6 +20,7 @@ 언어 설정하기 알림 접근 권한 변경하기 알림 발송 권한 변경하기 + 시간 형식 변경하기" 확인 @@ -42,4 +43,12 @@ %1$d달 전 %1$d년 전 + + 상대 시간 + 5분 전 + 절대 시간 + 2025년 3월 21일 15시 31분 + 아래와 같이 나타납니다. + 적용하기" + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b4ae42d..33a5499 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,7 +20,7 @@ Change Language Settings Change Notification Access Permission Change Notification Send Permission - + Change Date Format" OK @@ -43,4 +43,11 @@ %1$d months ago %1$d years ago + Relative Time + 5 minutes ago + Absolute Time + March 21, 2025, 3:31 PM + It will be displayed like this. + Apply + \ No newline at end of file