refactor(chat): two-row ChatComposer + model/reasoning chips (#669)

* feat(chat): add reasoningLevel to ChatUiState + ViewModel methods

* feat(chat): add ComposerToolbar with model + reasoning chips

* refactor(chat): rewrite ChatInputBar to two-row layout

* feat(chat): wire ComposerToolbar into ChatScreen

* fix(chat): make model chip fixed 120dp with horizontal scroll for long names

* feat(chat): reasoning chip opens dropdown menu with all 9 levels instead of cycling

* fix(chat): remove Auto level from reasoning menu — backend only supports none..ultra, default is medium

* feat(chat): sync model + reasoning level from backend session.resume response

* fix(chat): handle session.info events for model/reasoning sync + fix null value 4002

* fix(chat): safety timeout for createNewSession + try-catch event loop

* fix(chat): address agy review findings

- Restore InsertDriveFile icon for non-image attachments
- Add widthIn(max=120.dp) constraint on attachment filename
- Restore stringResource reference for remove-attachment description
- Remove dead cycleReasoningLevel() method (dropdown supersedes)
- Fix createNewSession timeout race with generation counter

* fix(chat): update instrumented test for two-row layout

chatScreen_renders_and_acceptsInput had an assertion that the mic
button disappears when text is entered — this was the OLD single-row
layout behavior. The new two-row composer always shows the mic button
in the toolbar row, independent of input state.

---------

Co-authored-by: M57 <Hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-07-21 18:18:19 +03:00
1 parent c16f6e3e0b
commit bb4149eb0d
6 files changed
+430 -166

No files matched your search

@@ -68,9 +68,10 @@ class ChatScreenTest {
composeTestRule.onNodeWithTag("mic_button").assertIsDisplayed()
composeTestRule.onNodeWithTag("send_button").assertDoesNotExist()
// Verify entering text switches mic button to send button
// Verify entering text shows send button in input row
// Mic stays visible in toolbar row (new two-row layout)
composeTestRule.onNodeWithTag("chat_input").performTextInput("Hello Hermes")
composeTestRule.onNodeWithTag("send_button").assertIsDisplayed()
composeTestRule.onNodeWithTag("mic_button").assertDoesNotExist()
composeTestRule.onNodeWithTag("mic_button").assertIsDisplayed()
}
}