diff --git a/AndroidApp/.idea/inspectionProfiles/Project_Default.xml b/AndroidApp/.idea/inspectionProfiles/Project_Default.xml
index e0da3ee5..7061a0d6 100644
--- a/AndroidApp/.idea/inspectionProfiles/Project_Default.xml
+++ b/AndroidApp/.idea/inspectionProfiles/Project_Default.xml
@@ -41,10 +41,6 @@
-
-
-
-
@@ -53,15 +49,7 @@
-
-
-
-
-
-
-
-
-
+
diff --git a/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/App.kt b/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/App.kt
index 3d3811f8..5865ba0e 100644
--- a/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/App.kt
+++ b/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/App.kt
@@ -21,6 +21,7 @@ import me.nya_n.notificationnotifier.domain.usecase.NotifyUseCase
import me.nya_n.notificationnotifier.domain.usecase.PackageVisibilityGrantedUseCase
import me.nya_n.notificationnotifier.domain.usecase.SaveAddressUseCase
import me.nya_n.notificationnotifier.domain.usecase.SaveFilterConditionUseCase
+import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase
import me.nya_n.notificationnotifier.domain.usecase.impl.AddTargetAppUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.CheckPackageVisibilityUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.DeleteTargetAppUseCaseImpl
@@ -34,6 +35,7 @@ import me.nya_n.notificationnotifier.domain.usecase.impl.NotifyUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.PackageVisibilityGrantedUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveAddressUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveFilterConditionUseCaseImpl
+import me.nya_n.notificationnotifier.domain.usecase.impl.ToggleIgnoreSummaryUseCaseImpl
import me.nya_n.notificationnotifier.model.AppConfig
import me.nya_n.notificationnotifier.ui.screen.app.AppViewModel
import me.nya_n.notificationnotifier.ui.screen.detail.DetailViewModel
@@ -84,7 +86,7 @@ class App : Application() {
// ViewModel
viewModel { AppViewModel(get(), packageName, get(), get()) }
viewModel { SelectionViewModel(get(), get(), get()) }
- viewModel { params -> DetailViewModel(get(), get(), get(), params.get()) }
+ viewModel { params -> DetailViewModel(get(), get(), get(), get(), params.get()) }
viewModel { TargetViewModel(get(), get()) }
viewModel { SettingsViewModel(get(), get(), get(), get(), get(), get()) }
@@ -104,5 +106,6 @@ class App : Application() {
factory { CheckPackageVisibilityUseCaseImpl(get()) }
factory { SaveAddressUseCaseImpl(get()) }
factory { SaveFilterConditionUseCaseImpl(get()) }
+ factory { ToggleIgnoreSummaryUseCaseImpl(get()) }
}
}
\ No newline at end of file
diff --git a/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt b/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt
index 867edb79..d7cc3ff6 100644
--- a/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt
+++ b/AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt
@@ -4,7 +4,10 @@ import android.os.Bundle
import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification
import android.text.SpannableString
-import kotlinx.coroutines.*
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
import me.nya_n.notificationnotifier.domain.usecase.NotifyTargetAppNotificationUseCase
import org.koin.android.ext.android.inject
@@ -29,7 +32,7 @@ class NotificationService : NotificationListenerService() {
val extras = sbn.notification.extras
val title = getTitle(extras) ?: return@launch
val message = extras.getCharSequence("android.text").toString()
- useCase(sbn.packageName, title, message)
+ useCase.invoke(sbn.packageName, title, message, sbn.notification.flags)
}
}
diff --git a/AndroidApp/data/repository/schemas/me.nya_n.notificationnotifier.data.repository.source.DB/2.json b/AndroidApp/data/repository/schemas/me.nya_n.notificationnotifier.data.repository.source.DB/2.json
new file mode 100644
index 00000000..708a15cc
--- /dev/null
+++ b/AndroidApp/data/repository/schemas/me.nya_n.notificationnotifier.data.repository.source.DB/2.json
@@ -0,0 +1,68 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 2,
+ "identityHash": "85b4a3de210e1ef5dfec5df608f693db",
+ "entities": [
+ {
+ "tableName": "conditions",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`target_package_name` TEXT NOT NULL, `is_ignore_summary` INTEGER NOT NULL DEFAULT 0, `condition` TEXT NOT NULL, PRIMARY KEY(`target_package_name`))",
+ "fields": [
+ {
+ "fieldPath": "targetPackageName",
+ "columnName": "target_package_name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "isIgnoreSummary",
+ "columnName": "is_ignore_summary",
+ "affinity": "INTEGER",
+ "notNull": true,
+ "defaultValue": "0"
+ },
+ {
+ "fieldPath": "condition",
+ "columnName": "condition",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "target_package_name"
+ ]
+ }
+ },
+ {
+ "tableName": "targets",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`label` TEXT NOT NULL, `package_name` TEXT NOT NULL, PRIMARY KEY(`package_name`))",
+ "fields": [
+ {
+ "fieldPath": "label",
+ "columnName": "label",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "packageName",
+ "columnName": "package_name",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "package_name"
+ ]
+ }
+ }
+ ],
+ "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, '85b4a3de210e1ef5dfec5df608f693db')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/AppRepository.kt b/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/AppRepository.kt
index 02be08a3..83aed6ad 100644
--- a/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/AppRepository.kt
+++ b/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/AppRepository.kt
@@ -10,6 +10,7 @@ interface AppRepository {
/* フィルタリング条件関連 */
suspend fun getFilterCondition(targetPackageName: String): FilterCondition?
+ suspend fun getFilterConditionOrDefault(targetPackageName: String): FilterCondition
suspend fun getFilterConditionList(): List
diff --git a/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/impl/AppRepositoryImpl.kt b/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/impl/AppRepositoryImpl.kt
index 7ea49db2..427cd3ec 100644
--- a/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/impl/AppRepositoryImpl.kt
+++ b/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/impl/AppRepositoryImpl.kt
@@ -26,6 +26,10 @@ class AppRepositoryImpl(
}
}
+ override suspend fun getFilterConditionOrDefault(targetPackageName: String): FilterCondition {
+ return getFilterCondition(targetPackageName) ?: FilterCondition.default(targetPackageName)
+ }
+
override suspend fun getFilterConditionList(): List {
return withContext(Dispatchers.IO) {
filterConditionDao.getAll()
diff --git a/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/DB.kt b/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/DB.kt
index ab471f92..512e91b4 100644
--- a/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/DB.kt
+++ b/AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/DB.kt
@@ -1,6 +1,7 @@
package me.nya_n.notificationnotifier.data.repository.source
import android.content.Context
+import androidx.room.AutoMigration
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@@ -12,9 +13,11 @@ import me.nya_n.notificationnotifier.model.InstalledApp
FilterCondition::class,
InstalledApp::class
],
- version = 1,
+ version = 2,
exportSchema = true,
- autoMigrations = []
+ autoMigrations = [
+ AutoMigration(from = 1, to = 2)
+ ]
)
abstract class DB : RoomDatabase() {
@@ -58,7 +61,7 @@ abstract class DB : RoomDatabase() {
fun version(): Int {
return try {
INSTANCE?.openHelper?.readableDatabase?.version ?: -1
- } catch (e: Exception) {
+ } catch (_: Exception) {
-1
}
}
diff --git a/AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt b/AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt
index 32941f65..8d15e97a 100644
--- a/AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt
+++ b/AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt
@@ -15,7 +15,8 @@ import me.nya_n.notificationnotifier.data.repository.impl.UserSettingsRepository
import me.nya_n.notificationnotifier.data.repository.source.DB
import me.nya_n.notificationnotifier.data.repository.source.UserSettingsDataStore
import me.nya_n.notificationnotifier.data.repository.util.SharedPreferenceProvider
-import me.nya_n.notificationnotifier.domain.usecase.*
+import me.nya_n.notificationnotifier.domain.usecase.SaveFilterConditionUseCase
+import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase
import me.nya_n.notificationnotifier.domain.usecase.impl.AddTargetAppUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.DeleteTargetAppUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.ExportDataUseCaseImpl
@@ -27,6 +28,8 @@ import me.nya_n.notificationnotifier.domain.usecase.impl.NotifyUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.PackageVisibilityGrantedUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveAddressUseCaseImpl
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveFilterConditionUseCaseImpl
+import me.nya_n.notificationnotifier.domain.usecase.impl.ToggleIgnoreSummaryUseCaseImpl
+import me.nya_n.notificationnotifier.model.FilterCondition
import me.nya_n.notificationnotifier.model.InstalledApp
import org.junit.Before
import org.junit.Ignore
@@ -116,15 +119,24 @@ class UseCaseTest {
runBlocking {
val cond = "test"
val updatedCond = "updated"
- val app = InstalledApp("sample", "com.sample.www")
- val saver = SaveFilterConditionUseCaseImpl(appRepository)
- saver(SaveFilterConditionUseCase.Args(app, cond))
+ val packageName = "com.sample.www"
+ val app = InstalledApp("sample", packageName)
+ val saver = SaveFilterConditionUseCaseImpl(appRepository)
+ val toggler = ToggleIgnoreSummaryUseCaseImpl(appRepository)
val loader = LoadFilterConditionUseCaseImpl(appRepository)
- assertThat(loader(app)).isEqualTo(cond)
+ // 追加
+ saver(SaveFilterConditionUseCase.Args(app, cond))
+ assertThat(loader(app)).isEqualTo(FilterCondition(packageName, false, cond))
+
+ // メッセージ条件の更新
saver(SaveFilterConditionUseCase.Args(app, updatedCond))
- assertThat(loader(app)).isEqualTo(updatedCond)
+ assertThat(loader(app)).isEqualTo(FilterCondition(packageName, false, updatedCond))
+
+ // サマリー条件の更新
+ toggler.invoke(ToggleIgnoreSummaryUseCase.Args(app))
+ assertThat(loader(app)).isEqualTo(FilterCondition(packageName, true, updatedCond))
}
}
@@ -214,14 +226,17 @@ class UseCaseTest {
val targetSaver = AddTargetAppUseCaseImpl(appRepository)
val condSaver = SaveFilterConditionUseCaseImpl(appRepository)
val addrSaver = SaveAddressUseCaseImpl(userSettingsRepository)
+ val toggler = ToggleIgnoreSummaryUseCaseImpl(appRepository)
// 初期値の保存
// ターゲット
- val app = InstalledApp("export", "test.export")
+ val packageName = "test.export"
+ val app = InstalledApp("export", packageName)
targetSaver(app)
// 条件
val cond = ".*"
condSaver(SaveFilterConditionUseCase.Args(app, cond))
+ toggler.invoke(ToggleIgnoreSummaryUseCase.Args(app))
// アドレス
val addr = "192.168.1.4:5050"
addrSaver(addr)
@@ -234,6 +249,7 @@ class UseCaseTest {
targetSaver(InstalledApp("new", "new"))
// 条件
condSaver(SaveFilterConditionUseCase.Args(app, "new"))
+ toggler.invoke(ToggleIgnoreSummaryUseCase.Args(app))
// 復元
ImportDataUseCaseImpl(userSettingsRepository, appRepository)(appContext, uri)
@@ -248,7 +264,7 @@ class UseCaseTest {
}
// 条件
val restoreCond = LoadFilterConditionUseCaseImpl(appRepository)(app)
- assertThat(restoreCond).isEqualTo(cond)
+ assertThat(restoreCond).isEqualTo(FilterCondition(packageName, true, cond))
// アドレス
val restoreAddr = LoadAddressUseCaseImpl(userSettingsRepository)()
assertThat(restoreAddr).isEqualTo(addr)
diff --git a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/LoadFilterConditionUseCase.kt b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/LoadFilterConditionUseCase.kt
index d93671df..a47b7669 100644
--- a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/LoadFilterConditionUseCase.kt
+++ b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/LoadFilterConditionUseCase.kt
@@ -1,8 +1,9 @@
package me.nya_n.notificationnotifier.domain.usecase
+import me.nya_n.notificationnotifier.model.FilterCondition
import me.nya_n.notificationnotifier.model.InstalledApp
/** 通知条件を読み込む */
interface LoadFilterConditionUseCase {
- suspend operator fun invoke(target: InstalledApp): String
+ suspend operator fun invoke(target: InstalledApp): FilterCondition
}
\ No newline at end of file
diff --git a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyTargetAppNotificationUseCase.kt b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyTargetAppNotificationUseCase.kt
index 88ad14c8..dd969ffd 100644
--- a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyTargetAppNotificationUseCase.kt
+++ b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyTargetAppNotificationUseCase.kt
@@ -4,6 +4,7 @@ interface NotifyTargetAppNotificationUseCase {
suspend operator fun invoke(
packageName: String,
title: String,
- message: String
+ message: String,
+ flags: Int
): Result
}
\ No newline at end of file
diff --git a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/ToggleIgnoreSummaryUseCase.kt b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/ToggleIgnoreSummaryUseCase.kt
new file mode 100644
index 00000000..74603405
--- /dev/null
+++ b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/ToggleIgnoreSummaryUseCase.kt
@@ -0,0 +1,9 @@
+package me.nya_n.notificationnotifier.domain.usecase
+
+import me.nya_n.notificationnotifier.model.InstalledApp
+
+interface ToggleIgnoreSummaryUseCase {
+ suspend fun invoke(args: Args): Boolean
+
+ data class Args(val target: InstalledApp)
+}
\ No newline at end of file
diff --git a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/LoadFilterConditionUseCaseImpl.kt b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/LoadFilterConditionUseCaseImpl.kt
index a46c689f..a0d578d5 100644
--- a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/LoadFilterConditionUseCaseImpl.kt
+++ b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/LoadFilterConditionUseCaseImpl.kt
@@ -2,13 +2,13 @@ package me.nya_n.notificationnotifier.domain.usecase.impl
import me.nya_n.notificationnotifier.data.repository.AppRepository
import me.nya_n.notificationnotifier.domain.usecase.LoadFilterConditionUseCase
+import me.nya_n.notificationnotifier.model.FilterCondition
import me.nya_n.notificationnotifier.model.InstalledApp
class LoadFilterConditionUseCaseImpl(
private val appRepository: AppRepository
) : LoadFilterConditionUseCase {
- override suspend operator fun invoke(target: InstalledApp): String {
- val cond = appRepository.getFilterCondition(target.packageName)
- return cond?.condition ?: ""
+ override suspend operator fun invoke(target: InstalledApp): FilterCondition {
+ return appRepository.getFilterConditionOrDefault(target.packageName)
}
}
\ No newline at end of file
diff --git a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt
index b925397d..226f93a6 100644
--- a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt
+++ b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt
@@ -1,5 +1,6 @@
package me.nya_n.notificationnotifier.domain.usecase.impl
+import android.app.Notification
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import me.nya_n.notificationnotifier.data.repository.AppRepository
@@ -13,7 +14,8 @@ class NotifyTargetAppNotificationUseCaseImpl(
override suspend operator fun invoke(
packageName: String,
title: String,
- message: String
+ message: String,
+ flags: Int
): Result {
return runCatching {
val targets = appRepository.getTargetAppList()
@@ -22,9 +24,15 @@ class NotifyTargetAppNotificationUseCaseImpl(
}
val cond = appRepository.getFilterCondition(packageName)
- if (cond != null && cond.condition.isNotEmpty()) {
- val regex = Regex(pattern = cond.condition)
- if (!regex.matches("$title $message")) {
+ if (cond != null) {
+ if (cond.condition.isNotEmpty()) {
+ val regex = Regex(pattern = cond.condition)
+ if (!regex.matches("$title $message")) {
+ return Result.success(Unit)
+ }
+ }
+ val isSummary = flags and Notification.FLAG_GROUP_SUMMARY != 0
+ if (cond.isIgnoreSummary && isSummary) {
return Result.success(Unit)
}
}
diff --git a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/SaveFilterConditionUseCaseImpl.kt b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/SaveFilterConditionUseCaseImpl.kt
index febe02b7..173cc551 100644
--- a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/SaveFilterConditionUseCaseImpl.kt
+++ b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/SaveFilterConditionUseCaseImpl.kt
@@ -9,10 +9,13 @@ class SaveFilterConditionUseCaseImpl(
private val appRepository: AppRepository
) : SaveFilterConditionUseCase {
override suspend operator fun invoke(args: Args) {
+ val target = args.target.packageName
+ val data = appRepository.getFilterConditionOrDefault(target)
appRepository.saveFilterCondition(
FilterCondition(
- args.target.packageName,
- args.condition ?: ""
+ targetPackageName = args.target.packageName,
+ condition = args.condition ?: "",
+ isIgnoreSummary = data.isIgnoreSummary
)
)
}
diff --git a/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/ToggleIgnoreSummaryUseCaseImpl.kt b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/ToggleIgnoreSummaryUseCaseImpl.kt
new file mode 100644
index 00000000..a899f109
--- /dev/null
+++ b/AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/ToggleIgnoreSummaryUseCaseImpl.kt
@@ -0,0 +1,22 @@
+package me.nya_n.notificationnotifier.domain.usecase.impl
+
+import me.nya_n.notificationnotifier.data.repository.AppRepository
+import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase
+import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase.Args
+import me.nya_n.notificationnotifier.model.FilterCondition
+
+class ToggleIgnoreSummaryUseCaseImpl(
+ private val appRepository: AppRepository
+) : ToggleIgnoreSummaryUseCase {
+ override suspend fun invoke(args: Args): Boolean {
+ val target = args.target.packageName
+ val data = appRepository.getFilterConditionOrDefault(target)
+ val result = !data.isIgnoreSummary
+ appRepository.saveFilterCondition(FilterCondition(
+ targetPackageName = target,
+ isIgnoreSummary = result,
+ condition = data.condition
+ ))
+ return result
+ }
+}
\ No newline at end of file
diff --git a/AndroidApp/model/src/main/kotlin/me/nya_n/notificationnotifier/model/FilterCondition.kt b/AndroidApp/model/src/main/kotlin/me/nya_n/notificationnotifier/model/FilterCondition.kt
index ba9e6e52..5c251fa6 100644
--- a/AndroidApp/model/src/main/kotlin/me/nya_n/notificationnotifier/model/FilterCondition.kt
+++ b/AndroidApp/model/src/main/kotlin/me/nya_n/notificationnotifier/model/FilterCondition.kt
@@ -14,6 +14,21 @@ data class FilterCondition(
@SerializedName("target_package_name")
val targetPackageName: String,
+ /** サマリーを無視するか? */
+ @ColumnInfo(name = "is_ignore_summary", defaultValue = "0")
+ @SerializedName("is_ignore_summary")
+ val isIgnoreSummary: Boolean,
+
/** 条件 */
val condition: String
-) : Serializable
\ No newline at end of file
+) : Serializable {
+ companion object {
+ fun default(packageName: String): FilterCondition {
+ return FilterCondition(
+ targetPackageName = packageName,
+ isIgnoreSummary = false,
+ condition = ""
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt b/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt
index e109b188..81bb490f 100644
--- a/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt
+++ b/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt
@@ -13,6 +13,7 @@ import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.NotificationsActive
+import androidx.compose.material3.Checkbox
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.SnackbarHostState
@@ -64,7 +65,6 @@ fun DetailScreen(
}
DetailContent(
app = app,
- condition = uiState.condition,
onDeleteApp = {
viewModel.deleteTarget()
navController.previousBackStackEntry?.apply {
@@ -72,6 +72,9 @@ fun DetailScreen(
}
navController.popBackStack()
},
+ isIgnoreSummary = uiState.isIgnoreSummary,
+ onIgnoreSummaryChanged = { viewModel.onIgnoreSummaryChanged() },
+ condition = uiState.condition,
onConditionChanged = { viewModel.save(it) }
)
}
@@ -80,8 +83,10 @@ fun DetailScreen(
@Composable
fun DetailContent(
app: InstalledApp,
- condition: String,
onDeleteApp: () -> Unit,
+ isIgnoreSummary: Boolean,
+ onIgnoreSummaryChanged: () -> Unit,
+ condition: String,
onConditionChanged: (String) -> Unit
) {
Column(
@@ -93,7 +98,12 @@ fun DetailContent(
app = app,
onDeleteApp = onDeleteApp
)
- NotificationSetting(condition, onConditionChanged)
+ NotificationSetting(
+ isIgnoreSummary = isIgnoreSummary,
+ onIgnoreSummaryChanged = onIgnoreSummaryChanged,
+ initCondition = condition,
+ onConditionChanged = onConditionChanged
+ )
}
}
@@ -153,6 +163,8 @@ private fun AppInfo(
*/
@Composable
private fun NotificationSetting(
+ isIgnoreSummary: Boolean,
+ onIgnoreSummaryChanged: () -> Unit,
initCondition: String,
onConditionChanged: (String) -> Unit
) {
@@ -160,6 +172,15 @@ private fun NotificationSetting(
val focusManager = LocalFocusManager.current
var condition by remember(initCondition) { mutableStateOf(initCondition) }
Category(name = stringResource(id = R.string.notification_settings))
+ Row(
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Checkbox(
+ checked = isIgnoreSummary,
+ onCheckedChange = { onIgnoreSummaryChanged() },
+ )
+ Text(stringResource(id = R.string.ignore_summaries))
+ }
/* FIXME: TODO:
* テキスト未確定状態で、IMEの◀,▶でカーソルを移動させたとき、カーソルの移動がおかしくなる
* TextFieldValueも試したが改善されず
@@ -199,8 +220,10 @@ private fun DetailPreview() {
AppTheme {
DetailContent(
app = InstalledApp("Sample App Name", "example.sample.test"),
- condition = "^.*$",
onDeleteApp = { },
+ isIgnoreSummary = true,
+ onIgnoreSummaryChanged = { },
+ condition = "^.*$",
onConditionChanged = { }
)
}
@@ -215,8 +238,10 @@ private fun LongAppNameDetailPreview() {
"Sample App Name So Loooooooooooooooooooong",
"example.sample.test"
),
- condition = "",
onDeleteApp = { },
+ isIgnoreSummary = false,
+ onIgnoreSummaryChanged = { },
+ condition = "",
onConditionChanged = { }
)
}
diff --git a/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt b/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt
index fbd1799a..fe903160 100644
--- a/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt
+++ b/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt
@@ -10,12 +10,14 @@ import kotlinx.coroutines.launch
import me.nya_n.notificationnotifier.domain.usecase.DeleteTargetAppUseCase
import me.nya_n.notificationnotifier.domain.usecase.LoadFilterConditionUseCase
import me.nya_n.notificationnotifier.domain.usecase.SaveFilterConditionUseCase
+import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase
import me.nya_n.notificationnotifier.model.InstalledApp
class DetailViewModel(
private val loadFilterConditionUseCase: LoadFilterConditionUseCase,
private val saveFilterConditionUseCase: SaveFilterConditionUseCase,
private val deleteTargetAppUseCase: DeleteTargetAppUseCase,
+ private val toggleIgnoreSummaryUseCase: ToggleIgnoreSummaryUseCase,
private val target: InstalledApp
) : ViewModel() {
private val _uiState = MutableStateFlow(UiState())
@@ -24,7 +26,13 @@ class DetailViewModel(
init {
/** 通知条件を読み込む */
viewModelScope.launch {
- _uiState.update { it.copy(condition = loadFilterConditionUseCase(target)) }
+ val data = loadFilterConditionUseCase.invoke(target)
+ _uiState.update {
+ it.copy(
+ isIgnoreSummary = data.isIgnoreSummary,
+ condition = data.condition
+ )
+ }
}
}
@@ -35,6 +43,13 @@ class DetailViewModel(
}
}
+ fun onIgnoreSummaryChanged() {
+ viewModelScope.launch {
+ val isIgnoreSummary = toggleIgnoreSummaryUseCase.invoke(ToggleIgnoreSummaryUseCase.Args(target))
+ _uiState.update { it.copy(isIgnoreSummary = isIgnoreSummary) }
+ }
+ }
+
/** 通知条件を保存 */
fun save(condition: String) {
viewModelScope.launch {
diff --git a/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/UiState.kt b/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/UiState.kt
index 19db634b..1b7a00a8 100644
--- a/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/UiState.kt
+++ b/AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/UiState.kt
@@ -3,6 +3,9 @@ package me.nya_n.notificationnotifier.ui.screen.detail
import me.nya_n.notificationnotifier.model.Message
data class UiState(
+ /** サマリー用の通知を無視するか? */
+ val isIgnoreSummary: Boolean = false,
+
/** 通知を送信する条件 */
val condition: String = "",
diff --git a/AndroidApp/ui/src/main/res/values-en/strings.xml b/AndroidApp/ui/src/main/res/values-en/strings.xml
index 8fddb4fa..21cb8f04 100644
--- a/AndroidApp/ui/src/main/res/values-en/strings.xml
+++ b/AndroidApp/ui/src/main/res/values-en/strings.xml
@@ -10,4 +10,5 @@
e.g. 192.168.11.2:5555
App Info
Notification Settings
+ Ignore summaries
\ No newline at end of file
diff --git a/AndroidApp/ui/src/main/res/values/strings.xml b/AndroidApp/ui/src/main/res/values/strings.xml
index 31f21693..935a4170 100644
--- a/AndroidApp/ui/src/main/res/values/strings.xml
+++ b/AndroidApp/ui/src/main/res/values/strings.xml
@@ -34,4 +34,5 @@
[OK]
開発者について
戻る
+ サマリーは無視する。
\ No newline at end of file