From 0c5d0da5980ece3dfae1b6f7546524546ab45acb Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 14:11:33 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20title=EC=97=90=20subText=20?= =?UTF-8?q?=EC=9A=94=EC=86=8C=EB=A5=BC=20DAO=EC=97=90=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 빠른 쿼리를 위한 인덱스 추가 및 DB 마이그레이션 --- .../9.json | 251 ++++++++++++++++++ .../notimanager/data/dto/NotificationDto.kt | 2 + .../data/dto/NotificationTitleDto.kt | 2 + .../data/model/NotificationModel.kt | 5 +- .../data/source/local/dao/NotificationDao.kt | 101 +++++-- .../source/local/database/MigrationObject.kt | 6 + .../local/database/NotiManagerDatabase.kt | 6 +- 7 files changed, 351 insertions(+), 22 deletions(-) create mode 100644 app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/9.json diff --git a/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/9.json b/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/9.json new file mode 100644 index 0000000..30692d8 --- /dev/null +++ b/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/9.json @@ -0,0 +1,251 @@ +{ + "formatVersion": 1, + "database": { + "version": 9, + "identityHash": "29d0436e2383c547a6d86125bfd1abaa", + "entities": [ + { + "tableName": "notification", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `appName` TEXT NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `subText` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "appName", + "columnName": "appName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subText", + "columnName": "subText", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_notification_appName_title_timestamp", + "unique": false, + "columnNames": [ + "appName", + "title", + "timestamp" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_notification_appName_title_timestamp` ON `${TABLE_NAME}` (`appName`, `title`, `timestamp`)" + }, + { + "name": "index_notification_appName_subText_timestamp", + "unique": false, + "columnNames": [ + "appName", + "subText", + "timestamp" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_notification_appName_subText_timestamp` ON `${TABLE_NAME}` (`appName`, `subText`, `timestamp`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "notification_meta", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`notificationId` INTEGER NOT NULL, `intentActive` INTEGER NOT NULL, `intentArray` BLOB NOT NULL, `isRead` INTEGER NOT NULL, PRIMARY KEY(`notificationId`), FOREIGN KEY(`notificationId`) REFERENCES `notification`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "notificationId", + "columnName": "notificationId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "intentActive", + "columnName": "intentActive", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "intentArray", + "columnName": "intentArray", + "affinity": "BLOB", + "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "isRead", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "notificationId" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "notification", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "notificationId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "notification_icon", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`notificationId` INTEGER NOT NULL, `iconBytes` BLOB NOT NULL, `priorityActive` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`notificationId`), FOREIGN KEY(`notificationId`) REFERENCES `notification`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "notificationId", + "columnName": "notificationId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "iconBytes", + "columnName": "iconBytes", + "affinity": "BLOB", + "notNull": true + }, + { + "fieldPath": "priorityActive", + "columnName": "priorityActive", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "notificationId" + ] + }, + "indices": [ + { + "name": "index_notification_icon_priorityActive_priority", + "unique": false, + "columnNames": [ + "priorityActive", + "priority" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_notification_icon_priorityActive_priority` ON `${TABLE_NAME}` (`priorityActive`, `priority`)" + } + ], + "foreignKeys": [ + { + "table": "notification", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "notificationId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "app_icon", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`notiAppName` TEXT NOT NULL, `iconBytes` BLOB NOT NULL, `priorityActive` INTEGER NOT NULL DEFAULT 0, `priority` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`notiAppName`))", + "fields": [ + { + "fieldPath": "notiAppName", + "columnName": "notiAppName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "iconBytes", + "columnName": "iconBytes", + "affinity": "BLOB", + "notNull": true + }, + { + "fieldPath": "priorityActive", + "columnName": "priorityActive", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "priority", + "columnName": "priority", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "notiAppName" + ] + }, + "indices": [ + { + "name": "index_app_icon_priorityActive_priority", + "unique": false, + "columnNames": [ + "priorityActive", + "priority" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_app_icon_priorityActive_priority` ON `${TABLE_NAME}` (`priorityActive`, `priority`)" + } + ], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '29d0436e2383c547a6d86125bfd1abaa')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/data/dto/NotificationDto.kt b/app/src/main/java/com/example/notimanager/data/dto/NotificationDto.kt index 70dd94c..c1659ae 100644 --- a/app/src/main/java/com/example/notimanager/data/dto/NotificationDto.kt +++ b/app/src/main/java/com/example/notimanager/data/dto/NotificationDto.kt @@ -6,6 +6,7 @@ import com.example.notimanager.domain.model.Notification data class NotificationDto( val title: String, + val subText: String, val content: String, val timestamp: Long, val intentActive: Boolean, @@ -15,6 +16,7 @@ data class NotificationDto( fun toDomain(): Notification { return Notification( title = this.title, + subText = this.subText, content = this.content, timestamp = this.timestamp, intent = retrieveIntent(intentArray), diff --git a/app/src/main/java/com/example/notimanager/data/dto/NotificationTitleDto.kt b/app/src/main/java/com/example/notimanager/data/dto/NotificationTitleDto.kt index 71a0570..8c207d0 100644 --- a/app/src/main/java/com/example/notimanager/data/dto/NotificationTitleDto.kt +++ b/app/src/main/java/com/example/notimanager/data/dto/NotificationTitleDto.kt @@ -6,6 +6,7 @@ import com.example.notimanager.domain.model.NotificationTitle data class NotificationTitleDto( val id: Long, val title: String, + val subText: String, val content: String, val timestamp: Long, val iconBytes: ByteArray, @@ -17,6 +18,7 @@ data class NotificationTitleDto( id = this.id, title = this.title, content = this.content, + subText = this.subText, timestamp = this.timestamp, notificationIcon = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.size), priorityActive = this.priorityActive, diff --git a/app/src/main/java/com/example/notimanager/data/model/NotificationModel.kt b/app/src/main/java/com/example/notimanager/data/model/NotificationModel.kt index c7115d2..d364ebf 100644 --- a/app/src/main/java/com/example/notimanager/data/model/NotificationModel.kt +++ b/app/src/main/java/com/example/notimanager/data/model/NotificationModel.kt @@ -6,7 +6,10 @@ import androidx.room.PrimaryKey @Entity( tableName = "notification", - indices = [Index(value = ["appName", "title", "timestamp"], unique = false)] + indices = [ + Index(value = ["appName", "title", "timestamp"], unique = false), + Index(value = ["appName", "subText", "timestamp"], unique = false) + ] ) data class NotificationModel( @PrimaryKey(autoGenerate = true) diff --git a/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt b/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt index 9a161a4..f857941 100644 --- a/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt +++ b/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt @@ -32,21 +32,45 @@ interface NotificationDao { @Query( """ - SELECT n1.id, n1.title, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority - FROM notification AS n1 - INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId - WHERE ni.priorityActive = 1 - AND n1.appName = :appName - AND n1.title = :title - AND timestamp = ( - SELECT MAX(timestamp) - FROM notification AS n2 - WHERE n1.appName = n2.appName AND n1.title = n2.title - ) - ORDER BY timestamp DESC + SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority + FROM notification AS n1 + INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId + WHERE ni.priorityActive = 1 + AND n1.appName = :appName + AND n1.subText = "" + AND n1.timestamp = ( + SELECT MAX(timestamp) + FROM notification AS n2 + WHERE n1.appName = n2.appName AND n1.title = n2.title + ) + AND n1.title IN ( + SELECT title + FROM notification + WHERE appName = :appName + GROUP BY title + ) + UNION ALL + SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority + FROM notification AS n1 + INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId + WHERE ni.priorityActive = 1 + AND n1.appName = :appName + AND n1.subText != "" + AND n1.timestamp = ( + SELECT MAX(timestamp) + FROM notification AS n2 + WHERE n1.appName = n2.appName AND n1.title = n2.title + ) + AND n1.subText IN ( + SELECT title + FROM notification + WHERE appName = :appName + GROUP BY subText + ) + ORDER BY n1.timestamp DESC """ ) - suspend fun getNotificationTitlePriorityList(appName: String, title: String): List + suspend fun getNotificationTitlePriorityList(appName: String): List @Query( """ @@ -66,25 +90,52 @@ interface NotificationDao { @Query( """ - SELECT n1.id, n1.title, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority + SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority FROM notification AS n1 INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId WHERE ni.priorityActive = 0 AND n1.appName = :appName - AND n1.title = :title - AND timestamp = ( + AND n1.subText = "" + AND n1.timestamp = ( SELECT MAX(timestamp) FROM notification AS n2 WHERE n1.appName = n2.appName AND n1.title = n2.title ) - ORDER BY timestamp DESC + AND n1.title IN ( + SELECT title + FROM notification + WHERE appName = :appName + GROUP BY title + ) + + UNION ALL + + SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority + FROM notification AS n1 + INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId + WHERE ni.priorityActive = 0 + AND n1.appName = :appName + AND n1.subText != "" + AND n1.timestamp = ( + SELECT MAX(timestamp) + FROM notification AS n2 + WHERE n1.appName = n2.appName AND n1.title = n2.title + ) + AND n1.subText IN ( + SELECT title + FROM notification + WHERE appName = :appName + GROUP BY subText + ) + + ORDER BY n1.timestamp DESC """ ) - suspend fun getNotificationTitleList(appName: String, title: String): List + suspend fun getNotificationTitleList(appName: String): List @Query( """ - SELECT n.title, n.content, n.timestamp, nm.intentActive, nm.intentArray, ni.iconBytes + SELECT n.title, n.subText, n.content, n.timestamp, nm.intentActive, nm.intentArray, ni.iconBytes FROM notification AS n INNER JOIN notification_meta AS nm ON n.id = nm.notificationId INNER JOIN notification_icon AS ni ON n.id = ni.notificationId @@ -93,4 +144,16 @@ interface NotificationDao { """ ) suspend fun getNotificationList(appName: String, title: String): List + + @Query( + """ + SELECT n.title, n.subText, n.content, n.timestamp, nm.intentActive, nm.intentArray, ni.iconBytes + FROM notification AS n + INNER JOIN notification_meta AS nm ON n.id = nm.notificationId + INNER JOIN notification_icon AS ni ON n.id = ni.notificationId + WHERE n.appName = :appName AND n.subText = :subText + ORDER BY timestamp DESC + """ + ) + suspend fun getNotificationSubTextList(appName: String, subText: String): List } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt b/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt index 653807b..e5ae8c8 100644 --- a/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt +++ b/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt @@ -28,4 +28,10 @@ object MigrationObject { db.execSQL("ALTER TABLE notification_meta ADD COLUMN isRead INTEGER NOT NULL DEFAULT '0';") } } + + val MIGRATION_8_9 = object : Migration(8, 9) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("CREATE INDEX index_notification_appName_subText_timestamp ON notification(appName, subText, timestamp);\n") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/data/source/local/database/NotiManagerDatabase.kt b/app/src/main/java/com/example/notimanager/data/source/local/database/NotiManagerDatabase.kt index cc34ac6..03e12f8 100644 --- a/app/src/main/java/com/example/notimanager/data/source/local/database/NotiManagerDatabase.kt +++ b/app/src/main/java/com/example/notimanager/data/source/local/database/NotiManagerDatabase.kt @@ -16,9 +16,10 @@ import com.example.notimanager.data.source.local.dao.NotificationMetaDao import com.example.notimanager.data.source.local.database.MigrationObject.MIGRATION_3_4 import com.example.notimanager.data.source.local.database.MigrationObject.MIGRATION_6_7 import com.example.notimanager.data.source.local.database.MigrationObject.MIGRATION_7_8 +import com.example.notimanager.data.source.local.database.MigrationObject.MIGRATION_8_9 @Database( - version = 8, + version = 9, entities = [ NotificationModel::class, @@ -50,7 +51,8 @@ abstract class NotiManagerDatabase : RoomDatabase() { .addMigrations( MIGRATION_3_4, MIGRATION_6_7, - MIGRATION_7_8 + MIGRATION_7_8, + MIGRATION_8_9, ) .fallbackToDestructiveMigration() .build() From 43fdb84e4c2a489db05eb8384e348a907e9dec26 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 14:13:35 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=EC=97=90=20subText=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repository/NotificationDomainRepository.kt | 11 +++++++++++ .../example/notimanager/domain/model/Notification.kt | 1 + .../notimanager/domain/model/NotificationTitle.kt | 1 + .../NotificationDomainRepositoryInterface.kt | 1 + .../notimanager/domain/usecase/NotificationUseCase.kt | 4 ++++ 5 files changed, 18 insertions(+) diff --git a/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt index 1b2c63f..49c1a92 100644 --- a/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt +++ b/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt @@ -1,5 +1,6 @@ package com.example.notimanager.data.repository +import com.example.notimanager.data.dto.NotificationDto import com.example.notimanager.data.source.local.dao.NotificationDao import com.example.notimanager.domain.model.Notification import com.example.notimanager.domain.repository.NotificationDomainRepositoryInterface @@ -16,4 +17,14 @@ class NotificationDomainRepository( .map { it.toDomain() } .toList() } + + override suspend fun getNotificationSubTextList( + appName: String, + subText: String + ): List{ + return notificationDao.getNotificationSubTextList(appName, subText) + .asSequence() + .map { it.toDomain() } + .toList() + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/domain/model/Notification.kt b/app/src/main/java/com/example/notimanager/domain/model/Notification.kt index 29bce95..3176f17 100644 --- a/app/src/main/java/com/example/notimanager/domain/model/Notification.kt +++ b/app/src/main/java/com/example/notimanager/domain/model/Notification.kt @@ -6,6 +6,7 @@ import android.graphics.Bitmap data class Notification( val title: String, + val subText: String, val content: String, val timestamp: Long, val intent: Intent?, diff --git a/app/src/main/java/com/example/notimanager/domain/model/NotificationTitle.kt b/app/src/main/java/com/example/notimanager/domain/model/NotificationTitle.kt index 266ad56..f99af72 100644 --- a/app/src/main/java/com/example/notimanager/domain/model/NotificationTitle.kt +++ b/app/src/main/java/com/example/notimanager/domain/model/NotificationTitle.kt @@ -5,6 +5,7 @@ import android.graphics.Bitmap data class NotificationTitle( val id: Long, val title: String, + val subText: String, val content: String, val timestamp: Long, val notificationIcon: Bitmap?, diff --git a/app/src/main/java/com/example/notimanager/domain/repository/NotificationDomainRepositoryInterface.kt b/app/src/main/java/com/example/notimanager/domain/repository/NotificationDomainRepositoryInterface.kt index a77625e..04e5fea 100644 --- a/app/src/main/java/com/example/notimanager/domain/repository/NotificationDomainRepositoryInterface.kt +++ b/app/src/main/java/com/example/notimanager/domain/repository/NotificationDomainRepositoryInterface.kt @@ -4,4 +4,5 @@ import com.example.notimanager.domain.model.Notification interface NotificationDomainRepositoryInterface { suspend fun getNotificationList(appName: String, title: String): List + suspend fun getNotificationSubTextList(appName: String, subText: String): List } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/domain/usecase/NotificationUseCase.kt b/app/src/main/java/com/example/notimanager/domain/usecase/NotificationUseCase.kt index e96cb5a..be2945a 100644 --- a/app/src/main/java/com/example/notimanager/domain/usecase/NotificationUseCase.kt +++ b/app/src/main/java/com/example/notimanager/domain/usecase/NotificationUseCase.kt @@ -9,4 +9,8 @@ class NotificationUseCase( suspend fun getNotificationList(appName: String, title: String): List{ return repository.getNotificationList(appName, title) } + + suspend fun getNotificationSubTextList(appName: String, subText: String): List{ + return repository.getNotificationSubTextList(appName, subText) + } } \ No newline at end of file From c11aab3e85bf2346d9d1558c6d77fbdccab1cf97 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 14:16:20 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20title=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=EC=84=9C=20title=20=EC=9D=B8=EC=9E=90=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 특정 앱의 제목 리스트를 가져오는 데 특정 title이 담겨있으면 안됨. 없어야 title 별로 하나씩 가져올 수 있음. --- .../data/repository/NotificationTitleRepository.kt | 6 ++---- .../repository/NotificationTitleRepositoryInterface.kt | 4 ++-- .../domain/usecase/NotificationTitleUseCase.kt | 6 ++---- .../viewmodel/NotificationTitlePriorityViewModel.kt | 6 ++---- .../viewmodel/NotificationTitleViewModel.kt | 6 ++---- .../ui/component/NotificationAppListView.kt | 4 ++-- .../presentation/ui/navigation/AppNavHost.kt | 3 +-- .../notimanager/presentation/ui/screen/TitleScreen.kt | 10 +++++----- 8 files changed, 18 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt index 79bdc81..e4efe16 100644 --- a/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt +++ b/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt @@ -11,9 +11,8 @@ class NotificationTitleRepository( ) : NotificationTitleRepositoryInterface { override suspend fun getNotificationTitleList( appName: String, - title: String ): List{ - return notificationDao.getNotificationTitleList(appName, title) + return notificationDao.getNotificationTitleList(appName) .asSequence() .map { it.toDomain() } .toList() @@ -21,9 +20,8 @@ class NotificationTitleRepository( override suspend fun getNotificationTitlePriorityList( appName: String, - title: String ): List { - return notificationDao.getNotificationTitlePriorityList(appName, title) + return notificationDao.getNotificationTitlePriorityList(appName) .asSequence() .map { it.toDomain() } .toList() diff --git a/app/src/main/java/com/example/notimanager/domain/repository/NotificationTitleRepositoryInterface.kt b/app/src/main/java/com/example/notimanager/domain/repository/NotificationTitleRepositoryInterface.kt index 0f82246..d267cd0 100644 --- a/app/src/main/java/com/example/notimanager/domain/repository/NotificationTitleRepositoryInterface.kt +++ b/app/src/main/java/com/example/notimanager/domain/repository/NotificationTitleRepositoryInterface.kt @@ -3,8 +3,8 @@ package com.example.notimanager.domain.repository import com.example.notimanager.domain.model.NotificationTitle interface NotificationTitleRepositoryInterface { - suspend fun getNotificationTitleList(appName: String, title: String): List - suspend fun getNotificationTitlePriorityList(appName: String, title: String): List + suspend fun getNotificationTitleList(appName: String): List + suspend fun getNotificationTitlePriorityList(appName: String): List suspend fun setTitlePriority(notificationId: Long, newPriority: Int): Int suspend fun removeTitlePriority(notificationId: Long): Int } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/domain/usecase/NotificationTitleUseCase.kt b/app/src/main/java/com/example/notimanager/domain/usecase/NotificationTitleUseCase.kt index c725722..bb0b2a9 100644 --- a/app/src/main/java/com/example/notimanager/domain/usecase/NotificationTitleUseCase.kt +++ b/app/src/main/java/com/example/notimanager/domain/usecase/NotificationTitleUseCase.kt @@ -8,16 +8,14 @@ class NotificationTitleUseCase( ){ suspend fun getNotificationTitleList( appName: String, - title: String ): List{ - return repository.getNotificationTitleList(appName, title) + return repository.getNotificationTitleList(appName) } suspend fun getNotificationTitlePriorityList( appName: String, - title: String ): List { - return repository.getNotificationTitlePriorityList(appName, title) + return repository.getNotificationTitlePriorityList(appName) } suspend fun setTitlePriority( diff --git a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitlePriorityViewModel.kt b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitlePriorityViewModel.kt index aa2a3bb..96bd6db 100644 --- a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitlePriorityViewModel.kt +++ b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitlePriorityViewModel.kt @@ -18,11 +18,9 @@ class NotificationTitlePriorityViewModel @Inject constructor( val notificationTitlePriorityState: LiveData get() = _notificationTitlePriorityState private var appName: String = "" - private var title: String = "" - fun setArgs(appName: String, title: String) { + fun setArgs(appName: String) { this.appName = appName - this.title = title loadNotificationTitles() } @@ -38,7 +36,7 @@ class NotificationTitlePriorityViewModel @Inject constructor( _notificationTitlePriorityState.value = NotificationTitlePriorityState(isLoading = true) try { - val notificationTitles = notificationTitleUseCase.getNotificationTitlePriorityList(appName, title) + val notificationTitles = notificationTitleUseCase.getNotificationTitlePriorityList(appName) _notificationTitlePriorityState.value = NotificationTitlePriorityState(notificationTitleList = notificationTitles) } catch (e: Exception) { _notificationTitlePriorityState.value = NotificationTitlePriorityState(error = e.message) diff --git a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitleViewModel.kt b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitleViewModel.kt index c8e50e1..dd3d993 100644 --- a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitleViewModel.kt +++ b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationTitleViewModel.kt @@ -18,11 +18,9 @@ class NotificationTitleViewModel @Inject constructor( val notificationTitleState: LiveData get() = _notificationTitleState private var appName: String = "" - private var title: String = "" - fun setArgs(appName: String, title: String) { + fun setArgs(appName: String) { this.appName = appName - this.title = title loadNotificationTitles() } @@ -35,7 +33,7 @@ class NotificationTitleViewModel @Inject constructor( _notificationTitleState.value = NotificationTitleState(isLoading = true) try { - val notificationTitles = notificationTitleUseCase.getNotificationTitleList(appName, title) + val notificationTitles = notificationTitleUseCase.getNotificationTitleList(appName) _notificationTitleState.value = NotificationTitleState(notificationTitleList = notificationTitles) } catch (e: Exception) { _notificationTitleState.value = NotificationTitleState(error = e.message) 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 162e116..1e9b3c7 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 @@ -75,7 +75,7 @@ fun NotificationAppListView( onClick = { navController .navigate( - "titleScreen/${notification.appName}/${getEncodedString(notification.title)}" + "titleScreen/${notification.appName}}" ) }, viewModel = viewModel, @@ -93,7 +93,7 @@ fun NotificationAppListView( onClick = { navController .navigate( - "titleScreen/${notification.appName}/${getEncodedString(notification.title)}" + "titleScreen/${notification.appName}}" ) }, viewModel = viewModel, diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt index 06ee476..039ccef 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt @@ -20,8 +20,7 @@ fun AppNavHost(navController: NavHostController) { } composable("titleScreen/{appName}/{title}") { backStackEntry -> val appName = backStackEntry.arguments?.getString("appName") - val title = backStackEntry.arguments?.getString("title") - TitleScreen(navController, appName!!, getDecodeString(title!!)) + TitleScreen(navController, appName!!) } composable("notificationScreen/{appName}/{title}") { backStackEntry -> val appName = backStackEntry.arguments?.getString("appName") 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 f666a5e..582e35e 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 @@ -28,16 +28,16 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable -fun TitleScreen(navController: NavController, appName: String = "", title:String = ""){ +fun TitleScreen(navController: NavController, appName: String = ""){ val viewModel: NotificationTitleViewModel = hiltViewModel() val priorityViewModel: NotificationTitlePriorityViewModel = hiltViewModel() var isRefreshing by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() - LaunchedEffect(appName, title) { - viewModel.setArgs(appName, title) - priorityViewModel.setArgs(appName, title) + LaunchedEffect(appName) { + viewModel.setArgs(appName) + priorityViewModel.setArgs(appName) } LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { @@ -47,7 +47,7 @@ fun TitleScreen(navController: NavController, appName: String = "", title:String Scaffold( topBar = { - TitleTopAppBar(title = title, onBackClick = { navController.popBackStack() }) + TitleTopAppBar(title = appName, onBackClick = { navController.popBackStack() }) } ) { innerPadding -> HorizontalDivider( From 8c95ca48306b2a09267bf0e92affe2560ac84bd4 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 15:08:01 +0900 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20UI,=20subText=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=20=EC=97=AC=EB=B6=80=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=B0=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmodel/NotificationSubTextViewModel.kt | 45 +++++++++++++ .../ui/component/NotificationAppListView.kt | 2 +- .../ui/component/NotificationListView.kt | 49 +++++++------- .../ui/component/NotificationTitleListView.kt | 25 ++++--- .../presentation/ui/navigation/AppNavHost.kt | 15 +++-- .../ui/screen/NotificationScreen.kt | 35 +++++++++- .../ui/screen/NotificationSubScreen.kt | 66 +++++++++++++++++++ 7 files changed, 199 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationSubTextViewModel.kt create mode 100644 app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationSubScreen.kt diff --git a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationSubTextViewModel.kt b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationSubTextViewModel.kt new file mode 100644 index 0000000..a2f4902 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationSubTextViewModel.kt @@ -0,0 +1,45 @@ +package com.example.notimanager.presentation.stateholder.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.notimanager.domain.usecase.NotificationUseCase +import com.example.notimanager.presentation.stateholder.state.NotificationState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class NotificationSubTextViewModel @Inject constructor( + private val notificationUseCase: NotificationUseCase +): ViewModel() { + private val _notificationState = MutableLiveData() + val notificationState: LiveData get() = _notificationState + + private var appName: String = "" + private var subText: String = "" + + fun setArgs(appName: String, subText: String) { + this.appName = appName + this.subText = subText + loadNotification() + } + + fun getAppName(): String{ + return appName + } + + fun loadNotification() { + viewModelScope.launch { + _notificationState.value = NotificationState(isLoading = true) + + try { + val notification = notificationUseCase.getNotificationSubTextList(appName, subText) + _notificationState.value = NotificationState(notificationList = notification) + } catch (e: Exception) { + _notificationState.value = NotificationState(error = e.message) + } + } + } +} \ 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 1e9b3c7..e19a3ed 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 @@ -75,7 +75,7 @@ fun NotificationAppListView( onClick = { navController .navigate( - "titleScreen/${notification.appName}}" + "titleScreen/${notification.appName}" ) }, viewModel = viewModel, 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 d18aa0d..c618ca8 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 @@ -2,18 +2,20 @@ package com.example.notimanager.presentation.ui.component 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.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.foundation.text.BasicText -import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme 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.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -21,29 +23,27 @@ import androidx.compose.ui.unit.dp import com.example.notimanager.common.objects.DateFormatter.formatTimestamp import com.example.notimanager.domain.model.Notification import com.example.notimanager.presentation.stateholder.state.NotificationState -import com.example.notimanager.presentation.stateholder.viewmodel.NotificationViewModel + @Composable -fun NotificationListView(innerPadding: PaddingValues, viewModel: NotificationViewModel) { - val notificationState by viewModel.notificationState.observeAsState(NotificationState()) +fun NotificationListView(notificationState: NotificationState) { val context = LocalContext.current - Column( - Modifier.padding(innerPadding) - ) { - if (notificationState.isLoading) { - CircularProgressIndicator(modifier = Modifier.padding(16.dp)) - } else if (notificationState.error != null) { + var currentNoti by remember { mutableStateOf(notificationState.notificationList) } - } else { - LazyColumn { - items(notificationState.notificationList) { notification -> - NotificationItemView (notification = notification, onClick = { - if (notification.intent?.action != null) { - context.startActivity(notification.intent); - } - }) + LaunchedEffect(notificationState.notificationList) { + if (!notificationState.isLoading) { + currentNoti = notificationState.notificationList + } + } + LazyColumn( + modifier = Modifier.fillMaxSize() + ) { + items(currentNoti) { notification -> + NotificationItemView (notification = notification, onClick = { + if (notification.intent?.action != null) { + context.startActivity(notification.intent); } - } + }) } } } @@ -59,7 +59,12 @@ fun NotificationItemView(notification: Notification, onClick: () -> Unit) { ) { AppIconView(notification.notificationIcon) Column { - BasicText(text = notification.title, style = MaterialTheme.typography.bodyLarge) + if (notification.subText == ""){ + BasicText(text = notification.title, style = MaterialTheme.typography.bodyLarge) + } + else{ + BasicText(text = notification.subText, style = MaterialTheme.typography.bodyLarge) + } BasicText(text = notification.content, style = MaterialTheme.typography.bodyMedium) BasicText(text = formatTimestamp(notification.timestamp), style = MaterialTheme.typography.bodyMedium) } 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 de3e7b9..b79498d 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 @@ -2,7 +2,6 @@ package com.example.notimanager.presentation.ui.component 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 @@ -13,7 +12,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.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -74,7 +72,7 @@ fun NotificationTitleListView( items(currentNotiPriority) { notification -> NotificationTitleItemView(notification = notification, onClick = { navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}" + "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}/${notification.subText}" ) }, viewModel = viewModel, priorityViewModel = priorityViewModel) } @@ -86,7 +84,7 @@ fun NotificationTitleListView( items(currentNoti) { notification -> NotificationTitleItemView(notification = notification, onClick = { navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}" + "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}/${notification.subText}" ) }, viewModel = viewModel, priorityViewModel = priorityViewModel) } @@ -113,11 +111,17 @@ fun NotificationTitleItemView( Column ( modifier = Modifier.weight(1f) ){ - Text( - text = notification.title, - style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Bold) - - ) + if (notification.subText == "") { + Text( + text = notification.title, + style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Bold) + ) + }else{ + Text( + text = notification.subText, + style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Bold) + ) + } Text( text = notification.content, style = MaterialTheme.typography.bodySmall, @@ -152,7 +156,7 @@ fun NotificationTitleItemView( priorityViewModel.removeTitlePriority(notificationId = notification.id){ viewModel.loadNotificationTitles() } - + showModal = false }) } else{ @@ -160,6 +164,7 @@ fun NotificationTitleItemView( viewModel.setTitlePriority(notification.id, priorityViewModel.getLength()){ priorityViewModel.loadNotificationTitles() } + showModal = false }) } ClickableTextView(text = "삭제", onClick = {}) diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt index 039ccef..2a110ac 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt @@ -7,6 +7,7 @@ import androidx.navigation.compose.composable import com.example.notimanager.common.objects.Encoder.getDecodeString import com.example.notimanager.presentation.ui.screen.MainScreen import com.example.notimanager.presentation.ui.screen.NotificationScreen +import com.example.notimanager.presentation.ui.screen.NotificationSubScreen import com.example.notimanager.presentation.ui.screen.TitleScreen @Composable @@ -18,14 +19,20 @@ fun AppNavHost(navController: NavHostController) { composable("mainScreen") { MainScreen(navController) } - composable("titleScreen/{appName}/{title}") { backStackEntry -> + composable("titleScreen/{appName}") { backStackEntry -> val appName = backStackEntry.arguments?.getString("appName") TitleScreen(navController, appName!!) } - composable("notificationScreen/{appName}/{title}") { backStackEntry -> + composable("notificationScreen/{appName}/{notiName}/{isSubText}") { backStackEntry -> val appName = backStackEntry.arguments?.getString("appName") - val title = backStackEntry.arguments?.getString("title") - NotificationScreen(navController, appName!!, getDecodeString(title!!)) + val notiName = backStackEntry.arguments?.getString("notiName") + val isSubText = backStackEntry.arguments?.getString("isSubText") + if (isSubText == ""){ + NotificationScreen(navController, appName!!, getDecodeString(notiName!!)) + }else{ + NotificationSubScreen(navController, appName!!, getDecodeString(notiName!!)) + } + } } } \ No newline at end of file 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 4101f3a..7a86310 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 @@ -1,22 +1,47 @@ package com.example.notimanager.presentation.ui.screen import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold +import androidx.compose.material3.pulltorefresh.PullToRefreshBox 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.rememberCoroutineScope +import androidx.compose.runtime.setValue 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.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.NotificationTitleListView import com.example.notimanager.presentation.ui.component.NotificationTopAppBar +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +@OptIn(ExperimentalMaterial3Api::class) @Composable fun NotificationScreen(navController: NavController, appName: String = "", title:String = ""){ val viewModel: NotificationViewModel = hiltViewModel() + var isRefreshing by remember { mutableStateOf(false) } + val coroutineScope = rememberCoroutineScope() + + val onRefresh: () -> Unit = { + isRefreshing = true + viewModel.loadNotification() + coroutineScope.launch { + delay(500) + isRefreshing = false + } + } + LaunchedEffect(appName, title) { viewModel.setArgs(appName, title) } @@ -29,6 +54,14 @@ fun NotificationScreen(navController: NavController, appName: String = "", title modifier = Modifier.padding(innerPadding), thickness = 0.2.dp ) - NotificationListView(innerPadding, viewModel) + PullToRefreshBox( + isRefreshing = isRefreshing, + onRefresh = onRefresh, + modifier = Modifier.padding(innerPadding) + ) { + val notificationState by viewModel.notificationState.observeAsState(NotificationState()) + NotificationListView(notificationState) + } + } } \ No newline at end of file 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 new file mode 100644 index 0000000..18c72a4 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationSubScreen.kt @@ -0,0 +1,66 @@ +package com.example.notimanager.presentation.ui.screen + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Scaffold +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +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.rememberCoroutineScope +import androidx.compose.runtime.setValue +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.state.NotificationState +import com.example.notimanager.presentation.stateholder.viewmodel.NotificationSubTextViewModel +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 kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun NotificationSubScreen(navController: NavController, appName: String = "", subText:String){ + val viewModel: NotificationSubTextViewModel = hiltViewModel() + + var isRefreshing by remember { mutableStateOf(false) } + val coroutineScope = rememberCoroutineScope() + + val onRefresh: () -> Unit = { + isRefreshing = true + viewModel.loadNotification() + coroutineScope.launch { + delay(500) + isRefreshing = false + } + } + + LaunchedEffect(appName, subText) { + viewModel.setArgs(appName, subText) + } + Scaffold( + topBar = { + NotificationTopAppBar(title = subText, onBackClick = { navController.popBackStack() }) + } + ) { innerPadding -> + HorizontalDivider( + modifier = Modifier.padding(innerPadding), + thickness = 0.2.dp + ) + PullToRefreshBox( + isRefreshing = isRefreshing, + onRefresh = onRefresh, + modifier = Modifier.padding(innerPadding) + ) { + val notificationState by viewModel.notificationState.observeAsState(NotificationState()) + NotificationListView(notificationState) + } + } +} \ No newline at end of file From 12f77098ef27d4be935f87c0182fd654b165aeae Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 16:50:44 +0900 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20title=20->=20noti=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=ED=8C=85=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/component/NotificationAppListView.kt | 2 +- .../ui/component/NotificationTitleListView.kt | 12 ++++++------ .../presentation/ui/navigation/AppNavHost.kt | 8 ++------ 3 files changed, 9 insertions(+), 13 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 e19a3ed..ec95d13 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 @@ -93,7 +93,7 @@ fun NotificationAppListView( onClick = { navController .navigate( - "titleScreen/${notification.appName}}" + "titleScreen/${notification.appName}" ) }, viewModel = viewModel, 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 b79498d..90cde61 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 @@ -71,9 +71,10 @@ fun NotificationTitleListView( ) { items(currentNotiPriority) { notification -> NotificationTitleItemView(notification = notification, onClick = { - navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}/${notification.subText}" - ) + 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) } @@ -83,9 +84,8 @@ fun NotificationTitleListView( items(currentNoti) { notification -> NotificationTitleItemView(notification = notification, onClick = { - navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}/${notification.subText}" - ) + 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) } } diff --git a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt index 2a110ac..141022a 100644 --- a/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt +++ b/app/src/main/java/com/example/notimanager/presentation/ui/navigation/AppNavHost.kt @@ -27,12 +27,8 @@ fun AppNavHost(navController: NavHostController) { val appName = backStackEntry.arguments?.getString("appName") val notiName = backStackEntry.arguments?.getString("notiName") val isSubText = backStackEntry.arguments?.getString("isSubText") - if (isSubText == ""){ - NotificationScreen(navController, appName!!, getDecodeString(notiName!!)) - }else{ - NotificationSubScreen(navController, appName!!, getDecodeString(notiName!!)) - } - + if (isSubText == "False") NotificationScreen(navController, appName!!, getDecodeString(notiName!!)) + else NotificationSubScreen(navController, appName!!, getDecodeString(notiName!!)) } } } \ No newline at end of file From 05e3fcb21e7064b25ad619216c256fba03ef813c Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 17:27:24 +0900 Subject: [PATCH 6/9] =?UTF-8?q?fix:=20=EC=95=8C=EB=A6=BC=EC=9D=B8=EB=8D=B0?= =?UTF-8?q?=20subText=EA=B0=80=20=EB=82=98=EC=98=A4=EB=8D=98=20=ED=98=84?= =?UTF-8?q?=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 알림의 제목은 title이 와야 맞음. --- .../presentation/ui/component/NotificationListView.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) 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 c618ca8..2bce24d 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 @@ -59,12 +59,7 @@ fun NotificationItemView(notification: Notification, onClick: () -> Unit) { ) { AppIconView(notification.notificationIcon) Column { - if (notification.subText == ""){ - BasicText(text = notification.title, style = MaterialTheme.typography.bodyLarge) - } - else{ - BasicText(text = notification.subText, style = MaterialTheme.typography.bodyLarge) - } + BasicText(text = notification.title, style = MaterialTheme.typography.bodyLarge) BasicText(text = notification.content, style = MaterialTheme.typography.bodyMedium) BasicText(text = formatTimestamp(notification.timestamp), style = MaterialTheme.typography.bodyMedium) } From cd997c576dc38831f4dd9137dab551f85afa682f Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 17:26:59 +0900 Subject: [PATCH 7/9] =?UTF-8?q?refactor:=20dao=20=EC=BF=BC=EB=A6=AC=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 우선순위와 비우선순위 리스트 쿼리의 경우 priority 말고 다른 점이 없으므로 하나의 함수로 만듦. --- .../repository/NotificationAppRepository.kt | 4 +- .../repository/NotificationTitleRepository.kt | 4 +- .../data/source/local/dao/NotificationDao.kt | 72 ++----------------- .../NotificationAppRepositoryTest.kt | 4 +- .../NotificationTitleRepositoryTest.kt | 8 +-- 5 files changed, 17 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/data/repository/NotificationAppRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/NotificationAppRepository.kt index b83af97..00243b1 100644 --- a/app/src/main/java/com/example/notimanager/data/repository/NotificationAppRepository.kt +++ b/app/src/main/java/com/example/notimanager/data/repository/NotificationAppRepository.kt @@ -10,14 +10,14 @@ class NotificationAppRepository( private val appIconDao: AppIconDao ) : NotificationAppRepositoryInterface { override suspend fun getNotificationAppList(): List{ - return notificationDao.getNotificationAppList() + return notificationDao.getNotificationAppList(false) .asSequence() .map { it.toDomain() } .toList() } override suspend fun getNotificationAppPriorityList(): List { - return notificationDao.getNotificationAppPriorityList() + return notificationDao.getNotificationAppList(true) .asSequence() .map { it.toDomain() } .toList() diff --git a/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt index e4efe16..6b94c41 100644 --- a/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt +++ b/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt @@ -12,7 +12,7 @@ class NotificationTitleRepository( override suspend fun getNotificationTitleList( appName: String, ): List{ - return notificationDao.getNotificationTitleList(appName) + return notificationDao.getNotificationTitleList(appName, false) .asSequence() .map { it.toDomain() } .toList() @@ -21,7 +21,7 @@ class NotificationTitleRepository( override suspend fun getNotificationTitlePriorityList( appName: String, ): List { - return notificationDao.getNotificationTitlePriorityList(appName) + return notificationDao.getNotificationTitleList(appName, true) .asSequence() .map { it.toDomain() } .toList() diff --git a/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt b/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt index f857941..eae9e60 100644 --- a/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt +++ b/app/src/main/java/com/example/notimanager/data/source/local/dao/NotificationDao.kt @@ -14,70 +14,12 @@ interface NotificationDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(notification: NotificationModel): Long - @Query( - """ - SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes , ai.priorityActive, ai.priority - FROM notification AS n1 - INNER JOIN app_icon AS ai ON n1.appName = ai.notiAppName - WHERE ai.priorityActive = 1 - AND timestamp = ( - SELECT MAX(timestamp) - FROM notification AS n2 - WHERE n1.appName = n2.appName - ) - ORDER BY timestamp DESC - """ - ) - suspend fun getNotificationAppPriorityList(): List - - @Query( - """ - SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority - FROM notification AS n1 - INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId - WHERE ni.priorityActive = 1 - AND n1.appName = :appName - AND n1.subText = "" - AND n1.timestamp = ( - SELECT MAX(timestamp) - FROM notification AS n2 - WHERE n1.appName = n2.appName AND n1.title = n2.title - ) - AND n1.title IN ( - SELECT title - FROM notification - WHERE appName = :appName - GROUP BY title - ) - UNION ALL - SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority - FROM notification AS n1 - INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId - WHERE ni.priorityActive = 1 - AND n1.appName = :appName - AND n1.subText != "" - AND n1.timestamp = ( - SELECT MAX(timestamp) - FROM notification AS n2 - WHERE n1.appName = n2.appName AND n1.title = n2.title - ) - AND n1.subText IN ( - SELECT title - FROM notification - WHERE appName = :appName - GROUP BY subText - ) - ORDER BY n1.timestamp DESC - """ - ) - suspend fun getNotificationTitlePriorityList(appName: String): List - @Query( """ SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes, ai.priorityActive, ai.priority FROM notification AS n1 INNER JOIN app_icon AS ai ON n1.appName = ai.notiAppName - WHERE ai.priorityActive = 0 + WHERE ai.priorityActive = :priorityActive AND timestamp = ( SELECT MAX(timestamp) FROM notification AS n2 @@ -86,14 +28,14 @@ interface NotificationDao { ORDER BY timestamp DESC """ ) - suspend fun getNotificationAppList(): List + suspend fun getNotificationAppList(priorityActive: Boolean): List @Query( """ SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority FROM notification AS n1 INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId - WHERE ni.priorityActive = 0 + WHERE ni.priorityActive = :priorityActive AND n1.appName = :appName AND n1.subText = "" AND n1.timestamp = ( @@ -113,16 +55,16 @@ interface NotificationDao { SELECT n1.id, n1.title, n1.subText, n1.content, n1.timestamp, ni.iconBytes, ni.priorityActive, ni.priority FROM notification AS n1 INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId - WHERE ni.priorityActive = 0 + WHERE ni.priorityActive = :priorityActive AND n1.appName = :appName AND n1.subText != "" AND n1.timestamp = ( SELECT MAX(timestamp) FROM notification AS n2 - WHERE n1.appName = n2.appName AND n1.title = n2.title + WHERE n1.appName = n2.appName AND n1.subText = n2.subText ) AND n1.subText IN ( - SELECT title + SELECT subText FROM notification WHERE appName = :appName GROUP BY subText @@ -131,7 +73,7 @@ interface NotificationDao { ORDER BY n1.timestamp DESC """ ) - suspend fun getNotificationTitleList(appName: String): List + suspend fun getNotificationTitleList(appName: String, priorityActive: Boolean): List @Query( """ diff --git a/app/src/test/java/com/example/notimanager/data/repository/NotificationAppRepositoryTest.kt b/app/src/test/java/com/example/notimanager/data/repository/NotificationAppRepositoryTest.kt index fea2499..ea87d8f 100644 --- a/app/src/test/java/com/example/notimanager/data/repository/NotificationAppRepositoryTest.kt +++ b/app/src/test/java/com/example/notimanager/data/repository/NotificationAppRepositoryTest.kt @@ -28,7 +28,7 @@ class NotificationAppRepositoryTest: BehaviorSpec({ val expectedNotificationAppList = readJsonFile(expectedLayer, expected) toDtoList NotificationApp::class.java When("getNotificationAppList를 호출하면"){ - coEvery { dao.getNotificationAppPriorityList() } returns notificationAppDtoList + coEvery { dao.getNotificationAppList(true) } returns notificationAppDtoList Then("notificationAppList를 반환해야 한다."){ val result = repository.getNotificationAppPriorityList() @@ -45,7 +45,7 @@ class NotificationAppRepositoryTest: BehaviorSpec({ val expectedNotificationAppList = readJsonFile(expectedLayer, expected) toDtoList NotificationApp::class.java When("getNotificationAppList를 호출하면"){ - coEvery { dao.getNotificationAppList() } returns notificationAppDtoList + coEvery { dao.getNotificationAppList(false) } returns notificationAppDtoList Then("notificationAppList를 반환해야 한다."){ val result = repository.getNotificationAppList() diff --git a/app/src/test/java/com/example/notimanager/data/repository/NotificationTitleRepositoryTest.kt b/app/src/test/java/com/example/notimanager/data/repository/NotificationTitleRepositoryTest.kt index 89929ce..d17a1c7 100644 --- a/app/src/test/java/com/example/notimanager/data/repository/NotificationTitleRepositoryTest.kt +++ b/app/src/test/java/com/example/notimanager/data/repository/NotificationTitleRepositoryTest.kt @@ -28,10 +28,10 @@ class NotificationTitleRepositoryTest: BehaviorSpec({ val expectedNotificationTitleList = readJsonFile(expectedLayer, expected) toDtoList NotificationTitle::class.java When("getNotificationTitlePriorityList를 호출하면"){ - coEvery { dao.getNotificationTitlePriorityList("", "") } returns notificationTitleDtoList + coEvery { dao.getNotificationTitleList("", true) } returns notificationTitleDtoList Then("notificationTitleList를 반환해야 한다."){ - val result = repository.getNotificationTitlePriorityList("", "") + val result = repository.getNotificationTitlePriorityList("") result shouldBe expectedNotificationTitleList } } @@ -45,10 +45,10 @@ class NotificationTitleRepositoryTest: BehaviorSpec({ val expectedNotificationTitleList = readJsonFile(expectedLayer, expected) toDtoList NotificationTitle::class.java When("getNotificationTitleList를 호출하면"){ - coEvery { dao.getNotificationTitleList("", "") } returns notificationTitleDtoList + coEvery { dao.getNotificationTitleList("", false) } returns notificationTitleDtoList Then("notificationTitleList를 반환해야 한다."){ - val result = repository.getNotificationTitleList("", "") + val result = repository.getNotificationTitleList("") result shouldBe expectedNotificationTitleList } } From 732f86864ef4392befccd64933bf7316fc570017 Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 17:30:27 +0900 Subject: [PATCH 8/9] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94=20i?= =?UTF-8?q?mport=20=EB=AC=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repository/NotificationDomainRepository.kt | 1 - .../data/source/local/database/MigrationObject.kt | 5 ----- .../com/example/notimanager/domain/model/Notification.kt | 1 - .../com/example/notimanager/domain/utils/AppIconGetter.kt | 1 - .../stateholder/viewmodel/NotificationPermissionViewModel.kt | 1 - .../presentation/ui/component/NotificationAppListView.kt | 3 --- .../example/notimanager/presentation/ui/screen/MainScreen.kt | 1 - .../notimanager/presentation/ui/screen/NotificationScreen.kt | 1 - .../presentation/ui/screen/NotificationSubScreen.kt | 1 - .../notimanager/presentation/ui/screen/TitleScreen.kt | 1 - 10 files changed, 16 deletions(-) diff --git a/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt index 49c1a92..eb34120 100644 --- a/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt +++ b/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt @@ -1,6 +1,5 @@ package com.example.notimanager.data.repository -import com.example.notimanager.data.dto.NotificationDto import com.example.notimanager.data.source.local.dao.NotificationDao import com.example.notimanager.domain.model.Notification import com.example.notimanager.domain.repository.NotificationDomainRepositoryInterface diff --git a/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt b/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt index e5ae8c8..d4865dd 100644 --- a/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt +++ b/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt @@ -10,11 +10,6 @@ object MigrationObject { } } - val MIGRATION_4_5 = object : Migration(4, 5) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL("ALTER TABLE app_icon RENAME COLUMN appIconResId iconBytes") - } - } val MIGRATION_6_7 = object : Migration(6, 7) { override fun migrate(db: SupportSQLiteDatabase) { db.execSQL("CREATE INDEX index_notification_icon_priorityActive_priority ON notification_icon (priorityActive, priority);") diff --git a/app/src/main/java/com/example/notimanager/domain/model/Notification.kt b/app/src/main/java/com/example/notimanager/domain/model/Notification.kt index 3176f17..bb2ab0b 100644 --- a/app/src/main/java/com/example/notimanager/domain/model/Notification.kt +++ b/app/src/main/java/com/example/notimanager/domain/model/Notification.kt @@ -1,6 +1,5 @@ package com.example.notimanager.domain.model -import android.app.PendingIntent import android.content.Intent import android.graphics.Bitmap diff --git a/app/src/main/java/com/example/notimanager/domain/utils/AppIconGetter.kt b/app/src/main/java/com/example/notimanager/domain/utils/AppIconGetter.kt index 1c1f402..7d156dc 100644 --- a/app/src/main/java/com/example/notimanager/domain/utils/AppIconGetter.kt +++ b/app/src/main/java/com/example/notimanager/domain/utils/AppIconGetter.kt @@ -9,7 +9,6 @@ import android.graphics.Paint import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter import android.graphics.drawable.Drawable -import android.graphics.drawable.Icon import com.example.notimanager.common.objects.DateFormatter.toBitmap import java.io.ByteArrayOutputStream diff --git a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationPermissionViewModel.kt b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationPermissionViewModel.kt index c703f8b..54950fd 100644 --- a/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationPermissionViewModel.kt +++ b/app/src/main/java/com/example/notimanager/presentation/stateholder/viewmodel/NotificationPermissionViewModel.kt @@ -1,6 +1,5 @@ package com.example.notimanager.presentation.stateholder.viewmodel -import android.content.Context import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel 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 ec95d13..8c57d42 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 @@ -2,7 +2,6 @@ package com.example.notimanager.presentation.ui.component 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 @@ -13,7 +12,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.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -36,7 +34,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import com.example.notimanager.common.objects.DateFormatter.formatTimestamp -import com.example.notimanager.common.objects.Encoder.getEncodedString import com.example.notimanager.domain.model.NotificationApp import com.example.notimanager.presentation.stateholder.state.NotificationAppPriorityState import com.example.notimanager.presentation.stateholder.state.NotificationAppState 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 166a1d0..70ba6cc 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 @@ -17,7 +17,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LifecycleEventEffect -import androidx.lifecycle.compose.LifecycleResumeEffect import androidx.navigation.NavController import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppPriorityViewModel import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppViewModel 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 7a86310..41c7e28 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 @@ -20,7 +20,6 @@ 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.NotificationTitleListView import com.example.notimanager.presentation.ui.component.NotificationTopAppBar import kotlinx.coroutines.delay import kotlinx.coroutines.launch 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 18c72a4..25242d7 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,7 +19,6 @@ 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.stateholder.viewmodel.NotificationViewModel import com.example.notimanager.presentation.ui.component.NotificationListView import com.example.notimanager.presentation.ui.component.NotificationTopAppBar import kotlinx.coroutines.delay 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 582e35e..2435687 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,7 +20,6 @@ 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.NotificationAppListView import com.example.notimanager.presentation.ui.component.NotificationTitleListView import com.example.notimanager.presentation.ui.component.TitleTopAppBar import kotlinx.coroutines.delay From affceec7f2fb423a7b956f36996b151720a732ce Mon Sep 17 00:00:00 2001 From: Richter3766 <97567615+Richter3766@users.noreply.github.com> Date: Sat, 1 Mar 2025 17:27:46 +0900 Subject: [PATCH 9/9] =?UTF-8?q?Test:=20subText=20=EC=BB=AC=EB=9F=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...toryDomainTest.kt => NotificationDomainRepositoryTest.kt} | 2 +- .../domain/usecase/NotificationTitleUseCaseTest.kt | 4 ++-- app/src/test/resources/json/data/dto/NotificationDto.json | 5 +++++ .../test/resources/json/data/dto/NotificationTitleDto.json | 5 +++++ app/src/test/resources/json/domain/model/Notification.json | 5 +++++ .../test/resources/json/domain/model/NotificationTitle.json | 5 +++++ 6 files changed, 23 insertions(+), 3 deletions(-) rename app/src/test/java/com/example/notimanager/data/repository/{NotificationRepositoryDomainTest.kt => NotificationDomainRepositoryTest.kt} (96%) diff --git a/app/src/test/java/com/example/notimanager/data/repository/NotificationRepositoryDomainTest.kt b/app/src/test/java/com/example/notimanager/data/repository/NotificationDomainRepositoryTest.kt similarity index 96% rename from app/src/test/java/com/example/notimanager/data/repository/NotificationRepositoryDomainTest.kt rename to app/src/test/java/com/example/notimanager/data/repository/NotificationDomainRepositoryTest.kt index d877510..d6e5949 100644 --- a/app/src/test/java/com/example/notimanager/data/repository/NotificationRepositoryDomainTest.kt +++ b/app/src/test/java/com/example/notimanager/data/repository/NotificationDomainRepositoryTest.kt @@ -10,7 +10,7 @@ import io.kotest.matchers.shouldBe import io.mockk.coEvery import io.mockk.mockk -class NotificationRepositoryDomainTest: BehaviorSpec({ +class NotificationDomainRepositoryTest: BehaviorSpec({ val dao = mockk() val repository = NotificationDomainRepository(dao) diff --git a/app/src/test/java/com/example/notimanager/domain/usecase/NotificationTitleUseCaseTest.kt b/app/src/test/java/com/example/notimanager/domain/usecase/NotificationTitleUseCaseTest.kt index 7c088a4..001b4ca 100644 --- a/app/src/test/java/com/example/notimanager/domain/usecase/NotificationTitleUseCaseTest.kt +++ b/app/src/test/java/com/example/notimanager/domain/usecase/NotificationTitleUseCaseTest.kt @@ -21,10 +21,10 @@ class NotificationTitleUseCaseTest: BehaviorSpec({ val notificationTitleList = readJsonFile(layer, target) toDtoList NotificationTitle::class.java When("getNotificationTitleList를 호출하면"){ - coEvery { repository.getNotificationTitleList(any(), any()) } returns notificationTitleList + coEvery { repository.getNotificationTitleList(any()) } returns notificationTitleList Then("notificationTitleList를 반환해야 한다."){ - val result = useCase.getNotificationTitleList("", "") + val result = useCase.getNotificationTitleList("") result shouldBe notificationTitleList } } diff --git a/app/src/test/resources/json/data/dto/NotificationDto.json b/app/src/test/resources/json/data/dto/NotificationDto.json index 7b9852b..eb0eaf8 100644 --- a/app/src/test/resources/json/data/dto/NotificationDto.json +++ b/app/src/test/resources/json/data/dto/NotificationDto.json @@ -2,6 +2,7 @@ { "title": "New Message", "content": "You have received a new message from John.", + "subText": "", "timestamp": 1672531199000, "intentActive": true, "intentArray": [1, 2, 3, 4, 5], @@ -10,6 +11,7 @@ { "title": "Weather Update", "content": "Rain is expected in your area today.", + "subText": "", "timestamp": 1672531299000, "intentActive": false, "intentArray": [6, 7, 8, 9, 10], @@ -18,6 +20,7 @@ { "title": "New Email", "content": "You've got a new email from support@example.com.", + "subText": "", "timestamp": 1672531399000, "intentActive": true, "intentArray": [11, 12, 13], @@ -26,6 +29,7 @@ { "title": "Event Reminder", "content": "Don't forget your meeting at 3 PM today.", + "subText": "", "timestamp": 1672531499000, "intentActive": true, "intentArray": [14, 15], @@ -34,6 +38,7 @@ { "title": "Breaking News", "content": "New developments in the tech industry.", + "subText": "", "timestamp": 1672531599000, "intentActive": false, "intentArray": [16, 17, 18], diff --git a/app/src/test/resources/json/data/dto/NotificationTitleDto.json b/app/src/test/resources/json/data/dto/NotificationTitleDto.json index ff0bf55..e4dbd99 100644 --- a/app/src/test/resources/json/data/dto/NotificationTitleDto.json +++ b/app/src/test/resources/json/data/dto/NotificationTitleDto.json @@ -2,30 +2,35 @@ { "title": "New Message", "content": "You have received a new message from John.", + "subText": "", "timestamp": 1672531199000, "iconBytes": [6, 7, 8, 9, 10] }, { "title": "Weather Update", "content": "Rain is expected in your area today.", + "subText": "", "timestamp": 1672531299000, "iconBytes": [6, 7, 8, 9, 10] }, { "title": "New Email", "content": "You've got a new email from support@example.com.", + "subText": "", "timestamp": 1672531399000, "iconBytes": [6, 7, 8, 9, 10] }, { "title": "Event Reminder", "content": "Don't forget your meeting at 3 PM today.", + "subText": "", "timestamp": 1672531499000, "iconBytes": [6, 7, 8, 9, 10] }, { "title": "Breaking News", "content": "New developments in the tech industry.", + "subText": "", "timestamp": 1672531599000, "iconBytes": [6, 7, 8, 9, 10] } diff --git a/app/src/test/resources/json/domain/model/Notification.json b/app/src/test/resources/json/domain/model/Notification.json index b20a946..2aac559 100644 --- a/app/src/test/resources/json/domain/model/Notification.json +++ b/app/src/test/resources/json/domain/model/Notification.json @@ -2,6 +2,7 @@ { "title": "New Message", "content": "You have received a new message from John.", + "subText": "", "timestamp": 1672531199000, "intentActive": true, "intent": null, @@ -10,6 +11,7 @@ { "title": "Weather Update", "content": "Rain is expected in your area today.", + "subText": "", "timestamp": 1672531299000, "intentActive": false, "intent": null, @@ -18,6 +20,7 @@ { "title": "New Email", "content": "You've got a new email from support@example.com.", + "subText": "", "timestamp": 1672531399000, "intentActive": true, "intent": null, @@ -26,6 +29,7 @@ { "title": "Event Reminder", "content": "Don't forget your meeting at 3 PM today.", + "subText": "", "timestamp": 1672531499000, "intentActive": true, "intent": null, @@ -34,6 +38,7 @@ { "title": "Breaking News", "content": "New developments in the tech industry.", + "subText": "", "timestamp": 1672531599000, "intentActive": false, "intent": null, diff --git a/app/src/test/resources/json/domain/model/NotificationTitle.json b/app/src/test/resources/json/domain/model/NotificationTitle.json index 2facce7..0892112 100644 --- a/app/src/test/resources/json/domain/model/NotificationTitle.json +++ b/app/src/test/resources/json/domain/model/NotificationTitle.json @@ -2,30 +2,35 @@ { "title": "New Message", "content": "You have received a new message from John.", + "subText": "", "timestamp": 1672531199000, "notificationIcon": null }, { "title": "Weather Update", "content": "Rain is expected in your area today.", + "subText": "", "timestamp": 1672531299000, "notificationIcon": null }, { "title": "New Email", "content": "You've got a new email from support@example.com.", + "subText": "", "timestamp": 1672531399000, "notificationIcon": null }, { "title": "Event Reminder", "content": "Don't forget your meeting at 3 PM today.", + "subText": "", "timestamp": 1672531499000, "notificationIcon": null }, { "title": "Breaking News", "content": "New developments in the tech industry.", + "subText": "", "timestamp": 1672531599000, "notificationIcon": null }