From 56670b0799b8dd7e901375e239cfc93789fbc014 Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Sat, 7 Feb 2026 02:09:34 -0500 Subject: [PATCH 01/32] downloaded filter icon, created divider when viewing favorites, created basic filter button component --- .DS_Store | Bin 0 -> 6148 bytes app/.DS_Store | Bin 8196 -> 8196 bytes app/src/.DS_Store | Bin 0 -> 6148 bytes app/src/main/.DS_Store | Bin 0 -> 6148 bytes .../home/EcosystemBottomSheetContent.kt | 17 ++++++++++++++ .../ui/components/home/FilterButton.kt | 22 ++++++++++++++++++ app/src/main/res/.DS_Store | Bin 0 -> 6148 bytes app/src/main/res/drawable/.DS_Store | Bin 0 -> 6148 bytes app/src/main/res/drawable/filter_icon.png | Bin 0 -> 230 bytes 9 files changed, 39 insertions(+) create mode 100644 .DS_Store create mode 100644 app/src/.DS_Store create mode 100644 app/src/main/.DS_Store create mode 100644 app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt create mode 100644 app/src/main/res/.DS_Store create mode 100644 app/src/main/res/drawable/.DS_Store create mode 100644 app/src/main/res/drawable/filter_icon.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fadd49af93a07740151b4698fdea46e28fdbf625 GIT binary patch literal 6148 zcmeH~I}XA?3`A{6fkcy%avKi74OR$FzyR_M(RA8jQJo4Vo|2_QM{6A`8N(HFEpDCc- z?y%e9rSfe3cs;8hvuf)G2mNw{x1Rtcb`-DRZrCrj0Bf=ZQGxMCz-3^d0zXyY1qdw> AZU6uP literal 0 HcmV?d00001 diff --git a/app/.DS_Store b/app/.DS_Store index a049e3c5398349a378e394f33402fbc957978afe..5e169dde5c2b98363a57c183b5e529628d019676 100644 GIT binary patch delta 132 zcmZp1XmOa}FU-!sz`)4BAi%(ol2V+Ula!yIv$1d*`@{zR&Fma391oQie>1 y9E2K%$vgtjIbk{&Ha`?#ViRCyC}t>PNQQ|rPAq)1nO)*L%jPp8;!Id%?*jlT*e0_8 delta 65 zcmZp1XmOa}FT%pWz`)4BAi%(o$WY9Xnp9p~khC#z3HxSt4i*kZmdVNj&o`?Ieqh~L VqQbbDUE({-W&_cuj2lZ7837wl5V4u3`M`g7D#EfOgRk)$PGpaPQV2S&>%r5BKkQx-ySzvsH0W%E!l7ES!;KH zv9ktX>-*^w7y&HlPOLmk%$N_j;tOYdpMH*)!|itQBJHgMp3+B5_H$d10#ZNMM4T9irw zDe%t}uwk>?toc%Twm!X{*Y{cVb)%DUIm54?049DEf6&9YUwlEXkGI>^N^Y~H72v&$_H&z{0#twsPys4H1tz3G z9^~C}LeIoUp#oH38VcC=p}>tb*@FJ*K=2U&T%hcRwa*e@u>x3=Er<$CqZN!+^)bZi z-VT<$t|nVB+C_8t(7dzS6a&*}7cEF&S{)2jfC`Khm`C2*`M-mIoBu~GOsN1B_%j7` zvE6S6yi}g8AFpTiLso6w;GkcQ@b(jc#E#+>+ztE17GO=bASy8a2)GOkRN$uyya3*! B5qAIp literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 7f86542..731ce35 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -3,13 +3,16 @@ package com.cornellappdev.transit.ui.components.home 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 +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -142,6 +145,20 @@ private fun LazyListScope.favoriteList( favorites: Set, navigateToPlace: (Place) -> Unit ) { + item{ + Spacer(modifier = Modifier.height(20.dp)) + } + + item { + HorizontalDivider(modifier = Modifier.padding(horizontal = 24.dp)) + } + + item{ + Spacer(modifier = Modifier.height(20.dp)) + } + item{ + Text("This will be the filter button!") //TODO: Replace with filter button! + } items(favorites.toList()) { BottomSheetLocationCard( title = it.name, diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt new file mode 100644 index 0000000..271a051 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -0,0 +1,22 @@ +package com.cornellappdev.transit.ui.components.home + +import android.R.attr.text +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview + +@Composable +fun FilterButton(){ + Button(onClick = {}){ + Icon(painter = androidx.compose.ui.res.painterResource(id = com.cornellappdev.transit.R.drawable.filter_icon), contentDescription = "Filter Icon") + Text(text = "Filter") + } +} + +@Preview +@Composable +fun FilterButtonPreview(){ + FilterButton() +} \ No newline at end of file diff --git a/app/src/main/res/.DS_Store b/app/src/main/res/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..11f7bd05484cb42bec8bcbd0dbd3da74adbbb8b5 GIT binary patch literal 6148 zcmeHKJFWsT477O^E75HE%3OgPLjCvdNS`Mcw> zw@n%qpaN8Y3Qz$m@Kyz~yf(A9p31|h02TNK1?>A!;D$AE2=q?}25$j?Q-s|x_g(^6 zEC8&DLm(nB4Jt6Gnk|L~9r2QRHE{?Gx@a~Znm229DC)Q4{Nm}NHIO3}paRbd{KT@g z`oDs|=>MNdTu}ik@Kp-vbh%zG@T9D*qsLjTE$|K8a_(?5%$9j|S%M81ODIGyq<~+9Y z=i?>l>a<4 z9OUlAu-IUHc^Rx$9QP9_ Date: Sat, 7 Feb 2026 02:20:59 -0500 Subject: [PATCH 02/32] Updated filter icon file --- .../ui/components/home/FilterButton.kt | 14 ++++++++++++-- app/src/main/res/drawable/.DS_Store | Bin 6148 -> 6148 bytes app/src/main/res/drawable/filter_icon.png | Bin 230 -> 0 bytes app/src/main/res/drawable/filter_icon.svg | 3 +++ 4 files changed, 15 insertions(+), 2 deletions(-) delete mode 100644 app/src/main/res/drawable/filter_icon.png create mode 100644 app/src/main/res/drawable/filter_icon.svg diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index 271a051..a7d6a5a 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -1,17 +1,27 @@ package com.cornellappdev.transit.ui.components.home import android.R.attr.text +import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.cornellappdev.transit.R @Composable fun FilterButton(){ Button(onClick = {}){ - Icon(painter = androidx.compose.ui.res.painterResource(id = com.cornellappdev.transit.R.drawable.filter_icon), contentDescription = "Filter Icon") - Text(text = "Filter") + Icon( + painter = painterResource(R.drawable.filter_icon), + contentDescription = "Filter Icon", + modifier = Modifier.size(20.dp) + ) + Text(text = "Filter", fontSize = 16.sp) } } diff --git a/app/src/main/res/drawable/.DS_Store b/app/src/main/res/drawable/.DS_Store index 0445557d6d469509eae40fdcdb13aced61eb33b1..6d2d267c19b65032a83198264f14da875de3f0ce 100644 GIT binary patch delta 162 zcmZoMXfc=|#>B)qu~2NHo+2a5#DLw4KQJ;fvP|w{RGnB`mu~2NHo+2aD#DLwC4MbQbPh?V>Y{;}?^A_e{mdyv4Z!>OY=iui6 cD%`x0`8)Guei2I!1|VQ$U|`xDAhLxS01P=3VgLXD diff --git a/app/src/main/res/drawable/filter_icon.png b/app/src/main/res/drawable/filter_icon.png deleted file mode 100644 index a00c2fc1ec0ceba2d7862b3f44a0c6b7b65c88b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngb!3HF=rCELgDb50q$YKTtZeb8+WSBKa0w~B> z9OUlAu-IUHc^Rx$9QP9_ + + From e95dbcaa58e063087ffa43417ace2f076d9fc85d Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Sat, 7 Feb 2026 02:23:46 -0500 Subject: [PATCH 03/32] Added vector asset for filter icon --- .DS_Store | Bin 6148 -> 6148 bytes app/.DS_Store | Bin 8196 -> 8196 bytes app/src/.DS_Store | Bin 6148 -> 6148 bytes app/src/main/.DS_Store | Bin 6148 -> 6148 bytes app/src/main/res/drawable/filter_icon.svg | 3 --- app/src/main/res/drawable/filter_icon.xml | 9 +++++++++ 6 files changed, 9 insertions(+), 3 deletions(-) delete mode 100644 app/src/main/res/drawable/filter_icon.svg create mode 100644 app/src/main/res/drawable/filter_icon.xml diff --git a/.DS_Store b/.DS_Store index fadd49af93a07740151b4698fdea46e28fdbf625..d8d80e1e9363d6e3e88dcd234eef5d6fcddda01c 100644 GIT binary patch delta 142 zcmZoMXfc=|&e%3FQH+&?fq{WzVxou)6OaJ{AexbZL4YASCn-Na2gqb#o|vei4iaZ( zNMtBrC`c(rl7k4P0mZ<|HztO%Pc{%?+04zs!@=0LG4VU|WPTAvQIK{8AWi^ckeLU7 Lm|?S{$bM!3f}b0N delta 103 zcmZoMXfc=|&Zs)EP*|Ulfq{XUA(5egp&+F=IVUMUKL;cP224;IBml$$49Phg*G92V pyb!#ZokM_wQFY_N@640=MHD$fDiT1dC!6pnZ%zyhUB!A;^fH+;#W4aODLiXUIYNG{0~+D delta 30 kcmZp1XmOa}&&a+pU^hP_`(_>i8TN@K_cyakC<5s_0F=!M^Z)<= diff --git a/app/src/.DS_Store b/app/src/.DS_Store index 7b0d36729e2ee777a660f9e8c6709dd97bc2fb68..d549e6c5577d641630f75c73536586f14fb74385 100644 GIT binary patch delta 102 zcmZoMXfc=|&e%3FQH+&?fq{WzVxkBq6OaJ{OcMjF8JQ;PNbs^S}Li59sLu$ delta 76 zcmZoMXfc=|&Zs&uQJ9f&Vvht50|NsS5Q6~Y!~pA!7tGlwUU1#a&LP0TsJijscjn3b aB8r@hKb diff --git a/app/src/main/.DS_Store b/app/src/main/.DS_Store index b7b0f1d5e6189bc4f27e2b4b892a8fb03626997d..80b32329fd6172ceec995c625e6d279db2f01515 100644 GIT binary patch delta 142 zcmZoMXfc=|&e%3FQH+&?fq{WzVxou)6OaJ{AexbZL4YASCn-Na2gqb#o|vei4iaZ( zC}K!uC{8Ixl7k4P0mZ<|HztO%Pc{%?+04zs!@=0LG4VU|WPTAvQIK{8AWi^ckeLU7 Lm|?S{$bM!3hu#~O delta 103 zcmZoMXfc=|&Zs)EP*|Ulfq{XUp@<=sp*W>DIVUMUKL;cP224;IBml$$49Phg*G92V pyb!#ZokM_wQFY_N@640=MHD$fDiT1dC!6pnZ%z - - diff --git a/app/src/main/res/drawable/filter_icon.xml b/app/src/main/res/drawable/filter_icon.xml new file mode 100644 index 0000000..1ba42db --- /dev/null +++ b/app/src/main/res/drawable/filter_icon.xml @@ -0,0 +1,9 @@ + + + From 892ac116a485b85bc8a07e8b8df556f286698702 Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Sat, 7 Feb 2026 02:35:30 -0500 Subject: [PATCH 04/32] Added a call to filter button from ecosystem bottom sheet content, and added TODOs --- .../home/EcosystemBottomSheetContent.kt | 12 ++------- .../ui/components/home/FilterButton.kt | 25 +++++++++++++++---- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 731ce35..0376246 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -145,19 +145,11 @@ private fun LazyListScope.favoriteList( favorites: Set, navigateToPlace: (Place) -> Unit ) { - item{ - Spacer(modifier = Modifier.height(20.dp)) - } - item { - HorizontalDivider(modifier = Modifier.padding(horizontal = 24.dp)) - } - - item{ - Spacer(modifier = Modifier.height(20.dp)) + HorizontalDivider(modifier = Modifier.padding(horizontal = 24.dp, vertical = 20.dp)) } item{ - Text("This will be the filter button!") //TODO: Replace with filter button! + FilterButton(onFilterClick = {}) } items(favorites.toList()) { BottomSheetLocationCard( diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index a7d6a5a..dad68df 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -1,12 +1,15 @@ package com.cornellappdev.transit.ui.components.home import android.R.attr.text +import androidx.compose.foundation.background import androidx.compose.foundation.layout.size import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -14,19 +17,31 @@ import androidx.compose.ui.unit.sp import com.cornellappdev.transit.R @Composable -fun FilterButton(){ - Button(onClick = {}){ +fun FilterButton( + onFilterClick : () -> Unit, + modifier : Modifier = Modifier, + +){ + Button( + onClick = onFilterClick, + colors = ButtonDefaults.buttonColors( + containerColor = Color.Transparent, + //TODO: Add correct color + contentColor = Color.DarkGray + ) + ){ Icon( painter = painterResource(R.drawable.filter_icon), contentDescription = "Filter Icon", - modifier = Modifier.size(20.dp) + modifier = modifier.size(20.dp) ) + //TODO: Add correct font family/weight Text(text = "Filter", fontSize = 16.sp) } } -@Preview +@Preview(showBackground = true) @Composable fun FilterButtonPreview(){ - FilterButton() + FilterButton(onFilterClick = {}) } \ No newline at end of file From 074e75bf29041ed1dfbb3375015bbc5723746fc0 Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Sun, 8 Feb 2026 01:28:19 -0500 Subject: [PATCH 05/32] feat: create simple vers of filter bottom sheet w/ header/footer --- .../home/EcosystemBottomSheetContent.kt | 33 +++++- .../ui/components/home/FilterBottomSheet.kt | 103 ++++++++++++++++++ .../ui/components/home/FilterButton.kt | 7 +- app/src/main/res/.DS_Store | Bin 6148 -> 6148 bytes app/src/main/res/drawable/.DS_Store | Bin 6148 -> 6148 bytes 5 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 0376246..b888ae4 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -12,9 +12,15 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text 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.text.font.FontWeight @@ -40,6 +46,7 @@ import com.cornellappdev.transit.util.ecosystem.toPlace * @param staticPlaces Collection of all places to populate filters with * @param navigateToPlace Function called to navigate to route options */ +@OptIn(ExperimentalMaterial3Api::class) @Composable fun EcosystemBottomSheetContent( filters: List, @@ -52,6 +59,7 @@ fun EcosystemBottomSheetContent( onDetailsClick: (DetailedEcosystemPlace) -> Unit, onFavoriteStarClick: (Place) -> Unit ) { + var showFilterSheet by remember { mutableStateOf(false)} Column(modifier = modifier) { Row( modifier = Modifier @@ -90,9 +98,22 @@ fun EcosystemBottomSheetContent( favorites = favorites, navigateToPlace = navigateToPlace, onDetailsClick = onDetailsClick, - onFavoriteStarClick = onFavoriteStarClick + onFavoriteStarClick = onFavoriteStarClick, + onFilterButtonClick = { showFilterSheet = true} ) } + + if(showFilterSheet) { + ModalBottomSheet( + onDismissRequest = { showFilterSheet = false}, + dragHandle = null + ) { + FilterBottomSheet( + onCancelClicked = { showFilterSheet = false }, + onApplyClicked = { showFilterSheet = false } + ) + } + } } @Composable @@ -102,7 +123,8 @@ private fun BottomSheetFilteredContent( favorites: Set, navigateToPlace: (Place) -> Unit, onDetailsClick: (DetailedEcosystemPlace) -> Unit, - onFavoriteStarClick: (Place) -> Unit + onFavoriteStarClick: (Place) -> Unit, + onFilterButtonClick: () -> Unit ) { LazyColumn( contentPadding = PaddingValues(bottom = 90.dp), @@ -110,7 +132,7 @@ private fun BottomSheetFilteredContent( ) { when (currentFilter) { FilterState.FAVORITES -> { - favoriteList(favorites, navigateToPlace) + favoriteList(favorites, navigateToPlace, onFilterButtonClick) } FilterState.PRINTERS -> { @@ -143,13 +165,14 @@ private fun BottomSheetFilteredContent( */ private fun LazyListScope.favoriteList( favorites: Set, - navigateToPlace: (Place) -> Unit + navigateToPlace: (Place) -> Unit, + onFilterClick: () -> Unit ) { item { HorizontalDivider(modifier = Modifier.padding(horizontal = 24.dp, vertical = 20.dp)) } item{ - FilterButton(onFilterClick = {}) + FilterButton(onFilterClick = onFilterClick) } items(favorites.toList()) { BottomSheetLocationCard( diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt new file mode 100644 index 0000000..c67ba31 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt @@ -0,0 +1,103 @@ +package com.cornellappdev.transit.ui.components.home + +import android.R.attr.fontWeight +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.cornellappdev.transit.ui.theme.SecondaryText +import com.cornellappdev.transit.ui.theme.TransitBlue +import com.cornellappdev.transit.ui.theme.robotoFamily + +@Composable +fun FilterBottomSheet( + onCancelClicked: () -> Unit, + onApplyClicked: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 24.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Location Type", + fontFamily = robotoFamily, + fontStyle = FontStyle.Normal, + fontWeight = FontWeight.SemiBold, + fontSize = 18.sp, + color = SecondaryText + ) + } + + // Add your filter options here + Text( + text = "Filter content goes here", + modifier = Modifier.padding(horizontal = 24.dp) + ) + + Spacer(modifier = Modifier.height(20.dp)) + + // Footer with Cancel and Apply buttons + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + FooterButton(onClick = onCancelClicked, text = "Cancel", modifier = Modifier.weight(0.5f)) + Spacer(modifier = Modifier.width(16.dp)) + FooterButton(onClick = onApplyClicked, text = "Apply", modifier = Modifier.weight(0.5f)) + } + } +} + +@Composable +private fun FooterButton( + onClick : () -> Unit, + text: String, + modifier : Modifier = Modifier +){ + val isCancel = text == "Cancel" + Button( + onClick = onClick, + colors = ButtonDefaults.buttonColors( + backgroundColor = if(isCancel) Color.White else TransitBlue, + contentColor = if(isCancel) TransitBlue else Color.White + ), + shape = RoundedCornerShape(16.dp), + border = if(isCancel) BorderStroke(1.dp, TransitBlue) else null, + modifier = modifier.height(40.dp)) { + Text( + text = text, + fontFamily = robotoFamily, + fontStyle = FontStyle.Normal, + fontSize = 16.sp, + fontWeight = FontWeight.SemiBold + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index dad68df..af5e965 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -1,5 +1,6 @@ package com.cornellappdev.transit.ui.components.home +import android.R.attr.font import android.R.attr.text import androidx.compose.foundation.background import androidx.compose.foundation.layout.size @@ -11,10 +12,12 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.transit.R +import com.cornellappdev.transit.ui.theme.robotoFamily @Composable fun FilterButton( @@ -35,8 +38,8 @@ fun FilterButton( contentDescription = "Filter Icon", modifier = modifier.size(20.dp) ) - //TODO: Add correct font family/weight - Text(text = "Filter", fontSize = 16.sp) + //TODO: Add correct weight + Text(text = "Filter", fontSize = 16.sp, fontFamily = robotoFamily, fontStyle = FontStyle.Normal) } } diff --git a/app/src/main/res/.DS_Store b/app/src/main/res/.DS_Store index 11f7bd05484cb42bec8bcbd0dbd3da74adbbb8b5..aad25ff7af2b2228b91ef07d9b4299b9c35c5ba6 100644 GIT binary patch delta 82 zcmZoMXfc=|&e%S&P;8=}A|unp0PD#HA}ka8Wu-V6QW%OD5*f;YIEf*LAvG>L6djO`mYerKM{FQUuHu-Q@MF!RI)768Du7pDLK delta 57 zcmZoMXfc=|&e%4wP;8=}A|vC(0Ba!8qpB`mu~2NHo+2aD#DLwC4MbQbPh^ss{F$j@vOE*l=2GTKESnE7pJLq1 g&cV+CRJ?g3^LOUS{34bd3_!rhz`(RQKx7Lu0BPqGnE(I) delta 130 zcmZoMXfc=|#>B)qu~2NHo+2a5#DLw4KQJ;fvP|w{lw~ep$eXOgSg#GF8PW?%lKe`G zONtm67|8Pb4s4nqk;Dnk*29s^j_ Date: Sun, 8 Feb 2026 01:47:50 -0500 Subject: [PATCH 06/32] refactor: let viewmodel handle state for fav filter button/sheet --- .../home/EcosystemBottomSheetContent.kt | 19 ++++++++++++------- .../transit/ui/screens/HomeScreen.kt | 8 +++++++- .../transit/ui/viewmodels/HomeViewModel.kt | 7 +++++++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index b888ae4..021bff5 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -57,9 +57,11 @@ fun EcosystemBottomSheetContent( modifier: Modifier = Modifier, navigateToPlace: (Place) -> Unit, onDetailsClick: (DetailedEcosystemPlace) -> Unit, - onFavoriteStarClick: (Place) -> Unit + onFavoriteStarClick: (Place) -> Unit, + showFilterSheet: Boolean, + onFilterSheetDismiss: () -> Unit, + onFilterSheetShow: () -> Unit, ) { - var showFilterSheet by remember { mutableStateOf(false)} Column(modifier = modifier) { Row( modifier = Modifier @@ -99,18 +101,18 @@ fun EcosystemBottomSheetContent( navigateToPlace = navigateToPlace, onDetailsClick = onDetailsClick, onFavoriteStarClick = onFavoriteStarClick, - onFilterButtonClick = { showFilterSheet = true} + onFilterButtonClick = onFilterSheetShow ) } if(showFilterSheet) { ModalBottomSheet( - onDismissRequest = { showFilterSheet = false}, + onDismissRequest = onFilterSheetDismiss, dragHandle = null ) { FilterBottomSheet( - onCancelClicked = { showFilterSheet = false }, - onApplyClicked = { showFilterSheet = false } + onCancelClicked = onFilterSheetDismiss, + onApplyClicked = onFilterSheetDismiss ) } } @@ -325,6 +327,9 @@ private fun PreviewEcosystemBottomSheet() { modifier = Modifier, navigateToPlace = {}, onDetailsClick = {}, - onFavoriteStarClick = {} + onFavoriteStarClick = {}, + showFilterSheet = true, + onFilterSheetDismiss = {}, + onFilterSheetShow = {} ) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt index a90a3b4..941bb2b 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt @@ -191,6 +191,9 @@ fun HomeScreen( // Main search bar active/inactive var searchActive by remember { mutableStateOf(false) } + // Favorite filter bottom sheet state + val showFilterSheet by homeViewModel.showFilterSheet.collectAsState() + // Intercept clicks outside of search bar and disable search @Composable fun Modifier.onTapDisableSearch(): Modifier { @@ -341,7 +344,10 @@ fun HomeScreen( onDetailsClick = { ecosystemSheetState = EcosystemSheetState.Details(it) }, - onFavoriteStarClick = favoritesViewModel::toggleFavorite + onFavoriteStarClick = favoritesViewModel::toggleFavorite, + showFilterSheet = showFilterSheet, + onFilterSheetDismiss = { homeViewModel.toggleFilterSheet(false) }, + onFilterSheetShow = { homeViewModel.toggleFilterSheet(true) } ) } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt index bd7c24d..f4a1802 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt @@ -75,6 +75,13 @@ class HomeViewModel @Inject constructor( val filterState: MutableStateFlow = MutableStateFlow(FilterState.FAVORITES) + private val _showFilterSheet = MutableStateFlow(false) + val showFilterSheet: StateFlow = _showFilterSheet.asStateFlow() + + fun toggleFilterSheet(show: Boolean) { + _showFilterSheet.value = show + } + val staticPlacesFlow = combine( routeRepository.printerFlow, From 3b3d8d17aa8d6444abe826920e277b8c779b8acf Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Mon, 9 Feb 2026 17:45:58 -0500 Subject: [PATCH 07/32] fix: use correct color for filter button text --- .../ui/components/home/EcosystemBottomSheetContent.kt | 5 ++++- .../transit/ui/components/home/FilterButton.kt | 11 ++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 021bff5..a297a32 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -33,6 +33,7 @@ import com.cornellappdev.transit.models.PlaceType import com.cornellappdev.transit.models.ecosystem.DetailedEcosystemPlace import com.cornellappdev.transit.models.ecosystem.StaticPlaces import com.cornellappdev.transit.networking.ApiResponse +import com.cornellappdev.transit.ui.theme.DividerGray import com.cornellappdev.transit.ui.theme.robotoFamily import com.cornellappdev.transit.ui.viewmodels.FilterState import com.cornellappdev.transit.util.ecosystem.toPlace @@ -171,7 +172,9 @@ private fun LazyListScope.favoriteList( onFilterClick: () -> Unit ) { item { - HorizontalDivider(modifier = Modifier.padding(horizontal = 24.dp, vertical = 20.dp)) + HorizontalDivider( + modifier = Modifier.padding(horizontal = 24.dp, vertical = 20.dp) + ) } item{ FilterButton(onFilterClick = onFilterClick) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index af5e965..89d091b 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.transit.R +import com.cornellappdev.transit.ui.theme.SecondaryText import com.cornellappdev.transit.ui.theme.robotoFamily @Composable @@ -29,8 +30,7 @@ fun FilterButton( onClick = onFilterClick, colors = ButtonDefaults.buttonColors( containerColor = Color.Transparent, - //TODO: Add correct color - contentColor = Color.DarkGray + contentColor = SecondaryText ) ){ Icon( @@ -39,7 +39,12 @@ fun FilterButton( modifier = modifier.size(20.dp) ) //TODO: Add correct weight - Text(text = "Filter", fontSize = 16.sp, fontFamily = robotoFamily, fontStyle = FontStyle.Normal) + Text( + text = "Filter", + fontSize = 16.sp, + fontFamily = robotoFamily, + fontStyle = FontStyle.Normal + ) } } From 1df94ec41bb89c6878ec99042297b24ec9c61bb5 Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Mon, 9 Feb 2026 18:45:54 -0500 Subject: [PATCH 08/32] feat: Create grid for filters in favorite filter sheet --- .../home/EcosystemBottomSheetContent.kt | 22 ++++- .../ui/components/home/FilterBottomSheet.kt | 33 +++++-- .../ui/components/home/FilterButton.kt | 5 +- .../ui/components/home/FilterSheetItem.kt | 97 +++++++++++++++++++ .../transit/ui/viewmodels/FilterSheetState.kt | 13 +++ .../transit/ui/viewmodels/FilterState.kt | 2 +- 6 files changed, 162 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt create mode 100644 app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterSheetState.kt diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index a297a32..e2f5967 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -35,6 +35,7 @@ import com.cornellappdev.transit.models.ecosystem.StaticPlaces import com.cornellappdev.transit.networking.ApiResponse import com.cornellappdev.transit.ui.theme.DividerGray import com.cornellappdev.transit.ui.theme.robotoFamily +import com.cornellappdev.transit.ui.viewmodels.FilterSheetState import com.cornellappdev.transit.ui.viewmodels.FilterState import com.cornellappdev.transit.util.ecosystem.toPlace @@ -106,6 +107,15 @@ fun EcosystemBottomSheetContent( ) } + //TODO: Refactor to hoist state up and remove selectedFilters & filterlist + var selectedFilters by remember { mutableStateOf(setOf()) } + val favoriteFilters = listOf( + FilterSheetState.GYMS, + FilterSheetState.EATERIES, + FilterSheetState.LIBRARIES, + FilterSheetState.PRINTERS, + FilterSheetState.OTHER + ) if(showFilterSheet) { ModalBottomSheet( onDismissRequest = onFilterSheetDismiss, @@ -113,7 +123,17 @@ fun EcosystemBottomSheetContent( ) { FilterBottomSheet( onCancelClicked = onFilterSheetDismiss, - onApplyClicked = onFilterSheetDismiss + onApplyClicked = onFilterSheetDismiss, + filters = favoriteFilters, + selectedFilters = selectedFilters, + //TODO: Refactor to move logic outside of composable + onFilterToggle = { filter -> + selectedFilters = if (filter in selectedFilters) { + selectedFilters - filter + } else { + selectedFilters + filter + } + } ) } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt index c67ba31..a21372c 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt @@ -1,5 +1,6 @@ package com.cornellappdev.transit.ui.components.home +import android.R.attr.fontFamily import android.R.attr.fontWeight import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Arrangement @@ -11,6 +12,9 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults @@ -19,6 +23,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -26,11 +31,16 @@ import androidx.compose.ui.unit.sp import com.cornellappdev.transit.ui.theme.SecondaryText import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily +import com.cornellappdev.transit.ui.viewmodels.FilterSheetState +import com.cornellappdev.transit.ui.viewmodels.FilterState @Composable fun FilterBottomSheet( onCancelClicked: () -> Unit, - onApplyClicked: () -> Unit + onApplyClicked: () -> Unit, + filters: List, + selectedFilters: Set, + onFilterToggle: (FilterSheetState) -> Unit, ) { Column( modifier = Modifier @@ -53,11 +63,21 @@ fun FilterBottomSheet( ) } - // Add your filter options here - Text( - text = "Filter content goes here", - modifier = Modifier.padding(horizontal = 24.dp) - ) + LazyVerticalGrid( + columns = GridCells.Fixed(3), + modifier = Modifier.padding(horizontal = 24.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + items(filters) { + FilterSheetItem( + imageResId = it.iconId, + label = it.label, + isActive = it in selectedFilters, + itemOnClick = { onFilterToggle(it) } + ) + } + } Spacer(modifier = Modifier.height(20.dp)) @@ -94,6 +114,7 @@ private fun FooterButton( modifier = modifier.height(40.dp)) { Text( text = text, + style = TextStyle(letterSpacing = 0.sp), fontFamily = robotoFamily, fontStyle = FontStyle.Normal, fontSize = 16.sp, diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index 89d091b..2d3f8d3 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -38,12 +39,12 @@ fun FilterButton( contentDescription = "Filter Icon", modifier = modifier.size(20.dp) ) - //TODO: Add correct weight Text( text = "Filter", fontSize = 16.sp, fontFamily = robotoFamily, - fontStyle = FontStyle.Normal + fontStyle = FontStyle.Normal, + fontWeight = FontWeight.Normal, ) } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt new file mode 100644 index 0000000..6de3aaf --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt @@ -0,0 +1,97 @@ +package com.cornellappdev.transit.ui.components.home + +import androidx.annotation.DrawableRes +import androidx.compose.animation.core.animateFloatAsState +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.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.cornellappdev.transit.R +import com.cornellappdev.transit.ui.theme.Style + +/** + * Card for each filter on home bottom sheet + * @param image The icon for the item + * @param label The label for the item + * @param isActive Whether the filter is selected + */ +@Composable +fun FilterSheetItem( + @DrawableRes imageResId: Int, + label: String, + isActive: Boolean, + itemOnClick: () -> Unit, +) { + val alphaValue: Float by animateFloatAsState(if (isActive) 1f else 0.33f, label = "alpha") + + Column( + modifier = Modifier + .width(88.dp) + .padding(horizontal = 12.dp) + .clickable(onClick = itemOnClick) + ) { + Box( + modifier = Modifier + .height(64.dp) + .width(64.dp) + .align(Alignment.CenterHorizontally) + ) { + Image( + painterResource(id = imageResId), + contentDescription = label, + modifier = Modifier + .size(64.dp) + .align(Alignment.Center), + alpha = alphaValue + ) + } + Text( + label, + color = Color.Black, + textAlign = TextAlign.Center, + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 8.dp, bottom = 4.dp), + style = if (isActive) Style.heading3Emphasized else Style.heading3, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun PreviewFilterSheetItemActive() { + FilterSheetItem( + imageResId = R.drawable.eatery_icon, + label = "Eateries", + isActive = true + ) {} + +} + +@Preview(showBackground = true) +@Composable +private fun InactiveFilterSheetItemInactive() { + FilterSheetItem( + imageResId = R.drawable.eatery_icon, + label = "Eateries", + isActive = false + ) {} + +} diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterSheetState.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterSheetState.kt new file mode 100644 index 0000000..fade17d --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterSheetState.kt @@ -0,0 +1,13 @@ +package com.cornellappdev.transit.ui.viewmodels + +import androidx.annotation.DrawableRes +import com.cornellappdev.transit.R + +//TODO: Use Icons without background +enum class FilterSheetState(@DrawableRes val iconId: Int, val label: String) { + PRINTERS(iconId = R.drawable.printer_icon, label = "Printers"), + GYMS(iconId = R.drawable.gym_icon, label = "Gyms"), + EATERIES(iconId = R.drawable.eatery_icon, label = "Eateries"), + LIBRARIES(iconId = R.drawable.library_icon, label = "Libraries"), + OTHER(iconId = R.drawable.favorites_icon, label = "Other"), +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt index 2ab1fef..2482fd0 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt @@ -11,5 +11,5 @@ enum class FilterState(@DrawableRes val iconId: Int, val label: String) { PRINTERS(iconId = R.drawable.printer_icon, label = "Printers"), GYMS(iconId = R.drawable.gym_icon, label = "Gyms"), EATERIES(iconId = R.drawable.eatery_icon, label = "Eateries"), - LIBRARIES(iconId = R.drawable.library_icon, label = "Libraries") + LIBRARIES(iconId = R.drawable.library_icon, label = "Libraries"), } \ No newline at end of file From c90d948c28ec24a9f5ee40bc48832fee3741ec30 Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Mon, 9 Feb 2026 19:02:45 -0500 Subject: [PATCH 09/32] Add border and background changing functionality when filter item is clicked --- .../ui/components/home/FilterSheetItem.kt | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt index 6de3aaf..2362fdb 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt @@ -1,15 +1,22 @@ package com.cornellappdev.transit.ui.components.home +import android.R.attr.fontWeight +import android.R.attr.letterSpacing +import android.R.attr.maxLines import androidx.annotation.DrawableRes import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -17,12 +24,18 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.cornellappdev.transit.R +import com.cornellappdev.transit.ui.theme.MetadataGray import com.cornellappdev.transit.ui.theme.Style +import com.cornellappdev.transit.ui.theme.TransitBlue +import com.cornellappdev.transit.ui.theme.robotoFamily /** * Card for each filter on home bottom sheet @@ -41,9 +54,16 @@ fun FilterSheetItem( Column( modifier = Modifier - .width(88.dp) - .padding(horizontal = 12.dp) - .clickable(onClick = itemOnClick) + .fillMaxWidth() + .height(90.dp) + .border( + width = 1.dp, + color = if(isActive) TransitBlue else MetadataGray, + shape = RoundedCornerShape(8.dp) + ) + //TODO: Fix background color specifics + .background(color = if(isActive) TransitBlue.copy(alpha = 0.1f) else Color.Transparent, shape = RoundedCornerShape(8.dp)) + .clickable(onClick = itemOnClick), ) { Box( modifier = Modifier @@ -60,14 +80,18 @@ fun FilterSheetItem( alpha = alphaValue ) } + //TODO: Review Text styles once icons are imported correctly Text( label, - color = Color.Black, + color = if(isActive) TransitBlue else MetadataGray, textAlign = TextAlign.Center, modifier = Modifier .align(Alignment.CenterHorizontally) .padding(top = 8.dp, bottom = 4.dp), - style = if (isActive) Style.heading3Emphasized else Style.heading3, + fontSize = 14.sp, + fontWeight = FontWeight.SemiBold, + fontFamily = robotoFamily, + style = TextStyle(letterSpacing = 0.sp), maxLines = 1, overflow = TextOverflow.Ellipsis ) From 74a29aded97bab3480c5732f1922e84fceba41cd Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Tue, 10 Feb 2026 23:54:48 -0500 Subject: [PATCH 10/32] fix: rename FilterSheetState to FavoritesFilterSheetState for clarity --- .../home/EcosystemBottomSheetContent.kt | 20 ++++++++----------- .../ui/components/home/FilterBottomSheet.kt | 12 ++++------- ...tState.kt => FavoritesFilterSheetState.kt} | 2 +- 3 files changed, 13 insertions(+), 21 deletions(-) rename app/src/main/java/com/cornellappdev/transit/ui/viewmodels/{FilterSheetState.kt => FavoritesFilterSheetState.kt} (84%) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index e2f5967..aec5ef8 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -3,10 +3,8 @@ package com.cornellappdev.transit.ui.components.home 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 -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope @@ -29,13 +27,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.transit.R import com.cornellappdev.transit.models.Place -import com.cornellappdev.transit.models.PlaceType import com.cornellappdev.transit.models.ecosystem.DetailedEcosystemPlace import com.cornellappdev.transit.models.ecosystem.StaticPlaces import com.cornellappdev.transit.networking.ApiResponse -import com.cornellappdev.transit.ui.theme.DividerGray import com.cornellappdev.transit.ui.theme.robotoFamily -import com.cornellappdev.transit.ui.viewmodels.FilterSheetState +import com.cornellappdev.transit.ui.viewmodels.FavoritesFilterSheetState import com.cornellappdev.transit.ui.viewmodels.FilterState import com.cornellappdev.transit.util.ecosystem.toPlace @@ -108,13 +104,13 @@ fun EcosystemBottomSheetContent( } //TODO: Refactor to hoist state up and remove selectedFilters & filterlist - var selectedFilters by remember { mutableStateOf(setOf()) } - val favoriteFilters = listOf( - FilterSheetState.GYMS, - FilterSheetState.EATERIES, - FilterSheetState.LIBRARIES, - FilterSheetState.PRINTERS, - FilterSheetState.OTHER + var selectedFilters by remember { mutableStateOf(setOf()) } + val favoriteFilters = listOf( + FavoritesFilterSheetState.GYMS, + FavoritesFilterSheetState.EATERIES, + FavoritesFilterSheetState.LIBRARIES, + FavoritesFilterSheetState.PRINTERS, + FavoritesFilterSheetState.OTHER ) if(showFilterSheet) { ModalBottomSheet( diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt index a21372c..b833ebc 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt @@ -1,7 +1,5 @@ package com.cornellappdev.transit.ui.components.home -import android.R.attr.fontFamily -import android.R.attr.fontWeight import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -10,7 +8,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid @@ -31,16 +28,15 @@ import androidx.compose.ui.unit.sp import com.cornellappdev.transit.ui.theme.SecondaryText import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily -import com.cornellappdev.transit.ui.viewmodels.FilterSheetState -import com.cornellappdev.transit.ui.viewmodels.FilterState +import com.cornellappdev.transit.ui.viewmodels.FavoritesFilterSheetState @Composable fun FilterBottomSheet( onCancelClicked: () -> Unit, onApplyClicked: () -> Unit, - filters: List, - selectedFilters: Set, - onFilterToggle: (FilterSheetState) -> Unit, + filters: List, + selectedFilters: Set, + onFilterToggle: (FavoritesFilterSheetState) -> Unit, ) { Column( modifier = Modifier diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterSheetState.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FavoritesFilterSheetState.kt similarity index 84% rename from app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterSheetState.kt rename to app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FavoritesFilterSheetState.kt index fade17d..ea6743b 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterSheetState.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FavoritesFilterSheetState.kt @@ -4,7 +4,7 @@ import androidx.annotation.DrawableRes import com.cornellappdev.transit.R //TODO: Use Icons without background -enum class FilterSheetState(@DrawableRes val iconId: Int, val label: String) { +enum class FavoritesFilterSheetState(@DrawableRes val iconId: Int, val label: String) { PRINTERS(iconId = R.drawable.printer_icon, label = "Printers"), GYMS(iconId = R.drawable.gym_icon, label = "Gyms"), EATERIES(iconId = R.drawable.eatery_icon, label = "Eateries"), From ece224d88001954f77713863599b79136027c8bb Mon Sep 17 00:00:00 2001 From: H2ODERP <110103899+H2ODERP@users.noreply.github.com> Date: Wed, 11 Feb 2026 00:03:43 -0500 Subject: [PATCH 11/32] fix: rename other FilterBottomSheet components to FavoritesFilterSheet for readability --- .../components/home/EcosystemBottomSheetContent.kt | 2 +- .../ui/components/home/FilterBottomSheet.kt | 4 ++-- .../transit/ui/components/home/FilterSheetItem.kt | 14 +++++--------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index aec5ef8..6113390 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -117,7 +117,7 @@ fun EcosystemBottomSheetContent( onDismissRequest = onFilterSheetDismiss, dragHandle = null ) { - FilterBottomSheet( + FavoritesFilterBottomSheet( onCancelClicked = onFilterSheetDismiss, onApplyClicked = onFilterSheetDismiss, filters = favoriteFilters, diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt index b833ebc..4cf0667 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt @@ -31,7 +31,7 @@ import com.cornellappdev.transit.ui.theme.robotoFamily import com.cornellappdev.transit.ui.viewmodels.FavoritesFilterSheetState @Composable -fun FilterBottomSheet( +fun FavoritesFilterBottomSheet( onCancelClicked: () -> Unit, onApplyClicked: () -> Unit, filters: List, @@ -66,7 +66,7 @@ fun FilterBottomSheet( verticalArrangement = Arrangement.spacedBy(12.dp) ) { items(filters) { - FilterSheetItem( + FavoritesFilterSheetItem( imageResId = it.iconId, label = it.label, isActive = it in selectedFilters, diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt index 2362fdb..36f886a 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt @@ -1,8 +1,5 @@ package com.cornellappdev.transit.ui.components.home -import android.R.attr.fontWeight -import android.R.attr.letterSpacing -import android.R.attr.maxLines import androidx.annotation.DrawableRes import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.Image @@ -33,7 +30,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.transit.R import com.cornellappdev.transit.ui.theme.MetadataGray -import com.cornellappdev.transit.ui.theme.Style import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily @@ -44,7 +40,7 @@ import com.cornellappdev.transit.ui.theme.robotoFamily * @param isActive Whether the filter is selected */ @Composable -fun FilterSheetItem( +fun FavoritesFilterSheetItem( @DrawableRes imageResId: Int, label: String, isActive: Boolean, @@ -100,8 +96,8 @@ fun FilterSheetItem( @Preview(showBackground = true) @Composable -private fun PreviewFilterSheetItemActive() { - FilterSheetItem( +private fun PreviewFavoritesFilterSheetItemActive() { + FavoritesFilterSheetItem( imageResId = R.drawable.eatery_icon, label = "Eateries", isActive = true @@ -111,8 +107,8 @@ private fun PreviewFilterSheetItemActive() { @Preview(showBackground = true) @Composable -private fun InactiveFilterSheetItemInactive() { - FilterSheetItem( +private fun InactiveFavoritesFilterSheetItemInactive() { + FavoritesFilterSheetItem( imageResId = R.drawable.eatery_icon, label = "Eateries", isActive = false From 8845964f8629b3ecfa87a42feb8267f5e8f11b6e Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Thu, 12 Feb 2026 13:41:32 -0500 Subject: [PATCH 12/32] refactor: rename FavoritesFilterBottomSheet files to reflect the name of their components --- .../home/{FilterBottomSheet.kt => FavoritesFilterBottomSheet.kt} | 0 .../home/{FilterSheetItem.kt => FavoritesFilterSheetItem.kt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/com/cornellappdev/transit/ui/components/home/{FilterBottomSheet.kt => FavoritesFilterBottomSheet.kt} (100%) rename app/src/main/java/com/cornellappdev/transit/ui/components/home/{FilterSheetItem.kt => FavoritesFilterSheetItem.kt} (100%) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt similarity index 100% rename from app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterBottomSheet.kt rename to app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt similarity index 100% rename from app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterSheetItem.kt rename to app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt From 57ed6cd6dbe89671b8367aa6c86b7df7d72afd4b Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 01:06:31 -0500 Subject: [PATCH 13/32] feat: add correct icons for filter bottom sheet --- .../ui/viewmodels/FavoritesFilterSheetState.kt | 12 +++++------- app/src/main/res/drawable/eatery_filter_icon.xml | 10 ++++++++++ app/src/main/res/drawable/gym_filter_icon.xml | 14 ++++++++++++++ app/src/main/res/drawable/library_filter_icon.xml | 9 +++++++++ app/src/main/res/drawable/other_filter_icon.xml | 13 +++++++++++++ app/src/main/res/drawable/printer_filter_icon.xml | 12 ++++++++++++ 6 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/eatery_filter_icon.xml create mode 100644 app/src/main/res/drawable/gym_filter_icon.xml create mode 100644 app/src/main/res/drawable/library_filter_icon.xml create mode 100644 app/src/main/res/drawable/other_filter_icon.xml create mode 100644 app/src/main/res/drawable/printer_filter_icon.xml diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FavoritesFilterSheetState.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FavoritesFilterSheetState.kt index ea6743b..c66c3fc 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FavoritesFilterSheetState.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FavoritesFilterSheetState.kt @@ -2,12 +2,10 @@ package com.cornellappdev.transit.ui.viewmodels import androidx.annotation.DrawableRes import com.cornellappdev.transit.R - -//TODO: Use Icons without background enum class FavoritesFilterSheetState(@DrawableRes val iconId: Int, val label: String) { - PRINTERS(iconId = R.drawable.printer_icon, label = "Printers"), - GYMS(iconId = R.drawable.gym_icon, label = "Gyms"), - EATERIES(iconId = R.drawable.eatery_icon, label = "Eateries"), - LIBRARIES(iconId = R.drawable.library_icon, label = "Libraries"), - OTHER(iconId = R.drawable.favorites_icon, label = "Other"), + PRINTERS(iconId = R.drawable.printer_filter_icon, label = "Printers"), + GYMS(iconId = R.drawable.gym_filter_icon, label = "Gyms"), + EATERIES(iconId = R.drawable.eatery_filter_icon, label = "Eateries"), + LIBRARIES(iconId = R.drawable.library_filter_icon, label = "Libraries"), + OTHER(iconId = R.drawable.other_filter_icon, label = "Other"), } \ No newline at end of file diff --git a/app/src/main/res/drawable/eatery_filter_icon.xml b/app/src/main/res/drawable/eatery_filter_icon.xml new file mode 100644 index 0000000..7be303e --- /dev/null +++ b/app/src/main/res/drawable/eatery_filter_icon.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/gym_filter_icon.xml b/app/src/main/res/drawable/gym_filter_icon.xml new file mode 100644 index 0000000..23cae57 --- /dev/null +++ b/app/src/main/res/drawable/gym_filter_icon.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/drawable/library_filter_icon.xml b/app/src/main/res/drawable/library_filter_icon.xml new file mode 100644 index 0000000..8100a5d --- /dev/null +++ b/app/src/main/res/drawable/library_filter_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/other_filter_icon.xml b/app/src/main/res/drawable/other_filter_icon.xml new file mode 100644 index 0000000..b5a1b30 --- /dev/null +++ b/app/src/main/res/drawable/other_filter_icon.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/printer_filter_icon.xml b/app/src/main/res/drawable/printer_filter_icon.xml new file mode 100644 index 0000000..092db40 --- /dev/null +++ b/app/src/main/res/drawable/printer_filter_icon.xml @@ -0,0 +1,12 @@ + + + + From b1c41ec386ef0110c10b9bbad9f21879c7dd85df Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 01:33:21 -0500 Subject: [PATCH 14/32] feat: create reusable color for highlighted backgrounds --- app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt index 7230a12..947105f 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt @@ -11,6 +11,7 @@ val PurpleGray40 = Color(0xFF625b71) val Pink40 = Color(0xFF7D5260) val TransitBlue = Color(0xff079ddc) +val MutedTransitBlue = Color(0xFFD6F3FF) val PrimaryText = Color(0xff212121) val TextButtonGray = Color(0xff6A737D) val SecondaryText = Color(0xff616161) From 4ac9ec82d8afda3269d17341e85e24408743a961 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 01:34:02 -0500 Subject: [PATCH 15/32] fix: use icon instead of image + fix formatting issues to fit designs --- .../home/FavoritesFilterBottomSheet.kt | 2 +- .../home/FavoritesFilterSheetItem.kt | 44 ++++++++----------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt index 4cf0667..beca711 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt @@ -67,7 +67,7 @@ fun FavoritesFilterBottomSheet( ) { items(filters) { FavoritesFilterSheetItem( - imageResId = it.iconId, + iconId = it.iconId, label = it.label, isActive = it in selectedFilters, itemOnClick = { onFilterToggle(it) } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt index 36f886a..50c8d86 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt @@ -8,12 +8,14 @@ import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -30,24 +32,23 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.transit.R import com.cornellappdev.transit.ui.theme.MetadataGray +import com.cornellappdev.transit.ui.theme.MutedTransitBlue import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily /** * Card for each filter on home bottom sheet - * @param image The icon for the item + * @param iconId The icon for the item * @param label The label for the item * @param isActive Whether the filter is selected */ @Composable fun FavoritesFilterSheetItem( - @DrawableRes imageResId: Int, + @DrawableRes iconId: Int, label: String, isActive: Boolean, itemOnClick: () -> Unit, ) { - val alphaValue: Float by animateFloatAsState(if (isActive) 1f else 0.33f, label = "alpha") - Column( modifier = Modifier .fillMaxWidth() @@ -58,32 +59,25 @@ fun FavoritesFilterSheetItem( shape = RoundedCornerShape(8.dp) ) //TODO: Fix background color specifics - .background(color = if(isActive) TransitBlue.copy(alpha = 0.1f) else Color.Transparent, shape = RoundedCornerShape(8.dp)) + .background(color = if(isActive) MutedTransitBlue else Color.Transparent, shape = RoundedCornerShape(8.dp)) + .padding(vertical = 16.dp) .clickable(onClick = itemOnClick), + horizontalAlignment = Alignment.CenterHorizontally ) { - Box( + Icon( + painterResource(id = iconId), + contentDescription = label, modifier = Modifier - .height(64.dp) - .width(64.dp) - .align(Alignment.CenterHorizontally) - ) { - Image( - painterResource(id = imageResId), - contentDescription = label, - modifier = Modifier - .size(64.dp) - .align(Alignment.Center), - alpha = alphaValue - ) - } - //TODO: Review Text styles once icons are imported correctly + .size(34.dp), + tint = if(isActive) TransitBlue else Color.Unspecified + ) + + Spacer(modifier = Modifier.height(8.dp)) + Text( label, color = if(isActive) TransitBlue else MetadataGray, textAlign = TextAlign.Center, - modifier = Modifier - .align(Alignment.CenterHorizontally) - .padding(top = 8.dp, bottom = 4.dp), fontSize = 14.sp, fontWeight = FontWeight.SemiBold, fontFamily = robotoFamily, @@ -98,7 +92,7 @@ fun FavoritesFilterSheetItem( @Composable private fun PreviewFavoritesFilterSheetItemActive() { FavoritesFilterSheetItem( - imageResId = R.drawable.eatery_icon, + iconId = R.drawable.eatery_filter_icon, label = "Eateries", isActive = true ) {} @@ -109,7 +103,7 @@ private fun PreviewFavoritesFilterSheetItemActive() { @Composable private fun InactiveFavoritesFilterSheetItemInactive() { FavoritesFilterSheetItem( - imageResId = R.drawable.eatery_icon, + iconId = R.drawable.eatery_filter_icon, label = "Eateries", isActive = false ) {} From b36124e3aa83ca562e341d297891e419b740a20b Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 01:39:22 -0500 Subject: [PATCH 16/32] fix: move clickable modifier in front of padding for more accurate clicking experience --- .../ui/components/home/FavoritesFilterSheetItem.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt index 50c8d86..e7db02c 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt @@ -35,6 +35,7 @@ import com.cornellappdev.transit.ui.theme.MetadataGray import com.cornellappdev.transit.ui.theme.MutedTransitBlue import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily +import com.google.common.math.LinearTransformation.vertical /** * Card for each filter on home bottom sheet @@ -58,10 +59,13 @@ fun FavoritesFilterSheetItem( color = if(isActive) TransitBlue else MetadataGray, shape = RoundedCornerShape(8.dp) ) - //TODO: Fix background color specifics - .background(color = if(isActive) MutedTransitBlue else Color.Transparent, shape = RoundedCornerShape(8.dp)) - .padding(vertical = 16.dp) - .clickable(onClick = itemOnClick), + .background( + color = if(isActive) MutedTransitBlue + else Color.Transparent, + shape = RoundedCornerShape(8.dp) + ) + .clickable(onClick = itemOnClick) + .padding(vertical = 16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Icon( From 04f9007061f8f43c1207056488c6a42431893147 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 01:44:04 -0500 Subject: [PATCH 17/32] chore: remove unused imports --- .../transit/ui/components/home/FavoritesFilterSheetItem.kt | 6 ------ .../transit/ui/components/home/FilterButton.kt | 5 +---- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt index e7db02c..3886c39 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt @@ -1,24 +1,19 @@ package com.cornellappdev.transit.ui.components.home import androidx.annotation.DrawableRes -import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -35,7 +30,6 @@ import com.cornellappdev.transit.ui.theme.MetadataGray import com.cornellappdev.transit.ui.theme.MutedTransitBlue import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily -import com.google.common.math.LinearTransformation.vertical /** * Card for each filter on home bottom sheet diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index 2d3f8d3..36b2e3e 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -1,8 +1,5 @@ package com.cornellappdev.transit.ui.components.home -import android.R.attr.font -import android.R.attr.text -import androidx.compose.foundation.background import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -51,6 +48,6 @@ fun FilterButton( @Preview(showBackground = true) @Composable -fun FilterButtonPreview(){ +private fun FilterButtonPreview(){ FilterButton(onFilterClick = {}) } \ No newline at end of file From 903c2e1ee0cdaee2deb2cafe40b083abf21ee4f8 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 11:56:55 -0500 Subject: [PATCH 18/32] fix: change padding values to match design, and refactor how padding is provided between cards --- .../components/home/EcosystemBottomSheetContent.kt | 13 +++++-------- .../ui/components/home/RoundedImagePlaceCard.kt | 1 - 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 907e792..642d346 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -90,7 +90,7 @@ fun EcosystemBottomSheetContent( ) } - LazyRow { + LazyRow(modifier = Modifier.padding(bottom = 12.dp)) { items(filters) { BottomSheetFilterItem( imageResId = it.iconId, @@ -161,13 +161,14 @@ private fun BottomSheetFilteredContent( Column() { if (currentFilter == FilterState.FAVORITES) { Column(modifier = Modifier.padding(horizontal = 12.dp)) { - HorizontalDivider(modifier = Modifier.padding(top = 20.dp, bottom = 8.dp)) + HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) FilterButton(onFilterClick = onFilterButtonClick) } } LazyColumn( - contentPadding = PaddingValues(start = 12.dp, end = 12.dp, top = if (currentFilter == FilterState.FAVORITES) 0.dp else 20.dp, bottom = 90.dp), - modifier = Modifier.fillMaxSize() + contentPadding = PaddingValues(start = 12.dp, end = 12.dp, top = if (currentFilter == FilterState.FAVORITES) 0.dp else 8.dp, bottom = 90.dp), + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(20.dp) ) { when (currentFilter) { FilterState.FAVORITES -> { @@ -221,7 +222,6 @@ private fun LazyListScope.favoriteList( item{ Spacer(modifier = Modifier.height(8.dp)) AddFavoritesButton(onAddFavoritesClick = onAddFavoritesClick) - Spacer(modifier = Modifier.height(20.dp)) } items(favorites.toList()) { BottomSheetLocationCard( @@ -230,7 +230,6 @@ private fun LazyListScope.favoriteList( ) { //TODO: Eatery } - Spacer(Modifier.height(10.dp)) } } @@ -331,7 +330,6 @@ private fun LazyListScope.eateryList( ) { onDetailsClick(it) } - Spacer(Modifier.height(10.dp)) } } } @@ -367,7 +365,6 @@ private fun LazyListScope.libraryList( ) { navigateToDetails(it) } - Spacer(Modifier.height(10.dp)) } } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/RoundedImagePlaceCard.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/RoundedImagePlaceCard.kt index 9fa4ab0..d659ba7 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/RoundedImagePlaceCard.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/RoundedImagePlaceCard.kt @@ -43,7 +43,6 @@ fun RoundedImagePlaceCard( ) { Column( modifier = Modifier - .padding(horizontal = 24.dp, vertical = 10.dp) .clickable { onClick() } ) { Column( From 072e774203e7a6de9caa40b42ce9917842eafb6d Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:27:25 -0500 Subject: [PATCH 19/32] fix: move filter logic to HomeViewModel and add filter labels --- .../home/EcosystemBottomSheetContent.kt | 46 ++++++------- .../transit/ui/components/home/FilterRow.kt | 64 +++++++++++++++++++ .../transit/ui/screens/HomeScreen.kt | 3 +- .../transit/ui/viewmodels/HomeViewModel.kt | 38 +++++++++++ 4 files changed, 122 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 642d346..0a8b2d5 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope @@ -20,9 +19,6 @@ import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text 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.text.AnnotatedString @@ -31,6 +27,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.cornellappdev.transit.R import com.cornellappdev.transit.models.Place import com.cornellappdev.transit.models.ecosystem.DayOperatingHours @@ -39,7 +36,6 @@ import com.cornellappdev.transit.models.ecosystem.Eatery import com.cornellappdev.transit.models.ecosystem.StaticPlaces import com.cornellappdev.transit.networking.ApiResponse import com.cornellappdev.transit.ui.theme.robotoFamily -import com.cornellappdev.transit.ui.viewmodels.FavoritesFilterSheetState import com.cornellappdev.transit.ui.viewmodels.FilterState import com.cornellappdev.transit.ui.viewmodels.HomeViewModel import com.cornellappdev.transit.util.ecosystem.toPlace @@ -66,9 +62,9 @@ fun EcosystemBottomSheetContent( onDetailsClick: (DetailedEcosystemPlace) -> Unit, onFavoriteStarClick: (Place) -> Unit, showFilterSheet: Boolean, - onFilterSheetDismiss: () -> Unit, onFilterSheetShow: () -> Unit, onAddFavoritesClick: () -> Unit, + homeViewModel: HomeViewModel = hiltViewModel(), ) { Column(modifier = modifier) { Row( @@ -114,32 +110,26 @@ fun EcosystemBottomSheetContent( ) } - //TODO: Refactor to hoist state up and remove selectedFilters & filterlist - var selectedFilters by remember { mutableStateOf(setOf()) } - val favoriteFilters = listOf( - FavoritesFilterSheetState.GYMS, - FavoritesFilterSheetState.EATERIES, - FavoritesFilterSheetState.LIBRARIES, - FavoritesFilterSheetState.PRINTERS, - FavoritesFilterSheetState.OTHER - ) + val selectedFilters by homeViewModel.selectedFavoritesFilters.collectAsStateWithLifecycle() + if(showFilterSheet) { ModalBottomSheet( - onDismissRequest = onFilterSheetDismiss, + onDismissRequest = { + homeViewModel.cancelFavoritesFilters() + }, dragHandle = null ) { FavoritesFilterBottomSheet( - onCancelClicked = onFilterSheetDismiss, - onApplyClicked = onFilterSheetDismiss, - filters = favoriteFilters, + onCancelClicked = { + homeViewModel.cancelFavoritesFilters() + }, + onApplyClicked = { + homeViewModel.applyFavoritesFilters() + }, + filters = homeViewModel.favoritesFilterList, selectedFilters = selectedFilters, - //TODO: Refactor to move logic outside of composable onFilterToggle = { filter -> - selectedFilters = if (filter in selectedFilters) { - selectedFilters - filter - } else { - selectedFilters + filter - } + homeViewModel.toggleFavoritesFilter(filter) } ) } @@ -162,7 +152,10 @@ private fun BottomSheetFilteredContent( if (currentFilter == FilterState.FAVORITES) { Column(modifier = Modifier.padding(horizontal = 12.dp)) { HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) - FilterButton(onFilterClick = onFilterButtonClick) + FilterRow( + selectedFilters = homeViewModel.appliedFavoritesFilters.collectAsStateWithLifecycle().value, + onFilterClick = onFilterButtonClick + ) } } LazyColumn( @@ -396,7 +389,6 @@ private fun PreviewEcosystemBottomSheet() { onFavoriteStarClick = {}, onAddFavoritesClick = {}, showFilterSheet = true, - onFilterSheetDismiss = {}, onFilterSheetShow = {} ) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt new file mode 100644 index 0000000..22e4fa5 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt @@ -0,0 +1,64 @@ +package com.cornellappdev.transit.ui.components.home + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.cornellappdev.transit.ui.viewmodels.FavoritesFilterSheetState + +@OptIn(ExperimentalLayoutApi::class) +@Composable +fun FilterRow( + selectedFilters: Set, + onFilterClick: () -> Unit, + modifier: Modifier = Modifier +) { + Column(modifier = modifier) { + // Filter button + FilterButton(onFilterClick = onFilterClick) + + // Selected filter labels + if (selectedFilters.isNotEmpty()) { + Spacer(modifier = Modifier.height(8.dp)) + FlowRow( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + selectedFilters.forEach { filter -> + FilterLabel(text = filter.label) + } + } + } + } +} + +@Composable +private fun FilterLabel( + text: String, + modifier: Modifier = Modifier +) { + Surface( + modifier = modifier, + shape = RoundedCornerShape(16.dp), + color = MaterialTheme.colorScheme.primaryContainer + ) { + Text( + text = text, + modifier = Modifier.padding(horizontal = 12.dp, vertical = 6.dp), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onPrimaryContainer + ) + } +} diff --git a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt index 53cd350..1de15e3 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt @@ -344,8 +344,7 @@ fun HomeScreen( homeViewModel.toggleAddFavoritesSheet(true) }, showFilterSheet = showFilterSheet, - onFilterSheetDismiss = { homeViewModel.toggleFilterSheet(false) }, - onFilterSheetShow = { homeViewModel.toggleFilterSheet(true) } + onFilterSheetShow = { homeViewModel.openFilterSheet() } ) } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt index 90ceefb..ebd020f 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt @@ -127,6 +127,44 @@ class HomeViewModel @Inject constructor( fun toggleAddFavoritesSheet(show: Boolean) { _showAddFavoritesSheet.value = show } + val favoritesFilterList = listOf( + FavoritesFilterSheetState.GYMS, + FavoritesFilterSheetState.EATERIES, + FavoritesFilterSheetState.LIBRARIES, + FavoritesFilterSheetState.PRINTERS, + FavoritesFilterSheetState.OTHER + ) + + private val _selectedFavoritesFilters = MutableStateFlow>(emptySet()) + val selectedFavoritesFilters: StateFlow> = _selectedFavoritesFilters.asStateFlow() + + private val _appliedFavoritesFilters = MutableStateFlow>(emptySet()) + val appliedFavoritesFilters: StateFlow> = _appliedFavoritesFilters.asStateFlow() + + fun toggleFavoritesFilter(filter: FavoritesFilterSheetState) { + _selectedFavoritesFilters.value = if (filter in _selectedFavoritesFilters.value) { + _selectedFavoritesFilters.value - filter + } else { + _selectedFavoritesFilters.value + filter + } + } + fun applyFavoritesFilters() { + // Save the current selection as applied filters + _appliedFavoritesFilters.value = _selectedFavoritesFilters.value + toggleFilterSheet(false) + } + + fun cancelFavoritesFilters() { + // Restore the previously applied filters + _selectedFavoritesFilters.value = _appliedFavoritesFilters.value + toggleFilterSheet(false) + } + + fun openFilterSheet() { + // Initialize selected filters with currently applied filters + _selectedFavoritesFilters.value = _appliedFavoritesFilters.value + toggleFilterSheet(true) + } init { From 7d807bbb45b53edbdd0dd0a4f2bfbe269fb0a215 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:55:40 -0500 Subject: [PATCH 20/32] feat: make filter labels on par with design and include close functionality --- .../home/EcosystemBottomSheetContent.kt | 3 +- .../transit/ui/components/home/FilterRow.kt | 71 +++++++++++++++---- .../transit/ui/viewmodels/HomeViewModel.kt | 5 ++ 3 files changed, 66 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 0a8b2d5..5bfeb34 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -154,7 +154,8 @@ private fun BottomSheetFilteredContent( HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) FilterRow( selectedFilters = homeViewModel.appliedFavoritesFilters.collectAsStateWithLifecycle().value, - onFilterClick = onFilterButtonClick + onFilterClick = onFilterButtonClick, + onRemoveFilter = { filter -> homeViewModel.removeAppliedFilter(filter) } ) } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt index 22e4fa5..9913592 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt @@ -1,43 +1,64 @@ package com.cornellappdev.transit.ui.components.home +import android.R.attr.contentDescription +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.cornellappdev.transit.ui.theme.TransitBlue +import com.cornellappdev.transit.ui.theme.robotoFamily import com.cornellappdev.transit.ui.viewmodels.FavoritesFilterSheetState +import com.google.common.math.LinearTransformation.horizontal @OptIn(ExperimentalLayoutApi::class) @Composable fun FilterRow( selectedFilters: Set, onFilterClick: () -> Unit, + onRemoveFilter: (FavoritesFilterSheetState) -> Unit, modifier: Modifier = Modifier ) { - Column(modifier = modifier) { - // Filter button + Row(modifier = modifier) { FilterButton(onFilterClick = onFilterClick) // Selected filter labels if (selectedFilters.isNotEmpty()) { - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = Modifier.width(8.dp)) FlowRow( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { selectedFilters.forEach { filter -> - FilterLabel(text = filter.label) + FilterLabel( + text = filter.label, + onRemove = { onRemoveFilter(filter) } + ) } } } @@ -47,18 +68,44 @@ fun FilterRow( @Composable private fun FilterLabel( text: String, + onRemove: () -> Unit, modifier: Modifier = Modifier ) { Surface( modifier = modifier, - shape = RoundedCornerShape(16.dp), - color = MaterialTheme.colorScheme.primaryContainer + shape = RoundedCornerShape(40.dp), + border = BorderStroke(1.dp, TransitBlue) ) { - Text( - text = text, - modifier = Modifier.padding(horizontal = 12.dp, vertical = 6.dp), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onPrimaryContainer - ) + Row( + modifier = modifier.padding(start = 14.dp, top = 10.dp, bottom = 10.dp, end = 8.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = text, + fontSize = 16.sp, + fontWeight = FontWeight.Normal, + fontFamily = robotoFamily, + color = TransitBlue + ) + IconButton( + onClick = onRemove, + modifier = Modifier.size(20.dp) + ) { + Icon( + imageVector = Icons.Default.Close, + tint = TransitBlue, + contentDescription = "Remove filter", + modifier = Modifier.size(20.dp) + ) + } + } + } } + +@Preview +@Composable +private fun FilterLabelPreview(){ + FilterLabel("Eateries", {}) +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt index ebd020f..a9c10ff 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt @@ -154,6 +154,11 @@ class HomeViewModel @Inject constructor( toggleFilterSheet(false) } + fun removeAppliedFilter(filter: FavoritesFilterSheetState) { + _selectedFavoritesFilters.value = _selectedFavoritesFilters.value - filter + _appliedFavoritesFilters.value = _appliedFavoritesFilters.value - filter + } + fun cancelFavoritesFilters() { // Restore the previously applied filters _selectedFavoritesFilters.value = _appliedFavoritesFilters.value From b182f143d5132b6d17c8395b672b70fc948414fb Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 17:27:00 -0500 Subject: [PATCH 21/32] fix: make formatting closer to design --- .../home/EcosystemBottomSheetContent.kt | 7 +++- .../transit/ui/components/home/FilterRow.kt | 37 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 5bfeb34..7258aff 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -16,6 +16,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.OutlinedTextFieldDefaults.contentPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -148,19 +149,21 @@ private fun BottomSheetFilteredContent( onAddFavoritesClick: () -> Unit, onFilterButtonClick: () -> Unit ) { + val appliedFilters by homeViewModel.appliedFavoritesFilters.collectAsStateWithLifecycle() Column() { if (currentFilter == FilterState.FAVORITES) { Column(modifier = Modifier.padding(horizontal = 12.dp)) { HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) FilterRow( - selectedFilters = homeViewModel.appliedFavoritesFilters.collectAsStateWithLifecycle().value, + selectedFilters = appliedFilters, onFilterClick = onFilterButtonClick, onRemoveFilter = { filter -> homeViewModel.removeAppliedFilter(filter) } ) } } + val showLessPadding = currentFilter == FilterState.FAVORITES && appliedFilters.isEmpty() LazyColumn( - contentPadding = PaddingValues(start = 12.dp, end = 12.dp, top = if (currentFilter == FilterState.FAVORITES) 0.dp else 8.dp, bottom = 90.dp), + contentPadding = PaddingValues(start = 12.dp, end = 12.dp, top = if (showLessPadding) 0.dp else 8.dp, bottom = 90.dp), modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.spacedBy(20.dp) ) { diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt index 9913592..f8777f4 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt @@ -43,23 +43,20 @@ fun FilterRow( onRemoveFilter: (FavoritesFilterSheetState) -> Unit, modifier: Modifier = Modifier ) { - Row(modifier = modifier) { - FilterButton(onFilterClick = onFilterClick) + FlowRow(modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + FilterButton(onFilterClick = onFilterClick, modifier = Modifier.align(Alignment.CenterVertically)) // Selected filter labels if (selectedFilters.isNotEmpty()) { - Spacer(modifier = Modifier.width(8.dp)) - FlowRow( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - selectedFilters.forEach { filter -> - FilterLabel( - text = filter.label, - onRemove = { onRemoveFilter(filter) } - ) - } + selectedFilters.forEach { filter -> + FilterLabel( + text = filter.label, + onRemove = { onRemoveFilter(filter) }, + modifier = Modifier.align(Alignment.CenterVertically) + ) } } } @@ -104,6 +101,18 @@ private fun FilterLabel( } } +@Preview +@Composable +private fun FilterRowPreview() { + FilterRow( + selectedFilters = setOf(FavoritesFilterSheetState.EATERIES), + onFilterClick = {}, + onRemoveFilter = {} + ) + + +} + @Preview @Composable private fun FilterLabelPreview(){ From 2259ebd496d75370a4105513edcc6ea78fe0aa48 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 17:35:59 -0500 Subject: [PATCH 22/32] chore: fix formatting and naming, as well as remove unused imports --- .../home/EcosystemBottomSheetContent.kt | 14 ++++++---- .../ui/components/home/FilterButton.kt | 10 +++---- .../transit/ui/components/home/FilterRow.kt | 28 ++++++++----------- .../transit/ui/viewmodels/HomeViewModel.kt | 14 +++++++--- 4 files changed, 36 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 7258aff..c33b780 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -113,7 +113,7 @@ fun EcosystemBottomSheetContent( val selectedFilters by homeViewModel.selectedFavoritesFilters.collectAsStateWithLifecycle() - if(showFilterSheet) { + if (showFilterSheet) { ModalBottomSheet( onDismissRequest = { homeViewModel.cancelFavoritesFilters() @@ -161,9 +161,14 @@ private fun BottomSheetFilteredContent( ) } } - val showLessPadding = currentFilter == FilterState.FAVORITES && appliedFilters.isEmpty() + val isFilterBarHidden = currentFilter == FilterState.FAVORITES && appliedFilters.isEmpty() LazyColumn( - contentPadding = PaddingValues(start = 12.dp, end = 12.dp, top = if (showLessPadding) 0.dp else 8.dp, bottom = 90.dp), + contentPadding = PaddingValues( + start = 12.dp, + end = 12.dp, + top = if (isFilterBarHidden) 0.dp else 8.dp, + bottom = 90.dp + ), modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.spacedBy(20.dp) ) { @@ -216,7 +221,7 @@ private fun LazyListScope.favoriteList( navigateToPlace: (Place) -> Unit, onAddFavoritesClick: () -> Unit ) { - item{ + item { Spacer(modifier = Modifier.height(8.dp)) AddFavoritesButton(onAddFavoritesClick = onAddFavoritesClick) } @@ -252,7 +257,6 @@ private fun LazyListScope.gymList( ) { //TODO: Eatery } - Spacer(Modifier.height(10.dp)) } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index b51c79d..113af02 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -23,10 +23,10 @@ import com.cornellappdev.transit.ui.theme.robotoFamily @Composable fun FilterButton( - onFilterClick : () -> Unit, - modifier : Modifier = Modifier, + onFilterClick: () -> Unit, + modifier: Modifier = Modifier, -){ + ) { Button( onClick = onFilterClick, colors = ButtonDefaults.buttonColors( @@ -34,7 +34,7 @@ fun FilterButton( contentColor = SecondaryText ), contentPadding = PaddingValues(horizontal = 8.dp, vertical = 0.dp) - ){ + ) { Icon( painter = painterResource(R.drawable.filter_icon), contentDescription = "Filter Icon", @@ -55,6 +55,6 @@ fun FilterButton( @Preview(showBackground = true) @Composable -private fun FilterButtonPreview(){ +private fun FilterButtonPreview() { FilterButton(onFilterClick = {}) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt index f8777f4..491ac29 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt @@ -1,31 +1,23 @@ package com.cornellappdev.transit.ui.components.home -import android.R.attr.contentDescription import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource +import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -33,7 +25,6 @@ import androidx.compose.ui.unit.sp import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily import com.cornellappdev.transit.ui.viewmodels.FavoritesFilterSheetState -import com.google.common.math.LinearTransformation.horizontal @OptIn(ExperimentalLayoutApi::class) @Composable @@ -43,11 +34,15 @@ fun FilterRow( onRemoveFilter: (FavoritesFilterSheetState) -> Unit, modifier: Modifier = Modifier ) { - FlowRow(modifier = modifier, + FlowRow( + modifier = modifier, horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp), ) { - FilterButton(onFilterClick = onFilterClick, modifier = Modifier.align(Alignment.CenterVertically)) + FilterButton( + onFilterClick = onFilterClick, + modifier = Modifier.align(Alignment.CenterVertically) + ) // Selected filter labels if (selectedFilters.isNotEmpty()) { @@ -71,7 +66,8 @@ private fun FilterLabel( Surface( modifier = modifier, shape = RoundedCornerShape(40.dp), - border = BorderStroke(1.dp, TransitBlue) + border = BorderStroke(1.dp, TransitBlue), + color = Color.Transparent ) { Row( modifier = modifier.padding(start = 14.dp, top = 10.dp, bottom = 10.dp, end = 8.dp), @@ -101,7 +97,7 @@ private fun FilterLabel( } } -@Preview +@Preview(showBackground = true) @Composable private fun FilterRowPreview() { FilterRow( @@ -113,8 +109,8 @@ private fun FilterRowPreview() { } -@Preview +@Preview(showBackground = true) @Composable -private fun FilterLabelPreview(){ +private fun FilterLabelPreview() { FilterLabel("Eateries", {}) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt index a9c10ff..5d034b9 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt @@ -127,6 +127,7 @@ class HomeViewModel @Inject constructor( fun toggleAddFavoritesSheet(show: Boolean) { _showAddFavoritesSheet.value = show } + val favoritesFilterList = listOf( FavoritesFilterSheetState.GYMS, FavoritesFilterSheetState.EATERIES, @@ -135,11 +136,15 @@ class HomeViewModel @Inject constructor( FavoritesFilterSheetState.OTHER ) - private val _selectedFavoritesFilters = MutableStateFlow>(emptySet()) - val selectedFavoritesFilters: StateFlow> = _selectedFavoritesFilters.asStateFlow() + private val _selectedFavoritesFilters = + MutableStateFlow>(emptySet()) + val selectedFavoritesFilters: StateFlow> = + _selectedFavoritesFilters.asStateFlow() - private val _appliedFavoritesFilters = MutableStateFlow>(emptySet()) - val appliedFavoritesFilters: StateFlow> = _appliedFavoritesFilters.asStateFlow() + private val _appliedFavoritesFilters = + MutableStateFlow>(emptySet()) + val appliedFavoritesFilters: StateFlow> = + _appliedFavoritesFilters.asStateFlow() fun toggleFavoritesFilter(filter: FavoritesFilterSheetState) { _selectedFavoritesFilters.value = if (filter in _selectedFavoritesFilters.value) { @@ -148,6 +153,7 @@ class HomeViewModel @Inject constructor( _selectedFavoritesFilters.value + filter } } + fun applyFavoritesFilters() { // Save the current selection as applied filters _appliedFavoritesFilters.value = _selectedFavoritesFilters.value From 6924f024c2c33db5d6822f5f67e696f0ba8f9ca6 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 18 Feb 2026 18:03:28 -0500 Subject: [PATCH 23/32] fix: add spacer for separation between filter labels and column of cards --- .../transit/ui/components/home/EcosystemBottomSheetContent.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index c33b780..ecb2086 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -159,6 +159,9 @@ private fun BottomSheetFilteredContent( onFilterClick = onFilterButtonClick, onRemoveFilter = { filter -> homeViewModel.removeAppliedFilter(filter) } ) + if (appliedFilters.isNotEmpty()) { + Spacer(modifier = Modifier.height(8.dp)) + } } } val isFilterBarHidden = currentFilter == FilterState.FAVORITES && appliedFilters.isEmpty() From c9a6192c0cff863c327d82ed2f7f4b2e090578b0 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:53:45 -0500 Subject: [PATCH 24/32] fix: adjust padding value for list of favorites --- .../transit/ui/components/home/EcosystemBottomSheetContent.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index ecb2086..4b9c7b8 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -150,7 +150,7 @@ private fun BottomSheetFilteredContent( onFilterButtonClick: () -> Unit ) { val appliedFilters by homeViewModel.appliedFavoritesFilters.collectAsStateWithLifecycle() - Column() { + Column { if (currentFilter == FilterState.FAVORITES) { Column(modifier = Modifier.padding(horizontal = 12.dp)) { HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) @@ -170,7 +170,7 @@ private fun BottomSheetFilteredContent( start = 12.dp, end = 12.dp, top = if (isFilterBarHidden) 0.dp else 8.dp, - bottom = 90.dp + bottom = 120.dp // Makes bottom content visible with padding at the end ), modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.spacedBy(20.dp) From 727a0e08a1af25a832c981880a14f1364f01e015 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:55:38 -0500 Subject: [PATCH 25/32] fix: use correct color for horizontal divider --- .../ui/components/home/EcosystemBottomSheetContent.kt | 6 +++++- .../main/java/com/cornellappdev/transit/ui/theme/Color.kt | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 4b9c7b8..170bb7c 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -36,6 +36,7 @@ import com.cornellappdev.transit.models.ecosystem.DetailedEcosystemPlace import com.cornellappdev.transit.models.ecosystem.Eatery import com.cornellappdev.transit.models.ecosystem.StaticPlaces import com.cornellappdev.transit.networking.ApiResponse +import com.cornellappdev.transit.ui.theme.FavoritesDividerGray import com.cornellappdev.transit.ui.theme.robotoFamily import com.cornellappdev.transit.ui.viewmodels.FilterState import com.cornellappdev.transit.ui.viewmodels.HomeViewModel @@ -153,7 +154,10 @@ private fun BottomSheetFilteredContent( Column { if (currentFilter == FilterState.FAVORITES) { Column(modifier = Modifier.padding(horizontal = 12.dp)) { - HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) + HorizontalDivider( + modifier = Modifier.padding(vertical = 8.dp), + color = FavoritesDividerGray + ) FilterRow( selectedFilters = appliedFilters, onFilterClick = onFilterButtonClick, diff --git a/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt index 947105f..7f49b9f 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt @@ -26,4 +26,6 @@ val DetailsDividerGray = Color(0xffc6c6c8) val FavoritesYellow = Color(0xFFFEC50E) +val FavoritesDividerGray = Color(0xffDADADA) + val Gray05 = Color(0xFF586069) \ No newline at end of file From cb090b20ca22174aebce5259e2f3984fe48624bc Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:03:13 -0500 Subject: [PATCH 26/32] chore: remove unused line and import --- .../transit/ui/components/home/AddFavoritesButton.kt | 1 - .../transit/ui/components/home/EcosystemBottomSheetContent.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/AddFavoritesButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/AddFavoritesButton.kt index ef56c6d..59b49f6 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/AddFavoritesButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/AddFavoritesButton.kt @@ -37,7 +37,6 @@ fun AddFavoritesButton( modifier = modifier .fillMaxWidth() .height(40.dp), - contentPadding = PaddingValues(vertical = 0.dp) ) { Icon( diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 170bb7c..1015ac1 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -16,7 +16,6 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.OutlinedTextFieldDefaults.contentPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue From 6962eaf647b08c275120867a56a39a135d9915a0 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:23:02 -0500 Subject: [PATCH 27/32] fix: add preview function and adjust how padding is handled --- .../home/FavoritesFilterBottomSheet.kt | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt index beca711..36a98c3 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt @@ -1,6 +1,7 @@ package com.cornellappdev.transit.ui.components.home import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -23,8 +24,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.cornellappdev.transit.ui.theme.DetailsHeaderGray import com.cornellappdev.transit.ui.theme.SecondaryText import com.cornellappdev.transit.ui.theme.TransitBlue import com.cornellappdev.transit.ui.theme.robotoFamily @@ -41,12 +44,13 @@ fun FavoritesFilterBottomSheet( Column( modifier = Modifier .fillMaxWidth() - .padding(bottom = 16.dp) + .background(color = DetailsHeaderGray) + .padding(top = 24.dp, bottom = 16.dp, start = 24.dp, end = 24.dp), + verticalArrangement = Arrangement.spacedBy(20.dp) ) { Row( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp, vertical = 24.dp), + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { Text( @@ -61,7 +65,6 @@ fun FavoritesFilterBottomSheet( LazyVerticalGrid( columns = GridCells.Fixed(3), - modifier = Modifier.padding(horizontal = 24.dp), horizontalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(12.dp) ) { @@ -75,17 +78,17 @@ fun FavoritesFilterBottomSheet( } } - Spacer(modifier = Modifier.height(20.dp)) - // Footer with Cancel and Apply buttons Row( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 24.dp), - horizontalArrangement = Arrangement.SpaceBetween, + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { - FooterButton(onClick = onCancelClicked, text = "Cancel", modifier = Modifier.weight(0.5f)) + FooterButton( + onClick = onCancelClicked, + text = "Cancel", + modifier = Modifier.weight(0.5f) + ) Spacer(modifier = Modifier.width(16.dp)) FooterButton(onClick = onApplyClicked, text = "Apply", modifier = Modifier.weight(0.5f)) } @@ -94,20 +97,21 @@ fun FavoritesFilterBottomSheet( @Composable private fun FooterButton( - onClick : () -> Unit, + onClick: () -> Unit, text: String, - modifier : Modifier = Modifier -){ + modifier: Modifier = Modifier +) { val isCancel = text == "Cancel" Button( onClick = onClick, colors = ButtonDefaults.buttonColors( - backgroundColor = if(isCancel) Color.White else TransitBlue, - contentColor = if(isCancel) TransitBlue else Color.White + backgroundColor = if (isCancel) Color.White else TransitBlue, + contentColor = if (isCancel) TransitBlue else Color.White ), shape = RoundedCornerShape(16.dp), - border = if(isCancel) BorderStroke(1.dp, TransitBlue) else null, - modifier = modifier.height(40.dp)) { + border = if (isCancel) BorderStroke(1.dp, TransitBlue) else null, + modifier = modifier.height(40.dp) + ) { Text( text = text, style = TextStyle(letterSpacing = 0.sp), @@ -117,4 +121,25 @@ private fun FooterButton( fontWeight = FontWeight.SemiBold ) } +} + +@Preview(showBackground = true) +@Composable +private fun FavoritesFilterBottomSheetPreview() { + FavoritesFilterBottomSheet( + onCancelClicked = {}, + onApplyClicked = {}, + filters = listOf( + FavoritesFilterSheetState.EATERIES, + FavoritesFilterSheetState.OTHER, + FavoritesFilterSheetState.LIBRARIES, + FavoritesFilterSheetState.PRINTERS, + FavoritesFilterSheetState.GYMS + ), + selectedFilters = setOf( + FavoritesFilterSheetState.EATERIES, + FavoritesFilterSheetState.LIBRARIES + ), + onFilterToggle = {} + ) } \ No newline at end of file From bac11da53da677c287b98ba07e30d08e26f8271c Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 25 Feb 2026 01:32:22 -0500 Subject: [PATCH 28/32] fix: fix spacing/naming issues --- .../components/home/FavoritesFilterSheetItem.kt | 16 +++++++--------- .../transit/ui/components/home/FilterRow.kt | 1 - 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt index 3886c39..c8a201e 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterSheetItem.kt @@ -50,12 +50,12 @@ fun FavoritesFilterSheetItem( .height(90.dp) .border( width = 1.dp, - color = if(isActive) TransitBlue else MetadataGray, + color = if (isActive) TransitBlue else MetadataGray, shape = RoundedCornerShape(8.dp) ) .background( - color = if(isActive) MutedTransitBlue - else Color.Transparent, + color = if (isActive) MutedTransitBlue + else Color.Transparent, shape = RoundedCornerShape(8.dp) ) .clickable(onClick = itemOnClick) @@ -67,14 +67,14 @@ fun FavoritesFilterSheetItem( contentDescription = label, modifier = Modifier .size(34.dp), - tint = if(isActive) TransitBlue else Color.Unspecified + tint = if (isActive) TransitBlue else Color.Unspecified ) Spacer(modifier = Modifier.height(8.dp)) Text( label, - color = if(isActive) TransitBlue else MetadataGray, + color = if (isActive) TransitBlue else MetadataGray, textAlign = TextAlign.Center, fontSize = 14.sp, fontWeight = FontWeight.SemiBold, @@ -88,22 +88,20 @@ fun FavoritesFilterSheetItem( @Preview(showBackground = true) @Composable -private fun PreviewFavoritesFilterSheetItemActive() { +private fun ActiveFavoritesFilterSheetItemPreview() { FavoritesFilterSheetItem( iconId = R.drawable.eatery_filter_icon, label = "Eateries", isActive = true ) {} - } @Preview(showBackground = true) @Composable -private fun InactiveFavoritesFilterSheetItemInactive() { +private fun InactiveFavoritesFilterSheetItemPreview() { FavoritesFilterSheetItem( iconId = R.drawable.eatery_filter_icon, label = "Eateries", isActive = false ) {} - } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt index 491ac29..8882115 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt @@ -106,7 +106,6 @@ private fun FilterRowPreview() { onRemoveFilter = {} ) - } @Preview(showBackground = true) From 87ae60c73dee7e6be0df36b00880f6b18489b4b5 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 25 Feb 2026 01:40:06 -0500 Subject: [PATCH 29/32] chore: remove .DS_Store files --- .DS_Store | Bin 6148 -> 0 bytes app/.DS_Store | Bin 8196 -> 0 bytes app/src/.DS_Store | Bin 6148 -> 0 bytes app/src/main/.DS_Store | Bin 6148 -> 0 bytes .../transit/ui/components/home/FilterButton.kt | 3 +-- app/src/main/res/.DS_Store | Bin 6148 -> 0 bytes app/src/main/res/drawable/.DS_Store | Bin 6148 -> 0 bytes 7 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 .DS_Store delete mode 100644 app/.DS_Store delete mode 100644 app/src/.DS_Store delete mode 100644 app/src/main/.DS_Store delete mode 100644 app/src/main/res/.DS_Store delete mode 100644 app/src/main/res/drawable/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index d8d80e1e9363d6e3e88dcd234eef5d6fcddda01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKF=_)r43uma1~*rx+%Mz@i?Lte4>*ZQWw0Tnzbfy_(>x<7A?COuMVc@IY4&EN zU2clg$;^EFetI+;%xn!O+6TkbxKE$hq8Os{jFi(BQ;gI3~uY10hBL;0kmY z)-g)}8wp@9923F7JWGLD>NR3`mV*VFwYa9FsXU->_hIN!6L^}pXJH`Xs e@k1nKUgH}3y>Lv7a_~_O)XxBQkx7BSR^SF)kQX-q diff --git a/app/.DS_Store b/app/.DS_Store deleted file mode 100644 index f9a568b0da9b1ccecc11dd44d6f9ee3dbb6ffe14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMU2GIp6h3EK=!`?l6bfx&vWyfk&pXgGhJ)!|<|p#&zvkzL6oy zK$L+f15pN|3`7~YKQcgTHf!P>>pmZi`X~cY1|G@`u=j&T2a}0VPI4K%I;ab_03^%F z95gzoeL#TGLYWBVB$ok{=H$Bv451iqF_6P)Tx0Ge6QP{slEVQx95B2xhC37tu1+{D za0g6q8TC;Hq72N=04tk$kbyi{U{Bw_S3nL-GMb=+2WF<|jb&^%Lx5|UG28O|c>D$m zW##kcS5!z9a>Y<;#4Vdz|AbLS*+NyCQiN7JY5 zQOCW=!^7|u0hKety+rzqpzi)&F=NQ~3hg}Jvel({Z-()T(j)Q$wYRrV9_X{Ou9LFP znrUUBMEHCP^i6G*UpbRURtTn>UK77>%Q4$+sxS;(8s&Yai5*{`Qgcc=jQzO z0Fzdfyk{OY31St@4g%6Fi`b-HW4`4&-Z3-hk!(oBd63fkl}lp{k2N)K-k#{(d+^9q z)k39u(PCL1pfozZHEfx=o}y*=BmKIUH66opPWBco&&t?lx1*1m)i@|gQ&qKf^~;v4 z>RhgU`HXcsZ~14G22q@Oy^Sj1Or*v0Ib&n_xcq4kw>?#roONaxa7(7C|g3L-aGkD0> zy5+D6Hp5Oh3PUgqr{O%j3~#~}_y9hG>+m()fS=%JxCOW2SNH?|LPQA{VGS<9rMLn$ zT!{@B$E~;xx8rU+j7Knq-Pn&A%%X|IcnW>YV-d&k8GH^e;3a$>FXOBD8orKi;CuKX zeuP)?8eYe5@jLt;f5cz#7T(6c1wmLKR0>r>txzW{6P63>g$+WhutV6%qYz5fH8?#g zp^Nm{B^16ggvooBP;B?^J@UT$rG#!)@}j9(vUJ6&wd-59JlS@KSDc9@^4(49fXCC= zAMiMM^fL*_t4ogc5Yf%?xr$7wV3Zc8n78(*98=~|DR6c58dB#|8E|!7V=Sf!RDE3C z5Rb`98P%2)V4r9t6+@+Ut1K(!RAtiCvby?Od8eF^Sj{UC_$J$FCRQ`ze_`)c_#D1~ zZ{Q}e_c!<*{={;u#Kl-oY;DBHiLuSNkr=xJcVPnCa33DPL)b<9?Z-hJ!V{Rr5quhL z97TuNdj`+q1fIudiNP0%!|d=X#5SMUnHg>U0K_-?@EPw>+j?A$+{o%q#kb{0}O z$9A2QG{QJtMvGhyvZWQ_F4HjC*hlRW^QTY!;A&<3*6Y~*zjN;I{||0}(Va&bh%)f6 z8Nl+6R7aBB=6b=gy|zZjQ*^M#{3f{!Ak+ohagxDyoaCK94C!1WSB6Q1a*|83Q2XCM S1kC*tI$Hmu_5Yz+|NjBo@?!}A diff --git a/app/src/.DS_Store b/app/src/.DS_Store deleted file mode 100644 index d549e6c5577d641630f75c73536586f14fb74385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ5EDE47ABBBGIHwxmVx@t03SAO-%F0zRxa>lL0x<7A?COuMVc@IY4&EN zU2clg$;^EFetI+;%xn!O+6TkbxKE$hq8Os{jOX*y<#NW-mXqWeg0)L~vlqLbu0QL8 zdIk4&i(BQ;gI3~uY10hBL;0kmY z)-g)}8wp@9923F7JWGLD>NR3`mV*VFwYa9FsXU->_hIN!6L^}pXJH`Xs e@k1nKUgH}3y>Lv7a_~_O)XxBQkx7BSR^SE#Ef+}u diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index 113af02..42705f1 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -25,8 +25,7 @@ import com.cornellappdev.transit.ui.theme.robotoFamily fun FilterButton( onFilterClick: () -> Unit, modifier: Modifier = Modifier, - - ) { +) { Button( onClick = onFilterClick, colors = ButtonDefaults.buttonColors( diff --git a/app/src/main/res/.DS_Store b/app/src/main/res/.DS_Store deleted file mode 100644 index aad25ff7af2b2228b91ef07d9b4299b9c35c5ba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jx;?w5QX1B3QII8DfbH8z>2~NxBv-;%2Ff{qIJi$dGnKqXp@!#y^&_0cXno1 z{tAy5fNegf2Vf0gpu6JRhu(bMy|bH&xLWM7!yYqUr;nGp%f1}&+5r>ZvBMYrRKGtQ zW^URqzH#^C;^jRR6#)?t0TB=Z5x7pk+beCjOVua>A|L`M0{(qybl0(TNsUhjhqwYz zR}6>oIqnkF<^k$hx}-8fvn-`%snr$3vYhc&d1L94n&q%KnfuhqRyP!j(;07(4jWT7 zihu~56S&Rk+WY?_{mT9Syht+<5P^S1z*gI*?S`*Zy|sHe@3oEoOg|cPBb`IEVrsNv gPP`T0|H^Cr%=NK!NsV&GqnxTA0p}tUfxjT|0|ZwaKL7v# diff --git a/app/src/main/res/drawable/.DS_Store b/app/src/main/res/drawable/.DS_Store deleted file mode 100644 index 382f3dfd19e567f67db315f58ab70cf686f16c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJx{|h5PgOYl^E#An3;i!e-Kq+Lo5}n5NJV2p+#u|V#`nGJ)c1YGBBYC-AVR4 z--msEQtTK&ShTBCUT6o(C{WT@QoH0>v&mXBr^JS=C}N9O z>J_oXD*As@!9}Xzd#x2KS3RlLF;eU`IRnmsGvEx2i~-)+lIek=_s)Pb;0$~+pz|SP z6Xpp!!+3PCi%$UJgytyJ^_EahmM~A)8PY=umP)kLke(R9(rM39T%NEqv~+~HGUrJv ze>`47T%GnTh9l&L-a7-%K%aqq8_sn9pYf9!eB}32eB=x`1OJSHFe#SBf}2Wr>yPc} wuFcqP*d&VUq)@2$egZhqIdT-8=Fg-vE>GAQY8KgJI?;awA|c*61AoB4JEsFR^8f$< From 8335d8c2182bdb07b05a5a6e24b21d131dd1fb59 Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 25 Feb 2026 01:45:06 -0500 Subject: [PATCH 30/32] fix: update .gitignore to not include .DS_Store files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 9f17c67..4029285 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ google-services.json # Android Profiling *.hprof + +# OS Generated Files +.DS_Store +**/.DS_Store \ No newline at end of file From e17e281a8cc6df33ed2dbcbb0c86d6d6a94cb09b Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 25 Feb 2026 02:09:19 -0500 Subject: [PATCH 31/32] chore: misc changes --- .../transit/ui/components/home/FilterButton.kt | 3 ++- .../transit/ui/components/home/FilterRow.kt | 4 ++-- .../transit/ui/screens/HomeScreen.kt | 15 +++++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt index 42705f1..fc143e7 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterButton.kt @@ -32,7 +32,8 @@ fun FilterButton( containerColor = Color.Transparent, contentColor = SecondaryText ), - contentPadding = PaddingValues(horizontal = 8.dp, vertical = 0.dp) + contentPadding = PaddingValues(horizontal = 8.dp), + modifier = modifier, ) { Icon( painter = painterResource(R.drawable.filter_icon), diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt index 8882115..f35d048 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FilterRow.kt @@ -37,7 +37,7 @@ fun FilterRow( FlowRow( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterVertically), ) { FilterButton( onFilterClick = onFilterClick, @@ -70,7 +70,7 @@ private fun FilterLabel( color = Color.Transparent ) { Row( - modifier = modifier.padding(start = 14.dp, top = 10.dp, bottom = 10.dp, end = 8.dp), + modifier = Modifier.padding(start = 14.dp, top = 10.dp, bottom = 10.dp, end = 8.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), verticalAlignment = Alignment.CenterVertically ) { diff --git a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt index 1de15e3..ac1c5b0 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt @@ -39,7 +39,6 @@ import androidx.compose.material3.rememberBottomSheetScaffoldState import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -170,26 +169,26 @@ fun HomeScreen( rememberBottomSheetScaffoldState(filterSheetState) // Main search bar flow - val searchBarValue = homeViewModel.searchBarUiState.collectAsState().value + val searchBarValue = homeViewModel.searchBarUiState.collectAsStateWithLifecycle().value // Favorited locations - val favorites = favoritesViewModel.favoritesStops.collectAsState().value + val favorites = favoritesViewModel.favoritesStops.collectAsStateWithLifecycle().value // Add search bar - val addSearchBarValue = homeViewModel.addSearchQuery.collectAsState().value + val addSearchBarValue = homeViewModel.addSearchQuery.collectAsStateWithLifecycle().value // Add search bar query response - val placeQueryResponse = homeViewModel.placeQueryFlow.collectAsState().value + val placeQueryResponse = homeViewModel.placeQueryFlow.collectAsStateWithLifecycle().value - val filterStateValue = homeViewModel.filterState.collectAsState().value + val filterStateValue = homeViewModel.filterState.collectAsStateWithLifecycle().value - val staticPlaces = homeViewModel.staticPlacesFlow.collectAsState().value + val staticPlaces = homeViewModel.staticPlacesFlow.collectAsStateWithLifecycle().value // Main search bar active/inactive var searchActive by remember { mutableStateOf(false) } // Favorite filter bottom sheet state - val showFilterSheet by homeViewModel.showFilterSheet.collectAsState() + val showFilterSheet by homeViewModel.showFilterSheet.collectAsStateWithLifecycle() // Intercept clicks outside of search bar and disable search @Composable From 6d26753882c0bbe58c48c16336f5c210b0f2db9e Mon Sep 17 00:00:00 2001 From: Ryan Cheung <110103899+RyanCheung555@users.noreply.github.com> Date: Wed, 25 Feb 2026 02:14:43 -0500 Subject: [PATCH 32/32] fix: use material3 imports instead of material --- .../ui/components/home/FavoritesFilterBottomSheet.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt index 36a98c3..df9f350 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/FavoritesFilterBottomSheet.kt @@ -14,9 +14,9 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Button -import androidx.compose.material.ButtonDefaults -import androidx.compose.material.Text +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -105,7 +105,7 @@ private fun FooterButton( Button( onClick = onClick, colors = ButtonDefaults.buttonColors( - backgroundColor = if (isCancel) Color.White else TransitBlue, + containerColor = if (isCancel) Color.White else TransitBlue, contentColor = if (isCancel) TransitBlue else Color.White ), shape = RoundedCornerShape(16.dp), @@ -142,4 +142,4 @@ private fun FavoritesFilterBottomSheetPreview() { ), onFilterToggle = {} ) -} \ No newline at end of file +}