Integrate Daily Notification Plugin #214

Open
anomalist wants to merge 21 commits from integrate-notification-plugin into master
Owner

Integrate Daily Notification Plugin

# Integrate Daily Notification Plugin
anomalist added 3 commits 2025-11-03 10:05:17 +00:00
- Add comprehensive integration plan following meta_feature_planning workflow
- Add AccountViewView integration strategy with PlatformService approach
- Document architecture decisions: PlatformService interface integration
- Remove web/push notification references
- Document implementation phases and acceptance criteria
- Add daily-notification-plugin as local file dependency
- Update package-lock.json with plugin dependency tree
- Add plugin project to capacitor.build.gradle
- Register plugin in capacitor.plugins.json
- Include plugin project in capacitor.settings.gradle
anomalist added 1 commit 2025-11-04 03:53:06 +00:00
anomalist added 1 commit 2025-11-05 02:18:25 +00:00
anomalist added 3 commits 2025-11-05 04:18:49 +00:00
- Consolidate AccountViewView integration strategy into unified plan
- Add comprehensive AccountViewView Integration Strategy section
- Include UI component design, data flow, and implementation decisions
- Remove separate strategy document to follow meta_feature_planning structure
- Update Phase 2 to include AccountViewView integration tasks
- Add CRITICAL REQUIREMENT in Platform Detection Strategy section
- Add Component Visibility Requirements listing all components
- Add Component Visibility Requirements section in Implementation Notes
- Include required pattern with code examples for component hiding
- Add verification checklist for component hiding
- Update Phase 2 tasks to require platform support checks
- Update Phase 3 tasks to require hiding for all notification views
- Add Risk 6 for components visible on unsupported platforms
- Update acceptance criteria to verify component hiding
- Update success criteria to verify hiding on Web/Electron platforms
anomalist added 1 commit 2025-11-05 04:43:05 +00:00
- Remove ScheduleView, NotificationsView, NotificationHistoryView, NotificationSettingsView
- Remove router routes for independent views
- Remove Pinia store (not needed - state managed locally)
- Remove HomeView diagnostics integration
- Remove native fetcher configuration integration
- Keep only AccountViewView integration with optional supporting components
- Update all phases to focus on AccountViewView only
- Update milestones and testing strategy
- Update dependencies to remove router/pinia references
- Clarify supporting components are optional and only if AccountViewView exceeds length limits
anomalist added 1 commit 2025-11-05 06:03:01 +00:00
- Add checkboxes to Phase 1, 2, 3 task sub-items
- Add checkboxes to Milestone success criteria
- Add checkboxes to Testing Strategy test items
- Add checkboxes to Risk Mitigation mitigation items
- Add checkboxes to Next Steps
- All actionable items now have checkboxes for tracking progress
anomalist added 1 commit 2025-11-05 06:35:13 +00:00
- Update initialization to sync with plugin state on mount (checks for pre-existing schedules)
- Add updateNotificationTime() method to update schedule when time changes (cancel old, schedule new)
- Extract DailyNotificationSection into dedicated component using vue-facing-decorator
- Update component architecture to show DailyNotificationSection.vue structure
- Update Phase 2 tasks to reflect component creation and AccountViewView integration
- Add acceptance criteria for plugin state sync and time update functionality
- Update verification checklist with new requirements
anomalist added 2 commits 2025-11-05 10:37:14 +00:00
Migration 006 was failing during database initialization because the SQLite
plugin splits SQL statements on semicolons, and inline comments after
semicolons were being treated as separate statements. When the last statement
was comment-only (e.g., '-- Notification body text'), it caused an error.

Fixed by removing all inline comments from the migration SQL. The comments
are already documented in the TypeScript code, so they're not needed in the
SQL itself.

NOTE: We're experiencing database initialization problems with storing
notification schedule data. The daily notification plugin was originally
designed to store the schedule internally, which would be a better approach
than storing it in our SQLite database. We should consider migrating to
using the plugin's internal storage instead of adding these columns to the
settings table.
- Add notification methods to PlatformService interface
- Implement notification support in CapacitorPlatformService with plugin integration
- Add stub implementations in WebPlatformService and ElectronPlatformService
- Add nativeNotificationTime, nativeNotificationTitle, and nativeNotificationMessage fields to Settings interface
- Create DailyNotificationSection component for AccountViewView integration
- Add Android manifest permissions (POST_NOTIFICATIONS, SCHEDULE_EXACT_ALARM, RECEIVE_BOOT_COMPLETED)
- Register daily-notification-plugin in capacitor.plugins.json
- Integrate DailyNotificationSection into AccountViewView

Features:
- Platform capability detection (hides on unsupported platforms)
- Permission request flow with fallback to settings
- Schedule/cancel notifications
- Time editing with HTML5 time input
- Settings persistence
- Plugin state synchronization on app load

NOTE: Currently storing notification schedule in SQLite database, but plugin
was designed to store schedule internally. Consider migrating to plugin's
internal storage to avoid database initialization issues.
anomalist added 1 commit 2025-11-06 12:52:05 +00:00
- Add accessTokenForBackground() with 72-hour default expiration
  - Supports offline-first prefetch operations
  - Balances security with offline capability

- Implement proactive token refresh strategy
  - Refresh on component mount (DailyNotificationSection)
  - Refresh on app resume (Capacitor 'resume' event)
  - Refresh when notifications are enabled
  - Automatic refresh without user interaction

- Update CapacitorPlatformService.configureNativeFetcher()
  - Automatically retrieves activeDid from database
  - Generates 72-hour JWT tokens for background operations
  - Includes starred plans in configuration

- Add BroadcastReceivers to AndroidManifest.xml
  - DailyNotificationReceiver for scheduled notifications
  - BootReceiver for rescheduling after device reboot

- Add comprehensive documentation
  - JSDoc comments for all token-related functions
  - Inline comments explaining refresh strategy
  - Documentation section on authentication & token management

Benefits:
- No app wake-up required (refresh when app already open)
- Works offline (72-hour validity supports extended periods)
- Automatic (no user interaction required)
- Graceful degradation (uses cached content if refresh fails)
anomalist added 2 commits 2025-11-10 04:24:10 +00:00
- Change from dynamic to static imports for @timesafari/daily-notification-plugin
- Remove plugin from external dependencies in vite.config.capacitor.mts to ensure proper bundling
- Add debug logging to DailyNotificationSection for troubleshooting
- Update package-lock.json with latest dependencies
anomalist added 1 commit 2025-11-11 01:04:15 +00:00
anomalist added 4 commits 2025-11-11 08:14:57 +00:00
Implement Android host-side integration for daily notification plugin
by creating custom Application class and native content fetcher.

Changes:
- Add TimeSafariApplication.java: Custom Application class that registers
  NativeNotificationContentFetcher with the plugin on app startup
- Add TimeSafariNativeFetcher.java: Implementation of NativeNotificationContentFetcher
  interface that fetches notification content from endorser API endpoint
  (/api/v2/report/plansLastUpdatedBetween) using JWT authentication
- Update AndroidManifest.xml: Declare TimeSafariApplication as the custom
  Application class using android:name attribute
- Add Gson dependency: Include com.google.code.gson:gson:2.10.1 in build.gradle
  for JSON parsing in the native fetcher

This setup mirrors the test app configuration and enables the plugin's
background content prefetching feature. The native fetcher will be called
by the plugin 5 minutes before scheduled notification times to prefetch
content for display.

Author: Matthew Raymer
Add comprehensive instrumentation to diagnose why native fetcher
is not being called during prefetch operations.

Instrumentation Added:
- TimeSafariApplication: Log app initialization, fetcher registration,
  and verification with process ID and timestamps
- TimeSafariNativeFetcher: Log configuration, fetch start, source
  resolution (native vs fallback), and write completion
- Diagnostic script: Filter logcat for prefetch-related events
- Investigation summary: Document root cause hypotheses and
  diagnostic checklist

Log Tags:
- APP|ON_CREATE: App initialization timing and process info
- FETCHER|REGISTER_START/REGISTERED: Fetcher registration lifecycle
- FETCHER|CONFIGURE_START/CONFIGURE_COMPLETE: Configuration tracking
- PREFETCH|START/SOURCE/WRITE_OK: Prefetch operation tracking
- DISPLAY|START/LOOKUP: Display worker tracking (future)
- STORAGE|POST_PREFETCH/PRE_DISPLAY: Storage verification (future)

This instrumentation will help diagnose:
1. Registration timing issues (worker before onCreate)
2. Fetcher resolution failures (null fetcher)
3. Process mismatches (multi-process issues)
4. ID schema inconsistencies (prefetch vs display)
5. Storage persistence issues (content not saved)

Author: Matthew Raymer
- Add notification channel creation in TimeSafariApplication for Android 8.0+
  Required for daily notifications to display properly. Channel ID matches
  plugin's 'timesafari.daily' channel.

- Convert localhost to 10.0.2.2 in CapacitorPlatformService for Android emulators
  Android emulators cannot reach localhost - they need 10.0.2.2 to access
  the host machine's API server.

- Refresh native fetcher configuration when API server changes in AccountViewView
  Ensures background notification prefetch uses the updated endpoint when
  user changes API server URL in settings.

- Add directive for fixing notification dismiss cancellation in plugin
  Documents the fix needed in plugin source to cancel notification from
  NotificationManager when dismiss button is clicked.

These changes ensure daily notifications work correctly on Android, including
proper channel setup, emulator network connectivity, and configuration refresh.
- Add updateStarredPlans call in configureNativeFetcher to store starred
  plan IDs in SharedPreferences for the native fetcher to use
- Clear starred plans if none provided to ensure state consistency
- Add starredPlansCount to configuration log for debugging

This fixes the issue where the native fetcher was querying the API
with an empty planIds array because starred plans weren't being stored
in SharedPreferences. Now when configureNativeFetcher is called with
starredPlanHandleIds, they are properly stored and available for
background prefetch operations.

Also updates package-lock.json for daily-notification-plugin v1.0.11.
This pull request has changes conflicting with the target branch.
  • android/app/src/main/assets/capacitor.plugins.json
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin integrate-notification-plugin:integrate-notification-plugin
git checkout integrate-notification-plugin
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: trent_larson/crowd-funder-for-time-pwa#214