Skip to content

Conversation

@ptkNktq
Copy link
Owner

@ptkNktq ptkNktq commented Jan 12, 2026

Summary by CodeRabbit

リリースノート

  • 新機能
    • アプリごとに通知要約(サマリー)を無視するトグルを詳細画面のチェックボックスで切替可能にしました。
    • 通知フィルターが強化され、条件と要約無視設定の両方で詳細に制御できます。
    • 通知表示の判定に通知フラグ(グループ要約など)を考慮するようになりました。
    • データベーススキーマを更新しました。

✏️ Tip: You can customize this high-level summary in your review settings.

@ptkNktq ptkNktq self-assigned this Jan 12, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 12, 2026

Walkthrough

このPRは、アプリ単位で通知サマリーを無視するトグル機能を追加し、FilterConditionモデルとRoomスキーマを拡張、リポジトリとユースケースを更新し、UI(詳細画面)とサービス呼び出しをそれぞれ連携させる変更を導入します。

Changes

コホート / ファイル(s) 変更概要
検査プロファイル設定
AndroidApp/.idea/inspectionProfiles/Project_Default.xml
既存のプレビュー検査ツール群を削除し、PreviewParameterProviderOnFirstParameterへ置換
DIレイヤー
AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/App.kt
ToggleIgnoreSummaryUseCaseToggleIgnoreSummaryUseCaseImplをDIに追加;DetailViewModelへ新依存性を注入(4→5パラメータ)
サービス
AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt
明示的な Job/CoroutineScope を導入しライフサイクルでキャンセル;NotifyTargetAppNotificationUseCase呼び出しにflagsを追加
DBスキーマ定義
AndroidApp/data/repository/schemas/.../DB/2.json
Room用スキーマv2追加;conditionsテーブルにis_ignore_summaryカラムを含む定義を追加
リポジトリ API / 実装
AndroidApp/data/repository/src/.../AppRepository.kt, .../impl/AppRepositoryImpl.kt
getFilterConditionOrDefault(targetPackageName: String): FilterConditionを追加(null時の既定値返却)
Room 設定
AndroidApp/data/repository/src/main/kotlin/.../DB.kt
DBバージョンを1→2へ更新しAutoMigration(1,2)を追加;例外変数を未使用化
モデル
AndroidApp/model/src/main/kotlin/.../FilterCondition.kt
isIgnoreSummary: Booleanプロパティを追加(Room/Gson注釈含む)と default(packageName: String) ファクトリを追加
ユースケース - 追加
AndroidApp/domain/src/main/kotlin/.../ToggleIgnoreSummaryUseCase.kt, .../impl/ToggleIgnoreSummaryUseCaseImpl.kt
新インターフェースと実装を追加;既存FilterConditionを反転して保存し新値を返す
ユースケース - 変更
domain/.../LoadFilterConditionUseCase.kt, .../LoadFilterConditionUseCaseImpl.kt, .../NotifyTargetAppNotificationUseCase.kt, .../impl/NotifyTargetAppNotificationUseCaseImpl.kt, .../impl/SaveFilterConditionUseCaseImpl.kt
Load: 戻り値を StringFilterCondition に変更;Notify: flags: Int 追加;Save系で isIgnoreSummary を考慮して保存
UI - DetailScreen/DetailContent
AndroidApp/ui/src/main/kotlin/.../detail/DetailScreen.kt
isIgnoreSummaryonIgnoreSummaryChanged をパラメータに追加し順序を調整;チェックボックスUIを追加;プレビュー更新
UI - ViewModel / UiState
AndroidApp/ui/src/main/kotlin/.../detail/DetailViewModel.kt, .../UiState.kt
ToggleIgnoreSummaryUseCaseを注入;onIgnoreSummaryChanged()ハンドラ追加;UiStateにisIgnoreSummary: Booleanを追加
文字列リソース
AndroidApp/ui/src/main/res/values/strings.xml, .../values-en/strings.xml
ignore_summaries文字列を日本語・英語に追加
テスト
AndroidApp/domain/src/androidTest/.../UseCaseTest.kt
テストをFilterConditionベースへ更新;ToggleIgnoreSummaryUseCaseImplの動作を検証

Sequence Diagram(s)

sequenceDiagram
    participant UI as DetailScreen / DetailViewModel
    participant Domain as ToggleIgnoreSummaryUseCase
    participant Repo as AppRepository
    participant DB as Room Database

    UI->>Repo: getFilterConditionOrDefault(packageName)
    Repo->>DB: SELECT FilterCondition
    DB-->>Repo: FilterCondition (targetPackageName,isIgnoreSummary,condition)
    Repo-->>UI: FilterCondition
    UI->>UI: 表示(チェックボックスに isIgnoreSummary を反映)

    Note over UI,Domain: ユーザーがチェックボックスを切替
    UI->>Domain: invoke(ToggleIgnoreSummaryUseCase.Args(target))
    Domain->>Repo: getFilterConditionOrDefault(packageName)
    Repo->>DB: SELECT FilterCondition
    DB-->>Repo: current FilterCondition
    Repo-->>Domain: current FilterCondition
    Domain->>Domain: invert isIgnoreSummary
    Domain->>Repo: saveFilterCondition(updated FilterCondition)
    Repo->>DB: UPDATE/INSERT FilterCondition
    Domain-->>UI: 更新後の Boolean (isIgnoreSummary)
    UI->>UI: UI状態を更新
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 分

Possibly related PRs

  • exportSchemaを有効に変更 #298: 同一の Room DB 設定(DB.kt の autoMigrations / スキーマ周り)を変更しておりコードレベルで干渉する可能性あり。
  • Enhance/transition #295: DetailScreen/DetailContent のシグネチャ変更と呼び出し箇所の修正が重複しているため密接に関連。
  • ライブラリ更新 #239: .idea/Project_Default.xml のプレビュー検査ツール変更と同一ファイルを編集している可能性があるため関連性が高い。

🐰✨ 新しいスイッチでサマリーはお休みだ
DBはv2へ、フラグは小さな旗印
チェックボックスを押せば世界が変わる
ドメインで反転、リポジトリで刻む
ぽんと跳ねる通知、うさぎが祝うよ 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PRタイトルはサマリー用通知の転送無視オプション追加という変更内容を正確に反映しており、変更セット全体の主要な目的を明確に要約している。

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In
@AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt:
- Around line 28-32: The current code in NotifyTargetAppNotificationUseCaseImpl
constructs Regex(pattern = cond.condition) and calls matches("$title $message"),
which can throw PatternSyntaxException and treats invalid patterns as failures
via the outer runCatching; change it so invalid regexes are caught and treated
as "skip" (return Result.success(Unit)) rather than a failure—wrap the Regex
construction in a try/catch (or runCatching) that logs the invalid pattern and
returns success on failure, and replace matches(...) with
containsMatchIn("$title $message") to perform a partial match check; reference
the cond.condition usage and the regex check block when applying this fix.
🧹 Nitpick comments (4)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/ToggleIgnoreSummaryUseCase.kt (1)

5-8: operator キーワードの追加を検討してください。

他のユースケース(DeleteTargetAppUseCaseAddTargetAppUseCaseSaveFilterConditionUseCase など)と一貫性を保つため、invoke メソッドに operator 修飾子を追加することをお勧めします。これにより、呼び出し側で useCase(args) という自然な構文が使えるようになります。

♻️ 提案する修正
 interface ToggleIgnoreSummaryUseCase {
-    suspend fun invoke(args: Args): Boolean
+    suspend operator fun invoke(args: Args): Boolean
 
     data class Args(val target: InstalledApp)
 }
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt (1)

46-51: トグル処理の実装を確認してください。

実装は正しく動作しますが、toggleIgnoreSummaryUseCase の呼び出しが失敗した場合のエラーハンドリングがありません。既存の deleteTarget()save() メソッドも同様のパターンですが、ユーザーに通知が転送されなくなるような重要な設定変更では、失敗時にユーザーへフィードバックを表示することを検討してください。

♻️ エラーハンドリングの追加例
 fun onIgnoreSummaryChanged() {
     viewModelScope.launch {
-        val isIgnoreSummary = toggleIgnoreSummaryUseCase.invoke(ToggleIgnoreSummaryUseCase.Args(target))
-        _uiState.update { it.copy(isIgnoreSummary = isIgnoreSummary) }
+        runCatching {
+            toggleIgnoreSummaryUseCase.invoke(ToggleIgnoreSummaryUseCase.Args(target))
+        }.onSuccess { isIgnoreSummary ->
+            _uiState.update { it.copy(isIgnoreSummary = isIgnoreSummary) }
+        }.onFailure {
+            _uiState.update { it.copy(message = Message.Error) }
+        }
     }
 }
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/SaveFilterConditionUseCaseImpl.kt (1)

12-18: target 変数の使用が一貫していません。

12行目で target を定義していますが、16行目では args.target.packageName を再度呼び出しています。一貫性のために target を使用してください。

🔧 提案する修正
     override suspend operator fun invoke(args: Args) {
         val target = args.target.packageName
         val data = appRepository.getFilterConditionOrDefault(target)
         appRepository.saveFilterCondition(
             FilterCondition(
-                targetPackageName = args.target.packageName,
+                targetPackageName = target,
                 condition = args.condition ?: "",
                 isIgnoreSummary = data.isIgnoreSummary
             )
         )
     }
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt (1)

175-183: ハードコードされた文字列をstring resourceに移動してください。

182行目の "サマリーは無視する。" は、他のUI文字列と同様に stringResource() を使用してリソースファイルに移動すべきです。これにより、i18n/l10nの一貫性が保たれます。

🔧 提案する修正

strings.xml に追加:

<string name="ignore_summary">サマリーは無視する。</string>
     Row(
         verticalAlignment = Alignment.CenterVertically
     ) {
         Checkbox(
             checked = isIgnoreSummary,
             onCheckedChange = { onIgnoreSummaryChanged() },
         )
-        Text("サマリーは無視する。")
+        Text(stringResource(id = R.string.ignore_summary))
     }
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4e7f4a7 and 95b7db7.

📒 Files selected for processing (19)
  • AndroidApp/.idea/inspectionProfiles/Project_Default.xml
  • AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/App.kt
  • AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt
  • AndroidApp/data/repository/schemas/me.nya_n.notificationnotifier.data.repository.source.DB/2.json
  • AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/AppRepository.kt
  • AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/impl/AppRepositoryImpl.kt
  • AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/DB.kt
  • AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt
  • AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/LoadFilterConditionUseCase.kt
  • AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyTargetAppNotificationUseCase.kt
  • AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/ToggleIgnoreSummaryUseCase.kt
  • AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/LoadFilterConditionUseCaseImpl.kt
  • AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt
  • AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/SaveFilterConditionUseCaseImpl.kt
  • AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/ToggleIgnoreSummaryUseCaseImpl.kt
  • AndroidApp/model/src/main/kotlin/me/nya_n/notificationnotifier/model/FilterCondition.kt
  • AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt
  • AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt
  • AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/UiState.kt
🧰 Additional context used
🧬 Code graph analysis (10)
AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/impl/AppRepositoryImpl.kt (2)
AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/AppRepository.kt (1)
  • getFilterCondition (12-12)
AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/FilterConditionDao.kt (1)
  • get (14-15)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/UiState.kt (5)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/app/UiState.kt (1)
  • isShowRequirePackageVisibilityDialog (3-6)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/app/AppViewModel.kt (1)
  • it (28-33)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/app/AppScreen.kt (1)
  • uiState (40-107)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/target/TargetViewModel.kt (2)
  • it (38-38)
  • uiState (24-33)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/target/UiState.kt (1)
  • items (6-11)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt (1)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/target/TargetViewModel.kt (1)
  • uiState (24-33)
AndroidApp/model/src/main/kotlin/me/nya_n/notificationnotifier/model/FilterCondition.kt (1)
AndroidApp/data/repository/src/main/kotlin/me/nya_n/notificationnotifier/data/repository/source/FilterConditionDao.kt (2)
  • onConflict (6-22)
  • onConflict (8-9)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyTargetAppNotificationUseCase.kt (3)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/NotifyUseCase.kt (2)
  • invoke (3-5)
  • invoke (4-4)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/PackageVisibilityGrantedUseCase.kt (2)
  • invoke (3-5)
  • invoke (4-4)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyUseCaseImpl.kt (1)
  • invoke (18-34)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/ToggleIgnoreSummaryUseCase.kt (6)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/SaveFilterConditionUseCase.kt (2)
  • invoke (6-13)
  • target (9-12)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/AddTargetAppUseCase.kt (2)
  • invoke (6-8)
  • invoke (7-7)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/PackageVisibilityGrantedUseCase.kt (1)
  • invoke (3-5)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/AddTargetAppUseCaseImpl.kt (1)
  • appRepository (7-13)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/DeleteTargetAppUseCase.kt (1)
  • invoke (6-8)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/CheckPackageVisibilityUseCase.kt (1)
  • invoke (3-5)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/LoadFilterConditionUseCase.kt (1)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/SaveFilterConditionUseCase.kt (1)
  • invoke (6-13)
AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt (2)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/ImportDataUseCaseImpl.kt (1)
  • appRepository (40-42)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/SaveFilterConditionUseCase.kt (1)
  • invoke (6-13)
AndroidApp/app/src/main/kotlin/me/nya_n/notificationnotifier/services/NotificationService.kt (2)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/PackageVisibilityGrantedUseCase.kt (1)
  • invoke (3-5)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyUseCaseImpl.kt (1)
  • invoke (18-34)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/SaveFilterConditionUseCaseImpl.kt (1)
AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/SaveFilterConditionUseCase.kt (1)
  • target (9-12)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (23)
AndroidApp/.idea/inspectionProfiles/Project_Default.xml (1)

52-55: PRの目的と関連性がない変更

この変更は PreviewParameterProviderOnFirstParameter インスペクションツールの追加ですが、PRの目的「サマリー用通知の転送無視オプション追加」とは無関係に見えます。

.idea/ フォルダ内のファイルはIDEによって自動生成されることが多く、意図しない変更が含まれる可能性があります。この変更が意図的なものかどうか確認してください。意図的でない場合は、このファイルをコミットから除外することを検討してください。

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

12-13: LGTM!

既存の getFilterCondition と並んで、デフォルト値を返す非null版のメソッドが追加されています。命名規則(OrDefault サフィックス)も明確で、インターフェースの一貫性が保たれています。

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

29-31: LGTM!

既存の getFilterCondition メソッドを再利用しており、Elvis演算子でデフォルト値へのフォールバックが簡潔に実装されています。getFilterCondition が既に Dispatchers.IO を処理しているため、追加のディスパッチャー切り替えは不要です。

AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/ToggleIgnoreSummaryUseCaseImpl.kt (1)

8-21: LGTM!

トグルロジックが正しく実装されています:現在の状態を取得 → 反転 → 保存 → 新しい値を返す。既存の condition フィールドも適切に保持されています。

インターフェースに operator キーワードを追加する場合は、こちらも override suspend operator fun invoke(args: Args) に更新してください。

AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/UiState.kt (1)

6-8: LGTM!

新しい isIgnoreSummary プロパティが適切に追加されています。デフォルト値 false(デフォルトでは無視しない)は妥当であり、日本語コメントも他のプロパティと一貫しています。

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

16-20: LGTM! AutoMigrationの設定が適切です。

新しいカラム is_ignore_summary の追加に対して、Room AutoMigrationを使用しています。FilterCondition.ktdefaultValue = "0" が設定されているため、既存データの移行も正しく処理されます。


64-64: 未使用の例外変数を _ に変更する修正は適切です。

Kotlinの慣用的な書き方です。

AndroidApp/model/src/main/kotlin/me/nya_n/notificationnotifier/model/FilterCondition.kt (2)

17-20: LGTM! 新しいプロパティの定義が適切です。

isIgnoreSummary プロパティに対して、Room の @ColumnInfo と Gson の @SerializedName アノテーションが正しく設定されています。defaultValue = "0" により、既存データの移行時にデフォルト値が適用されます。


25-33: ファクトリメソッドの追加は良い設計です。

default() ファクトリメソッドにより、デフォルト値を持つ FilterCondition の生成が一貫して行えます。

AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/LoadFilterConditionUseCase.kt (1)

7-8: LGTM! 戻り値の型変更が適切です。

String から FilterCondition への戻り値型の変更により、isIgnoreSummary を含む完全なフィルタ条件情報を取得できるようになりました。これはドメイン層での適切な抽象化です。

AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt (1)

26-36: LGTM! 初期化時のデータ読み込みが適切です。

loadFilterConditionUseCase から FilterCondition を取得し、isIgnoreSummarycondition の両方を UI 状態に反映しています。

AndroidApp/data/repository/schemas/me.nya_n.notificationnotifier.data.repository.source.DB/2.json (1)

1-68: LGTM! Room スキーマファイルが正しく生成されています。

conditions テーブルに is_ignore_summary カラム(INTEGER NOT NULL DEFAULT 0)が追加され、FilterCondition.kt のモデル定義と一致しています。exportSchema = true により生成されたこのファイルは、AutoMigration の検証に使用されます。

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

24-38: LGTM!

ToggleIgnoreSummaryUseCase のインポートとDI設定が正しく追加されています。


89-109: LGTM!

DetailViewModel への依存性追加と ToggleIgnoreSummaryUseCase のファクトリバインディングが既存のパターンに従って正しく実装されています。

AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/LoadFilterConditionUseCaseImpl.kt (1)

11-13: LGTM!

戻り値の型を String から FilterCondition に変更し、デフォルト値を返すリポジトリメソッドを使用する実装は適切です。

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

118-140: LGTM!

テストが FilterCondition の3つのフィールド(packageNameisIgnoreSummarycondition)を適切に検証しています。条件の追加・更新・サマリー条件の切り替えの各シナリオがカバーされています。


222-271: LGTM!

バックアップ・復元テストが isIgnoreSummary フラグを適切に検証しています。バックアップ時の状態(true)が正しく復元されることを確認しています。

AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt (2)

66-79: LGTM!

DetailScreen から DetailContent へのプロパティの受け渡しが正しく実装されています。


217-248: LGTM!

プレビューが isIgnoreSummary の両方の状態(true/false)を表示するように更新されています。

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

3-10: LGTM!

flags パラメータの追加は実装と整合しており、インターフェースの変更も適切です。

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

17-18: コルーチンのライフサイクル管理が適切に実装されています。

JobonDestroy でキャンセルすることで、サービス終了時に実行中のコルーチンが適切にクリーンアップされます。

Also applies to: 25-28


30-36: LGTM!

sbn.notification.flags を正しく取得し、ユースケースに渡しています。

AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt (1)

34-37: サマリー通知の無視ロジックが適切に実装されています。

FLAG_GROUP_SUMMARY のビット演算チェックは正しく、isIgnoreSummary との組み合わせでグループサマリー通知を適切にフィルタリングしています。

Comment on lines +28 to +32
if (cond.condition.isNotEmpty()) {
val regex = Regex(pattern = cond.condition)
if (!regex.matches("$title $message")) {
return Result.success(Unit)
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

無効な正規表現パターンによる例外処理を検討してください。

Regex(pattern = cond.condition) は、ユーザーが無効な正規表現を入力した場合に PatternSyntaxException をスローします。runCatching でキャッチされますが、Result.failure が返却されるため、通知が失敗扱いになります。

また、matches() は文字列全体がパターンに一致する必要があります。部分一致を期待している場合は containsMatchIn() の使用を検討してください。

🔧 例外ハンドリングと部分一致の提案
             if (cond.condition.isNotEmpty()) {
-                val regex = Regex(pattern = cond.condition)
-                if (!regex.matches("$title $message")) {
-                    return Result.success(Unit)
+                val regex = runCatching { Regex(pattern = cond.condition) }.getOrNull()
+                if (regex != null && !regex.containsMatchIn("$title $message")) {
+                    return Result.success(Unit)
                 }
             }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (cond.condition.isNotEmpty()) {
val regex = Regex(pattern = cond.condition)
if (!regex.matches("$title $message")) {
return Result.success(Unit)
}
if (cond.condition.isNotEmpty()) {
val regex = runCatching { Regex(pattern = cond.condition) }.getOrNull()
if (regex != null && !regex.containsMatchIn("$title $message")) {
return Result.success(Unit)
}
🤖 Prompt for AI Agents
In
@AndroidApp/domain/src/main/kotlin/me/nya_n/notificationnotifier/domain/usecase/impl/NotifyTargetAppNotificationUseCaseImpl.kt
around lines 28 - 32, The current code in NotifyTargetAppNotificationUseCaseImpl
constructs Regex(pattern = cond.condition) and calls matches("$title $message"),
which can throw PatternSyntaxException and treats invalid patterns as failures
via the outer runCatching; change it so invalid regexes are caught and treated
as "skip" (return Result.success(Unit)) rather than a failure—wrap the Regex
construction in a try/catch (or runCatching) that logs the invalid pattern and
returns success on failure, and replace matches(...) with
containsMatchIn("$title $message") to perform a partial match check; reference
the cond.condition usage and the regex check block when applying this fix.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt (1)

175-183: アクセシビリティとUXの改善を推奨します。

現在の実装では、チェックボックス自体をタップする必要があります。ラベルテキストをタップしてもトグルできるようにすると、操作性が向上します。

♻️ 提案する修正
-    Row(
-        verticalAlignment = Alignment.CenterVertically
-    ) {
-        Checkbox(
-            checked = isIgnoreSummary,
-            onCheckedChange = { onIgnoreSummaryChanged() },
-        )
-        Text(stringResource(id = R.string.ignore_summaries))
-    }
+    Row(
+        verticalAlignment = Alignment.CenterVertically,
+        modifier = Modifier.clickable { onIgnoreSummaryChanged() }
+    ) {
+        Checkbox(
+            checked = isIgnoreSummary,
+            onCheckedChange = null,
+        )
+        Text(stringResource(id = R.string.ignore_summaries))
+    }

Modifier.clickable を使用するには、以下のインポートを追加してください:

import androidx.compose.foundation.clickable
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 95b7db7 and e88c5ea.

📒 Files selected for processing (3)
  • AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt
  • AndroidApp/ui/src/main/res/values-en/strings.xml
  • AndroidApp/ui/src/main/res/values/strings.xml
🧰 Additional context used
🧬 Code graph analysis (2)
AndroidApp/ui/src/main/res/values/strings.xml (2)
AndroidApp/app/build.gradle.kts (1)
  • resources (14-16)
AndroidApp/ui/build.gradle.kts (1)
  • namespace (7-15)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt (2)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/common/Category.kt (1)
  • Category (23-50)
AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailViewModel.kt (1)
  • onIgnoreSummaryChanged (46-51)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (5)
AndroidApp/ui/src/main/res/values/strings.xml (1)

37-37: LGTM!

新しい文字列リソース ignore_summaries が適切に追加されています。英語版の strings.xml にも対応する翻訳が存在することを確認しました。

AndroidApp/ui/src/main/res/values-en/strings.xml (1)

13-13: LGTM!

英語版の文字列リソースが日本語版と同じキー名で適切に追加されています。

AndroidApp/ui/src/main/kotlin/me/nya_n/notificationnotifier/ui/screen/detail/DetailScreen.kt (3)

75-78: LGTM!

UIステートとViewModelメソッドへの接続が適切に実装されています。


84-91: LGTM!

DetailContent の公開APIに新しいパラメータが適切に追加されています。


217-248: LGTM!

プレビュー関数が両方の状態(チェック済み・未チェック)を適切にカバーしています。

@ptkNktq ptkNktq merged commit dd86bef into develop Jan 12, 2026
2 checks passed
@ptkNktq ptkNktq deleted the feature/ignore_summary branch January 12, 2026 14:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants