Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -38,5 +39,8 @@ fun AppNavHost(navController: NavHostController) {
composable("FilteredListScreen") {
FilteredListScreen(navController)
}
composable("DateFormatterScreen") {
DateFormatterScreen(navController)
}
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
}
9 changes: 9 additions & 0 deletions app/src/main/res/values-ko/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<string name="setting_locale">언어 설정하기</string>
<string name="setting_access_permission">알림 접근 권한 변경하기</string>
<string name="setting_send_permission">알림 발송 권한 변경하기</string>
<string name="setting_date_format">시간 형식 변경하기</string>"

<!-- 허용창 UI -->
<string name="permission_ok">확인</string>
Expand All @@ -42,4 +43,12 @@
<string name="time_month">%1$d달 전</string>
<string name="time_year">%1$d년 전</string>

<!-- 시간 설정창 UI -->
<string name="format_relative_time">상대 시간</string>
<string name="format_relative_example">5분 전</string>
<string name="format_absolute_time">절대 시간</string>
<string name="format_absolute_example">2025년 3월 21일 15시 31분</string>
<string name="format_example_explanation">아래와 같이 나타납니다.</string>
<string name="format_apply">적용하기</string>"

</resources>
9 changes: 8 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<string name="setting_locale">Change Language Settings</string>
<string name="setting_access_permission">Change Notification Access Permission</string>
<string name="setting_send_permission">Change Notification Send Permission</string>

<string name="setting_date_format">Change Date Format</string>"

<!-- 허용창 UI -->
<string name="permission_ok">OK</string>
Expand All @@ -43,4 +43,11 @@
<string name="time_month">%1$d months ago</string>
<string name="time_year">%1$d years ago</string>

<string name="format_relative_time">Relative Time</string>
<string name="format_relative_example">5 minutes ago</string>
<string name="format_absolute_time">Absolute Time</string>
<string name="format_absolute_example">March 21, 2025, 3:31 PM</string>
<string name="format_example_explanation">It will be displayed like this.</string>
<string name="format_apply">Apply</string>

</resources>
Loading