# 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.