139 lines
9.1 KiB
Markdown
139 lines
9.1 KiB
Markdown
# 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.
|