6066b5ec49
Replaces the AlarmManager-based polling (wake every 60s, open/close WebSocket connections) with a persistent WebSocket subscription to a Nostr relay. Events are delivered in real-time via the open connection. A partial WakeLock keeps the connection alive through Doze mode (same approach as Signal without FCM). - Add NotificationRelayService: foreground service with persistent WebSocket, exponential backoff reconnection, network-aware reconnect, relay rotation on failure, and SharedPreferences config listener - Refactor NostrPoller into notification dispatcher with metadata caching (SharedPreferences-based, avoids redundant WebSocket connections for repeat authors) - Remove NotificationService (AlarmManager scheduler) and PollAlarmReceiver (WakeLock-based polling) - Remove SCHEDULE_EXACT_ALARM permission (no longer needed) - Disable web-layer background refetch on native (persistent connection handles it)