Skip to content

Commit dd86bef

Browse files
authored
Merge pull request #299 from ptkNktq/feature/ignore_summary
サマリー用通知の転送無視オプション追加
2 parents 4e7f4a7 + e88c5ea commit dd86bef

21 files changed

Lines changed: 235 additions & 45 deletions

File tree

AndroidApp/.idea/inspectionProfiles/Project_Default.xml

Lines changed: 1 addition & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/App.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import me.nya_n.notificationnotifier.domain.usecase.NotifyUseCase
2121
import me.nya_n.notificationnotifier.domain.usecase.PackageVisibilityGrantedUseCase
2222
import me.nya_n.notificationnotifier.domain.usecase.SaveAddressUseCase
2323
import me.nya_n.notificationnotifier.domain.usecase.SaveFilterConditionUseCase
24+
import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase
2425
import me.nya_n.notificationnotifier.domain.usecase.impl.AddTargetAppUseCaseImpl
2526
import me.nya_n.notificationnotifier.domain.usecase.impl.CheckPackageVisibilityUseCaseImpl
2627
import me.nya_n.notificationnotifier.domain.usecase.impl.DeleteTargetAppUseCaseImpl
@@ -34,6 +35,7 @@ import me.nya_n.notificationnotifier.domain.usecase.impl.NotifyUseCaseImpl
3435
import me.nya_n.notificationnotifier.domain.usecase.impl.PackageVisibilityGrantedUseCaseImpl
3536
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveAddressUseCaseImpl
3637
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveFilterConditionUseCaseImpl
38+
import me.nya_n.notificationnotifier.domain.usecase.impl.ToggleIgnoreSummaryUseCaseImpl
3739
import me.nya_n.notificationnotifier.model.AppConfig
3840
import me.nya_n.notificationnotifier.ui.screen.app.AppViewModel
3941
import me.nya_n.notificationnotifier.ui.screen.detail.DetailViewModel
@@ -84,7 +86,7 @@ class App : Application() {
8486
// ViewModel
8587
viewModel { AppViewModel(get(), packageName, get(), get()) }
8688
viewModel { SelectionViewModel(get(), get(), get()) }
87-
viewModel { params -> DetailViewModel(get(), get(), get(), params.get()) }
89+
viewModel { params -> DetailViewModel(get(), get(), get(), get(), params.get()) }
8890
viewModel { TargetViewModel(get(), get()) }
8991
viewModel { SettingsViewModel(get(), get(), get(), get(), get(), get()) }
9092

@@ -104,5 +106,6 @@ class App : Application() {
104106
factory<CheckPackageVisibilityUseCase> { CheckPackageVisibilityUseCaseImpl(get()) }
105107
factory<SaveAddressUseCase> { SaveAddressUseCaseImpl(get()) }
106108
factory<SaveFilterConditionUseCase> { SaveFilterConditionUseCaseImpl(get()) }
109+
factory<ToggleIgnoreSummaryUseCase> { ToggleIgnoreSummaryUseCaseImpl(get()) }
107110
}
108111
}

AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import android.os.Bundle
44
import android.service.notification.NotificationListenerService
55
import android.service.notification.StatusBarNotification
66
import android.text.SpannableString
7-
import kotlinx.coroutines.*
7+
import kotlinx.coroutines.CoroutineScope
8+
import kotlinx.coroutines.Dispatchers
9+
import kotlinx.coroutines.Job
10+
import kotlinx.coroutines.launch
811
import me.nya_n.notificationnotifier.domain.usecase.NotifyTargetAppNotificationUseCase
912
import org.koin.android.ext.android.inject
1013

@@ -29,7 +32,7 @@ class NotificationService : NotificationListenerService() {
2932
val extras = sbn.notification.extras
3033
val title = getTitle(extras) ?: return@launch
3134
val message = extras.getCharSequence("android.text").toString()
32-
useCase(sbn.packageName, title, message)
35+
useCase.invoke(sbn.packageName, title, message, sbn.notification.flags)
3336
}
3437
}
3538

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"formatVersion": 1,
3+
"database": {
4+
"version": 2,
5+
"identityHash": "85b4a3de210e1ef5dfec5df608f693db",
6+
"entities": [
7+
{
8+
"tableName": "conditions",
9+
"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`))",
10+
"fields": [
11+
{
12+
"fieldPath": "targetPackageName",
13+
"columnName": "target_package_name",
14+
"affinity": "TEXT",
15+
"notNull": true
16+
},
17+
{
18+
"fieldPath": "isIgnoreSummary",
19+
"columnName": "is_ignore_summary",
20+
"affinity": "INTEGER",
21+
"notNull": true,
22+
"defaultValue": "0"
23+
},
24+
{
25+
"fieldPath": "condition",
26+
"columnName": "condition",
27+
"affinity": "TEXT",
28+
"notNull": true
29+
}
30+
],
31+
"primaryKey": {
32+
"autoGenerate": false,
33+
"columnNames": [
34+
"target_package_name"
35+
]
36+
}
37+
},
38+
{
39+
"tableName": "targets",
40+
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`label` TEXT NOT NULL, `package_name` TEXT NOT NULL, PRIMARY KEY(`package_name`))",
41+
"fields": [
42+
{
43+
"fieldPath": "label",
44+
"columnName": "label",
45+
"affinity": "TEXT",
46+
"notNull": true
47+
},
48+
{
49+
"fieldPath": "packageName",
50+
"columnName": "package_name",
51+
"affinity": "TEXT",
52+
"notNull": true
53+
}
54+
],
55+
"primaryKey": {
56+
"autoGenerate": false,
57+
"columnNames": [
58+
"package_name"
59+
]
60+
}
61+
}
62+
],
63+
"setupQueries": [
64+
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
65+
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '85b4a3de210e1ef5dfec5df608f693db')"
66+
]
67+
}
68+
}

AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/AppRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ interface AppRepository {
1010

1111
/* フィルタリング条件関連 */
1212
suspend fun getFilterCondition(targetPackageName: String): FilterCondition?
13+
suspend fun getFilterConditionOrDefault(targetPackageName: String): FilterCondition
1314

1415
suspend fun getFilterConditionList(): List<FilterCondition>
1516

AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/impl/AppRepositoryImpl.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class AppRepositoryImpl(
2626
}
2727
}
2828

29+
override suspend fun getFilterConditionOrDefault(targetPackageName: String): FilterCondition {
30+
return getFilterCondition(targetPackageName) ?: FilterCondition.default(targetPackageName)
31+
}
32+
2933
override suspend fun getFilterConditionList(): List<FilterCondition> {
3034
return withContext(Dispatchers.IO) {
3135
filterConditionDao.getAll()

AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/DB.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.nya_n.notificationnotifier.data.repository.source
22

33
import android.content.Context
4+
import androidx.room.AutoMigration
45
import androidx.room.Database
56
import androidx.room.Room
67
import androidx.room.RoomDatabase
@@ -12,9 +13,11 @@ import me.nya_n.notificationnotifier.model.InstalledApp
1213
FilterCondition::class,
1314
InstalledApp::class
1415
],
15-
version = 1,
16+
version = 2,
1617
exportSchema = true,
17-
autoMigrations = []
18+
autoMigrations = [
19+
AutoMigration(from = 1, to = 2)
20+
]
1821
)
1922
abstract class DB : RoomDatabase() {
2023

@@ -58,7 +61,7 @@ abstract class DB : RoomDatabase() {
5861
fun version(): Int {
5962
return try {
6063
INSTANCE?.openHelper?.readableDatabase?.version ?: -1
61-
} catch (e: Exception) {
64+
} catch (_: Exception) {
6265
-1
6366
}
6467
}

AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import me.nya_n.notificationnotifier.data.repository.impl.UserSettingsRepository
1515
import me.nya_n.notificationnotifier.data.repository.source.DB
1616
import me.nya_n.notificationnotifier.data.repository.source.UserSettingsDataStore
1717
import me.nya_n.notificationnotifier.data.repository.util.SharedPreferenceProvider
18-
import me.nya_n.notificationnotifier.domain.usecase.*
18+
import me.nya_n.notificationnotifier.domain.usecase.SaveFilterConditionUseCase
19+
import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase
1920
import me.nya_n.notificationnotifier.domain.usecase.impl.AddTargetAppUseCaseImpl
2021
import me.nya_n.notificationnotifier.domain.usecase.impl.DeleteTargetAppUseCaseImpl
2122
import me.nya_n.notificationnotifier.domain.usecase.impl.ExportDataUseCaseImpl
@@ -27,6 +28,8 @@ import me.nya_n.notificationnotifier.domain.usecase.impl.NotifyUseCaseImpl
2728
import me.nya_n.notificationnotifier.domain.usecase.impl.PackageVisibilityGrantedUseCaseImpl
2829
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveAddressUseCaseImpl
2930
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveFilterConditionUseCaseImpl
31+
import me.nya_n.notificationnotifier.domain.usecase.impl.ToggleIgnoreSummaryUseCaseImpl
32+
import me.nya_n.notificationnotifier.model.FilterCondition
3033
import me.nya_n.notificationnotifier.model.InstalledApp
3134
import org.junit.Before
3235
import org.junit.Ignore
@@ -116,15 +119,24 @@ class UseCaseTest {
116119
runBlocking {
117120
val cond = "test"
118121
val updatedCond = "updated"
119-
val app = InstalledApp("sample", "com.sample.www")
120-
val saver = SaveFilterConditionUseCaseImpl(appRepository)
121-
saver(SaveFilterConditionUseCase.Args(app, cond))
122+
val packageName = "com.sample.www"
123+
val app = InstalledApp("sample", packageName)
122124

125+
val saver = SaveFilterConditionUseCaseImpl(appRepository)
126+
val toggler = ToggleIgnoreSummaryUseCaseImpl(appRepository)
123127
val loader = LoadFilterConditionUseCaseImpl(appRepository)
124-
assertThat(loader(app)).isEqualTo(cond)
125128

129+
// 追加
130+
saver(SaveFilterConditionUseCase.Args(app, cond))
131+
assertThat(loader(app)).isEqualTo(FilterCondition(packageName, false, cond))
132+
133+
// メッセージ条件の更新
126134
saver(SaveFilterConditionUseCase.Args(app, updatedCond))
127-
assertThat(loader(app)).isEqualTo(updatedCond)
135+
assertThat(loader(app)).isEqualTo(FilterCondition(packageName, false, updatedCond))
136+
137+
// サマリー条件の更新
138+
toggler.invoke(ToggleIgnoreSummaryUseCase.Args(app))
139+
assertThat(loader(app)).isEqualTo(FilterCondition(packageName, true, updatedCond))
128140
}
129141
}
130142

@@ -214,14 +226,17 @@ class UseCaseTest {
214226
val targetSaver = AddTargetAppUseCaseImpl(appRepository)
215227
val condSaver = SaveFilterConditionUseCaseImpl(appRepository)
216228
val addrSaver = SaveAddressUseCaseImpl(userSettingsRepository)
229+
val toggler = ToggleIgnoreSummaryUseCaseImpl(appRepository)
217230

218231
// 初期値の保存
219232
// ターゲット
220-
val app = InstalledApp("export", "test.export")
233+
val packageName = "test.export"
234+
val app = InstalledApp("export", packageName)
221235
targetSaver(app)
222236
// 条件
223237
val cond = ".*"
224238
condSaver(SaveFilterConditionUseCase.Args(app, cond))
239+
toggler.invoke(ToggleIgnoreSummaryUseCase.Args(app))
225240
// アドレス
226241
val addr = "192.168.1.4:5050"
227242
addrSaver(addr)
@@ -234,6 +249,7 @@ class UseCaseTest {
234249
targetSaver(InstalledApp("new", "new"))
235250
// 条件
236251
condSaver(SaveFilterConditionUseCase.Args(app, "new"))
252+
toggler.invoke(ToggleIgnoreSummaryUseCase.Args(app))
237253

238254
// 復元
239255
ImportDataUseCaseImpl(userSettingsRepository, appRepository)(appContext, uri)
@@ -248,7 +264,7 @@ class UseCaseTest {
248264
}
249265
// 条件
250266
val restoreCond = LoadFilterConditionUseCaseImpl(appRepository)(app)
251-
assertThat(restoreCond).isEqualTo(cond)
267+
assertThat(restoreCond).isEqualTo(FilterCondition(packageName, true, cond))
252268
// アドレス
253269
val restoreAddr = LoadAddressUseCaseImpl(userSettingsRepository)()
254270
assertThat(restoreAddr).isEqualTo(addr)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package me.nya_n.notificationnotifier.domain.usecase
22

3+
import me.nya_n.notificationnotifier.model.FilterCondition
34
import me.nya_n.notificationnotifier.model.InstalledApp
45

56
/** 通知条件を読み込む */
67
interface LoadFilterConditionUseCase {
7-
suspend operator fun invoke(target: InstalledApp): String
8+
suspend operator fun invoke(target: InstalledApp): FilterCondition
89
}

AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyTargetAppNotificationUseCase.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ interface NotifyTargetAppNotificationUseCase {
44
suspend operator fun invoke(
55
packageName: String,
66
title: String,
7-
message: String
7+
message: String,
8+
flags: Int
89
): Result<Unit>
910
}

0 commit comments

Comments
 (0)