New user options:
- Content filter: important-only (default) or forward-all
- Rate limit: toggle on/off, adjustable minutes
- Balance check: toggle on/off (off = no suspend, no decrement)
UI: SMS section now has 3 SwitchRows under target list, with
balance/carrier/quota status + "解除挂起" button shown when
balance check is on.
Logic: SmsFallbackForwarder reads new flags to skip checks;
CarrierBalanceQuery guards decrement/suspend on flag.
version 1.9.9 -> 1.10.0 (code 38 -> 39)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Gitea URL used as primary (same-version tie-break), GitHub as fallback
- download() tries base url first; if it fails, automatically retries
the fallback URL
- version 1.9.1 -> 1.9.2 (code 30 -> 31)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Same-version update was picking GitHub URL (crowded first) which
downloads fail in China. Now Gitea info is inserted before GitHub
so maxByOrNull takes the Gitea one on version tie.
version 1.9.0 -> 1.9.1 (code 29 -> 30)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Meow channel mark now uses the official cat-face logo (transparent
background, cropped from brand image)
- All five channels now have proper brand/themed icons
- version 1.8.10 -> 1.8.11 (code 27 -> 28)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Bark: official logo from Finb/Bark repo (ic_bark_logo.png)
- ntfy: official logo from binwiederhier/ntfy repo (ic_ntfy_logo.png)
- Meow: Material Pets icon (paw) — no official logo found
- Email: Material Email icon
- SMS: Material Sms icon
- ChannelMark now supports both ImageVector and Painter (PNG logo)
- SectionCard gains optional titleIcon parameter
- version 1.8.9 -> 1.8.10 (code 26 -> 27)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Bark/ntfy help (info) icons now bright orange (#FF9800)
- Deleted all releases below v1.8.0 from GitHub and Gitea
- version 1.8.7 -> 1.8.8 (code 24 -> 25)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Replace "转发到 iOS Bark" with "多通道转发" across HomeScreen/FilterScreen
- Email config items now use EmailServerRow (two-line layout matching
Bark/ntfy): name + test/edit/delete on row 1, host:port + recipient
on row 2 with up/down buttons
- version 1.8.6 -> 1.8.7 (code 23 -> 24)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Small pulsing circle icon (top-right) that persists across all tabs,
blinks slowly (alpha 0.35↔1.0, 1.2s cycle). Tapping opens UpdateDialog.
version 1.8.5 -> 1.8.6 (code 22 -> 23)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- update-source in release notes now XOR-scrambled (not plain Base64)
- UpdateDialog filters out update-source comment line from notes
- Download progress shows "正在下载更新…" instead of percentage/source
- version 1.8.1 -> 1.8.2 (code 18 -> 19)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Gitea URL removed from source code. UpdateChecker now only hardcodes
GitHub API; the Gitea mirror URL is embedded in release notes as an
HTML comment (<!-- update-source: ... -->) and discovered at runtime.
Keeps self-hosted server address out of the public codebase.
version 1.8.0 -> 1.8.1 (code 17 -> 18)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
All four forwarding channels now support multiple configurations (add/
edit/delete/reorder/enable per item, matching Bark server UX):
- model: NtfyServer, EmailServer, SmsTarget data classes
- SettingsStore: ntfyServers/emailServers/smsTargets as List; full CRUD
(add/update/delete/move/setEnabled); legacy single-config auto-migrated
to list via config_version; 4 stopOnFirst toggles (bark=true, others
false)
- BarkSender/NtfySender/EmailSender: pushToEnabled(configs, stopOnFirst)
— stopOnFirst=true: first success stops; false: send to all
- SmsFallbackForwarder: forward iterates smsTargets per stopOnFirst
- UI: each channel SectionCard has toggle + stopOnFirst switch + config
list + add button; ConfigRow + ConfigDialog reusable components
- version 1.7.3 -> 1.8.0 (code 16 -> 17)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- start(): check on every launch (no 24h throttle) so the banner shows
after restart even if checked manually moments ago; plus a 24h loop
while app is resident
- check both Gitea and GitHub release APIs, skip whichever is
unreachable, notify the higher version
- version 1.7.2 -> 1.7.3 (code 15 -> 16)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ntfy.sh now treats any request body (PUT/POST, text/plain) as a file
attachment, so messages never showed in the app. Switch to ntfy's JSON
publish API: POST / with {topic,title,message}.
version 1.7.1 -> 1.7.2 (code 14 -> 15)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- HomeScreen update banner: gradient background (tertiary→primary), white
text, large version number, rocket emoji CTA button
- UpdateChecker now auto-notifies via all enabled channels (Bark/ntfy/
email) when a new version is discovered, with version/size/notes
- Periodic check every 24h via coroutine delay loop (replaces one-shot
startup check only); also honors updateCheckEnabled toggle
- version 1.7.0 -> 1.7.1 (code 13 -> 14)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Parallel to Bark: when email forwarding is enabled and a recipient is set,
notifications are also sent via SMTP over SSL (port 465, SMTPS). Works
standalone — no Bark server required.
- core/EmailSender: SMTP over SSL (implicit TLS, port 465), AUTH LOGIN,
UTF-8 subject/body via Base64/MIME; trySend() fire-and-forget helper
- SettingsStore: 7 email settings (enabled, host, port, user, password,
from, to)
- NotifyListenerService + PhoneCallMonitor: call EmailSender.trySend in
parallel with Bark forwarding; fires even if no Bark servers configured
- UI: new "电邮转发" SectionCard in settings (toggle + host/port/user/
password/from/to fields + save button)
- version 1.6.0 -> 1.6.1 (code 10 -> 11); CLAUDE.md synced
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bark servers now form an ordered failover chain: forwarding tries each
enabled server in list order, stopping at the first success.
- model: BarkServer.enabled (defaults true; legacy JSON compatible)
- core/BarkSender.pushToFirst: ordered try-until-success helper, shared
by NotifyListenerService / PhoneCallMonitor / RetryWorker
- BarkClient.push uses msg.copy(deviceKey=server.deviceKey) so each
server pushes its own key
- SettingsStore: drop currentServer/setCurrent; add moveServer +
setServerEnabled; NotificationProcessor no longer sources deviceKey
- UI: ServerRow RadioButton -> Checkbox + per-row test/move-up/move-down;
remove top "send test push" button; HomeScreen shows enabled count
- version 1.5.1 -> 1.6.0 (code 9 -> 10); CLAUDE.md synced
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Investigated 9 failed forwards on device: all "connection closed" to
api.day.app, while ping/curl to the server succeed -> not network-blocked,
but OkHttp transient connection drops that aren't retried (POST read-phase
connection close is not covered by retryOnConnectionFailure).
- BarkClient.push: manual retry up to 3x (600/1200ms backoff) on
IOException (connection closed/timeout/TLS reset); HTTP 4xx/5xx not retried.
- AppRulesStore: add recorder/gallery/find-device/password-manager to default
blacklist; versioned migration (bl_version) merges the new entries into
existing users' blacklist (add-only).
- version 1.5.0 -> 1.5.1 (code 8 -> 9); CLAUDE.md synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Auto-check GitHub Releases latest on launch (24h throttle), show an
update banner on the home screen, download the APK in-app with progress,
and trigger the system installer via FileProvider + REQUEST_INSTALL_PACKAGES.
- core/UpdateChecker: fetch releases/latest, semver compare, stream APK
to externalFilesDir, install via FileProvider (handles MIUI unknown-sources).
- SettingsStore: updateCheckEnabled / lastUpdateCheckTime / ignoredVersion.
- HomeScreen: update banner + UpdateDialog.
- SettingsScreen: "关于与更新" card with auto-check toggle and manual check.
- manifest: REQUEST_INSTALL_PACKAGES + FileProvider; new res/xml/file_paths.xml.
- version 1.4.2 -> 1.5.0 (versionCode 7 -> 8).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>