From 9e3d3f090281e54bfd944cf3bb98a88b329d75da Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 25 Jul 2026 05:26:38 +0000 Subject: [PATCH] fix: keep chat composer above nav bar, remove focus mode toggle - The bottom mode/auto-accept/context chips row had no navigation-bar inset handling, so it could render partially behind the system navigation bar. Add navigationBarsPadding() alongside the existing imePadding(). - Remove the focus-mode fullscreen toggle FAB: tapping it hid the chat title, drawer button, and new-chat button with no way back other than tapping the same spot again, which was confusing and unwanted. --- .../android/feature/chat/ChatHomeScreen.kt | 69 ++++++++----------- .../android/feature/chat/FocusModeOverlay.kt | 38 ---------- 2 files changed, 30 insertions(+), 77 deletions(-) delete mode 100644 app/src/main/java/com/opencode/android/feature/chat/FocusModeOverlay.kt diff --git a/app/src/main/java/com/opencode/android/feature/chat/ChatHomeScreen.kt b/app/src/main/java/com/opencode/android/feature/chat/ChatHomeScreen.kt index e374f16..be864cc 100644 --- a/app/src/main/java/com/opencode/android/feature/chat/ChatHomeScreen.kt +++ b/app/src/main/java/com/opencode/android/feature/chat/ChatHomeScreen.kt @@ -4,8 +4,6 @@ import android.graphics.Bitmap import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.BorderStroke @@ -25,6 +23,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -178,7 +177,6 @@ fun ChatHomeScreen( val clipboardManager = LocalClipboardManager.current val coroutineScope = rememberCoroutineScope() var showSlashCommands by remember { mutableStateOf(false) } - var focusMode by remember { mutableStateOf(false) } var showSidePanel by remember { mutableStateOf(false) } var dragOffset by remember { mutableFloatStateOf(0f) } val attachedImages = remember { mutableStateListOf() } @@ -265,40 +263,34 @@ fun ChatHomeScreen( .fillMaxSize() .background(MaterialTheme.colorScheme.background), ) { - AnimatedVisibility( - visible = !focusMode, - enter = fadeIn(), - exit = fadeOut(), - ) { - CenterAlignedTopAppBar( - title = { - Text( - text = state.sessionTitle.ifBlank { stringResource(R.string.chat_home_title) }, - style = MaterialTheme.typography.titleLarge, - fontWeight = FontWeight.SemiBold, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - }, - navigationIcon = { - IconButton(onClick = onOpenDrawer) { - Icon(Icons.Default.Menu, contentDescription = stringResource(R.string.menu_description)) - } - }, - actions = { - IconButton(onClick = onNewChat) { - Icon(Icons.Default.Add, contentDescription = stringResource(R.string.new_chat)) - } - }, - colors = - TopAppBarDefaults.centerAlignedTopAppBarColors( - containerColor = MaterialTheme.colorScheme.background, - titleContentColor = MaterialTheme.colorScheme.onBackground, - navigationIconContentColor = MaterialTheme.colorScheme.onBackground, - actionIconContentColor = MaterialTheme.colorScheme.onBackground, - ), - ) - } + CenterAlignedTopAppBar( + title = { + Text( + text = state.sessionTitle.ifBlank { stringResource(R.string.chat_home_title) }, + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + }, + navigationIcon = { + IconButton(onClick = onOpenDrawer) { + Icon(Icons.Default.Menu, contentDescription = stringResource(R.string.menu_description)) + } + }, + actions = { + IconButton(onClick = onNewChat) { + Icon(Icons.Default.Add, contentDescription = stringResource(R.string.new_chat)) + } + }, + colors = + TopAppBarDefaults.centerAlignedTopAppBarColors( + containerColor = MaterialTheme.colorScheme.background, + titleContentColor = MaterialTheme.colorScheme.onBackground, + navigationIconContentColor = MaterialTheme.colorScheme.onBackground, + actionIconContentColor = MaterialTheme.colorScheme.onBackground, + ), + ) Box(modifier = Modifier.weight(1f)) { when { @@ -448,8 +440,6 @@ fun ChatHomeScreen( } } - FocusModeOverlay(isActive = focusMode, onToggle = { focusMode = !focusMode }) - LiveTranscriptOverlay( isRecording = state.isListening, transcript = "", @@ -696,6 +686,7 @@ private fun ChatComposer( modifier = Modifier .fillMaxWidth() + .navigationBarsPadding() .imePadding() .padding(horizontal = 10.dp, vertical = 8.dp), ) { diff --git a/app/src/main/java/com/opencode/android/feature/chat/FocusModeOverlay.kt b/app/src/main/java/com/opencode/android/feature/chat/FocusModeOverlay.kt deleted file mode 100644 index c1ffdc3..0000000 --- a/app/src/main/java/com/opencode/android/feature/chat/FocusModeOverlay.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.opencode.android.feature.chat - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Fullscreen -import androidx.compose.material.icons.filled.FullscreenExit -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.SmallFloatingActionButton -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp - -@Composable -fun FocusModeOverlay( - isActive: Boolean, - onToggle: () -> Unit, - modifier: Modifier = Modifier, -) { - Box(modifier = modifier.fillMaxSize()) { - SmallFloatingActionButton( - onClick = onToggle, - modifier = - Modifier - .align(Alignment.TopEnd) - .padding(8.dp), - containerColor = MaterialTheme.colorScheme.surfaceVariant, - ) { - Icon( - imageVector = if (isActive) Icons.Default.FullscreenExit else Icons.Default.Fullscreen, - contentDescription = null, - ) - } - } -}