Skip to content

Commit 575ab3a

Browse files
committed
Refactor the shared toolbars to the same component
1 parent 1cd89ba commit 575ab3a

File tree

3 files changed

+90
-77
lines changed

3 files changed

+90
-77
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* Copyright 2025 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.android.developers.androidify.theme.components
17+
18+
import androidx.compose.foundation.border
19+
import androidx.compose.foundation.layout.Spacer
20+
import androidx.compose.foundation.layout.width
21+
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
22+
import androidx.compose.material3.FloatingToolbarColors
23+
import androidx.compose.material3.HorizontalFloatingToolbar
24+
import androidx.compose.material3.MaterialTheme
25+
import androidx.compose.material3.Text
26+
import androidx.compose.material3.ToggleButton
27+
import androidx.compose.material3.ToggleButtonDefaults
28+
import androidx.compose.runtime.Composable
29+
import androidx.compose.ui.Modifier
30+
import androidx.compose.ui.unit.dp
31+
import kotlin.enums.enumEntries
32+
33+
@Composable
34+
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
35+
inline fun <reified T : Enum<T>> HorizontalToolbar(
36+
selectedOption: T,
37+
crossinline label: @Composable (T) -> String,
38+
crossinline onOptionSelected: (T) -> Unit,
39+
modifier: Modifier = Modifier,
40+
) {
41+
val options = enumEntries<T>()
42+
HorizontalFloatingToolbar(
43+
modifier = modifier.border(
44+
2.dp,
45+
color = MaterialTheme.colorScheme.outline,
46+
shape = MaterialTheme.shapes.large,
47+
),
48+
colors = FloatingToolbarColors(
49+
toolbarContainerColor = MaterialTheme.colorScheme.surface,
50+
toolbarContentColor = MaterialTheme.colorScheme.onSurfaceVariant,
51+
fabContainerColor = MaterialTheme.colorScheme.tertiary,
52+
fabContentColor = MaterialTheme.colorScheme.onTertiary,
53+
),
54+
expanded = true,
55+
) {
56+
options.forEachIndexed { index, item ->
57+
ToggleButton(
58+
modifier = Modifier,
59+
checked = selectedOption == item,
60+
onCheckedChange = { onOptionSelected(item) },
61+
shapes = ToggleButtonDefaults.shapes(checkedShape = MaterialTheme.shapes.large),
62+
colors = ToggleButtonDefaults.toggleButtonColors(
63+
checkedContainerColor = MaterialTheme.colorScheme.onSurface,
64+
containerColor = MaterialTheme.colorScheme.surface,
65+
),
66+
) {
67+
Text(label(options[index]), maxLines = 1)
68+
}
69+
if (index != options.size - 1) {
70+
Spacer(Modifier.width(8.dp))
71+
}
72+
}
73+
}
74+
}

feature/creation/src/main/java/com/android/developers/androidify/creation/PromptTypePager.kt

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import androidx.compose.ui.tooling.preview.Preview
5757
import androidx.compose.ui.unit.dp
5858
import com.android.developers.androidify.data.DropBehaviourFactory
5959
import com.android.developers.androidify.theme.AndroidifyTheme
60+
import com.android.developers.androidify.theme.components.HorizontalToolbar
6061
import kotlinx.coroutines.launch
6162

6263
@Composable
@@ -167,39 +168,12 @@ fun PromptTypeToolbar(
167168
modifier: Modifier = Modifier,
168169
onOptionSelected: (PromptType) -> Unit,
169170
) {
170-
val options = PromptType.entries
171-
HorizontalFloatingToolbar(
172-
modifier = modifier.border(
173-
2.dp,
174-
color = MaterialTheme.colorScheme.outline,
175-
shape = MaterialTheme.shapes.large,
176-
),
177-
colors = FloatingToolbarColors(
178-
toolbarContainerColor = MaterialTheme.colorScheme.surface,
179-
toolbarContentColor = MaterialTheme.colorScheme.onSurfaceVariant,
180-
fabContainerColor = MaterialTheme.colorScheme.tertiary,
181-
fabContentColor = MaterialTheme.colorScheme.onTertiary,
182-
),
183-
expanded = true,
184-
) {
185-
options.forEachIndexed { index, label ->
186-
ToggleButton(
187-
modifier = Modifier,
188-
checked = selectedOption == label,
189-
onCheckedChange = { onOptionSelected(label) },
190-
shapes = ToggleButtonDefaults.shapes(checkedShape = MaterialTheme.shapes.large),
191-
colors = ToggleButtonDefaults.toggleButtonColors(
192-
checkedContainerColor = MaterialTheme.colorScheme.onSurface,
193-
containerColor = MaterialTheme.colorScheme.surface,
194-
),
195-
) {
196-
Text(label.displayName, maxLines = 1)
197-
}
198-
if (index != options.size - 1) {
199-
Spacer(Modifier.width(8.dp))
200-
}
201-
}
202-
}
171+
HorizontalToolbar<PromptType>(
172+
selectedOption = selectedOption,
173+
modifier = modifier,
174+
label = { item -> item.displayName },
175+
onOptionSelected = onOptionSelected,
176+
)
203177
}
204178

205179
@Preview

feature/results/src/main/java/com/android/developers/androidify/results/ResultOption.kt

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,16 @@
1717

1818
package com.android.developers.androidify.results
1919

20-
import androidx.compose.foundation.border
2120
import androidx.compose.foundation.layout.Column
22-
import androidx.compose.foundation.layout.Spacer
2321
import androidx.compose.foundation.layout.padding
24-
import androidx.compose.foundation.layout.width
2522
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
26-
import androidx.compose.material3.FloatingToolbarColors
27-
import androidx.compose.material3.HorizontalFloatingToolbar
28-
import androidx.compose.material3.MaterialTheme
29-
import androidx.compose.material3.Text
30-
import androidx.compose.material3.ToggleButton
31-
import androidx.compose.material3.ToggleButtonDefaults
3223
import androidx.compose.runtime.Composable
3324
import androidx.compose.ui.Modifier
3425
import androidx.compose.ui.res.stringResource
3526
import androidx.compose.ui.tooling.preview.Preview
3627
import androidx.compose.ui.unit.dp
3728
import com.android.developers.androidify.theme.AndroidifyTheme
29+
import com.android.developers.androidify.theme.components.HorizontalToolbar
3830

3931
@Preview
4032
@Composable
@@ -54,41 +46,14 @@ fun ResultToolbarOption(
5446
wasPromptUsed: Boolean = false,
5547
onResultOptionSelected: (ResultOption) -> Unit,
5648
) {
57-
val options = ResultOption.entries
58-
HorizontalFloatingToolbar(
59-
modifier = modifier
60-
.padding(start = 16.dp, end = 16.dp, top = 8.dp)
61-
.border(
62-
2.dp,
63-
color = MaterialTheme.colorScheme.outline,
64-
shape = MaterialTheme.shapes.large,
65-
),
66-
colors = FloatingToolbarColors(
67-
toolbarContainerColor = MaterialTheme.colorScheme.surface,
68-
toolbarContentColor = MaterialTheme.colorScheme.onSurfaceVariant,
69-
fabContainerColor = MaterialTheme.colorScheme.tertiary,
70-
fabContentColor = MaterialTheme.colorScheme.onTertiary,
71-
),
72-
expanded = true,
73-
) {
74-
options.forEachIndexed { index, label ->
75-
ToggleButton(
76-
modifier = Modifier,
77-
checked = selectedOption == label,
78-
onCheckedChange = { onResultOptionSelected(label) },
79-
shapes = ToggleButtonDefaults.shapes(checkedShape = MaterialTheme.shapes.large),
80-
colors = ToggleButtonDefaults.toggleButtonColors(
81-
checkedContainerColor = MaterialTheme.colorScheme.onSurface,
82-
containerColor = MaterialTheme.colorScheme.surface,
83-
),
84-
) {
85-
Text(stringResource(label.displayText(wasPromptUsed)), maxLines = 1)
86-
}
87-
if (index != options.size - 1) {
88-
Spacer(Modifier.width(8.dp))
89-
}
90-
}
91-
}
49+
HorizontalToolbar<ResultOption>(
50+
selectedOption,
51+
modifier = modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp),
52+
label = {
53+
stringResource(it.displayText(wasPromptUsed))
54+
},
55+
onOptionSelected = onResultOptionSelected,
56+
)
9257
}
9358

9459
enum class ResultOption(val displayName: Int) {

0 commit comments

Comments
 (0)