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 ✅
12 KiB
Priority 2.1: Batch 2 - Validation + Delegation Methods
Purpose: Second refactoring batch focusing on methods that validate input then delegate.
Owner: Development Team
Last Updated: 2025-12-23
Status: planned
Baseline: See docs/progress/00-STATUS.md
Batch 2 Scope
Goal: Refactor methods that validate input, then delegate to services.
Risk Level: ⭐⭐ Medium (input validation must be preserved, then delegation)
Estimated Impact: ~20-25 methods across both platforms
Prerequisites: Batch 1 must be complete and verified
Android Methods
Permission Requests (Validation + Delegation)
-
requestNotificationPermissions()- Current: Direct implementation with validation
- Target:
PermissionManager.requestNotificationPermission() - Change: Extract validation, delegate to manager
- Files:
DailyNotificationPlugin.kt(~53 lines → ~10 lines)
-
requestPermissions()(override)- Current: Direct implementation with validation
- Target:
PermissionManager.requestAllPermissions() - Change: Extract validation, delegate to manager
- Files:
DailyNotificationPlugin.kt(~8 lines → ~5 lines)
-
requestExactAlarmPermission()- Current: Direct implementation with validation
- Target:
DailyNotificationExactAlarmManager.requestPermission() - Change: Extract validation, delegate to manager
- Files:
DailyNotificationPlugin.kt(~75 lines → ~10 lines)
Settings Navigation (Validation + Delegation)
-
openExactAlarmSettings()- Current: Direct implementation with activity check
- Target:
DailyNotificationExactAlarmManager.openSettings() - Change: Extract activity validation, delegate
- Files:
DailyNotificationPlugin.kt(~18 lines → ~5 lines)
-
openChannelSettings()- Current: Direct implementation with activity check
- Target:
ChannelManager.openSettings(channelId) - Change: Extract activity validation, delegate
- Files:
DailyNotificationPlugin.kt(~83 lines → ~5 lines)
Schedule Management CRUD (Validation + Delegation)
-
createSchedule()- Current: Direct database access with validation
- Target:
DailyNotificationStorage.createSchedule(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.kt(~25 lines → ~10 lines)
-
updateSchedule()- Current: Direct database access with validation
- Target:
DailyNotificationStorage.updateSchedule(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.kt(~39 lines → ~10 lines)
-
deleteSchedule()- Current: Direct database access with validation
- Target:
DailyNotificationStorage.deleteSchedule(id) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.kt(~15 lines → ~5 lines)
-
enableSchedule()- Current: Direct database access with validation
- Target:
DailyNotificationStorage.enableSchedule(id, enabled) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.kt(~15 lines → ~5 lines)
Scheduling Operations (Validation + Delegation)
-
scheduleDailyNotification()- Current: Direct scheduler access with validation
- Target:
DailyNotificationScheduler.schedule(...) - Change: Extract validation, delegate to scheduler
- Files:
DailyNotificationPlugin.kt(~181 lines → ~15 lines)
-
scheduleUserNotification()- Current: Direct scheduler access with validation
- Target:
DailyNotificationScheduler.scheduleUserNotification(...) - Change: Extract validation, delegate to scheduler
- Files:
DailyNotificationPlugin.kt(~92 lines → ~15 lines)
-
scheduleDailyReminder()- Current: Direct reminder manager access with validation
- Target:
DailyReminderManager.schedule(...) - Change: Extract validation, delegate to manager
- Files:
DailyNotificationPlugin.kt(~13 lines → ~5 lines)
-
testAlarm()- Current: Direct scheduler access with validation
- Target:
DailyNotificationScheduler.scheduleTest(...) - Change: Extract validation, delegate to scheduler
- Files:
DailyNotificationPlugin.kt(~34 lines → ~10 lines)
Callbacks (Validation + Delegation)
registerCallback()- Current: Direct storage access with validation
- Target:
DailyNotificationStorage.registerCallback(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.kt(~31 lines → ~10 lines)
Test Helpers (Validation + Delegation)
injectInvalidTestData()- Current: Direct database access with validation
- Target:
DailyNotificationStorage.injectTestData(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.kt(~94 lines → ~10 lines)
iOS Methods
Permission Requests (Validation + Delegation)
-
requestNotificationPermissions()- Current: Direct
UNUserNotificationCenteraccess with async handling - Target: Create
PermissionService.requestPermissions()or use existing pattern - Change: Extract async handling, delegate to service
- Files:
DailyNotificationPlugin.swift(~97 lines → ~10 lines)
- Current: Direct
-
requestNotificationPermission()- Current: Direct
UNUserNotificationCenteraccess with async handling - Target: Create
PermissionService.requestPermission()or use existing pattern - Change: Extract async handling, delegate to service
- Files:
DailyNotificationPlugin.swift(~29 lines → ~10 lines)
- Current: Direct
Settings Navigation (Validation + Delegation)
-
openNotificationSettings()- Current: Direct
UIApplicationaccess - Target: Create
SettingsService.openNotificationSettings()or utility - Change: Extract app context check, delegate
- Files:
DailyNotificationPlugin.swift(~32 lines → ~5 lines)
- Current: Direct
-
openBackgroundAppRefreshSettings()- Current: Direct
UIApplicationaccess - Target: Create
SettingsService.openBackgroundRefreshSettings()or utility - Change: Extract app context check, delegate
- Files:
DailyNotificationPlugin.swift(~32 lines → ~5 lines)
- Current: Direct
-
openChannelSettings()- Current: Direct
UIApplicationaccess - Target: Create
SettingsService.openChannelSettings()or utility - Change: Extract app context check, delegate
- Files:
DailyNotificationPlugin.swift(~34 lines → ~5 lines)
- Current: Direct
Schedule Management CRUD (Validation + Delegation)
-
scheduleDailyReminder()- Current: Direct UserDefaults access with validation
- Target:
DailyNotificationStorage.storeReminder(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.swift(~90 lines → ~15 lines)
-
cancelDailyReminder()- Current: Direct UserDefaults access with validation
- Target:
DailyNotificationStorage.removeReminder(id) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.swift(~17 lines → ~5 lines)
-
updateDailyReminder()- Current: Direct UserDefaults access with validation
- Target:
DailyNotificationStorage.updateReminder(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.swift(~97 lines → ~15 lines)
Scheduling Operations (Validation + Delegation)
-
scheduleContentFetch()- Current: Direct scheduler access with validation
- Target:
DailyNotificationScheduler.scheduleFetch(...) - Change: Extract validation, delegate to scheduler
- Files:
DailyNotificationPlugin.swift(~17 lines → ~5 lines)
-
scheduleUserNotification()- Current: Direct scheduler access with validation
- Target:
DailyNotificationScheduler.scheduleUserNotification(...) - Change: Extract validation, delegate to scheduler
- Files:
DailyNotificationPlugin.swift(~17 lines → ~5 lines)
-
scheduleDailyNotification()- Current: Direct scheduler access with validation
- Target:
DailyNotificationScheduler.schedule(...) - Change: Extract validation, delegate to scheduler
- Files:
DailyNotificationPlugin.swift(~135 lines → ~15 lines)
Configuration (Validation + Delegation)
-
configure()- Current: Direct storage access with validation
- Target:
DailyNotificationStorage.configure(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.swift(~75 lines → ~10 lines)
-
updateSettings()- Current: Direct storage access with validation
- Target:
DailyNotificationStorage.updateSettings(...) - Change: Extract validation, delegate to storage
- Files:
DailyNotificationPlugin.swift(~60 lines → ~10 lines)
Implementation Steps
Step 1: Verify Service Methods Exist or Create Them
- Verify
PermissionManager.requestNotificationPermission()exists (Android) - Verify
DailyNotificationExactAlarmManager.requestPermission()exists (Android) - Verify
DailyNotificationStorage.createSchedule()exists (Android) - Verify
DailyNotificationScheduler.schedule()exists (Android) - Create or verify iOS
PermissionServicemethods - Create or verify iOS
SettingsServicemethods (or utility class)
Step 2: Extract Validation Logic
- Document current validation rules for each method
- Create validation helper methods in services (if needed)
- Ensure validation errors map to plugin errors correctly
Step 3: Refactor Android Methods
- Refactor permission request methods
- Refactor settings navigation methods
- Refactor schedule CRUD methods
- Refactor scheduling operations
- Refactor callback registration
- Refactor test helpers
Step 4: Refactor iOS Methods
- Refactor permission request methods
- Refactor settings navigation methods
- Refactor schedule CRUD methods
- Refactor scheduling operations
- Refactor configuration methods
Step 5: Testing
- Run Android unit tests (focus on validation)
- Run iOS unit tests (focus on validation)
- Test invalid input handling
- Test valid input flows
- Manual smoke test on both platforms
- Verify error messages are preserved
Step 6: Verification
- Run
./ci/run.sh(must pass) - Check plugin class line count reduction
- Verify validation logic is preserved
- Verify service methods handle validation correctly
- Update progress docs
Expected Outcomes
Metrics
- Android plugin: ~600-700 lines removed
- iOS plugin: ~500-600 lines removed
- Total reduction: ~1,100-1,300 lines across both platforms
- Test coverage: Maintained (validation logic preserved)
Benefits
- ✅ Plugin classes become significantly thinner
- ✅ Validation logic moves to services (testable)
- ✅ No breaking API changes
- ✅ Error handling preserved
Rollback Plan
If issues arise:
- Revert commits for this batch
- Service methods remain unchanged (no risk)
- Plugin methods can be restored from git history
- Validation logic can be re-extracted if needed
Next Batch
After Batch 2 completes successfully:
- Batch 3: Glue methods (orchestration across multiple services)
- Batch 4: Complex initialization and lifecycle methods