diff --git a/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/7.json b/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/7.json index 9c6f87f..bece172 100644 --- a/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/7.json +++ b/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/7.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 7, - "identityHash": "ddf91ad81bbb46713142177c854d85ad", + "identityHash": "0bb8836fe6777d5c9170a6881beae9fe", "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)", + "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", @@ -37,6 +37,12 @@ "columnName": "timestamp", "affinity": "INTEGER", "notNull": true + }, + { + "fieldPath": "subText", + "columnName": "subText", + "affinity": "TEXT", + "notNull": true } ], "primaryKey": { @@ -62,7 +68,7 @@ }, { "tableName": "notification_meta", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`notificationId` INTEGER NOT NULL, `intentActive` INTEGER NOT NULL, `intentArray` BLOB NOT NULL, PRIMARY KEY(`notificationId`), FOREIGN KEY(`notificationId`) REFERENCES `notification`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "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", @@ -81,6 +87,12 @@ "columnName": "intentArray", "affinity": "BLOB", "notNull": true + }, + { + "fieldPath": "isRead", + "columnName": "isRead", + "affinity": "INTEGER", + "notNull": true } ], "primaryKey": { @@ -222,7 +234,7 @@ "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, 'ddf91ad81bbb46713142177c854d85ad')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0bb8836fe6777d5c9170a6881beae9fe')" ] } } \ No newline at end of file diff --git a/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/8.json b/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/8.json new file mode 100644 index 0000000..7b13a36 --- /dev/null +++ b/app/schemas/com.example.notimanager.data.source.local.database.NotiManagerDatabase/8.json @@ -0,0 +1,240 @@ +{ + "formatVersion": 1, + "database": { + "version": 8, + "identityHash": "0bb8836fe6777d5c9170a6881beae9fe", + "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`)" + } + ], + "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, '0bb8836fe6777d5c9170a6881beae9fe')" + ] + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/notimanager/data/service/NotiListenerServiceTest.kt b/app/src/androidTest/java/com/example/notimanager/data/service/NotiListenerServiceTest.kt index 6c837c9..47a5f5a 100644 --- a/app/src/androidTest/java/com/example/notimanager/data/service/NotiListenerServiceTest.kt +++ b/app/src/androidTest/java/com/example/notimanager/data/service/NotiListenerServiceTest.kt @@ -14,8 +14,8 @@ import com.example.notimanager.presentation.ui.activity.MainActivity import com.example.notimanager.data.model.NotificationModel import com.example.notimanager.data.repository.NotificationRepository import com.example.notimanager.domain.service.NotiListenerService -import com.example.notimanager.data.utils.NameGetter -import com.example.notimanager.data.utils.IntentHelper +import com.example.notimanager.domain.utils.NameGetter +import com.example.notimanager.domain.utils.IntentHelper import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every diff --git a/app/src/androidTest/java/com/example/notimanager/data/utils/NameGetterTest.kt b/app/src/androidTest/java/com/example/notimanager/data/utils/NameGetterTest.kt index 01057e7..7cb96e9 100644 --- a/app/src/androidTest/java/com/example/notimanager/data/utils/NameGetterTest.kt +++ b/app/src/androidTest/java/com/example/notimanager/data/utils/NameGetterTest.kt @@ -6,6 +6,7 @@ import android.content.pm.PackageManager import android.os.UserHandle import android.service.notification.StatusBarNotification import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.notimanager.domain.utils.NameGetter import io.mockk.every import io.mockk.mockk import io.mockk.unmockkAll diff --git a/app/src/main/java/com/example/notimanager/common/objects/Encoder.kt b/app/src/main/java/com/example/notimanager/common/objects/Encoder.kt new file mode 100644 index 0000000..bef7951 --- /dev/null +++ b/app/src/main/java/com/example/notimanager/common/objects/Encoder.kt @@ -0,0 +1,15 @@ +package com.example.notimanager.common.objects + +import java.net.URLDecoder +import java.net.URLEncoder +import java.nio.charset.StandardCharsets + +object Encoder { + fun getEncodedString(target: String): String { + return URLEncoder.encode(target, StandardCharsets.UTF_8.toString()) + } + + fun getDecodeString(target: String): String { + return URLDecoder.decode(target, StandardCharsets.UTF_8.toString()) + } +} \ 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 e802e84..70dd94c 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 @@ -1,7 +1,7 @@ package com.example.notimanager.data.dto import android.graphics.BitmapFactory -import com.example.notimanager.data.utils.IntentHelper.retrieveIntent +import com.example.notimanager.domain.utils.IntentHelper.retrieveIntent import com.example.notimanager.domain.model.Notification data class NotificationDto( diff --git a/app/src/main/java/com/example/notimanager/data/model/NotificationMetaModel.kt b/app/src/main/java/com/example/notimanager/data/model/NotificationMetaModel.kt index b4dd3cb..cd738e5 100644 --- a/app/src/main/java/com/example/notimanager/data/model/NotificationMetaModel.kt +++ b/app/src/main/java/com/example/notimanager/data/model/NotificationMetaModel.kt @@ -19,6 +19,7 @@ data class NotificationMetaModel( @PrimaryKey val notificationId: Long, val intentActive: Boolean = true, - val intentArray: ByteArray + val intentArray: ByteArray, + val isRead: Boolean = false, ) 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 514c38a..c7115d2 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 @@ -15,4 +15,5 @@ data class NotificationModel( val title: String, val content: String, val timestamp: Long, + val subText: String, ) 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 e409fb3..653807b 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 @@ -21,4 +21,11 @@ object MigrationObject { db.execSQL("CREATE INDEX index_app_icon_priorityActive_priority ON app_icon (priorityActive, priority);") } } + + val MIGRATION_7_8 = object : Migration(7, 8) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE notification ADD COLUMN subText TEXT NOT NULL DEFAULT '';") + db.execSQL("ALTER TABLE notification_meta ADD COLUMN isRead INTEGER NOT NULL DEFAULT '0';") + } + } } \ 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 d16c3c3..cc34ac6 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 @@ -15,9 +15,10 @@ import com.example.notimanager.data.source.local.dao.NotificationIconDao 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 @Database( - version = 7, + version = 8, entities = [ NotificationModel::class, @@ -26,7 +27,7 @@ import com.example.notimanager.data.source.local.database.MigrationObject.MIGRAT AppIconModel::class ], // autoMigrations = [ -// AutoMigration (from = 6, to = 7) +// AutoMigration (from = 7, to = 8) // ] ) abstract class NotiManagerDatabase : RoomDatabase() { @@ -48,7 +49,8 @@ abstract class NotiManagerDatabase : RoomDatabase() { ) .addMigrations( MIGRATION_3_4, - MIGRATION_6_7 + MIGRATION_6_7, + MIGRATION_7_8 ) .fallbackToDestructiveMigration() .build() diff --git a/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt b/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt index 76e9653..46e3701 100644 --- a/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt +++ b/app/src/main/java/com/example/notimanager/domain/service/NotiListenerService.kt @@ -8,10 +8,11 @@ import com.example.notimanager.data.model.NotificationIconModel import com.example.notimanager.data.model.NotificationMetaModel import com.example.notimanager.data.model.NotificationModel import com.example.notimanager.domain.repository.NotificationRepositoryInterface -import com.example.notimanager.data.utils.AppIconGetter.convertByteArray -import com.example.notimanager.data.utils.AppIconGetter.convertByteArrayWithColor -import com.example.notimanager.data.utils.NameGetter -import com.example.notimanager.data.utils.IntentHelper +import com.example.notimanager.domain.utils.AppIconGetter.convertByteArray +import com.example.notimanager.domain.utils.AppIconGetter.convertByteArrayWithColor +import com.example.notimanager.domain.utils.AppIconGetter.getAppIcon +import com.example.notimanager.domain.utils.NameGetter +import com.example.notimanager.domain.utils.IntentHelper import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -34,14 +35,15 @@ class NotiListenerService: NotificationListenerService() { val title = notification.extras.getString("android.title") val content = notification.extras.getString("android.text") + val subText = notification.extras.getString("android.subText") ?: "" if (title != null && content != null){ CoroutineScope(Dispatchers.IO).launch { mutex.withLock { - val id = insertNotification(appName, title, content, postTime) + val id = insertNotification(appName, title, content, postTime, subText) insertNotificationMeta(id, it.packageName) - insertNotificationIcon(id, notification.getLargeIcon()) - insertAppIcon(appName, notification.smallIcon, notification.color) + insertNotificationIcon(id, notification.getLargeIcon(), notification.smallIcon, notification.color) + insertAppIcon(appName, it.packageName) } } @@ -52,13 +54,15 @@ class NotiListenerService: NotificationListenerService() { appName: String, title: String, content: String, - postTime: Long + postTime: Long, + subText: String ): Long{ val notificationModel = NotificationModel( appName = appName, title = title, content = content, - timestamp = postTime + timestamp = postTime, + subText = subText ) return notificationRepository.insertNotification(notificationModel) } @@ -78,8 +82,18 @@ class NotiListenerService: NotificationListenerService() { notificationRepository.insertNotificationMeta(notificationMetaModel) } - private suspend fun insertNotificationIcon(id: Long, icon: Icon?){ - val byteArray = convertByteArray(this@NotiListenerService, icon) + private suspend fun insertNotificationIcon( + id: Long, + iconLarge: Icon?, + iconSmall: Icon?, + color: Int + ){ + val byteArray = if (iconLarge != null) { + convertByteArray(iconLarge.loadDrawable(this@NotiListenerService)) + } else { + convertByteArrayWithColor(iconSmall?.loadDrawable(this@NotiListenerService), color) + ?: ByteArray(0) + } val notificationIconModel = NotificationIconModel( notificationId = id, @@ -90,10 +104,10 @@ class NotiListenerService: NotificationListenerService() { private suspend fun insertAppIcon( appName: String, - icon: Icon?, - color: Int + packageName: String ){ - val byteArray = convertByteArrayWithColor(this@NotiListenerService, icon, color) + val byteArray = convertByteArray(getAppIcon(this@NotiListenerService, packageName)) + val appIconModel = AppIconModel( notiAppName = appName, iconBytes = byteArray diff --git a/app/src/main/java/com/example/notimanager/data/utils/AppIconGetter.kt b/app/src/main/java/com/example/notimanager/domain/utils/AppIconGetter.kt similarity index 61% rename from app/src/main/java/com/example/notimanager/data/utils/AppIconGetter.kt rename to app/src/main/java/com/example/notimanager/domain/utils/AppIconGetter.kt index 0a1d668..1c1f402 100644 --- a/app/src/main/java/com/example/notimanager/data/utils/AppIconGetter.kt +++ b/app/src/main/java/com/example/notimanager/domain/utils/AppIconGetter.kt @@ -1,21 +1,24 @@ -package com.example.notimanager.data.utils +package com.example.notimanager.domain.utils import android.content.Context +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.Canvas 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 object AppIconGetter { - fun convertByteArrayWithColor(context: Context, icon: Icon?, color: Int): ByteArray{ - if (icon == null) return ByteArray(0) + fun convertByteArrayWithColor(icon: Drawable?, color: Int): ByteArray?{ + if (icon == null) return null // Icon을 Drawable로 변환 후 Bitmap으로 변환 - val bitmap = icon.loadDrawable(context)?.toBitmap() ?: return ByteArray(0) + val bitmap = icon.toBitmap() val bitmapConfig = bitmap.config ?: Bitmap.Config.ARGB_8888 // 색상 필터 적용 @@ -37,10 +40,21 @@ object AppIconGetter { return stream.toByteArray() } - fun convertByteArray(context: Context, icon: Icon?): ByteArray{ - val bitmap = icon?.loadDrawable(context)?.toBitmap() + fun convertByteArray(icon: Drawable?): ByteArray{ + val bitmap = icon?.toBitmap() val stream = ByteArrayOutputStream() bitmap?.compress(Bitmap.CompressFormat.PNG, 100, stream) return stream.toByteArray() } + + fun getAppIcon(context: Context, packageName: String): Drawable? { + return try { + val packageManager: PackageManager = context.packageManager + val applicationInfo: ApplicationInfo = packageManager.getApplicationInfo(packageName, 0) + packageManager.getApplicationIcon(applicationInfo) + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + null + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/notimanager/data/utils/IntentHelper.kt b/app/src/main/java/com/example/notimanager/domain/utils/IntentHelper.kt similarity index 94% rename from app/src/main/java/com/example/notimanager/data/utils/IntentHelper.kt rename to app/src/main/java/com/example/notimanager/domain/utils/IntentHelper.kt index c97c833..4df41ba 100644 --- a/app/src/main/java/com/example/notimanager/data/utils/IntentHelper.kt +++ b/app/src/main/java/com/example/notimanager/domain/utils/IntentHelper.kt @@ -1,4 +1,4 @@ -package com.example.notimanager.data.utils +package com.example.notimanager.domain.utils import android.content.Intent import android.os.Parcel diff --git a/app/src/main/java/com/example/notimanager/data/utils/NameGetter.kt b/app/src/main/java/com/example/notimanager/domain/utils/NameGetter.kt similarity index 93% rename from app/src/main/java/com/example/notimanager/data/utils/NameGetter.kt rename to app/src/main/java/com/example/notimanager/domain/utils/NameGetter.kt index 0d8d6da..d4e8ee7 100644 --- a/app/src/main/java/com/example/notimanager/data/utils/NameGetter.kt +++ b/app/src/main/java/com/example/notimanager/domain/utils/NameGetter.kt @@ -1,4 +1,4 @@ -package com.example.notimanager.data.utils +package com.example.notimanager.domain.utils import android.content.Context import android.content.pm.PackageManager 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 55813e9..162e116 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 @@ -36,6 +36,7 @@ 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 @@ -74,7 +75,7 @@ fun NotificationAppListView( onClick = { navController .navigate( - "titleScreen/${notification.appName}/${notification.title}" + "titleScreen/${notification.appName}/${getEncodedString(notification.title)}" ) }, viewModel = viewModel, @@ -92,7 +93,7 @@ fun NotificationAppListView( onClick = { navController .navigate( - "titleScreen/${notification.appName}/${notification.title}" + "titleScreen/${notification.appName}/${getEncodedString(notification.title)}" ) }, 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 899cd92..de3e7b9 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 @@ -34,6 +34,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp 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.NotificationTitle import com.example.notimanager.presentation.stateholder.state.NotificationTitlePriorityState import com.example.notimanager.presentation.stateholder.state.NotificationTitleState @@ -73,7 +74,7 @@ fun NotificationTitleListView( items(currentNotiPriority) { notification -> NotificationTitleItemView(notification = notification, onClick = { navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${notification.title}" + "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}" ) }, viewModel = viewModel, priorityViewModel = priorityViewModel) } @@ -85,7 +86,7 @@ fun NotificationTitleListView( items(currentNoti) { notification -> NotificationTitleItemView(notification = notification, onClick = { navController.navigate( - "notificationScreen/${viewModel.getAppName()}/${notification.title}" + "notificationScreen/${viewModel.getAppName()}/${getEncodedString(notification.title)}" ) }, 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 83e56d7..06ee476 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 @@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost 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.TitleScreen @@ -20,12 +21,12 @@ fun AppNavHost(navController: NavHostController) { composable("titleScreen/{appName}/{title}") { backStackEntry -> val appName = backStackEntry.arguments?.getString("appName") val title = backStackEntry.arguments?.getString("title") - TitleScreen(navController, appName!!, title!!) + TitleScreen(navController, appName!!, getDecodeString(title!!)) } composable("notificationScreen/{appName}/{title}") { backStackEntry -> val appName = backStackEntry.arguments?.getString("appName") val title = backStackEntry.arguments?.getString("title") - NotificationScreen(navController, appName!!, title!!) + NotificationScreen(navController, appName!!, getDecodeString(title!!)) } } } \ No newline at end of file diff --git a/app/src/test/java/com/example/notimanager/data/repository/NotificationRepositoryTest.kt b/app/src/test/java/com/example/notimanager/data/repository/NotificationRepositoryTest.kt index 9b32c50..5f3a594 100644 --- a/app/src/test/java/com/example/notimanager/data/repository/NotificationRepositoryTest.kt +++ b/app/src/test/java/com/example/notimanager/data/repository/NotificationRepositoryTest.kt @@ -16,10 +16,10 @@ import io.mockk.coEvery import io.mockk.mockk class NotificationRepositoryTest: BehaviorSpec({ - val notificationDao: NotificationDao = mockk() - val notificationMetaDao: NotificationMetaDao = mockk() - val notificationIconDao: NotificationIconDao = mockk() - val appIconDao: AppIconDao = mockk() + val notificationDao = mockk() + val notificationMetaDao = mockk() + val notificationIconDao = mockk() + val appIconDao = mockk() val repository = NotificationRepository( notificationDao, notificationMetaDao, diff --git a/app/src/test/resources/json/data/model/NotificationModel.json b/app/src/test/resources/json/data/model/NotificationModel.json index 34d75f1..634015c 100644 --- a/app/src/test/resources/json/data/model/NotificationModel.json +++ b/app/src/test/resources/json/data/model/NotificationModel.json @@ -3,5 +3,6 @@ "appName" : "Weather App", "title": "Weather Update", "content": "Rain is expected in your area today.", - "timestamp": 1672531299000 + "timestamp": 1672531299000, + "subText": "test" } \ No newline at end of file