From 5d97d5b1bb593338c1263a2cf40ce576eb10cd60 Mon Sep 17 00:00:00 2001 From: Thomas Ezan Date: Tue, 16 Dec 2025 14:55:25 -0800 Subject: [PATCH 1/3] Fix the expanded TextInput --- .../ai/samples/geminichatbot/GeminiChatbotScreen.kt | 3 ++- .../ai/samples/geminiimagechat/GeminiImageChatScreen.kt | 5 +++-- .../android/ai/samples/geminilivetodo/ui/TodoScreen.kt | 3 ++- .../geminimultimodal/ui/GeminiMultimodalScreen.kt | 3 +-- .../ai/samples/imagenediting/ui/ImagenEditingScreen.kt | 2 +- .../com/android/ai/samples/imagen/ui/ImagenScreen.kt | 2 +- .../ai/samples/magicselfie/ui/MagicSelfieScreen.kt | 7 +++++++ .../main/java/com/android/ai/uicomponent/TextInput.kt | 9 +++++++-- 8 files changed, 24 insertions(+), 10 deletions(-) diff --git a/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt b/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt index 9055f74a..a5f1e4a3 100644 --- a/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt +++ b/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt @@ -18,6 +18,7 @@ package com.android.ai.samples.geminichatbot import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -142,7 +143,7 @@ private fun GeminiChatbotScreen(uiState: GeminiChatbotUiState, onSendMessage: (S icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_ai_send), modifier = Modifier .width(72.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), enabled = uiState.geminiMessageState !is GeminiMessageState.Generating, onClick = { diff --git a/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt b/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt index 2df8f2c4..fa1a3ddc 100644 --- a/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt +++ b/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt @@ -22,6 +22,7 @@ import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -198,7 +199,7 @@ private fun GeminiImageChatScreen( icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_ai_send), modifier = Modifier .width(72.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), enabled = uiState.geminiMessageState !is GeminiMessageState.Generating, onClick = { @@ -225,7 +226,7 @@ private fun GeminiImageChatScreen( icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_ai_img), modifier = Modifier .width(48.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), onClick = onImagePickerClick, ) diff --git a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt index 17abc4c1..2cd9f4ec 100644 --- a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt +++ b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -180,7 +181,7 @@ fun TodoScreen(viewModel: TodoScreenViewModel = hiltViewModel()) { icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_ai_mic), modifier = Modifier .width(72.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), onClick = { viewModel.toggleLiveSession(activity) diff --git a/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt b/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt index af9e4139..02516608 100644 --- a/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt +++ b/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt @@ -251,13 +251,12 @@ private fun PromptInput( icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_ai_img), modifier = Modifier .width(72.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), enabled = uiState !is GeminiMultimodalUiState.Loading && imageUri != null, onClick = { if (imageUri != null) { val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, imageUri) -// val bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, imageUri)) onGenerateClick(bitmap, textFieldState.text.toString()) } keyboardController?.hide() diff --git a/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt b/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt index 9699e7aa..11861dee 100644 --- a/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt +++ b/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt @@ -271,7 +271,7 @@ private fun BoxScope.TextField( icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_ai_img), modifier = Modifier .width(72.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), enabled = !isGenerating, onClick = { diff --git a/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt b/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt index 10afed0e..0a9b5127 100644 --- a/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt +++ b/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt @@ -160,7 +160,7 @@ private fun ImagenScreen(uiState: ImagenUIState, onGenerateClick: (String) -> Un icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_ai_img), modifier = Modifier .width(72.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), enabled = !isGenerating, onClick = { diff --git a/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt b/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt index bd08381f..861dfd1e 100644 --- a/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt +++ b/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt @@ -29,6 +29,7 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding @@ -237,6 +238,9 @@ private fun MagicSelfieScreen( enabled = textFieldState.text.isNotEmpty() && (uiState !is MagicSelfieUiState.RemovingBackground) && (uiState !is MagicSelfieUiState.GeneratingBackground), + modifier = Modifier.fillMaxHeight() + .padding(4.dp) + .clip(RoundedCornerShape(2.dp)) ) { onGenerateClick(selfieBitmap, textFieldState.text.toString()) keyboardController?.hide() @@ -249,6 +253,9 @@ private fun MagicSelfieScreen( enabled = (uiState !is MagicSelfieUiState.RemovingBackground) && (uiState !is MagicSelfieUiState.GeneratingBackground), onClick = onTakePictureClick, + modifier = Modifier.fillMaxHeight() + .padding(4.dp) + .clip(RoundedCornerShape(2.dp)) ) }, ) diff --git a/ui-component/src/main/java/com/android/ai/uicomponent/TextInput.kt b/ui-component/src/main/java/com/android/ai/uicomponent/TextInput.kt index 32f29a9a..c3dfe4b2 100644 --- a/ui-component/src/main/java/com/android/ai/uicomponent/TextInput.kt +++ b/ui-component/src/main/java/com/android/ai/uicomponent/TextInput.kt @@ -17,7 +17,9 @@ package com.android.ai.uicomponent import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width @@ -55,6 +57,7 @@ fun TextInput( Row( verticalAlignment = Alignment.CenterVertically, modifier = modifier + .height(IntrinsicSize.Min) .border( 1.dp, MaterialTheme.colorScheme.outline, @@ -101,7 +104,7 @@ fun TextInput( fun TextInputPreview() { AISampleCatalogTheme { TextInput( - state = TextFieldState("Message hint"), + state = TextFieldState("A very long message that runs over several lines"), placeholder = "Placeholder", primaryButton = { GenerateButton( @@ -109,6 +112,7 @@ fun TextInputPreview() { icon = painterResource(id = R.drawable.ic_ai_send), modifier = Modifier .width(72.dp) + .fillMaxHeight() .padding(4.dp), onClick = {}, ) @@ -118,7 +122,8 @@ fun TextInputPreview() { icon = painterResource(id = R.drawable.ic_add), modifier = Modifier .width(45.dp) - .height(56.dp), + .fillMaxHeight() + .padding(4.dp), onClick = {}, ) }, From 887a0a04a23b4cddfba4f2c7cecbcc10a1453e27 Mon Sep 17 00:00:00 2001 From: Thomas Ezan Date: Tue, 16 Dec 2025 16:34:20 -0800 Subject: [PATCH 2/3] Address code assist feedback and fix Gemin Live todo --- .../com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt | 2 +- .../samples/geminivideosummary/ui/VideoSummarizationScreen.kt | 2 ++ .../src/main/java/com/android/ai/uicomponent/Buttons.kt | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt index 2cd9f4ec..3d7e11b6 100644 --- a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt +++ b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt @@ -194,7 +194,7 @@ fun TodoScreen(viewModel: TodoScreenViewModel = hiltViewModel()) { icon = painterResource(id = com.android.ai.uicomponent.R.drawable.ic_add), modifier = Modifier .width(48.dp) - .height(55.dp) + .fillMaxHeight() .padding(4.dp), ) { viewModel.addTodo(textFieldState.text.toString()) diff --git a/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt b/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt index ad2d53fb..fe50bf7d 100644 --- a/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt +++ b/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button @@ -270,6 +271,7 @@ private fun SummarizationSection( } GenerateButton( modifier = Modifier + .height(56.dp) .align(Alignment.BottomCenter) .fillMaxWidth() .padding(bottom = 12.dp), diff --git a/ui-component/src/main/java/com/android/ai/uicomponent/Buttons.kt b/ui-component/src/main/java/com/android/ai/uicomponent/Buttons.kt index 20e2e7cd..ba016139 100644 --- a/ui-component/src/main/java/com/android/ai/uicomponent/Buttons.kt +++ b/ui-component/src/main/java/com/android/ai/uicomponent/Buttons.kt @@ -155,7 +155,6 @@ fun GenerateButton( ) { Button( modifier = modifier - .height(56.dp) .border( if (enabled) { BorderStroke(0.dp, Color.Transparent) @@ -226,7 +225,7 @@ fun SecondaryButton( onClick: () -> Unit, ) { OutlinedButton( - modifier = modifier.height(48.dp), + modifier = modifier, colors = colors, enabled = enabled, border = BorderStroke(width = 1.dp, color = MaterialTheme.colorScheme.outline), From 7fb02efeee200a3a4af10cf1618cb57506beb081 Mon Sep 17 00:00:00 2001 From: Thomas Ezan Date: Wed, 17 Dec 2025 09:58:07 -0800 Subject: [PATCH 3/3] Increate video summarization button --- .../samples/geminivideosummary/ui/VideoSummarizationScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt b/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt index fe50bf7d..2c9ab7ee 100644 --- a/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt +++ b/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt @@ -271,7 +271,7 @@ private fun SummarizationSection( } GenerateButton( modifier = Modifier - .height(56.dp) + .height(96.dp) .align(Alignment.BottomCenter) .fillMaxWidth() .padding(bottom = 12.dp),