Set package and lockfile to 3.0.1 and document the Android dual-schedule empty native fetch fix in CHANGELOG.
11 KiB
11 KiB
Changelog
All notable changes to the Daily Notification Plugin will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[3.0.1] - 2026-04-16
Fixed
- Android: Dual native prefetch with an empty
NotificationContentlist no longer maps to placeholder title/body or arms the chained notify alarm for that cycle. The cache storesskipNotification,DualScheduleHelperskips display for fresh payloads (and for stale cache whenrelationship.fallbackBehaviorisskip), andDualScheduleFetchRecoverystill schedules the next prefetch.
Added
- Android: Unit tests (
DualScheduleHelperTest) for dual empty-cache resolution and skip payload detection.
[3.0.0] - 2026-04-02
Added
- iOS:
NativeNotificationContentFetcherSPI,FetchContext,NativeNotificationFetcherRegistry, andDailyNotificationPlugin.registerNativeFetcher(_:)for host-provided fetch (parity with AndroidsetNativeFetcher). - iOS:
updateStarredPlans/getStarredPlansplugin methods; starred IDs stored under UserDefaults keydaily_notification_timesafari.starredPlanIds(JSON array string). - Android:
DualScheduleNotifySchedulerandDUAL_NOTIFY_SCHEDULE_ID_KEYto arm the dual user notification after prefetch completes. - Docs:
doc/CONSUMING_APP_HANDOFF_IOS_NATIVE_FETCHER_AND_CHAINED_DUAL.mdfor consuming apps.
Changed
- iOS:
configureNativeFetcherrequires a registered native fetcher (matches Android); callsconfigureon the fetcher; background fetch prefers registered fetcher with timeout, then legacy in-plugin HTTP when no fetcher + config exists. - iOS: Dual (
scheduleDualNotification) uses chained scheduling: prefetch BG task only, then one-shot user notification after fetch (armChainedDualNotificationAfterPrefetch), with max slip before fallback copy. - iOS:
NotificationContentispublicfor host fetcher implementations. - Android: Dual notify exact alarm is no longer scheduled in
ScheduleHelper.scheduleDualNotification; it is scheduled whenFetchWorkercompletes (max(nextNotifyAt, now)), with recovery enqueue unchanged.
Breaking
- iOS:
configureNativeFetcherrejects ifregisterNativeFetcherwas not called first.
[2.1.5] - 2026-03-25
Changed
- Android: Dual (
scheduleDualNotification) content prefetch uses WorkManager withinitialDelayto the nextcontentFetch.scheduleoccurrence (not an immediate fetch at setup). After each successful dual fetch, the next prefetch is re-enqueued from persisted dual config. - Android: Dual prefetch with no
contentFetch.urlinvokes the registeredNativeNotificationContentFetcherwhen present (same SPI asDailyNotificationFetchWorker); otherwise mock JSON is used for development. - Android:
content_cacherows includecacheScope(dual|daily|legacy). Dual notify resolution reads onlydual; daily reminder fetches writedaily, avoiding cross-feature overwrites. Database version 4 with migration from v3.
Documentation
- Android:
doc/platform/android/ANDROID_DUAL_SCHEDULE_NATIVE_FETCH_AND_CACHE_SCOPE.md(implementation plan; see repo for details).
[2.1.4] - 2026-03-20
Fixed
- Android:
scheduleDualNotification/parseContentFetchConfigno longer requirestimeout,retryAttempts, andretryDelayincontentFetch(optional fields per TypeScript). Omitted values defer toFetchWorkerdefaults. - Android:
parseUserNotificationConfigno longer uses strictgetBoolean/getStringfor optionaluserNotificationfields (title,body,sound,vibration,priority). Omitted keys no longer throwJSONException; native scheduling applies existing defaults (NotifyReceiver/DualScheduleHelper).
Documentation
- README: Notes for omitted
contentFetchand optionaluserNotificationfields on Android.
[1.1.6] - 2026-02-16
Fixed
- Android: Alarm set after edit/reschedule now fires. Removed
existingPendingIntent.cancel()in the "cancel existing alarm before rescheduling" path so the PendingIntent passed tosetAlarmClockis not cancelled (onlyalarmManager.cancel()is used), fixing no-fire on some devices.
[1.1.5] - 2026-02-16
Fixed
- Android: Rollover work using a
daily_rollover_*schedule id no longer overwrites the app's schedule row in the DB.NotifyReceiverpost-schedule update skips the "first enabled notify" fallback whenstableScheduleIdstarts withdaily_rollover_, so the app's reminder (e.g.daily_timesafari_reminder) keeps the correctnextRunAtafter a notification fires.
Added
- Docs:
doc/platform/android/CONSUMING_APP_ANDROID_NOTES.md— notes for consuming apps on debouncing doublescheduleDailyNotificationcalls and debugging alarms that are scheduled but do not fire (logcat withDailyNotificationReceiver).
[1.1.4] - 2026-02-16
Fixed
- Android: Re-setting a daily notification (edit/save same time) no longer cancels the alarm and then skips re-scheduling. DB idempotence in
NotifyReceiver.scheduleExactNotification()now runs only when!skipPendingIntentIdempotence, so the app reset flow can re-register the alarm. - Android: Static reminder title/body no longer revert to fallback after the first fire.
DailyNotificationWorker.scheduleNextNotification()now preservesis_static_reminderand stablescheduleIdon rollover so the next occurrence keeps custom text.
Added
- Android:
cancelDailyReminder(call)inDailyNotificationPlugin.ktfor parity with iOS. AcceptsreminderId(orid,reminder_id,scheduleId), cancels the AlarmManager alarm for that id, and performs best-effort DB cleanup (setEnabledfalse,updateRunTimesnull).
[1.1.3] - 2026-02-13
Fixed
- Android (Java): Java call sites for
NotifyReceiver.scheduleExactNotification()now pass the 8th parameterskipPendingIntentIdempotence, fixing "actual and formal argument lists differ in length" when building consuming apps. UpdatedDailyNotificationReceiver.javaandDailyNotificationWorker.java.
[1.1.2] - 2026-02-13
Fixed
- Android: Second daily notification not firing after reschedule. After cancel-then-schedule, the idempotence check could still see the cancelled PendingIntent in Android's cache and skip the new schedule. The cancel-then-schedule path now skips PendingIntent-based idempotence so the new alarm is always registered.
[1.1.1] - 2026-02-05
Fixed
- Android: Target alarm broadcast to app package so receiver is triggered correctly
Documentation
- EMULATOR_GUIDE: prerequisites, API 35, Apple Silicon; build.sh Android-only sync
[2.1.0] - 2025-01-02
Added
- Static Daily Reminders: New functionality for simple daily notifications without network content
- Cross-Platform Reminder API: Consistent reminder management across Android, iOS, and Web
- Reminder Management: Full CRUD operations for reminder scheduling and management
- Offline Reminder Support: Reminders work completely offline without content caching
- Rich Reminder Customization: Support for custom titles, bodies, sounds, vibration, and priorities
- Persistent Reminder Storage: Reminders survive app restarts and device reboots
New Methods
scheduleDailyReminder(options): Schedule a simple daily remindercancelDailyReminder(reminderId): Cancel a specific remindergetScheduledReminders(): Get all scheduled remindersupdateDailyReminder(reminderId, options): Update an existing reminder
Features
- No Network Dependency: Static reminders work completely offline
- Simple Time Format: Easy HH:mm time format (e.g., "09:00")
- Priority Levels: Support for low, normal, and high priority notifications
- Repeat Options: Configurable daily repetition
- Platform Integration: Native notification channels and categories
- Test App Integration: Complete test app support for reminder functionality
Documentation
- Updated README.md with static reminder examples and API reference
- Added comprehensive usage examples in USAGE.md
- Created detailed example file:
examples/static-daily-reminders.ts - Enhanced test apps with reminder management UI
[1.0.0] - 2024-03-20
Added
- Initial release of the Daily Notification Plugin
- Basic notification scheduling functionality
- Support for multiple notification schedules
- Timezone-aware scheduling
- Offline support with content caching
- Retry logic with exponential backoff
- Custom notification content handlers
- Event-based notification handling
- Comprehensive settings management
- TypeScript support with full type definitions
Features
- Schedule daily notifications at specific times
- Support for multiple notification schedules
- Timezone-aware scheduling
- Offline support with content caching
- Retry logic with exponential backoff
- Custom notification content handlers
- Event-based notification handling
- Comprehensive settings management
Security
- HTTPS-only network requests
- Content validation before display
- Secure storage of sensitive data
- Permission-based access control
- No sensitive data in logs
Documentation
- Comprehensive API documentation
- Usage examples for basic and advanced scenarios
- Enterprise-level implementation examples
- Security best practices
- Platform-specific implementation details
Testing
- Unit tests for core functionality
- Integration tests for platform features
- Advanced scenario tests
- Enterprise feature tests
- Security validation tests
[0.9.0] - 2024-03-15
Added
- Beta release with core functionality
- Basic notification scheduling
- Simple content handling
- Basic event system
Changed
- Improved error handling
- Enhanced type definitions
- Better documentation
Fixed
- Initial bug fixes and improvements
- TypeScript type issues
- Documentation clarity
[0.8.0] - 2024-03-10
Added
- Alpha release with basic features
- Initial plugin structure
- Basic TypeScript interfaces
- Simple notification scheduling
Changed
- Early development improvements
- Initial documentation
- Basic test setup
Fixed
- Early bug fixes
- Initial type issues
- Basic documentation
[Unreleased]
Added
- Enterprise features
- Notification queue system
- A/B testing support
- Advanced analytics tracking
- User preferences management
- Content personalization
- Rate limiting
- Additional test scenarios
- More example implementations
- Enhanced documentation
Changed
- Improved error handling
- Enhanced type definitions
- Better documentation structure
- More comprehensive examples
Fixed
- TypeScript type issues
- Documentation clarity
- Test coverage gaps
- Example code improvements
Security
- Enhanced security measures
- Additional validation
- Improved error handling
- Better logging practices
Documentation
- Added enterprise usage examples
- Enhanced API documentation
- Improved security guidelines
- Better troubleshooting guides
Testing
- Added enterprise scenario tests
- Enhanced test coverage
- Improved test organization
- Better test documentation