- Remove setFetchTime() calls from DailyNotificationFetchWorker
- Remove setFetchTime() calls from DailyNotificationFetcher
- Update DailyNotificationMaintenanceWorker to use getFetchedAt()
- Update DailyNotificationMigration to use getFetchedAt()
- Align all classes with immutable fetchedAt timestamp approach
- Ensure consistent timestamp handling across the codebase
These changes support the new timestamp model where fetchedAt
is immutable and set at object creation time.
- Separate fetchedAt (immutable) and scheduledAt (mutable) timestamps
- Add custom JsonDeserializer to ensure fetchedAt is set by constructor
- Add transient fetchTime field for Gson compatibility
- Update TTL enforcer to use fetchedAt for freshness checks
- Increase DEFAULT_TTL_SECONDS to 25 hours for daily notifications
- Update storage to use custom Gson deserializer
- Add debug logging for timestamp validation
- Fix timestamp initialization in NotificationContent constructor
This resolves the TTL_VIOLATION error that was preventing
notifications from being scheduled due to stale timestamp data.
- Add ensureStorageInitialized() helper method for null safety
- Add storage initialization checks to all plugin methods
- Fix null pointer exception in scheduleDailyNotification()
- Add storage initialization to getLastNotification()
- Add storage initialization to cancelAllNotifications()
- Add storage initialization to updateSettings()
- Add storage initialization to setAdaptiveScheduling()
- Add storage initialization to checkAndPerformRecovery()
- Improve exact alarm permission handling with proper Settings intent
- Add comprehensive error handling for storage operations
This resolves the 'Attempt to invoke virtual method on null object'
error that was occurring when plugin methods were called before
storage initialization completed.
- Add android:exported="true" for API 31+ compatibility
- Add android:directBootAware="true" for Direct Boot handling
- Add LOCKED_BOOT_COMPLETED action for early boot recovery
- Remove PACKAGE_REPLACED action (not needed for our use case)
- Implement handleLockedBootCompleted() for Direct Boot safety
- Use device protected storage context for Direct Boot operations
- Add comprehensive logging for boot receiver events
This fixes Android 10+ boot receiver restrictions and ensures
notifications are restored after device reboots and app updates.
- Add full DailyNotificationPlugin with @CapacitorPlugin annotation
- Implement echo method for testing plugin connectivity
- Add comprehensive notification functionality with offline-first approach
- Include performance optimization and error handling classes
- Add WorkManager integration for background content fetching
- Plugin now ready for testing with Capacitor 6 registration
- Add capacitor.plugins.json with correct DailyNotification plugin entry
- Use 'classpath' field instead of 'classname' for Capacitor 6 compatibility
- Add annotation processor dependency to plugin build.gradle
- Plugin now successfully registers with Capacitor bridge
Fixes: PluginLoadException and plugin availability issues
Resolves: DailyNotification plugin not loading despite manual registration
- Create fix-capacitor-build.sh script to restore fixes after Capacitor operations
- Update build-native.sh to automatically apply fix when needed
- Add warnings to BUILDING.md about auto-generated file risks
- Document which Capacitor commands will overwrite manual fixes
This protects against losing the capacitor.build.gradle fix when running
npx cap sync, npx cap update, or other Capacitor CLI commands.
- Fix capacitor.build.gradle to comment out missing Capacitor integration file
- Create separate plugin module with proper build.gradle configuration
- Copy plugin source code to android/plugin/src/main/java/
- Update settings.gradle to include plugin module
- Fix plugin build.gradle to remove Kotlin plugin dependency
- Successfully build plugin AAR: android/plugin/build/outputs/aar/plugin-release.aar
- Update BUILDING.md with correct build commands and troubleshooting
This resolves the Android Studio build issues by creating a proper
plugin library module separate from the test app.