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/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/NotificationDomainRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/NotificationDomainRepository.kt index 1b2c63f..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 @@ -16,4 +16,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/data/repository/NotificationTitleRepository.kt b/app/src/main/java/com/example/notimanager/data/repository/NotificationTitleRepository.kt index 79bdc81..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 @@ -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, false) .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.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 9a161a4..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 @@ -16,10 +16,10 @@ interface NotificationDao { @Query( """ - SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes , ai.priorityActive, ai.priority + 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 + WHERE ai.priorityActive = :priorityActive AND timestamp = ( SELECT MAX(timestamp) FROM notification AS n2 @@ -28,69 +28,74 @@ interface NotificationDao { ORDER BY timestamp DESC """ ) - suspend fun getNotificationAppPriorityList(): List + suspend fun getNotificationAppList(priorityActive: Boolean): List @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 = 1 + WHERE ni.priorityActive = :priorityActive 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 - """ - ) - suspend fun getNotificationTitlePriorityList(appName: String, title: String): List - - @Query( - """ - SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes, ai.priorityActive, ai.priority + 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 app_icon AS ai ON n1.appName = ai.notiAppName - WHERE ai.priorityActive = 0 - AND timestamp = ( + INNER JOIN notification_icon AS ni ON n1.id = ni.notificationId + 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 + WHERE n1.appName = n2.appName AND n1.subText = n2.subText ) - ORDER BY timestamp DESC + AND n1.subText IN ( + SELECT subText + FROM notification + WHERE appName = :appName + GROUP BY subText + ) + + ORDER BY n1.timestamp DESC """ ) - suspend fun getNotificationAppList(): List + suspend fun getNotificationTitleList(appName: String, priorityActive: Boolean): List @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 = 0 - 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 - ) + 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.title = :title ORDER BY timestamp DESC """ ) - suspend fun getNotificationTitleList(appName: String, title: String): List + suspend fun getNotificationList(appName: String, title: 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 - WHERE n.appName = :appName AND n.title = :title + WHERE n.appName = :appName AND n.subText = :subText ORDER BY timestamp DESC """ ) - 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/data/source/local/database/MigrationObject.kt b/app/src/main/java/com/example/notimanager/data/source/local/database/MigrationObject.kt index 653807b..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);") @@ -28,4 +23,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() 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..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,11 +1,11 @@ package com.example.notimanager.domain.model -import android.app.PendingIntent import android.content.Intent 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/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/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 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/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/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..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 @@ -75,7 +72,7 @@ fun NotificationAppListView( onClick = { navController .navigate( - "titleScreen/${notification.appName}/${getEncodedString(notification.title)}" + "titleScreen/${notification.appName}" ) }, viewModel = viewModel, @@ -93,7 +90,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/component/NotificationListView.kt b/app/src/main/java/com/example/notimanager/presentation/ui/component/NotificationListView.kt index d18aa0d..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 @@ -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); } - } + }) } } } 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..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 @@ -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 @@ -73,9 +71,10 @@ fun NotificationTitleListView( ) { items(currentNotiPriority) { notification -> NotificationTitleItemView(notification = notification, onClick = { - navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}" - ) + 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) } @@ -85,9 +84,8 @@ fun NotificationTitleListView( items(currentNoti) { notification -> NotificationTitleItemView(notification = notification, onClick = { - navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}" - ) + 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) } } @@ -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 06ee476..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 @@ -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,15 +19,16 @@ fun AppNavHost(navController: NavHostController) { composable("mainScreen") { MainScreen(navController) } - composable("titleScreen/{appName}/{title}") { backStackEntry -> + composable("titleScreen/{appName}") { 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 -> + 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 == "False") 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/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 4101f3a..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 @@ -1,22 +1,46 @@ 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.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 +53,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..25242d7 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/presentation/ui/screen/NotificationSubScreen.kt @@ -0,0 +1,65 @@ +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.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 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..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 @@ -28,16 +27,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 +46,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( 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/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/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 } } 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 }