CloudySky is an Android client for Solian notifications and account access.
- OIDC sign-in with AppAuth
- Secure token storage
- Notification feed from the Solian API
- Settings screen with account info and listener controls
- SOP listener for real-time notifications via SSE
CloudySky supports the SOP push flow described in docs/SOP_PUSH_API.md.
Behavior:
- registers a SOP subscription after sign-in
- keeps a foreground service alive to listen for SSE notifications
- shows local Android notifications for incoming events
- opens notification deep links using
actionUri - can resume after boot when the listener is enabled
The SOP listener supports three connection modes:
| Mode | Behavior | Battery | Realtime |
|---|---|---|---|
| Stream | Persistent SSE connection | High | Instant |
| Polling | Periodic API polling | Low | Delayed |
| Dynamic | Smart switching (default) | Medium | Near-instant |
Dynamic mode uses a state machine to balance battery usage and responsiveness:
- Idle: Polls the notification API at a configurable interval (1m / 5m / 10m)
- Active: Establishes SSE streaming when a new notification is detected
- Returns to Idle if the stream has no activity for the configured timeout (5m / 10m / 15m / 30m)
The app logs received SOP notifications with timestamps. The log is viewable in Settings and stores the last 50 entries.
CloudySky groups local notifications by metadata in this order:
room_iduser_idtopictype
If a notification has media metadata, it can also show a banner image and a circular avatar:
pfpis used for the sender avatarimageis used as a single banner imageimagesis treated as a multi-image set and rendered as a collage when possible
The app can request exemption from battery optimizations. This helps keep the foreground listener stable on devices that aggressively restrict background work.
A warning banner is shown on the main dashboard when battery optimizations are enabled.
Open the project in Android Studio and run the app configuration.
Build from the command line:
./gradlew :app:assembleDebug- OAuth client configuration is read from
local.properties. - The app uses
https://api.solian.appas the default API base. - Notification list fetching currently remains bearer-auth based.