13 KiB
13 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 placeholderChatsscreen after successful auth. - Implemented automatic session restore on app start using stored tokens.
Step 4 - Unit tests
- Added
DataStoreTokenRepositoryTestfor token save/read and clear behavior. - Added
NetworkAuthRepositoryTestfor login success path and 401 ->InvalidCredentialserror mapping.
Step 5 - Chat Room models and persistence core
- Added domain chat model (
ChatItem) for chat list rendering concerns. - Added Room entities:
chats,users_shortwith sort-friendly indices. - Added
ChatDaowithobserveChats(),upsertChats(), and transactionalclearAndReplaceChats(). - Added
MessengerDatabaseand Hilt database wiring (DatabaseModule).
Step 6 - Chat API and repository sync
- Added chat REST API client for
/api/v1/chatsand/api/v1/chats/{chat_id}. - Added chat DTOs and remote/local mappers (
ChatReadDto -> ChatEntity/UserShortEntity -> ChatItem). - Implemented
NetworkChatRepositorywith 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 recentlyfallback). - 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
AuthApiServicewith a dedicated qualifier. - Added
CoroutineDispatcherDI 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
messagesandmessage_attachmentswith chat-history indexes. - Added
MessageDaowith observe/pagination/upsert/delete APIs. - Updated
MessengerDatabaseschema 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
MessageRepositorycontracts/use-cases for observe/sync/pagination/send/edit/delete. - Implemented
NetworkMessageRepositorywith 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_deletedintomessagesRoom 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
NetworkMessageRepositorysync/send flows. - Added DAO test for message scoped replace behavior in Room.
- Expanded realtime parser tests with rich
receive_messagemapping coverage. - Updated
docs/android-checklist.mdfor 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+UploadAndAttachMediaUseCaseand network implementation with presigned PUT upload. - Extended
MessageRepositorywith 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/ChatViewModelwith upload state handling.
Step 17 - Sprint B / media tests
- Added
NetworkMediaRepositoryTestfor 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
subclaim.
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_roleand addedobserveChatByIdstream in Room/repository. - Added
ObserveChatUseCaseto expose per-chat permission state to message screen. - Implemented channel send restrictions in
ChatViewModel: sending/attach disabled formemberrole inchannelchats. - 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-linkandPOST /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 (
pinginterval +pongtimeout detection) with forced reconnect on stale link. - Improved socket lifecycle hygiene by cancelling heartbeat on close/failure/disconnect paths.
- Added
connectevent mapping and centralized reconcile trigger in realtime handler. - On realtime reconnect, chat repository now refreshes
allandarchivedsnapshots 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/sessionsDELETE /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
connectevent 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
MainActivityviaenableEdgeToEdge(). - 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()andimePadding(). - 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
MessageRepositorywithforwardMessageBulk(...). - Implemented bulk-forward flow in
NetworkMessageRepositorywith Room/chat last-message updates. - Added
ForwardMessageBulkUseCasefor 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
MessageActionStatereducer with explicit selection modes (NONE,SINGLE,MULTI). - Added action-intent contract for message operations (reply/edit/forward/delete/reaction/clear).
- Integrated
ChatViewModelwith 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
forwardingMessageIdsset. - Extended
ChatViewModelforward flow: multi-select now forwards multiple source messages in one action. - Wired
ForwardMessageBulkUseCasefor 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:Deletenow applies to all selected messages, not only focused one. - Added explicit guard for
Delete for allin 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,replyPreviewSenderNameforwardedFromDisplayName- sender profile fields from API payload (
senderDisplayName,senderUsername,senderAvatarUrl)
- Added Room self-relation in
MessageLocalModelto 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.