From 5d23744bbee749b3737f6857772730c75febcf0d Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 00:18:08 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=EC=A0=9C?= =?UTF-8?q?=EB=AA=A9=20=EC=98=86=EC=97=90=20=EC=A4=91=EC=9A=94,=20?= =?UTF-8?q?=EB=AC=B4=EC=8B=9C=20=EC=95=84=EC=9D=B4=EC=BD=98=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 중요 알림이거나 관리하지 않는 아이콘의 경우 적절한 아이콘이 표시되도록 함. 이를 위해 새로운 아이콘 추가. --- .../ui/component/NotificationAppListView.kt | 39 +++++++++++++++++-- .../ui/component/NotificationTitleListView.kt | 35 +++++++++++++++-- .../main/res/drawable/notifications_off.xml | 9 +++++ 3 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable/notifications_off.xml diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt index 65885a5..275cf02 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt @@ -1,17 +1,23 @@ package com.example.notimanager.presentation.ui.component +import androidx.compose.foundation.Image +import androidx.compose.foundation.border 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.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.Notifications +import androidx.compose.material.icons.filled.Star import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -27,7 +33,9 @@ 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.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -135,9 +143,32 @@ fun NotificationAppItemView( Column( modifier = Modifier.weight(1f) ) { - Text( - text = notification.appName, - style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold)) + Row( + verticalAlignment = Alignment.CenterVertically + ){ + Text( + text = notification.appName, + style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold) + ) + Spacer(modifier = Modifier.width(2.dp)) + if(notification.priorityActive) { + Icon( + imageVector = Icons.Filled.Star, + contentDescription = "중요 표시", + modifier = Modifier.size(12.dp), + tint = Color.Gray + ) + } + if(notification.filteredId != 0L) { + Image( + painter = painterResource(id = R.drawable.notifications_off), + contentDescription = "notification off icon", + modifier = Modifier.size(12.dp), + colorFilter = ColorFilter.tint(Color.Gray) + ) + } + } + Text( text = notification.title, style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Bold) @@ -235,4 +266,4 @@ fun PreviewNotificationAppItemView(){ priorityViewModel = hiltViewModel() ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt index 4d7e3e4..c06d0d2 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt @@ -1,5 +1,6 @@ package com.example.notimanager.presentation.ui.component +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -7,11 +8,13 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items 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.HorizontalDivider import androidx.compose.material3.Icon @@ -28,7 +31,9 @@ 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.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -144,10 +149,32 @@ fun NotificationTitleItemView( Column ( modifier = Modifier.weight(1f) ){ - Text( - text = if (notification.subText == "") notification.title else notification.subText , - style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold) - ) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = if (notification.subText == "") notification.title else notification.subText , + style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold) + ) + Spacer(modifier = Modifier.width(2.dp)) + if(notification.priorityActive) { + Icon( + imageVector = Icons.Filled.Star, + contentDescription = "중요 표시", + modifier = Modifier.size(12.dp), + tint = Color.Gray + ) + } + if(notification.filteredId != 0L) { + Image( + painter = painterResource(id = R.drawable.notifications_off), + contentDescription = "notification off icon", + modifier = Modifier.size(12.dp), + colorFilter = ColorFilter.tint(Color.Gray) + ) + } + } + Text( text = notification.content, style = MaterialTheme.typography.bodySmall, diff --git a/app/src/main/res/drawable/notifications_off.xml b/app/src/main/res/drawable/notifications_off.xml new file mode 100644 index 0000000..853e9f6 --- /dev/null +++ b/app/src/main/res/drawable/notifications_off.xml @@ -0,0 +1,9 @@ + + + From 1de2b08482ae7f401c453860a99349f2dcac1351 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 09:42:12 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=EC=97=AC=EB=9F=AC=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=20=ED=9A=8C=EC=83=89=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=EC=84=A0=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 설정 페이지에서 이동하는 또 다른 페이지들의 TopBar 아래에 구분선 추가 앱, 제목 페이지에서 중요/비중요 알림을 나누는 구분선의 경우 중요 알림이 있을 경우에만 표시되도록 개선 --- .../presentation/ui/component/NotificationAppListView.kt | 8 +++++--- .../ui/component/NotificationTitleListView.kt | 6 ++++-- .../presentation/ui/screen/DateFormatterScreen.kt | 8 ++++++++ .../presentation/ui/screen/FilteredListScreen.kt | 8 ++++++++ .../notimanager/presentation/ui/screen/SettingScreen.kt | 8 ++++++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt index 275cf02..5437747 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt @@ -90,11 +90,13 @@ fun NotificationAppListView( priorityViewModel = priorityViewModel ) } - - item { - HorizontalDivider() + if (currentNotiPriority.isNotEmpty()){ + item { + HorizontalDivider() + } } + items(currentNoti) { notification -> NotificationAppItemView( notification = notification, diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt index c06d0d2..f4edacb 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt @@ -89,8 +89,10 @@ fun NotificationTitleListView( }, viewModel = viewModel, priorityViewModel = priorityViewModel) } - item { - HorizontalDivider() + if (currentNotiPriority.isNotEmpty()){ + item { + HorizontalDivider() + } } items(currentNoti) { notification -> 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 bf1f89d..00fd9f8 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 @@ -1,7 +1,11 @@ package com.example.notimanager.presentation.ui.screen +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.example.notimanager.presentation.ui.component.DateFormatterView import com.example.notimanager.presentation.ui.component.SettingTopAppBar @@ -15,6 +19,10 @@ fun DateFormatterScreen( SettingTopAppBar{ navController.popBackStack() } } ) { innerPadding -> + HorizontalDivider( + modifier = Modifier.padding(innerPadding), + thickness = 0.2.dp + ) DateFormatterView(innerPadding) } } \ No newline at end of file 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 589ae87..c1b708b 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 @@ -1,7 +1,11 @@ package com.example.notimanager.presentation.ui.screen +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel @@ -19,6 +23,10 @@ fun FilteredListScreen( FilteredTopAppBar{ navController.popBackStack() } } ) { innerPadding -> + HorizontalDivider( + modifier = Modifier.padding(innerPadding), + thickness = 0.2.dp + ) FilteredListView(innerPadding, viewModel) } } \ No newline at end of file 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 fa8552f..4479a24 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 @@ -1,7 +1,11 @@ package com.example.notimanager.presentation.ui.screen +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.example.notimanager.presentation.ui.component.SettingTopAppBar import com.example.notimanager.presentation.ui.component.SettingView @@ -15,6 +19,10 @@ fun SettingScreen( SettingTopAppBar{ navController.popBackStack() } } ) { innerPadding -> + HorizontalDivider( + modifier = Modifier.padding(innerPadding), + thickness = 0.2.dp + ) SettingView(innerPadding, navController) } } \ No newline at end of file From f560789f29a9c706e4b2b0776ae4d46b130ebb35 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 00:26:26 +0900 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=EC=A4=91=EC=9A=94=20=EC=95=B1=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EC=97=90=EC=84=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=8B=9C=20=EC=B5=9C=EC=8B=A0=ED=99=94=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=ED=98=84=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit onComplete로 로딩 함수 넣어줌. 그리고 title view에 주석 추가 --- .../viewmodel/NotificationAppViewModel.kt | 3 ++- .../ui/component/NotificationAppListView.kt | 4 +++- .../ui/component/NotificationTitleListView.kt | 19 ++++++++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationAppViewModel.kt b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationAppViewModel.kt index d90fc70..17a3989 100644 --- a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationAppViewModel.kt +++ b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationAppViewModel.kt @@ -42,10 +42,11 @@ class NotificationAppViewModel @Inject constructor( } } - fun deleteNotificationApp(appName: String) { + fun deleteNotificationApp(appName: String, onComplete: () -> Unit) { viewModelScope.launch { notificationAppUseCase.deleteNotificationApp(appName) loadNotificationApps() + onComplete() } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt index 5437747..c56ec05 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt @@ -228,7 +228,9 @@ fun NotificationAppItemView( // 삭제 버튼 ClickableTextView(text = delete, onClick = { - viewModel.deleteNotificationApp(notification.appName) + viewModel.deleteNotificationApp(notification.appName){ + priorityViewModel.loadNotificationAppPriority() + } showModal = false }) diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt index f4edacb..c20c3ce 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt @@ -151,6 +151,7 @@ fun NotificationTitleItemView( Column ( modifier = Modifier.weight(1f) ){ + // 알림 제목, 옆에 중요 알림, 필터링 알림일 경우에 대한 아이콘 표시 Row( verticalAlignment = Alignment.CenterVertically ) { @@ -177,29 +178,36 @@ fun NotificationTitleItemView( } } + // 알림 내용 Text( text = notification.content, style = MaterialTheme.typography.bodySmall, maxLines = 1, overflow = TextOverflow.Ellipsis ) + + // 알림 받은 시간 Text( text = formatTimestamp(context, notification.timestamp), style = MaterialTheme.typography.labelSmall, color = Color.LightGray ) } + + // 읽지 않은 알림 수 표시 뱃지 if (notification.unreadCount != 0){ Badge { Text(notification.unreadCount.toString()) } } - + + // 더보기 버튼, 클릭 시 모달창 켜짐 IconButton(onClick = { showModal = true }) { Icon(Icons.Filled.MoreVert, contentDescription = "더보기") } } + // 모달창 if (showModal) { BottomSheet(showModal, onDismiss = { showModal = false }){ Column( @@ -207,12 +215,14 @@ fun NotificationTitleItemView( .fillMaxWidth() .padding(16.dp) ) { + // 알림 제목 Text( text = if (notification.subText == "") notification.title else notification.subText, style = MaterialTheme.typography.labelLarge, color = Color.Gray ) + // 중요 알림 설정 버튼 if (notification.priorityActive) { ClickableTextView(text = removePriority, onClick = { priorityViewModel.removeTitlePriority(notificationId = notification.id){ @@ -230,6 +240,7 @@ fun NotificationTitleItemView( }) } + // 삭제 버튼 ClickableTextView(text = delete, onClick = { if (notification.subText == "") viewModel.deleteByTitle(notification.title) { priorityViewModel.loadNotificationTitles() } @@ -237,12 +248,14 @@ fun NotificationTitleItemView( viewModel.deleteBySubText(notification.subText) { priorityViewModel.loadNotificationTitles() } showModal = false }) - + + // 특정 동작 완료 후 동작 val onComplete: () -> Unit = { viewModel.loadNotificationTitles() priorityViewModel.loadNotificationTitles() } + // 알림 관리하지 않기 버튼 if(notification.filteredId == 0L) { ClickableTextView( text = addFiltered, @@ -264,7 +277,7 @@ fun NotificationTitleItemView( showModal = false } ) - }else{ + } else{ ClickableTextView( text = removeFiltered, onClick = { From b28733670abd529857cefab0e207a128e5aa3b67 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 09:05:57 +0900 Subject: [PATCH 4/8] =?UTF-8?q?fix:=20=EC=82=AD=EC=A0=9C=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=9E=94=EB=A5=98=20=ED=98=84=EC=83=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 마지막 아이템이 삭제되었음에도 해당 아이템이 사라지지 않고 UI에 남아있던 현상 수정 --- .../presentation/ui/component/NotificationAppListView.kt | 9 ++++++--- .../presentation/ui/component/NotificationListView.kt | 3 +++ .../ui/component/NotificationTitleListView.kt | 7 ++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt index c56ec05..6fa279d 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt @@ -1,9 +1,7 @@ package com.example.notimanager.presentation.ui.component import androidx.compose.foundation.Image -import androidx.compose.foundation.border 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 @@ -16,7 +14,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert -import androidx.compose.material.icons.filled.Notifications import androidx.compose.material.icons.filled.Star import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon @@ -66,12 +63,18 @@ 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/NotificationListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt index b0b7602..25cadbc 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt @@ -42,6 +42,9 @@ fun NotificationListView( if (!notificationState.isLoading) { currentNoti = notificationState.notificationList } + if (notificationState.notificationList.isEmpty()){ + currentNoti = emptyList() + } } LazyColumn( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt index c20c3ce..b63be8b 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource 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 @@ -69,12 +68,18 @@ 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( From 32088aca8afc286ddca5fd1036d5da095195b284 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 10:30:40 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20UI=20=ED=8F=B4=EB=8D=94=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 공통된 것끼리 묶고, 패키지로 분리하여 탐색과 이해가 쉽도록 함. --- .../presentation/ui/component/SettingView.kt | 1 + .../presentation/ui/component/TopAppBar.kt | 119 --------------- .../ui/component/{ => common}/AppIconView.kt | 2 +- .../ui/component/{ => common}/BoxView.kt | 2 +- .../ui/component/{ => common}/ModalView.kt | 2 +- .../{ => common}/PermissionDialog.kt | 2 +- .../ui/component/common/TopAppBar.kt | 52 +++++++ .../FilteredListItemView.kt} | 34 +---- .../NotiAppListItemView.kt} | 120 +++------------ .../NotiListItemView.kt} | 53 ++----- .../NotiTitleListItemView.kt} | 138 ++++-------------- .../ui/component/list/FilteredListView.kt | 40 +++++ .../component/list/NotificationAppListView.kt | 88 +++++++++++ .../ui/component/list/NotificationListView.kt | 47 ++++++ .../list/NotificationTitleListView.kt | 96 ++++++++++++ .../ui/screen/DateFormatterScreen.kt | 10 +- .../ui/screen/FilteredListScreen.kt | 13 +- .../presentation/ui/screen/MainScreen.kt | 6 +- .../ui/screen/NotificationScreen.kt | 7 +- .../ui/screen/NotificationSubScreen.kt | 6 +- .../presentation/ui/screen/SettingScreen.kt | 10 +- .../presentation/ui/screen/TitleScreen.kt | 6 +- 22 files changed, 429 insertions(+), 425 deletions(-) delete mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/TopAppBar.kt rename app/src/main/java/com/example/notimanager/presentation/ui/component/{ => common}/AppIconView.kt (91%) rename app/src/main/java/com/example/notimanager/presentation/ui/component/{ => common}/BoxView.kt (91%) rename app/src/main/java/com/example/notimanager/presentation/ui/component/{ => common}/ModalView.kt (93%) rename app/src/main/java/com/example/notimanager/presentation/ui/component/{ => common}/PermissionDialog.kt (96%) create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/common/TopAppBar.kt rename app/src/main/java/com/example/notimanager/presentation/ui/component/{FilteredListView.kt => item/FilteredListItemView.kt} (74%) rename app/src/main/java/com/example/notimanager/presentation/ui/component/{NotificationAppListView.kt => item/NotiAppListItemView.kt} (72%) rename app/src/main/java/com/example/notimanager/presentation/ui/component/{NotificationListView.kt => item/NotiListItemView.kt} (74%) rename app/src/main/java/com/example/notimanager/presentation/ui/component/{NotificationTitleListView.kt => item/NotiTitleListItemView.kt} (69%) create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/list/FilteredListView.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationListView.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt 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 d1c8a57..93867f3 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,6 +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.common.ClickableTextView @Composable fun SettingView( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/TopAppBar.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/TopAppBar.kt deleted file mode 100644 index d2b1e98..0000000 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/TopAppBar.kt +++ /dev/null @@ -1,119 +0,0 @@ -package com.example.notimanager.presentation.ui.component - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material.icons.filled.Menu -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview -import com.example.notimanager.R - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun MainTopAppBar(settingOnClick: () -> Unit){ - // 언어 설정에 따라 문자열 리소스를 가져오기 - val context = LocalContext.current - val appName = context.getString(R.string.app_name) - - TopAppBar( - title = { - Text(text = appName) - }, - navigationIcon = { - IconButton(onClick = settingOnClick) { - Icon(Icons.Filled.Menu, contentDescription = "설정") - } - } - ) -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun TitleTopAppBar(title: String, onBackClick: () -> Unit){ - TopAppBar( - title = { - Text( - text = title, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - }, - navigationIcon = { - IconButton(onClick = onBackClick) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "뒤로 가기") - } - } - ) -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun NotificationTopAppBar(title: String, onBackClick: () -> Unit){ - TopAppBar( - title = { - Text( - text = title, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - }, - navigationIcon = { - IconButton(onClick = onBackClick) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "뒤로 가기") - } - }, - ) -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun SettingTopAppBar(onBackClick: () -> Unit){ - // 언어 설정에 따라 문자열 리소스를 가져오기 - val context = LocalContext.current - val name = context.getString(R.string.setting_name) - - TopAppBar( - title = { - Text(text = name) - }, - navigationIcon = { - IconButton(onClick = onBackClick) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "뒤로 가기") - } - } - ) -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun FilteredTopAppBar(onBackClick: () -> Unit){ - // 언어 설정에 따라 문자열 리소스를 가져오기 - val context = LocalContext.current - val name = context.getString(R.string.setting_filtered_list) - - TopAppBar( - title = { - Text(text = name) - }, - navigationIcon = { - IconButton(onClick = onBackClick) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "뒤로 가기") - } - } - ) -} - -@Preview(backgroundColor = 1) -@Composable -fun PreviewMainTopAppBar(){ - MaterialTheme{ - MainTopAppBar({}) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/AppIconView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/AppIconView.kt similarity index 91% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/AppIconView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/common/AppIconView.kt index 03594bd..c3425d8 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/AppIconView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/AppIconView.kt @@ -1,4 +1,4 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.common import android.graphics.Bitmap import androidx.compose.foundation.Image diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/BoxView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/BoxView.kt similarity index 91% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/BoxView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/common/BoxView.kt index 75f13c4..f76eb59 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/BoxView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/BoxView.kt @@ -1,4 +1,4 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.common import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/ModalView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/ModalView.kt similarity index 93% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/ModalView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/common/ModalView.kt index d1ae502..fa4ffca 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/ModalView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/ModalView.kt @@ -1,4 +1,4 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.common import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalBottomSheet diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/PermissionDialog.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/PermissionDialog.kt similarity index 96% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/PermissionDialog.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/common/PermissionDialog.kt index 08b1c5b..7ce56cd 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/PermissionDialog.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/PermissionDialog.kt @@ -1,4 +1,4 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.common import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/common/TopAppBar.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/TopAppBar.kt new file mode 100644 index 0000000..87537e9 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/common/TopAppBar.kt @@ -0,0 +1,52 @@ +package com.example.notimanager.presentation.ui.component.common + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextOverflow +import com.example.notimanager.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainTopAppBar(settingOnClick: () -> Unit){ + // 언어 설정에 따라 문자열 리소스를 가져오기 + val context = LocalContext.current + val appName = context.getString(R.string.app_name) + + TopAppBar( + title = { + Text(text = appName) + }, + navigationIcon = { + IconButton(onClick = settingOnClick) { + Icon(Icons.Filled.Menu, contentDescription = "설정") + } + } + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun CommonTopAppBar(title: String, onBackClick: () -> Unit){ + TopAppBar( + title = { + Text( + text = title, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + }, + navigationIcon = { + IconButton(onClick = onBackClick) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "뒤로 가기") + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/FilteredListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/FilteredListItemView.kt similarity index 74% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/FilteredListView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/item/FilteredListItemView.kt index 794f0c7..56290f4 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/FilteredListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/FilteredListItemView.kt @@ -1,21 +1,16 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.item 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.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -27,32 +22,9 @@ 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 - -@Composable -fun FilteredListView( - innerPadding: PaddingValues, - viewModel: FilteredNotificationViewModel -) { - val filteredNotificationState by viewModel.filteredNotiState.observeAsState(FilteredNotificationState()) - if (filteredNotificationState.filteredList.isEmpty()){ - Text("No notifications") - } - else{ - LazyColumn( - Modifier - .fillMaxSize() - .padding(innerPadding) - ) { - - items(filteredNotificationState.filteredList) { item -> - FilteredItemView(item, viewModel) - } - } - } - -} +import com.example.notimanager.presentation.ui.component.common.BottomSheet +import com.example.notimanager.presentation.ui.component.common.ClickableTextView @Composable fun FilteredItemView( diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiAppListItemView.kt similarity index 72% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiAppListItemView.kt index 6fa279d..5e7b2d1 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationAppListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiAppListItemView.kt @@ -1,29 +1,23 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.item import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Star -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -38,83 +32,15 @@ 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 -import com.example.notimanager.presentation.stateholder.state.NotificationAppState import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppPriorityViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppViewModel - -@Composable -fun NotificationAppListView( - navController: NavController, - viewModel: NotificationAppViewModel, - priorityViewModel: NotificationAppPriorityViewModel -) { - val notificationAppState by viewModel.notificationAppState.observeAsState(NotificationAppState()) - val priorityState by priorityViewModel.notificationAppPriorityState.observeAsState((NotificationAppPriorityState())) - var currentNotiPriority by remember { mutableStateOf(priorityState.notificationAppList) } - var currentNoti by remember { mutableStateOf(notificationAppState.notificationAppList) } - - LaunchedEffect(priorityState.notificationAppList) { - 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( - Modifier.fillMaxSize() - ) { - items(currentNotiPriority) { notification -> - NotificationAppItemView( - notification = notification, - onClick = { - navController - .navigate( - "titleScreen/${notification.appName}" - ) - }, - viewModel = viewModel, - priorityViewModel = priorityViewModel - ) - } - if (currentNotiPriority.isNotEmpty()){ - item { - HorizontalDivider() - } - } - - - items(currentNoti) { notification -> - NotificationAppItemView( - notification = notification, - onClick = { - navController - .navigate( - "titleScreen/${notification.appName}" - ) - }, - viewModel = viewModel, - priorityViewModel = priorityViewModel - ) - } - } -} +import com.example.notimanager.presentation.ui.component.common.AppIconView +import com.example.notimanager.presentation.ui.component.common.BottomSheet +import com.example.notimanager.presentation.ui.component.common.ClickableTextView @Composable fun NotificationAppItemView( @@ -211,24 +137,6 @@ fun NotificationAppItemView( color = Color.Gray ) - // 상단 고정 여부 버튼 - if (notification.priorityActive) { - ClickableTextView(text = removePriority, onClick = { - priorityViewModel.removeAppPriority(notification.appName){ - viewModel.loadNotificationApps() - } - showModal = false - }) - } - else{ - ClickableTextView(text = addPriority, onClick = { - viewModel.setAppPriority(notification.appName, priorityViewModel.getLength()){ - priorityViewModel.loadNotificationAppPriority() - } - showModal = false - }) - } - // 삭제 버튼 ClickableTextView(text = delete, onClick = { viewModel.deleteNotificationApp(notification.appName){ @@ -237,7 +145,7 @@ fun NotificationAppItemView( showModal = false }) - // 수집 여부 버튼 + // 관리 여부 버튼 ClickableTextView(text = if (notification.filteredId == 0L) addFiltered else removeFiltered, onClick = { if (notification.filteredId == 0L) filteredNotificationViewModel.insertFilteredNoti(notification.appName, ""){ viewModel.loadNotificationApps() @@ -249,6 +157,24 @@ fun NotificationAppItemView( } showModal = false }) + + // 중요 알림 설정 + if (notification.priorityActive) { + ClickableTextView(text = removePriority, onClick = { + priorityViewModel.removeAppPriority(notification.appName){ + viewModel.loadNotificationApps() + } + showModal = false + }) + } + else{ + ClickableTextView(text = addPriority, onClick = { + viewModel.setAppPriority(notification.appName, priorityViewModel.getLength()){ + priorityViewModel.loadNotificationAppPriority() + } + showModal = false + }) + } } } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiListItemView.kt similarity index 74% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiListItemView.kt index 25cadbc..8d5e8a1 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiListItemView.kt @@ -1,17 +1,13 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.item import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -26,39 +22,9 @@ 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 - - -@Composable -fun NotificationListView( - notificationState: NotificationState, - onDelete: (Long) -> Unit - -) { - val context = LocalContext.current - var currentNoti by remember { mutableStateOf(notificationState.notificationList) } - - LaunchedEffect(notificationState.notificationList) { - if (!notificationState.isLoading) { - currentNoti = notificationState.notificationList - } - if (notificationState.notificationList.isEmpty()){ - currentNoti = emptyList() - } - } - - LazyColumn( - modifier = Modifier.fillMaxSize() - ) { - items(currentNoti) { notification -> - NotificationItemView (notification = notification, onClick = { - if (notification.intent?.action != null) - context.startActivity(notification.intent) }, - onDelete = onDelete - ) - } - } -} +import com.example.notimanager.presentation.ui.component.common.AppIconView +import com.example.notimanager.presentation.ui.component.common.BottomSheet +import com.example.notimanager.presentation.ui.component.common.ClickableTextView @Composable fun NotificationItemView( @@ -101,6 +67,7 @@ fun NotificationItemView( ) } + // 모달창 if (showModal) { BottomSheet(showModal, onDismiss = { showModal = false }){ Column( @@ -120,13 +87,15 @@ fun NotificationItemView( overflow = TextOverflow.Ellipsis, color = Color.Gray ) - ClickableTextView(text = moveToApp, onClick = { - onClick() + // 삭제 + ClickableTextView(text = delete, onClick = { + onDelete(notification.id) showModal = false }) - ClickableTextView(text = delete, onClick = { - onDelete(notification.id) + // 앱으로 이동하기 + ClickableTextView(text = moveToApp, onClick = { + onClick() showModal = false }) } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiTitleListItemView.kt similarity index 69% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiTitleListItemView.kt index b63be8b..240989f 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationTitleListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/item/NotiTitleListItemView.kt @@ -1,30 +1,24 @@ -package com.example.notimanager.presentation.ui.component +package com.example.notimanager.presentation.ui.component.item import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items 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.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -38,93 +32,15 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow 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 -import com.example.notimanager.presentation.stateholder.state.NotificationTitlePriorityState -import com.example.notimanager.presentation.stateholder.state.NotificationTitleState import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitlePriorityViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitleViewModel - -@Composable -fun NotificationTitleListView( - navController: NavController, - viewModel: NotificationTitleViewModel, - priorityViewModel: NotificationTitlePriorityViewModel -) { - val notificationTitleState by viewModel.notificationTitleState.observeAsState( - NotificationTitleState() - ) - val priorityState by priorityViewModel.notificationTitlePriorityState.observeAsState( - NotificationTitlePriorityState() - ) - var currentNotiPriority by remember { mutableStateOf(priorityState.notificationTitleList) } - var currentNoti by remember { mutableStateOf(notificationTitleState.notificationTitleList) } - - LaunchedEffect(priorityState.notificationTitleList) { - 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( - modifier = Modifier.fillMaxSize() - ) { - items(currentNotiPriority) { notification -> - NotificationTitleItemView(notification = notification, onClick = { - if (notification.subText == "") navController.navigate("notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}/False") - else navController.navigate("notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.subText)}/True") - - - }, viewModel = viewModel, priorityViewModel = priorityViewModel) - } - - if (currentNotiPriority.isNotEmpty()){ - item { - HorizontalDivider() - } - } - - items(currentNoti) { notification -> - NotificationTitleItemView(notification = notification, onClick = { - if (notification.subText == "") { - viewModel.updateAsRead(notification.title) - navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${ - getEncodedString( - notification.title - ) - }/False" - ) - } - else { - viewModel.updateAsSubText(notification.subText) - navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${ - getEncodedString( - notification.subText - ) - }/True" - ) - }}, viewModel = viewModel, priorityViewModel = priorityViewModel) - } - } -} +import com.example.notimanager.presentation.ui.component.common.AppIconView +import com.example.notimanager.presentation.ui.component.common.BottomSheet +import com.example.notimanager.presentation.ui.component.common.ClickableTextView @Composable fun NotificationTitleItemView( @@ -227,24 +143,6 @@ fun NotificationTitleItemView( color = Color.Gray ) - // 중요 알림 설정 버튼 - if (notification.priorityActive) { - ClickableTextView(text = removePriority, onClick = { - priorityViewModel.removeTitlePriority(notificationId = notification.id){ - viewModel.loadNotificationTitles() - } - showModal = false - }) - } - else{ - ClickableTextView(text = addPriority, onClick = { - viewModel.setTitlePriority(notification.id, priorityViewModel.getLength()){ - priorityViewModel.loadNotificationTitles() - } - showModal = false - }) - } - // 삭제 버튼 ClickableTextView(text = delete, onClick = { if (notification.subText == "") @@ -253,7 +151,7 @@ fun NotificationTitleItemView( viewModel.deleteBySubText(notification.subText) { priorityViewModel.loadNotificationTitles() } showModal = false }) - + // 특정 동작 완료 후 동작 val onComplete: () -> Unit = { viewModel.loadNotificationTitles() @@ -261,18 +159,18 @@ fun NotificationTitleItemView( } // 알림 관리하지 않기 버튼 - if(notification.filteredId == 0L) { + if(notification.filteredId == 0L) { // 관리 중 -> 관리 중 X ClickableTextView( text = addFiltered, onClick = { - if (notification.subText == "") { + if (notification.subText == "") { // subText가 제목인 경우 filteredNotificationViewModel.insertFilteredNoti( viewModel.getAppName(), notification.title, onComplete ) } - else{ + else{ // title이 제목인 경우 filteredNotificationViewModel.insertFilteredNoti( viewModel.getAppName(), notification.subText, @@ -282,7 +180,7 @@ fun NotificationTitleItemView( showModal = false } ) - } else{ + } else{ // 관리 중 X -> 관리 중 ClickableTextView( text = removeFiltered, onClick = { @@ -295,6 +193,24 @@ fun NotificationTitleItemView( } ) } + + // 중요 알림 설정 버튼 + if (notification.priorityActive) { // 중요 알림일 때 + ClickableTextView(text = removePriority, onClick = { + priorityViewModel.removeTitlePriority(notificationId = notification.id){ + viewModel.loadNotificationTitles() + } + showModal = false + }) + } + else{ // 중요 알림이 아닐 때 + ClickableTextView(text = addPriority, onClick = { + viewModel.setTitlePriority(notification.id, priorityViewModel.getLength()){ + priorityViewModel.loadNotificationTitles() + } + showModal = false + }) + } } } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/FilteredListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/FilteredListView.kt new file mode 100644 index 0000000..f2cd215 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/FilteredListView.kt @@ -0,0 +1,40 @@ +package com.example.notimanager.presentation.ui.component.list + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Modifier +import com.example.notimanager.presentation.stateholder.state.FilteredNotificationState +import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel +import com.example.notimanager.presentation.ui.component.item.FilteredItemView + +@Composable +fun FilteredListView( + innerPadding: PaddingValues, + viewModel: FilteredNotificationViewModel +) { + val filteredNotificationState by viewModel.filteredNotiState.observeAsState( + FilteredNotificationState() + ) + if (filteredNotificationState.filteredList.isEmpty()) { + Text("No notifications") + } else { + LazyColumn( + Modifier + .fillMaxSize() + .padding(innerPadding) + ) { + + items(filteredNotificationState.filteredList) { item -> + FilteredItemView(item, viewModel) + } + } + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000..03805a4 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt @@ -0,0 +1,88 @@ +package com.example.notimanager.presentation.ui.component.list + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.HorizontalDivider +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.navigation.NavController +import com.example.notimanager.presentation.stateholder.state.NotificationAppPriorityState +import com.example.notimanager.presentation.stateholder.state.NotificationAppState +import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppPriorityViewModel +import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppViewModel +import com.example.notimanager.presentation.ui.component.item.NotificationAppItemView + +@Composable +fun NotificationAppListView( + navController: NavController, + viewModel: NotificationAppViewModel, + priorityViewModel: NotificationAppPriorityViewModel +) { + val notificationAppState by viewModel.notificationAppState.observeAsState(NotificationAppState()) + val priorityState by priorityViewModel.notificationAppPriorityState.observeAsState((NotificationAppPriorityState())) + var currentNotiPriority by remember { mutableStateOf(priorityState.notificationAppList) } + var currentNoti by remember { mutableStateOf(notificationAppState.notificationAppList) } + + LaunchedEffect(priorityState.notificationAppList) { + 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( + Modifier.fillMaxSize() + ) { + items(currentNotiPriority) { notification -> + NotificationAppItemView( + notification = notification, + onClick = { + navController + .navigate( + "titleScreen/${notification.appName}" + ) + }, + viewModel = viewModel, + priorityViewModel = priorityViewModel + ) + } + if (currentNotiPriority.isNotEmpty()){ + item { + HorizontalDivider() + } + } + + + items(currentNoti) { notification -> + NotificationAppItemView( + notification = notification, + onClick = { + navController + .navigate( + "titleScreen/${notification.appName}" + ) + }, + viewModel = viewModel, + priorityViewModel = priorityViewModel + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationListView.kt new file mode 100644 index 0000000..39b5a31 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationListView.kt @@ -0,0 +1,47 @@ +package com.example.notimanager.presentation.ui.component.list + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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 com.example.notimanager.presentation.stateholder.state.NotificationState +import com.example.notimanager.presentation.ui.component.item.NotificationItemView + + +@Composable +fun NotificationListView( + notificationState: NotificationState, + onDelete: (Long) -> Unit + +) { + val context = LocalContext.current + var currentNoti by remember { mutableStateOf(notificationState.notificationList) } + + LaunchedEffect(notificationState.notificationList) { + if (!notificationState.isLoading) { + currentNoti = notificationState.notificationList + } + if (notificationState.notificationList.isEmpty()){ + currentNoti = emptyList() + } + } + + LazyColumn( + modifier = Modifier.fillMaxSize() + ) { + items(currentNoti) { notification -> + NotificationItemView (notification = notification, onClick = { + if (notification.intent?.action != null) + context.startActivity(notification.intent) }, + onDelete = onDelete + ) + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..539fa0a --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt @@ -0,0 +1,96 @@ +package com.example.notimanager.presentation.ui.component.list + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.HorizontalDivider +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.navigation.NavController +import com.example.notimanager.common.objects.Encoder.getEncodedString +import com.example.notimanager.presentation.stateholder.state.NotificationTitlePriorityState +import com.example.notimanager.presentation.stateholder.state.NotificationTitleState +import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitlePriorityViewModel +import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitleViewModel +import com.example.notimanager.presentation.ui.component.item.NotificationTitleItemView + +@Composable +fun NotificationTitleListView( + navController: NavController, + viewModel: NotificationTitleViewModel, + priorityViewModel: NotificationTitlePriorityViewModel +) { + val notificationTitleState by viewModel.notificationTitleState.observeAsState( + NotificationTitleState() + ) + val priorityState by priorityViewModel.notificationTitlePriorityState.observeAsState( + NotificationTitlePriorityState() + ) + var currentNotiPriority by remember { mutableStateOf(priorityState.notificationTitleList) } + var currentNoti by remember { mutableStateOf(notificationTitleState.notificationTitleList) } + + LaunchedEffect(priorityState.notificationTitleList) { + 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( + modifier = Modifier.fillMaxSize() + ) { + items(currentNotiPriority) { notification -> + NotificationTitleItemView(notification = notification, onClick = { + if (notification.subText == "") navController.navigate("notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}/False") + else navController.navigate("notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.subText)}/True") + }, viewModel = viewModel, priorityViewModel = priorityViewModel) + } + + if (currentNotiPriority.isNotEmpty()){ + item { + HorizontalDivider() + } + } + + items(currentNoti) { notification -> + NotificationTitleItemView(notification = notification, onClick = { + if (notification.subText == "") { + viewModel.updateAsRead(notification.title) + navController.navigate( + "notificationScreen/${viewModel.getAppName()}/${ + getEncodedString( + notification.title + ) + }/False" + ) + } + else { + viewModel.updateAsSubText(notification.subText) + navController.navigate( + "notificationScreen/${viewModel.getAppName()}/${ + getEncodedString( + notification.subText + ) + }/True" + ) + }}, viewModel = viewModel, priorityViewModel = priorityViewModel) + } + } +} \ 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 index 00fd9f8..d2c9e8e 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 @@ -5,18 +5,24 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import com.example.notimanager.R +import com.example.notimanager.presentation.ui.component.common.CommonTopAppBar import com.example.notimanager.presentation.ui.component.DateFormatterView -import com.example.notimanager.presentation.ui.component.SettingTopAppBar @Composable fun DateFormatterScreen( navController: NavController, ) { + // 언어 설정에 따라 문자열 리소스를 가져오기 + val context = LocalContext.current + val title = context.getString(R.string.setting_date_format) + Scaffold( topBar = { - SettingTopAppBar{ navController.popBackStack() } + CommonTopAppBar(title){ 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 c1b708b..ecef73a 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 @@ -5,22 +5,27 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext 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.presentation.stateholder.viewmodel.FilteredNotificationViewModel -import com.example.notimanager.presentation.ui.component.FilteredListView -import com.example.notimanager.presentation.ui.component.FilteredTopAppBar - +import com.example.notimanager.presentation.ui.component.common.CommonTopAppBar +import com.example.notimanager.presentation.ui.component.list.FilteredListView @Composable fun FilteredListScreen( navController: NavController, viewModel: FilteredNotificationViewModel = hiltViewModel() ) { + // 언어 설정에 따라 문자열 리소스를 가져오기 + val context = LocalContext.current + val title = context.getString(R.string.setting_filtered_list) + Scaffold( topBar = { - FilteredTopAppBar{ navController.popBackStack() } + CommonTopAppBar(title = title, onBackClick = { 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 28cde25..45e08a6 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 @@ -20,9 +20,9 @@ import androidx.lifecycle.compose.LifecycleEventEffect import androidx.navigation.NavController import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppPriorityViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppViewModel -import com.example.notimanager.presentation.ui.component.MainTopAppBar -import com.example.notimanager.presentation.ui.component.NotificationAppListView -import com.example.notimanager.presentation.ui.component.PermissionCheck +import com.example.notimanager.presentation.ui.component.common.MainTopAppBar +import com.example.notimanager.presentation.ui.component.list.NotificationAppListView +import com.example.notimanager.presentation.ui.component.common.PermissionCheck import kotlinx.coroutines.delay import kotlinx.coroutines.launch 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 88be77d..f26a1a3 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 @@ -16,12 +16,11 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import com.example.notimanager.presentation.stateholder.state.NotificationState import com.example.notimanager.presentation.stateholder.viewmodel.NotificationViewModel -import com.example.notimanager.presentation.ui.component.NotificationListView -import com.example.notimanager.presentation.ui.component.NotificationTopAppBar +import com.example.notimanager.presentation.ui.component.common.CommonTopAppBar +import com.example.notimanager.presentation.ui.component.list.NotificationListView import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -47,7 +46,7 @@ fun NotificationScreen(navController: NavController, appName: String = "", title } Scaffold( topBar = { - NotificationTopAppBar(title = title, onBackClick = { navController.popBackStack() }) + CommonTopAppBar(title = title, onBackClick = { 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 d3c20df..3ad6ceb 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 @@ -19,8 +19,8 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import com.example.notimanager.presentation.stateholder.state.NotificationState import com.example.notimanager.presentation.stateholder.viewmodel.NotificationSubTextViewModel -import com.example.notimanager.presentation.ui.component.NotificationListView -import com.example.notimanager.presentation.ui.component.NotificationTopAppBar +import com.example.notimanager.presentation.ui.component.common.CommonTopAppBar +import com.example.notimanager.presentation.ui.component.list.NotificationListView import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -46,7 +46,7 @@ fun NotificationSubScreen(navController: NavController, appName: String = "", su } Scaffold( topBar = { - NotificationTopAppBar(title = subText, onBackClick = { navController.popBackStack() }) + CommonTopAppBar(title = subText, onBackClick = { 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 4479a24..ce3e9c5 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 @@ -5,18 +5,24 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import com.example.notimanager.presentation.ui.component.SettingTopAppBar +import com.example.notimanager.R +import com.example.notimanager.presentation.ui.component.common.CommonTopAppBar import com.example.notimanager.presentation.ui.component.SettingView @Composable fun SettingScreen( navController: NavController, ) { + // 언어 설정에 따라 문자열 리소스를 가져오기 + val context = LocalContext.current + val title = context.getString(R.string.setting_name) + Scaffold( topBar = { - SettingTopAppBar{ navController.popBackStack() } + CommonTopAppBar(title){ 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 2435687..1407793 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 @@ -20,8 +20,8 @@ import androidx.lifecycle.compose.LifecycleEventEffect import androidx.navigation.NavController import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitlePriorityViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitleViewModel -import com.example.notimanager.presentation.ui.component.NotificationTitleListView -import com.example.notimanager.presentation.ui.component.TitleTopAppBar +import com.example.notimanager.presentation.ui.component.list.NotificationTitleListView +import com.example.notimanager.presentation.ui.component.common.CommonTopAppBar import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -46,7 +46,7 @@ fun TitleScreen(navController: NavController, appName: String = ""){ Scaffold( topBar = { - TitleTopAppBar(title = appName, onBackClick = { navController.popBackStack() }) + CommonTopAppBar(title = appName, onBackClick = { navController.popBackStack() }) } ) { innerPadding -> HorizontalDivider( From ccef5f0c618882e198d0c74dc218932686283e8f Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 10:59:05 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20=EB=AA=A8=EB=8B=AC=EC=B0=BD=20B?= =?UTF-8?q?ox=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 모달창에 공통적으로 활용되는 Box 컴포넌트들을 각각 하나의 Composable로 묶어 관리하도록 함. 이를 통해 modal 상자 변화를 중앙 관리할 수 있게 되었음. --- .../presentation/ui/component/SettingView.kt | 18 ++-- .../ui/component/{common => box}/BoxView.kt | 22 +++-- .../ui/component/box/DeleteBox.kt | 12 +++ .../ui/component/box/FilteredBox.kt | 19 +++++ .../ui/component/box/MoveToAppBox.kt | 12 +++ .../ui/component/box/PrioirityBox.kt | 19 +++++ .../ui/component/item/FilteredListItemView.kt | 11 +-- .../ui/component/item/NotiAppListItemView.kt | 76 +++++++---------- .../ui/component/item/NotiListItemView.kt | 17 ++-- .../component/item/NotiTitleListItemView.kt | 83 ++++++++----------- 10 files changed, 162 insertions(+), 127 deletions(-) rename app/src/main/java/com/example/notimanager/presentation/ui/component/{common => box}/BoxView.kt (54%) create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt 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 93867f3..56fca71 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.common.ClickableTextView +import com.example.notimanager.presentation.ui.component.box.ClickableTextView @Composable fun SettingView( @@ -34,23 +34,23 @@ fun SettingView( .padding(innerPadding) ) { // 받지 않는 알림 목록 - ClickableTextView(filteredList) { - navController.navigate("FilteredListScreen") + ClickableTextView(filteredList, onClick = {navController.navigate("FilteredListScreen")}) { + } // 알림 접근 권한 - ClickableTextView(accessPermission) { - servicePermissionViewModel.requestServicePermission() + ClickableTextView(accessPermission, onClick = {servicePermissionViewModel.requestServicePermission()}) { + } // 알림 발송 권한 - ClickableTextView(sendPermission) { - notificationPermissionViewModel.requestPermission(context as Activity) + ClickableTextView(sendPermission, onClick = {notificationPermissionViewModel.requestPermission(context as Activity)}) { + } // 시간 형식 변경 - ClickableTextView(dateFormatter) { - navController.navigate("DateFormatterScreen") + ClickableTextView(dateFormatter, onClick = {navController.navigate("DateFormatterScreen")}) { + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/common/BoxView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/BoxView.kt similarity index 54% rename from app/src/main/java/com/example/notimanager/presentation/ui/component/common/BoxView.kt rename to app/src/main/java/com/example/notimanager/presentation/ui/component/box/BoxView.kt index f76eb59..30c8ced 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/common/BoxView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/BoxView.kt @@ -1,26 +1,36 @@ -package com.example.notimanager.presentation.ui.component.common +package com.example.notimanager.presentation.ui.component.box import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable -fun ClickableTextView(text: String, onClick: () -> Unit) { +fun ClickableTextView( + text: String, + onClick: () -> Unit, + icon: @Composable (() -> Unit)? = null +) { Box( modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) .padding(16.dp) ) { - Text( - text = text, - style = MaterialTheme.typography.bodyMedium - ) + Row(verticalAlignment = Alignment.CenterVertically) { + icon?.invoke() + Text( + text = text, + style = MaterialTheme.typography.bodyMedium + ) + } + } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt new file mode 100644 index 0000000..b9148e7 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt @@ -0,0 +1,12 @@ +package com.example.notimanager.presentation.ui.component.box + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import com.example.notimanager.R + +@Composable +fun DeleteBox(onClick: () -> Unit){ + val context = LocalContext.current + val delete = context.getString(R.string.modal_delete) + ClickableTextView(text = delete, onClick = onClick, ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt new file mode 100644 index 0000000..95786d3 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt @@ -0,0 +1,19 @@ +package com.example.notimanager.presentation.ui.component.box + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import com.example.notimanager.R + +@Composable +fun AddFilteredBox(onClick: () -> Unit){ + val context = LocalContext.current + val addFiltered = context.getString(R.string.modal_add_filtered) + ClickableTextView(text = addFiltered, onClick = onClick, ) +} + +@Composable +fun RemoveFilteredBox(onClick: () -> Unit){ + val context = LocalContext.current + val removeFiltered = context.getString(R.string.modal_remove_filtered) + ClickableTextView(text = removeFiltered, onClick = onClick, ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt new file mode 100644 index 0000000..8387b10 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt @@ -0,0 +1,12 @@ +package com.example.notimanager.presentation.ui.component.box + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import com.example.notimanager.R + +@Composable +fun MoveToAppBox(onClick: () -> Unit){ + val context = LocalContext.current + val moveToApp = context.getString(R.string.modal_move_to_app) + ClickableTextView(text = moveToApp, onClick = onClick, ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt new file mode 100644 index 0000000..cab5d0b --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt @@ -0,0 +1,19 @@ +package com.example.notimanager.presentation.ui.component.box + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import com.example.notimanager.R + +@Composable +fun AddPriorityBox(onClick: () -> Unit){ + val context = LocalContext.current + val addPriority = context.getString(R.string.modal_add_priority) + ClickableTextView(text = addPriority, onClick = onClick, ) +} + +@Composable +fun RemovePriorityBox(onClick: () -> Unit){ + val context = LocalContext.current + val removePriority = context.getString(R.string.modal_remove_priority) + ClickableTextView(text = removePriority, onClick = onClick, ) +} \ 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 56290f4..fa9a748 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 @@ -24,17 +24,14 @@ import com.example.notimanager.R import com.example.notimanager.domain.model.FilteredNotification import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel import com.example.notimanager.presentation.ui.component.common.BottomSheet -import com.example.notimanager.presentation.ui.component.common.ClickableTextView +import com.example.notimanager.presentation.ui.component.box.ClickableTextView +import com.example.notimanager.presentation.ui.component.box.RemoveFilteredBox @Composable 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( @@ -73,12 +70,12 @@ fun FilteredItemView( color = Color.Gray ) - ClickableTextView(text = removeFiltered, onClick = { + RemoveFilteredBox { viewModel.deleteFilteredNoti(filteredItem.id){ viewModel.loadFilteredNoti() } showModal = false - }) + } } } } 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 5e7b2d1..585f148 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 @@ -29,7 +29,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource 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 com.example.notimanager.R @@ -38,9 +37,13 @@ import com.example.notimanager.domain.model.NotificationApp import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppPriorityViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppViewModel +import com.example.notimanager.presentation.ui.component.box.AddFilteredBox +import com.example.notimanager.presentation.ui.component.box.AddPriorityBox +import com.example.notimanager.presentation.ui.component.box.DeleteBox +import com.example.notimanager.presentation.ui.component.box.RemoveFilteredBox +import com.example.notimanager.presentation.ui.component.box.RemovePriorityBox import com.example.notimanager.presentation.ui.component.common.AppIconView import com.example.notimanager.presentation.ui.component.common.BottomSheet -import com.example.notimanager.presentation.ui.component.common.ClickableTextView @Composable fun NotificationAppItemView( @@ -50,15 +53,7 @@ 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( @@ -138,65 +133,50 @@ fun NotificationAppItemView( ) // 삭제 버튼 - ClickableTextView(text = delete, onClick = { + DeleteBox { viewModel.deleteNotificationApp(notification.appName){ priorityViewModel.loadNotificationAppPriority() } showModal = false - }) + } // 관리 여부 버튼 - ClickableTextView(text = if (notification.filteredId == 0L) addFiltered else removeFiltered, onClick = { - if (notification.filteredId == 0L) filteredNotificationViewModel.insertFilteredNoti(notification.appName, ""){ - viewModel.loadNotificationApps() - priorityViewModel.loadNotificationAppPriority() + if (notification.filteredId == 0L){ + AddFilteredBox { + filteredNotificationViewModel.insertFilteredNoti(notification.appName, ""){ + viewModel.loadNotificationApps() + priorityViewModel.loadNotificationAppPriority() + } + showModal = false } - else filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId){ - viewModel.loadNotificationApps() - priorityViewModel.loadNotificationAppPriority() + } + else { + RemoveFilteredBox { + filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId) { + viewModel.loadNotificationApps() + priorityViewModel.loadNotificationAppPriority() + } + showModal = false } - showModal = false - }) - + } // 중요 알림 설정 if (notification.priorityActive) { - ClickableTextView(text = removePriority, onClick = { + RemovePriorityBox { priorityViewModel.removeAppPriority(notification.appName){ viewModel.loadNotificationApps() } showModal = false - }) + } } else{ - ClickableTextView(text = addPriority, onClick = { + AddPriorityBox { viewModel.setAppPriority(notification.appName, priorityViewModel.getLength()){ priorityViewModel.loadNotificationAppPriority() } showModal = false - }) + } } } } } -} - -@Composable -@Preview -fun PreviewNotificationAppItemView(){ - MaterialTheme{ - NotificationAppItemView( - notification = NotificationApp( - appName = "appName", - title = "title", - content = "content", - timestamp = 1234567890, - appIcon = null, - priorityActive = false, - priority = 0, - filteredId = 0L - ), onClick = {}, - viewModel = hiltViewModel(), - priorityViewModel = hiltViewModel() - ) - } -} +} \ No newline at end of file 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 8d5e8a1..c0a0535 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 @@ -19,12 +19,12 @@ 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.ui.component.box.DeleteBox +import com.example.notimanager.presentation.ui.component.box.MoveToAppBox import com.example.notimanager.presentation.ui.component.common.AppIconView import com.example.notimanager.presentation.ui.component.common.BottomSheet -import com.example.notimanager.presentation.ui.component.common.ClickableTextView @Composable fun NotificationItemView( @@ -32,11 +32,7 @@ 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( @@ -87,17 +83,18 @@ fun NotificationItemView( overflow = TextOverflow.Ellipsis, color = Color.Gray ) + // 삭제 - ClickableTextView(text = delete, onClick = { + DeleteBox { onDelete(notification.id) showModal = false - }) + } // 앱으로 이동하기 - ClickableTextView(text = moveToApp, onClick = { + MoveToAppBox { onClick() 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 240989f..1161896 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 @@ -38,9 +38,13 @@ import com.example.notimanager.domain.model.NotificationTitle import com.example.notimanager.presentation.stateholder.viewmodel.FilteredNotificationViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitlePriorityViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitleViewModel +import com.example.notimanager.presentation.ui.component.box.AddFilteredBox +import com.example.notimanager.presentation.ui.component.box.AddPriorityBox import com.example.notimanager.presentation.ui.component.common.AppIconView import com.example.notimanager.presentation.ui.component.common.BottomSheet -import com.example.notimanager.presentation.ui.component.common.ClickableTextView +import com.example.notimanager.presentation.ui.component.box.DeleteBox +import com.example.notimanager.presentation.ui.component.box.RemoveFilteredBox +import com.example.notimanager.presentation.ui.component.box.RemovePriorityBox @Composable fun NotificationTitleItemView( @@ -50,15 +54,7 @@ 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 @@ -144,13 +140,13 @@ fun NotificationTitleItemView( ) // 삭제 버튼 - ClickableTextView(text = delete, onClick = { + DeleteBox { if (notification.subText == "") viewModel.deleteByTitle(notification.title) { priorityViewModel.loadNotificationTitles() } else viewModel.deleteBySubText(notification.subText) { priorityViewModel.loadNotificationTitles() } showModal = false - }) + } // 특정 동작 완료 후 동작 val onComplete: () -> Unit = { @@ -160,56 +156,49 @@ fun NotificationTitleItemView( // 알림 관리하지 않기 버튼 if(notification.filteredId == 0L) { // 관리 중 -> 관리 중 X - ClickableTextView( - text = addFiltered, - onClick = { - if (notification.subText == "") { // subText가 제목인 경우 - filteredNotificationViewModel.insertFilteredNoti( - viewModel.getAppName(), - notification.title, - onComplete - ) - } - else{ // title이 제목인 경우 - filteredNotificationViewModel.insertFilteredNoti( - viewModel.getAppName(), - notification.subText, - onComplete - ) - } - showModal = false + AddFilteredBox { + if (notification.subText == "") { // subText가 제목인 경우 + filteredNotificationViewModel.insertFilteredNoti( + viewModel.getAppName(), + notification.title, + onComplete + ) } - ) - } else{ // 관리 중 X -> 관리 중 - ClickableTextView( - text = removeFiltered, - onClick = { - if (notification.subText == "") - filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId, onComplete) - - else - filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId, onComplete) - showModal = false + else{ // title이 제목인 경우 + filteredNotificationViewModel.insertFilteredNoti( + viewModel.getAppName(), + notification.subText, + onComplete + ) } - ) + showModal = false + } + } else{ // 관리 중 X -> 관리 중 + RemoveFilteredBox { + if (notification.subText == "") + filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId, onComplete) + else + filteredNotificationViewModel.deleteFilteredNoti(notification.filteredId, onComplete) + showModal = false + } } // 중요 알림 설정 버튼 if (notification.priorityActive) { // 중요 알림일 때 - ClickableTextView(text = removePriority, onClick = { + RemovePriorityBox { priorityViewModel.removeTitlePriority(notificationId = notification.id){ - viewModel.loadNotificationTitles() - } + viewModel.loadNotificationTitles() + } showModal = false - }) + } } else{ // 중요 알림이 아닐 때 - ClickableTextView(text = addPriority, onClick = { + AddPriorityBox { viewModel.setTitlePriority(notification.id, priorityViewModel.getLength()){ priorityViewModel.loadNotificationTitles() } showModal = false - }) + } } } } From d08355797973cbf1f265b54811f40c045e6b5bef Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 11:27:11 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=EB=AA=A8=EB=8B=AC=20=EC=B0=BD=20?= =?UTF-8?q?=EC=83=81=EC=9E=90=EC=97=90=20=EC=A0=81=EC=A0=88=ED=95=9C=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 모달창 각 행동에 맞는 아이콘을 텍스트 왼쪽에 놓아둠. --- .../presentation/ui/component/box/BoxView.kt | 9 ++++-- .../ui/component/box/DeleteBox.kt | 16 ++++++++++- .../ui/component/box/FilteredBox.kt | 25 +++++++++++++++-- .../ui/component/box/MoveToAppBox.kt | 16 ++++++++++- .../ui/component/box/PrioirityBox.kt | 28 +++++++++++++++++-- app/src/main/res/drawable/delete.xml | 9 ++++++ app/src/main/res/drawable/input.xml | 5 ++++ app/src/main/res/drawable/notifications.xml | 5 ++++ app/src/main/res/drawable/star.xml | 9 ++++++ 9 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable/delete.xml create mode 100644 app/src/main/res/drawable/input.xml create mode 100644 app/src/main/res/drawable/notifications.xml create mode 100644 app/src/main/res/drawable/star.xml 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 30c8ced..8a489a9 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 @@ -3,8 +3,10 @@ package com.example.notimanager.presentation.ui.component.box import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -22,15 +24,16 @@ fun ClickableTextView( modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) - .padding(16.dp) + .padding(8.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { icon?.invoke() + if(icon != null) Spacer(modifier = Modifier.width(16.dp)) Text( text = text, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.align(Alignment.CenterVertically) ) } - } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt index b9148e7..a309d7e 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/DeleteBox.kt @@ -1,12 +1,26 @@ package com.example.notimanager.presentation.ui.component.box +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp import com.example.notimanager.R @Composable fun DeleteBox(onClick: () -> Unit){ val context = LocalContext.current val delete = context.getString(R.string.modal_delete) - ClickableTextView(text = delete, onClick = onClick, ) + ClickableTextView(text = delete, onClick = onClick) { + Image( + painter = painterResource(id = R.drawable.delete), + contentDescription = "delete icon", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.Gray) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt index 95786d3..dc19d21 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/FilteredBox.kt @@ -1,19 +1,40 @@ package com.example.notimanager.presentation.ui.component.box +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp import com.example.notimanager.R @Composable fun AddFilteredBox(onClick: () -> Unit){ val context = LocalContext.current val addFiltered = context.getString(R.string.modal_add_filtered) - ClickableTextView(text = addFiltered, onClick = onClick, ) + ClickableTextView(text = addFiltered, onClick = onClick){ + Image( + painter = painterResource(id = R.drawable.notifications_off), + contentDescription = "notifications off icon", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.Gray) + ) + } } @Composable fun RemoveFilteredBox(onClick: () -> Unit){ val context = LocalContext.current val removeFiltered = context.getString(R.string.modal_remove_filtered) - ClickableTextView(text = removeFiltered, onClick = onClick, ) + ClickableTextView(text = removeFiltered, onClick = onClick){ + Image( + painter = painterResource(id = R.drawable.notifications), + contentDescription = "notifications icon", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.Gray) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt index 8387b10..cf1732c 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/MoveToAppBox.kt @@ -1,12 +1,26 @@ package com.example.notimanager.presentation.ui.component.box +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp import com.example.notimanager.R @Composable fun MoveToAppBox(onClick: () -> Unit){ val context = LocalContext.current val moveToApp = context.getString(R.string.modal_move_to_app) - ClickableTextView(text = moveToApp, onClick = onClick, ) + ClickableTextView(text = moveToApp, onClick = onClick){ + Image( + painter = painterResource(id = R.drawable.input), + contentDescription = "moveToApp icon", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.Gray) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt index cab5d0b..e96ef45 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/box/PrioirityBox.kt @@ -1,19 +1,43 @@ package com.example.notimanager.presentation.ui.component.box +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.Icon import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp import com.example.notimanager.R @Composable fun AddPriorityBox(onClick: () -> Unit){ val context = LocalContext.current val addPriority = context.getString(R.string.modal_add_priority) - ClickableTextView(text = addPriority, onClick = onClick, ) + ClickableTextView(text = addPriority, onClick = onClick){ + Icon( + imageVector = Icons.Filled.Star, + contentDescription = "filled star icon", + modifier = Modifier.size(24.dp), + tint = Color.Gray + ) + } } @Composable fun RemovePriorityBox(onClick: () -> Unit){ val context = LocalContext.current val removePriority = context.getString(R.string.modal_remove_priority) - ClickableTextView(text = removePriority, onClick = onClick, ) + ClickableTextView(text = removePriority, onClick = onClick){ + Image( + painter = painterResource(id = R.drawable.star), + contentDescription = "star icon", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.Gray) + ) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/delete.xml b/app/src/main/res/drawable/delete.xml new file mode 100644 index 0000000..f32818a --- /dev/null +++ b/app/src/main/res/drawable/delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/input.xml b/app/src/main/res/drawable/input.xml new file mode 100644 index 0000000..53cf620 --- /dev/null +++ b/app/src/main/res/drawable/input.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/notifications.xml b/app/src/main/res/drawable/notifications.xml new file mode 100644 index 0000000..3da0d5f --- /dev/null +++ b/app/src/main/res/drawable/notifications.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/star.xml b/app/src/main/res/drawable/star.xml new file mode 100644 index 0000000..07bcd69 --- /dev/null +++ b/app/src/main/res/drawable/star.xml @@ -0,0 +1,9 @@ + + + From 9a6c9c6789410464e55927e6172d3b1e3acaeb59 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 8 Mar 2025 11:29:55 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20=EB=B0=95=EC=8A=A4=20UI=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 패딩을 줄이니 너무 답답해 보여서 원래대로 수정. --- .../notimanager/presentation/ui/component/box/BoxView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8a489a9..dcbcf5f 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 @@ -24,7 +24,7 @@ fun ClickableTextView( modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) - .padding(8.dp) + .padding(16.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { icon?.invoke()