diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 83e1df2..5428f7d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,6 @@ android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.NotiManager" android:enableOnBackInvokedCallback="true" diff --git a/app/src/main/java/com/example/notimanager/data/dto/FilteredListItemDto.kt b/app/src/main/java/com/example/notimanager/data/dto/FilteredListItemDto.kt new file mode 100644 index 0000000..9f307fc --- /dev/null +++ b/app/src/main/java/com/example/notimanager/data/dto/FilteredListItemDto.kt @@ -0,0 +1,19 @@ +package com.example.notimanager.data.dto + +import com.example.notimanager.domain.model.FilteredListItem + +data class FilteredListItemDto( + val id: Long, + val appName: String, + val title: String, +){ + fun toDomain(): FilteredListItem { + return FilteredListItem( + id = this.id, + appName = this.appName, + title = this.title + ) + } +} + + diff --git a/app/src/main/java/com/example/notimanager/data/dto/FilteredNotificationDto.kt b/app/src/main/java/com/example/notimanager/data/dto/FilteredNotificationDto.kt index dc6bb45..bb39808 100644 --- a/app/src/main/java/com/example/notimanager/data/dto/FilteredNotificationDto.kt +++ b/app/src/main/java/com/example/notimanager/data/dto/FilteredNotificationDto.kt @@ -1,17 +1,20 @@ package com.example.notimanager.data.dto +import android.graphics.BitmapFactory import com.example.notimanager.domain.model.FilteredNotification data class FilteredNotificationDto( val id: Long, val appName: String, val title: String, + val iconBytes: ByteArray, ){ fun toDomain(): FilteredNotification { return FilteredNotification( id = this.id, appName = this.appName, title = this.title, + appIcon = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.size), ) } } diff --git a/app/src/main/java/com/example/notimanager/data/dto/NotificationAppDto.kt b/app/src/main/java/com/example/notimanager/data/dto/NotificationAppDto.kt index 8760e66..90263e8 100644 --- a/app/src/main/java/com/example/notimanager/data/dto/NotificationAppDto.kt +++ b/app/src/main/java/com/example/notimanager/data/dto/NotificationAppDto.kt @@ -11,7 +11,8 @@ data class NotificationAppDto( val iconBytes: ByteArray, val priorityActive: Boolean, val priority: Int, - val filteredId: Long = 0L + val filteredId: Long = 0L, + val isRead: Boolean ){ fun toDomain(): NotificationApp { return NotificationApp( @@ -22,7 +23,8 @@ data class NotificationAppDto( appIcon = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.size), priorityActive = this.priorityActive, priority = this.priority, - filteredId = this.filteredId + filteredId = this.filteredId, + isRead = this.isRead ) } } diff --git a/app/src/main/java/com/example/notimanager/data/repository/FilteredNotificationRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/FilteredNotificationRepository.kt index b67997c..ccb7987 100644 --- a/app/src/main/java/com/example/notimanager/data/repository/FilteredNotificationRepository.kt +++ b/app/src/main/java/com/example/notimanager/data/repository/FilteredNotificationRepository.kt @@ -2,6 +2,7 @@ package com.example.notimanager.data.repository import com.example.notimanager.data.model.FilteredNotificationModel import com.example.notimanager.data.source.local.dao.FilteredNotificationDao +import com.example.notimanager.domain.model.FilteredListItem import com.example.notimanager.domain.model.FilteredNotification import com.example.notimanager.domain.repository.FilteredNotificationRepositoryInterface @@ -21,7 +22,7 @@ class FilteredNotificationRepository( appName: String, title: String, subText: String - ): List { + ): List { return dao.getSpecificFilteredList(appName, title, subText) .asSequence() .map { it.toDomain() } diff --git a/app/src/main/java/com/example/notimanager/data/source/local/dao/FilteredNotificationDao.kt b/app/src/main/java/com/example/notimanager/data/source/local/dao/FilteredNotificationDao.kt index 511ddb7..f5a4139 100644 --- a/app/src/main/java/com/example/notimanager/data/source/local/dao/FilteredNotificationDao.kt +++ b/app/src/main/java/com/example/notimanager/data/source/local/dao/FilteredNotificationDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import com.example.notimanager.data.dto.FilteredListItemDto import com.example.notimanager.data.dto.FilteredNotificationDto import com.example.notimanager.data.model.FilteredNotificationModel @@ -16,10 +17,12 @@ interface FilteredNotificationDao { SELECT id, appName, title FROM filtered_notification WHERE appName = :appName AND (title = "" OR title = :title OR title = :subText) """) - suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List + suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List @Query(""" - SELECT id, appName, title FROM filtered_notification + SELECT id, appName, title, ai.iconBytes + FROM filtered_notification AS fn + INNER JOIN app_icon AS ai ON fn.appName = ai.notiAppName ORDER BY appName ASC """) suspend fun getFilteredList(): List diff --git a/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt b/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt index d2a4203..6bb1e31 100644 --- a/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt +++ b/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt @@ -17,7 +17,7 @@ interface NotificationDao { @Query( """ - SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes, ai.priorityActive, ai.priority, fn.id AS filteredId + SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes, ai.priorityActive, ai.priority, fn.id AS filteredId, n1.isRead FROM notification AS n1 INNER JOIN app_icon AS ai ON n1.appName = ai.notiAppName LEFT OUTER JOIN filtered_notification AS fn ON n1.appName = fn.appName AND fn.title = "" diff --git a/app/src/main/java/com/example/notimanager/domain/model/FilteredListItem.kt b/app/src/main/java/com/example/notimanager/domain/model/FilteredListItem.kt new file mode 100644 index 0000000..ef88afe --- /dev/null +++ b/app/src/main/java/com/example/notimanager/domain/model/FilteredListItem.kt @@ -0,0 +1,9 @@ +package com.example.notimanager.domain.model + +data class FilteredListItem( + val id: Long, + val appName: String, + val title: String, +) + + diff --git a/app/src/main/java/com/example/notimanager/domain/model/FilteredNotification.kt b/app/src/main/java/com/example/notimanager/domain/model/FilteredNotification.kt index a5e486c..4cd0899 100644 --- a/app/src/main/java/com/example/notimanager/domain/model/FilteredNotification.kt +++ b/app/src/main/java/com/example/notimanager/domain/model/FilteredNotification.kt @@ -1,9 +1,12 @@ package com.example.notimanager.domain.model +import android.graphics.Bitmap + data class FilteredNotification( val id: Long, val appName: String, val title: String, + val appIcon: Bitmap?, ) diff --git a/app/src/main/java/com/example/notimanager/domain/model/NotificationApp.kt b/app/src/main/java/com/example/notimanager/domain/model/NotificationApp.kt index 5d67481..f548152 100644 --- a/app/src/main/java/com/example/notimanager/domain/model/NotificationApp.kt +++ b/app/src/main/java/com/example/notimanager/domain/model/NotificationApp.kt @@ -10,5 +10,6 @@ data class NotificationApp( val appIcon: Bitmap?, val priorityActive: Boolean, val priority: Int, - val filteredId: Long + val filteredId: Long, + val isRead: Boolean ) diff --git a/app/src/main/java/com/example/notimanager/domain/repository/FilteredNotificationRepositoryInterface.kt b/app/src/main/java/com/example/notimanager/domain/repository/FilteredNotificationRepositoryInterface.kt index 2ed6a76..411c61d 100644 --- a/app/src/main/java/com/example/notimanager/domain/repository/FilteredNotificationRepositoryInterface.kt +++ b/app/src/main/java/com/example/notimanager/domain/repository/FilteredNotificationRepositoryInterface.kt @@ -1,10 +1,11 @@ package com.example.notimanager.domain.repository +import com.example.notimanager.domain.model.FilteredListItem import com.example.notimanager.domain.model.FilteredNotification interface FilteredNotificationRepositoryInterface { suspend fun insertFiltered(appName: String, title: String): Long - suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List + suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List suspend fun getFilteredList(): List suspend fun deleteById(id: Long): Int } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/activity/MainActivity.kt b/app/src/main/java/com/example/notimanager/presentation/ui/activity/MainActivity.kt index 56d3447..e755b83 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/activity/MainActivity.kt @@ -13,6 +13,8 @@ import com.example.notimanager.domain.service.ForegroundNotiService import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel import com.example.notimanager.presentation.ui.navigation.AppNavHost +import com.example.notimanager.presentation.ui.navigation.HandleBackPress +import com.example.notimanager.presentation.ui.theme.AppTheme import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -31,9 +33,15 @@ class MainActivity : ComponentActivity() { // 화면 설정 val appName = intent.extras?.getString("appName") ?: "" setContent { - navController = rememberNavController() - AppNavHost(navController = navController as NavHostController) - if (appName != "" && appName != "NotiManager") navController.navigate("titleScreen/$appName") + AppTheme { + navController = rememberNavController() + AppNavHost(navController = navController as NavHostController) + + HandleBackPress(navController as NavHostController, startRoute = "mainScreen") + + if (appName != "" && appName != "NotiManager") navController.navigate("titleScreen/$appName") + } + } // 알림 허용 권한 요청 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 index bbee2c5..031551d 100644 --- 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 @@ -7,6 +7,8 @@ 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.ButtonDefaults +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -15,7 +17,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue 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 androidx.hilt.navigation.compose.hiltViewModel import com.example.notimanager.R @@ -42,6 +46,7 @@ fun DateFormatterView( var selectedOption by remember { mutableStateOf(viewModel.getDateFormat()) } Column { + // 상대 시간 설정 Row( modifier = Modifier .fillMaxWidth() @@ -53,11 +58,23 @@ fun DateFormatterView( onClick = { selectedOption = viewModel.relativeTime } ) Column{ - Text(relativeTime) - Text(relativeExample) - Text(exampleExplanation) + Text( + text = relativeTime, + style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold) + ) + Text( + text = exampleExplanation, + style = MaterialTheme.typography.bodySmall + ) + Text( + text = relativeExample, + style = MaterialTheme.typography.labelSmall, + color = Color.Gray + ) } } + + // 절대 시간 설정 Row( modifier = Modifier .fillMaxWidth() @@ -69,16 +86,29 @@ fun DateFormatterView( onClick = { selectedOption = viewModel.absoluteTime } ) Column{ - Text(absoluteTime) - Text(absoluteExample) - Text(exampleExplanation) + Text( + text = absoluteTime, + style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold) + ) + Text( + text = exampleExplanation, + style = MaterialTheme.typography.bodySmall + ) + Text( + text = absoluteExample, + style = MaterialTheme.typography.labelSmall, + color = Color.Gray + ) } } Button( onClick = { viewModel.setDateFormat(selectedOption) }, modifier = Modifier .padding(16.dp) - .fillMaxWidth() + .fillMaxWidth(), + colors = ButtonDefaults.buttonColors( + Color(0xFF673AB7) // 원하는 배경 색상으로 변경 + ) ) { Text(apply) } 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 56fca71..b9ba467 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 @@ -12,7 +12,7 @@ import androidx.navigation.NavController import com.example.notimanager.R import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel -import com.example.notimanager.presentation.ui.component.box.ClickableTextView +import com.example.notimanager.presentation.ui.component.box.SettingBoxView @Composable fun SettingView( @@ -25,32 +25,39 @@ fun SettingView( // 언어 설정에 따라 문자열 리소스를 가져오기 val context = LocalContext.current val filteredList = context.getString(R.string.setting_filtered_list) + val filteredListExplanation = context.getString(R.string.setting_filtered_list_explanation) + val accessPermission = context.getString(R.string.setting_access_permission) + val accessPermissionExplanation = context.getString(R.string.setting_access_permission_explanation) + val sendPermission = context.getString(R.string.setting_send_permission) + val sendPermissionExplanation = context.getString(R.string.setting_send_permission_explanation) + val dateFormatter = context.getString(R.string.setting_date_format) + val dateFormatterExplanation = context.getString(R.string.setting_date_format_explanation) Column( modifier = Modifier .padding(innerPadding) ) { // 받지 않는 알림 목록 - ClickableTextView(filteredList, onClick = {navController.navigate("FilteredListScreen")}) { + SettingBoxView(filteredList, filteredListExplanation) { + navController.navigate("FilteredListScreen") + } + // 시간 형식 변경 + SettingBoxView(dateFormatter, dateFormatterExplanation) { + navController.navigate("DateFormatterScreen") } // 알림 접근 권한 - ClickableTextView(accessPermission, onClick = {servicePermissionViewModel.requestServicePermission()}) { - + SettingBoxView(accessPermission, accessPermissionExplanation) { + servicePermissionViewModel.requestServicePermission() } // 알림 발송 권한 - ClickableTextView(sendPermission, onClick = {notificationPermissionViewModel.requestPermission(context as Activity)}) { - - } - - // 시간 형식 변경 - ClickableTextView(dateFormatter, onClick = {navController.navigate("DateFormatterScreen")}) { - + SettingBoxView(sendPermission, sendPermissionExplanation) { + notificationPermissionViewModel.requestPermission(context as Activity) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/BoxView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/BoxView.kt index dcbcf5f..d452170 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/BoxView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/BoxView.kt @@ -2,6 +2,7 @@ package com.example.notimanager.presentation.ui.component.box import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -12,6 +13,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @Composable @@ -37,3 +39,29 @@ fun ClickableTextView( } } } + +@Composable +fun SettingBoxView( + title: String, + explanation: String, + onClick: () -> Unit, +){ + Box( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + .clickable(onClick = onClick) + ){ + Column { + Text( + text = title, + style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold), + modifier = Modifier.padding(vertical = 8.dp) + ) + Text( + text = explanation, + style = MaterialTheme.typography.bodySmall + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/common/AppIconView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/AppIconView.kt index c3425d8..a8cb352 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/common/AppIconView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/AppIconView.kt @@ -6,22 +6,23 @@ import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp @Composable -fun AppIconView(appIcon: Bitmap?) { +fun AppIconView(appIcon: Bitmap?, size: Dp = 50.dp) { if (appIcon != null) { Image( bitmap = appIcon.asImageBitmap(), contentDescription = null, - modifier = Modifier.size(50.dp) + modifier = Modifier.size(size) ) } else{ Image( bitmap = Bitmap.createBitmap(100, 10, Bitmap.Config.ARGB_8888).asImageBitmap(), contentDescription = null, - modifier = Modifier.size(50.dp) + modifier = Modifier.size(size) ) } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/FilteredListItemView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/FilteredListItemView.kt index fa9a748..3950e26 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/FilteredListItemView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/FilteredListItemView.kt @@ -26,6 +26,7 @@ import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotifi import com.example.notimanager.presentation.ui.component.common.BottomSheet import com.example.notimanager.presentation.ui.component.box.ClickableTextView import com.example.notimanager.presentation.ui.component.box.RemoveFilteredBox +import com.example.notimanager.presentation.ui.component.common.AppIconView @Composable fun FilteredItemView( @@ -42,7 +43,7 @@ fun FilteredItemView( , verticalAlignment = Alignment.CenterVertically ) { -// AppIconView(filteredItem.appIcon) + AppIconView(filteredItem.appIcon) Spacer(modifier = Modifier.width(8.dp)) Column( modifier = Modifier diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiAppListItemView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiAppListItemView.kt index 585f148..b269e36 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiAppListItemView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiAppListItemView.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.Badge import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -82,7 +83,7 @@ fun NotificationAppItemView( imageVector = Icons.Filled.Star, contentDescription = "중요 표시", modifier = Modifier.size(12.dp), - tint = Color.Gray + tint = Color(0XFF673AB7) ) } if(notification.filteredId != 0L) { @@ -90,7 +91,7 @@ fun NotificationAppItemView( painter = painterResource(id = R.drawable.notifications_off), contentDescription = "notification off icon", modifier = Modifier.size(12.dp), - colorFilter = ColorFilter.tint(Color.Gray) + colorFilter = ColorFilter.tint(Color(0XFF673AB7)) ) } } @@ -111,7 +112,14 @@ fun NotificationAppItemView( color = Color.LightGray ) } - + + // 최신 알림 존재 여부 + if (!notification.isRead){ + Badge { + Text("N") + } + } + // 더보기 IconButton(onClick = { showModal = true }) { Icon(Icons.Filled.MoreVert, contentDescription = "중요 표시 또는 삭제") @@ -131,14 +139,6 @@ fun NotificationAppItemView( style = MaterialTheme.typography.labelLarge, color = Color.Gray ) - - // 삭제 버튼 - DeleteBox { - viewModel.deleteNotificationApp(notification.appName){ - priorityViewModel.loadNotificationAppPriority() - } - showModal = false - } // 관리 여부 버튼 if (notification.filteredId == 0L){ @@ -176,6 +176,14 @@ fun NotificationAppItemView( showModal = false } } + + // 삭제 버튼 + DeleteBox { + viewModel.deleteNotificationApp(notification.appName){ + priorityViewModel.loadNotificationAppPriority() + } + showModal = false + } } } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiListItemView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiListItemView.kt index c0a0535..65850bf 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiListItemView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiListItemView.kt @@ -84,17 +84,17 @@ fun NotificationItemView( color = Color.Gray ) - // 삭제 - DeleteBox { - onDelete(notification.id) - showModal = false - } - // 앱으로 이동하기 MoveToAppBox { onClick() showModal = false } + + // 삭제 + DeleteBox { + onDelete(notification.id) + showModal = false + } } } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiTitleListItemView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiTitleListItemView.kt index 1161896..71068aa 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiTitleListItemView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiTitleListItemView.kt @@ -63,12 +63,11 @@ fun NotificationTitleItemView( .clickable(onClick = onClick), verticalAlignment = Alignment.CenterVertically ) { - AppIconView(notification.notificationIcon) - Spacer(modifier = Modifier.width(8.dp)) + AppIconView(notification.notificationIcon, 25.dp) + Spacer(modifier = Modifier.width(16.dp)) Column ( modifier = Modifier.weight(1f) ){ - // 알림 제목, 옆에 중요 알림, 필터링 알림일 경우에 대한 아이콘 표시 Row( verticalAlignment = Alignment.CenterVertically ) { @@ -82,7 +81,7 @@ fun NotificationTitleItemView( imageVector = Icons.Filled.Star, contentDescription = "중요 표시", modifier = Modifier.size(12.dp), - tint = Color.Gray + tint = Color(0XFF673AB7) ) } if(notification.filteredId != 0L) { @@ -90,7 +89,7 @@ fun NotificationTitleItemView( painter = painterResource(id = R.drawable.notifications_off), contentDescription = "notification off icon", modifier = Modifier.size(12.dp), - colorFilter = ColorFilter.tint(Color.Gray) + colorFilter = ColorFilter.tint(Color(0XFF673AB7)) ) } } @@ -139,15 +138,6 @@ fun NotificationTitleItemView( color = Color.Gray ) - // 삭제 버튼 - DeleteBox { - if (notification.subText == "") - viewModel.deleteByTitle(notification.title) { priorityViewModel.loadNotificationTitles() } - else - viewModel.deleteBySubText(notification.subText) { priorityViewModel.loadNotificationTitles() } - showModal = false - } - // 특정 동작 완료 후 동작 val onComplete: () -> Unit = { viewModel.loadNotificationTitles() @@ -200,6 +190,16 @@ fun NotificationTitleItemView( showModal = false } } + + // 삭제 버튼 + DeleteBox { + if (notification.subText == "") + viewModel.deleteByTitle(notification.title) { priorityViewModel.loadNotificationTitles() } + else + viewModel.deleteBySubText(notification.subText) { priorityViewModel.loadNotificationTitles() } + showModal = false + } + } } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt index 03805a4..fa049f6 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt @@ -34,18 +34,12 @@ fun NotificationAppListView( if (!priorityState.isLoading) { currentNotiPriority = priorityState.notificationAppList } - if (priorityState.notificationAppList.isEmpty()){ - currentNotiPriority = emptyList() - } } LaunchedEffect(notificationAppState.notificationAppList) { if (!notificationAppState.isLoading) { currentNoti = notificationAppState.notificationAppList } - if (notificationAppState.notificationAppList.isEmpty()){ - currentNoti = emptyList() - } } LazyColumn( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt index 539fa0a..54a3e29 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt @@ -39,18 +39,12 @@ fun NotificationTitleListView( if (!priorityState.isLoading) { currentNotiPriority = priorityState.notificationTitleList } - if (priorityState.notificationTitleList.isEmpty()){ - currentNotiPriority = emptyList() - } } LaunchedEffect(notificationTitleState.notificationTitleList) { if (!notificationTitleState.isLoading) { currentNoti = notificationTitleState.notificationTitleList } - if (notificationTitleState.notificationTitleList.isEmpty()){ - currentNoti = emptyList() - } } LazyColumn( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/HandleBackPress.kt b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/HandleBackPress.kt new file mode 100644 index 0000000..0d7e1c1 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/HandleBackPress.kt @@ -0,0 +1,27 @@ +package com.example.notimanager.presentation.ui.navigation + +import android.app.Activity +import android.util.Log +import androidx.activity.compose.BackHandler +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.platform.LocalContext +import androidx.navigation.NavHostController + +@Composable +fun HandleBackPress(navController: NavHostController, startRoute: String) { + // popBackStack 호출 여부를 추적하는 상태 변수 + val hasPoppedBackStack = rememberSaveable { mutableStateOf(false) } + val context = LocalContext.current + BackHandler(enabled = true) { + if (!hasPoppedBackStack.value && navController.currentDestination?.route != startRoute) { + hasPoppedBackStack.value = true + navController.popBackStack() + hasPoppedBackStack.value = false + } else { + // TODO: 뒤로가기 시 광고를 띄운 종료창을 띄우도록 하기. + (context as? Activity)?.finish() + } + } +} 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 index d2c9e8e..11f8d55 100644 --- 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 @@ -4,6 +4,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold 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 @@ -19,10 +23,16 @@ fun DateFormatterScreen( // 언어 설정에 따라 문자열 리소스를 가져오기 val context = LocalContext.current val title = context.getString(R.string.setting_date_format) + var isClicked by remember { mutableStateOf(false) } Scaffold( topBar = { - CommonTopAppBar(title){ navController.popBackStack() } + CommonTopAppBar(title) { + if (!isClicked) { + isClicked = true + navController.popBackStack() + } + } } ) { innerPadding -> HorizontalDivider( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/screen/FilteredListScreen.kt b/app/src/main/java/com/example/notimanager/presentation/ui/screen/FilteredListScreen.kt index ecef73a..b9981be 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/screen/FilteredListScreen.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/FilteredListScreen.kt @@ -4,6 +4,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold 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 @@ -22,10 +26,18 @@ fun FilteredListScreen( // 언어 설정에 따라 문자열 리소스를 가져오기 val context = LocalContext.current val title = context.getString(R.string.setting_filtered_list) + var isClicked by remember { mutableStateOf(false) } Scaffold( topBar = { - CommonTopAppBar(title = title, onBackClick = { navController.popBackStack() }) + CommonTopAppBar(title = title, onBackClick = { + if (!isClicked){ + isClicked = true + + navController.popBackStack() + } + + }) } ) { innerPadding -> HorizontalDivider( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/screen/MainScreen.kt b/app/src/main/java/com/example/notimanager/presentation/ui/screen/MainScreen.kt index 45e08a6..cec47ce 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/screen/MainScreen.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/MainScreen.kt @@ -37,6 +37,8 @@ fun MainScreen( var isRefreshing by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + var isClicked by remember { mutableStateOf(false) } + val onRefresh: () -> Unit = { isRefreshing = true viewModel.loadNotificationApps() @@ -55,7 +57,11 @@ fun MainScreen( Scaffold( topBar = { MainTopAppBar{ - navController.navigate("SettingScreen") + if (!isClicked){ + isClicked = true + navController.navigate("SettingScreen") + isClicked = false + } } } ) { innerPadding -> diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationScreen.kt b/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationScreen.kt index f26a1a3..453bb95 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationScreen.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationScreen.kt @@ -32,6 +32,8 @@ fun NotificationScreen(navController: NavController, appName: String = "", title var isRefreshing by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + var isClicked by remember { mutableStateOf(false) } + val onRefresh: () -> Unit = { isRefreshing = true viewModel.loadNotification() @@ -46,7 +48,12 @@ fun NotificationScreen(navController: NavController, appName: String = "", title } Scaffold( topBar = { - CommonTopAppBar(title = title, onBackClick = { navController.popBackStack() }) + CommonTopAppBar(title = title, onBackClick = { + if(!isClicked){ + isClicked = true + navController.popBackStack() + } } + ) } ) { innerPadding -> HorizontalDivider( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationSubScreen.kt b/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationSubScreen.kt index 3ad6ceb..d4bb7ac 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationSubScreen.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationSubScreen.kt @@ -31,6 +31,7 @@ fun NotificationSubScreen(navController: NavController, appName: String = "", su var isRefreshing by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + var isClicked by remember { mutableStateOf(false) } val onRefresh: () -> Unit = { isRefreshing = true @@ -46,7 +47,13 @@ fun NotificationSubScreen(navController: NavController, appName: String = "", su } Scaffold( topBar = { - CommonTopAppBar(title = subText, onBackClick = { navController.popBackStack() }) + CommonTopAppBar(title = subText, onBackClick = { + if(!isClicked){ + isClicked = true + navController.popBackStack() + } + + }) } ) { innerPadding -> HorizontalDivider( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/screen/SettingScreen.kt b/app/src/main/java/com/example/notimanager/presentation/ui/screen/SettingScreen.kt index ce3e9c5..6e43bb9 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/screen/SettingScreen.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/SettingScreen.kt @@ -4,6 +4,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold 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 @@ -19,10 +23,16 @@ fun SettingScreen( // 언어 설정에 따라 문자열 리소스를 가져오기 val context = LocalContext.current val title = context.getString(R.string.setting_name) + var isClicked by remember { mutableStateOf(false) } Scaffold( topBar = { - CommonTopAppBar(title){ navController.popBackStack() } + CommonTopAppBar(title){ + if (!isClicked){ + isClicked = true + navController.popBackStack() + } + } } ) { innerPadding -> HorizontalDivider( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/screen/TitleScreen.kt b/app/src/main/java/com/example/notimanager/presentation/ui/screen/TitleScreen.kt index 1407793..c1be346 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/screen/TitleScreen.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/TitleScreen.kt @@ -34,6 +34,8 @@ fun TitleScreen(navController: NavController, appName: String = ""){ var isRefreshing by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + var isClicked by remember { mutableStateOf(false) } + LaunchedEffect(appName) { viewModel.setArgs(appName) priorityViewModel.setArgs(appName) @@ -46,7 +48,14 @@ fun TitleScreen(navController: NavController, appName: String = ""){ Scaffold( topBar = { - CommonTopAppBar(title = appName, onBackClick = { navController.popBackStack() }) + CommonTopAppBar(title = appName, onBackClick = { + if (!isClicked) { + isClicked = true + + navController.popBackStack() + + } + }) } ) { innerPadding -> HorizontalDivider( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/theme/AppTheme.kt b/app/src/main/java/com/example/notimanager/presentation/ui/theme/AppTheme.kt new file mode 100644 index 0000000..b880ab5 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/theme/AppTheme.kt @@ -0,0 +1,15 @@ +package com.example.notimanager.presentation.ui.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.runtime.Composable + +// TODO: SharedPreference 에서 적절한 TypoGraphy를 가져와서 적용하기 +@Composable +fun AppTheme(content: @Composable () -> Unit) { + MaterialTheme( + typography = AppTypography, + shapes = Shapes(), + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/theme/AppTypography.kt b/app/src/main/java/com/example/notimanager/presentation/ui/theme/AppTypography.kt new file mode 100644 index 0000000..3569e13 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/theme/AppTypography.kt @@ -0,0 +1,12 @@ +package com.example.notimanager.presentation.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.font.FontWeight + +// fontSize = 12.sp +// + +val AppTypography = Typography( + +) + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755..345888d 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,6 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 6f3b755..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..95c984d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 0000000..7e318d8 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..13c6480 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..15e6b32 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..b957721 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d6..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png new file mode 100644 index 0000000..962f050 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0be1e5b Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..a399f67 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 62b611d..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..a68b598 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a307..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 0000000..8f4ee53 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..10f23c2 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..ef3c2cf Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a695..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..51cabc6 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..e6e7a02 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..64c392d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..b240c2e Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9287f50..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b336c8c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d642..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..4d2ca00 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0ff8da9 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000..0ea30b7 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9126ae3..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d9b0734..8d6a350 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,11 +16,19 @@ 설정 - 관리하지 않는 알림 목록 + 관리하지 않는 알림 + 앱에서 관리하지 않는 알림 목록을 확인하고 처리할 수 있어요. + 언어 설정하기 - 알림 접근 권한 변경하기 - 알림 발송 권한 변경하기 - 시간 형식 변경하기" + + 알림 접근 권한 변경 + 앱이 알림을 수집하고 관리할 수 있는 권한을 허용하거나 변경할 수 있어요. + + 알림 발송 권한 변경 + 앱이 알림을 보낼 수 있는 권한을 허용하거나 변경할 수 있어요. + + 시간 형식 변경" + 알림의 시간 형식을 상대 시간 또는 절대 시간으로 선택할 수 있어요." 확인 @@ -30,7 +38,7 @@ NotiManager - 모든 알림을 읽었어요. + 모든 중요 알림을 확인했어요. %1$s개의 읽지 않은 알림이 있어요. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 33a5499..d90d68f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,15 +12,23 @@ Mark as Unread Manage this notification in the app - Cancel Important Notification Setting + Remove Important Notification Setting Settings - List of Unmanaged Notifications + Ignored Notifications + You can view and manage the list of notifications that the app does not handle. + Change Language Settings + Change Notification Access Permission - Change Notification Send Permission - Change Date Format" + You can allow or change the permission for the app to collect and manage notifications. + + Change Notification Sending Permission + You can allow or change the permission for the app to send notifications. + + Change Time Format + You can choose between relative time and absolute time formats for notifications. OK @@ -30,8 +38,8 @@ NotiManager - All notifications have been read. - %1$s unread notifications. + You have checked all important notifications. + You have %1$s unread notifications. Just now @@ -47,7 +55,7 @@ 5 minutes ago Absolute Time March 21, 2025, 3:31 PM - It will be displayed like this. + It will appear as shown below. Apply \ No newline at end of file diff --git a/app/src/test/resources/json/data/dto/NotificationAppDto.json b/app/src/test/resources/json/data/dto/NotificationAppDto.json index 9175885..1a611c5 100644 --- a/app/src/test/resources/json/data/dto/NotificationAppDto.json +++ b/app/src/test/resources/json/data/dto/NotificationAppDto.json @@ -7,7 +7,8 @@ "iconBytes": [6, 7, 8, 9, 10], "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "Weather", @@ -17,7 +18,8 @@ "iconBytes": [6, 7, 8, 9, 10], "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "Email", @@ -27,7 +29,8 @@ "iconBytes": [6, 7, 8, 9, 10], "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "Calendar", @@ -37,7 +40,8 @@ "iconBytes": [6, 7, 8, 9, 10], "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "News", @@ -47,6 +51,7 @@ "iconBytes": [6, 7, 8, 9, 10], "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true } ] diff --git a/app/src/test/resources/json/domain/model/NotificationApp.json b/app/src/test/resources/json/domain/model/NotificationApp.json index 57d586e..a66052b 100644 --- a/app/src/test/resources/json/domain/model/NotificationApp.json +++ b/app/src/test/resources/json/domain/model/NotificationApp.json @@ -7,7 +7,8 @@ "appIcon": null, "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "Weather", @@ -17,7 +18,8 @@ "appIcon": null, "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "Email", @@ -27,7 +29,8 @@ "appIcon": null, "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "Calendar", @@ -37,7 +40,8 @@ "appIcon": null, "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true }, { "appName": "News", @@ -47,6 +51,7 @@ "appIcon": null, "priorityActive": true, "priority": 1, - "filteredId": 0 + "filteredId": 0, + "isRead": true } ]