Skip to content

Commit b38f818

Browse files
committed
PR comments
1 parent 1269b61 commit b38f818

10 files changed

Lines changed: 112 additions & 55 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.cornellappdev.transit.models.ecosystem
2+
3+
/**
4+
* Mapping of a day of the week to the hours for that day
5+
*/
6+
data class DayOperatingHours(
7+
val dayOfWeek: String,
8+
val hours: List<String>
9+
)

app/src/main/java/com/cornellappdev/transit/models/ecosystem/Eatery.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.cornellappdev.transit.models.ecosystem
22

3+
import com.cornellappdev.transit.util.TimeUtils.toPascalCaseString
34
import com.squareup.moshi.Json
45
import com.squareup.moshi.JsonClass
56
import java.time.DayOfWeek
@@ -45,20 +46,20 @@ data class Eatery(
4546
* and the corresponding times that an eatery is open. The list is sorted
4647
* by day with the custom dayOrder (Sunday first).
4748
*/
48-
fun formatOperatingHours(): OperatingHours {
49+
fun formatOperatingHours(): List<DayOperatingHours> {
4950
val dailyHours = operatingHours()
5051

5152
// Convert map to list and sort by custom day order
5253
return dailyHours.entries
5354
.sortedBy { entry ->
5455
val dayName =
55-
entry.key.name.take(1).uppercase() + entry.key.name.drop(1).lowercase()
56+
entry.key.toPascalCaseString()
5657
dayOrder[dayName] ?: Int.MAX_VALUE
5758
}
5859
.map { entry ->
5960
val dayName =
60-
entry.key.name.take(1).uppercase() + entry.key.name.drop(1).lowercase()
61-
dayName to entry.value
61+
entry.key.toPascalCaseString()
62+
DayOperatingHours(dayName, entry.value)
6263
}
6364
}
6465

@@ -80,7 +81,7 @@ data class Eatery(
8081
}
8182
}
8283

83-
DayOfWeek.values().forEach { dayOfWeek ->
84+
DayOfWeek.entries.forEach { dayOfWeek ->
8485
dailyHours.computeIfAbsent(dayOfWeek) { mutableListOf("Closed") }
8586
}
8687

app/src/main/java/com/cornellappdev/transit/models/ecosystem/OperatingHours.kt

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

app/src/main/java/com/cornellappdev/transit/ui/components/home/DetailedPlaceHeaderSection.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.compose.ui.Alignment
1212
import androidx.compose.ui.Modifier
1313
import androidx.compose.ui.text.AnnotatedString
1414
import androidx.compose.ui.text.style.TextOverflow
15+
import androidx.compose.ui.tooling.preview.Preview
1516
import androidx.compose.ui.unit.dp
1617
import com.cornellappdev.transit.ui.theme.PrimaryText
1718
import com.cornellappdev.transit.ui.theme.SecondaryText
@@ -79,4 +80,15 @@ fun DetailedPlaceHeaderSection(
7980

8081
FavoritesStar(onFavoriteClick, isFavorite)
8182
}
83+
}
84+
85+
@Preview(showBackground = true)
86+
@Composable
87+
private fun DetailedPlaceHeaderSectionPreview() {
88+
DetailedPlaceHeaderSection(
89+
title = "Atrium Cafe",
90+
subtitle = "Sage Hall",
91+
onFavoriteClick = {},
92+
isFavorite = false
93+
)
8294
}

app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ import androidx.compose.ui.unit.sp
2222
import androidx.hilt.navigation.compose.hiltViewModel
2323
import com.cornellappdev.transit.R
2424
import com.cornellappdev.transit.models.Place
25+
import com.cornellappdev.transit.models.ecosystem.DayOperatingHours
2526
import com.cornellappdev.transit.models.ecosystem.DetailedEcosystemPlace
26-
import com.cornellappdev.transit.models.ecosystem.OperatingHours
27+
import com.cornellappdev.transit.models.ecosystem.Eatery
2728
import com.cornellappdev.transit.models.ecosystem.StaticPlaces
2829
import com.cornellappdev.transit.networking.ApiResponse
2930
import com.cornellappdev.transit.ui.theme.robotoFamily
@@ -124,7 +125,7 @@ private fun BottomSheetFilteredContent(
124125

125126
FilterState.EATERIES -> {
126127
eateryList(
127-
staticPlaces = staticPlaces,
128+
eateriesApiResponse = staticPlaces.eateries,
128129
onDetailsClick = onDetailsClick,
129130
favorites = favorites,
130131
onFavoriteStarClick = onFavoriteStarClick,
@@ -222,13 +223,13 @@ private fun LazyListScope.printerList(
222223
* LazyList scoped enumeration of eateries for bottom sheet
223224
*/
224225
private fun LazyListScope.eateryList(
225-
staticPlaces: StaticPlaces,
226+
eateriesApiResponse: ApiResponse<List<Eatery>>,
226227
onDetailsClick: (DetailedEcosystemPlace) -> Unit,
227228
favorites: Set<Place>,
228229
onFavoriteStarClick: (Place) -> Unit,
229-
operatingHoursToString: (OperatingHours) -> AnnotatedString
230+
operatingHoursToString: (List<DayOperatingHours>) -> AnnotatedString
230231
) {
231-
when (staticPlaces.eateries) {
232+
when (eateriesApiResponse) {
232233
is ApiResponse.Error -> {
233234
}
234235

@@ -239,7 +240,7 @@ private fun LazyListScope.eateryList(
239240
}
240241

241242
is ApiResponse.Success -> {
242-
items(staticPlaces.eateries.data) {
243+
items(eateriesApiResponse.data) {
243244
RoundedImagePlaceCard(
244245
imageUrl = it.imageUrl,
245246
title = it.name,

app/src/main/java/com/cornellappdev/transit/ui/components/home/ExpandableOperatingHoursList.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,24 @@ import androidx.compose.ui.graphics.vector.ImageVector
2222
import androidx.compose.ui.res.painterResource
2323
import androidx.compose.ui.res.vectorResource
2424
import androidx.compose.ui.text.AnnotatedString
25+
import androidx.compose.ui.text.buildAnnotatedString
26+
import androidx.compose.ui.tooling.preview.Preview
2527
import androidx.compose.ui.unit.dp
2628
import com.cornellappdev.transit.R
27-
import com.cornellappdev.transit.models.ecosystem.OperatingHours
29+
import com.cornellappdev.transit.models.ecosystem.DayOperatingHours
2830
import com.cornellappdev.transit.ui.theme.DividerGray
2931
import com.cornellappdev.transit.ui.theme.Gray05
3032
import com.cornellappdev.transit.ui.theme.Style
33+
import com.cornellappdev.transit.util.sampleHours
3134

3235
/**
3336
*
3437
*/
3538
@Composable
36-
fun ExpandableOperatingHoursList(annotatedString: AnnotatedString, operatingHours: OperatingHours) {
39+
fun ExpandableOperatingHoursList(
40+
annotatedString: AnnotatedString,
41+
operatingHours: List<DayOperatingHours>
42+
) {
3743

3844
var isExpanded by remember { mutableStateOf(false) }
3945

@@ -70,10 +76,21 @@ fun ExpandableOperatingHoursList(annotatedString: AnnotatedString, operatingHour
7076
}
7177
}
7278

73-
if(isExpanded) {
79+
if (isExpanded) {
7480
OperatingHoursList(operatingHours)
7581
}
7682
HorizontalDivider(thickness = 1.dp, color = DividerGray)
7783
}
7884

85+
}
86+
87+
@Preview(showBackground = true)
88+
@Composable
89+
private fun ExpandableOperatingHoursListPreview() {
90+
ExpandableOperatingHoursList(
91+
annotatedString = buildAnnotatedString {
92+
append("Open")
93+
},
94+
operatingHours = sampleHours
95+
)
7996
}

app/src/main/java/com/cornellappdev/transit/ui/components/home/OperatingHoursList.kt

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,27 @@
11
package com.cornellappdev.transit.ui.components.home
22

3-
import androidx.compose.foundation.background
43
import androidx.compose.foundation.layout.Arrangement
54
import androidx.compose.foundation.layout.Column
65
import androidx.compose.foundation.layout.Row
76
import androidx.compose.foundation.layout.Spacer
87
import androidx.compose.foundation.layout.fillMaxWidth
98
import androidx.compose.foundation.layout.height
109
import androidx.compose.foundation.layout.padding
11-
import androidx.compose.foundation.layout.size
1210
import androidx.compose.foundation.layout.width
1311
import androidx.compose.material3.Text
1412
import androidx.compose.material3.VerticalDivider
1513
import androidx.compose.runtime.Composable
1614
import androidx.compose.ui.Alignment
1715
import androidx.compose.ui.Modifier
18-
import androidx.compose.ui.graphics.Color
1916
import androidx.compose.ui.text.style.TextAlign
2017
import androidx.compose.ui.tooling.preview.Preview
2118
import androidx.compose.ui.unit.dp
22-
import com.cornellappdev.transit.models.ecosystem.OperatingHours
19+
import com.cornellappdev.transit.models.ecosystem.DayOperatingHours
2320
import com.cornellappdev.transit.ui.theme.PrimaryText
2421
import com.cornellappdev.transit.ui.theme.SecondaryText
2522
import com.cornellappdev.transit.ui.theme.Style.heading3
2623
import com.cornellappdev.transit.ui.theme.Style.heading3Semibold
24+
import com.cornellappdev.transit.util.sampleHours
2725

2826
/**
2927
* Composable that displays operating hours for an eatery
@@ -33,7 +31,7 @@ import com.cornellappdev.transit.ui.theme.Style.heading3Semibold
3331
*/
3432
@Composable
3533
fun OperatingHoursList(
36-
operatingHours: OperatingHours,
34+
operatingHours: List<DayOperatingHours>,
3735
modifier: Modifier = Modifier
3836
) {
3937
Column(
@@ -67,10 +65,16 @@ private fun OperatingHoursRow(
6765
horizontalArrangement = Arrangement.SpaceBetween,
6866
verticalAlignment = Alignment.Top
6967
) {
70-
Row (horizontalArrangement = Arrangement.Start,
71-
modifier = Modifier.weight(0.6f)) {
68+
Row(
69+
horizontalArrangement = Arrangement.Start,
70+
modifier = Modifier.weight(0.6f)
71+
) {
7272
if (isHighlighted) {
73-
VerticalDivider(color = PrimaryText, thickness = 2.dp, modifier = Modifier.height(16.dp))
73+
VerticalDivider(
74+
color = PrimaryText,
75+
thickness = 2.dp,
76+
modifier = Modifier.height(16.dp)
77+
)
7478
Spacer(Modifier.width(12.dp))
7579
} else {
7680
Spacer(Modifier.width(14.dp))
@@ -100,25 +104,9 @@ private fun OperatingHoursRow(
100104
}
101105
}
102106

103-
@Preview
107+
@Preview(showBackground = true)
104108
@Composable
105109
private fun OperatingHoursPreview() {
106-
val sampleHours = listOf(
107-
"Tuesday" to listOf("10:00 AM - 10:00 PM"),
108-
"Wednesday" to listOf("10:00 AM - 5:00 PM"),
109-
"Thursday" to listOf("Closed"),
110-
"Friday" to listOf("10:00 AM - 5:00 PM"),
111-
"Saturday" to listOf(
112-
"8:00 AM - 9:30 AM",
113-
"10:30 AM - 2:00 PM",
114-
"5:00 PM - 8:00 PM"
115-
),
116-
"Sunday" to listOf(
117-
"10:00 AM - 2:00 PM",
118-
"5:00 PM - 8:30 PM"
119-
),
120-
"Monday" to listOf("10:00 AM - 10:00 PM")
121-
)
122110

123111
OperatingHoursList(operatingHours = sampleHours)
124112
}

app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import com.cornellappdev.transit.models.RouteRepository
1414
import com.cornellappdev.transit.models.SelectedRouteRepository
1515
import com.cornellappdev.transit.models.ecosystem.StaticPlaces
1616
import com.cornellappdev.transit.models.UserPreferenceRepository
17+
import com.cornellappdev.transit.models.ecosystem.DayOperatingHours
1718
import com.cornellappdev.transit.models.ecosystem.EateryRepository
1819
import com.cornellappdev.transit.models.ecosystem.GymRepository
19-
import com.cornellappdev.transit.models.ecosystem.OperatingHours
2020
import com.cornellappdev.transit.networking.ApiResponse
2121
import com.cornellappdev.transit.ui.theme.LateRed
2222
import com.cornellappdev.transit.ui.theme.LiveGreen
2323
import com.cornellappdev.transit.ui.theme.SecondaryText
2424
import com.cornellappdev.transit.ui.theme.Style.cardSubtitle
25+
import com.cornellappdev.transit.util.TimeUtils.toPascalCaseString
2526
import com.google.android.gms.maps.model.LatLng
2627
import dagger.hilt.android.lifecycle.HiltViewModel
2728
import kotlinx.coroutines.flow.MutableStateFlow
@@ -295,14 +296,13 @@ class HomeViewModel @Inject constructor(
295296
* @param operatingHours A list of pairs mapping the first value day string to second value list of hours open
296297
*/
297298
fun rotateOperatingHours(
298-
operatingHours: OperatingHours,
299+
operatingHours: List<DayOperatingHours>,
299300
currentDate: LocalDate = LocalDate.now()
300-
): OperatingHours {
301-
val today = currentDate.dayOfWeek.name.lowercase()
302-
.replaceFirstChar { it.uppercase() }
301+
): List<DayOperatingHours> {
302+
val today = currentDate.dayOfWeek.toPascalCaseString()
303303

304304
val todayIndex = operatingHours.indexOfFirst {
305-
it.first.equals(today, ignoreCase = true)
305+
it.dayOfWeek.equals(today, ignoreCase = true)
306306
}
307307

308308
// Defensive programming only if [operatingHours] is missing a day
@@ -314,9 +314,9 @@ class HomeViewModel @Inject constructor(
314314
/**
315315
* Find the next time a place is open if it is closed for the day
316316
*/
317-
private fun findOpenNextDay(operatingHours: OperatingHours): OpenStatus {
317+
private fun findOpenNextDay(operatingHours: List<DayOperatingHours>): OpenStatus {
318318
// Check day after
319-
val dayAfter = operatingHours[1].second
319+
val dayAfter = operatingHours[1].hours
320320
if (!dayAfter.any { it.equals("Closed", ignoreCase = true) }) {
321321
val firstOpenTime = parseTimeRange(dayAfter[0])?.first
322322
if (firstOpenTime != null) {
@@ -328,9 +328,9 @@ class HomeViewModel @Inject constructor(
328328
}
329329
// Find next open day
330330
for (i in 2 until operatingHours.size) {
331-
val currDay = operatingHours[i].second
331+
val currDay = operatingHours[i].hours
332332
if (!currDay.any { it.equals("Closed", ignoreCase = true) }) {
333-
val dayName = operatingHours[i].first
333+
val dayName = operatingHours[i].dayOfWeek
334334
return OpenStatus(
335335
false,
336336
"until $dayName"
@@ -347,12 +347,12 @@ class HomeViewModel @Inject constructor(
347347
* @param operatingHours A list of pairs mapping the first value day string to second value list of hours open
348348
*/
349349
private fun getOpenStatus(
350-
operatingHours: OperatingHours,
350+
operatingHours: List<DayOperatingHours>,
351351
currentDateTime: LocalDateTime = LocalDateTime.now()
352352
): OpenStatus {
353353

354354
val currentTime = currentDateTime.toLocalTime()
355-
val todaySchedule = operatingHours[0].second // First day should be today after rotation
355+
val todaySchedule = operatingHours[0].hours // First day should be today after rotation
356356

357357
// Check if closed today
358358
if (todaySchedule.any { it.equals("Closed", ignoreCase = true) }) {
@@ -436,7 +436,7 @@ class HomeViewModel @Inject constructor(
436436
/**
437437
* Rotate operating hours to current day, then determine if place is open, then format string
438438
*/
439-
fun isOpenAnnotatedStringFromOperatingHours(operatingHours: OperatingHours): AnnotatedString {
439+
fun isOpenAnnotatedStringFromOperatingHours(operatingHours: List<DayOperatingHours>): AnnotatedString {
440440
return getOpenStatusAnnotatedString(
441441
getOpenStatus(
442442
rotateOperatingHours(operatingHours)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.cornellappdev.transit.util
2+
3+
import com.cornellappdev.transit.models.ecosystem.DayOperatingHours
4+
5+
val sampleHours = listOf(
6+
DayOperatingHours("Tuesday", listOf("10:00 AM - 10:00 PM")),
7+
DayOperatingHours("Wednesday", listOf("10:00 AM - 5:00 PM")),
8+
DayOperatingHours("Thursday", listOf("Closed")),
9+
DayOperatingHours("Friday", listOf("10:00 AM - 5:00 PM")),
10+
DayOperatingHours(
11+
"Saturday", listOf(
12+
"8:00 AM - 9:30 AM",
13+
"10:30 AM - 2:00 PM",
14+
"5:00 PM - 8:00 PM"
15+
)
16+
),
17+
DayOperatingHours(
18+
"Sunday", listOf(
19+
"10:00 AM - 2:00 PM",
20+
"5:00 PM - 8:30 PM"
21+
)
22+
),
23+
DayOperatingHours("Monday", listOf("10:00 AM - 10:00 PM")),
24+
)

app/src/main/java/com/cornellappdev/transit/util/TimeUtils.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.cornellappdev.transit.util
22

33
import android.icu.text.SimpleDateFormat
4+
import java.time.DayOfWeek
45
import java.time.Duration
56
import java.time.Instant
67
import java.time.ZoneId
@@ -93,4 +94,11 @@ object TimeUtils {
9394
return Instant.parse(isoString).plusSeconds(seconds.toLong()).toString()
9495
}
9596

97+
/**
98+
* Day of week with first letter capitalized and all else lowercase
99+
*/
100+
fun DayOfWeek.toPascalCaseString(): String = this.name.lowercase()
101+
.replaceFirstChar { it.uppercase() }
102+
103+
96104
}

0 commit comments

Comments
 (0)