Skip to content

Commit 221c054

Browse files
committed
Update UI of catalog app
1 parent 3e1e563 commit 221c054

5 files changed

Lines changed: 67 additions & 13 deletions

File tree

‎app/src/main/java/com/android/camera/catalog/domain/SampleCatalog.kt‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ val sampleCatalog = listOf(
3434
description = R.string.camera2_sample_takeaphoto_list_description,
3535
route = "Camera2TakeAPhotoScreen",
3636
sampleEntryScreen = { Camera2TakeAPhotoScreen() },
37+
type = SampleType.CAMERA2,
3738
tags = listOf(SampleTags.MEDIA3, SampleTags.ML_KIT),
3839
isFeatured = true,
3940
keyArt = R.drawable.img_keyart_multimodal,
@@ -47,6 +48,7 @@ data class SampleCatalogItem(
4748
@param:StringRes val description: Int,
4849
val route: String,
4950
val sampleEntryScreen: @Composable () -> Unit,
51+
val type: SampleType,
5052
val tags: List<SampleTags> = emptyList(),
5153
val isFeatured: Boolean = false,
5254
@param:DrawableRes val keyArt: Int? = null,
@@ -59,3 +61,9 @@ enum class SampleTags(
5961
MEDIA3("Media3", extendedColorScheme.media3),
6062
ML_KIT("ML Kit", extendedColorScheme.mLKit),
6163
}
64+
65+
enum class SampleType {
66+
CAMERAX,
67+
CAMERA2,
68+
}
69+

‎app/src/main/java/com/android/camera/catalog/ui/CatalogApp.kt‎

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
5252
import androidx.compose.material3.Icon
5353
import androidx.compose.material3.MaterialTheme
5454
import androidx.compose.material3.Scaffold
55+
import androidx.compose.material3.SegmentedButton
56+
import androidx.compose.material3.SegmentedButtonDefaults
57+
import androidx.compose.material3.SingleChoiceSegmentedButtonRow
5558
import androidx.compose.material3.Text
5659
import androidx.compose.material3.TopAppBarDefaults
5760
import androidx.compose.material3.TwoRowsTopAppBar
@@ -82,6 +85,7 @@ import androidx.navigation.compose.NavHost
8285
import androidx.navigation.compose.composable
8386
import androidx.navigation.compose.rememberNavController
8487
import com.android.camera.catalog.R
88+
import com.android.camera.catalog.domain.SampleType
8589
import com.android.camera.catalog.domain.sampleCatalog
8690
import kotlinx.serialization.Serializable
8791

@@ -207,19 +211,57 @@ fun CatalogApp() {
207211
}
208212
) { hasPermission ->
209213
if (hasPermission) {
210-
LazyColumn(
211-
contentPadding = innerPadding,
212-
modifier = Modifier.fillMaxWidth(),
213-
horizontalAlignment = Alignment.CenterHorizontally,
214-
) {
215-
items(sampleCatalog) {
216-
val onClick = {
217-
navController.navigate(it.route)
214+
Column(modifier = Modifier
215+
.fillMaxSize()
216+
.padding(innerPadding)) {
217+
var selectedFilter by remember { mutableStateOf<SampleType?>(null) }
218+
219+
SingleChoiceSegmentedButtonRow(
220+
modifier = Modifier
221+
.fillMaxWidth()
222+
.padding(horizontal = 16.dp, vertical = 8.dp)
223+
) {
224+
SegmentedButton(
225+
selected = selectedFilter == null,
226+
onClick = { selectedFilter = null },
227+
shape = SegmentedButtonDefaults.itemShape(index = 0, count = 3)
228+
) {
229+
Text("All")
230+
}
231+
SegmentedButton(
232+
selected = selectedFilter == SampleType.CAMERAX,
233+
onClick = { selectedFilter = SampleType.CAMERAX },
234+
shape = SegmentedButtonDefaults.itemShape(index = 1, count = 3)
235+
) {
236+
Text("CameraX")
237+
}
238+
SegmentedButton(
239+
selected = selectedFilter == SampleType.CAMERA2,
240+
onClick = { selectedFilter = SampleType.CAMERA2 },
241+
shape = SegmentedButtonDefaults.itemShape(index = 2, count = 3)
242+
) {
243+
Text("Camera 2")
218244
}
219-
if (it.isFeatured) {
220-
CatalogWideCard(catalogItem = it, onClick = onClick)
221-
} else {
222-
CatalogRowCard(catalogItem = it, onClick = onClick)
245+
}
246+
247+
LazyColumn(
248+
modifier = Modifier.fillMaxWidth(),
249+
horizontalAlignment = Alignment.CenterHorizontally,
250+
) {
251+
val filteredSamples = sampleCatalog.filter {
252+
selectedFilter == null || it.type == selectedFilter
253+
}
254+
items(items = filteredSamples, key = { it.route }) {
255+
val onClick = {
256+
navController.navigate(it.route)
257+
}
258+
Column(modifier = Modifier.animateItem()) {
259+
if (it.isFeatured) {
260+
CatalogWideCard(catalogItem = it, onClick = onClick)
261+
} else {
262+
CatalogRowCard(catalogItem = it, onClick = onClick)
263+
}
264+
}
223265
}
224266
}
225267
}

‎app/src/main/java/com/android/camera/catalog/ui/CatalogRowCard.kt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import com.android.camera.catalog.domain.SampleCatalogItem
4242
import com.android.camera.catalog.domain.SampleTags
4343
import com.android.ai.theme.AISampleCatalogTheme
4444
import com.android.ai.uicomponent.Tag
45+
import com.android.camera.catalog.domain.SampleType
4546

4647
@Composable
4748
fun CatalogRowCard(catalogItem: SampleCatalogItem, onClick: () -> Unit) {
@@ -105,6 +106,7 @@ fun CatalogRowCardPreview() {
105106
description = R.string.camera2_sample_takeaphoto_list_description,
106107
route = "GeminiMultimodalScreen",
107108
sampleEntryScreen = { },
109+
type = SampleType.CAMERA2,
108110
tags = listOf(SampleTags.MEDIA3, SampleTags.ML_KIT),
109111
)
110112

‎app/src/main/java/com/android/camera/catalog/ui/CatalogWideCard.kt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import com.android.camera.catalog.domain.SampleCatalogItem
3838
import com.android.camera.catalog.domain.SampleTags
3939
import com.android.ai.theme.AISampleCatalogTheme
4040
import com.android.ai.uicomponent.Tag
41+
import com.android.camera.catalog.domain.SampleType
4142

4243
@Composable
4344
fun CatalogWideCard(catalogItem: SampleCatalogItem, onClick: () -> Unit) {
@@ -99,6 +100,7 @@ fun CatalogWideCardPreview() {
99100
description = R.string.camera2_sample_takeaphoto_list_description,
100101
route = "GeminiMultimodalScreen",
101102
sampleEntryScreen = { },
103+
type = SampleType.CAMERAX,
102104
tags = listOf(SampleTags.MEDIA3, SampleTags.ML_KIT),
103105
)
104106

‎app/src/main/res/values/strings.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<string name="camera2_sample_takeaphoto_list_description">A very simple example of multimodal generation using the Gemini Flash model.</string>
55

66
<string name="top_bar_title">Android Camera Samples</string>
7-
<string name="top_bar_title_expanded">Android\nCamera Samples</string>
7+
<string name="top_bar_title_expanded">Camera Samples</string>
88
<string name="open_sample_button">Open sample</string>
99

1010
<string name="close">Close</string>

0 commit comments

Comments
 (0)