From bce211dadf53989ac49f756d6526072552b2785b Mon Sep 17 00:00:00 2001 From: amjiao Date: Fri, 14 Nov 2025 22:00:49 -0500 Subject: [PATCH 01/18] Update build.gradle.kts (needed for Modifier.dropShadow) --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d6c534f..5261b60 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -62,7 +62,7 @@ android { dependencies { // Jetpack Compose dependencies - implementation(platform("androidx.compose:compose-bom:2024.01.00")) + implementation(platform("androidx.compose:compose-bom:2025.10.01")) implementation("androidx.compose.ui:ui:1.4.0") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.ui:ui-tooling-preview:1.4.3") From 6a040111535181086589c037583716aa02ac7614 Mon Sep 17 00:00:00 2001 From: amjiao Date: Fri, 14 Nov 2025 22:02:18 -0500 Subject: [PATCH 02/18] xml files --- app/src/main/res/drawable/ic_close.xml | 9 +++++++++ .../res/drawable/{kid_star.xml => ic_kid_star.xml} | 0 app/src/main/res/drawable/ic_nav_star.xml | 11 +++++++++++ app/src/main/res/drawable/ic_nav_star_filled.xml | 13 +++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 app/src/main/res/drawable/ic_close.xml rename app/src/main/res/drawable/{kid_star.xml => ic_kid_star.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_nav_star.xml create mode 100644 app/src/main/res/drawable/ic_nav_star_filled.xml diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 0000000..af3679e --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/kid_star.xml b/app/src/main/res/drawable/ic_kid_star.xml similarity index 100% rename from app/src/main/res/drawable/kid_star.xml rename to app/src/main/res/drawable/ic_kid_star.xml diff --git a/app/src/main/res/drawable/ic_nav_star.xml b/app/src/main/res/drawable/ic_nav_star.xml new file mode 100644 index 0000000..05480b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_nav_star.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_nav_star_filled.xml b/app/src/main/res/drawable/ic_nav_star_filled.xml new file mode 100644 index 0000000..693fc9e --- /dev/null +++ b/app/src/main/res/drawable/ic_nav_star_filled.xml @@ -0,0 +1,13 @@ + + + + + + From 7859639c308ab97bfba878899d0eb14937730685 Mon Sep 17 00:00:00 2001 From: amjiao Date: Fri, 14 Nov 2025 22:05:31 -0500 Subject: [PATCH 03/18] Nav to HighlightsScreen --- .../cornellappdev/score/nav/ScoreNavHost.kt | 18 ++++++++++++++++++ .../score/nav/root/RootNavigation.kt | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/cornellappdev/score/nav/ScoreNavHost.kt b/app/src/main/java/com/cornellappdev/score/nav/ScoreNavHost.kt index 4818798..3fc8781 100644 --- a/app/src/main/java/com/cornellappdev/score/nav/ScoreNavHost.kt +++ b/app/src/main/java/com/cornellappdev/score/nav/ScoreNavHost.kt @@ -12,6 +12,8 @@ import com.cornellappdev.score.model.ScoreEvent import com.cornellappdev.score.nav.root.ScoreScreens import com.cornellappdev.score.nav.root.ScoreScreens.Home import com.cornellappdev.score.screen.GameDetailsScreen +import com.cornellappdev.score.screen.HighlightsScreen +import com.cornellappdev.score.screen.HighlightsSearchScreen import com.cornellappdev.score.screen.HomeScreen import com.cornellappdev.score.screen.PastGamesScreen import kotlinx.serialization.builtins.ListSerializer @@ -63,7 +65,23 @@ fun ScoreNavHost(navController: NavHostController) { }) } + composable { backStackEntry -> + CompositionLocalProvider(LocalViewModelStoreOwner provides mainScreenViewModelStoreOwner) { + HighlightsScreen(toSearchScreen = { navController.navigate(ScoreScreens.HighlightsSearchScreen) }) + } + } + composable { backStackEntry -> + CompositionLocalProvider(LocalViewModelStoreOwner provides mainScreenViewModelStoreOwner) { + HighlightsSearchScreen( + sportList = emptyList(), + recentSearchList = emptyList(), + highlightsList = emptyList(), + query = "", + header = "" + ) + } + } } } diff --git a/app/src/main/java/com/cornellappdev/score/nav/root/RootNavigation.kt b/app/src/main/java/com/cornellappdev/score/nav/root/RootNavigation.kt index 362268f..6a2670c 100644 --- a/app/src/main/java/com/cornellappdev/score/nav/root/RootNavigation.kt +++ b/app/src/main/java/com/cornellappdev/score/nav/root/RootNavigation.kt @@ -67,7 +67,6 @@ fun RootNavigation( ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { CompositionLocalProvider(LocalInfiniteLoading provides animatedValue) { - ScoreNavHost(navController) } } @@ -88,6 +87,12 @@ sealed class ScoreScreens { @Serializable data class GameScoreSummaryPage(val scoreEvents: String) : ScoreScreens() + + @Serializable + data object HighlightsScreen : ScoreScreens() + + @Serializable + data object HighlightsSearchScreen : ScoreScreens() } fun NavBackStackEntry.toScreen(): ScoreScreens? = @@ -96,6 +101,8 @@ fun NavBackStackEntry.toScreen(): ScoreScreens? = "GameDetailsPage" -> toRoute() "ScoresScreen" -> toRoute() "GameScoreSummaryPage" -> toRoute() + "HighlightsScreen" -> toRoute() + "HighlightsSearchScreen" -> toRoute() else -> throw IllegalArgumentException("Invalid screen") } @@ -113,6 +120,12 @@ val tabs = listOf( selectedIcon = R.drawable.ic_schedule_filled, screen = ScoreScreens.Home, ), + NavItem( + label = "Highlights", + unselectedIcon = R.drawable.ic_nav_star, + selectedIcon = R.drawable.ic_nav_star_filled, + screen = ScoreScreens.HighlightsScreen, + ), NavItem( label = "Scores", unselectedIcon = R.drawable.ic_scores, From 289f4e473b9213e1f2ed26b4bfbf4c929242850b Mon Sep 17 00:00:00 2001 From: amjiao Date: Fri, 14 Nov 2025 22:07:12 -0500 Subject: [PATCH 04/18] components --- ...r.kt => HighlightsScreeSearchFilterBar.kt} | 36 ++++++--- .../highlights/HighlightsSearchBar.kt | 57 +++++++++++-- .../components/highlights/RecentSearches.kt | 80 +++++++++++++++++++ 3 files changed, 155 insertions(+), 18 deletions(-) rename app/src/main/java/com/cornellappdev/score/components/highlights/{HighlightsScreenHeader.kt => HighlightsScreeSearchFilterBar.kt} (59%) create mode 100644 app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenHeader.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreeSearchFilterBar.kt similarity index 59% rename from app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenHeader.kt rename to app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreeSearchFilterBar.kt index 65b15c6..3c9d0b0 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenHeader.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreeSearchFilterBar.kt @@ -1,42 +1,46 @@ package com.cornellappdev.score.components.highlights import androidx.compose.foundation.clickable +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.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.score.components.ScorePreview import com.cornellappdev.score.model.Sport -import com.cornellappdev.score.theme.Style.heading1 +import com.cornellappdev.score.theme.Style.bodyMedium +import com.cornellappdev.score.theme.Style.bodyNormal import com.cornellappdev.score.util.sportList @Composable -fun HighlightsScreenHeader( +fun HighlightsScreenSearchFilterBar( sportList: List, + isActive: Boolean, ) { Column(modifier = Modifier.fillMaxWidth()) { - Text( - modifier = Modifier.padding(start = 24.dp), - style = heading1, - text = "Highlights" - ) - Spacer(modifier = Modifier.height(12.dp)) Row( modifier = Modifier .padding(horizontal = 24.dp) .clip(shape = RoundedCornerShape(100.dp)) - .clickable(onClick = {/*todo clear the highlight rows and show recent searches*/ }) + .clickable(onClick = {/*todo clear the highlight rows and show recent searches*/ }), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically ) { - HighlightsSearchBar({}) + HighlightsSearchBar({}, isActive, Modifier.weight(1f)) + if (isActive) { + Text("Cancel", style = bodyMedium) + } } Spacer(modifier = Modifier.height(16.dp)) HighlightsFilterRow(sportList, {/*todo on filter selected*/ }) @@ -45,8 +49,16 @@ fun HighlightsScreenHeader( @Preview @Composable -private fun HighlightsScreenHeaderPreview() { +private fun HighlightsScreenSearchFilterBarActivePreview() { ScorePreview { - HighlightsScreenHeader(sportList) + HighlightsScreenSearchFilterBar(sportList, true) + } +} + +@Preview +@Composable +private fun HighlightsScreenSearchFilterBarInactivePreview() { + ScorePreview { + HighlightsScreenSearchFilterBar(sportList, false) } } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt index 892daa2..a7b7f1a 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt @@ -33,20 +33,20 @@ import com.cornellappdev.score.theme.Style.bodyNormal @Composable fun HighlightsSearchBar( - onSearchClick: () -> Unit + onSearchClick: () -> Unit, + isActive: Boolean, + modifier: Modifier = Modifier ) { val interactionSource = remember { MutableInteractionSource() } var searchQuery by remember { mutableStateOf("") } Row( - modifier = Modifier - .fillMaxWidth() + modifier = modifier + //.fillMaxWidth() .background(Color.White, RoundedCornerShape(100.dp)) .border(1.dp, GrayLight, RoundedCornerShape(100.dp)) .clip(RoundedCornerShape(100.dp)) .clickable( - interactionSource = interactionSource, - indication = null ) { onSearchClick() } .padding(horizontal = 16.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically) { @@ -72,6 +72,7 @@ fun HighlightsSearchBar( onValueChange = { searchQuery = it }, singleLine = true, textStyle = bodyNormal, + readOnly = !isActive, visualTransformation = VisualTransformation.None, interactionSource = interactionSource, modifier = Modifier @@ -79,11 +80,55 @@ fun HighlightsSearchBar( .background(Color.Transparent) ) } + if (searchQuery.isNotEmpty()) { + Icon( + painter = painterResource(R.drawable.ic_close), + contentDescription = "clear field", + modifier = Modifier.clickable( + onClick = { searchQuery = "" } + ) + ) + } } } +@Composable +fun HighlightsSearchBarUI( + onClick: () -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .background(Color.White, RoundedCornerShape(100.dp)) + .border(1.dp, GrayLight, RoundedCornerShape(100.dp)) + .clip(RoundedCornerShape(100.dp)) + .clickable( + ) { onClick() } + .padding(horizontal = 16.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically) { + + Icon( + painter = painterResource(R.drawable.search), + contentDescription = "search icon", + tint = Color.Unspecified + ) + + Spacer(Modifier.width(8.dp)) + Text( + text = "Search keywords", + style = bodyNormal.copy(color = Color.Gray) + ) + } +} + +@Preview +@Composable +private fun HighlightsSearchBarUIPreview() { + HighlightsSearchBarUI({}) +} + @Preview @Composable private fun HighlightsSearchBarPreview() { - HighlightsSearchBar({}) + HighlightsSearchBar({}, true) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt new file mode 100644 index 0000000..a53fd73 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt @@ -0,0 +1,80 @@ +package com.cornellappdev.score.components.highlights + +import androidx.compose.foundation.clickable +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.material3.Icon +import androidx.compose.material3.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.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.cornellappdev.score.R +import com.cornellappdev.score.components.ScorePreview +import com.cornellappdev.score.theme.Style.bodyMedium +import com.cornellappdev.score.theme.Style.metricSmallNormal + + +@Composable +fun RecentSearchItem( + query: String +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp), + modifier = Modifier.clickable(onClick = {/*search the query*/}) + ) { + Icon( + painter = painterResource(R.drawable.search), + contentDescription = "search icon", + tint = Color.Unspecified + ) + Text(query, style = metricSmallNormal) + } + + //this icon doesn't preview correctly since its too small, works when actually running though + Icon( + painter = painterResource(R.drawable.ic_close), + contentDescription = "close icon", + tint = Color.Unspecified, + modifier = Modifier.clickable(onClick = {/*delete this search from the recent searches list*/}) + ) + + } +} + +@Composable +fun RecentSearches( + recentQueriesList: List +) { + Column( + modifier = Modifier + .fillMaxWidth() + ) { + Text("Recent searches", style = bodyMedium) + recentQueriesList.map { query -> + Spacer(Modifier.height(16.dp)) + RecentSearchItem(query) + } + } +} + +@Preview +@Composable +private fun RecentSearchItemPreview() { + ScorePreview { + RecentSearches(listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey")) + } +} From de3f5f82e711d398431f92326cb45f7f6c9a76d2 Mon Sep 17 00:00:00 2001 From: amjiao Date: Fri, 14 Nov 2025 22:07:24 -0500 Subject: [PATCH 05/18] Screens --- .../cornellappdev/score/model/Highlights.kt | 11 +- .../score/screen/HighlightsScreen.kt | 38 +++-- .../score/screen/HighlightsSearchScreen.kt | 126 ++++++++++++++ .../score/screen/HighlightsSubScreen.kt | 155 ++++++++++++++++++ 4 files changed, 313 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt create mode 100644 app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt diff --git a/app/src/main/java/com/cornellappdev/score/model/Highlights.kt b/app/src/main/java/com/cornellappdev/score/model/Highlights.kt index df339b6..a1a96b2 100644 --- a/app/src/main/java/com/cornellappdev/score/model/Highlights.kt +++ b/app/src/main/java/com/cornellappdev/score/model/Highlights.kt @@ -18,6 +18,13 @@ data class ArticleHighlightData( ) sealed class HighlightData { - data class Video(val data: VideoHighlightData) : HighlightData() - data class Article(val data: ArticleHighlightData) : HighlightData() + abstract val title: String + + data class Video(val data: VideoHighlightData) : HighlightData() { + override val title = data.title + } + + data class Article(val data: ArticleHighlightData) : HighlightData() { + override val title = data.title + } } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt index 1fb9472..f5ca5f6 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt @@ -1,10 +1,13 @@ package com.cornellappdev.score.screen import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -16,18 +19,22 @@ import com.cornellappdev.score.R import com.cornellappdev.score.components.EmptyStateBox import com.cornellappdev.score.components.ScorePreview import com.cornellappdev.score.components.highlights.HighlightsCardRow -import com.cornellappdev.score.components.highlights.HighlightsScreenHeader +import com.cornellappdev.score.components.highlights.HighlightsFilterRow +import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar +import com.cornellappdev.score.components.highlights.HighlightsSearchBarUI import com.cornellappdev.score.model.HighlightData import com.cornellappdev.score.model.Sport +import com.cornellappdev.score.theme.Style.heading1 import com.cornellappdev.score.util.highlightsList import com.cornellappdev.score.util.sportList /*todo: needs a UIState */ @Composable fun HighlightsScreen( - sportList: List, - todayHighlightsList: List, - pastThreeHighlightsList: List + sportList: List = emptyList(), + todayHighlightsList: List = emptyList(), + pastThreeHighlightsList: List = emptyList(), + toSearchScreen: () -> Unit ) { Column( modifier = Modifier @@ -35,11 +42,19 @@ fun HighlightsScreen( .background(color = Color.White) ) { Spacer(modifier = Modifier.height(24.dp)) - HighlightsScreenHeader(sportList) + Column( + modifier = Modifier.padding(start =24.dp) + ){ + Text("Highlights", style = heading1) + Spacer(modifier = Modifier.height(12.dp)) + HighlightsSearchBarUI(toSearchScreen) + } + Spacer(modifier = Modifier.height(16.dp)) + HighlightsFilterRow(sportList, { /*handle with viewmodel*/ }) Spacer(modifier = Modifier.height(24.dp)) if (todayHighlightsList.isEmpty() && pastThreeHighlightsList.isEmpty()) { EmptyStateBox( - icon = R.drawable.kid_star, + icon = R.drawable.ic_kid_star, title = "No results yet.", ) } @@ -52,14 +67,6 @@ fun HighlightsScreen( } } -@Composable -@Preview -private fun HighlightsScreenHeaderPreview() { - ScorePreview { - HighlightsScreenHeader(sportList) - } -} - data class HighlightsScreenPreviewData( val sportList: List, val todayHighlightList: List, @@ -76,7 +83,7 @@ class HighlightsScreenPreviewProvider : PreviewParameterProvider, + recentSearchList: List, + highlightsList: List, + query: String, + header: String +) { + Column( + modifier = Modifier + .fillMaxSize() + .background(color = Color.White) + .padding(top = 24.dp) + ) { + Row(modifier = Modifier.padding(horizontal = 24.dp)) { + Text(text = header, style = heading2) + } + Spacer(modifier = Modifier.height(16.dp)) + HighlightsScreenSearchFilterBar( + sportList, + true + ) //need viewmodel to handle comms between composables + Spacer(modifier = Modifier.height(24.dp)) + Column( + modifier = Modifier.padding(horizontal = 24.dp) + ) { + if (recentSearchList.isNotEmpty() && query.isEmpty()) { //start state: no search attempted yet + RecentSearches(recentSearchList) + } else if (query.isNotEmpty()) { //filtering - will pull this out to the viewmodel when i do that, just here for sanity check rn + val filteredList = highlightsList.filter { + it.title.contains(query, ignoreCase = true) + } + if (filteredList.isEmpty()) { + EmptyStateBox( + icon = R.drawable.ic_kid_star, + title = "No results yet.", + ) + } else { + Text("${filteredList.size} Results", style = bodyNormal) + LazyColumn( + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + item { Spacer(Modifier.width(8.dp)) } + items(filteredList) { item -> + when (item) { + is HighlightData.Video -> VideoHighlightCard(item.data, true) + is HighlightData.Article -> ArticleHighlightCard(item.data, true) + } + } + item { Spacer(Modifier.width(8.dp)) } + } + Spacer(modifier = Modifier.height(24.dp)) + } + + } + } + } +} + +@Preview +@Composable +private fun HighlightsSearchScreenStartStatePreview() { + HighlightsSearchScreen( + sportList, + listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey"), + highlightsList, + "", + "Search All Highlights" + ) +} + +@Preview +@Composable +private fun HighlightsSearchScreenQueryMissPreview() { + HighlightsSearchScreen( + sportList, + listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey"), + highlightsList, + "Sports", + "Search All Highlights" + ) +} + +@Preview +@Composable +private fun HighlightsSearchScreenQueryHitPreview() { + HighlightsSearchScreen( + sportList, + listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey"), + highlightsList, + "Hockey", + "Search All Highlights" + ) +} diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt new file mode 100644 index 0000000..0a4e046 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt @@ -0,0 +1,155 @@ +package com.cornellappdev.score.screen + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +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.layout.width +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Icon +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.dropShadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.shadow.Shadow +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.dp +import com.cornellappdev.score.R +import com.cornellappdev.score.components.EmptyStateBox +import com.cornellappdev.score.components.ScorePreview +import com.cornellappdev.score.components.highlights.ArticleHighlightCard +import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar +import com.cornellappdev.score.components.highlights.RecentSearches +import com.cornellappdev.score.components.highlights.VideoHighlightCard +import com.cornellappdev.score.model.HighlightData +import com.cornellappdev.score.model.Sport +import com.cornellappdev.score.theme.Style.bodyNormal +import com.cornellappdev.score.theme.Style.heading2 +import com.cornellappdev.score.theme.White +import com.cornellappdev.score.util.highlightsList +import com.cornellappdev.score.util.sportList + +@Composable +fun HighlightsSubScreenHeader( + header: String +) { + Row( + modifier = Modifier + .padding(horizontal = 24.dp, vertical = 12.dp) + .fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(96.dp) + ) { + Icon( + painter = painterResource(R.drawable.ic_left_arrowhead), + contentDescription = "back arrow" + ) + Text(header, style = heading2) + } +} + +@Preview +@Composable +private fun HighlightsSubScreenHeader() { + ScorePreview { + HighlightsSubScreenHeader("Past 3 Days") + } +} + +@Composable +fun HighlightsSubScreen( + sportList: List, + recentSearchList: List, + highlightsList: List, + query: String, + header: String +) { + Column( + modifier = Modifier + .fillMaxSize() + .background(color = Color.White) + .padding(top = 24.dp) + ) { + Surface( + modifier = Modifier.wrapContentSize().dropShadow( + shape = RectangleShape, + shadow = Shadow( + radius = 2.dp, + color = Color.Black.copy(alpha = 0.05f), + offset = DpOffset(0.dp, (2).dp) + ) + ), + color = White + ) { + HighlightsSubScreenHeader(header) + } + Spacer(modifier = Modifier.height(16.dp)) + HighlightsScreenSearchFilterBar( + sportList, + + false + ) //need viewmodel to handle comms between composables + Spacer(modifier = Modifier.height(24.dp)) + Column( + modifier = Modifier.padding(horizontal = 24.dp) + ) { + if (recentSearchList.isNotEmpty() && query.isEmpty()) { //start state: no search attempted yet + RecentSearches(recentSearchList) + } else if (query.isNotEmpty()) { //filtering - will pull this out to the viewmodel when i do that, just here for sanity check rn + val filteredList = highlightsList.filter { + it.title.contains(query, ignoreCase = true) + } + if (filteredList.isEmpty()) { + EmptyStateBox( + icon = R.drawable.ic_kid_star, + title = "No results yet.", + ) + } else { + Text("${filteredList.size} Results", style = bodyNormal) + LazyColumn( + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + item { Spacer(Modifier.width(8.dp)) } + items(filteredList) { item -> + when (item) { + is HighlightData.Video -> VideoHighlightCard(item.data, true) + is HighlightData.Article -> ArticleHighlightCard(item.data, true) + } + } + item { Spacer(Modifier.width(8.dp)) } + } + Spacer(modifier = Modifier.height(24.dp)) + } + + } + } + } +} + +@Preview +@Composable +private fun HighlightsSubScreenPreview() { + HighlightsSubScreen( + sportList = sportList, + recentSearchList = listOf( + "Columbia", + "Men's ice hockey", + "Late goal lifts No.6 men’s hockey" + ), + highlightsList = highlightsList, + query = "hockey", + header = "Past 3 Days" + ) +} \ No newline at end of file From 82b1a32df8b3a95932c152bde6876bc04a37b5a7 Mon Sep 17 00:00:00 2001 From: amjiao Date: Fri, 14 Nov 2025 22:30:07 -0500 Subject: [PATCH 06/18] pull results lazycolumn out into separate component --- .../highlights/HighlightsCardLazyColumn.kt | 42 ++++++++++++++ ....kt => HighlightsScreenSearchFilterBar.kt} | 2 - .../score/screen/HighlightsSearchScreen.kt | 16 +----- .../score/screen/HighlightsSubScreen.kt | 55 +++++++------------ 4 files changed, 64 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt rename app/src/main/java/com/cornellappdev/score/components/highlights/{HighlightsScreeSearchFilterBar.kt => HighlightsScreenSearchFilterBar.kt} (95%) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt new file mode 100644 index 0000000..d03f39f --- /dev/null +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt @@ -0,0 +1,42 @@ +package com.cornellappdev.score.components.highlights + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.cornellappdev.score.components.ScorePreview +import com.cornellappdev.score.model.HighlightData +import com.cornellappdev.score.util.highlightsList + +@Composable +fun HighlightsCardLazyColumn( + highlightsList: List +){ + LazyColumn( + modifier = Modifier.padding(top = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + items(highlightsList) { item -> + when (item) { + is HighlightData.Video -> VideoHighlightCard(item.data, true) + is HighlightData.Article -> ArticleHighlightCard(item.data, true) + } + } + } + Spacer(modifier = Modifier.height(24.dp)) +} + +@Preview +@Composable +private fun HighlightsCardLazyColumnPreview(){ + ScorePreview { + HighlightsCardLazyColumn(highlightsList) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreeSearchFilterBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt similarity index 95% rename from app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreeSearchFilterBar.kt rename to app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt index 3c9d0b0..ffe84e8 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreeSearchFilterBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt @@ -8,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.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -20,7 +19,6 @@ import androidx.compose.ui.unit.dp import com.cornellappdev.score.components.ScorePreview import com.cornellappdev.score.model.Sport import com.cornellappdev.score.theme.Style.bodyMedium -import com.cornellappdev.score.theme.Style.bodyNormal import com.cornellappdev.score.util.sportList @Composable diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt index d9b03cb..5cdb3c4 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.unit.dp import com.cornellappdev.score.R import com.cornellappdev.score.components.EmptyStateBox import com.cornellappdev.score.components.highlights.ArticleHighlightCard +import com.cornellappdev.score.components.highlights.HighlightsCardLazyColumn import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar import com.cornellappdev.score.components.highlights.RecentSearches import com.cornellappdev.score.components.highlights.VideoHighlightCard @@ -69,21 +70,8 @@ fun HighlightsSearchScreen( ) } else { Text("${filteredList.size} Results", style = bodyNormal) - LazyColumn( - verticalArrangement = Arrangement.spacedBy(16.dp) - ) { - item { Spacer(Modifier.width(8.dp)) } - items(filteredList) { item -> - when (item) { - is HighlightData.Video -> VideoHighlightCard(item.data, true) - is HighlightData.Article -> ArticleHighlightCard(item.data, true) - } - } - item { Spacer(Modifier.width(8.dp)) } - } - Spacer(modifier = Modifier.height(24.dp)) + HighlightsCardLazyColumn(filteredList) } - } } } diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt index 0a4e046..32da0dc 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt @@ -1,8 +1,8 @@ package com.cornellappdev.score.screen import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -10,10 +10,7 @@ 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.layout.width import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material3.Icon import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -30,13 +27,11 @@ import androidx.compose.ui.unit.dp import com.cornellappdev.score.R import com.cornellappdev.score.components.EmptyStateBox import com.cornellappdev.score.components.ScorePreview -import com.cornellappdev.score.components.highlights.ArticleHighlightCard +import com.cornellappdev.score.components.highlights.HighlightsCardLazyColumn import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar import com.cornellappdev.score.components.highlights.RecentSearches -import com.cornellappdev.score.components.highlights.VideoHighlightCard import com.cornellappdev.score.model.HighlightData import com.cornellappdev.score.model.Sport -import com.cornellappdev.score.theme.Style.bodyNormal import com.cornellappdev.score.theme.Style.heading2 import com.cornellappdev.score.theme.White import com.cornellappdev.score.util.highlightsList @@ -44,7 +39,8 @@ import com.cornellappdev.score.util.sportList @Composable fun HighlightsSubScreenHeader( - header: String + header: String, + navigateBack: () -> Unit ) { Row( modifier = Modifier @@ -54,7 +50,8 @@ fun HighlightsSubScreenHeader( ) { Icon( painter = painterResource(R.drawable.ic_left_arrowhead), - contentDescription = "back arrow" + contentDescription = "back arrow", + modifier = Modifier.clickable(onClick = { navigateBack() }) ) Text(header, style = heading2) } @@ -64,7 +61,7 @@ fun HighlightsSubScreenHeader( @Composable private fun HighlightsSubScreenHeader() { ScorePreview { - HighlightsSubScreenHeader("Past 3 Days") + HighlightsSubScreenHeader("Past 3 Days", {}) } } @@ -83,17 +80,19 @@ fun HighlightsSubScreen( .padding(top = 24.dp) ) { Surface( - modifier = Modifier.wrapContentSize().dropShadow( - shape = RectangleShape, - shadow = Shadow( - radius = 2.dp, - color = Color.Black.copy(alpha = 0.05f), - offset = DpOffset(0.dp, (2).dp) - ) - ), + modifier = Modifier + .wrapContentSize() + .dropShadow( + shape = RectangleShape, + shadow = Shadow( + radius = 2.dp, + color = Color.Black.copy(alpha = 0.05f), + offset = DpOffset(0.dp, (2).dp) + ) + ), color = White ) { - HighlightsSubScreenHeader(header) + HighlightsSubScreenHeader(header, {}) } Spacer(modifier = Modifier.height(16.dp)) HighlightsScreenSearchFilterBar( @@ -101,7 +100,7 @@ fun HighlightsSubScreen( false ) //need viewmodel to handle comms between composables - Spacer(modifier = Modifier.height(24.dp)) + Spacer(modifier = Modifier.height(8.dp)) Column( modifier = Modifier.padding(horizontal = 24.dp) ) { @@ -117,22 +116,8 @@ fun HighlightsSubScreen( title = "No results yet.", ) } else { - Text("${filteredList.size} Results", style = bodyNormal) - LazyColumn( - verticalArrangement = Arrangement.spacedBy(16.dp) - ) { - item { Spacer(Modifier.width(8.dp)) } - items(filteredList) { item -> - when (item) { - is HighlightData.Video -> VideoHighlightCard(item.data, true) - is HighlightData.Article -> ArticleHighlightCard(item.data, true) - } - } - item { Spacer(Modifier.width(8.dp)) } - } - Spacer(modifier = Modifier.height(24.dp)) + HighlightsCardLazyColumn(filteredList) } - } } } From b8bab79f841542811ba53058c6c916a046216139 Mon Sep 17 00:00:00 2001 From: amjiao Date: Fri, 14 Nov 2025 23:00:51 -0500 Subject: [PATCH 07/18] Clean up --- .../components/highlights/HighlightsCardLazyColumn.kt | 8 ++------ .../score/components/highlights/HighlightsSearchBar.kt | 2 +- .../score/components/highlights/RecentSearches.kt | 4 ++-- .../com/cornellappdev/score/screen/HighlightsScreen.kt | 6 ++---- .../cornellappdev/score/screen/HighlightsSearchScreen.kt | 6 ------ .../com/cornellappdev/score/screen/HighlightsSubScreen.kt | 2 +- 6 files changed, 8 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt index d03f39f..63a948c 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt @@ -1,10 +1,7 @@ package com.cornellappdev.score.components.highlights import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable @@ -18,7 +15,7 @@ import com.cornellappdev.score.util.highlightsList @Composable fun HighlightsCardLazyColumn( highlightsList: List -){ +) { LazyColumn( modifier = Modifier.padding(top = 16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) @@ -30,12 +27,11 @@ fun HighlightsCardLazyColumn( } } } - Spacer(modifier = Modifier.height(24.dp)) } @Preview @Composable -private fun HighlightsCardLazyColumnPreview(){ +private fun HighlightsCardLazyColumnPreview() { ScorePreview { HighlightsCardLazyColumn(highlightsList) } diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt index a7b7f1a..8de9adf 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt @@ -42,7 +42,7 @@ fun HighlightsSearchBar( Row( modifier = modifier - //.fillMaxWidth() + .fillMaxWidth() .background(Color.White, RoundedCornerShape(100.dp)) .border(1.dp, GrayLight, RoundedCornerShape(100.dp)) .clip(RoundedCornerShape(100.dp)) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt index a53fd73..357eff2 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt @@ -34,7 +34,7 @@ fun RecentSearchItem( Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp), - modifier = Modifier.clickable(onClick = {/*search the query*/}) + modifier = Modifier.clickable(onClick = {/*search the query*/ }) ) { Icon( painter = painterResource(R.drawable.search), @@ -49,7 +49,7 @@ fun RecentSearchItem( painter = painterResource(R.drawable.ic_close), contentDescription = "close icon", tint = Color.Unspecified, - modifier = Modifier.clickable(onClick = {/*delete this search from the recent searches list*/}) + modifier = Modifier.clickable(onClick = {/*delete this search from the recent searches list*/ }) ) } diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt index f5ca5f6..a6a42ec 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt @@ -1,7 +1,6 @@ package com.cornellappdev.score.screen import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -20,7 +19,6 @@ import com.cornellappdev.score.components.EmptyStateBox import com.cornellappdev.score.components.ScorePreview import com.cornellappdev.score.components.highlights.HighlightsCardRow import com.cornellappdev.score.components.highlights.HighlightsFilterRow -import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar import com.cornellappdev.score.components.highlights.HighlightsSearchBarUI import com.cornellappdev.score.model.HighlightData import com.cornellappdev.score.model.Sport @@ -43,8 +41,8 @@ fun HighlightsScreen( ) { Spacer(modifier = Modifier.height(24.dp)) Column( - modifier = Modifier.padding(start =24.dp) - ){ + modifier = Modifier.padding(horizontal = 24.dp) + ) { Text("Highlights", style = heading1) Spacer(modifier = Modifier.height(12.dp)) HighlightsSearchBarUI(toSearchScreen) diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt index 5cdb3c4..b34efe2 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt @@ -1,16 +1,12 @@ package com.cornellappdev.score.screen import androidx.compose.foundation.background -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.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -19,11 +15,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.score.R import com.cornellappdev.score.components.EmptyStateBox -import com.cornellappdev.score.components.highlights.ArticleHighlightCard import com.cornellappdev.score.components.highlights.HighlightsCardLazyColumn import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar import com.cornellappdev.score.components.highlights.RecentSearches -import com.cornellappdev.score.components.highlights.VideoHighlightCard import com.cornellappdev.score.model.HighlightData import com.cornellappdev.score.model.Sport import com.cornellappdev.score.theme.Style.bodyNormal diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt index 32da0dc..a23e3cf 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt @@ -134,7 +134,7 @@ private fun HighlightsSubScreenPreview() { "Late goal lifts No.6 men’s hockey" ), highlightsList = highlightsList, - query = "hockey", + query = "s", header = "Past 3 Days" ) } \ No newline at end of file From 1b3d9ecedc338c58ba540568365d855bf1d1f7d2 Mon Sep 17 00:00:00 2001 From: amjiao Date: Sat, 15 Nov 2025 00:04:45 -0500 Subject: [PATCH 08/18] Focus on searchbar when HighlightsSearchScreen is launched --- .../highlights/HighlightsScreenSearchFilterBar.kt | 13 ++++++++++--- .../components/highlights/HighlightsSearchBar.kt | 6 ++++++ .../score/screen/HighlightsSearchScreen.kt | 12 +++++++++++- gradle/libs.versions.toml | 4 ++++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt index ffe84e8..943a42f 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.score.components.ScorePreview @@ -25,6 +26,7 @@ import com.cornellappdev.score.util.sportList fun HighlightsScreenSearchFilterBar( sportList: List, isActive: Boolean, + focusRequester: FocusRequester? = null ) { Column(modifier = Modifier.fillMaxWidth()) { Row( @@ -35,7 +37,12 @@ fun HighlightsScreenSearchFilterBar( horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.CenterVertically ) { - HighlightsSearchBar({}, isActive, Modifier.weight(1f)) + HighlightsSearchBar( + onSearchClick = {}, + isActive = isActive, + focusRequester = focusRequester, + modifier = Modifier.weight(1f) + ) if (isActive) { Text("Cancel", style = bodyMedium) } @@ -49,7 +56,7 @@ fun HighlightsScreenSearchFilterBar( @Composable private fun HighlightsScreenSearchFilterBarActivePreview() { ScorePreview { - HighlightsScreenSearchFilterBar(sportList, true) + HighlightsScreenSearchFilterBar(sportList, true, focusRequester = FocusRequester()) } } @@ -57,6 +64,6 @@ private fun HighlightsScreenSearchFilterBarActivePreview() { @Composable private fun HighlightsScreenSearchFilterBarInactivePreview() { ScorePreview { - HighlightsScreenSearchFilterBar(sportList, false) + HighlightsScreenSearchFilterBar(sportList, false, focusRequester = FocusRequester()) } } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt index 8de9adf..9bd4abd 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt @@ -22,6 +22,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.VisualTransformation @@ -35,6 +37,7 @@ import com.cornellappdev.score.theme.Style.bodyNormal fun HighlightsSearchBar( onSearchClick: () -> Unit, isActive: Boolean, + focusRequester: FocusRequester? = null, modifier: Modifier = Modifier ) { val interactionSource = remember { MutableInteractionSource() } @@ -76,6 +79,9 @@ fun HighlightsSearchBar( visualTransformation = VisualTransformation.None, interactionSource = interactionSource, modifier = Modifier + .then( + focusRequester?.let { Modifier.focusRequester(it) } ?: Modifier + ) .fillMaxWidth() .background(Color.Transparent) ) diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt index b34efe2..2eb4f69 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt @@ -9,7 +9,10 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -39,13 +42,20 @@ fun HighlightsSearchScreen( .background(color = Color.White) .padding(top = 24.dp) ) { + val focusRequester = remember { FocusRequester() } + + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + Row(modifier = Modifier.padding(horizontal = 24.dp)) { Text(text = header, style = heading2) } Spacer(modifier = Modifier.height(16.dp)) HighlightsScreenSearchFilterBar( sportList, - true + true, + focusRequester = focusRequester ) //need viewmodel to handle comms between composables Spacer(modifier = Modifier.height(24.dp)) Column( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b53ee5a..8792d22 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,8 @@ media3CommonKtx = "1.5.1" # See https://stackoverflow.com/a/79126321 material3 = "1.4.0-alpha11" material3Version = "1.3.2" +runtime = "1.9.4" +ui = "1.9.4" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -33,6 +35,8 @@ androidx-runtime-android = { group = "androidx.compose.runtime", name = "runtime apollo-runtime = { module = "com.apollographql.apollo:apollo-runtime" } androidx-media3-common-ktx = { group = "androidx.media3", name = "media3-common-ktx", version.ref = "media3CommonKtx" } androidx-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3Version" } +androidx-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "runtime" } +androidx-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "ui" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } From e34db06cc5dd7124f5b1cae483ecb921eb6f58cf Mon Sep 17 00:00:00 2001 From: amjiao Date: Tue, 18 Nov 2025 22:31:17 -0500 Subject: [PATCH 09/18] Searchbar functionality fixes --- app/build.gradle.kts | 1 + .../HighlightsScreenSearchFilterBar.kt | 42 +++++++++++++++---- .../highlights/HighlightsSearchBar.kt | 14 +++---- .../score/screen/HighlightsScreen.kt | 5 +-- .../score/screen/HighlightsSearchScreen.kt | 5 +-- .../score/screen/HighlightsSubScreen.kt | 9 ++-- gradle/libs.versions.toml | 2 + 7 files changed, 53 insertions(+), 25 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5261b60..5023c96 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -72,6 +72,7 @@ dependencies { implementation(libs.material3) implementation("com.google.dagger:hilt-android:2.51.1") implementation(libs.androidx.material3) + implementation(libs.androidx.foundation.layout) kapt("com.google.dagger:hilt-android-compiler:2.51.1") implementation("androidx.hilt:hilt-navigation-compose:1.0.0") implementation("com.google.accompanist:accompanist-pager:0.24.0-alpha") diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt index 943a42f..fa27a24 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt @@ -2,6 +2,7 @@ package com.cornellappdev.score.components.highlights import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -11,10 +12,16 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape 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.draw.clip import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.score.components.ScorePreview @@ -25,9 +32,10 @@ import com.cornellappdev.score.util.sportList @Composable fun HighlightsScreenSearchFilterBar( sportList: List, - isActive: Boolean, - focusRequester: FocusRequester? = null + focusRequester: FocusRequester ) { + val focusManager = LocalFocusManager.current + var isActive by remember { mutableStateOf(true) } Column(modifier = Modifier.fillMaxWidth()) { Row( modifier = Modifier @@ -38,13 +46,31 @@ fun HighlightsScreenSearchFilterBar( verticalAlignment = Alignment.CenterVertically ) { HighlightsSearchBar( - onSearchClick = {}, - isActive = isActive, + onSearchClick = { + isActive = true + focusRequester.requestFocus() + }, focusRequester = focusRequester, - modifier = Modifier.weight(1f) + modifier = Modifier + .weight(1f) + .onFocusChanged { state -> + // When the search bar loses focus, hide cancel + if (!state.isFocused) { + isActive = !isActive + } + } ) + if (isActive) { - Text("Cancel", style = bodyMedium) + Box( + modifier = Modifier.clickable { + isActive = true; + focusManager.clearFocus(force = true) + /*todo: clear the text in the search bar*/ + } + ) { + Text("Cancel", style = bodyMedium) + } } } Spacer(modifier = Modifier.height(16.dp)) @@ -56,7 +82,7 @@ fun HighlightsScreenSearchFilterBar( @Composable private fun HighlightsScreenSearchFilterBarActivePreview() { ScorePreview { - HighlightsScreenSearchFilterBar(sportList, true, focusRequester = FocusRequester()) + HighlightsScreenSearchFilterBar(sportList, FocusRequester()) } } @@ -64,6 +90,6 @@ private fun HighlightsScreenSearchFilterBarActivePreview() { @Composable private fun HighlightsScreenSearchFilterBarInactivePreview() { ScorePreview { - HighlightsScreenSearchFilterBar(sportList, false, focusRequester = FocusRequester()) + HighlightsScreenSearchFilterBar(sportList, FocusRequester()) } } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt index 9bd4abd..0e4983d 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.VisualTransformation @@ -36,12 +37,11 @@ import com.cornellappdev.score.theme.Style.bodyNormal @Composable fun HighlightsSearchBar( onSearchClick: () -> Unit, - isActive: Boolean, - focusRequester: FocusRequester? = null, + focusRequester: FocusRequester, modifier: Modifier = Modifier ) { val interactionSource = remember { MutableInteractionSource() } - var searchQuery by remember { mutableStateOf("") } + var searchQuery by remember { mutableStateOf("") } //todo: to be handled by viewmodel Row( modifier = modifier @@ -49,8 +49,7 @@ fun HighlightsSearchBar( .background(Color.White, RoundedCornerShape(100.dp)) .border(1.dp, GrayLight, RoundedCornerShape(100.dp)) .clip(RoundedCornerShape(100.dp)) - .clickable( - ) { onSearchClick() } + .clickable { onSearchClick() } .padding(horizontal = 16.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically) { @@ -75,12 +74,11 @@ fun HighlightsSearchBar( onValueChange = { searchQuery = it }, singleLine = true, textStyle = bodyNormal, - readOnly = !isActive, visualTransformation = VisualTransformation.None, interactionSource = interactionSource, modifier = Modifier .then( - focusRequester?.let { Modifier.focusRequester(it) } ?: Modifier + focusRequester.let { Modifier.focusRequester(it) } ) .fillMaxWidth() .background(Color.Transparent) @@ -136,5 +134,5 @@ private fun HighlightsSearchBarUIPreview() { @Preview @Composable private fun HighlightsSearchBarPreview() { - HighlightsSearchBar({}, true) + HighlightsSearchBar({}, FocusRequester() ) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt index a6a42ec..ecad3ec 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsScreen.kt @@ -26,10 +26,9 @@ import com.cornellappdev.score.theme.Style.heading1 import com.cornellappdev.score.util.highlightsList import com.cornellappdev.score.util.sportList -/*todo: needs a UIState */ @Composable fun HighlightsScreen( - sportList: List = emptyList(), + sportList: List = emptyList(), //note - emptyLists are placeholders for nav to work, will replace will viewModel todayHighlightsList: List = emptyList(), pastThreeHighlightsList: List = emptyList(), toSearchScreen: () -> Unit @@ -48,7 +47,7 @@ fun HighlightsScreen( HighlightsSearchBarUI(toSearchScreen) } Spacer(modifier = Modifier.height(16.dp)) - HighlightsFilterRow(sportList, { /*handle with viewmodel*/ }) + HighlightsFilterRow(sportList, { /*todo: handle with viewmodel*/ }) Spacer(modifier = Modifier.height(24.dp)) if (todayHighlightsList.isEmpty() && pastThreeHighlightsList.isEmpty()) { EmptyStateBox( diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt index 2eb4f69..876be9d 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt @@ -54,16 +54,15 @@ fun HighlightsSearchScreen( Spacer(modifier = Modifier.height(16.dp)) HighlightsScreenSearchFilterBar( sportList, - true, focusRequester = focusRequester - ) //need viewmodel to handle comms between composables + ) Spacer(modifier = Modifier.height(24.dp)) Column( modifier = Modifier.padding(horizontal = 24.dp) ) { if (recentSearchList.isNotEmpty() && query.isEmpty()) { //start state: no search attempted yet RecentSearches(recentSearchList) - } else if (query.isNotEmpty()) { //filtering - will pull this out to the viewmodel when i do that, just here for sanity check rn + } else if (query.isNotEmpty()) { //todo: will pull this out to the viewmodel, just here for sanity check rn val filteredList = highlightsList.filter { it.title.contains(query, ignoreCase = true) } diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt index a23e3cf..22bd302 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt @@ -15,8 +15,10 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.dropShadow +import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.shadow.Shadow @@ -95,11 +97,12 @@ fun HighlightsSubScreen( HighlightsSubScreenHeader(header, {}) } Spacer(modifier = Modifier.height(16.dp)) + + val focusRequester = remember { FocusRequester() } HighlightsScreenSearchFilterBar( sportList, - - false - ) //need viewmodel to handle comms between composables + focusRequester + ) Spacer(modifier = Modifier.height(8.dp)) Column( modifier = Modifier.padding(horizontal = 24.dp) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8792d22..ae9a8a6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,6 +19,7 @@ material3 = "1.4.0-alpha11" material3Version = "1.3.2" runtime = "1.9.4" ui = "1.9.4" +foundationLayout = "1.9.4" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -37,6 +38,7 @@ androidx-media3-common-ktx = { group = "androidx.media3", name = "media3-common- androidx-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3Version" } androidx-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "runtime" } androidx-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "ui" } +androidx-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout", version.ref = "foundationLayout" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } From 69eac9dd94b7051e8f2eefaa30c4be80605a7889 Mon Sep 17 00:00:00 2001 From: amjiao Date: Sun, 30 Nov 2025 17:19:24 -0600 Subject: [PATCH 10/18] pr gradle fixes --- app/build.gradle.kts | 5 ++--- gradle/libs.versions.toml | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c6dd7c0..e609e74 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -62,10 +62,9 @@ android { dependencies { // Jetpack Compose dependencies - implementation(platform("androidx.compose:compose-bom:2025.10.01")) - implementation("androidx.compose.ui:ui:1.4.0") + implementation(platform("androidx.compose:compose-bom:2025.11.01")) + implementation("androidx.compose.ui:ui:1.9.4") implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.ui:ui-tooling-preview:1.4.3") implementation("androidx.activity:activity-compose") implementation("androidx.lifecycle:lifecycle-viewmodel-compose") implementation("androidx.navigation:navigation-compose:2.8.2") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ae9a8a6..c98bfce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,10 +13,8 @@ constraintlayout = "2.1.4" runtimeAndroid = "1.7.2" apollo = "4.1.1" media3CommonKtx = "1.5.1" -# Using alpha version due to bug with pull to refresh in the latest stabel version -# See https://stackoverflow.com/a/79126321 -material3 = "1.4.0-alpha11" -material3Version = "1.3.2" +material3 = "1.4.0" +material3Version = "1.4.0" runtime = "1.9.4" ui = "1.9.4" foundationLayout = "1.9.4" From a59734117d18335401cb1c6130f93ffa178b549d Mon Sep 17 00:00:00 2001 From: amjiao Date: Sun, 30 Nov 2025 17:28:52 -0600 Subject: [PATCH 11/18] pr RecentSearches fixes --- .../components/highlights/RecentSearches.kt | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt index 357eff2..3e7d23e 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt @@ -4,10 +4,9 @@ import androidx.compose.foundation.clickable 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.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -23,18 +22,19 @@ import com.cornellappdev.score.theme.Style.metricSmallNormal @Composable -fun RecentSearchItem( +private fun RecentSearchItem( query: String ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = {/*search the query*/ }) ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(12.dp), - modifier = Modifier.clickable(onClick = {/*search the query*/ }) + horizontalArrangement = Arrangement.spacedBy(12.dp) ) { Icon( painter = painterResource(R.drawable.search), @@ -44,14 +44,15 @@ fun RecentSearchItem( Text(query, style = metricSmallNormal) } - //this icon doesn't preview correctly since its too small, works when actually running though - Icon( - painter = painterResource(R.drawable.ic_close), - contentDescription = "close icon", - tint = Color.Unspecified, - modifier = Modifier.clickable(onClick = {/*delete this search from the recent searches list*/ }) - ) - + IconButton( + onClick = {/*delete this search from the recent searches list*/ } + ) { + Icon( + painter = painterResource(R.drawable.ic_close), + contentDescription = "close icon", + tint = Color.Unspecified, + ) + } } } @@ -61,11 +62,11 @@ fun RecentSearches( ) { Column( modifier = Modifier - .fillMaxWidth() + .fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text("Recent searches", style = bodyMedium) - recentQueriesList.map { query -> - Spacer(Modifier.height(16.dp)) + recentQueriesList.forEach { query -> RecentSearchItem(query) } } From 250559de7b9db2d441511bdbd929c154238b8ba2 Mon Sep 17 00:00:00 2001 From: amjiao Date: Sun, 30 Nov 2025 21:04:54 -0600 Subject: [PATCH 12/18] pr search bar fixes --- .../HighlightsScreenSearchFilterBar.kt | 38 ++++++------ .../highlights/HighlightsSearchBar.kt | 60 +++++++++++++------ .../score/screen/HighlightsSearchScreen.kt | 12 +--- .../score/screen/HighlightsSubScreen.kt | 3 +- 4 files changed, 65 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt index fa27a24..d1bb1e5 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsScreenSearchFilterBar.kt @@ -1,8 +1,8 @@ package com.cornellappdev.score.components.highlights +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -19,7 +19,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.tooling.preview.Preview @@ -31,46 +30,49 @@ import com.cornellappdev.score.util.sportList @Composable fun HighlightsScreenSearchFilterBar( - sportList: List, - focusRequester: FocusRequester + sportList: List ) { val focusManager = LocalFocusManager.current - var isActive by remember { mutableStateOf(true) } + var isFocused by remember { mutableStateOf(true) } //todo: should probably be handled by viewModel Column(modifier = Modifier.fillMaxWidth()) { Row( modifier = Modifier .padding(horizontal = 24.dp) .clip(shape = RoundedCornerShape(100.dp)) - .clickable(onClick = {/*todo clear the highlight rows and show recent searches*/ }), + .onFocusChanged { focusState -> + if (focusState.isFocused && !isFocused) { + /*todo clear the highlight rows and show recent searches*/ + } + }, horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.CenterVertically ) { HighlightsSearchBar( onSearchClick = { - isActive = true - focusRequester.requestFocus() + isFocused = true }, - focusRequester = focusRequester, modifier = Modifier .weight(1f) .onFocusChanged { state -> // When the search bar loses focus, hide cancel if (!state.isFocused) { - isActive = !isActive + isFocused = !isFocused } } ) - if (isActive) { - Box( + AnimatedVisibility( + isFocused + ) { + Text( + "Cancel", + style = bodyMedium, modifier = Modifier.clickable { - isActive = true; + isFocused = true; focusManager.clearFocus(force = true) /*todo: clear the text in the search bar*/ } - ) { - Text("Cancel", style = bodyMedium) - } + ) } } Spacer(modifier = Modifier.height(16.dp)) @@ -82,7 +84,7 @@ fun HighlightsScreenSearchFilterBar( @Composable private fun HighlightsScreenSearchFilterBarActivePreview() { ScorePreview { - HighlightsScreenSearchFilterBar(sportList, FocusRequester()) + HighlightsScreenSearchFilterBar(sportList) } } @@ -90,6 +92,6 @@ private fun HighlightsScreenSearchFilterBarActivePreview() { @Composable private fun HighlightsScreenSearchFilterBarInactivePreview() { ScorePreview { - HighlightsScreenSearchFilterBar(sportList, FocusRequester()) + HighlightsScreenSearchFilterBar(sportList) } } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt index 0e4983d..e788409 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt @@ -1,9 +1,15 @@ package com.cornellappdev.score.components.highlights +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.scaleIn +import androidx.compose.animation.scaleOut import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -15,6 +21,7 @@ import androidx.compose.foundation.text.BasicTextField import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -37,12 +44,17 @@ import com.cornellappdev.score.theme.Style.bodyNormal @Composable fun HighlightsSearchBar( onSearchClick: () -> Unit, - focusRequester: FocusRequester, modifier: Modifier = Modifier ) { val interactionSource = remember { MutableInteractionSource() } var searchQuery by remember { mutableStateOf("") } //todo: to be handled by viewmodel + val focusRequester = remember { FocusRequester() } + + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + Row( modifier = modifier .fillMaxWidth() @@ -61,6 +73,7 @@ fun HighlightsSearchBar( Spacer(Modifier.width(8.dp)) + var isFocused by remember { mutableStateOf(false) } Box(modifier = Modifier.weight(1f)) { if (searchQuery.isEmpty()) { Text( @@ -71,31 +84,45 @@ fun HighlightsSearchBar( BasicTextField( value = searchQuery, - onValueChange = { searchQuery = it }, + onValueChange = { searchQuery = it /*todo viewmodel load results*/}, singleLine = true, textStyle = bodyNormal, visualTransformation = VisualTransformation.None, interactionSource = interactionSource, modifier = Modifier - .then( - focusRequester.let { Modifier.focusRequester(it) } - ) + .focusRequester(focusRequester) .fillMaxWidth() .background(Color.Transparent) + .onFocusChanged { focusState -> + if (focusState.isFocused && !isFocused) { + /*todo call viewmodel -> clear highlight rows, load recent search history*/ + isFocused = true + } else if (!focusState.isFocused) { + isFocused = false + } + } ) } + if (searchQuery.isNotEmpty()) { - Icon( - painter = painterResource(R.drawable.ic_close), - contentDescription = "clear field", - modifier = Modifier.clickable( - onClick = { searchQuery = "" } + AnimatedVisibility( + visible = searchQuery.isNotEmpty(), + enter = fadeIn() + scaleIn(), + exit = fadeOut() + scaleOut() + ) { + Icon( + painter = painterResource(R.drawable.ic_close), + contentDescription = "clear field", + modifier = Modifier.clickable( + onClick = { searchQuery = "" } + ) ) - ) + } } } } +/*HighlightsSearchBarUI is the non-functional version of the HighlightsSearchBar, it's a dummy component that's clickable in HighlightsScreen and will navigate to HighlightsSearchScreen */ @Composable fun HighlightsSearchBarUI( onClick: () -> Unit, @@ -106,18 +133,17 @@ fun HighlightsSearchBarUI( .background(Color.White, RoundedCornerShape(100.dp)) .border(1.dp, GrayLight, RoundedCornerShape(100.dp)) .clip(RoundedCornerShape(100.dp)) - .clickable( - ) { onClick() } + .clickable(onClick = { onClick() }) .padding(horizontal = 16.dp, vertical = 8.dp), - verticalAlignment = Alignment.CenterVertically) { - + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { Icon( painter = painterResource(R.drawable.search), contentDescription = "search icon", tint = Color.Unspecified ) - Spacer(Modifier.width(8.dp)) Text( text = "Search keywords", style = bodyNormal.copy(color = Color.Gray) @@ -134,5 +160,5 @@ private fun HighlightsSearchBarUIPreview() { @Preview @Composable private fun HighlightsSearchBarPreview() { - HighlightsSearchBar({}, FocusRequester() ) + HighlightsSearchBar({}) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt index 876be9d..a44131b 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt @@ -9,10 +9,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -42,19 +39,12 @@ fun HighlightsSearchScreen( .background(color = Color.White) .padding(top = 24.dp) ) { - val focusRequester = remember { FocusRequester() } - - LaunchedEffect(Unit) { - focusRequester.requestFocus() - } - Row(modifier = Modifier.padding(horizontal = 24.dp)) { Text(text = header, style = heading2) } Spacer(modifier = Modifier.height(16.dp)) HighlightsScreenSearchFilterBar( - sportList, - focusRequester = focusRequester + sportList ) Spacer(modifier = Modifier.height(24.dp)) Column( diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt index 22bd302..9b94767 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt @@ -100,8 +100,7 @@ fun HighlightsSubScreen( val focusRequester = remember { FocusRequester() } HighlightsScreenSearchFilterBar( - sportList, - focusRequester + sportList ) Spacer(modifier = Modifier.height(8.dp)) Column( From edf83c079f506384ccdaeef76c54ebe8731e76d7 Mon Sep 17 00:00:00 2001 From: amjiao Date: Mon, 1 Dec 2025 02:11:36 -0500 Subject: [PATCH 13/18] recent search item padding fix --- .../score/components/highlights/RecentSearches.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt index 3e7d23e..fe7bf3a 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text @@ -45,12 +46,13 @@ private fun RecentSearchItem( } IconButton( - onClick = {/*delete this search from the recent searches list*/ } + onClick = {/*delete this search from the recent searches list*/ }, + modifier = Modifier.size(24.dp) ) { Icon( painter = painterResource(R.drawable.ic_close), contentDescription = "close icon", - tint = Color.Unspecified, + tint = Color.Unspecified ) } } @@ -75,6 +77,14 @@ fun RecentSearches( @Preview @Composable private fun RecentSearchItemPreview() { + ScorePreview() { + RecentSearchItem("hello") + } +} + +@Preview +@Composable +private fun RecentSearchPreview() { ScorePreview { RecentSearches(listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey")) } From 1ad57cd7ec08718ff9f66b218d43549ff13c7295 Mon Sep 17 00:00:00 2001 From: amjiao Date: Mon, 1 Dec 2025 02:11:52 -0500 Subject: [PATCH 14/18] Parameterize previews --- .../score/screen/HighlightsSearchScreen.kt | 60 +++++++++---------- .../score/util/TestingConstants.kt | 2 + 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt index a44131b..212add4 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt @@ -12,9 +12,12 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.cornellappdev.score.R import com.cornellappdev.score.components.EmptyStateBox +import com.cornellappdev.score.components.ScorePreview import com.cornellappdev.score.components.highlights.HighlightsCardLazyColumn import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar import com.cornellappdev.score.components.highlights.RecentSearches @@ -23,6 +26,7 @@ import com.cornellappdev.score.model.Sport import com.cornellappdev.score.theme.Style.bodyNormal import com.cornellappdev.score.theme.Style.heading2 import com.cornellappdev.score.util.highlightsList +import com.cornellappdev.score.util.recentSearchList import com.cornellappdev.score.util.sportList @Composable @@ -70,38 +74,32 @@ fun HighlightsSearchScreen( } } -@Preview -@Composable -private fun HighlightsSearchScreenStartStatePreview() { - HighlightsSearchScreen( - sportList, - listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey"), - highlightsList, - "", - "Search All Highlights" - ) -} +data class HighlightsSearchScreenPreviewData( + val sportList: List, + val recentSearchList: List, + val query: String +) -@Preview -@Composable -private fun HighlightsSearchScreenQueryMissPreview() { - HighlightsSearchScreen( - sportList, - listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey"), - highlightsList, - "Sports", - "Search All Highlights" - ) +class HighlightsSearchScreenPreviewProvider : PreviewParameterProvider { + override val values: Sequence = sequence { + yield(HighlightsSearchScreenPreviewData(sportList, recentSearchList, "")) + yield(HighlightsSearchScreenPreviewData(sportList, recentSearchList, "Sports")) + yield(HighlightsSearchScreenPreviewData(sportList, recentSearchList, "Hockey")) + } } -@Preview +@Preview(showBackground = true) @Composable -private fun HighlightsSearchScreenQueryHitPreview() { - HighlightsSearchScreen( - sportList, - listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey"), - highlightsList, - "Hockey", - "Search All Highlights" - ) -} +private fun HighlightScreenPreview( + @PreviewParameter(HighlightsSearchScreenPreviewProvider::class) previewData: HighlightsSearchScreenPreviewData +) { + ScorePreview { + HighlightsSearchScreen( + sportList = previewData.sportList, + recentSearchList = previewData.recentSearchList, + highlightsList = highlightsList, + query = previewData.query, + header = "Search All Highlights" + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/util/TestingConstants.kt b/app/src/main/java/com/cornellappdev/score/util/TestingConstants.kt index 6d066e4..476077b 100644 --- a/app/src/main/java/com/cornellappdev/score/util/TestingConstants.kt +++ b/app/src/main/java/com/cornellappdev/score/util/TestingConstants.kt @@ -225,6 +225,8 @@ val sportSelectionList = listOf( SportSelection.SportSelect(Sport.FIELD_HOCKEY) ) +val recentSearchList = listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey") + //Mixed type val highlightsList = listOf( HighlightData.Video From 91c976f2bd852f6bb05c464d30cce6b62401209b Mon Sep 17 00:00:00 2001 From: amjiao Date: Mon, 1 Dec 2025 02:55:21 -0500 Subject: [PATCH 15/18] recentsearches UI fix --- .../cornellappdev/score/components/highlights/RecentSearches.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt index fe7bf3a..1cf3957 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/RecentSearches.kt @@ -47,7 +47,7 @@ private fun RecentSearchItem( IconButton( onClick = {/*delete this search from the recent searches list*/ }, - modifier = Modifier.size(24.dp) + modifier = Modifier.size(10.dp) ) { Icon( painter = painterResource(R.drawable.ic_close), From 5dc83ea245d3a7c19dca1c4b3a95fe2008e4bf05 Mon Sep 17 00:00:00 2001 From: amjiao Date: Mon, 1 Dec 2025 02:55:31 -0500 Subject: [PATCH 16/18] Abstract results lazy column --- .../highlights/HighlightsCardLazyColumn.kt | 70 ++++++++++++++++--- .../score/screen/HighlightsSearchScreen.kt | 33 +++------ .../score/screen/HighlightsSubScreen.kt | 30 ++------ 3 files changed, 75 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt index 63a948c..89b73be 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsCardLazyColumn.kt @@ -1,38 +1,88 @@ package com.cornellappdev.score.components.highlights import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.cornellappdev.score.R +import com.cornellappdev.score.components.EmptyStateBox import com.cornellappdev.score.components.ScorePreview import com.cornellappdev.score.model.HighlightData +import com.cornellappdev.score.theme.Style.bodyNormal import com.cornellappdev.score.util.highlightsList +import com.cornellappdev.score.util.recentSearchList @Composable fun HighlightsCardLazyColumn( - highlightsList: List + recentSearchList: List, + query: String, + highlightsList: List, + numResultsHeader: (@Composable () -> Unit)? = null ) { - LazyColumn( - modifier = Modifier.padding(top = 16.dp), - verticalArrangement = Arrangement.spacedBy(16.dp) + Column( + modifier = Modifier.padding(horizontal = 24.dp) ) { - items(highlightsList) { item -> - when (item) { - is HighlightData.Video -> VideoHighlightCard(item.data, true) - is HighlightData.Article -> ArticleHighlightCard(item.data, true) + if (recentSearchList.isNotEmpty() && query.isEmpty()) { //start state: no search attempted yet + RecentSearches(recentSearchList) + } else if (query.isNotEmpty()) { //filtering - will pull this out to the viewmodel when i do that, just here for sanity check rn + val filteredList = highlightsList.filter { + it.title.contains(query, ignoreCase = true) + } + if (filteredList.isEmpty()) { + EmptyStateBox( + icon = R.drawable.ic_kid_star, + title = "No results yet.", + ) + } else { + numResultsHeader?.invoke() + LazyColumn( + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + items(highlightsList) { item -> + when (item) { + is HighlightData.Video -> VideoHighlightCard(item.data, true) + is HighlightData.Article -> ArticleHighlightCard(item.data, true) + } + } + } } } } } +/* Used to display number of results in on HighlightsSearchScreen*/ +@Composable +fun HighlightsCardLazyColumnNumResultsHeader( + size: Int +) { + Column { + Text("$size Results", style = bodyNormal) + Spacer(Modifier.height(16.dp)) + } +} + +@Preview +@Composable +private fun HighlightsCardLazyColumnSubScreenPreview() { + ScorePreview { + HighlightsCardLazyColumn(recentSearchList, "", highlightsList) + } +} + @Preview @Composable -private fun HighlightsCardLazyColumnPreview() { +private fun HighlightsCardLazyColumnSearchResultsPreview() { ScorePreview { - HighlightsCardLazyColumn(highlightsList) + HighlightsCardLazyColumn( + recentSearchList, "", highlightsList, + { HighlightsCardLazyColumnNumResultsHeader(highlightsList.size) }) } } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt index 212add4..1b4cfb4 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSearchScreen.kt @@ -15,15 +15,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp -import com.cornellappdev.score.R -import com.cornellappdev.score.components.EmptyStateBox import com.cornellappdev.score.components.ScorePreview import com.cornellappdev.score.components.highlights.HighlightsCardLazyColumn +import com.cornellappdev.score.components.highlights.HighlightsCardLazyColumnNumResultsHeader import com.cornellappdev.score.components.highlights.HighlightsScreenSearchFilterBar -import com.cornellappdev.score.components.highlights.RecentSearches import com.cornellappdev.score.model.HighlightData import com.cornellappdev.score.model.Sport -import com.cornellappdev.score.theme.Style.bodyNormal import com.cornellappdev.score.theme.Style.heading2 import com.cornellappdev.score.util.highlightsList import com.cornellappdev.score.util.recentSearchList @@ -51,26 +48,11 @@ fun HighlightsSearchScreen( sportList ) Spacer(modifier = Modifier.height(24.dp)) - Column( - modifier = Modifier.padding(horizontal = 24.dp) - ) { - if (recentSearchList.isNotEmpty() && query.isEmpty()) { //start state: no search attempted yet - RecentSearches(recentSearchList) - } else if (query.isNotEmpty()) { //todo: will pull this out to the viewmodel, just here for sanity check rn - val filteredList = highlightsList.filter { - it.title.contains(query, ignoreCase = true) - } - if (filteredList.isEmpty()) { - EmptyStateBox( - icon = R.drawable.ic_kid_star, - title = "No results yet.", - ) - } else { - Text("${filteredList.size} Results", style = bodyNormal) - HighlightsCardLazyColumn(filteredList) - } - } - } + HighlightsCardLazyColumn( + recentSearchList, + query, + highlightsList, + { HighlightsCardLazyColumnNumResultsHeader(highlightsList.size) }) } } @@ -80,7 +62,8 @@ data class HighlightsSearchScreenPreviewData( val query: String ) -class HighlightsSearchScreenPreviewProvider : PreviewParameterProvider { +class HighlightsSearchScreenPreviewProvider : + PreviewParameterProvider { override val values: Sequence = sequence { yield(HighlightsSearchScreenPreviewData(sportList, recentSearchList, "")) yield(HighlightsSearchScreenPreviewData(sportList, recentSearchList, "Sports")) diff --git a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt index 9b94767..cfe63e2 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/HighlightsSubScreen.kt @@ -40,7 +40,7 @@ import com.cornellappdev.score.util.highlightsList import com.cornellappdev.score.util.sportList @Composable -fun HighlightsSubScreenHeader( +private fun HighlightsSubScreenHeader( header: String, navigateBack: () -> Unit ) { @@ -97,31 +97,15 @@ fun HighlightsSubScreen( HighlightsSubScreenHeader(header, {}) } Spacer(modifier = Modifier.height(16.dp)) - - val focusRequester = remember { FocusRequester() } HighlightsScreenSearchFilterBar( sportList ) - Spacer(modifier = Modifier.height(8.dp)) - Column( - modifier = Modifier.padding(horizontal = 24.dp) - ) { - if (recentSearchList.isNotEmpty() && query.isEmpty()) { //start state: no search attempted yet - RecentSearches(recentSearchList) - } else if (query.isNotEmpty()) { //filtering - will pull this out to the viewmodel when i do that, just here for sanity check rn - val filteredList = highlightsList.filter { - it.title.contains(query, ignoreCase = true) - } - if (filteredList.isEmpty()) { - EmptyStateBox( - icon = R.drawable.ic_kid_star, - title = "No results yet.", - ) - } else { - HighlightsCardLazyColumn(filteredList) - } - } - } + Spacer(modifier = Modifier.height(24.dp)) + HighlightsCardLazyColumn( + recentSearchList, + query, + highlightsList + ) } } From 917f1da5e5e5cc76df537e02f2a7f4b871f0b67a Mon Sep 17 00:00:00 2001 From: amjiao Date: Mon, 1 Dec 2025 03:06:55 -0500 Subject: [PATCH 17/18] clean up app/gradle --- app/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e609e74..af7ba9e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -63,14 +63,13 @@ android { dependencies { // Jetpack Compose dependencies implementation(platform("androidx.compose:compose-bom:2025.11.01")) - implementation("androidx.compose.ui:ui:1.9.4") + implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.activity:activity-compose") implementation("androidx.lifecycle:lifecycle-viewmodel-compose") implementation("androidx.navigation:navigation-compose:2.8.2") implementation(libs.material3) implementation("com.google.dagger:hilt-android:2.51.1") - implementation(libs.androidx.material3) implementation(libs.androidx.foundation.layout) kapt("com.google.dagger:hilt-android-compiler:2.51.1") implementation("androidx.hilt:hilt-navigation-compose:1.0.0") @@ -80,7 +79,6 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) - implementation("io.coil-kt:coil-compose:2.0.0") implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.runtime.android) @@ -88,7 +86,6 @@ dependencies { debugImplementation("androidx.compose.ui:ui-tooling") androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) - implementation(libs.apollo.runtime) implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1") implementation(libs.apollo.runtime) implementation("io.coil-kt.coil3:coil-compose:3.1.0") From b8dd80c1feca2cccf566c7acb60d36213cdccab4 Mon Sep 17 00:00:00 2001 From: amjiao Date: Mon, 1 Dec 2025 03:10:55 -0500 Subject: [PATCH 18/18] fix search bar clear icon animation --- .../highlights/HighlightsSearchBar.kt | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt index e788409..3c29f37 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/HighlightsSearchBar.kt @@ -84,7 +84,7 @@ fun HighlightsSearchBar( BasicTextField( value = searchQuery, - onValueChange = { searchQuery = it /*todo viewmodel load results*/}, + onValueChange = { searchQuery = it /*todo viewmodel load results*/ }, singleLine = true, textStyle = bodyNormal, visualTransformation = VisualTransformation.None, @@ -104,20 +104,18 @@ fun HighlightsSearchBar( ) } - if (searchQuery.isNotEmpty()) { - AnimatedVisibility( - visible = searchQuery.isNotEmpty(), - enter = fadeIn() + scaleIn(), - exit = fadeOut() + scaleOut() - ) { - Icon( - painter = painterResource(R.drawable.ic_close), - contentDescription = "clear field", - modifier = Modifier.clickable( - onClick = { searchQuery = "" } - ) + AnimatedVisibility( + visible = searchQuery.isNotEmpty(), + enter = fadeIn() + scaleIn(), + exit = fadeOut() + scaleOut() + ) { + Icon( + painter = painterResource(R.drawable.ic_close), + contentDescription = "clear field", + modifier = Modifier.clickable( + onClick = { searchQuery = "" } ) - } + ) } } }