From 65b010a106bc268cea33c580ff06bfd0516b0340 Mon Sep 17 00:00:00 2001 From: amjiao Date: Wed, 11 Nov 2026 03:12:05 -0500 Subject: [PATCH 1/2] Add highlights networking and data layer --- app/src/main/graphql/Highlights.graphql | 17 ++ .../cornellappdev/score/model/Highlights.kt | 74 +++++- .../score/model/HighlightsRepository.kt | 76 ++++++ .../com/cornellappdev/score/util/DateUtil.kt | 17 ++ .../score/viewmodel/HighlightsViewModel.kt | 219 ++++++++++++++++++ 5 files changed, 397 insertions(+), 6 deletions(-) create mode 100644 app/src/main/graphql/Highlights.graphql create mode 100644 app/src/main/java/com/cornellappdev/score/model/HighlightsRepository.kt create mode 100644 app/src/main/java/com/cornellappdev/score/viewmodel/HighlightsViewModel.kt diff --git a/app/src/main/graphql/Highlights.graphql b/app/src/main/graphql/Highlights.graphql new file mode 100644 index 00000000..fa8b5d4b --- /dev/null +++ b/app/src/main/graphql/Highlights.graphql @@ -0,0 +1,17 @@ +query Highlights($sportsType: String) { + articles(sportsType: $sportsType) { + title + image + sportsType + publishedAt + url + } + youtubeVideos { + title + thumbnail + url + publishedAt + duration + sportsType + } +} \ No newline at end of file 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 2d893df1..e981cc26 100644 --- a/app/src/main/java/com/cornellappdev/score/model/Highlights.kt +++ b/app/src/main/java/com/cornellappdev/score/model/Highlights.kt @@ -1,33 +1,95 @@ package com.cornellappdev.score.model +import com.cornellappdev.score.util.formatDateTimeDisplay +import com.cornellappdev.score.util.isValidSport +import com.cornellappdev.score.util.outputFormatter +import com.cornellappdev.score.util.parseDateTimeOrNull +import com.cornellappdev.score.util.parseIsoDateToLocalDateOrNull +import com.example.score.HighlightsQuery +import java.time.LocalDate + data class VideoHighlightData( val title: String, val thumbnailImageUrl: String, val videoUrl: String, - val date: String, - val sport: Sport, - val gender: GenderDivision, + val gender: GenderDivision?, val duration: String? = null, val finalScore: String? = null, - val photoCredit: String? = null + val photoCredit: String? = null, + val date: LocalDate?, + val dateString: String, + val sport: Sport?, ) data class ArticleHighlightData( val title: String, val imageUrl: String, val articleUrl: String, - val date: String, - val sport: Sport + val date: LocalDate?, + val dateString: String, + val sport: Sport? ) sealed class HighlightData { abstract val title: String + abstract val date: LocalDate? + + abstract val dateString: String + abstract val sport: Sport? data class Video(val data: VideoHighlightData) : HighlightData() { override val title = data.title + override val date = data.date + override val dateString = data.dateString + override val sport = data.sport } data class Article(val data: ArticleHighlightData) : HighlightData() { override val title = data.title + override val date = data.date + override val dateString = data.dateString + override val sport = data.sport } +} + +fun HighlightsQuery.YoutubeVideo.toHighlightData(): HighlightData? { + val sportName = sportsType ?: return null + if (!isValidSport(sportName)) return null + + val date = parseIsoDateToLocalDateOrNull(publishedAt) + + return HighlightData.Video( + VideoHighlightData( + title = title, + thumbnailImageUrl = thumbnail, + videoUrl = url, + date = date, + dateString = date?.format(outputFormatter) ?: "-/-/-", + sport = Sport.fromDisplayName(sportName), + gender = if (title.contains("Men's")) { + GenderDivision.MALE + } else { + GenderDivision.FEMALE + }, + duration = duration + ) + ) +} + +fun HighlightsQuery.Article.toHighlightData(): HighlightData? { + val sportName = sportsType + if (!isValidSport(sportName)) return null + + val date = parseIsoDateToLocalDateOrNull(publishedAt) + + return HighlightData.Article( + ArticleHighlightData( + title = title, + imageUrl = image ?: return null, + articleUrl = url, + date = date, + dateString = date?.format(outputFormatter) ?: "-/-/-", + sport = Sport.fromDisplayName(sportName) + ) + ) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/model/HighlightsRepository.kt b/app/src/main/java/com/cornellappdev/score/model/HighlightsRepository.kt new file mode 100644 index 00000000..cb27e3af --- /dev/null +++ b/app/src/main/java/com/cornellappdev/score/model/HighlightsRepository.kt @@ -0,0 +1,76 @@ +package com.cornellappdev.score.model + +import android.util.Log +import com.apollographql.apollo.ApolloClient +import com.example.score.HighlightsQuery +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.Job +import kotlinx.coroutines.TimeoutCancellationException +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withTimeout +import javax.inject.Inject +import javax.inject.Singleton +import kotlin.coroutines.cancellation.CancellationException +import kotlin.time.Duration.Companion.milliseconds + +private const val TIMEOUT_TIME_MILLIS = 5000L + +@Singleton +class HighlightsRepository @Inject constructor( + private val apolloClient: ApolloClient, + private val appScope: CoroutineScope, +) { + private val _highlightsFlow = + MutableStateFlow>>(ApiResponse.Loading) + val highlightsFlow = _highlightsFlow.asStateFlow() + + //track the in-flight job so we can cancel it before starting a new one + private var currentFetchJob: Job? = null + + + /** + * Asynchronously fetches the list of highlights from the API. Once finished, will send down + * `upcomingGamesFlow` to be observed. + */ + fun fetchHighlights(): Job { + currentFetchJob?.cancel() + val fetchJob = appScope.launch(start = CoroutineStart.LAZY) { + + _highlightsFlow.value = ApiResponse.Loading + + try { + val result = + withTimeout(TIMEOUT_TIME_MILLIS.milliseconds) { + apolloClient.query(HighlightsQuery()).execute().toResult() + } + + if (result.isSuccess) { + val highlights = result.getOrNull() + val highlightsList = + highlights?.articles.orEmpty().mapNotNull { it?.toHighlightData() } + + highlights?.youtubeVideos.orEmpty().mapNotNull { it?.toHighlightData() } + + _highlightsFlow.value = ApiResponse.Success(highlightsList) + } else { + _highlightsFlow.value = ApiResponse.Error + } + + } catch (e: TimeoutCancellationException) { + Log.e("HighlightsRepository", "Highlights request timed out", e) + _highlightsFlow.value = ApiResponse.Error + } catch (e: CancellationException) { + throw e + } catch (e: Exception) { + Log.e("HighlightsRepository", "Error fetching highlights", e) + _highlightsFlow.value = ApiResponse.Error + } + } + currentFetchJob = fetchJob + fetchJob.start() + return fetchJob + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/util/DateUtil.kt b/app/src/main/java/com/cornellappdev/score/util/DateUtil.kt index 3075fe78..a76544ce 100644 --- a/app/src/main/java/com/cornellappdev/score/util/DateUtil.kt +++ b/app/src/main/java/com/cornellappdev/score/util/DateUtil.kt @@ -2,8 +2,10 @@ package com.cornellappdev.score.util import android.util.Log import java.time.Duration +import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime +import java.time.ZoneId import java.time.format.DateTimeFormatter import java.util.Locale @@ -66,6 +68,21 @@ fun parseDateTimeOrNull(date: String, time: String): LocalDateTime? { } } +/** + * Parses an ISO-8601 timestamp: yyyy-MM-dd'T'HH:mm:ss'Z' into a LocalDate? object. + * + * @param strDate the date string to parse, in the format "yyyy-MM-dd'T'HH:mm:ss'Z'" + * @return a LocalDate object if parsing succeeds, or null if the format is invalid + */ +fun parseIsoDateToLocalDateOrNull(strDate: String): LocalDate? { + return try { + Instant.parse(strDate) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + } catch (e: Exception) { + null + } +} /** * Formats a date and time string into a user-friendly display string. diff --git a/app/src/main/java/com/cornellappdev/score/viewmodel/HighlightsViewModel.kt b/app/src/main/java/com/cornellappdev/score/viewmodel/HighlightsViewModel.kt new file mode 100644 index 00000000..e5e26af1 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/score/viewmodel/HighlightsViewModel.kt @@ -0,0 +1,219 @@ +package com.cornellappdev.score.viewmodel + +import com.cornellappdev.score.model.ApiResponse +import com.cornellappdev.score.model.GenderDivision +import com.cornellappdev.score.model.HighlightData +import com.cornellappdev.score.model.HighlightsRepository +import com.cornellappdev.score.model.Sport +import com.cornellappdev.score.model.SportSelection +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.debounce +import java.time.LocalDate +import javax.inject.Inject + +data class HighlightsUiState( + val sportSelect: SportSelection, + val loadedState: ApiResponse>, + val isRefreshing: Boolean, + val sportSelectionList: List, + val filteredHighlights: List, + val todayHighlights: List, + val pastThreeDaysHighlights: List, + val query: String, + val recentSearches: List +) + +private fun buildDerivedLists( + highlights: List, + sportSelect: SportSelection, + query: String +): Triple, List, List> { + val today = LocalDate.now() + val threeDaysAgo = today.minusDays(3) + + val filteredBySport = highlights + .filter { it.date != null } + .filter { h -> + when (sportSelect) { + is SportSelection.All -> true + is SportSelection.SportSelect -> h.sport == sportSelect.sport + } + } + + val filteredByQuery = + if (query.isBlank()) filteredBySport + else filteredBySport.filter { + it.title.contains(query, ignoreCase = true) || + (it.sport?.displayName?.contains(query, ignoreCase = true) == true) + } + + val sorted = filteredByQuery.sortedByDescending { it.date } + + val todayHighlights = sorted.filter { it.date == today } + + val pastThreeDays = sorted.filter { date -> + date.date?.let { + it < today && it >= threeDaysAgo + } ?: false + } + + return Triple(sorted, todayHighlights, pastThreeDays) +} + +private fun recompute(highlights: List, state: HighlightsUiState) + : HighlightsUiState { + + val (filtered, today, pastThreeDays) = + buildDerivedLists(highlights, state.sportSelect, state.query) + + return state.copy( + filteredHighlights = filtered, + todayHighlights = today, + pastThreeDaysHighlights = pastThreeDays + ) +} + +@HiltViewModel +class HighlightsViewModel @Inject constructor( + private val highlightsRepository: HighlightsRepository +) : BaseViewModel( + HighlightsUiState( + sportSelect = SportSelection.All, + loadedState = ApiResponse.Loading, + isRefreshing = true, + sportSelectionList = Sport.getSportSelectionList(GenderDivision.ALL), + filteredHighlights = emptyList(), + todayHighlights = emptyList(), + pastThreeDaysHighlights = emptyList(), + query = "", + recentSearches = emptyList() + ) +) { + init { + highlightsRepository.fetchHighlights() + asyncCollect(highlightsRepository.highlightsFlow) { response -> + applyMutation { + when (response) { + is ApiResponse.Success -> { + val sorted = response.data.sortedByDescending { it.date } + + val (filtered, today, pastThreeDays) = + buildDerivedLists(sorted, sportSelect, query) + + copy( + loadedState = ApiResponse.Success(sorted), + isRefreshing = false, + filteredHighlights = filtered, + todayHighlights = today, + pastThreeDaysHighlights = pastThreeDays + ) + } + + ApiResponse.Loading -> + if (loadedState is ApiResponse.Success) { + copy( + isRefreshing = true + ) + } else { + copy(isRefreshing = true, + loadedState = ApiResponse.Loading, + filteredHighlights = emptyList(), + todayHighlights = emptyList(), + pastThreeDaysHighlights = emptyList() + ) + } + + ApiResponse.Error -> + if (loadedState is ApiResponse.Success) { + copy( + isRefreshing = false + ) + } else { + copy( + loadedState = ApiResponse.Error, + isRefreshing = false, + filteredHighlights = emptyList(), + todayHighlights = emptyList(), + pastThreeDaysHighlights = emptyList() + ) + } + } + } + } + } + + fun onQueryChange(newQuery: String) { + applyMutation { + val highlights = (loadedState as? ApiResponse.Success)?.data.orEmpty() + + recompute( + highlights, + copy(query = newQuery) + ) + } + } + + fun onRefresh() { + applyMutation { + copy(isRefreshing = true) + } + highlightsRepository.fetchHighlights() + } + + fun onSportSelected(sport: SportSelection) { + applyMutation { + val highlights = + (loadedState as? ApiResponse.Success)?.data.orEmpty() + + val newSelection = + if (sportSelect == sport) { + SportSelection.All + } else { + sport + } + + recompute( + highlights, + copy(sportSelect = newSelection) + ) + } + } + + fun onSearch(query: String) { + if (query.isBlank()) return + + applyMutation { + val highlights = + (loadedState as? ApiResponse.Success)?.data.orEmpty() + + val updatedSearches = + (listOf(query) + recentSearches) + .distinct() + .take(3) + + recompute( + highlights, + copy( + query = query, + recentSearches = updatedSearches + ) + ) + } + } + + //Removes an item from the recent searches list + fun onRemoveRecent(recent: String) { + applyMutation { + val updated = recentSearches.filterNot { it == recent } + copy(recentSearches = updated) + } + } + + //Searches an item from the recent searches list + fun onSearchRecent(recent: String) { + onSearch(recent) + } +} From 4d2e9341b38c1108482360b8266ad76c92139ae2 Mon Sep 17 00:00:00 2001 From: amjiao Date: Wed, 11 Nov 2026 11:49:58 -0500 Subject: [PATCH 2/2] Address android lint failure --- .../highlights/ArticleHighlightsCard.kt | 38 +++-------- .../components/highlights/ExternalLink.kt | 5 +- .../HighlightsScreenSearchFilterBar.kt | 5 +- .../components/highlights/RecentSearches.kt | 5 +- .../highlights/VideoHighlightsCard.kt | 59 ++++++++-------- .../score/screen/ProfileSampleData.kt | 6 +- .../score/util/TestingConstants.kt | 68 +++++++------------ 7 files changed, 75 insertions(+), 111 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/ArticleHighlightsCard.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/ArticleHighlightsCard.kt index fac49a3f..26fa4930 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/ArticleHighlightsCard.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/ArticleHighlightsCard.kt @@ -11,31 +11,20 @@ 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.foundation.text.BasicText -import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.LinkAnnotation -import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.TextLinkStyles -import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.text.withLink import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage -import com.cornellappdev.score.R import com.cornellappdev.score.model.ArticleHighlightData -import com.cornellappdev.score.model.Sport -import com.cornellappdev.score.theme.Style.bodySemibold +import com.cornellappdev.score.util.sampleArticleHighlight import com.cornellappdev.score.theme.Style.heading2 import com.cornellappdev.score.theme.Style.labelsNormal import com.cornellappdev.score.theme.White @@ -44,11 +33,12 @@ import com.cornellappdev.score.theme.White fun ArticleHighlightCard( articleHighlight: ArticleHighlightData, isWideFormat: Boolean, + modifier: Modifier = Modifier, linkTextStyle: TextStyle = TextStyle.Default, imageOverlayAlpha: Float = 0.4f ) { Box( - modifier = Modifier + modifier = modifier .then(if (isWideFormat) Modifier.fillMaxWidth() else Modifier.width(241.dp)) .height(192.dp) .clip(shape = RoundedCornerShape(12.dp)) @@ -98,9 +88,9 @@ fun ArticleHighlightCard( ) } Text( - color = Color.White, + text = articleHighlight.dateString, style = labelsNormal, - text = articleHighlight.date + color = Color.White, ) } } @@ -111,13 +101,7 @@ fun ArticleHighlightCard( @Composable private fun ArticleHighlightCardPreview() { ArticleHighlightCard( - ArticleHighlightData( - "Late Goal Lifts No. 6 Men’s Hockey Over Brown", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/9", - Sport.ICE_HOCKEY - ), + sampleArticleHighlight, false ) } @@ -126,13 +110,7 @@ private fun ArticleHighlightCardPreview() { @Composable private fun WideArticleHighlightCardPreview() { ArticleHighlightCard( - ArticleHighlightData( - "Late Goal Lifts No. 6 Men’s Hockey Over Brown", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/9", - Sport.ICE_HOCKEY - ), + sampleArticleHighlight, true ) } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/ExternalLink.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/ExternalLink.kt index fcd9ffd1..54d56861 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/ExternalLink.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/ExternalLink.kt @@ -1,19 +1,16 @@ package com.cornellappdev.score.components.highlights -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.text.BasicText import androidx.compose.material3.Icon import androidx.compose.runtime.Composable -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLinkStyles +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration 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 d5344b8a..8ef339a3 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 @@ -15,9 +15,10 @@ import com.cornellappdev.score.util.sportList @Composable fun HighlightsScreenSearchFilterBar( - sportList: List + sportList: List, + modifier: Modifier = Modifier ) { - Column(modifier = Modifier.fillMaxWidth()) { + Column(modifier = modifier.fillMaxWidth()) { HighlightsSearchBar(modifier = Modifier.padding(horizontal = 24.dp)) Spacer(modifier = Modifier.height(16.dp)) HighlightsFilterRow(sportList, {/*todo on filter selected*/ }) 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 460c37af..51662657 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 @@ -64,10 +64,11 @@ private fun RecentSearchItem( fun RecentSearches( recentQueriesList: List, onItemClick: () -> Unit, - onCloseClick: () -> Unit + onCloseClick: () -> Unit, + modifier: Modifier = Modifier ) { Column( - modifier = Modifier + modifier = modifier .fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(16.dp) ) { diff --git a/app/src/main/java/com/cornellappdev/score/components/highlights/VideoHighlightsCard.kt b/app/src/main/java/com/cornellappdev/score/components/highlights/VideoHighlightsCard.kt index b8257145..a7a63b1d 100644 --- a/app/src/main/java/com/cornellappdev/score/components/highlights/VideoHighlightsCard.kt +++ b/app/src/main/java/com/cornellappdev/score/components/highlights/VideoHighlightsCard.kt @@ -17,13 +17,13 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -39,6 +39,7 @@ import com.cornellappdev.score.theme.CrimsonPrimary import com.cornellappdev.score.theme.GrayStroke import com.cornellappdev.score.theme.Style.heading2 import com.cornellappdev.score.theme.Style.labelsNormal +import com.cornellappdev.score.util.sampleVideoHighlight @Composable private fun VideoHighlightCardHeader( @@ -99,17 +100,27 @@ fun VideoHighlightCardBody( Row( verticalAlignment = Alignment.CenterVertically ) { - Icon( - painter = painterResource(videoHighlight.sport.emptyIcon), - contentDescription = "Sport icon", - modifier = Modifier.size(24.dp), - tint = Color.Unspecified - ) - Icon( - painter = painterResource(if (videoHighlight.gender == GenderDivision.FEMALE) R.drawable.ic_gender_women else R.drawable.ic_gender_men), - contentDescription = "Gender icon", - tint = Color.Unspecified - ) + if (videoHighlight.sport != null) { + Icon( + painter = painterResource(videoHighlight.sport.emptyIcon), + contentDescription = "Sport icon", + modifier = Modifier.size(24.dp), + tint = Color.Unspecified + ) + } + when (videoHighlight.gender) { + GenderDivision.FEMALE -> Icon( + painter = painterResource(R.drawable.ic_gender_women), + contentDescription = "Women's gender icon", + tint = Color.Unspecified + ) + GenderDivision.MALE -> Icon( + painter = painterResource(R.drawable.ic_gender_men), + contentDescription = "Men's gender icon", + tint = Color.Unspecified + ) + GenderDivision.ALL, null -> Unit + } } } Spacer(Modifier.height(8.dp)) @@ -128,7 +139,7 @@ fun VideoHighlightCardBody( } Text( style = labelsNormal, - text = videoHighlight.date + text = videoHighlight.dateString ) } } @@ -160,21 +171,15 @@ data class VideoHighlightPreviewData( class VideoHighlightsPreviewProvider : PreviewParameterProvider { override val values: Sequence = sequence { val samples = listOf( + sampleVideoHighlight, VideoHighlightData( - "vs Columbia", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/9", - Sport.BASEBALL, - GenderDivision.MALE - ), - VideoHighlightData( - "Late Goal Lifts No. 6 Men’s Hockey Over Brown", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/9", - Sport.BASEBALL, - GenderDivision.MALE + title = "Late Goal Lifts No. 6 Men’s Hockey Over Brown", + thumbnailImageUrl = "maxresdefault.jpg", + videoUrl = "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", + date = null, + dateString = "11/9", + sport = Sport.BASEBALL, + gender = GenderDivision.MALE ) ) for (sample in samples) { diff --git a/app/src/main/java/com/cornellappdev/score/screen/ProfileSampleData.kt b/app/src/main/java/com/cornellappdev/score/screen/ProfileSampleData.kt index 15f819e9..2995bc40 100644 --- a/app/src/main/java/com/cornellappdev/score/screen/ProfileSampleData.kt +++ b/app/src/main/java/com/cornellappdev/score/screen/ProfileSampleData.kt @@ -24,7 +24,8 @@ val sampleProfileData = ProfileData( title = "vs. Columbia", thumbnailImageUrl = "android.resource://com.cornellappdev.score/${R.drawable.profile_highlight_soccer}", videoUrl = "https://www.youtube.com/@CornellAthletics", - date = "11/09", + date = null, + dateString = "11/09", sport = Sport.BASEBALL, gender = GenderDivision.MALE, duration = "1:25", @@ -37,7 +38,8 @@ val sampleProfileData = ProfileData( title = "Late Goal Lifts No. 6 Men’s Hockey Over Brown", imageUrl = "android.resource://com.cornellappdev.score/${R.drawable.profile_highlight_hockey}", articleUrl = "https://cornellsun.com/", - date = "11/09", + date = null, + dateString = "11/09", sport = Sport.ICE_HOCKEY ) ) 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 a726a125..3b6f5b45 100644 --- a/app/src/main/java/com/cornellappdev/score/util/TestingConstants.kt +++ b/app/src/main/java/com/cornellappdev/score/util/TestingConstants.kt @@ -227,49 +227,29 @@ val sportSelectionList = listOf( val recentSearchList = listOf("Columbia", "Men's ice hockey", "Late goal lifts No.6 men’s hockey") -//Mixed type +val sampleVideoHighlight = VideoHighlightData( + title = "vs Columbia", + thumbnailImageUrl = "maxresdefault.jpg", + videoUrl = "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", + date = null, + dateString = "11/09", + sport = Sport.BASEBALL, + gender = GenderDivision.MALE +) + +val sampleArticleHighlight = ArticleHighlightData( + title = "Late Goal Lifts No. 6 Men’s Hockey Over Brown", + imageUrl = "maxresdefault.jpg", + articleUrl = "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", + date = null, + dateString = "11/09", + sport = Sport.ICE_HOCKEY +) + val highlightsList = listOf( - HighlightData.Video - (VideoHighlightData( - "vs Columbia", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/09", - Sport.BASEBALL, - GenderDivision.MALE - )), - HighlightData.Article - (ArticleHighlightData( - "Late Goal Lifts No. 6 Men’s Hockey Over Brown", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/09", - Sport.ICE_HOCKEY - )), - HighlightData.Video - (VideoHighlightData( - "vs Columbia", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/9", - Sport.BASEBALL, - GenderDivision.MALE - )), - HighlightData.Article - (ArticleHighlightData( - "Late Goal Lifts No. 6 Men’s Hockey Over Brown", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/09", - Sport.ICE_HOCKEY - )), - HighlightData.Video - (VideoHighlightData( - "vs Columbia", - "maxresdefault.jpg", - "https://cornellsun.com/article/london-mcdavid-is-making-a-name-for-herself-at-cornell", - "11/9", - Sport.BASEBALL, - GenderDivision.MALE - )) + HighlightData.Video(sampleVideoHighlight), + HighlightData.Article(sampleArticleHighlight), + HighlightData.Video(sampleVideoHighlight), + HighlightData.Article(sampleArticleHighlight), + HighlightData.Video(sampleVideoHighlight) ) \ No newline at end of file