From bc4bcc65d1d78a1327b2413e89fbee3549ac76c3 Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Mon, 10 Nov 2025 20:59:59 -0700 Subject: [PATCH 01/16] Server Prompt Templates --- .../quickstart/ai/FirebaseAISamples.kt | 27 +++ .../firebase/quickstart/ai/MainActivity.kt | 8 + .../ai/feature/media/imagen/EditingMode.kt | 1 + .../feature/media/imagen/ImagenViewModel.kt | 22 +- .../ai/feature/text/TextGenScreen.kt | 197 ++++++++++++++++++ .../ai/feature/text/TextGenViewModel.kt | 81 +++++++ .../quickstart/ai/ui/navigation/Sample.kt | 2 + 7 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt create mode 100644 firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index ad3a5cd43..65d30d802 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -339,4 +339,31 @@ val FIREBASE_AI_SAMPLES = listOf( ) }, ), + Sample( + title = "Imagen 3 - Server Template Generation", + description = "Generate an image using a server prompt template.", + backend = GenerativeBackend.vertexAI(), + navRoute = "imagen", + categories = listOf(Category.IMAGE), + initialPrompt = content { text("List of things that should be in the image") }, + allowEmptyPrompt = false, + editingMode = EditingMode.TEMPLATE, + // To make this work on your project, create an `Imagen (Basic)` template in your project with this name + templateId = "imagen-test-template", + templateKey = "prompt" + ), + Sample( + title = "Server Prompt Templates", + description = "Generate an invoice using server prompt templates", + backend = GenerativeBackend.vertexAI(), + navRoute = "text", + categories = listOf(Category.TEXT), + initialPrompt = content { text("Customer Name") }, + allowEmptyPrompt = false, + editingMode = EditingMode.TEMPLATE, + // To make this work on your project, create an `Input + System Instructions` template in your project with this name + templateId = "textgen-test-template", + templateKey = "customerName" + ), + ) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/MainActivity.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/MainActivity.kt index 54eaff654..8c9a5188c 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/MainActivity.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/MainActivity.kt @@ -35,6 +35,8 @@ import com.google.firebase.quickstart.ai.feature.media.imagen.ImagenRoute import com.google.firebase.quickstart.ai.feature.media.imagen.ImagenScreen import com.google.firebase.quickstart.ai.feature.text.ChatRoute import com.google.firebase.quickstart.ai.feature.text.ChatScreen +import com.google.firebase.quickstart.ai.feature.text.TextGenRoute +import com.google.firebase.quickstart.ai.feature.text.TextGenScreen import com.google.firebase.quickstart.ai.ui.navigation.MainMenuScreen import com.google.firebase.quickstart.ai.ui.theme.FirebaseAILogicTheme @@ -90,6 +92,9 @@ class MainActivity : ComponentActivity() { "stream" -> { navController.navigate(StreamRealtimeRoute(it.id)) } + "text" -> { + navController.navigate(TextGenRoute(it.id)) + } } } ) @@ -106,6 +111,9 @@ class MainActivity : ComponentActivity() { composable { StreamRealtimeScreen() } + composable { + TextGenScreen() + } } } } diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/EditingMode.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/EditingMode.kt index 6e997092d..10093e735 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/EditingMode.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/EditingMode.kt @@ -6,4 +6,5 @@ enum class EditingMode { OUTPAINTING, SUBJECT_REFERENCE, STYLE_TRANSFER, + TEMPLATE, } \ No newline at end of file diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt index 8b6f223a6..6a885ae98 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import androidx.core.graphics.scale +import com.google.firebase.ai.TemplateImagenModel import com.google.firebase.ai.type.Dimensions import com.google.firebase.ai.type.ImagenBackgroundMask import com.google.firebase.ai.type.ImagenEditMode @@ -67,6 +68,10 @@ class ImagenViewModel( val additionalImage = sample.additionalImage + val templateId = sample.templateId + + val templateKey = sample.templateKey + private val _attachedImage = MutableStateFlow(null) val attachedImage: StateFlow = _attachedImage @@ -103,12 +108,18 @@ class ImagenViewModel( EditingMode.OUTPAINTING -> outpaint(imagenModel, inputText) EditingMode.SUBJECT_REFERENCE -> drawReferenceSubject(imagenModel, inputText) EditingMode.STYLE_TRANSFER -> transferStyle(imagenModel, inputText) + EditingMode.TEMPLATE -> generateWithTemplate(Firebase.ai.templateImagenModel(), templateId!!, templateKey!!, inputText) else -> generate(imagenModel, inputText) } _generatedBitmaps.value = imageResponse.images.map { it.asBitmap() } _errorMessage.value = null // clear error message } catch (e: Exception) { - _errorMessage.value = e.localizedMessage + val errorMessage = if ((e.localizedMessage?.contains("not found") == true) && (templateId != null)) { + "Template was not found, please add a template named $templateId to your project." + } else { + e.localizedMessage + } + _errorMessage.value = errorMessage } finally { _isLoading.value = false } @@ -212,4 +223,13 @@ class ImagenViewModel( inputText ) } + + suspend fun generateWithTemplate( + model: TemplateImagenModel, + templateId: String, + templateKey: String, + inputText: String, + ): ImagenGenerationResponse { + return model.generateImages(templateId, mapOf(templateKey to inputText)) + } } diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt new file mode 100644 index 000000000..5c4619f89 --- /dev/null +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt @@ -0,0 +1,197 @@ +package com.google.firebase.quickstart.ai.feature.text + +import android.net.Uri +import android.provider.OpenableColumns +import android.text.format.Formatter +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyHorizontalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.viewmodel.compose.viewModel +import com.google.firebase.quickstart.ai.R +import kotlinx.coroutines.launch +import kotlinx.serialization.Serializable + +@Serializable +class TextGenRoute(val sampleId: String) + +@Composable +fun TextGenScreen( + textGenViewModel: TextGenViewModel = viewModel() +) { + var textPrompt by rememberSaveable { mutableStateOf(textGenViewModel.initialPrompt) } + val errorMessage by textGenViewModel.errorMessage.collectAsStateWithLifecycle() + val isLoading by textGenViewModel.isLoading.collectAsStateWithLifecycle() + val generatedText by textGenViewModel.generatedText.collectAsStateWithLifecycle() + + Column( + modifier = Modifier.verticalScroll(rememberScrollState()) + ) { + ElevatedCard( + modifier = Modifier + .padding(all = 16.dp) + .fillMaxWidth(), + shape = MaterialTheme.shapes.large + ) { + OutlinedTextField( + value = textPrompt, + label = { Text("Prompt") }, + placeholder = { Text("Enter text to generate") }, + onValueChange = { textPrompt = it }, + modifier = Modifier + .padding(16.dp) + .fillMaxWidth() + ) + Row() { + TextButton( + onClick = { + if (textGenViewModel.allowEmptyPrompt || textPrompt.isNotBlank()) { + textGenViewModel.generate(textPrompt) + } + }, + modifier = Modifier + .padding(end = 16.dp, bottom = 16.dp) + ) { + Text("Generate") + } + } + + } + + if (isLoading) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .padding(all = 8.dp) + .align(Alignment.CenterHorizontally) + ) { + CircularProgressIndicator() + } + } + errorMessage?.let { + Card( + modifier = Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), + shape = MaterialTheme.shapes.large, + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.errorContainer + ) + ) { + Text( + text = it, + color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(all = 16.dp) + ) + } + } + generatedText?.let { + Card( + modifier = Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), + shape = MaterialTheme.shapes.large, + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.primaryContainer + ) + ) { + Text( + text = it, + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.padding(all = 16.dp) + ) + } + } + } +} + +@Composable +fun DropDownMenu(items: List, onClick: (String) -> Unit) { + + val isDropDownExpanded = remember { + mutableStateOf(false) + } + + val itemPosition = remember { + mutableIntStateOf(0) + } + + + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier.padding(horizontal = 10.dp) + ) { + + Box { + Row( + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.Top, + modifier = Modifier.clickable { + isDropDownExpanded.value = true + } + ) { + Text(text = items[itemPosition.intValue]) + Image( + painter = painterResource(id = R.drawable.round_arrow_drop_down_24), + contentDescription = "Dropdown Icon" + ) + } + DropdownMenu( + expanded = isDropDownExpanded.value, + onDismissRequest = { + isDropDownExpanded.value = false + }) { + items.forEachIndexed { index, item -> + DropdownMenuItem( + text = { + Text(text = item) + }, + onClick = { + isDropDownExpanded.value = false + itemPosition.intValue = index + onClick(item) + }) + } + } + } + + } +} \ No newline at end of file diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt new file mode 100644 index 000000000..3b8bd7c76 --- /dev/null +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt @@ -0,0 +1,81 @@ +package com.google.firebase.quickstart.ai.feature.text + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.navigation.toRoute +import com.google.firebase.Firebase +import com.google.firebase.ai.ai +import com.google.firebase.ai.type.PublicPreviewAPI +import com.google.firebase.ai.type.asTextOrNull +import com.google.firebase.quickstart.ai.FIREBASE_AI_SAMPLES +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import com.google.firebase.ai.GenerativeModel + +@OptIn(PublicPreviewAPI::class) +class TextGenViewModel( + savedStateHandle: SavedStateHandle +) : ViewModel() { + private val sampleId = savedStateHandle.toRoute().sampleId + private val sample = FIREBASE_AI_SAMPLES.first { it.id == sampleId } + val initialPrompt = sample.initialPrompt?.parts?.first()?.asTextOrNull().orEmpty() + + private val _errorMessage: MutableStateFlow = MutableStateFlow(null) + val errorMessage: StateFlow = _errorMessage + + private val _isLoading = MutableStateFlow(false) + val isLoading: StateFlow = _isLoading + + + val allowEmptyPrompt = sample.allowEmptyPrompt + + val templateId = sample.templateId + + val templateKey = sample.templateKey + + + private val _generatedText = MutableStateFlow(null) + val generatedText: StateFlow = _generatedText + + // Firebase AI Logic + private val generativeModel: GenerativeModel + + init { + generativeModel = Firebase.ai( + backend = sample.backend // GenerativeBackend.googleAI() by default + ).generativeModel( + modelName = sample.modelName ?: "gemini-2.5-flash", + systemInstruction = sample.systemInstructions, + generationConfig = sample.generationConfig, + tools = sample.tools + ) + } + + fun generate(inputText: String) { + viewModelScope.launch { + _isLoading.value = true + try { + val generativeResponse = if (templateId != null) { + Firebase.ai.templateGenerativeModel() + .generateContent(templateId, mapOf(templateKey!! to inputText)) + } else { + generativeModel.generateContent(inputText) + } + _generatedText.value = generativeResponse.text + _errorMessage.value = null // clear error message + } catch (e: Exception) { + val errorMessage = + if ((e.localizedMessage?.contains("not found") == true) && (templateId != null)) { + "Template was not found, please add a template named $templateId to your project." + } else { + e.localizedMessage + } + _errorMessage.value = errorMessage + } finally { + _isLoading.value = false + } + } + } +} diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/Sample.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/Sample.kt index ad0cccbec..3704b2b44 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/Sample.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/Sample.kt @@ -45,4 +45,6 @@ data class Sample( val imageLabels: List = emptyList(), val selectionOptions: List = emptyList(), val editingMode: EditingMode? = null, + val templateId: String? = null, + val templateKey: String? = null, ) From af7b3c8a33db456c8fc7949b36908ec6fb58d77d Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Tue, 11 Nov 2025 10:09:15 -0800 Subject: [PATCH 02/16] fixes for comments --- .../quickstart/ai/FirebaseAISamples.kt | 2 +- .../feature/media/imagen/ImagenViewModel.kt | 22 +++---- .../ai/feature/text/TextGenScreen.kt | 57 +------------------ .../ai/feature/text/TextGenViewModel.kt | 11 ++-- 4 files changed, 20 insertions(+), 72 deletions(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index 65d30d802..58f23601b 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -362,7 +362,7 @@ val FIREBASE_AI_SAMPLES = listOf( allowEmptyPrompt = false, editingMode = EditingMode.TEMPLATE, // To make this work on your project, create an `Input + System Instructions` template in your project with this name - templateId = "textgen-test-template", + templateId = "input-system-instructions", templateKey = "customerName" ), diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt index 6a885ae98..86e9f6e3a 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt @@ -80,6 +80,7 @@ class ImagenViewModel( // Firebase AI Logic private val imagenModel: ImagenModel + private val templateImagenModel: TemplateImagenModel init { val config = imagenGenerationConfig { @@ -97,28 +98,30 @@ class ImagenViewModel( generationConfig = config, safetySettings = settings ) + templateImagenModel = Firebase.ai.templateImagenModel() } fun generateImages(inputText: String) { viewModelScope.launch { _isLoading.value = true + _errorMessage.value = null // clear error message try { val imageResponse = when(sample.editingMode) { EditingMode.INPAINTING -> inpaint(imagenModel, inputText) EditingMode.OUTPAINTING -> outpaint(imagenModel, inputText) EditingMode.SUBJECT_REFERENCE -> drawReferenceSubject(imagenModel, inputText) EditingMode.STYLE_TRANSFER -> transferStyle(imagenModel, inputText) - EditingMode.TEMPLATE -> generateWithTemplate(Firebase.ai.templateImagenModel(), templateId!!, templateKey!!, inputText) + EditingMode.TEMPLATE -> generateWithTemplate(templateImagenModel, templateId!!, mapOf(templateKey!! to inputText)) else -> generate(imagenModel, inputText) } _generatedBitmaps.value = imageResponse.images.map { it.asBitmap() } - _errorMessage.value = null // clear error message } catch (e: Exception) { - val errorMessage = if ((e.localizedMessage?.contains("not found") == true) && (templateId != null)) { - "Template was not found, please add a template named $templateId to your project." - } else { - e.localizedMessage - } + val errorMessage = + if ((e.localizedMessage?.contains("not found") == true) && sample.editingMode == EditingMode.TEMPLATE) { + "Template was not found, please verify that your project contains a template named \"$templateId\"." + } else { + e.localizedMessage + } _errorMessage.value = errorMessage } finally { _isLoading.value = false @@ -227,9 +230,8 @@ class ImagenViewModel( suspend fun generateWithTemplate( model: TemplateImagenModel, templateId: String, - templateKey: String, - inputText: String, + inputMap: Map ): ImagenGenerationResponse { - return model.generateImages(templateId, mapOf(templateKey to inputText)) + return model.generateImages(templateId, inputMap) } } diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt index 5c4619f89..26331333b 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenScreen.kt @@ -86,8 +86,7 @@ fun TextGenScreen( textGenViewModel.generate(textPrompt) } }, - modifier = Modifier - .padding(end = 16.dp, bottom = 16.dp) + modifier = Modifier.padding(end = 16.dp, bottom = 16.dp) ) { Text("Generate") } @@ -141,57 +140,3 @@ fun TextGenScreen( } } } - -@Composable -fun DropDownMenu(items: List, onClick: (String) -> Unit) { - - val isDropDownExpanded = remember { - mutableStateOf(false) - } - - val itemPosition = remember { - mutableIntStateOf(0) - } - - - Column( - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.Top, - modifier = Modifier.padding(horizontal = 10.dp) - ) { - - Box { - Row( - horizontalArrangement = Arrangement.Start, - verticalAlignment = Alignment.Top, - modifier = Modifier.clickable { - isDropDownExpanded.value = true - } - ) { - Text(text = items[itemPosition.intValue]) - Image( - painter = painterResource(id = R.drawable.round_arrow_drop_down_24), - contentDescription = "Dropdown Icon" - ) - } - DropdownMenu( - expanded = isDropDownExpanded.value, - onDismissRequest = { - isDropDownExpanded.value = false - }) { - items.forEachIndexed { index, item -> - DropdownMenuItem( - text = { - Text(text = item) - }, - onClick = { - isDropDownExpanded.value = false - itemPosition.intValue = index - onClick(item) - }) - } - } - } - - } -} \ No newline at end of file diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt index 3b8bd7c76..3601a6e12 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import com.google.firebase.ai.GenerativeModel +import com.google.firebase.ai.TemplateGenerativeModel @OptIn(PublicPreviewAPI::class) class TextGenViewModel( @@ -28,19 +29,18 @@ class TextGenViewModel( private val _isLoading = MutableStateFlow(false) val isLoading: StateFlow = _isLoading - val allowEmptyPrompt = sample.allowEmptyPrompt val templateId = sample.templateId val templateKey = sample.templateKey - private val _generatedText = MutableStateFlow(null) val generatedText: StateFlow = _generatedText // Firebase AI Logic private val generativeModel: GenerativeModel + private val templateGenerativeModel: TemplateGenerativeModel init { generativeModel = Firebase.ai( @@ -51,24 +51,25 @@ class TextGenViewModel( generationConfig = sample.generationConfig, tools = sample.tools ) + templateGenerativeModel = Firebase.ai.templateGenerativeModel() } fun generate(inputText: String) { viewModelScope.launch { _isLoading.value = true + _errorMessage.value = null // clear error message try { val generativeResponse = if (templateId != null) { - Firebase.ai.templateGenerativeModel() + templateGenerativeModel .generateContent(templateId, mapOf(templateKey!! to inputText)) } else { generativeModel.generateContent(inputText) } _generatedText.value = generativeResponse.text - _errorMessage.value = null // clear error message } catch (e: Exception) { val errorMessage = if ((e.localizedMessage?.contains("not found") == true) && (templateId != null)) { - "Template was not found, please add a template named $templateId to your project." + "Template was not found, please verify that your project contains a template named \"$templateId\"." } else { e.localizedMessage } From 50c531436a46c2580ee4e888b21728172759e240 Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Tue, 11 Nov 2025 10:11:23 -0800 Subject: [PATCH 03/16] clean up samples --- .../com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index 58f23601b..ddcad6441 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -342,7 +342,6 @@ val FIREBASE_AI_SAMPLES = listOf( Sample( title = "Imagen 3 - Server Template Generation", description = "Generate an image using a server prompt template.", - backend = GenerativeBackend.vertexAI(), navRoute = "imagen", categories = listOf(Category.IMAGE), initialPrompt = content { text("List of things that should be in the image") }, @@ -355,12 +354,10 @@ val FIREBASE_AI_SAMPLES = listOf( Sample( title = "Server Prompt Templates", description = "Generate an invoice using server prompt templates", - backend = GenerativeBackend.vertexAI(), navRoute = "text", categories = listOf(Category.TEXT), initialPrompt = content { text("Customer Name") }, allowEmptyPrompt = false, - editingMode = EditingMode.TEMPLATE, // To make this work on your project, create an `Input + System Instructions` template in your project with this name templateId = "input-system-instructions", templateKey = "customerName" From 1afd252daded749ab30a4ef47d1ac62da0c1ea79 Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Wed, 12 Nov 2025 10:23:48 -0700 Subject: [PATCH 04/16] Update FirebaseAISamples.kt --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index ddcad6441..a5440a6eb 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -348,7 +348,7 @@ val FIREBASE_AI_SAMPLES = listOf( allowEmptyPrompt = false, editingMode = EditingMode.TEMPLATE, // To make this work on your project, create an `Imagen (Basic)` template in your project with this name - templateId = "imagen-test-template", + templateId = "imagen-basic", templateKey = "prompt" ), Sample( From 0b3d397fede57aff2ef711f72dfcedc832f92ed4 Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Thu, 13 Nov 2025 17:20:40 -0700 Subject: [PATCH 05/16] Update firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rosário P. Fernandes --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index a5440a6eb..11e456b82 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -353,7 +353,7 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Server Prompt Templates", - description = "Generate an invoice using server prompt templates", + description = "Generate an invoice using server prompt templates. Note that you need to setup the template in the Firebase console before running this demo.", navRoute = "text", categories = listOf(Category.TEXT), initialPrompt = content { text("Customer Name") }, From b744e2b0cbb7d7522514ae3e05ade07d74122a7e Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Thu, 13 Nov 2025 17:20:53 -0700 Subject: [PATCH 06/16] Update firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rosário P. Fernandes --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index 11e456b82..84a04c66e 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -358,7 +358,7 @@ val FIREBASE_AI_SAMPLES = listOf( categories = listOf(Category.TEXT), initialPrompt = content { text("Customer Name") }, allowEmptyPrompt = false, - // To make this work on your project, create an `Input + System Instructions` template in your project with this name + // To make this work, create an `Input + System Instructions` template in your Firebase project with this name templateId = "input-system-instructions", templateKey = "customerName" ), From c645fcad64b1e2462daf4c1a35e2e9b78a4341e8 Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Thu, 13 Nov 2025 17:21:04 -0700 Subject: [PATCH 07/16] Update firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rosário P. Fernandes --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index 84a04c66e..2dfa5afd7 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -340,7 +340,7 @@ val FIREBASE_AI_SAMPLES = listOf( }, ), Sample( - title = "Imagen 3 - Server Template Generation", + title = "Server Prompt Template - Imagen", description = "Generate an image using a server prompt template.", navRoute = "imagen", categories = listOf(Category.IMAGE), From 9aedc10513d0dbe34b4050ee3f8180ba032eff5a Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Thu, 13 Nov 2025 17:21:27 -0700 Subject: [PATCH 08/16] Update firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rosário P. Fernandes --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index 2dfa5afd7..74247b7db 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -341,7 +341,7 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Server Prompt Template - Imagen", - description = "Generate an image using a server prompt template.", + description = "Generate an image using a server prompt template. Note that you need to setup the template in the Firebase console before running this demo.", navRoute = "imagen", categories = listOf(Category.IMAGE), initialPrompt = content { text("List of things that should be in the image") }, From cd496b198731a7e0aba6434e0ab07d3e48b22502 Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Thu, 13 Nov 2025 17:21:36 -0700 Subject: [PATCH 09/16] Update firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rosário P. Fernandes --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index 74247b7db..d8f6b0ec8 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -352,7 +352,7 @@ val FIREBASE_AI_SAMPLES = listOf( templateKey = "prompt" ), Sample( - title = "Server Prompt Templates", + title = "Server Prompt Templates - Gemini", description = "Generate an invoice using server prompt templates. Note that you need to setup the template in the Firebase console before running this demo.", navRoute = "text", categories = listOf(Category.TEXT), From 4e599170ebe54bc92b66696e8e85058e1d4556fe Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Thu, 13 Nov 2025 17:21:46 -0700 Subject: [PATCH 10/16] Update firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rosário P. Fernandes --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index d8f6b0ec8..e9d987fb8 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -356,7 +356,7 @@ val FIREBASE_AI_SAMPLES = listOf( description = "Generate an invoice using server prompt templates. Note that you need to setup the template in the Firebase console before running this demo.", navRoute = "text", categories = listOf(Category.TEXT), - initialPrompt = content { text("Customer Name") }, + initialPrompt = content { text("Jane Doe") }, allowEmptyPrompt = false, // To make this work, create an `Input + System Instructions` template in your Firebase project with this name templateId = "input-system-instructions", From f2b49f9da2ab5da3c4112b89768c1f4733d0315e Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Thu, 13 Nov 2025 17:21:58 -0700 Subject: [PATCH 11/16] Update firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rosário P. Fernandes --- .../java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index e9d987fb8..c13edfe1b 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -347,7 +347,7 @@ val FIREBASE_AI_SAMPLES = listOf( initialPrompt = content { text("List of things that should be in the image") }, allowEmptyPrompt = false, editingMode = EditingMode.TEMPLATE, - // To make this work on your project, create an `Imagen (Basic)` template in your project with this name + // To make this work, create an "Imagen (Basic)" server prompt template in your Firebase project with this name templateId = "imagen-basic", templateKey = "prompt" ), From d9cd6603c263dd7ba6276e167b186b7671237a07 Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Tue, 18 Nov 2025 12:38:05 -0800 Subject: [PATCH 12/16] update BoM version --- firebase-ai/gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-ai/gradle/libs.versions.toml b/firebase-ai/gradle/libs.versions.toml index ead779330..a589dd5c9 100644 --- a/firebase-ai/gradle/libs.versions.toml +++ b/firebase-ai/gradle/libs.versions.toml @@ -5,7 +5,7 @@ composeBom = "2024.09.00" composeNavigation = "2.9.5" coreKtx = "1.17.0" espressoCore = "3.7.0" -firebaseBom = "34.5.0" +firebaseBom = "34.6.0" junit = "4.13.2" junitVersion = "1.3.0" kotlin = "2.0.21" From acca6dba24683a487836874745d598c5ad51964c Mon Sep 17 00:00:00 2001 From: David Motsonashvili Date: Wed, 19 Nov 2025 15:50:13 -0800 Subject: [PATCH 13/16] format --- .../google/firebase/quickstart/ai/FirebaseAISamples.kt | 9 ++++++--- .../ai/feature/media/imagen/ImagenViewModel.kt | 9 ++++++--- .../quickstart/ai/feature/text/TextGenViewModel.kt | 3 ++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index c13edfe1b..52646ced7 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -328,7 +328,8 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Grounding with Google Search", - description = "Use Grounding with Google Search to get responses based on up-to-date information from the web.", + description = "Use Grounding with Google Search to get responses based on up-to-date information from the" + + " web.", navRoute = "chat", categories = listOf(Category.TEXT, Category.DOCUMENT), modelName = "gemini-2.5-flash", @@ -341,7 +342,8 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Server Prompt Template - Imagen", - description = "Generate an image using a server prompt template. Note that you need to setup the template in the Firebase console before running this demo.", + description = "Generate an image using a server prompt template. Note that you need to setup the template in" + + "the Firebase console before running this demo.", navRoute = "imagen", categories = listOf(Category.IMAGE), initialPrompt = content { text("List of things that should be in the image") }, @@ -353,7 +355,8 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Server Prompt Templates - Gemini", - description = "Generate an invoice using server prompt templates. Note that you need to setup the template in the Firebase console before running this demo.", + description = "Generate an invoice using server prompt templates. Note that you need to setup the template" + + " in the Firebase console before running this demo.", navRoute = "text", categories = listOf(Category.TEXT), initialPrompt = content { text("Jane Doe") }, diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt index 86e9f6e3a..c66d64957 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt @@ -111,14 +111,17 @@ class ImagenViewModel( EditingMode.OUTPAINTING -> outpaint(imagenModel, inputText) EditingMode.SUBJECT_REFERENCE -> drawReferenceSubject(imagenModel, inputText) EditingMode.STYLE_TRANSFER -> transferStyle(imagenModel, inputText) - EditingMode.TEMPLATE -> generateWithTemplate(templateImagenModel, templateId!!, mapOf(templateKey!! to inputText)) + EditingMode.TEMPLATE -> + generateWithTemplate(templateImagenModel, templateId!!, mapOf(templateKey!! to inputText)) else -> generate(imagenModel, inputText) } _generatedBitmaps.value = imageResponse.images.map { it.asBitmap() } } catch (e: Exception) { val errorMessage = - if ((e.localizedMessage?.contains("not found") == true) && sample.editingMode == EditingMode.TEMPLATE) { - "Template was not found, please verify that your project contains a template named \"$templateId\"." + if ((e.localizedMessage?.contains("not found") == true) && + sample.editingMode == EditingMode.TEMPLATE) { + "Template was not found, please verify that your project contains a" + + " template named \"$templateId\"." } else { e.localizedMessage } diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt index 3601a6e12..52532daef 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TextGenViewModel.kt @@ -69,7 +69,8 @@ class TextGenViewModel( } catch (e: Exception) { val errorMessage = if ((e.localizedMessage?.contains("not found") == true) && (templateId != null)) { - "Template was not found, please verify that your project contains a template named \"$templateId\"." + "Template was not found, please verify that your project contains a" + + " template named \"$templateId\"." } else { e.localizedMessage } From 43db7a156b9961f8a16a05128b5f23ad2873cc21 Mon Sep 17 00:00:00 2001 From: DPEBot Date: Mon, 10 Nov 2025 12:05:59 -0800 Subject: [PATCH 14/16] Auto-update dependencies. (#2728) --- admob/app/build.gradle.kts | 4 ++-- auth/app/build.gradle.kts | 4 ++-- build.gradle.kts | 2 +- database/app/build.gradle.kts | 4 ++-- firebase-ai/gradle/libs.versions.toml | 2 +- firestore/app/build.gradle.kts | 4 ++-- firestore/build.gradle.kts | 2 +- gradle/libs.versions.toml | 4 ++-- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/admob/app/build.gradle.kts b/admob/app/build.gradle.kts index c4f71a390..78aac6ef5 100644 --- a/admob/app/build.gradle.kts +++ b/admob/app/build.gradle.kts @@ -55,8 +55,8 @@ dependencies { implementation("androidx.appcompat:appcompat:1.7.1") implementation("com.google.android.material:material:1.13.0") implementation("androidx.browser:browser:1.5.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.9.5") - implementation("androidx.navigation:navigation-ui-ktx:2.9.5") + implementation("androidx.navigation:navigation-fragment-ktx:2.9.6") + implementation("androidx.navigation:navigation-ui-ktx:2.9.6") implementation("com.google.android.gms:play-services-ads:23.3.0") diff --git a/auth/app/build.gradle.kts b/auth/app/build.gradle.kts index bc75b1f2d..2de0cf37e 100644 --- a/auth/app/build.gradle.kts +++ b/auth/app/build.gradle.kts @@ -58,8 +58,8 @@ dependencies { implementation("androidx.constraintlayout:constraintlayout:2.2.1") implementation("androidx.vectordrawable:vectordrawable-animated:1.2.0") implementation("com.google.android.material:material:1.13.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.9.5") - implementation("androidx.navigation:navigation-ui-ktx:2.9.5") + implementation("androidx.navigation:navigation-fragment-ktx:2.9.6") + implementation("androidx.navigation:navigation-ui-ktx:2.9.6") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) implementation(platform("com.google.firebase:firebase-bom:34.5.0")) diff --git a/build.gradle.kts b/build.gradle.kts index 1057e662e..0acffa341 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { id("com.google.gms.google-services") version "4.4.4" apply false id("com.google.firebase.crashlytics") version "3.0.6" apply false id("com.google.firebase.firebase-perf") version "2.0.2" apply false - id("androidx.navigation.safeargs") version "2.9.5" apply false + id("androidx.navigation.safeargs") version "2.9.6" apply false id("com.github.ben-manes.versions") version "0.53.0" apply true id("org.jetbrains.kotlin.plugin.compose") version "2.2.21" apply false } diff --git a/database/app/build.gradle.kts b/database/app/build.gradle.kts index bac8a6b80..51bc02e0d 100644 --- a/database/app/build.gradle.kts +++ b/database/app/build.gradle.kts @@ -54,8 +54,8 @@ dependencies { implementation("androidx.appcompat:appcompat:1.7.1") implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("com.google.android.material:material:1.13.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.9.5") - implementation("androidx.navigation:navigation-ui-ktx:2.9.5") + implementation("androidx.navigation:navigation-fragment-ktx:2.9.6") + implementation("androidx.navigation:navigation-ui-ktx:2.9.6") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) implementation(platform("com.google.firebase:firebase-bom:34.5.0")) diff --git a/firebase-ai/gradle/libs.versions.toml b/firebase-ai/gradle/libs.versions.toml index a589dd5c9..17c2d2c83 100644 --- a/firebase-ai/gradle/libs.versions.toml +++ b/firebase-ai/gradle/libs.versions.toml @@ -2,7 +2,7 @@ activityCompose = "1.11.0" agp = "8.9.2" composeBom = "2024.09.00" -composeNavigation = "2.9.5" +composeNavigation = "2.9.6" coreKtx = "1.17.0" espressoCore = "3.7.0" firebaseBom = "34.6.0" diff --git a/firestore/app/build.gradle.kts b/firestore/app/build.gradle.kts index e5cabe14e..c2824bf86 100644 --- a/firestore/app/build.gradle.kts +++ b/firestore/app/build.gradle.kts @@ -84,8 +84,8 @@ dependencies { implementation("androidx.media:media:1.7.1") implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("androidx.multidex:multidex:2.0.1") - implementation("androidx.navigation:navigation-fragment-ktx:2.9.5") - implementation("androidx.navigation:navigation-ui-ktx:2.9.5") + implementation("androidx.navigation:navigation-fragment-ktx:2.9.6") + implementation("androidx.navigation:navigation-ui-ktx:2.9.6") // Android architecture components implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4") diff --git a/firestore/build.gradle.kts b/firestore/build.gradle.kts index 4a3348513..141d63d1d 100644 --- a/firestore/build.gradle.kts +++ b/firestore/build.gradle.kts @@ -5,7 +5,7 @@ plugins { id("com.android.library") version "8.13.0" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false - id("androidx.navigation.safeargs") version "2.9.5" apply false + id("androidx.navigation.safeargs") version "2.9.6" apply false } allprojects { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3f0b0153a..850339b71 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,9 +10,9 @@ espressoCore = "3.7.0" kotlinxSerializationCore = "1.9.0" lifecycle = "2.9.4" activityCompose = "1.11.0" -composeBom = "2025.10.01" +composeBom = "2025.11.00" googleServices = "4.4.4" -composeNavigation = "2.9.5" +composeNavigation = "2.9.6" material = "1.13.0" webkit = "1.14.0" From 02b1d4c20196cf65a5966db1cbe1e1acc05b26ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ros=C3=A1rio=20P=2E=20Fernandes?= Date: Mon, 17 Nov 2025 09:48:23 +0000 Subject: [PATCH 15/16] refactor(ai-logic): upgrade to Imagen 4 (#2730) --- .../com/google/firebase/quickstart/ai/FirebaseAISamples.kt | 4 ++-- .../quickstart/ai/feature/media/imagen/ImagenViewModel.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt index 52646ced7..d38776bde 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt @@ -126,8 +126,8 @@ val FIREBASE_AI_SAMPLES = listOf( } ), Sample( - title = "Imagen 3 - image generation", - description = "Generate images using Imagen 3", + title = "Imagen 4 - image generation", + description = "Generate images using Imagen 4", navRoute = "imagen", categories = listOf(Category.IMAGE), initialPrompt = content { diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt index c66d64957..cf794a036 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt @@ -94,7 +94,7 @@ class ImagenViewModel( imagenModel = Firebase.ai( backend = sample.backend ).imagenModel( - modelName = sample.modelName ?: "imagen-3.0-generate-002", + modelName = sample.modelName ?: "imagen-4.0-generate-001", generationConfig = config, safetySettings = settings ) From 0cf9b701ccc10c040485c300b5606c095ef602d6 Mon Sep 17 00:00:00 2001 From: DPEBot Date: Tue, 18 Nov 2025 14:40:08 -0800 Subject: [PATCH 16/16] Auto-update dependencies. (#2731) --- admob/app/build.gradle.kts | 2 +- admob/build.gradle.kts | 4 ++-- analytics/app/build.gradle.kts | 2 +- analytics/build.gradle.kts | 4 ++-- appdistribution/app/build.gradle.kts | 2 +- appdistribution/build.gradle.kts | 4 ++-- auth/app/build.gradle.kts | 2 +- auth/build.gradle.kts | 4 ++-- build.gradle.kts | 4 ++-- config/app/build.gradle.kts | 2 +- config/build.gradle.kts | 4 ++-- crash/app/build.gradle.kts | 2 +- crash/build.gradle.kts | 4 ++-- database/app/build.gradle.kts | 2 +- database/build.gradle.kts | 4 ++-- firebase-ai/build.gradle.kts | 4 ++-- firestore/app/build.gradle.kts | 2 +- firestore/build.gradle.kts | 4 ++-- functions/app/build.gradle.kts | 2 +- functions/build.gradle.kts | 4 ++-- gradle/libs.versions.toml | 4 ++-- inappmessaging/app/build.gradle.kts | 2 +- inappmessaging/build.gradle.kts | 4 ++-- internal/lint/build.gradle.kts | 6 +++--- messaging/app/build.gradle.kts | 2 +- messaging/build.gradle.kts | 4 ++-- perf/app/build.gradle.kts | 2 +- perf/build.gradle.kts | 4 ++-- storage/app/build.gradle.kts | 2 +- storage/build.gradle.kts | 4 ++-- 30 files changed, 48 insertions(+), 48 deletions(-) diff --git a/admob/app/build.gradle.kts b/admob/app/build.gradle.kts index 78aac6ef5..d4eb324a9 100644 --- a/admob/app/build.gradle.kts +++ b/admob/app/build.gradle.kts @@ -61,7 +61,7 @@ dependencies { implementation("com.google.android.gms:play-services-ads:23.3.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // For an optimal experience using AdMob, add the Firebase SDK // for Google Analytics. This is recommended, but not required. diff --git a/admob/build.gradle.kts b/admob/build.gradle.kts index 1d80d309f..4dace862a 100644 --- a/admob/build.gradle.kts +++ b/admob/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/analytics/app/build.gradle.kts b/analytics/app/build.gradle.kts index 1bf04ad7a..f53efbfaa 100644 --- a/analytics/app/build.gradle.kts +++ b/analytics/app/build.gradle.kts @@ -59,7 +59,7 @@ dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.4") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firebase Analytics implementation("com.google.firebase:firebase-analytics") diff --git a/analytics/build.gradle.kts b/analytics/build.gradle.kts index 02adfaa7f..334b0c71a 100644 --- a/analytics/build.gradle.kts +++ b/analytics/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/appdistribution/app/build.gradle.kts b/appdistribution/app/build.gradle.kts index 0cfa89025..94f81fc24 100644 --- a/appdistribution/app/build.gradle.kts +++ b/appdistribution/app/build.gradle.kts @@ -57,7 +57,7 @@ dependencies { implementation("androidx.multidex:multidex:2.0.1") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // ADD the SDK to the "prerelease" variant only (example) implementation("com.google.firebase:firebase-appdistribution:16.0.0-beta17") diff --git a/appdistribution/build.gradle.kts b/appdistribution/build.gradle.kts index 565eae3b3..1da0dfd29 100644 --- a/appdistribution/build.gradle.kts +++ b/appdistribution/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/auth/app/build.gradle.kts b/auth/app/build.gradle.kts index 2de0cf37e..d989a1706 100644 --- a/auth/app/build.gradle.kts +++ b/auth/app/build.gradle.kts @@ -62,7 +62,7 @@ dependencies { implementation("androidx.navigation:navigation-ui-ktx:2.9.6") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firebase Authentication implementation("com.google.firebase:firebase-auth") diff --git a/auth/build.gradle.kts b/auth/build.gradle.kts index 565eae3b3..1da0dfd29 100644 --- a/auth/build.gradle.kts +++ b/auth/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/build.gradle.kts b/build.gradle.kts index 0acffa341..76a563a55 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false id("com.google.firebase.crashlytics") version "3.0.6" apply false diff --git a/config/app/build.gradle.kts b/config/app/build.gradle.kts index 9c9a50889..f010eb48e 100644 --- a/config/app/build.gradle.kts +++ b/config/app/build.gradle.kts @@ -53,7 +53,7 @@ dependencies { implementation("com.google.android.material:material:1.13.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firebase Remote Config implementation("com.google.firebase:firebase-config") diff --git a/config/build.gradle.kts b/config/build.gradle.kts index 1d80d309f..4dace862a 100644 --- a/config/build.gradle.kts +++ b/config/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/crash/app/build.gradle.kts b/crash/app/build.gradle.kts index f0dd061b8..d1e6a385a 100644 --- a/crash/app/build.gradle.kts +++ b/crash/app/build.gradle.kts @@ -60,7 +60,7 @@ dependencies { implementation("androidx.activity:activity-ktx:1.11.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firebase Crashlytics implementation("com.google.firebase:firebase-crashlytics") diff --git a/crash/build.gradle.kts b/crash/build.gradle.kts index 5e9534052..1ddce162a 100644 --- a/crash/build.gradle.kts +++ b/crash/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false id("com.google.firebase.crashlytics") version "3.0.6" apply false diff --git a/database/app/build.gradle.kts b/database/app/build.gradle.kts index 51bc02e0d..2059770db 100644 --- a/database/app/build.gradle.kts +++ b/database/app/build.gradle.kts @@ -58,7 +58,7 @@ dependencies { implementation("androidx.navigation:navigation-ui-ktx:2.9.6") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firebase Realtime Database implementation("com.google.firebase:firebase-database") diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 565eae3b3..1da0dfd29 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/firebase-ai/build.gradle.kts b/firebase-ai/build.gradle.kts index d16da171a..cabdaab15 100644 --- a/firebase-ai/build.gradle.kts +++ b/firebase-ai/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("org.jetbrains.kotlin.plugin.compose") version "2.2.21" apply false id("org.jetbrains.kotlin.plugin.serialization") version "2.2.21" apply false diff --git a/firestore/app/build.gradle.kts b/firestore/app/build.gradle.kts index c2824bf86..842d291b0 100644 --- a/firestore/app/build.gradle.kts +++ b/firestore/app/build.gradle.kts @@ -58,7 +58,7 @@ dependencies { implementation(project(":internal:chooserx")) // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firestore implementation("com.google.firebase:firebase-firestore") diff --git a/firestore/build.gradle.kts b/firestore/build.gradle.kts index 141d63d1d..ff44b46b6 100644 --- a/firestore/build.gradle.kts +++ b/firestore/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false id("androidx.navigation.safeargs") version "2.9.6" apply false diff --git a/functions/app/build.gradle.kts b/functions/app/build.gradle.kts index b0eabf3a0..f6de2fc7b 100644 --- a/functions/app/build.gradle.kts +++ b/functions/app/build.gradle.kts @@ -55,7 +55,7 @@ dependencies { implementation("com.google.android.material:material:1.13.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Cloud Functions for Firebase implementation("com.google.firebase:firebase-functions") diff --git a/functions/build.gradle.kts b/functions/build.gradle.kts index 565eae3b3..1da0dfd29 100644 --- a/functions/build.gradle.kts +++ b/functions/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 850339b71..0492a7851 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] -agp = "8.13.0" +agp = "8.13.1" coilCompose = "2.7.0" -firebaseBom = "34.5.0" +firebaseBom = "34.6.0" kotlin = "2.2.21" coreKtx = "1.17.0" junit = "4.13.2" diff --git a/inappmessaging/app/build.gradle.kts b/inappmessaging/app/build.gradle.kts index 7633d00f4..3c971653e 100644 --- a/inappmessaging/app/build.gradle.kts +++ b/inappmessaging/app/build.gradle.kts @@ -56,7 +56,7 @@ dependencies { implementation("androidx.multidex:multidex:2.0.1") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // FIAM implementation("com.google.firebase:firebase-inappmessaging-display") diff --git a/inappmessaging/build.gradle.kts b/inappmessaging/build.gradle.kts index 565eae3b3..1da0dfd29 100644 --- a/inappmessaging/build.gradle.kts +++ b/inappmessaging/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/internal/lint/build.gradle.kts b/internal/lint/build.gradle.kts index 1b154e965..bb16eb5ab 100755 --- a/internal/lint/build.gradle.kts +++ b/internal/lint/build.gradle.kts @@ -9,8 +9,8 @@ java { } dependencies { - compileOnly("com.android.tools.lint:lint-api:31.13.0") - testImplementation("com.android.tools.lint:lint:31.13.0") - testImplementation("com.android.tools.lint:lint-tests:31.13.0") + compileOnly("com.android.tools.lint:lint-api:31.13.1") + testImplementation("com.android.tools.lint:lint:31.13.1") + testImplementation("com.android.tools.lint:lint-tests:31.13.1") testImplementation("junit:junit:4.13.2") } diff --git a/messaging/app/build.gradle.kts b/messaging/app/build.gradle.kts index abd7e6930..71733f3c7 100644 --- a/messaging/app/build.gradle.kts +++ b/messaging/app/build.gradle.kts @@ -67,7 +67,7 @@ dependencies { implementation("com.google.android.material:material:1.13.0") // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firebase Cloud Messaging implementation("com.google.firebase:firebase-messaging") diff --git a/messaging/build.gradle.kts b/messaging/build.gradle.kts index 1d80d309f..4dace862a 100644 --- a/messaging/build.gradle.kts +++ b/messaging/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false } diff --git a/perf/app/build.gradle.kts b/perf/app/build.gradle.kts index f62e4d6ab..a7ba05015 100644 --- a/perf/app/build.gradle.kts +++ b/perf/app/build.gradle.kts @@ -64,7 +64,7 @@ dependencies { implementation(project(":internal:chooserx")) // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Firebase Performance Monitoring implementation("com.google.firebase:firebase-perf") diff --git a/perf/build.gradle.kts b/perf/build.gradle.kts index 57cc7e63d..1111f2bb6 100644 --- a/perf/build.gradle.kts +++ b/perf/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false id("com.google.firebase.firebase-perf") version "2.0.2" apply false diff --git a/storage/app/build.gradle.kts b/storage/app/build.gradle.kts index 3cbd2a502..e3edc6452 100644 --- a/storage/app/build.gradle.kts +++ b/storage/app/build.gradle.kts @@ -51,7 +51,7 @@ dependencies { implementation(project(":internal:chooserx")) // Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom) - implementation(platform("com.google.firebase:firebase-bom:34.5.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // Cloud Storage for Firebase implementation("com.google.firebase:firebase-storage") diff --git a/storage/build.gradle.kts b/storage/build.gradle.kts index 565eae3b3..1da0dfd29 100644 --- a/storage/build.gradle.kts +++ b/storage/build.gradle.kts @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.13.0" apply false - id("com.android.library") version "8.13.0" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false id("com.google.gms.google-services") version "4.4.4" apply false }