diff --git a/app/src/main/java/com/app/assistant/ui/screen/ChatLayout.kt b/app/src/main/java/com/app/assistant/ui/screen/ChatLayout.kt index f09f426..1cab516 100644 --- a/app/src/main/java/com/app/assistant/ui/screen/ChatLayout.kt +++ b/app/src/main/java/com/app/assistant/ui/screen/ChatLayout.kt @@ -242,6 +242,7 @@ fun ChatLayout( isDocumentSupported = isDocumentSupported, isHandsFree = isHandsFree, onToggleHandsFree = onToggleHandsFree, + hasMessages = chatList.isNotEmpty(), ) } } diff --git a/app/src/main/java/com/app/assistant/ui/screen/UserInputField.kt b/app/src/main/java/com/app/assistant/ui/screen/UserInputField.kt index 26b247b..80eb64e 100644 --- a/app/src/main/java/com/app/assistant/ui/screen/UserInputField.kt +++ b/app/src/main/java/com/app/assistant/ui/screen/UserInputField.kt @@ -3,6 +3,11 @@ package com.app.assistant.ui.screen import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.tween +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.expandHorizontally +import androidx.compose.animation.shrinkHorizontally import androidx.compose.foundation.Canvas import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -89,6 +94,7 @@ fun UserInputField( isDocumentSupported: Boolean = false, isHandsFree: Boolean = false, onToggleHandsFree: () -> Unit = {}, + hasMessages: Boolean = false, ) { val containerColor = TextFieldDefaults.colors().unfocusedContainerColor val rippleColor = adjustContrast(containerColor) @@ -232,17 +238,12 @@ fun UserInputField( } } else null, trailingIcon = { + val hasInput = question.isNotEmpty() || selectedAttachments.isNotEmpty() + val showSendButton = hasInput || isListening || hasMessages Row( horizontalArrangement = Arrangement.End, verticalAlignment = Alignment.CenterVertically ) { - IconButton(onClick = onToggleHandsFree) { - Icon( - painter = painterResource(id = R.drawable.ic_speaker), - contentDescription = "Toggle Hands-free Mode", - tint = if (isHandsFree) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant - ) - } if (isSpeaking) { IconButton(onClick = { if (isSpeaking) { @@ -264,15 +265,34 @@ fun UserInputField( ) } } - IconButton(onClick = { - if (question.isNotEmpty() || selectedAttachments.isNotEmpty()) { - onProcessQuestion(focusManager, keyboardController, false) + AnimatedVisibility( + visible = !showSendButton, + enter = fadeIn() + expandHorizontally(), + exit = fadeOut() + shrinkHorizontally() + ) { + IconButton(onClick = onToggleHandsFree) { + Icon( + painter = painterResource(id = R.drawable.ic_live_modes), + contentDescription = "Toggle Hands-free Mode", + tint = if (isHandsFree) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + AnimatedVisibility( + visible = showSendButton, + enter = fadeIn() + expandHorizontally(), + exit = fadeOut() + shrinkHorizontally() + ) { + IconButton(onClick = { + if (question.isNotEmpty() || selectedAttachments.isNotEmpty()) { + onProcessQuestion(focusManager, keyboardController, false) + } + }) { + Icon( + imageVector = Icons.AutoMirrored.Filled.Send, + contentDescription = stringResource(id = R.string.send_desc), + ) } - }) { - Icon( - imageVector = Icons.AutoMirrored.Filled.Send, - contentDescription = stringResource(id = R.string.send_desc), - ) } } }, @@ -435,7 +455,8 @@ fun UserInputFieldIdlePreview() { onStopSpeaking = {}, onStartListening = {}, onProcessQuestion = { _, _, _ -> }, - isImageSupported = true + isImageSupported = true, + hasMessages = true ) } } diff --git a/app/src/main/res/drawable/ic_live_modes.xml b/app/src/main/res/drawable/ic_live_modes.xml new file mode 100644 index 0000000..2111f0a --- /dev/null +++ b/app/src/main/res/drawable/ic_live_modes.xml @@ -0,0 +1,10 @@ + + +