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
@@ -1,27 +1,29 @@
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.util.Locale
import java.util.concurrent.TimeUnit

object DateFormatter {
fun formatTimestamp(timestamp: Long, format: String = "relative"): String {
fun formatTimestamp(context: Context, timestamp: Long, format: String = "relative"): String {
return if (format == "relative") {
val currentTime = System.currentTimeMillis()
val timeDifference = currentTime - timestamp

return when {
timeDifference < TimeUnit.SECONDS.toMillis(1) -> "방금"
timeDifference < TimeUnit.MINUTES.toMillis(1) -> "${timeDifference / 1000}초 전"
timeDifference < TimeUnit.HOURS.toMillis(1) -> "${timeDifference / TimeUnit.MINUTES.toMillis(1)}분 전"
timeDifference < TimeUnit.DAYS.toMillis(1) -> "${timeDifference / TimeUnit.HOURS.toMillis(1)}시간 전"
timeDifference < TimeUnit.DAYS.toMillis(7) -> "${timeDifference / TimeUnit.DAYS.toMillis(1)}일 전"
timeDifference < TimeUnit.DAYS.toMillis(30) -> "${timeDifference / TimeUnit.DAYS.toMillis(7)}주 전"
timeDifference < TimeUnit.DAYS.toMillis(365) -> "${timeDifference / TimeUnit.DAYS.toMillis(30)}달 전"
else -> "${timeDifference / TimeUnit.DAYS.toMillis(365)}년 전"
timeDifference < TimeUnit.SECONDS.toMillis(1) -> context.getString(R.string.time_now)
timeDifference < TimeUnit.MINUTES.toMillis(1) -> context.getString(R.string.time_second, timeDifference / 1000)
timeDifference < TimeUnit.HOURS.toMillis(1) -> context.getString(R.string.time_minute, timeDifference / TimeUnit.MINUTES.toMillis(1))
timeDifference < TimeUnit.DAYS.toMillis(1) -> context.getString(R.string.time_hour, timeDifference / TimeUnit.HOURS.toMillis(1))
timeDifference < TimeUnit.DAYS.toMillis(7) -> context.getString(R.string.time_day, timeDifference / TimeUnit.DAYS.toMillis(1))
timeDifference < TimeUnit.DAYS.toMillis(30) -> context.getString(R.string.time_week, timeDifference / TimeUnit.DAYS.toMillis(7))
timeDifference < TimeUnit.DAYS.toMillis(365) -> context.getString(R.string.time_month, timeDifference / TimeUnit.DAYS.toMillis(30))
else -> context.getString(R.string.time_year, timeDifference / TimeUnit.DAYS.toMillis(365))
}
} else {
SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.getDefault()).format(Date(timestamp))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ class ForegroundNotiService: Service() {
appName: String,
content: String,
isGroupSummary: Boolean) {
val appContent = if (isGroupSummary) content else getString(R.string.status_app_content, content)

val notificationIntent = Intent(this, MainActivity::class.java).apply {
putExtra("appName", appName)
}
Expand All @@ -60,7 +62,7 @@ class ForegroundNotiService: Service() {
val notification = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(appName)
.setContentText(content)
.setContentText(appContent)
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setGroup(groupId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import com.example.notimanager.R
import com.example.notimanager.domain.service.ForegroundNotiService
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel
Expand All @@ -24,6 +26,10 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// 언어 변경에 따라 문자열 리소스를 가져오기
val basicTitle = getString(R.string.status_basic_title)
val basicContent = getString(R.string.status_basic_content)

val appName = intent.extras?.getString("appName") ?: ""
setContent {
navController = rememberNavController()
Expand All @@ -38,8 +44,8 @@ class MainActivity : ComponentActivity() {
}
val serviceIntent = Intent(this, ForegroundNotiService::class.java).apply {
putExtra("clearGroup", true)
putExtra("appName", "NotiManager")
putExtra("content", "실행 중입니다.")
putExtra("appName", basicTitle)
putExtra("content", basicContent)
putExtra("isGroupSummary", true)
}
startService(serviceIntent)
Expand All @@ -49,11 +55,4 @@ class MainActivity : ComponentActivity() {
super.onResume()
serviceViewModel.checkNotificationServicePermission()
}

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
val appName = intent.extras?.getString("appName") ?: ""
if (appName != "" && appName != "NotiManager") navController.navigate("titleScreen/$appName")

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.example.notimanager.R
import com.example.notimanager.domain.model.FilteredNotification
import com.example.notimanager.presentation.stateholder.state.FilteredNotificationState
import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel
Expand Down Expand Up @@ -57,6 +59,11 @@ fun FilteredItemView(
filteredItem: FilteredNotification,
viewModel: FilteredNotificationViewModel,
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val removeFiltered = context.getString(R.string.modal_remove_filtered)
// 위의 문자열 리소스는 모달에서 사용할 텍스트

var showModal by remember { mutableStateOf(false) }

Row(
Expand Down Expand Up @@ -95,7 +102,7 @@ fun FilteredItemView(
color = Color.Gray
)

ClickableTextView(text = "제외 리스트에서 삭제", onClick = {
ClickableTextView(text = removeFiltered, onClick = {
viewModel.deleteFilteredNoti(filteredItem.id){
viewModel.loadFilteredNoti()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.example.notimanager.R
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
import com.example.notimanager.domain.model.NotificationApp
import com.example.notimanager.presentation.stateholder.state.NotificationAppPriorityState
Expand Down Expand Up @@ -109,6 +111,15 @@ fun NotificationAppItemView(
priorityViewModel: NotificationAppPriorityViewModel,
filteredNotificationViewModel: FilteredNotificationViewModel = hiltViewModel()
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val addFiltered = context.getString(R.string.modal_add_filtered)
val addPriority = context.getString(R.string.modal_add_priority)
val removeFiltered = context.getString(R.string.modal_remove_filtered)
val removePriority = context.getString(R.string.modal_remove_priority)
val delete = context.getString(R.string.modal_delete)
// 위의 문자열 리소스는 모달에서 사용할 텍스트

var showModal by remember { mutableStateOf(false) }

Row(
Expand Down Expand Up @@ -138,50 +149,58 @@ fun NotificationAppItemView(
overflow = TextOverflow.Ellipsis
)
Text(
text = formatTimestamp(notification.timestamp),
text = formatTimestamp(context, notification.timestamp),
style = MaterialTheme.typography.labelSmall,
color = Color.LightGray
)
}


// 더보기
IconButton(onClick = { showModal = true }) {
Icon(Icons.Filled.MoreVert, contentDescription = "중요 표시 또는 삭제")
}
}
// 더보기 클릭 시 나오는 모달창
if (showModal) {
BottomSheet(showModal, onDismiss = { showModal = false }){
Column(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
// 알림 제목
Text(
text = notification.appName,
style = MaterialTheme.typography.labelLarge,
color = Color.Gray
)

// 상단 고정 여부 버튼
if (notification.priorityActive) {
ClickableTextView(text = "중요 알림 취소", onClick = {
ClickableTextView(text = removePriority, onClick = {
priorityViewModel.removeAppPriority(notification.appName){
viewModel.loadNotificationApps()
}
showModal = false
})
}
else{
ClickableTextView(text = "중요 알림 설정", onClick = {
ClickableTextView(text = addPriority, onClick = {
viewModel.setAppPriority(notification.appName, priorityViewModel.getLength()){
priorityViewModel.loadNotificationAppPriority()
}
showModal = false
})
}
ClickableTextView(text = "삭제", onClick = {

// 삭제 버튼
ClickableTextView(text = delete, onClick = {
viewModel.deleteNotificationApp(notification.appName)
showModal = false
})

ClickableTextView(text = if (notification.filteredId == 0L) "알림 제외 리스트에 추가" else "알림 제외 리스트에서 제거", onClick = {
// 수집 여부 버튼
ClickableTextView(text = if (notification.filteredId == 0L) addFiltered else removeFiltered, onClick = {
if (notification.filteredId == 0L) filteredNotificationViewModel.insertFilteredNoti(notification.appName, ""){
viewModel.loadNotificationApps()
priorityViewModel.loadNotificationAppPriority()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.example.notimanager.R
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
import com.example.notimanager.domain.model.Notification
import com.example.notimanager.presentation.stateholder.state.NotificationState
Expand Down Expand Up @@ -62,6 +63,12 @@ fun NotificationItemView(
onClick: () -> Unit,
onDelete: (Long) -> Unit
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val moveToApp = context.getString(R.string.modal_move_to_app)
val delete = context.getString(R.string.modal_delete)
// 위의 문자열 리소스는 모달에서 사용할 텍스트

var showModal by remember { mutableStateOf(false) }
Row(
modifier = Modifier
Expand All @@ -85,7 +92,7 @@ fun NotificationItemView(
style = MaterialTheme.typography.bodySmall
)
Text(
text = formatTimestamp(notification.timestamp),
text = formatTimestamp(context, notification.timestamp),
style = MaterialTheme.typography.labelSmall,
color = Color.LightGray
)
Expand All @@ -110,12 +117,12 @@ fun NotificationItemView(
overflow = TextOverflow.Ellipsis,
color = Color.Gray
)
ClickableTextView(text = "앱으로 이동", onClick = {
ClickableTextView(text = moveToApp, onClick = {
onClick()
showModal = false
})

ClickableTextView(text = "삭제", onClick = {
ClickableTextView(text = delete, onClick = {
onDelete(notification.id)
showModal = false
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.example.notimanager.R
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
import com.example.notimanager.common.objects.Encoder.getEncodedString
import com.example.notimanager.domain.model.NotificationTitle
Expand Down Expand Up @@ -120,6 +122,15 @@ fun NotificationTitleItemView(
priorityViewModel: NotificationTitlePriorityViewModel,
filteredNotificationViewModel: FilteredNotificationViewModel = hiltViewModel()
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val addFiltered = context.getString(R.string.modal_add_filtered)
val addPriority = context.getString(R.string.modal_add_priority)
val removeFiltered = context.getString(R.string.modal_remove_filtered)
val removePriority = context.getString(R.string.modal_remove_priority)
val delete = context.getString(R.string.modal_delete)
// 위의 문자열 리소스는 모달에서 사용할 텍스트

var showModal by remember { mutableStateOf(false) }
Row(
modifier = Modifier
Expand All @@ -144,7 +155,7 @@ fun NotificationTitleItemView(
overflow = TextOverflow.Ellipsis
)
Text(
text = formatTimestamp(notification.timestamp),
text = formatTimestamp(context, notification.timestamp),
style = MaterialTheme.typography.labelSmall,
color = Color.LightGray
)
Expand Down Expand Up @@ -174,23 +185,23 @@ fun NotificationTitleItemView(
)

if (notification.priorityActive) {
ClickableTextView(text = "중요 알림 취소", onClick = {
ClickableTextView(text = removePriority, onClick = {
priorityViewModel.removeTitlePriority(notificationId = notification.id){
viewModel.loadNotificationTitles()
}
showModal = false
})
}
else{
ClickableTextView(text = "중요 알림 설정", onClick = {
ClickableTextView(text = addPriority, onClick = {
viewModel.setTitlePriority(notification.id, priorityViewModel.getLength()){
priorityViewModel.loadNotificationTitles()
}
showModal = false
})
}

ClickableTextView(text = "삭제", onClick = {
ClickableTextView(text = delete, onClick = {
if (notification.subText == "")
viewModel.deleteByTitle(notification.title) { priorityViewModel.loadNotificationTitles() }
else
Expand All @@ -205,7 +216,7 @@ fun NotificationTitleItemView(

if(notification.filteredId == 0L) {
ClickableTextView(
text = "이 방 알림 무시하기",
text = addFiltered,
onClick = {
if (notification.subText == "") {
filteredNotificationViewModel.insertFilteredNoti(
Expand All @@ -226,7 +237,7 @@ fun NotificationTitleItemView(
)
}else{
ClickableTextView(
text = "이 방 알림 계속 받기",
text = removeFiltered,
onClick = {
if (notification.subText == "")
filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId, onComplete)
Expand Down
Loading
Loading