Files
daily-notification-plugin/docs/progress/P2.1-BATCH-1.md
Matthew Raymer 56a89e65b3 docs(p2.1): Fix baseline tag drift and create method-service mapping
Fixed baseline tag drift issue:
- docs/00-INDEX.md now references docs/progress/00-STATUS.md as canonical baseline
- docs/progress/00-STATUS.md marked as canonical baseline authority

Created Priority 2.1 mapping and batch planning:
- docs/progress/P2.1-METHOD-SERVICE-MAP.md: Complete method-to-service mapping
- docs/progress/P2.1-BATCH-1.md: First batch (pure delegation, ~15 methods)
- docs/progress/P2.1-BATCH-2.md: Second batch (validation + delegation, ~20 methods)

Batch 1 focuses on read-only operations (lowest risk).
Batch 2 focuses on validation + delegation (medium risk).

Expected reduction: ~1,650-2,000 lines across both platforms.

Verification:
- Baseline authority fixed 
- Method mapping complete 
- Batch plans created 
2025-12-23 10:16:12 +00:00

7.7 KiB

Priority 2.1: Batch 1 - Pure Delegation Methods

Purpose: First refactoring batch focusing on pure delegation (lowest risk).
Owner: Development Team
Last Updated: 2025-12-23
Status: planned
Baseline: See docs/progress/00-STATUS.md


Batch 1 Scope

Goal: Refactor methods that are pure delegation (no transformation, minimal validation).

Risk Level: Low (read-only operations, no state mutation)

Estimated Impact: ~15-20 methods across both platforms


Android Methods

Status & Health (Read-Only)

  1. getNotificationStatus()

    • Current: Direct implementation in plugin
    • Target: NotificationStatusChecker.getComprehensiveStatus()
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.kt (~45 lines → ~5 lines)
  2. checkStatus()

    • Current: Alias for getNotificationStatus()
    • Target: NotificationStatusChecker.getComprehensiveStatus()
    • Change: Delegate to same service method
    • Files: DailyNotificationPlugin.kt (~55 lines → ~5 lines)

Permission Checks (Read-Only)

  1. checkPermissionStatus()

    • Current: Direct implementation in plugin
    • Target: PermissionManager.checkNotificationPermission()
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.kt (~53 lines → ~5 lines)
  2. checkPermissions() (override)

    • Current: Direct implementation in plugin
    • Target: PermissionManager.checkAllPermissions()
    • Change: Delegate to manager
    • Files: DailyNotificationPlugin.kt (~43 lines → ~5 lines)

Exact Alarm Status (Read-Only)

  1. getExactAlarmStatus()

    • Current: Direct implementation in plugin
    • Target: DailyNotificationExactAlarmManager.getStatus()
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.kt (~43 lines → ~5 lines)
  2. checkExactAlarmPermission()

    • Current: Direct implementation in plugin
    • Target: DailyNotificationExactAlarmManager.checkPermission()
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.kt (~23 lines → ~5 lines)

Channel Status (Read-Only)

  1. isChannelEnabled()
    • Current: Direct implementation in plugin
    • Target: ChannelManager.isChannelEnabled(channelId)
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.kt (~77 lines → ~5 lines)

Scheduling Queries (Read-Only)

  1. isAlarmScheduled()

    • Current: Direct implementation in plugin
    • Target: DailyNotificationScheduler.isScheduled(...)
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.kt (~24 lines → ~5 lines)
  2. getNextAlarmTime()

    • Current: Direct implementation in plugin
    • Target: DailyNotificationScheduler.getNextAlarmTime()
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.kt (~26 lines → ~5 lines)

Content Cache (Read-Only)

  1. getContentCache()
    • Current: Direct database access in plugin
    • Target: DailyNotificationStorage.getContentCache(id)
    • Change: Replace database access with storage service call
    • Files: DailyNotificationPlugin.kt (~31 lines → ~5 lines)

iOS Methods

Permission Status (Read-Only)

  1. getNotificationPermissionStatus()
    • Current: Direct UNUserNotificationCenter access
    • Target: Create PermissionService.getStatus() (or use existing pattern)
    • Change: Extract to service, delegate
    • Files: DailyNotificationPlugin.swift (~37 lines → ~5 lines)

Background Task Status (Read-Only)

  1. getBackgroundTaskStatus()
    • Current: Direct BGTaskScheduler access
    • Target: DailyNotificationBackgroundTaskManager.getStatus()
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.swift (~18 lines → ~5 lines)

Scheduling Queries (Read-Only)

  1. getNextScheduledNotificationTime()
    • Current: Direct scheduler access
    • Target: DailyNotificationScheduler.getNextTime()
    • Change: Replace implementation with service call
    • Files: DailyNotificationPlugin.swift (~29 lines → ~5 lines)

Content & History (Read-Only)

  1. getLastNotification()

    • Current: Direct storage access
    • Target: DailyNotificationStorage.getLastNotification()
    • Change: Replace storage access with service call
    • Files: DailyNotificationPlugin.swift (~38 lines → ~5 lines)
  2. getScheduledReminders()

    • Current: Direct UserDefaults access
    • Target: DailyNotificationStorage.getReminders()
    • Change: Replace UserDefaults access with storage service call
    • Files: DailyNotificationPlugin.swift (~24 lines → ~5 lines)

Implementation Steps

Step 1: Verify Service Methods Exist

  • Check NotificationStatusChecker.getComprehensiveStatus() exists
  • Check PermissionManager.checkNotificationPermission() exists
  • Check DailyNotificationExactAlarmManager.getStatus() exists
  • Check ChannelManager.isChannelEnabled() exists
  • Check DailyNotificationScheduler.isScheduled() exists
  • Check DailyNotificationScheduler.getNextAlarmTime() exists
  • Check DailyNotificationStorage.getContentCache() exists
  • Check iOS service methods exist or need creation

Step 2: Create Service Instances (if needed)

  • Ensure plugin has service instances as private properties
  • Initialize services in load() method
  • Add null checks where appropriate

Step 3: Refactor Android Methods

  • Replace getNotificationStatus() implementation
  • Replace checkStatus() implementation
  • Replace checkPermissionStatus() implementation
  • Replace checkPermissions() implementation
  • Replace getExactAlarmStatus() implementation
  • Replace checkExactAlarmPermission() implementation
  • Replace isChannelEnabled() implementation
  • Replace isAlarmScheduled() implementation
  • Replace getNextAlarmTime() implementation
  • Replace getContentCache() implementation

Step 4: Refactor iOS Methods

  • Replace getNotificationPermissionStatus() implementation
  • Replace getBackgroundTaskStatus() implementation
  • Replace getNextScheduledNotificationTime() implementation
  • Replace getLastNotification() implementation
  • Replace getScheduledReminders() implementation

Step 5: Testing

  • Run Android unit tests
  • Run iOS unit tests
  • Run integration tests
  • Manual smoke test on both platforms
  • Verify no behavior changes

Step 6: Verification

  • Run ./ci/run.sh (must pass)
  • Check plugin class line count reduction
  • Verify service methods are being called
  • Update progress docs

Expected Outcomes

Metrics

  • Android plugin: ~400-500 lines removed
  • iOS plugin: ~150-200 lines removed
  • Total reduction: ~550-700 lines across both platforms
  • Test coverage: Maintained (no behavior changes)

Benefits

  • Plugin classes become thinner
  • Business logic moves to testable services
  • No breaking API changes
  • Lower risk (read-only operations)

Rollback Plan

If issues arise:

  1. Revert commits for this batch
  2. Service methods remain unchanged (no risk)
  3. Plugin methods can be restored from git history

Next Batch

After Batch 1 completes successfully:

  • Batch 2: Validation + Delegation methods (input validation, then delegate)
  • Batch 3: Glue methods (orchestration across multiple services)