Files
Messenger/android/CHANGELOG.md
Codex dfd4a00490
Some checks are pending
CI / test (push) Has started running
android: add chat list chips and archive top-row state
2026-03-09 14:10:14 +03:00

15 KiB

Android Changelog

2026-03-08

Step 1 - Build and app wiring

  • Added Android project plugin configuration for Hilt and Kotlin serialization.
  • Added dependency repositories and explicit app module include in settings.
  • Added app dependencies for Retrofit/OkHttp, DataStore, coroutines, Hilt, and unit testing.
  • Enabled INTERNET permission and registered MessengerApplication in manifest.
  • Added MessengerApplication with HiltAndroidApp.

Step 2 - Network/data core + DI

  • Fixed DTO/Auth API serialization annotations and endpoint declarations for /api/v1/auth/login, /api/v1/auth/refresh, /api/v1/auth/me.
  • Implemented DataStore-based token persistence with a corrected getTokens() read path.
  • Added auth network stack: bearer interceptor, 401 authenticator with refresh flow and retry guard.
  • Added clean-layer contracts and implementations: domain/common, domain/auth, data/auth/repository.
  • Wired dependencies with Hilt modules for DataStore, OkHttp/Retrofit, and repository bindings.

Step 3 - Minimal auth UI and navigation

  • Replaced Phase 0 placeholder UI with Compose auth flow (AuthViewModel + login screen).
  • Added loading/error states for login and startup session restore.
  • Added navigation graph: AuthGraph (login) to placeholder Chats screen after successful auth.
  • Implemented automatic session restore on app start using stored tokens.

Step 4 - Unit tests

  • Added DataStoreTokenRepositoryTest for token save/read and clear behavior.
  • Added NetworkAuthRepositoryTest for login success path and 401 -> InvalidCredentials error mapping.

Step 5 - Chat Room models and persistence core

  • Added domain chat model (ChatItem) for chat list rendering concerns.
  • Added Room entities: chats, users_short with sort-friendly indices.
  • Added ChatDao with observeChats(), upsertChats(), and transactional clearAndReplaceChats().
  • Added MessengerDatabase and Hilt database wiring (DatabaseModule).

Step 6 - Chat API and repository sync

  • Added chat REST API client for /api/v1/chats and /api/v1/chats/{chat_id}.
  • Added chat DTOs and remote/local mappers (ChatReadDto -> ChatEntity/UserShortEntity -> ChatItem).
  • Implemented NetworkChatRepository with cache-first flow strategy (Room first, then server sync).
  • Added chat domain contracts/use-cases (ChatRepository, observe/refresh use-cases).
  • Wired chat API/repository via Hilt modules.

Step 7 - Realtime manager and chat list updates

  • Added a unified realtime manager abstraction and WebSocket implementation for /api/v1/realtime/ws?token=....
  • Implemented auto-reconnect with exponential backoff and max cap.
  • Added realtime event parser for receive_message, message_updated, message_deleted, chat_updated, chat_deleted, user_online, user_offline.
  • Added use-case level realtime event handling that updates Room and triggers repository refreshes when needed.
  • Wired realtime manager into DI.

Step 8 - Chat list UI and navigation

  • Added Chat List screen with tabs (All / Archived), local search filter, pull-to-refresh, and state handling (loading/empty/error).
  • Added chat row rendering for unread badge, mention badge (@), pinned/muted marks, and message preview by media type.
  • Added private chat presence display (online / last seen recently fallback).
  • Connected Chat List to ViewModel/use-cases with no business logic inside composables.
  • Added chat click navigation to placeholder ChatScreen(chatId).

Step 9 - Tests and checklist updates

  • Added unit test for chat cache-first sync strategy (NetworkChatRepositoryTest).
  • Added unit test for realtime event parsing (RealtimeEventParserTest).
  • Added DAO test (ChatDaoTest) using in-memory Room + Robolectric.
  • Updated Android checklist status in docs/android-checklist.md.

Step 10 - Build stabilization fixes

  • Switched Android API base URL to https://chat.daemonlord.ru/.
  • Added cleartext traffic flag in manifest for local/dev compatibility.
  • Fixed Hilt dependency cycle by separating refresh AuthApiService with a dedicated qualifier.
  • Added CoroutineDispatcher DI provider and qualifier for repositories.
  • Fixed Material3 experimental API opt-in and removed deprecated StateFlow.distinctUntilChanged() usage.

Step 11 - Sprint A / 1) Message Room + models

  • Added message domain model (MessageItem) for chat screen rendering.
  • Added Room entities messages and message_attachments with chat-history indexes.
  • Added MessageDao with observe/pagination/upsert/delete APIs.
  • Updated MessengerDatabase schema to include message tables and DAO.
  • Added Hilt DI provider for MessageDao.

Step 12 - Sprint A / 2) Message API + repository

  • Added message REST API client for history/send/edit/delete endpoints.
  • Added message DTOs and mappers (MessageReadDto -> MessageEntity -> MessageItem).
  • Added MessageRepository contracts/use-cases for observe/sync/pagination/send/edit/delete.
  • Implemented NetworkMessageRepository with cache-first observation and optimistic text send.
  • Wired message API and repository into Hilt modules.

Step 13 - Sprint A / 3) Message realtime integration

  • Extended realtime event model/parser with message-focused events (message_delivered, message_read, typing_start, typing_stop) and richer message payload mapping.
  • Updated unified realtime handler to write receive_message, message_updated, message_deleted into messages Room state.
  • Added delivery/read status updates in Room for message status events.
  • Kept chat list sync updates in the same manager/use-case pipeline for consistency.

Step 14 - Sprint A / 4) Message UI core

  • Replaced chat placeholder with a real message screen route + ViewModel.
  • Added message list rendering with Telegram-like bubble alignment and status hints.
  • Added input composer with send flow, reply/edit modes, and inline action cancellation.
  • Added long-press actions (reply, edit, delete) for baseline message operations.
  • Added manual "load older" pagination trigger and chat back navigation integration.

Step 15 - Sprint A / 5) Message tests and docs

  • Added unit tests for NetworkMessageRepository sync/send flows.
  • Added DAO test for message scoped replace behavior in Room.
  • Expanded realtime parser tests with rich receive_message mapping coverage.
  • Updated docs/android-checklist.md for completed message-core items.

Step 16 - Sprint B / 1-2) Media data layer + chat integration

  • Added media API/DTO layer for upload URL and attachment creation.
  • Added MediaRepository + UploadAndAttachMediaUseCase and network implementation with presigned PUT upload.
  • Extended MessageRepository with media send flow (sendMediaMessage) and optimistic local update behavior.
  • Wired media API/repository through Hilt modules.
  • Integrated file picking and media sending into Android ChatScreen/ChatViewModel with upload state handling.

Step 17 - Sprint B / media tests

  • Added NetworkMediaRepositoryTest for successful upload+attach flow.
  • Added error-path coverage for failed presigned upload handling.

2026-03-09

Step 18 - Sprint P0 / 1) Message core completion

  • Extended message API/data contracts with messages/status, forward, and reaction endpoints.
  • Added message domain support for forwarded message metadata and attachment waveform payload.
  • Implemented repository operations for delivery/read acknowledgements, forward, and reactions.
  • Updated Chat ViewModel/UI with forward flow, reaction toggle, and edit/delete-for-all edge-case guards.
  • Added automatic delivered/read acknowledgement for latest incoming message in active chat.
  • Fixed outgoing message detection by resolving current user id from JWT sub claim.

Step 19 - Sprint P0 / 2) Media UX after send

  • Added media endpoint mapping for chat attachments (GET /api/v1/media/chats/{chat_id}/attachments).
  • Extended Room message observation to include attachment relations via MessageLocalModel.
  • Synced and persisted message attachments during message refresh/pagination and after media send.
  • Extended message domain model with attachment list payload.
  • Added message attachment rendering in Chat UI: inline image preview, minimal image viewer overlay, and basic audio play/pause control.

Step 20 - Sprint P0 / 3) Roles/permissions baseline

  • Extended chat data/domain models with my_role and added observeChatById stream in Room/repository.
  • Added ObserveChatUseCase to expose per-chat permission state to message screen.
  • Implemented channel send restrictions in ChatViewModel: sending/attach disabled for member role in channel chats.
  • Added composer-level restriction hint in Chat UI to explain blocked actions.

Step 21 - Sprint P0 / 4) Invite join flow (minimum)

  • Added chat API contracts for invite actions: POST /api/v1/chats/{chat_id}/invite-link and POST /api/v1/chats/join-by-invite.
  • Added domain model/use-cases for invite-link creation and join-by-invite.
  • Extended chat repository with invite operations and local chat upsert on successful join.
  • Added minimal Chat List UI flow for join-by-invite token input with loading/error handling and auto-open of joined chat.

Step 22 - Sprint P0 / 5) Realtime stability and reconcile

  • Added heartbeat in WebSocket manager (ping interval + pong timeout detection) with forced reconnect on stale link.
  • Improved socket lifecycle hygiene by cancelling heartbeat on close/failure/disconnect paths.
  • Added connect event mapping and centralized reconcile trigger in realtime handler.
  • On realtime reconnect, chat repository now refreshes all and archived snapshots to reduce stale state after transient disconnects.

Step 23 - Sprint P0 / 6) Auth hardening foundation

  • Extended auth API/repository contracts with sessions management endpoints:
    • GET /api/v1/auth/sessions
    • DELETE /api/v1/auth/sessions/{jti}
    • DELETE /api/v1/auth/sessions
  • Added domain model and use-cases for listing/revoking sessions.
  • Added unit coverage for session DTO -> domain mapping in NetworkAuthRepositoryTest.

Step 24 - Sprint P0 / 7) Quality pass

  • Added realtime parser unit coverage for connect event mapping.
  • Extended message DAO tests with attachment relation verification.
  • Added Android smoke and baseline document (docs/android-smoke.md) with test matrix and performance targets.
  • Updated Android checklist quality section with initial performance baseline completion.

Step 25 - UI safe insets fix

  • Enabled edge-to-edge mode in MainActivity via enableEdgeToEdge().
  • Added safe area insets handling (WindowInsets.safeDrawing) for login, chat list, session-check and chat screens.
  • Added bottom composer protection in chat screen with navigationBarsPadding() and imePadding().
  • Fixed UI overlap with status bar and navigation bar on modern Android devices.

Step 26 - Core base / bulk forward foundation

  • Added message API/data contracts for bulk forward (POST /api/v1/messages/{message_id}/forward-bulk).
  • Extended MessageRepository with forwardMessageBulk(...).
  • Implemented bulk-forward flow in NetworkMessageRepository with Room/chat last-message updates.
  • Added ForwardMessageBulkUseCase for future multi-select message actions.
  • Updated message repository unit test fakes to cover new API surface.

Step 27 - Core base / message action state machine

  • Added reusable MessageActionState reducer with explicit selection modes (NONE, SINGLE, MULTI).
  • Added action-intent contract for message operations (reply/edit/forward/delete/reaction/clear).
  • Integrated ChatViewModel with reducer-backed selection logic while preserving current UI behavior.
  • Added base ViewModel handlers for entering/toggling multi-select mode (onEnterMultiSelect, onToggleMessageMultiSelection, onClearSelection).
  • Added unit tests for reducer transitions and available intents (MessageActionStateTest).

Step 28 - Core base / Android multi-forward execution

  • Switched chat forward state from single-message payload to forwardingMessageIds set.
  • Extended ChatViewModel forward flow: multi-select now forwards multiple source messages in one action.
  • Wired ForwardMessageBulkUseCase for multi-message forwarding (sequential safe execution with error short-circuit).
  • Updated chat action bar and forward sheet labels for multi-selection count.

Step 29 - Core base / multi-select delete execution

  • Fixed multi-select delete behavior in ChatViewModel: Delete now applies to all selected messages, not only focused one.
  • Added explicit guard for Delete for all in multi-select mode (single-message only).

Step 30 - Core base / reply-forward preview data foundation

  • Extended message DTO/Room/domain models with optional preview metadata:
    • replyPreviewText, replyPreviewSenderName
    • forwardedFromDisplayName
    • sender profile fields from API payload (senderDisplayName, senderUsername, senderAvatarUrl)
  • Added Room self-relation in MessageLocalModel to resolve reply preview fallback from referenced message.
  • Updated message mappers and repository/realtime temporary entity creation for new model fields.
  • Bumped Room schema version to 7.

Step 31 - Chat UI / reply-forward bubble blocks

  • Added inline forwarded header rendering in message bubbles with display-name fallback.
  • Added inline reply preview block in message bubbles (author + snippet) based on new preview fields/fallbacks.
  • Updated Telegram UI batch-2 checklist items for reply-preview and forwarded header.

Step 32 - Chat UI / pinned message bar

  • Added pinned_message_id support in chat DTO/local/domain models and DAO selects.
  • Extended ChatViewModel state with pinned message id + resolved pinned message object.
  • Rendered pinned message bar under chat app bar with hide action.
  • Updated Telegram UI batch-2 checklist item for pinned message block.

Step 33 - Chat UI / top app bar restructuring

  • Extended chat UI state with resolved chat header fields (chatTitle, chatSubtitle, chatAvatarUrl).
  • Updated chat top app bar layout to Telegram-like structure: back, avatar, title, status, call action, menu action.
  • Kept load-more behavior accessible via menu placeholder action button.
  • Updated Telegram UI batch-2 checklist item for chat top app bar.

Step 34 - Chat UI / composer restyling

  • Reworked chat composer into rounded Telegram-like container with emoji slot, text input, attach button, and send/voice state button.
  • Preserved send/upload state guards and existing insets handling (navigationBarsPadding + imePadding).
  • Updated Telegram UI batch-2 checklist composer-related items.

Step 35 - Chat UI / multi-select bars and overlays

  • Split message selection UX into dedicated top selection bar (count/close/delete/edit/reactions) and bottom action bar (reply/forward).
  • Enhanced selected bubble visual state with explicit selected marker text.
  • Updated Telegram UI batch-2 checklist items for multi-select mode.

Step 36 - Chat list / advanced states baseline

  • Added chat-list local type filters (All, People, Groups, Channels) with new ChatListFilter UI state.
  • Added archive statistics stream in ChatListViewModel and special archive top-row entry in All tab.
  • Extended list preview formatting with media-type markers and retained unread/mention/pinned indicators.
  • Updated Telegram UI checklists for chat-list advanced states (batch 2 and batch 3).