Skip to content

Commit f89e380

Browse files
committed
Refactor Jetsnack theme to use a unified JetsnackTheme class and one CompositionLocal.
- Deleted `CompositionLocals.kt` which used reflection to access internal Material 3 locals. - Introduced `JetsnackTheme` class to encapsulate `JetsnackColors`, `Typography`, `Shapes`, and `AppStyles`. - Replaced individual `LocalJetsnackColors`, `LocalAppStyles`, and Material 3 `LocalTypography`/`LocalShapes` lookups with `JetsnackTheme.colors`, `JetsnackTheme.typography`, etc. - Added a `StyleScope.currentJetsnackTheme` helper to provide easy access to the theme within `Style` blocks. - Moved `JetsnackColors` and color palette definitions to `Color.kt`. - Updated `debugColors` to include newer Material 3 color roles.
1 parent 5a6bcb8 commit f89e380

19 files changed

Lines changed: 311 additions & 337 deletions

File tree

Jetsnack/app/src/main/java/androidx/compose/material3/CompositionLocals.kt

Lines changed: 0 additions & 41 deletions
This file was deleted.

Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Divider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ import androidx.compose.ui.Modifier
3131
import androidx.compose.ui.tooling.preview.Preview
3232
import androidx.compose.ui.unit.dp
3333
import com.example.jetsnack.ui.theme.JetsnackTheme
34-
import com.example.jetsnack.ui.theme.LocalAppStyles
34+
import com.example.jetsnack.ui.theme.JetsnackTheme.Companion.LocalJetsnackTheme
3535

3636
@Composable
3737
fun JetsnackDivider(
3838
modifier: Modifier = Modifier,
3939
style: Style = Style
4040
) {
41-
Box(modifier = modifier.styleable(null, LocalAppStyles.current.dividerStyle, style))
41+
Box(modifier = modifier.styleable(null, LocalJetsnackTheme.current.appStyles.dividerStyle, style))
4242
}
4343

4444

Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ import androidx.compose.foundation.style.styleable
4040
import androidx.compose.foundation.style.then
4141
import androidx.compose.material3.Icon
4242
import androidx.compose.material3.IconButton
43-
import androidx.compose.material3.LocalShapes
44-
import androidx.compose.material3.LocalTypography
4543
import androidx.compose.runtime.Composable
4644
import androidx.compose.runtime.remember
4745
import androidx.compose.ui.Alignment
@@ -57,7 +55,7 @@ import com.example.jetsnack.R
5755
import com.example.jetsnack.model.Filter
5856
import com.example.jetsnack.ui.FilterSharedElementKey
5957
import com.example.jetsnack.ui.theme.JetsnackTheme
60-
import com.example.jetsnack.ui.theme.LocalJetsnackColors
58+
import com.example.jetsnack.ui.theme.currentJetsnackTheme
6159

6260
@Composable
6361
fun FilterBar(
@@ -100,7 +98,7 @@ fun FilterBar(
10098
FilterChip(
10199
filter = filter,
102100
style = Style {
103-
shape(LocalShapes.currentValue.small)
101+
shape(currentJetsnackTheme.shapes.small)
104102
},
105103
)
106104
}
@@ -141,7 +139,7 @@ fun FilterChip(
141139
animate {
142140
background(
143141
Brush.horizontalGradient(
144-
colors = LocalJetsnackColors.currentValue.interactiveSecondary,
142+
colors = currentJetsnackTheme.colors.interactiveSecondary,
145143
startX = 0f,
146144
endX = 200f,
147145
tileMode = TileMode.Mirror,
@@ -157,7 +155,7 @@ fun FilterChip(
157155
JetsnackText(
158156
text = filter.name,
159157
style = {
160-
jetsnackTextStyle(LocalTypography.currentValue.bodySmall)
158+
jetsnackTextStyle(currentJetsnackTheme.typography.bodySmall)
161159
},
162160
maxLines = 1,
163161
modifier = Modifier.padding(

Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/QuantitySelector.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import androidx.compose.foundation.layout.Row
2424
import androidx.compose.foundation.layout.padding
2525
import androidx.compose.foundation.layout.widthIn
2626
import androidx.compose.foundation.style.ExperimentalFoundationStyleApi
27-
import androidx.compose.material3.LocalTypography
2827
import androidx.compose.runtime.Composable
2928
import androidx.compose.runtime.CompositionLocalProvider
3029
import androidx.compose.ui.Alignment
@@ -39,16 +38,16 @@ import androidx.compose.ui.unit.dp
3938
import androidx.compose.ui.unit.sp
4039
import com.example.jetsnack.R
4140
import com.example.jetsnack.ui.theme.JetsnackTheme
42-
import com.example.jetsnack.ui.theme.LocalJetsnackColors
41+
import com.example.jetsnack.ui.theme.currentJetsnackTheme
4342

4443
@Composable
4544
fun QuantitySelector(count: Int, decreaseItemCount: () -> Unit, increaseItemCount: () -> Unit, modifier: Modifier = Modifier) {
4645
Row(modifier = modifier) {
4746
JetsnackText(
4847
text = stringResource(R.string.quantity),
4948
style = {
50-
jetsnackTextStyle(LocalTypography.currentValue.titleMedium)
51-
contentColor(LocalJetsnackColors.currentValue.textSecondary)
49+
jetsnackTextStyle(currentJetsnackTheme.typography.titleMedium)
50+
contentColor(currentJetsnackTheme.colors.textSecondary)
5251
fontWeight(FontWeight.Normal)
5352
},
5453
modifier = Modifier
@@ -69,9 +68,9 @@ fun QuantitySelector(count: Int, decreaseItemCount: () -> Unit, increaseItemCoun
6968
JetsnackText(
7069
text = "$it",
7170
style = {
72-
jetsnackTextStyle(LocalTypography.currentValue.titleSmall)
71+
jetsnackTextStyle(currentJetsnackTheme.typography.titleSmall)
7372
fontSize(18.sp)
74-
contentColor(LocalJetsnackColors.currentValue.textPrimary)
73+
contentColor(currentJetsnackTheme.colors.textPrimary)
7574
textAlign(TextAlign.Center)
7675
},
7776
modifier = Modifier.widthIn(min = 24.dp),

Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Snacks.kt

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ import androidx.compose.foundation.style.ExperimentalFoundationStyleApi
5353
import androidx.compose.foundation.style.Style
5454
import androidx.compose.material3.Icon
5555
import androidx.compose.material3.IconButton
56-
import androidx.compose.material3.LocalShapes
57-
import androidx.compose.material3.LocalTypography
5856
import androidx.compose.runtime.Composable
5957
import androidx.compose.runtime.CompositionLocalProvider
6058
import androidx.compose.runtime.getValue
@@ -85,7 +83,7 @@ import com.example.jetsnack.ui.SnackSharedElementType
8583
import com.example.jetsnack.ui.snackdetail.nonSpatialExpressiveSpring
8684
import com.example.jetsnack.ui.snackdetail.snackDetailBoundsTransform
8785
import com.example.jetsnack.ui.theme.JetsnackTheme
88-
import com.example.jetsnack.ui.theme.LocalJetsnackColors
86+
import com.example.jetsnack.ui.theme.currentJetsnackTheme
8987

9088
private val HighlightCardWidth = 170.dp
9189
private val HighlightCardPadding = 16.dp
@@ -110,8 +108,8 @@ fun SnackCollection(
110108
JetsnackText(
111109
text = snackCollection.name,
112110
style = {
113-
jetsnackTextStyle(LocalTypography.currentValue.titleLarge)
114-
contentColor(LocalJetsnackColors.currentValue.brand)
111+
jetsnackTextStyle(currentJetsnackTheme.typography.titleLarge)
112+
contentColor(currentJetsnackTheme.colors.brand)
115113
},
116114
maxLines = 1,
117115
overflow = TextOverflow.Ellipsis,
@@ -195,7 +193,7 @@ private fun Snacks(snackCollectionId: Long, snacks: List<Snack>, onSnackClick: (
195193
fun SnackItem(snack: Snack, snackCollectionId: Long, onSnackClick: (Long, String) -> Unit, modifier: Modifier = Modifier) {
196194
JetsnackSurface(
197195
style = {
198-
shape(LocalShapes.currentValue.medium)
196+
shape(currentJetsnackTheme.shapes.medium)
199197
},
200198
modifier = modifier.padding(
201199
start = 4.dp,
@@ -239,8 +237,8 @@ fun SnackItem(snack: Snack, snackCollectionId: Long, onSnackClick: (Long, String
239237
JetsnackText(
240238
text = snack.name,
241239
style = {
242-
jetsnackTextStyle(LocalTypography.currentValue.titleMedium)
243-
contentColor(LocalJetsnackColors.currentValue.textSecondary)
240+
jetsnackTextStyle(currentJetsnackTheme.typography.titleMedium)
241+
contentColor(currentJetsnackTheme.colors.textSecondary)
244242
},
245243
modifier = Modifier
246244
.padding(top = 8.dp)
@@ -400,8 +398,8 @@ private fun HighlightSnackItem(
400398
maxLines = 1,
401399
overflow = TextOverflow.Ellipsis,
402400
style = {
403-
jetsnackTextStyle(LocalTypography.currentValue.titleLarge)
404-
contentColor(LocalJetsnackColors.currentValue.textSecondary)
401+
jetsnackTextStyle(currentJetsnackTheme.typography.titleLarge)
402+
contentColor(currentJetsnackTheme.colors.textSecondary)
405403
},
406404
modifier = Modifier
407405
.padding(horizontal = 16.dp)
@@ -426,8 +424,8 @@ private fun HighlightSnackItem(
426424
JetsnackText(
427425
text = snack.tagline,
428426
style = {
429-
jetsnackTextStyle(LocalTypography.currentValue.bodyLarge)
430-
contentColor(LocalJetsnackColors.currentValue.textHelp)
427+
jetsnackTextStyle(currentJetsnackTheme.typography.bodyLarge)
428+
contentColor(currentJetsnackTheme.colors.textHelp)
431429
},
432430
modifier = Modifier
433431
.padding(horizontal = 16.dp)

Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Text.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import androidx.compose.ui.Modifier
1111
import androidx.compose.ui.text.TextStyle
1212
import androidx.compose.ui.text.TextLayoutResult
1313
import androidx.compose.ui.text.style.TextOverflow
14-
import com.example.jetsnack.ui.theme.LocalAppStyles
14+
import com.example.jetsnack.ui.theme.JetsnackTheme
1515

1616
// Workaround for b/492528450 - setting textStyle currently doesn't set fontFamily.
1717
@ExperimentalFoundationStyleApi
@@ -35,7 +35,7 @@ fun JetsnackText(
3535
) {
3636
BasicText(
3737
text = text,
38-
modifier = modifier.styleable(null, LocalAppStyles.current.defaultTextStyle, style),
38+
modifier = modifier.styleable(null, JetsnackTheme.appStyles.defaultTextStyle, style),
3939
onTextLayout = onTextLayout,
4040
overflow = overflow,
4141
softWrap = softWrap,

Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/DestinationBar.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import androidx.compose.foundation.style.ExperimentalFoundationStyleApi
2929
import androidx.compose.material3.ExperimentalMaterial3Api
3030
import androidx.compose.material3.Icon
3131
import androidx.compose.material3.IconButton
32-
import androidx.compose.material3.LocalTypography
3332
import androidx.compose.material3.TopAppBar
3433
import androidx.compose.material3.TopAppBarDefaults
3534
import androidx.compose.runtime.Composable
@@ -50,7 +49,7 @@ import com.example.jetsnack.ui.components.jetsnackTextStyle
5049
import com.example.jetsnack.ui.snackdetail.spatialExpressiveSpring
5150
import com.example.jetsnack.ui.theme.AlphaNearOpaque
5251
import com.example.jetsnack.ui.theme.JetsnackTheme
53-
import com.example.jetsnack.ui.theme.LocalJetsnackColors
52+
import com.example.jetsnack.ui.theme.currentJetsnackTheme
5453

5554
@OptIn(ExperimentalMaterial3Api::class)
5655
@Composable
@@ -76,8 +75,8 @@ fun DestinationBar(modifier: Modifier = Modifier) {
7675
JetsnackText(
7776
text = "Delivery to 1600 Amphitheater Way",
7877
style = {
79-
jetsnackTextStyle(LocalTypography.currentValue.titleMedium)
80-
contentColor(LocalJetsnackColors.currentValue.textSecondary)
78+
jetsnackTextStyle(currentJetsnackTheme.typography.titleMedium)
79+
contentColor(currentJetsnackTheme.colors.textSecondary)
8180
textAlign(TextAlign.Center)
8281
},
8382
maxLines = 1,

Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/FilterScreen.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ import androidx.compose.foundation.selection.selectable
4646
import androidx.compose.foundation.verticalScroll
4747
import androidx.compose.material3.Icon
4848
import androidx.compose.material3.IconButton
49-
import androidx.compose.material3.LocalTypography
5049
import androidx.compose.material3.MaterialTheme
5150
import androidx.compose.material3.Slider
5251
import androidx.compose.material3.SliderDefaults
@@ -74,7 +73,7 @@ import com.example.jetsnack.ui.components.FilterChip
7473
import com.example.jetsnack.ui.components.JetsnackText
7574
import com.example.jetsnack.ui.components.jetsnackTextStyle
7675
import com.example.jetsnack.ui.theme.JetsnackTheme
77-
import com.example.jetsnack.ui.theme.LocalJetsnackColors
76+
import com.example.jetsnack.ui.theme.currentJetsnackTheme
7877

7978
@Composable
8079
fun FilterScreen(sharedTransitionScope: SharedTransitionScope, animatedVisibilityScope: AnimatedVisibilityScope, onDismiss: () -> Unit) {
@@ -144,7 +143,7 @@ fun FilterScreen(sharedTransitionScope: SharedTransitionScope, animatedVisibilit
144143
.padding(top = 8.dp, end = 48.dp),
145144
style = {
146145
textAlign(TextAlign.Center)
147-
jetsnackTextStyle(LocalTypography.currentValue.titleLarge)
146+
jetsnackTextStyle(currentJetsnackTheme.typography.titleLarge)
148147
}
149148
)
150149
val resetEnabled = sortState != defaultFilter
@@ -162,10 +161,10 @@ fun FilterScreen(sharedTransitionScope: SharedTransitionScope, animatedVisibilit
162161
JetsnackText(
163162
text = stringResource(id = R.string.reset),
164163
style = {
165-
jetsnackTextStyle(LocalTypography.currentValue.bodyMedium)
164+
jetsnackTextStyle(currentJetsnackTheme.typography.bodyMedium)
166165
fontWeight(fontWeight)
167166
contentColor(
168-
LocalJetsnackColors.currentValue.uiBackground
167+
currentJetsnackTheme.colors.uiBackground
169168
.copy(alpha = if (!resetEnabled) 0.38f else 1f)
170169
)
171170
}
@@ -255,8 +254,8 @@ fun MaxCalories(sliderPosition: Float, onValueChanged: (Float) -> Unit) {
255254
JetsnackText(
256255
text = stringResource(id = R.string.per_serving),
257256
style = {
258-
jetsnackTextStyle(LocalTypography.currentValue.bodyMedium)
259-
contentColor(LocalJetsnackColors.currentValue.brand)
257+
jetsnackTextStyle(currentJetsnackTheme.typography.bodyMedium)
258+
contentColor(currentJetsnackTheme.colors.brand)
260259
},
261260
modifier = Modifier.padding(top = 5.dp, start = 10.dp),
262261
)
@@ -283,8 +282,8 @@ fun FilterTitle(text: String) {
283282
JetsnackText(
284283
text = text,
285284
style = {
286-
jetsnackTextStyle(LocalTypography.currentValue.titleLarge)
287-
contentColor(LocalJetsnackColors.currentValue.brand)
285+
jetsnackTextStyle(currentJetsnackTheme.typography.titleLarge)
286+
contentColor(currentJetsnackTheme.colors.brand)
288287
},
289288
modifier = Modifier.padding(bottom = 8.dp),
290289
)
@@ -303,7 +302,7 @@ fun SortOption(text: String, @DrawableRes icon: Int?, onClickOption: () -> Unit,
303302
JetsnackText(
304303
text = text,
305304
style = {
306-
jetsnackTextStyle(LocalTypography.currentValue.titleMedium)
305+
jetsnackTextStyle(currentJetsnackTheme.typography.titleMedium)
307306
},
308307
modifier = Modifier
309308
.padding(start = 10.dp)

Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Home.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import androidx.compose.foundation.layout.wrapContentSize
4141
import androidx.compose.foundation.selection.selectable
4242
import androidx.compose.foundation.shape.RoundedCornerShape
4343
import androidx.compose.material3.Icon
44-
import androidx.compose.material3.LocalTypography
4544
import androidx.compose.runtime.Composable
4645
import androidx.compose.runtime.CompositionLocalProvider
4746
import androidx.compose.runtime.LaunchedEffect
@@ -82,6 +81,7 @@ import com.example.jetsnack.ui.home.search.Search
8281
import com.example.jetsnack.ui.snackdetail.nonSpatialExpressiveSpring
8382
import com.example.jetsnack.ui.snackdetail.spatialExpressiveSpring
8483
import com.example.jetsnack.ui.theme.JetsnackTheme
84+
import com.example.jetsnack.ui.theme.currentJetsnackTheme
8585
import java.util.Locale
8686
import androidx.compose.ui.platform.LocalLocale
8787

@@ -219,7 +219,7 @@ fun JetsnackBottomBar(
219219
text = text,
220220
style = {
221221
contentColor(tint)
222-
jetsnackTextStyle(LocalTypography.currentValue.labelLarge)
222+
jetsnackTextStyle(currentJetsnackTheme.typography.labelLarge)
223223
},
224224
maxLines = 1,
225225
)

Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Profile.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
2525
import androidx.compose.foundation.layout.height
2626
import androidx.compose.foundation.layout.padding
2727
import androidx.compose.foundation.layout.wrapContentSize
28-
import androidx.compose.material3.LocalTypography
2928
import androidx.compose.runtime.Composable
3029
import androidx.compose.ui.Alignment
3130
import androidx.compose.ui.Modifier
@@ -38,6 +37,7 @@ import com.example.jetsnack.R
3837
import com.example.jetsnack.ui.components.JetsnackText
3938
import com.example.jetsnack.ui.components.jetsnackTextStyle
4039
import com.example.jetsnack.ui.theme.JetsnackTheme
40+
import com.example.jetsnack.ui.theme.currentJetsnackTheme
4141

4242
@Composable
4343
fun Profile(modifier: Modifier = Modifier) {
@@ -56,7 +56,7 @@ fun Profile(modifier: Modifier = Modifier) {
5656
JetsnackText(
5757
text = stringResource(R.string.work_in_progress),
5858
style = {
59-
jetsnackTextStyle(LocalTypography.currentValue.titleMedium)
59+
jetsnackTextStyle(currentJetsnackTheme.typography.titleMedium)
6060
textAlign(TextAlign.Center)
6161
},
6262
modifier = Modifier.fillMaxWidth(),
@@ -65,7 +65,7 @@ fun Profile(modifier: Modifier = Modifier) {
6565
JetsnackText(
6666
text = stringResource(R.string.grab_beverage),
6767
style = {
68-
jetsnackTextStyle(LocalTypography.currentValue.bodyMedium)
68+
jetsnackTextStyle(currentJetsnackTheme.typography.bodyMedium)
6969
textAlign(TextAlign.Center)
7070
},
7171
modifier = Modifier.fillMaxWidth(),

0 commit comments

Comments
 (0)