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()