Commit Graph

39 Commits

Author SHA1 Message Date
Jose Olarte III
87d24ca506 chore(release): bump plugin version to 2.1.0 2026-03-19 14:22:59 +08:00
11561991bd rename 'docs' directory to 'doc' 2026-03-14 19:52:40 -06:00
Jose Olarte III
ca6a75ded8 chore(release): bump plugin version to 2.0.0
- package.json, package-lock.json
- ios/Plugin/Info.plist (CFBundleShortVersionString)
- ios/DailyNotificationPlugin.podspec
- Android: DailyNotificationPlugin.kt, NotifyReceiver.kt, FetchWorker.kt,
  ReactivationManager.kt (header @version and runtime version payloads)
- src/observability.ts (@version)

Major bump for com→org package rename (breaking change for consumers).
2026-03-12 14:37:24 +08:00
Jose Olarte III
b8d9b6247d chore(release): bump plugin version to 1.3.3
Sync version in package.json, package-lock.json, Android/Kotlin sources,
iOS Info.plist, and ios/DailyNotificationPlugin.podspec.
2026-03-09 20:32:02 +08:00
Jose Olarte III
daaf7aa62a chore(release): bump version to 1.3.2
Removes exact alarms (Android); delivery is now inexact/schedule-based.

- package.json, observability, ios Info.plist, android plugin version refs
2026-03-09 18:29:56 +08:00
Jose Olarte III
6f4d946662 chore: bump plugin version to 1.3.1
Align package.json and all plugin version references (Android, TS
definitions, observability, web) to 1.3.1 after rollover-interval fixes.
2026-03-04 21:28:20 +08:00
Jose Olarte III
2714480070 chore: bump plugin version to 1.3.0
Align package.json and all plugin version references (Android entity
strings and file headers, TypeScript definitions/observability/web)
with 1.3.0 for the rolloverIntervalMinutes release.
2026-03-03 17:48:18 +08:00
Jose Olarte III
aa0eaa5389 chore: bump plugin version to 1.2.1
Update package.json, iOS podspec, and Android plugin-version references
after fix for duplicate fallback notifications (cancel fetch-related
WorkManager jobs when scheduling daily notification).
2026-03-02 16:44:06 +08:00
Jose Olarte III
cff7b659dc chore(version): bump plugin to 1.2.0
- package.json, README.md, podspec
- src: definitions.ts, observability.ts, web.ts
- android: DailyNotificationPlugin.kt, DailyNotificationWorker.java,
  FetchWorker.kt, NotifyReceiver.kt, ReactivationManager.kt,
  DailyNotificationStorageRoom.java
2026-02-26 18:30:32 +08:00
Jose Olarte III
bc3bf484cc chore: bump plugin version to 1.1.9 2026-02-24 19:20:45 +08:00
Jose Olarte III
7188d32ae6 chore: bump plugin version to 1.1.8
- package.json: 1.1.7 → 1.1.8
- Android: ReactivationManager, FetchWorker, NotifyReceiver,
  DailyNotificationStorageRoom, DailyNotificationWorker (entity pluginVersion)
- TypeScript: web.ts, observability.ts, definitions.ts (@version)
2026-02-23 18:37:02 +08:00
Jose Olarte III
c2b1a60804 chore(release): 1.1.7 2026-02-18 18:30:26 +08:00
Jose Olarte III
9feaf60c84 chore: bump plugin version to 1.1.6 2026-02-16 19:19:09 +08:00
Jose Olarte III
531ce9f709 chore: bump plugin version to 1.1.5 2026-02-16 18:18:09 +08:00
Jose Olarte III
02a44a3e7b chore(release): bump plugin version to 1.1.4
Align version across package.json, iOS podspec, Android/TS sources,
README, and CHANGELOG after 1.1.4 fixes (reset alarm, static rollover,
cancelDailyReminder).

Changes:
- package.json: 1.1.3 → 1.1.4
- ios/DailyNotificationPlugin.podspec: 1.1.1 → 1.1.4
- Android: NotifyReceiver, ReactivationManager, FetchWorker,
  DailyNotificationStorageRoom — plugin version strings/comments
- src: web.ts, observability.ts, definitions.ts — @version headers
- README.md: version line
- CHANGELOG.md: add [1.1.4] - 2026-02-16 entry (fixes + cancelDailyReminder)

Files modified:
- package.json
- ios/DailyNotificationPlugin.podspec
- android/.../NotifyReceiver.kt, ReactivationManager.kt, FetchWorker.kt,
  storage/DailyNotificationStorageRoom.java
- src/web.ts, observability.ts, definitions.ts
- README.md, CHANGELOG.md
2026-02-16 17:02:38 +08:00
Jose Olarte III
a62f54b8a8 fix(android): Java call sites for scheduleExactNotification need 8th parameter
Add skipPendingIntentIdempotence (false) to NotifyReceiver.scheduleExactNotification
calls in DailyNotificationReceiver.java and DailyNotificationWorker.java so
consuming apps compile. Rollover paths do not skip idempotence.

- DailyNotificationReceiver: scheduleNextNotification() — add 8th arg false
- DailyNotificationWorker: scheduleNextNotification() — add 8th arg false
- Bump version to 1.1.3 (package.json, CHANGELOG, native/TS refs)
2026-02-13 19:51:49 +08:00
Jose Olarte III
7702bd3b81 fix(android): second daily notification not firing after reschedule
Cancel-then-schedule was skipped because the idempotence check still
found the cancelled PendingIntent in Android's cache. Skip
PendingIntent idempotence on the cancel-then-schedule path so the
new schedule is always set.

- NotifyReceiver.scheduleExactNotification: add
  skipPendingIntentIdempotence (used only from scheduleDailyNotification)
- ScheduleHelper: pass skipPendingIntentIdempotence=true after
  cancelNotification(scheduleId)
- Version 1.1.2: package.json, CHANGELOG, README, TS/Android refs
- docs/CONSUMING_APP_OPTIONAL_ANDROID_ID_CLEANUP.md: optional app
  cleanup to use one stable id on both platforms
2026-02-13 19:26:09 +08:00
Jose Olarte III
a77f08052f chore(version): bump to 1.1.1 after Android alarm fix and EMULATOR_GUIDE docs 2026-02-05 19:36:33 +08:00
Jose Olarte III
bf90f158ac chore(version): bump to 1.1.0 after ios-2 merge
Version bump reflects new features merged from ios-2 branch:
- iOS rollover recovery for background/inactive app scenarios
- Build script improvements and iOS support
- Test app enhancements and UI improvements

This is a MINOR version bump per semantic versioning due to
backward-compatible feature additions.
2026-01-22 15:18:00 +08:00
Jose Olarte III
7f79c5990b fix: include source files and build configs in package files for git installs 2026-01-19 18:57:53 +08:00
Jose Olarte III
bef88ad844 feat: add prepare script for automatic build on git install 2026-01-19 18:47:32 +08:00
Matthew Raymer
cc3daaec23 feat: implement remaining production-critical TODOs
Implement iOS fetcher scheduling hooks, Android FetchWorker metrics,
and convert iOS callbacks TODOs to explicit behavior. Add TODO scan
script to prevent documentation drift.

Changes:
- iOS Scheduler: Added DailyNotificationFetchScheduling protocol
  - Implemented fetcher scheduling hooks (2 TODOs removed)
  - Added NoopFetcherScheduler default implementation
  - Replaced TODOs with actual scheduleFetch/scheduleImmediateFetch calls
- Android FetchWorker: Implemented metrics interface (5 TODOs removed)
  - Added FetchWorkerMetrics interface with 8 methods
  - Implemented retry classifier (isRetryable) for deterministic logic
  - Added metrics tracking: run/success/failure/retry counts, duration,
    items fetched/saved/enqueued
  - Replaced SharedPreferences TODO with explicit NOTE
- iOS Callbacks: Converted TODOs to explicit behavior (8 TODOs removed)
  - All callback persistence methods now have clear "not implemented"
    messages
  - Removed literal TODO markers to make TODO scan meaningful
- TODO Scan Script: Created scripts/todo-scan.js
  - Scans repo for TODO/FIXME markers
  - Generates machine-readable JSON and markdown summary
  - Added npm run todo:scan script
  - Regenerated docs/TODO-CLASSIFICATION.md (69 markers total)

Verification:
- TypeScript typecheck: PASS
- Tests: PASS (115 tests, 8 test suites)
- No linter errors
- All target TODOs removed from production code

Files changed:
- ios/Plugin/DailyNotificationScheduler.swift (+52/-52 lines)
- android/.../DailyNotificationFetchWorker.java (+113 lines)
- ios/Plugin/DailyNotificationCallbacks.swift (+44/-44 lines)
- scripts/todo-scan.js (new, 193 lines)
- package.json (added todo:scan script)
- docs/TODO-CLASSIFICATION.md (regenerated)
- docs/todo-scan.json (new, generated)
- docs/progress/00-STATUS.md (updated)
- docs/progress/01-CHANGELOG-WORK.md (updated)
2025-12-24 06:52:41 +00:00
Matthew Raymer
eb1fc9f220 feat(docs): complete P2.6 type safety cleanup and P2.7 system invariants
P2.6: Type Safety Cleanup
- Replaced 'any' return types in vite-plugin.ts with concrete types (UserConfig, transform return type)
- Documented TypeScript mixin 'any[]' exception in PlatformServiceMixin.ts
- Audit confirmed: zero 'any' in codebase except documented TS mixin limitation
- All external boundaries use 'unknown', all data payloads use 'Record<string, unknown>'

P2.7: System Invariants Documentation
- Created SYSTEM_INVARIANTS.md documenting all 6 enforced invariants
- Added to docs/00-INDEX.md under Policy & Contracts section
- Each invariant includes: What, Why, How, Where

Progress Docs Updates:
- Updated 00-STATUS.md: marked P2.6/P2.7 complete, added type safety invariant note
- Updated 01-CHANGELOG-WORK.md: added 2025-12-22 entries for P2.6/P2.7
- Updated 03-TEST-RUNS.md: added P2.6 type safety audit test run
- Updated P2-DESIGN.md: marked P2.6 acceptance criteria complete
- Updated SYSTEM_INVARIANTS.md: added Type Safety Notes section

Baseline Tag:
- Created v1.0.11-p0-p1.4-p1.5-p2.6-p2.7-complete

TypeScript compilation:  PASSES
Build:  PASSES
CI:  All checks pass
2025-12-22 10:56:00 +00:00
Matthew Raymer
1b34f1f34a fix(android): configure native fetcher, use DailyNotificationFetchWorker, and cancel notifications on dismiss
Fix three critical issues in the Android notification system:

1. configureNativeFetcher() now actually calls nativeFetcher.configure() method
   - Previously only stored config in database without configuring fetcher instance
   - Added synchronous configure() call with proper error handling
   - Stores valid but empty config entry if configure() fails to prevent downstream errors
   - Adds FETCHER|CONFIGURE_START and FETCHER|CONFIGURE_COMPLETE instrumentation logs

2. Prefetch operations now use DailyNotificationFetchWorker instead of legacy FetchWorker
   - Replaced FetchWorker.scheduleDelayedFetch() with WorkManager scheduling
   - Uses correct input data format (scheduled_time, fetch_time, retry_count, immediate)
   - Enables native fetcher SPI to be used for prefetch operations
   - Handles both delayed and immediate prefetch scenarios

3. Notification dismiss now cancels notification from NotificationManager
   - Added notification cancellation before removing from storage
   - Uses notificationId.hashCode() to match display notification ID
   - Ensures notification disappears immediately when dismiss button is clicked
   - Adds DN|DISMISS_CANCEL_NOTIF instrumentation log

Version bump: 1.0.8 → 1.0.11
2025-11-11 08:06:59 +00:00
Matthew Raymer
5b61f18bd7 feat(android): add exact alarm permission request flow and fix receiver mismatch
Add comprehensive exact alarm permission handling for Android 12+ (API 31+)
and fix critical bugs preventing notifications from triggering.

Features:
- Add checkExactAlarmPermission() and requestExactAlarmPermission() plugin methods
- Add canScheduleExactAlarms() and canRequestExactAlarmPermission() helper methods
- Update all scheduling methods to check/request permission before scheduling
- Use reflection for canRequestScheduleExactAlarms() to avoid compilation issues

Bug Fixes:
- Fix receiver mismatch: change alarm intents from NotifyReceiver to DailyNotificationReceiver
- Fix coroutine compilation error: wrap getLatest() suspend call in runBlocking
- Store notification content in database before scheduling alarms
- Update intent action to match manifest registration

The permission request flow opens Settings intent when SCHEDULE_EXACT_ALARM
permission is not granted, providing clear user guidance. All scheduling
methods now check permission status and request it if needed before proceeding.

Version bumped to 1.0.8
2025-11-10 05:51:05 +00:00
Matthew Raymer
f31bae1563 feat(android): implement cancelAllNotifications() method
- Add cancelAllNotifications() method to DailyNotificationPlugin
  - Cancels all AlarmManager alarms (exact and inexact)
  - Cancels all WorkManager prefetch/fetch jobs by tag
  - Clears notification schedules from database (sets enabled=false)
  - Idempotent - safe to call multiple times

- Implementation details:
  - Reads scheduled notifications from database
  - Uses NotifyReceiver.cancelNotification() for each scheduled alarm
  - Includes fallback cleanup for orphaned alarms
  - Cancels WorkManager jobs with tags: prefetch, daily_notification_fetch,
    daily_notification_maintenance, soft_refetch, daily_notification_display,
    daily_notification_dismiss
  - Disables all notification and fetch schedules in database

- Add required imports:
  - android.app.PendingIntent for alarm cancellation
  - androidx.work.WorkManager for job cancellation

- Error handling:
  - Gracefully handles missing alarms/jobs (logs warnings, doesn't fail)
  - Continues cleanup even if individual operations fail
  - Comprehensive logging for debugging

Fixes:
- 'not implemented' error when host app calls cancelAllNotifications()
- Enables users to update notification time without errors
- Allows users to disable notifications completely
- Prevents orphaned alarms and jobs after cancellation

The method matches TypeScript interface and is ready for use.
2025-11-10 04:17:45 +00:00
Matthew Raymer
50b08401d0 fix(android): resolve MainActivity ClassNotFoundException and add exact alarm permission check
- Fix MainActivity ClassNotFoundException by using dynamic package launcher intent
  - Replace hardcoded MainActivity class references with getLaunchIntent() helper
  - Uses packageManager.getLaunchIntentForPackage() to work with any host app
  - Removes dependency on specific MainActivity package/class name
  - Fixes 3 occurrences in NotifyReceiver.kt (alarm clock, notification click, reminder click)

- Add exact alarm permission check before scheduling (Android 12+)
  - Add canScheduleExactAlarms() helper to check SCHEDULE_EXACT_ALARM permission
  - Check permission before scheduling exact alarms in scheduleExactNotification()
  - Gracefully fall back to inexact alarms when permission not granted
  - Prevents SecurityException and provides clear logging

- Bump version to 1.0.2

Fixes:
- ClassNotFoundException when plugin tries to resolve hardcoded MainActivity path
- SecurityException on Android 12+ when exact alarm permission not granted
- Plugin now works with any host app regardless of MainActivity package/class

All changes maintain backward compatibility and improve reliability.
2025-11-10 03:52:35 +00:00
Matthew Raymer
d9bdeb6d02 refactor(android)!: restructure to standard Capacitor plugin layout
Restructure Android project from nested module layout to standard
Capacitor plugin structure following community conventions.

Structure Changes:
- Move plugin code from android/plugin/ to android/src/main/java/
- Move test app from android/app/ to test-apps/android-test-app/app/
- Remove nested android/plugin module structure
- Remove nested android/app test app structure

Build Infrastructure:
- Add Gradle wrapper files (gradlew, gradlew.bat, gradle/wrapper/)
- Transform android/build.gradle from root project to library module
- Update android/settings.gradle for standalone plugin builds
- Add android/gradle.properties with AndroidX configuration
- Add android/consumer-rules.pro for ProGuard rules

Configuration Updates:
- Add prepare script to package.json for automatic builds on npm install
- Update package.json version to 1.0.1
- Update android/build.gradle to properly resolve Capacitor dependencies
- Update test-apps/android-test-app/settings.gradle with correct paths
- Remove android/variables.gradle (hardcode values in build.gradle)

Documentation:
- Update BUILDING.md with new structure and build process
- Update INTEGRATION_GUIDE.md to reflect standard structure
- Update README.md to remove path fix warnings
- Add test-apps/BUILD_PROCESS.md documenting test app build flows

Test App Configuration:
- Fix android-test-app to correctly reference plugin and Capacitor
- Remove capacitor-cordova-android-plugins dependency (not needed)
- Update capacitor.settings.gradle path verification in fix script

BREAKING CHANGE: Plugin now uses standard Capacitor Android structure.
Consuming apps must update their capacitor.settings.gradle to reference
android/ instead of android/plugin/. This is automatically handled by
Capacitor CLI for apps using standard plugin installation.
2025-11-05 08:08:37 +00:00
Matthew Raymer
791a0635ba fix(plugin): resolve package.json export warnings and dependency conflicts
- Reorder exports to put 'types' first for proper TypeScript resolution
- Update @types/node to ^20.19.0 to resolve Vite compatibility
- Align Capacitor dependencies to ^6.2.1 for consistency
- Fix npm install conflicts in test app

Resolves build warnings about unreachable 'types' conditions in exports.
2025-10-16 13:05:34 +00:00
Matthew Raymer
eaa72aa1c3 fix: resolve all linting errors and dependency conflicts
- Update @types/node from ^18.15.0 to ^20.19.0 to resolve Vite 7.1.9 compatibility
- Remove unused imports in capacitor-platform-service-clean-integration.ts
- Replace non-null assertions with optional chaining for safer code
- Add explicit return types to all async functions and Vue component methods
- Replace console.log statements with comments for better code quality
- Fix unused parameters by prefixing with underscore
- Change Promise<any> to Promise<unknown> for better type safety
- All 31 linting errors resolved, build now passes cleanly

The plugin is now ready for integration with crowd-funder-for-time-pwa project
with clean TypeScript compilation and zero linting warnings.
2025-10-08 11:23:52 +00:00
Matthew Raymer
8dfd3c26f5 chore: update package configuration and dependencies
- Update package.json with native-first architecture description
- Add new build scripts for platform-specific builds
- Update dependencies to align with TimeSafari PWA requirements
- Add development scripts for environment checking and setup
- Update package keywords to reflect native-first focus
- Add bundle size checking and API change detection
- Update version to 2.2.0 with comprehensive feature set

Dependencies: Capacitor 6.2.1, TypeScript 5.2.2, Jest 29.7.0
2025-10-08 06:19:57 +00:00
Matthew Raymer
2a47e8577d feat(core): update plugin with generic polling support and monorepo structure
- Update package.json with workspaces configuration for monorepo structure
- Add test:workspaces script for running tests across all packages
- Update src/definitions.ts with enhanced type definitions for generic polling
- Improve src/callback-registry.ts with better error handling and logging
- Enhance src/observability.ts with telemetry budgets and PII redaction
- Update src/typescript/SecurityManager.ts with JWT validation improvements
- Add support for @timesafari/polling-contracts package integration
- Include backward compatibility with existing plugin interfaces
- Improve TypeScript type safety across all core modules
- Add comprehensive error handling and logging throughout

Establishes the foundation for generic polling while maintaining existing functionality.
2025-10-07 04:44:36 +00:00
Matthew Raymer
38e450de03 chore: Update markdown validation scripts to exclude node_modules
- Update markdown:check and markdown:fix scripts to only validate project files
- Exclude node_modules from markdown validation to reduce noise
- Focus validation on doc/*.md and root *.md files only

Resolves: Markdown validation noise from external dependencies
2025-08-26 12:05:05 +00:00
Matthew Raymer
4a0785b2cb feat: Achieve 100% test coverage (58/58 tests passing)
- Fix time format validation regex to require leading zeros
- Fix content handler validation with proper async/await
- Resolve Jest configuration issues with dist directory exclusion
- All test suites now passing: advanced-scenarios, enterprise-scenarios, daily-notification, edge-cases
- Complete validation system working correctly for time, timezone, content handlers
- Test suite stability confirmed with multiple runs
2025-08-13 04:58:01 +00:00
Matthew Raymer
76295f62b3 fix: Resolve TypeScript compilation errors and test environment issues
- Update interface definitions to match test requirements
- Add missing methods to DailyNotificationPlugin interface
- Fix ContentHandler signature compatibility
- Switch Jest test environment from node to jsdom
- Install required jsdom dependencies
- Update mock plugin objects with all required methods
- Fix timestamp type mismatches in tests
2025-08-12 09:57:52 +00:00
Matthew Raymer
a336b39754 refactor(plugin): modernize plugin architecture and improve type definitions
- Update package.json with modern build tooling and dependencies
- Streamline and enhance TypeScript definitions for better type safety
- Reorganize plugin structure for better maintainability
- Add comprehensive interface definitions for notification features
- Implement proper build configuration with rollup
- Update tsconfig.json for stricter type checking and ES2020 modules

Breaking Changes:
- Changed module structure to use ES modules
- Updated interface definitions with stricter typing
- Removed redundant notification options
- Simplified API surface while maintaining core functionality

Dependencies:
- Upgrade @capacitor dependencies to v5.7.8
- Add rollup and typescript build tools
- Update test framework configuration
2025-03-28 12:47:10 +00:00
Server
9994db28bd feat: implement core notification functionality for iOS and Android - Add settings management, proper error handling, and platform-specific implementations 2025-03-27 01:50:19 -07:00
Matthew Raymer
71e0f297ff refactor: improve build configuration and code organization
- Add build scripts for Android and iOS platforms
- Remove duplicate web implementation (src/web.ts)
- Add proper TypeScript configuration
- Add module documentation to index.ts
- Clean up package.json scripts

This commit improves the project structure and build process by:
1. Adding dedicated build scripts for native platforms
2. Removing redundant web implementation
3. Adding proper TypeScript configuration with strict mode
4. Improving code documentation
5. Organizing package.json scripts

The changes maintain backward compatibility while improving
the development experience and code quality.
2025-03-25 13:13:55 +00:00
Matthew Raymer
e946767cba Initial commit 2025-03-25 10:40:14 +00:00