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.
Remove the aud (audience) claim from JWT payloads. The server's did-jwt
verification requires an audience option when aud is present, but the server
isn't configured to validate it, causing "JWT audience is required but your
app address has not been configured" errors.
Changes:
- Removed aud claim from JWT payload in generateEndorserJWT()
- Updated key derivation to User Zero's specific path (m/84737769'/0'/0'/0')
- Added public key verification against expected User Zero key
- Enhanced JWT diagnostics logging throughout
- Added alarm deduplication optimization (prevent duplicate alarms for same time)
Verified: JWT validation now passes (token length 360→333 chars, no audience
error). New error is API parameter validation (afterId required - separate issue).
Add detailed logging when cancelling existing alarms to aid in
debugging notification scheduling issues. Logs now indicate whether
an existing alarm was found and cancelled, or if no alarm existed.
This improves observability when investigating duplicate notifications
or scheduling conflicts.
Critical Priority Improvements (Completed):
- Enhanced exact-time reliability for Doze & Android 12+ with setExactAndAllowWhileIdle
- Implemented DST-safe time calculation using Java 8 Time API to prevent notification drift
- Added comprehensive schema validation with Zod for all notification inputs
- Created Android 13+ permission UX with graceful fallbacks and education dialogs
High Priority Improvements (Completed):
- Implemented work deduplication and idempotence in DailyNotificationWorker
- Added atomic locks and completion tracking to prevent race conditions
- Enhanced error handling and logging throughout the notification pipeline
New Services Added:
- NotificationValidationService: Runtime schema validation with detailed error messages
- NotificationPermissionManager: Comprehensive permission handling with user education
Documentation Added:
- NOTIFICATION_STACK_IMPROVEMENT_PLAN.md: Complete implementation roadmap with checkboxes
- VUE3_NOTIFICATION_IMPLEMENTATION_GUIDE.md: Vue3 integration guide with code examples
This implementation addresses the most critical reliability and user experience issues
identified in the notification stack analysis, providing a solid foundation for
production-ready notification delivery.
- Add PendingIntentManager class for proper PendingIntent handling
- Implement correct FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE flags for Android 12+
- Add comprehensive exact alarm permission checking and handling
- Add fallback to windowed alarms when exact alarm permission denied
- Update DailyNotificationScheduler to use PendingIntentManager
- Add detailed alarm status reporting with Android version info
- Improve error handling for SecurityException on exact alarm scheduling
- Add comprehensive alarm status to checkStatus() method
P0 Priority Implementation:
- Fixes PendingIntent flags for modern Android compatibility
- Ensures exact alarm permissions are properly checked before scheduling
- Provides actionable error messages when exact alarm permission denied
- Adds fallback to windowed alarms for better reliability
- Improves alarm scheduling status reporting and debugging
This addresses the critical P0 issues with PendingIntent flags and
exact alarm permission handling for production reliability.
- 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 static daily reminders to README.md core features and API reference
- Create detailed usage guide in USAGE.md with examples and best practices
- Add version 2.1.0 changelog entry documenting new reminder functionality
- Create examples/static-daily-reminders.ts with complete usage examples
- Update test-apps README to include reminder testing capabilities
The static daily reminder feature provides simple daily notifications
without network content dependency, supporting cross-platform scheduling
with rich customization options.
- Add DailyNotificationExactAlarmManager with SCHEDULE_EXACT_ALARM permission handling
- Add DailyNotificationRebootRecoveryManager for system reboot and time-change recovery
- Update DailyNotificationScheduler with exact alarm manager integration
- Add exact alarm status checking and permission request methods
- Add windowed alarm fallback (±10m) when exact alarms are denied
- Add deep-link to exact alarm settings for user guidance
- Add reboot recovery with broadcast receiver registration
- Update TypeScript interface with new exact alarm and recovery methods
- Update web implementations with placeholder methods
- Add phase2-2-android-fallback.ts usage examples
This completes Phase 2.2 Android fallback implementation:
- Exact alarm permission handling with graceful fallback
- Windowed alarm support (±10m) for battery optimization
- Reboot and time-change recovery with broadcast receivers
- Deep-link to exact alarm settings for user enablement
- Integration with existing TTL enforcement and rolling window
- Comprehensive fallback scenarios and error handling
Files: 7 changed, 1200+ insertions(+)