feat: Android feature-parity — 11 milestones (DMs, auth, sharing, doc-collab, moderation, GitHub, +more) - #1
Merged
Merged
Conversation
Empty :feature:lists, :feature:messages, :feature:documents library modules registered in settings.gradle with the full compose/hilt/room/paging/coil dependency set, ready for per-domain build-out. Verified each configures and assembles empty. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Brings the three core-domain feature modules (:feature:lists, :feature:messages, :feature:documents) into the app and wires them into a post-login bottom-navigation shell (Lists / Messages / Documents / Account) with detail routes for list detail, message detail, and the document editor. Each module is a self-contained offline-first vertical slice (own Retrofit API off the shared authenticated client, own Room cache, repository, ViewModels, Compose UI, Hilt DI) built to the live OpenAPI contract, mirroring the :feature:auth pattern. - lists: index, create, schema-driven detail, row CRUD, delete, folders, search (32 unit tests) - messages: feed, compose, detail+replies, dig/undig, delete, search (36 unit tests) - documents: index, create, markdown editor+preview, delete, folders, templates, search (37 unit tests) Verified: :app:assembleDebug + full testDebugUnitTest green; installed on emulator and confirmed all three tabs render live against production (documents shows real data). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds the three core-domain feature modules (lists, messages, documents) as offline-first vertical slices, integrated into a post-login bottom-nav shell. 105 domain unit tests green; app builds; verified live on emulator.
Empty android-library module registered in settings, verified to assemble, so parallel worktree agents branch from a base that includes it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tures + Phase 2 profiles
Round 2 of the parallel build-out, integrated into the app:
- documents: redesigned into a Files-app style drill-down folder browser
(breadcrumb + push/back), with create/rename/delete folders, move documents,
in-browser search, and image upload; replaces the old flat index (55 tests)
- lists: schema editing, watchers, GitHub refresh, and connections (72 tests)
- messages: media attach/upload, scheduled messages, report, link previews (62 tests)
- profile (Phase 2, new :feature:profile): my-profile view/edit, avatar, other-user
profiles, and user search; becomes the Account tab (37 tests)
Navigation rewired: Documents tab -> folder browser with documents/folder/{folderId}
drill-down; lists/{listId}/schema + /watchers; messages/scheduled; Account tab -> new
ProfileRoute (sign-out reuses the auth-backed logout) + editProfile/userSearch/user/{username}.
Built by four parallel worktree agents (each resynced to origin/dev), then integrated.
:app:assembleDebug + full testDebugUnitTest green (234 unit tests).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reorders the bottom navigation and defaults the landing tab to Messages, mirroring how interlinedlist.com organizes the sections. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a Hub action to the Lists top bar that opens the connections screen (ConnectionsRoute was built and tested but previously unreachable). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Empty android-library modules for Phases 5/7/8, registered and verified to assemble, so parallel worktree agents branch from a base that includes them. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s 5/7/8) Integrates four modules and restructures the Account tab into a hub: - profile: Following — follow/unfollow, follower/following lists, follow requests; Account screen becomes a hub (Followers/Following/Requests/Notifications/ Organizations/Integrations/Edit/Search/Sign out) (77 tests) - notifications (new): polled notifications list, mark read / mark-all / dismiss (42 tests) - organizations (new, Phase 7): org list/create + detail + member management (37 tests) - integrations (new, Phase 8): CSV data exports via share sheet + read-only connected-accounts status; OAuth connect flows deferred (13 tests) Nav rewired: Account hub wires Notifications/Organizations/Integrations to the new modules; followers/following/user-profile drill-down; ProfileRoute's follower/following callbacks pass the current username. Feature UI uses MaterialTheme.colorScheme roles (no brand-color constants), so it is independent of the design-system palette. Built by four parallel worktree agents (resynced to origin/dev), then integrated. :app:assembleDebug + full testDebugUnitTest green (366 unit tests). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ProfileContent owned a verticalScroll while the Account hub also wrapped it in a scrolling Column, throwing IllegalStateException (infinite-height measure) at render. ProfileContent is now a plain content block; the hub scrolls header+menu together, and UserProfileScreen supplies its own scroll. Verified live on emulator. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lestone E) GET/PATCH /api/user/notification-preferences — per-event push/inApp/email toggles with optimistic update + rollback. Files integrated from the worktree build onto the real :feature:notifications module (its build.gradle, DI, and shared TestDoubles kept; only the new NotificationPreferences* files added). Nav wiring into the Account hub deferred. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Active Sessions (list + revoke device), Connected Accounts (view + unlink identity), Change email, and a type-to-confirm Delete Account flow (Play requires an in-app deletion path). Endpoints: /api/user/sessions (GET/DELETE), /api/user/identities (GET, DELETE by ?provider), /api/user/change-email/request, /api/user/delete. 107 unit tests green. Nav wiring deferred (snippet in report). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New self-contained :feature:directmessages — inbox (cursor paged), thread
with image attach + read receipts + lifecycle-scoped update polling, and a
recipient picker. Offline-first (own Room db interlinedlist-dm.db), owns its
DirectMessagesApi from the shared authed Retrofit. Endpoints: /api/dm (+ {id}
read/trash/restore), /api/dm/recipients, /api/dm/thread/{username}(+/updates),
/api/dm/unread-count, /api/dm/images/upload. 25 unit tests green. Nav wiring
deferred (snippet in report).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds Posts/Lists/Documents tabs to the other-user profile plus a mutual-
connections indicator, and read-only public list/document viewers. Endpoints:
/api/user/{username}/messages, /api/users/{username}/lists(+/{id}(+/data)),
/api/users/{username}/documents, /api/documents/{id}, /api/users/lookup,
/api/follow/{userId}/mutual (counts-only). 123 profile unit tests green.
Stacks on Milestone K. Nav wiring deferred.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Create/list/revoke tokenized share links (view/edit/admin) on lists and
documents; resolve + claim shared links; 'Shared with me' backed by
/api/lists/watching (with role). Endpoints: {lists,documents}/{id}/share-links
(+/{token} DELETE), {lists,documents}/shared/{token} (GET/POST), lists/watching,
lists/shared/{token}/data. lists 92 + documents 72 unit tests green. Deep-link
intent-filters + nav wiring deferred (snippets in report).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds Register, Forgot-password, Reset-password, and Email-verification flows to :feature:auth (was login-only), reusing login's sync-token/session path. New module-local AuthApi (POST /api/auth/register|forgot-password|reset-password| verify-email|send-verification-email) — no :core:network edits. Self-contained unauth nav sub-graph with reset/verify deep-link definitions. 29 unit tests green. App-level nav + manifest intent-filters deferred (snippets in report). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Edit list metadata (PUT /api/lists/{id}), folder rename/move/delete
(PUT/DELETE /api/folders/{id}), contributors (GET /api/lists/{id}/contributors,
shown in watchers), and single-row fetch (GET /api/lists/{id}/data/{rowId}).
111 lists unit tests green. Documents slice (create-in-folder, templates
seed-defaults) follows after Milestone G. Nav wiring deferred.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a 5th 'DMs' bottom-nav tab (directMessagesGraph); wires the auth
lifecycle nested graph (register/forgot/reset/verify); profile Account &
Security (sessions/connected-accounts/settings, aliasing the profile vs
integrations ConnectedAccountsRoute clash); public content (list/document);
notification preferences (gear in Notifications); and lists/documents share +
shared/{token} deep-link routes + folder browser. app/build.gradle.kts now
depends on :feature:directmessages. :app:assembleDebug BUILD SUCCESSFUL.
App-manifest deep-link intent-filters still deferred.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ge-access
Delta sync (GET/POST /api/documents/sync via WorkManager worker + cursor),
PATCH save with If-Match optimistic concurrency (409 -> Conflict state),
document /tree, collaborators CRUD (+user search) and lightweight presence
heartbeat. 99 documents unit tests green. Wires the Manage-access route
(documents/{id}/access -> DocumentCollaboratorsRoute) from the editor.
:app:assembleDebug SUCCESSFUL. NOTE: the @HiltWorker delta-sync worker still
needs the app-level HiltWorkerFactory bootstrap + a schedule call to run at
runtime (deferred to device verification).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Create-document-in-folder (POST /api/documents/folders/{id}/documents; browser
FAB auto-routes when inside a folder) and seed default templates (POST
/api/documents/templates/seed-defaults) with a Templates screen. Also fixes the
live getTemplates parse (templates arrive under the 'templates' key). 112
documents unit tests green; :app:assembleDebug SUCCESSFUL. Completes Milestone M.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e J) New thin :feature:billing module: UpsellScreen with Subscribe (POST /api/stripe/create-checkout-session) and Manage subscription (POST /api/stripe/create-portal-session), opening the returned Stripe URL via ACTION_VIEW (no new deps). 16 unit tests green. App-nav wiring (403-gate -> upsell + Account hub) deferred to the app-level pass. NOTE: shipping Stripe web checkout on Google Play needs a payments-policy decision (code works either way). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a GitHub section to :feature:integrations: list connected repos, browse a
repo's issues, create an issue (title/body + optional labels/assignees), and
comment on an issue; graceful 'GitHub not linked' state (live: 400
{error:'GitHub account not linked'}). Endpoints: /api/github/repos, /issues
(GET/POST), issue comments, repo assignees/labels. 33 integrations unit tests
green (20 new). Hub GitHub entry gated behind a defaulted onOpenGitHub; app-nav
wiring deferred to the app-level pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ile-side)
Overflow menu on the other-user profile (Block/Mute/Report with confirm +
reason) and a 'Blocked & muted' management screen in the Account hub. Endpoints:
/api/users/{username}/block|mute|report (+ status GETs), /api/user/blocks|mutes.
Report body confirmed {reason, detail?}. 150 profile unit tests green (27 new).
The message-feed moderation menu stays deferred (touches :feature:messages).
Nav wiring deferred to the app-level pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds account/blocked-muted (BlockedMutedRoute), integrations/github (GitHubRoute),
billingGraph + a 'Subscription' Account-hub row (onOpenUpgrade -> upsell), and
app-manifest deep-link intent-filters for lists/documents shared/{token} +
reset-password/verify-email (https autoVerify + interlinedlist:// scheme).
:app:assembleDebug SUCCESSFUL. (Folder-browser/templates routes remain
registered-but-unreached; WorkManager bootstrap still deferred to #17.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ssions
Per product decision, subscription billing stays on the web app: removes the
:feature:billing module, its nav graph, the Account-hub 'Subscription' row, and
the app dependency + settings include. Reverses Milestone J on Android.
UX fix: the sync-token request now sends a deviceLabel ('InterlinedList Android
· <model>') so the app's session is identifiable in Active Sessions instead of
appearing as a generic 'CLI' entry. :app:assembleDebug green; profile 150 +
auth 29 tests green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…hable Adds a Folders top-bar action on the Lists screen -> FolderBrowserRoute (lists/folders), and a Templates action on the Documents browser -> new documents/templates route (DocumentTemplatesRoute). Completes the deferred folder/templates reachability (UX polish). :app:assembleDebug green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Brings the Android client to near-complete feature parity with interlinedlist.com. 13 of 14 milestones delivered, unit-tested per module, wired into the app, and verified running on an emulator (live login, all major surfaces, and the delta-sync worker executing to SUCCESS).
:app:assembleDebugis green.Milestones delivered
:feature:directmessages, 5th "DMs" tabmastodonProviderIds[],crossPostTo{Bluesky,LinkedIn,Twitter})PATCH /api/messages/{id}+ "edited" markerAlso merges the branding + dark-mode + message-fix work and the cross-platform brand-kit.
Verified on-device (emulator, live account)
5-tab nav · DMs · Account hub · Active Sessions ("This device" labeled) · Blocked & muted · GitHub connect state · folder browser · templates · full sign-out → login · and the documents delta-sync worker running to SUCCESS against the live API.
Product decisions
deviceLabelso the app's session is identifiable (not a generic "CLI").Not included — externally gated only
google-services.json.Testing
~700+ unit tests across the touched modules are green;
:app:assembleDebugsucceeds; on-device smoke test + delta-sync execution verified.🤖 Generated with Claude Code