From c9794739c28c1b1e276cae9e0c38201c54c57366 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Fri, 14 Mar 2025 19:37:59 +0900 Subject: [PATCH 1/5] =?UTF-8?q?build:=20=EC=B6=9C=EC=8B=9C=20=EC=A0=84=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EB=84=98=EB=B2=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.0.0 --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c2fee4c..5e87546 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,10 +14,10 @@ android { defaultConfig { applicationId = "com.example.notimanager" - minSdk = 28 + minSdk = 26 targetSdk = 35 versionCode = 1 - versionName = "1.0" + versionName = "1.0.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" resValue("string", "admob_app_id", System.getenv("ADMOB_APP_ID") ?: "") resValue("string", "admob_banner_id", System.getenv("ADMOB_BANNER_ID") ?: "") From 139500fbfd01aae1dff06276ed5aa361a65ae116 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Fri, 14 Mar 2025 19:37:38 +0900 Subject: [PATCH 2/5] =?UTF-8?q?chore:=20=EA=B4=91=EA=B3=A0=20=ED=82=A4=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 시크릿키로 등록하니 제대로 찾지 못해서 하드코딩으로 주입. --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/example/notimanager/presentation/ui/ads/AdSize.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3145652..9d98232 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,7 +19,7 @@ tools:targetApi="35"> + android:value="ca-app-pub-4472438519886520~1562656818"/> Date: Fri, 14 Mar 2025 19:37:01 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=EB=A7=88=EC=A7=80=EB=A7=89=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20?= =?UTF-8?q?=EC=9E=88=EB=8D=98=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 앱, 제목 리스트에서 마지막 아이템을 삭제했을 경우, 삭제는 정상적으로 되지만, UI 상으로 사라지지 않고 남던 현상 수정. --- .../component/list/NotificationAppListView.kt | 47 +++++++------- .../list/NotificationTitleListView.kt | 64 ++++++++++--------- .../presentation/ui/screen/TitleScreen.kt | 19 +++--- 3 files changed, 66 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt index 472c5a2..e6afdd3 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationAppListView.kt @@ -1,7 +1,6 @@ package com.example.notimanager.presentation.ui.component.list import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -15,7 +14,6 @@ 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.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -34,7 +32,7 @@ import com.example.notimanager.presentation.ui.component.item.NotificationAppIte fun NotificationAppListView( navController: NavController, viewModel: NotificationAppViewModel, - priorityViewModel: NotificationAppPriorityViewModel + priorityViewModel: NotificationAppPriorityViewModel, ) { val notificationAppState by viewModel.notificationAppState.observeAsState(NotificationAppState()) val priorityState by priorityViewModel.notificationAppPriorityState.observeAsState((NotificationAppPriorityState())) @@ -63,31 +61,32 @@ fun NotificationAppListView( .fillMaxSize() .padding(bottom = 56.dp) // AndroidView의 높이만큼 패딩 추가 ) { - items(currentNotiPriority) { notification -> - NotificationAppItemView( - notification = notification, - onClick = { - navController.navigate("titleScreen/${notification.appName}") - }, - viewModel = viewModel, - priorityViewModel = priorityViewModel - ) - } - if (currentNotiPriority.isNotEmpty()) { + if(currentNotiPriority.isNotEmpty()){ + items(currentNotiPriority) { notification -> + NotificationAppItemView( + notification = notification, + onClick = { + navController.navigate("titleScreen/${notification.appName}") + }, + viewModel = viewModel, + priorityViewModel = priorityViewModel + ) + } item { HorizontalDivider() } } - - items(currentNoti) { notification -> - NotificationAppItemView( - notification = notification, - onClick = { - navController.navigate("titleScreen/${notification.appName}") - }, - viewModel = viewModel, - priorityViewModel = priorityViewModel - ) + if (currentNoti.isNotEmpty()){ + items(currentNoti) { notification -> + NotificationAppItemView( + notification = notification, + onClick = { + navController.navigate("titleScreen/${notification.appName}") + }, + viewModel = viewModel, + priorityViewModel = priorityViewModel + ) + } } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt index eaf7074..5479714 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/component/list/NotificationTitleListView.kt @@ -33,7 +33,7 @@ import com.example.notimanager.presentation.ui.component.item.NotificationTitleI fun NotificationTitleListView( navController: NavController, viewModel: NotificationTitleViewModel, - priorityViewModel: NotificationTitlePriorityViewModel + priorityViewModel: NotificationTitlePriorityViewModel, ) { val notificationTitleState by viewModel.notificationTitleState.observeAsState( NotificationTitleState() @@ -63,42 +63,44 @@ fun NotificationTitleListView( LazyColumn( modifier = Modifier.fillMaxSize().padding(bottom = 56.dp) ) { - 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()){ + 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) + if(currentNoti.isNotEmpty()){ + 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) + } } + } AndroidView( 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 c1be346..92c9ae9 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 @@ -35,6 +35,15 @@ fun TitleScreen(navController: NavController, appName: String = ""){ val coroutineScope = rememberCoroutineScope() var isClicked by remember { mutableStateOf(false) } + val onRefresh: () -> Unit = { + isRefreshing = true + viewModel.loadNotificationTitles() + priorityViewModel.loadNotificationTitles() + coroutineScope.launch { + delay(500) + isRefreshing = false + } + } LaunchedEffect(appName) { viewModel.setArgs(appName) @@ -65,15 +74,7 @@ fun TitleScreen(navController: NavController, appName: String = ""){ PullToRefreshBox( isRefreshing = isRefreshing, - onRefresh = { - isRefreshing = true - viewModel.loadNotificationTitles() - priorityViewModel.loadNotificationTitles() - coroutineScope.launch { - delay(500) - isRefreshing = false - } - }, + onRefresh = onRefresh, modifier = Modifier.padding(innerPadding) ) { NotificationTitleListView(navController, viewModel, priorityViewModel) From 4ce6e2f967a7b4acf63efe5ed8bab6b9df9ce73c Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:00:03 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=EA=B8=B0=EB=B3=B8=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=83=81=ED=83=9C=EB=B0=94=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 중요 알림이 아닌 알림을 수집했을 경우 통합해서 새로운 알림이 있다고만 알려주도록 설정. --- .../domain/service/ForegroundNotiService.kt | 4 ++-- .../domain/service/NotiListenerService.kt | 13 ++++++++++++- app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/domain/service/ForegroundNotiService.kt b/app/src/main/java/com/example/notimanager/domain/service/ForegroundNotiService.kt index 97689bf..390f1a5 100644 --- a/app/src/main/java/com/example/notimanager/domain/service/ForegroundNotiService.kt +++ b/app/src/main/java/com/example/notimanager/domain/service/ForegroundNotiService.kt @@ -29,7 +29,7 @@ class ForegroundNotiService: Service() { val appName = intent?.extras?.getString("appName") ?: "" val content = intent?.extras?.getString("content") ?: "" - val isGroupSummary = intent?.extras?.getBoolean("isGroupSummary") ?: false + val isGroupSummary = intent?.extras?.getBoolean("isGroupSummary") == true putNotification(appName, content, isGroupSummary) return START_STICKY @@ -48,7 +48,7 @@ class ForegroundNotiService: Service() { appName: String, content: String, isGroupSummary: Boolean) { - val appContent = if (isGroupSummary) content else getString(R.string.status_app_content, content) + val appContent = content val notificationIntent = Intent(this, MainActivity::class.java).apply { putExtra("appName", appName) diff --git a/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt b/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt index d431394..554fabd 100644 --- a/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt +++ b/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.graphics.drawable.Icon import android.service.notification.NotificationListenerService import android.service.notification.StatusBarNotification +import com.example.notimanager.R import com.example.notimanager.data.model.AppIconModel import com.example.notimanager.data.model.NotificationIconModel import com.example.notimanager.data.model.NotificationMetaModel @@ -128,7 +129,17 @@ class NotiListenerService: NotificationListenerService() { if (count != 0){ val serviceIntent = Intent(this, ForegroundNotiService::class.java).apply { putExtra("appName", appName) - putExtra("content", count.toString()) + putExtra("content", getString(R.string.status_app_content, count.toString())) + } + startService(serviceIntent) + } + else{ + val basicTitle = getString(R.string.status_basic_title) + val notiContent = getString(R.string.status_noti_content) + val serviceIntent = Intent(this, ForegroundNotiService::class.java).apply { + putExtra("appName", basicTitle) + putExtra("content", notiContent) + putExtra("isGroupSummary", true) } startService(serviceIntent) } diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 8d6a350..0fab5eb 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -40,6 +40,7 @@ NotiManager 모든 중요 알림을 확인했어요. %1$s개의 읽지 않은 알림이 있어요. + 새로운 알림이 있어요. 방금 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d90d68f..d8c95f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,6 +40,7 @@ NotiManager You have checked all important notifications. You have %1$s unread notifications. + You have a new notification. Just now From 5017c4c2c3c48793156f3212d8815d474373e5cd Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:32:51 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0?= =?UTF-8?q?=20=EC=8B=9C=20=ED=9D=B0=ED=99=94=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 모바일 뒤로가기 후 앱의 뒤로가기 버튼을 누를 경우 흰 화면이 뜨던 현상 수정. --- .../presentation/ui/screen/DateFormatterScreen.kt | 4 +++- .../presentation/ui/screen/FilteredListScreen.kt | 5 +++-- .../presentation/ui/screen/NotificationScreen.kt | 4 +++- .../presentation/ui/screen/NotificationSubScreen.kt | 5 +++-- .../notimanager/presentation/ui/screen/SettingScreen.kt | 4 +++- .../notimanager/presentation/ui/screen/TitleScreen.kt | 7 ++++--- 6 files changed, 19 insertions(+), 10 deletions(-) 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 11f8d55..b6eef7a 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 @@ -30,7 +30,9 @@ fun DateFormatterScreen( CommonTopAppBar(title) { if (!isClicked) { isClicked = true - navController.popBackStack() + if (navController.previousBackStackEntry != null) { + navController.popBackStack() + } } } } 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 b9981be..f27c6c1 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 @@ -33,8 +33,9 @@ fun FilteredListScreen( CommonTopAppBar(title = title, onBackClick = { if (!isClicked){ isClicked = true - - navController.popBackStack() + if (navController.previousBackStackEntry != null) { + navController.popBackStack() + } } }) 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 453bb95..429ec70 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 @@ -51,7 +51,9 @@ fun NotificationScreen(navController: NavController, appName: String = "", title CommonTopAppBar(title = title, onBackClick = { if(!isClicked){ isClicked = true - navController.popBackStack() + if (navController.previousBackStackEntry != null) { + navController.popBackStack() + } } } ) } 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 d4bb7ac..baecd1c 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 @@ -50,9 +50,10 @@ fun NotificationSubScreen(navController: NavController, appName: String = "", su CommonTopAppBar(title = subText, onBackClick = { if(!isClicked){ isClicked = true - navController.popBackStack() + if (navController.previousBackStackEntry != null) { + navController.popBackStack() + } } - }) } ) { innerPadding -> 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 6e43bb9..8505036 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 @@ -30,7 +30,9 @@ fun SettingScreen( CommonTopAppBar(title){ if (!isClicked){ isClicked = true - navController.popBackStack() + if (navController.previousBackStackEntry != null) { + navController.popBackStack() + } } } } 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 92c9ae9..1703451 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 @@ -1,5 +1,6 @@ package com.example.notimanager.presentation.ui.screen +import android.util.Log import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider @@ -60,9 +61,9 @@ fun TitleScreen(navController: NavController, appName: String = ""){ CommonTopAppBar(title = appName, onBackClick = { if (!isClicked) { isClicked = true - - navController.popBackStack() - + if (navController.previousBackStackEntry != null) { + navController.popBackStack() + } } }) }