fix: prevent IME from hiding latest messages in chat

Changed chat layout from Box overlay to Column flow so imePadding()
applies to the whole container instead of just the input bar. Messages
area now shrinks with the keyboard, keeping latest messages visible.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 13:01:43 +08:00
parent 5dad0cd39b
commit 91231834dc
@@ -162,13 +162,13 @@ fun ChatScreen(
else -> CyreneStatus.OFFLINE else -> CyreneStatus.OFFLINE
} }
// Input area overlaid at bottom, with IME padding so only input moves up // Single column layout: everything flows together and IME shrinks the whole view
Box( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.statusBarsPadding(), .statusBarsPadding()
.imePadding(),
) { ) {
Column(modifier = Modifier.fillMaxSize()) {
// Top status bar // Top status bar
Row( Row(
modifier = Modifier modifier = Modifier
@@ -179,13 +179,11 @@ fun ChatScreen(
StatusIndicator(status = status) StatusIndicator(status = status)
} }
// Messages area (fills space above input area) // Messages area (fills remaining space, shrinks with IME)
PullToRefreshBox( PullToRefreshBox(
isRefreshing = isRefreshing, isRefreshing = isRefreshing,
onRefresh = { viewModel.refreshMessages() }, onRefresh = { viewModel.refreshMessages() },
modifier = Modifier modifier = Modifier.weight(1f),
.weight(1f)
.padding(bottom = 96.dp), // Reserve space for floating input bar
) { ) {
if (messages.isEmpty() && !isStreaming) { if (messages.isEmpty() && !isStreaming) {
Box( Box(
@@ -218,16 +216,13 @@ fun ChatScreen(
} }
} }
} }
}
// Input area at bottom, moved up by IME // Input area at bottom, in flow (not overlaid)
Column( Column(
modifier = Modifier modifier = Modifier
.align(Alignment.BottomCenter)
.fillMaxWidth() .fillMaxWidth()
.background(MaterialTheme.colorScheme.surface) .background(MaterialTheme.colorScheme.surface)
.navigationBarsPadding() .navigationBarsPadding(),
.imePadding(),
) { ) {
// "昔涟正在输入..." indicator // "昔涟正在输入..." indicator
if (isStreaming) { if (isStreaming) {