Skip to content

Commit de85a9c

Browse files
authored
Merge pull request #48 from Richter3766/Feat/issue-#47
Feat/issue #47 - 다국어 지원
2 parents 039ca76 + 2bf1cd5 commit de85a9c

File tree

12 files changed

+195
-50
lines changed

12 files changed

+195
-50
lines changed

app/src/main/java/com/example/notimanager/common/objects/DateFormatter.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
package com.example.notimanager.common.objects
22

3+
import android.content.Context
34
import android.graphics.Bitmap
45
import android.graphics.drawable.Drawable
56
import android.icu.text.SimpleDateFormat
7+
import com.example.notimanager.R
68
import java.util.Date
79
import java.util.Locale
810
import java.util.concurrent.TimeUnit
911

1012
object DateFormatter {
11-
fun formatTimestamp(timestamp: Long, format: String = "relative"): String {
13+
fun formatTimestamp(context: Context, timestamp: Long, format: String = "relative"): String {
1214
return if (format == "relative") {
1315
val currentTime = System.currentTimeMillis()
1416
val timeDifference = currentTime - timestamp
1517

1618
return when {
17-
timeDifference < TimeUnit.SECONDS.toMillis(1) -> "방금"
18-
timeDifference < TimeUnit.MINUTES.toMillis(1) -> "${timeDifference / 1000}초 전"
19-
timeDifference < TimeUnit.HOURS.toMillis(1) -> "${timeDifference / TimeUnit.MINUTES.toMillis(1)}분 전"
20-
timeDifference < TimeUnit.DAYS.toMillis(1) -> "${timeDifference / TimeUnit.HOURS.toMillis(1)}시간 전"
21-
timeDifference < TimeUnit.DAYS.toMillis(7) -> "${timeDifference / TimeUnit.DAYS.toMillis(1)}일 전"
22-
timeDifference < TimeUnit.DAYS.toMillis(30) -> "${timeDifference / TimeUnit.DAYS.toMillis(7)}주 전"
23-
timeDifference < TimeUnit.DAYS.toMillis(365) -> "${timeDifference / TimeUnit.DAYS.toMillis(30)}달 전"
24-
else -> "${timeDifference / TimeUnit.DAYS.toMillis(365)}년 전"
19+
timeDifference < TimeUnit.SECONDS.toMillis(1) -> context.getString(R.string.time_now)
20+
timeDifference < TimeUnit.MINUTES.toMillis(1) -> context.getString(R.string.time_second, timeDifference / 1000)
21+
timeDifference < TimeUnit.HOURS.toMillis(1) -> context.getString(R.string.time_minute, timeDifference / TimeUnit.MINUTES.toMillis(1))
22+
timeDifference < TimeUnit.DAYS.toMillis(1) -> context.getString(R.string.time_hour, timeDifference / TimeUnit.HOURS.toMillis(1))
23+
timeDifference < TimeUnit.DAYS.toMillis(7) -> context.getString(R.string.time_day, timeDifference / TimeUnit.DAYS.toMillis(1))
24+
timeDifference < TimeUnit.DAYS.toMillis(30) -> context.getString(R.string.time_week, timeDifference / TimeUnit.DAYS.toMillis(7))
25+
timeDifference < TimeUnit.DAYS.toMillis(365) -> context.getString(R.string.time_month, timeDifference / TimeUnit.DAYS.toMillis(30))
26+
else -> context.getString(R.string.time_year, timeDifference / TimeUnit.DAYS.toMillis(365))
2527
}
2628
} else {
2729
SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.getDefault()).format(Date(timestamp))

app/src/main/java/com/example/notimanager/domain/service/ForegroundNotiService.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class ForegroundNotiService: Service() {
4848
appName: String,
4949
content: String,
5050
isGroupSummary: Boolean) {
51+
val appContent = if (isGroupSummary) content else getString(R.string.status_app_content, content)
52+
5153
val notificationIntent = Intent(this, MainActivity::class.java).apply {
5254
putExtra("appName", appName)
5355
}
@@ -60,7 +62,7 @@ class ForegroundNotiService: Service() {
6062
val notification = NotificationCompat.Builder(this, channelId)
6163
.setSmallIcon(R.mipmap.ic_launcher)
6264
.setContentTitle(appName)
63-
.setContentText(content)
65+
.setContentText(appContent)
6466
.setContentIntent(pendingIntent)
6567
.setPriority(NotificationCompat.PRIORITY_HIGH)
6668
.setGroup(groupId)

app/src/main/java/com/example/notimanager/presentation/ui/activity/MainActivity.kt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import android.util.Log
66
import androidx.activity.ComponentActivity
77
import androidx.activity.compose.setContent
88
import androidx.activity.viewModels
9+
import androidx.compose.ui.platform.LocalContext
910
import androidx.navigation.NavController
1011
import androidx.navigation.NavHostController
1112
import androidx.navigation.compose.rememberNavController
13+
import com.example.notimanager.R
1214
import com.example.notimanager.domain.service.ForegroundNotiService
1315
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel
1416
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel
@@ -24,6 +26,10 @@ class MainActivity : ComponentActivity() {
2426
override fun onCreate(savedInstanceState: Bundle?) {
2527
super.onCreate(savedInstanceState)
2628

29+
// 언어 변경에 따라 문자열 리소스를 가져오기
30+
val basicTitle = getString(R.string.status_basic_title)
31+
val basicContent = getString(R.string.status_basic_content)
32+
2733
val appName = intent.extras?.getString("appName") ?: ""
2834
setContent {
2935
navController = rememberNavController()
@@ -38,8 +44,8 @@ class MainActivity : ComponentActivity() {
3844
}
3945
val serviceIntent = Intent(this, ForegroundNotiService::class.java).apply {
4046
putExtra("clearGroup", true)
41-
putExtra("appName", "NotiManager")
42-
putExtra("content", "실행 중입니다.")
47+
putExtra("appName", basicTitle)
48+
putExtra("content", basicContent)
4349
putExtra("isGroupSummary", true)
4450
}
4551
startService(serviceIntent)
@@ -49,11 +55,4 @@ class MainActivity : ComponentActivity() {
4955
super.onResume()
5056
serviceViewModel.checkNotificationServicePermission()
5157
}
52-
53-
override fun onNewIntent(intent: Intent) {
54-
super.onNewIntent(intent)
55-
val appName = intent.extras?.getString("appName") ?: ""
56-
if (appName != "" && appName != "NotiManager") navController.navigate("titleScreen/$appName")
57-
58-
}
5958
}

app/src/main/java/com/example/notimanager/presentation/ui/component/FilteredListView.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ import androidx.compose.runtime.setValue
2222
import androidx.compose.ui.Alignment
2323
import androidx.compose.ui.Modifier
2424
import androidx.compose.ui.graphics.Color
25+
import androidx.compose.ui.platform.LocalContext
2526
import androidx.compose.ui.text.font.FontWeight
2627
import androidx.compose.ui.unit.dp
28+
import com.example.notimanager.R
2729
import com.example.notimanager.domain.model.FilteredNotification
2830
import com.example.notimanager.presentation.stateholder.state.FilteredNotificationState
2931
import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel
@@ -57,6 +59,11 @@ fun FilteredItemView(
5759
filteredItem: FilteredNotification,
5860
viewModel: FilteredNotificationViewModel,
5961
) {
62+
// 언어 변경에 따라 문자열 리소스를 가져오기
63+
val context = LocalContext.current
64+
val removeFiltered = context.getString(R.string.modal_remove_filtered)
65+
// 위의 문자열 리소스는 모달에서 사용할 텍스트
66+
6067
var showModal by remember { mutableStateOf(false) }
6168

6269
Row(
@@ -95,7 +102,7 @@ fun FilteredItemView(
95102
color = Color.Gray
96103
)
97104

98-
ClickableTextView(text = "제외 리스트에서 삭제", onClick = {
105+
ClickableTextView(text = removeFiltered, onClick = {
99106
viewModel.deleteFilteredNoti(filteredItem.id){
100107
viewModel.loadFilteredNoti()
101108
}

app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ import androidx.compose.runtime.setValue
2727
import androidx.compose.ui.Alignment
2828
import androidx.compose.ui.Modifier
2929
import androidx.compose.ui.graphics.Color
30+
import androidx.compose.ui.platform.LocalContext
3031
import androidx.compose.ui.text.font.FontWeight
3132
import androidx.compose.ui.text.style.TextOverflow
3233
import androidx.compose.ui.tooling.preview.Preview
3334
import androidx.compose.ui.unit.dp
3435
import androidx.hilt.navigation.compose.hiltViewModel
3536
import androidx.navigation.NavController
37+
import com.example.notimanager.R
3638
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
3739
import com.example.notimanager.domain.model.NotificationApp
3840
import com.example.notimanager.presentation.stateholder.state.NotificationAppPriorityState
@@ -109,6 +111,15 @@ fun NotificationAppItemView(
109111
priorityViewModel: NotificationAppPriorityViewModel,
110112
filteredNotificationViewModel: FilteredNotificationViewModel = hiltViewModel()
111113
) {
114+
// 언어 변경에 따라 문자열 리소스를 가져오기
115+
val context = LocalContext.current
116+
val addFiltered = context.getString(R.string.modal_add_filtered)
117+
val addPriority = context.getString(R.string.modal_add_priority)
118+
val removeFiltered = context.getString(R.string.modal_remove_filtered)
119+
val removePriority = context.getString(R.string.modal_remove_priority)
120+
val delete = context.getString(R.string.modal_delete)
121+
// 위의 문자열 리소스는 모달에서 사용할 텍스트
122+
112123
var showModal by remember { mutableStateOf(false) }
113124

114125
Row(
@@ -138,50 +149,58 @@ fun NotificationAppItemView(
138149
overflow = TextOverflow.Ellipsis
139150
)
140151
Text(
141-
text = formatTimestamp(notification.timestamp),
152+
text = formatTimestamp(context, notification.timestamp),
142153
style = MaterialTheme.typography.labelSmall,
143154
color = Color.LightGray
144155
)
145156
}
146-
157+
158+
// 더보기
147159
IconButton(onClick = { showModal = true }) {
148160
Icon(Icons.Filled.MoreVert, contentDescription = "중요 표시 또는 삭제")
149161
}
150162
}
163+
// 더보기 클릭 시 나오는 모달창
151164
if (showModal) {
152165
BottomSheet(showModal, onDismiss = { showModal = false }){
153166
Column(
154167
modifier = Modifier
155168
.fillMaxWidth()
156169
.padding(16.dp)
157170
) {
171+
// 알림 제목
158172
Text(
159173
text = notification.appName,
160174
style = MaterialTheme.typography.labelLarge,
161175
color = Color.Gray
162176
)
177+
178+
// 상단 고정 여부 버튼
163179
if (notification.priorityActive) {
164-
ClickableTextView(text = "중요 알림 취소", onClick = {
180+
ClickableTextView(text = removePriority, onClick = {
165181
priorityViewModel.removeAppPriority(notification.appName){
166182
viewModel.loadNotificationApps()
167183
}
168184
showModal = false
169185
})
170186
}
171187
else{
172-
ClickableTextView(text = "중요 알림 설정", onClick = {
188+
ClickableTextView(text = addPriority, onClick = {
173189
viewModel.setAppPriority(notification.appName, priorityViewModel.getLength()){
174190
priorityViewModel.loadNotificationAppPriority()
175191
}
176192
showModal = false
177193
})
178194
}
179-
ClickableTextView(text = "삭제", onClick = {
195+
196+
// 삭제 버튼
197+
ClickableTextView(text = delete, onClick = {
180198
viewModel.deleteNotificationApp(notification.appName)
181199
showModal = false
182200
})
183201

184-
ClickableTextView(text = if (notification.filteredId == 0L) "알림 제외 리스트에 추가" else "알림 제외 리스트에서 제거", onClick = {
202+
// 수집 여부 버튼
203+
ClickableTextView(text = if (notification.filteredId == 0L) addFiltered else removeFiltered, onClick = {
185204
if (notification.filteredId == 0L) filteredNotificationViewModel.insertFilteredNoti(notification.appName, ""){
186205
viewModel.loadNotificationApps()
187206
priorityViewModel.loadNotificationAppPriority()

app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.compose.ui.platform.LocalContext
2323
import androidx.compose.ui.text.font.FontWeight
2424
import androidx.compose.ui.text.style.TextOverflow
2525
import androidx.compose.ui.unit.dp
26+
import com.example.notimanager.R
2627
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
2728
import com.example.notimanager.domain.model.Notification
2829
import com.example.notimanager.presentation.stateholder.state.NotificationState
@@ -62,6 +63,12 @@ fun NotificationItemView(
6263
onClick: () -> Unit,
6364
onDelete: (Long) -> Unit
6465
) {
66+
// 언어 변경에 따라 문자열 리소스를 가져오기
67+
val context = LocalContext.current
68+
val moveToApp = context.getString(R.string.modal_move_to_app)
69+
val delete = context.getString(R.string.modal_delete)
70+
// 위의 문자열 리소스는 모달에서 사용할 텍스트
71+
6572
var showModal by remember { mutableStateOf(false) }
6673
Row(
6774
modifier = Modifier
@@ -85,7 +92,7 @@ fun NotificationItemView(
8592
style = MaterialTheme.typography.bodySmall
8693
)
8794
Text(
88-
text = formatTimestamp(notification.timestamp),
95+
text = formatTimestamp(context, notification.timestamp),
8996
style = MaterialTheme.typography.labelSmall,
9097
color = Color.LightGray
9198
)
@@ -110,12 +117,12 @@ fun NotificationItemView(
110117
overflow = TextOverflow.Ellipsis,
111118
color = Color.Gray
112119
)
113-
ClickableTextView(text = "앱으로 이동", onClick = {
120+
ClickableTextView(text = moveToApp, onClick = {
114121
onClick()
115122
showModal = false
116123
})
117124

118-
ClickableTextView(text = "삭제", onClick = {
125+
ClickableTextView(text = delete, onClick = {
119126
onDelete(notification.id)
120127
showModal = false
121128
})

app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ import androidx.compose.runtime.setValue
2828
import androidx.compose.ui.Alignment
2929
import androidx.compose.ui.Modifier
3030
import androidx.compose.ui.graphics.Color
31+
import androidx.compose.ui.platform.LocalContext
3132
import androidx.compose.ui.text.font.FontWeight
3233
import androidx.compose.ui.text.style.TextOverflow
3334
import androidx.compose.ui.tooling.preview.Preview
3435
import androidx.compose.ui.unit.dp
3536
import androidx.hilt.navigation.compose.hiltViewModel
3637
import androidx.navigation.NavController
38+
import com.example.notimanager.R
3739
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
3840
import com.example.notimanager.common.objects.Encoder.getEncodedString
3941
import com.example.notimanager.domain.model.NotificationTitle
@@ -120,6 +122,15 @@ fun NotificationTitleItemView(
120122
priorityViewModel: NotificationTitlePriorityViewModel,
121123
filteredNotificationViewModel: FilteredNotificationViewModel = hiltViewModel()
122124
) {
125+
// 언어 변경에 따라 문자열 리소스를 가져오기
126+
val context = LocalContext.current
127+
val addFiltered = context.getString(R.string.modal_add_filtered)
128+
val addPriority = context.getString(R.string.modal_add_priority)
129+
val removeFiltered = context.getString(R.string.modal_remove_filtered)
130+
val removePriority = context.getString(R.string.modal_remove_priority)
131+
val delete = context.getString(R.string.modal_delete)
132+
// 위의 문자열 리소스는 모달에서 사용할 텍스트
133+
123134
var showModal by remember { mutableStateOf(false) }
124135
Row(
125136
modifier = Modifier
@@ -144,7 +155,7 @@ fun NotificationTitleItemView(
144155
overflow = TextOverflow.Ellipsis
145156
)
146157
Text(
147-
text = formatTimestamp(notification.timestamp),
158+
text = formatTimestamp(context, notification.timestamp),
148159
style = MaterialTheme.typography.labelSmall,
149160
color = Color.LightGray
150161
)
@@ -174,23 +185,23 @@ fun NotificationTitleItemView(
174185
)
175186

176187
if (notification.priorityActive) {
177-
ClickableTextView(text = "중요 알림 취소", onClick = {
188+
ClickableTextView(text = removePriority, onClick = {
178189
priorityViewModel.removeTitlePriority(notificationId = notification.id){
179190
viewModel.loadNotificationTitles()
180191
}
181192
showModal = false
182193
})
183194
}
184195
else{
185-
ClickableTextView(text = "중요 알림 설정", onClick = {
196+
ClickableTextView(text = addPriority, onClick = {
186197
viewModel.setTitlePriority(notification.id, priorityViewModel.getLength()){
187198
priorityViewModel.loadNotificationTitles()
188199
}
189200
showModal = false
190201
})
191202
}
192203

193-
ClickableTextView(text = "삭제", onClick = {
204+
ClickableTextView(text = delete, onClick = {
194205
if (notification.subText == "")
195206
viewModel.deleteByTitle(notification.title) { priorityViewModel.loadNotificationTitles() }
196207
else
@@ -205,7 +216,7 @@ fun NotificationTitleItemView(
205216

206217
if(notification.filteredId == 0L) {
207218
ClickableTextView(
208-
text = "이 방 알림 무시하기",
219+
text = addFiltered,
209220
onClick = {
210221
if (notification.subText == "") {
211222
filteredNotificationViewModel.insertFilteredNoti(
@@ -226,7 +237,7 @@ fun NotificationTitleItemView(
226237
)
227238
}else{
228239
ClickableTextView(
229-
text = "이 방 알림 계속 받기",
240+
text = removeFiltered,
230241
onClick = {
231242
if (notification.subText == "")
232243
filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId, onComplete)

0 commit comments

Comments
 (0)