Skip to content

Commit 8449b76

Browse files
committed
Adjust capacity indicator
1 parent 3277a8c commit 8449b76

4 files changed

Lines changed: 39 additions & 25 deletions

File tree

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

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ import com.cornellappdev.transit.ui.theme.AccentClosed
2424
import com.cornellappdev.transit.ui.theme.AccentOpen
2525
import com.cornellappdev.transit.ui.theme.AccentOrange
2626
import com.cornellappdev.transit.ui.theme.Gray02
27-
import com.cornellappdev.transit.ui.theme.Gray04
2827
import com.cornellappdev.transit.ui.theme.PrimaryText
2928
import com.cornellappdev.transit.ui.theme.robotoFamily
30-
import com.cornellappdev.transit.util.LIMITED_CAPACITY_THRESHOLD
29+
import com.cornellappdev.transit.util.HIGH_CAPACITY_THRESHOLD
3130
import com.cornellappdev.transit.util.colorInterp
3231

3332
// Source: Uplift Android
@@ -39,17 +38,14 @@ import com.cornellappdev.transit.util.colorInterp
3938
* and whose second element is the max capacity.
4039
* @param label The name of the gym placed under this indicator. Can be null to indicate no
4140
* label.
42-
* @param closed If this gym is closed.
4341
*/
4442
@Composable
4543
fun GymCapacityIndicator(
46-
capacity: UpliftCapacity?,
44+
capacity: UpliftCapacity,
4745
label: String?,
48-
closed: Boolean,
4946
) {
50-
val grayedOut = closed || capacity == null
5147

52-
val fraction = if (!grayedOut) capacity!!.percent.toFloat() else 0f
48+
val fraction = capacity.percent.toFloat()
5349
val animatedFraction = remember { Animatable(0f) }
5450

5551
// When the composable launches, animate the fraction to the capacity fraction.
@@ -63,22 +59,21 @@ fun GymCapacityIndicator(
6359
// Choose a color. If between 0 & 0.5, tween between open and orange. If between 0.5 and 1,
6460
// tween between orange and closed.
6561
val color =
66-
if (fraction > LIMITED_CAPACITY_THRESHOLD)
62+
if (fraction > HIGH_CAPACITY_THRESHOLD)
6763
colorInterp(
68-
(fraction - LIMITED_CAPACITY_THRESHOLD) / (1 - LIMITED_CAPACITY_THRESHOLD),
64+
(fraction - HIGH_CAPACITY_THRESHOLD) / (1 - HIGH_CAPACITY_THRESHOLD),
6965
AccentOrange,
7066
AccentClosed
7167
)
7268
else
7369
colorInterp(
74-
fraction / LIMITED_CAPACITY_THRESHOLD,
70+
fraction / HIGH_CAPACITY_THRESHOLD,
7571
AccentOpen,
7672
AccentClosed
7773
)
7874

7975
val size = 54.dp
80-
val percentFontSize =
81-
12.sp * (if (closed || capacity != null) 1f else .9f)
76+
val percentFontSize = 12.sp
8277
val labelColor = PrimaryText
8378
val labelFontWeight = FontWeight(600)
8479
val labelPadding = 12.dp
@@ -99,12 +94,11 @@ fun GymCapacityIndicator(
9994
strokeCap = StrokeCap.Round
10095
)
10196
Text(
102-
text = if (closed) "CLOSED"
103-
else capacity?.percentString() ?: "NO DATA",
97+
text = capacity.percentString(),
10498
fontFamily = robotoFamily,
10599
fontSize = percentFontSize,
106100
fontWeight = FontWeight(700),
107-
color = if (grayedOut) Gray02 else PrimaryText,
101+
color = PrimaryText,
108102
modifier = Modifier.align(Alignment.Center),
109103
textAlign = TextAlign.Center,
110104
)

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import androidx.compose.ui.Alignment
1515
import androidx.compose.ui.Modifier
1616
import androidx.compose.ui.res.painterResource
1717
import androidx.compose.ui.res.stringResource
18-
import androidx.compose.ui.text.buildAnnotatedString
1918
import androidx.compose.ui.unit.dp
2019
import androidx.hilt.navigation.compose.hiltViewModel
2120
import com.cornellappdev.transit.R
@@ -30,13 +29,18 @@ import com.cornellappdev.transit.ui.viewmodels.HomeViewModel
3029
import com.cornellappdev.transit.util.getAboutContent
3130
import com.cornellappdev.transit.util.getGymLocationString
3231

32+
/**
33+
* Displays the full detail view for an individual gym within the ecosystem bottom sheet.
34+
*/
3335
@Composable
3436
fun GymDetailsContent(
3537
homeViewModel: HomeViewModel = hiltViewModel(),
3638
gym: UpliftGym,
3739
isFavorite: Boolean,
3840
onFavoriteClick: () -> Unit,
3941
) {
42+
val isOpen = homeViewModel.getOpenStatus(gym.operatingHours()).isOpen
43+
4044
Column(
4145
modifier = Modifier
4246
.fillMaxWidth()
@@ -60,11 +64,12 @@ fun GymDetailsContent(
6064
gym.operatingHours()
6165
),
6266
widget = {
63-
GymCapacityIndicator(
64-
capacity = gym.upliftCapacity,
65-
label = null,
66-
closed = false
67-
)
67+
if (gym.upliftCapacity != null && isOpen) {
68+
GymCapacityIndicator(
69+
capacity = gym.upliftCapacity,
70+
label = null,
71+
)
72+
}
6873
},
6974
)
7075

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@ import com.cornellappdev.transit.models.ecosystem.EateryRepository
2121
import com.cornellappdev.transit.models.ecosystem.GymRepository
2222
import com.cornellappdev.transit.models.ecosystem.UpliftCapacity
2323
import com.cornellappdev.transit.networking.ApiResponse
24+
import com.cornellappdev.transit.ui.theme.AccentClosed
25+
import com.cornellappdev.transit.ui.theme.AccentOpen
2426
import com.cornellappdev.transit.ui.theme.AccentOrange
2527
import com.cornellappdev.transit.ui.theme.LateRed
2628
import com.cornellappdev.transit.ui.theme.LiveGreen
2729
import com.cornellappdev.transit.ui.theme.SecondaryText
2830
import com.cornellappdev.transit.ui.theme.robotoFamily
29-
import com.cornellappdev.transit.util.LIMITED_CAPACITY_THRESHOLD
31+
import com.cornellappdev.transit.util.HIGH_CAPACITY_THRESHOLD
32+
import com.cornellappdev.transit.util.MEDIUM_CAPACITY_THRESHOLD
3033
import com.cornellappdev.transit.util.TimeUtils.toPascalCaseString
3134
import com.google.android.gms.maps.model.LatLng
3235
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -358,7 +361,7 @@ class HomeViewModel @Inject constructor(
358361
*
359362
* @param operatingHours A list of pairs mapping the first value day string to second value list of hours open
360363
*/
361-
private fun getOpenStatus(
364+
fun getOpenStatus(
362365
operatingHours: List<DayOperatingHours>,
363366
currentDateTime: LocalDateTime = LocalDateTime.now()
364367
): OpenStatus {
@@ -466,13 +469,21 @@ class HomeViewModel @Inject constructor(
466469
return AnnotatedString("")
467470
}
468471

472+
val color = if (capacity.percent <= MEDIUM_CAPACITY_THRESHOLD) {
473+
AccentOpen
474+
} else if (capacity.percent >= HIGH_CAPACITY_THRESHOLD) {
475+
AccentClosed
476+
} else {
477+
AccentOrange
478+
}
479+
469480
return buildAnnotatedString {
470481
withStyle(
471482
style = SpanStyle(
472483
fontSize = 14.sp,
473484
fontFamily = robotoFamily,
474485
fontWeight = FontWeight(600),
475-
color = if (capacity.percent <= LIMITED_CAPACITY_THRESHOLD) LiveGreen else AccentOrange,
486+
color = color,
476487
)
477488
) {
478489
append("${capacity.percentString()} full")

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ const val ECOSYSTEM_FLAG = BuildConfig.ECOSYSTEM_FLAG
66

77
const val BOTTOM_SHEET_MAX_HEIGHT_PERCENT = 90
88

9-
const val LIMITED_CAPACITY_THRESHOLD = 0.65f
9+
/** When the capacity turns to orange */
10+
const val MEDIUM_CAPACITY_THRESHOLD = 0.35f
11+
12+
/** When the capacity turns to red */
13+
const val HIGH_CAPACITY_THRESHOLD = 0.65f
1014

1115
const val NOTIFICATIONS_ENABLED = false

0 commit comments

Comments
 (0)