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