Skip to content

feat: branding, messages (edit/moderation/cross-post), WorkManager sync, push notifications (no Firebase) - #2

Open
Adron wants to merge 6 commits into
mainfrom
feature/parity-wip
Open

feat: branding, messages (edit/moderation/cross-post), WorkManager sync, push notifications (no Firebase)#2
Adron wants to merge 6 commits into
mainfrom
feature/parity-wip

Conversation

@Adron

@Adron Adron commented Aug 2, 2026

Copy link
Copy Markdown
Member

Summary

Follow-up to the merged parity PR (#1). Adds branding / dark-mode, the message-coupled features, the WorkManager delta-sync bootstrap, and push notifications (no Firebase). :app:assembleDebug is green and every part is verified on an emulator against a live account.

What's in this PR

🎨 Branding + dark mode + message-fix

IL* design-system theme, colors.xml/themes.xml, launcher + splash + monochrome icons, values-night/drawable-night, ThemeSettingsStore, the cross-platform brand-kit, and the messages explicit-null fix.

💬 Messages-coupled features

  • I — Message edit (PATCH /api/messages/{id} + "edited" marker).
  • D remainder — author moderation menu (block / mute / report the author).
  • H — Cross-posting — composer destination chips for already-linked networks (mastodonProviderIds[], crossPostTo{Bluesky,LinkedIn,Twitter}). (OAuth account-linking deferred — needs redirect URIs.)

⚙️ WorkManager delta-sync bootstrap

InterlinedListApplication is a Configuration.Provider supplying the HiltWorkerFactory; default androidx.startup WorkManager initializer removed; doc delta-sync scheduled from the Documents tab. Device-verified: DocumentsSyncWorker runs to SUCCESS against the live API.

🔔 Push notifications — Milestone C, no Firebase (new)

Since there's no Firebase project, push is delivered the standard no-Google way: a background WorkManager poll of GET /api/notifications raises real system-tray notifications (NotificationCompat, per-category channels, grouped + capped), with tap deep-links, a persisted last-seen marker (no backlog dump / no re-notify), and respecting the notification-preferences push channel. No FCM/google-services/UnifiedPush; POST /api/push/register isn't used (no device token without FCM).

  • Also fixes a latent bug: NotificationsResponse never mapped the live items key (only data/notifications), which had been silently emptying the in-app notifications feed and the poll. Now maps items | data | notifications with a regression test.
  • Device-verified: the poll worker runs to SUCCESS and, on a new item, posts real tray notifications (e.g. "Adron Hall mentioned you in a message") in the il_mentions channel, grouped under a summary.

Verified on-device (emulator, live account)

Delta-sync + notifications poll workers running to SUCCESS · real tray notifications posting to the correct channels · message edit / moderation / cross-post composer · dark-mode theme · "This device"-labeled sessions · all major surfaces — no crashes.

Product decisions

  • Billing is NOT in Android — handled on web.
  • No Firebase — push is poll-based local notifications.

Not included — externally gated only

  • H OAuth account-linking — needs registered redirect URIs (cross-posting to already-linked accounts is included).
  • Live E2E of write paths (DM send/receive, share-claim, collaboration, moderation, cross-post delivery) — needs a 2nd + a non-subscriber test account.

Testing

Module unit tests green (notifications 90, messages 94, profile 150, …); :app:assembleDebug succeeds; on-device smoke, delta-sync, and push-notification delivery verified.

🤖 Generated with Claude Code

Adron and others added 6 commits August 2, 2026 12:29
Brand refresh and dark mode: IL* design-system theme (Color/Theme/Logo),
updated colors.xml/themes.xml, launcher + splash + monochrome icons,
values-night/drawable-night dark resources, ThemeSettingsStore in
:core:datastore, and the cross-platform brand-kit assets. Also the messages
explicit-null fix (NetworkModule coerceInputValues + messages DTO/repository
handling).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…I + D remainder)

Edit own messages via PATCH /api/messages/{id} (optimistic + 'edited' marker
from updatedAt); author overflow menu on others' messages with Block/Mute/Report
user (POST /api/users/{username}/block|mute|report), block/mute hide the author
locally. Self-contained in :feature:messages (no :feature:profile dep). 82 unit
tests green; :app:assembleDebug green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…g half)

Composer destinations row: InterlinedList + a toggle per already-linked network
(GET /api/user/identities). Post includes targets via the real create fields
(mastodonProviderIds[], crossPostToBluesky/LinkedIn/Twitter); surfaces the
crossPosts response status. Empty state hints to link accounts on web. OAuth
connect flow deferred (needs redirect URIs). 94 unit tests green; assemble green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make InterlinedListApplication a Configuration.Provider supplying the
HiltWorkerFactory, remove the default androidx.startup WorkManager initializer
(on-demand init), and schedule the periodic + one-shot delta-sync from the
Documents tab, cancelling on sign-out. Device-verified: DocumentsSyncWorker
runs to SUCCESS against the live API.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Background WorkManager poll of GET /api/notifications raises system-tray
notifications (NotificationCompat, per-category channels, grouped, capped),
tap deep-links into the app, respects the push channel in notification
preferences, and persists a last-seen marker (no backlog dump / no re-notify).
No FCM/Firebase/google-services. Scheduled on login, cancelled on sign-out;
POST_NOTIFICATIONS requested on Android 13+.

Also fixes a latent bug: NotificationsResponse never mapped the live 'items'
key (only data/notifications), silently emptying the in-app feed AND the poll.
Now maps items|data|notifications with a regression test.

Device-verified: Documents/NotificationsPollWorker run to SUCCESS; forcing an
older last-seen posts real tray notifications ('Adron Hall mentioned you...')
in the il_mentions channel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Adron Adron changed the title feat: branding + dark mode, messages (edit/moderation/cross-post), WorkManager delta-sync feat: branding, messages (edit/moderation/cross-post), WorkManager sync, push notifications (no Firebase) Aug 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant