diff --git a/ai-catalog/app/src/main/java/com/android/ai/catalog/ui/CatalogApp.kt b/ai-catalog/app/src/main/java/com/android/ai/catalog/ui/CatalogApp.kt index 9b0cc372..cbdbb720 100644 --- a/ai-catalog/app/src/main/java/com/android/ai/catalog/ui/CatalogApp.kt +++ b/ai-catalog/app/src/main/java/com/android/ai/catalog/ui/CatalogApp.kt @@ -18,27 +18,41 @@ package com.android.ai.catalog.ui import android.content.Intent import android.util.Log import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AlertDialog import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TextButton -import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TwoRowsTopAppBar +import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import androidx.core.net.toUri import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -48,7 +62,7 @@ import com.android.ai.catalog.domain.sampleCatalog import com.google.firebase.FirebaseApp import kotlinx.serialization.Serializable -@OptIn(ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) @Composable fun CatalogApp(modifier: Modifier = Modifier) { val context = LocalContext.current @@ -60,19 +74,44 @@ fun CatalogApp(modifier: Modifier = Modifier) { startDestination = HomeScreen, ) { composable { + val topAppBarState = rememberTopAppBarState() + val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(topAppBarState) Scaffold( + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - TopAppBar( + TwoRowsTopAppBar( colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Transparent, + scrolledContainerColor = MaterialTheme.colorScheme.surface, titleContentColor = MaterialTheme.colorScheme.primary, ), - title = { - Text( - text = stringResource(id = R.string.top_bar_title), - style = MaterialTheme.typography.titleLarge, - color = MaterialTheme.colorScheme.onSurface, - ) + title = { expanded -> + if (expanded) { + AppBarPill() + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(id = R.string.top_bar_title_expanded), + style = MaterialTheme.typography.displaySmall, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 2, + modifier = Modifier.padding(bottom = 12.dp) + ) + } else { + Row { + AppBarPill() + Spacer(modifier = Modifier.width(12.dp)) + Text( + text = stringResource(id = R.string.top_bar_title), + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 1, + modifier = Modifier.align(Alignment.CenterVertically) + ) + } + } + }, + scrollBehavior = scrollBehavior ) }, ) { innerPadding -> @@ -128,6 +167,27 @@ fun CatalogApp(modifier: Modifier = Modifier) { @Serializable object HomeScreen + +@Composable +fun AppBarPill() { + Row( + modifier = Modifier + .height(40.dp) + .width(58.dp) + .background( + color = MaterialTheme.colorScheme.primary, + shape = RoundedCornerShape(24.dp), + ), + ) { + Icon( + painter = painterResource(R.drawable.spark_android), + contentDescription = null, + modifier = Modifier.padding(10.dp), + tint = MaterialTheme.colorScheme.onPrimary, + ) + } +} + @Composable fun FirebaseRequiredAlert(onDismiss: () -> Unit = {}, onOpenFirebaseDocClick: () -> Unit = {}) { AlertDialog( diff --git a/ai-catalog/app/src/main/res/drawable/spark_android.xml b/ai-catalog/app/src/main/res/drawable/spark_android.xml new file mode 100644 index 00000000..4a3344de --- /dev/null +++ b/ai-catalog/app/src/main/res/drawable/spark_android.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/ai-catalog/app/src/main/res/values/strings.xml b/ai-catalog/app/src/main/res/values/strings.xml index 49370110..b9b32aaa 100644 --- a/ai-catalog/app/src/main/res/values/strings.xml +++ b/ai-catalog/app/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ Polish text with Gemini Nano Proofread and rewrite short content on-device with GenAI API powered by Gemini Nano Android AI Samples + Android\nAI Samples Open sample Image generation with Imagen Generate images with Imagen, Google image generation model