From ce4f7dd4812aad6557f0e4fede6a2a5cd320360f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 17:48:45 +0000 Subject: [PATCH 1/2] Refactor Jetsnack to remove ConstraintLayout dependency Replaced ConstraintLayout usages in `SearchResult` and `CartItem` with standard Compose layouts (Column, Row, Box). Removed `androidx.constraintlayout:constraintlayout-compose` dependency from `Jetsnack/app/build.gradle.kts` and `Jetsnack/gradle/libs.versions.toml`. Co-authored-by: riggaroo <9973046+riggaroo@users.noreply.github.com> --- Jetsnack/app/build.gradle.kts | 1 - .../com/example/jetsnack/ui/home/cart/Cart.kt | 157 +++++++----------- .../jetsnack/ui/home/search/Results.kt | 137 ++++++--------- Jetsnack/gradle/libs.versions.toml | 2 - Jetsnack/test_output.txt | 34 ++++ 5 files changed, 147 insertions(+), 184 deletions(-) create mode 100644 Jetsnack/test_output.txt diff --git a/Jetsnack/app/build.gradle.kts b/Jetsnack/app/build.gradle.kts index b66ac2188..0fca21037 100644 --- a/Jetsnack/app/build.gradle.kts +++ b/Jetsnack/app/build.gradle.kts @@ -119,7 +119,6 @@ dependencies { implementation(libs.androidx.lifecycle.viewModelCompose) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.navigation.compose) - implementation(libs.androidx.constraintlayout.compose) implementation(libs.androidx.compose.runtime) implementation(libs.androidx.compose.foundation) diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt index d62a31d20..6a70cfbe9 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/cart/Cart.kt @@ -65,8 +65,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp -import androidx.constraintlayout.compose.ChainStyle -import androidx.constraintlayout.compose.ConstraintLayout import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.example.jetsnack.R @@ -298,106 +296,77 @@ fun CartItem( modifier: Modifier = Modifier, ) { val snack = orderLine.snack - ConstraintLayout( + Column( modifier = modifier .fillMaxWidth() .clickable { onSnackClick(snack.id, "cart") } .background(JetsnackTheme.colors.uiBackground) - .padding(horizontal = 24.dp), - + .padding(horizontal = 24.dp) ) { - val (divider, image, name, tag, priceSpacer, price, remove, quantity) = createRefs() - createVerticalChain(name, tag, priceSpacer, price, chainStyle = ChainStyle.Packed) - SnackImage( - imageRes = snack.imageRes, - contentDescription = null, - modifier = Modifier - .size(100.dp) - .constrainAs(image) { - top.linkTo(parent.top, margin = 16.dp) - bottom.linkTo(parent.bottom, margin = 16.dp) - start.linkTo(parent.start) - }, - ) - Text( - text = snack.name, - style = MaterialTheme.typography.titleMedium, - color = JetsnackTheme.colors.textSecondary, - modifier = Modifier.constrainAs(name) { - linkTo( - start = image.end, - startMargin = 16.dp, - end = remove.start, - endMargin = 16.dp, - bias = 0f, - ) - }, - ) - IconButton( - onClick = { removeSnack(snack.id) }, - modifier = Modifier - .constrainAs(remove) { - top.linkTo(parent.top) - end.linkTo(parent.end) - } - .padding(top = 12.dp), + Row( + modifier = Modifier.fillMaxWidth() ) { - Icon( - painter = painterResource(id = R.drawable.ic_close), - tint = JetsnackTheme.colors.iconSecondary, - contentDescription = stringResource(R.string.label_remove), + SnackImage( + imageRes = snack.imageRes, + contentDescription = null, + modifier = Modifier + .padding(vertical = 16.dp) + .size(100.dp) ) - } - Text( - text = snack.tagline, - style = MaterialTheme.typography.bodyLarge, - color = JetsnackTheme.colors.textHelp, - modifier = Modifier.constrainAs(tag) { - linkTo( - start = image.end, - startMargin = 16.dp, - end = parent.end, - endMargin = 16.dp, - bias = 0f, - ) - }, - ) - Spacer( - Modifier - .height(8.dp) - .constrainAs(priceSpacer) { - linkTo(top = tag.bottom, bottom = price.top) - }, - ) - Text( - text = formatPrice(snack.price), - style = MaterialTheme.typography.titleMedium, - color = JetsnackTheme.colors.textPrimary, - modifier = Modifier.constrainAs(price) { - linkTo( - start = image.end, - end = quantity.start, - startMargin = 16.dp, - endMargin = 16.dp, - bias = 0f, + Column( + modifier = Modifier + .weight(1f) + .padding(start = 16.dp) + ) { + Row(modifier = Modifier.fillMaxWidth()) { + Text( + text = snack.name, + style = MaterialTheme.typography.titleMedium, + color = JetsnackTheme.colors.textSecondary, + modifier = Modifier + .weight(1f) + .padding(top = 16.dp, end = 16.dp) + ) + IconButton( + onClick = { removeSnack(snack.id) }, + modifier = Modifier.padding(top = 12.dp) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_close), + tint = JetsnackTheme.colors.iconSecondary, + contentDescription = stringResource(R.string.label_remove), + ) + } + } + Text( + text = snack.tagline, + style = MaterialTheme.typography.bodyLarge, + color = JetsnackTheme.colors.textHelp, + modifier = Modifier.padding(end = 16.dp) ) - }, - ) - QuantitySelector( - count = orderLine.count, - decreaseItemCount = { decreaseItemCount(snack.id) }, - increaseItemCount = { increaseItemCount(snack.id) }, - modifier = Modifier.constrainAs(quantity) { - baseline.linkTo(price.baseline) - end.linkTo(parent.end) - }, - ) - JetsnackDivider( - Modifier.constrainAs(divider) { - linkTo(start = parent.start, end = parent.end) - top.linkTo(parent.bottom) - }, - ) + Spacer(Modifier.height(8.dp)) + Row( + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = formatPrice(snack.price), + style = MaterialTheme.typography.titleMedium, + color = JetsnackTheme.colors.textPrimary, + modifier = Modifier + .weight(1f) + .padding(end = 16.dp) + .alignBy(LastBaseline) + ) + QuantitySelector( + count = orderLine.count, + decreaseItemCount = { decreaseItemCount(snack.id) }, + increaseItemCount = { increaseItemCount(snack.id) }, + modifier = Modifier.alignBy(LastBaseline) + ) + } + } + } + JetsnackDivider() } } diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt index 828c8328a..87f0e88a5 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/search/Results.kt @@ -19,8 +19,10 @@ package com.example.jetsnack.ui.home.search import android.content.res.Configuration import androidx.compose.foundation.Image import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -42,8 +44,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.constraintlayout.compose.ChainStyle -import androidx.constraintlayout.compose.ConstraintLayout import com.example.jetsnack.R import com.example.jetsnack.model.Snack import com.example.jetsnack.model.snacks @@ -72,102 +72,65 @@ fun SearchResults(searchResults: List, onSnackClick: (Long, String) -> Un } @Composable -private fun SearchResult(snack: Snack, onSnackClick: (Long, String) -> Unit, showDivider: Boolean, modifier: Modifier = Modifier) { - ConstraintLayout( +private fun SearchResult( + snack: Snack, + onSnackClick: (Long, String) -> Unit, + showDivider: Boolean, + modifier: Modifier = Modifier +) { + Box( modifier = modifier .fillMaxWidth() .clickable { onSnackClick(snack.id, "search") } - .padding(horizontal = 24.dp), + .padding(horizontal = 24.dp) ) { - val (divider, image, name, tag, priceSpacer, price, add) = createRefs() - createVerticalChain(name, tag, priceSpacer, price, chainStyle = ChainStyle.Packed) if (showDivider) { JetsnackDivider( - Modifier.constrainAs(divider) { - linkTo(start = parent.start, end = parent.end) - top.linkTo(parent.top) - }, + Modifier.align(Alignment.TopCenter) ) } - SnackImage( - imageRes = snack.imageRes, - contentDescription = null, - modifier = Modifier - .size(100.dp) - .constrainAs(image) { - linkTo( - top = parent.top, - topMargin = 16.dp, - bottom = parent.bottom, - bottomMargin = 16.dp, - ) - start.linkTo(parent.start) - }, - ) - Text( - text = snack.name, - style = MaterialTheme.typography.titleMedium, - color = JetsnackTheme.colors.textSecondary, - modifier = Modifier.constrainAs(name) { - linkTo( - start = image.end, - startMargin = 16.dp, - end = add.start, - endMargin = 16.dp, - bias = 0f, + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(vertical = 16.dp) + ) { + SnackImage( + imageRes = snack.imageRes, + contentDescription = null, + modifier = Modifier.size(100.dp) + ) + Column( + modifier = Modifier + .weight(1f) + .padding(start = 16.dp, end = 16.dp) + ) { + Text( + text = snack.name, + style = MaterialTheme.typography.titleMedium, + color = JetsnackTheme.colors.textSecondary, ) - }, - ) - Text( - text = snack.tagline, - style = MaterialTheme.typography.bodyLarge, - color = JetsnackTheme.colors.textHelp, - modifier = Modifier.constrainAs(tag) { - linkTo( - start = image.end, - startMargin = 16.dp, - end = add.start, - endMargin = 16.dp, - bias = 0f, + Text( + text = snack.tagline, + style = MaterialTheme.typography.bodyLarge, + color = JetsnackTheme.colors.textHelp, ) - }, - ) - Spacer( - Modifier - .height(8.dp) - .constrainAs(priceSpacer) { - linkTo(top = tag.bottom, bottom = price.top) - }, - ) - Text( - text = formatPrice(snack.price), - style = MaterialTheme.typography.titleMedium, - color = JetsnackTheme.colors.textPrimary, - modifier = Modifier.constrainAs(price) { - linkTo( - start = image.end, - startMargin = 16.dp, - end = add.start, - endMargin = 16.dp, - bias = 0f, + Spacer(Modifier.height(8.dp)) + Text( + text = formatPrice(snack.price), + style = MaterialTheme.typography.titleMedium, + color = JetsnackTheme.colors.textPrimary, ) - }, - ) - JetsnackButton( - onClick = { /* todo */ }, - shape = CircleShape, - contentPadding = PaddingValues(0.dp), - modifier = Modifier - .size(36.dp) - .constrainAs(add) { - linkTo(top = parent.top, bottom = parent.bottom) - end.linkTo(parent.end) - }, - ) { - Icon( - painter = painterResource(id = R.drawable.ic_add), - contentDescription = stringResource(R.string.label_add), - ) + } + JetsnackButton( + onClick = { /* todo */ }, + shape = CircleShape, + contentPadding = PaddingValues(0.dp), + modifier = Modifier.size(36.dp) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_add), + contentDescription = stringResource(R.string.label_add), + ) + } } } } diff --git a/Jetsnack/gradle/libs.versions.toml b/Jetsnack/gradle/libs.versions.toml index 9b01ac78d..8558dce51 100644 --- a/Jetsnack/gradle/libs.versions.toml +++ b/Jetsnack/gradle/libs.versions.toml @@ -5,7 +5,6 @@ androidGradlePlugin = "9.0.0" androidx-activity-compose = "1.12.3" androidx-appcompat = "1.7.1" androidx-compose-bom = "2026.01.01" -androidx-constraintlayout = "1.1.1" androidx-core-splashscreen = "1.2.0" androidx-corektx = "1.17.0" androidx-glance = "1.2.0-rc01" @@ -85,7 +84,6 @@ androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } androidx-compose-ui-util = { module = "androidx.compose.ui:ui-util" } androidx-compose-ui-viewbinding = { module = "androidx.compose.ui:ui-viewbinding" } -androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "androidx-constraintlayout" } androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-corektx" } androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "androidx-core-splashscreen" } androidx-glance = { module = "androidx.glance:glance", version.ref = "androidx-glance" } diff --git a/Jetsnack/test_output.txt b/Jetsnack/test_output.txt new file mode 100644 index 000000000..365a70a15 --- /dev/null +++ b/Jetsnack/test_output.txt @@ -0,0 +1,34 @@ +Configuration on demand is an incubating feature. +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac NO-SOURCE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:javaPreCompileDebugUnitTest FROM-CACHE +> Task :app:bundleDebugClassesToRuntimeJar +> Task :app:processDebugJavaRes UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar +> Task :app:compileDebugUnitTestKotlin NO-SOURCE +> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE +> Task :app:processDebugUnitTestJavaRes NO-SOURCE +> Task :app:testDebugUnitTest NO-SOURCE + +BUILD SUCCESSFUL in 2s +21 actionable tasks: 2 executed, 1 from cache, 18 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.1.0/userguide/configuration_cache_enabling.html From 074421c1150e70974b481bad3c5a13f0a5480d22 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Thu, 19 Feb 2026 17:51:49 +0000 Subject: [PATCH 2/2] Delete Jetsnack/test_output.txt --- Jetsnack/test_output.txt | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 Jetsnack/test_output.txt diff --git a/Jetsnack/test_output.txt b/Jetsnack/test_output.txt deleted file mode 100644 index 365a70a15..000000000 --- a/Jetsnack/test_output.txt +++ /dev/null @@ -1,34 +0,0 @@ -Configuration on demand is an incubating feature. -> Task :app:preBuild UP-TO-DATE -> Task :app:preDebugBuild UP-TO-DATE -> Task :app:generateDebugResources UP-TO-DATE -> Task :app:packageDebugResources UP-TO-DATE -> Task :app:processDebugNavigationResources UP-TO-DATE -> Task :app:parseDebugLocalResources UP-TO-DATE -> Task :app:generateDebugRFile UP-TO-DATE -> Task :app:compileDebugKotlin UP-TO-DATE -> Task :app:javaPreCompileDebug UP-TO-DATE -> Task :app:compileDebugJavaWithJavac NO-SOURCE -> Task :app:checkDebugAarMetadata UP-TO-DATE -> Task :app:compileDebugNavigationResources UP-TO-DATE -> Task :app:mapDebugSourceSetPaths UP-TO-DATE -> Task :app:mergeDebugResources UP-TO-DATE -> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE -> Task :app:extractDeepLinksDebug UP-TO-DATE -> Task :app:processDebugMainManifest UP-TO-DATE -> Task :app:processDebugManifest UP-TO-DATE -> Task :app:processDebugManifestForPackage UP-TO-DATE -> Task :app:processDebugResources UP-TO-DATE -> Task :app:preDebugUnitTestBuild UP-TO-DATE -> Task :app:javaPreCompileDebugUnitTest FROM-CACHE -> Task :app:bundleDebugClassesToRuntimeJar -> Task :app:processDebugJavaRes UP-TO-DATE -> Task :app:bundleDebugClassesToCompileJar -> Task :app:compileDebugUnitTestKotlin NO-SOURCE -> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE -> Task :app:processDebugUnitTestJavaRes NO-SOURCE -> Task :app:testDebugUnitTest NO-SOURCE - -BUILD SUCCESSFUL in 2s -21 actionable tasks: 2 executed, 1 from cache, 18 up-to-date -Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.1.0/userguide/configuration_cache_enabling.html