Skip to content

Commit e8eddb9

Browse files
committed
Fix match completion logic for score displaying
1 parent a31909e commit e8eddb9

File tree

5 files changed

+163
-140
lines changed

5 files changed

+163
-140
lines changed

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/EventDivisionMatchesView.kt

Lines changed: 1 addition & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11
package com.sunkensplashstudios.VRCRoboScout
22

33
import androidx.compose.foundation.clickable
4-
import androidx.compose.foundation.layout.Arrangement
54
import androidx.compose.foundation.layout.Column
6-
import androidx.compose.foundation.layout.Row
7-
import androidx.compose.foundation.layout.Spacer
85
import androidx.compose.foundation.layout.fillMaxSize
96
import androidx.compose.foundation.layout.padding
10-
import androidx.compose.foundation.layout.width
11-
import androidx.compose.foundation.rememberScrollState
12-
import androidx.compose.foundation.verticalScroll
137
import androidx.compose.material.icons.Icons
148
import androidx.compose.material.icons.automirrored.filled.ArrowBackIos
15-
import androidx.compose.material3.Card
16-
import androidx.compose.material3.CardColors
179
import androidx.compose.material3.CenterAlignedTopAppBar
1810
import androidx.compose.material3.ExperimentalMaterial3Api
19-
import androidx.compose.material3.HorizontalDivider
2011
import androidx.compose.material3.Icon
2112
import androidx.compose.material3.MaterialTheme
2213
import androidx.compose.material3.Scaffold
@@ -28,20 +19,14 @@ import androidx.compose.runtime.getValue
2819
import androidx.compose.runtime.mutableStateOf
2920
import androidx.compose.runtime.remember
3021
import androidx.compose.runtime.setValue
31-
import androidx.compose.ui.Alignment
3222
import androidx.compose.ui.Modifier
33-
import androidx.compose.ui.graphics.Color
3423
import androidx.compose.ui.text.font.FontWeight
35-
import androidx.compose.ui.text.style.TextAlign
36-
import androidx.compose.ui.text.style.TextOverflow
3724
import androidx.compose.ui.unit.dp
38-
import androidx.compose.ui.unit.sp
3925
import androidx.lifecycle.ViewModel
4026
import androidx.lifecycle.viewmodel.compose.viewModel
4127
import androidx.navigation.NavController
4228
import com.ramcosta.composedestinations.annotation.Destination
43-
import com.sunkensplashstudios.VRCRoboScout.ui.theme.allianceBlue
44-
import com.sunkensplashstudios.VRCRoboScout.ui.theme.allianceRed
29+
import com.sunkensplashstudios.VRCRoboScout.helperviews.MatchesView
4530
import com.sunkensplashstudios.VRCRoboScout.ui.theme.onTopContainer
4631
import com.sunkensplashstudios.VRCRoboScout.ui.theme.topContainer
4732
import kotlinx.coroutines.CoroutineScope
@@ -54,122 +39,6 @@ class EventDivisionMatchesViewModel: ViewModel() {
5439
var division by mutableStateOf(Division())
5540
}
5641

57-
@Composable
58-
fun MatchesView(matchList: List<Match>) {
59-
val timeFormat = java.text.SimpleDateFormat("h:mm a", java.util.Locale.getDefault())
60-
Column(
61-
modifier = Modifier.verticalScroll(rememberScrollState())
62-
) {
63-
Card(
64-
modifier = Modifier.padding(10.dp),
65-
colors = CardColors(
66-
containerColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = 0.5f),
67-
disabledContainerColor = Color.Unspecified.copy(alpha = 0.5f),
68-
contentColor = MaterialTheme.colorScheme.onSurface,
69-
disabledContentColor = Color.Unspecified
70-
)
71-
) {
72-
Column(
73-
modifier = Modifier.padding(horizontal = 5.dp, vertical = 0.dp)
74-
) {
75-
(matchList).forEach { match ->
76-
Row(
77-
verticalAlignment = Alignment.CenterVertically
78-
) {
79-
Column(
80-
modifier = Modifier.width(65.dp),
81-
verticalArrangement = Arrangement.spacedBy((-3).dp)
82-
) {
83-
Text(
84-
text = match.shortName,
85-
fontSize = 16.sp,
86-
fontWeight = FontWeight.Bold,
87-
color = MaterialTheme.colorScheme.onSurface
88-
)
89-
Text(
90-
text = match.startedDate?.let { timeFormat.format(it) }
91-
?: match.scheduledDate?.let { timeFormat.format(it) }
92-
?: "",
93-
fontSize = 12.sp,
94-
color = MaterialTheme.colorScheme.onSurface
95-
)
96-
}
97-
Spacer(modifier = Modifier.width(10.dp))
98-
Row(
99-
verticalAlignment = Alignment.CenterVertically
100-
) {
101-
Column(
102-
horizontalAlignment = Alignment.CenterHorizontally,
103-
modifier = Modifier.width(60.dp),
104-
verticalArrangement = Arrangement.spacedBy((-5).dp)
105-
) {
106-
match.redAlliance.members.forEach{ member ->
107-
Text(
108-
text = member.team.name,
109-
fontSize = 15.sp,
110-
color = allianceRed
111-
)
112-
}
113-
}
114-
Spacer(modifier = Modifier.width(20.dp))
115-
if (match.completed()) {
116-
Text(
117-
match.redScore.toString(),
118-
fontSize = 18.sp,
119-
fontWeight = FontWeight.Bold,
120-
color = allianceRed,
121-
textAlign = TextAlign.Start,
122-
modifier = Modifier.width(50.dp)
123-
)
124-
Spacer(modifier = Modifier.weight(1f))
125-
Text(
126-
match.blueScore.toString(),
127-
fontSize = 18.sp,
128-
fontWeight = FontWeight.Bold,
129-
color = allianceBlue,
130-
textAlign = TextAlign.End,
131-
modifier = Modifier.width(50.dp)
132-
)
133-
}
134-
else {
135-
Spacer(modifier = Modifier.weight(1f))
136-
Text(
137-
match.field ?: "",
138-
fontSize = 14.sp,
139-
overflow = TextOverflow.Ellipsis,
140-
color = Color.Gray,
141-
textAlign = TextAlign.Center
142-
)
143-
Spacer(modifier = Modifier.weight(1f))
144-
}
145-
Spacer(modifier = Modifier.width(20.dp))
146-
Column(
147-
horizontalAlignment = Alignment.CenterHorizontally,
148-
modifier = Modifier.width(60.dp),
149-
verticalArrangement = Arrangement.spacedBy((-5).dp)
150-
) {
151-
match.blueAlliance.members.forEach{ member ->
152-
Text(
153-
text = member.team.name,
154-
fontSize = 15.sp,
155-
color = allianceBlue
156-
)
157-
}
158-
}
159-
}
160-
}
161-
if (match != matchList.last()) {
162-
HorizontalDivider(
163-
thickness = 0.5.dp,
164-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
165-
)
166-
}
167-
}
168-
}
169-
}
170-
}
171-
}
172-
17342
@OptIn(ExperimentalMaterial3Api::class)
17443
@Destination
17544
@Composable

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/EventTeamMatchesView.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import androidx.lifecycle.ViewModel
2626
import androidx.lifecycle.viewmodel.compose.viewModel
2727
import androidx.navigation.NavController
2828
import com.ramcosta.composedestinations.annotation.Destination
29-
import com.sunkensplashstudios.VRCRoboScout.ui.theme.*
29+
import com.sunkensplashstudios.VRCRoboScout.helperviews.MatchesView
30+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.onTopContainer
31+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.topContainer
3032
import kotlinx.coroutines.CoroutineScope
3133
import kotlinx.coroutines.Dispatchers
3234
import kotlinx.coroutines.launch

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/LookupView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ fun TeamLookup(lookupViewModel: LookupViewModel, navController: NavController) {
254254
.padding(horizontal = 20.dp)
255255
.fillMaxWidth()
256256
) {
257-
Spacer(Modifier.width(10.dp)) // Thank you Android for making spacing weird
257+
Spacer(Modifier.width(14.dp)) // Thank you Android for making spacing weird
258258
Icon(
259259
Icons.Filled.Star,
260260
modifier = Modifier

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/RoboScoutAPI.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,8 @@ class RoboScoutAPI {
194194
}
195195

196196
fun roboteventsDate(date: String, localize: Boolean): Date? {
197-
val formatter = SimpleDateFormat()
198-
199197
try {
198+
val formatter = SimpleDateFormat()
200199
// Example date: "2023-04-26T11:54:40-04:00"
201200
return if (localize) {
202201
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ssZ")
@@ -211,14 +210,21 @@ class RoboScoutAPI {
211210
}
212211
}
213212
catch (e: java.text.ParseException) {
213+
println("Could not parse date: $e")
214214
return null
215215
}
216216
}
217217

218218
fun formatDate(date: Date?): String {
219-
if (date == null) return ""
220-
val outputFormat = SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH)
221-
return outputFormat.format(date)
219+
try {
220+
if (date == null) return ""
221+
val outputFormat = SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH)
222+
return outputFormat.format(date)
223+
}
224+
catch (e: java.text.ParseException) {
225+
println("Could not format date: $e")
226+
return ""
227+
}
222228
}
223229

224230
suspend fun roboteventsRequest(requestUrl: String, params: Map<String, Any> = emptyMap<String, Any>()): List<JsonObject> {
@@ -325,6 +331,7 @@ class RoboScoutAPI {
325331
for (match in matches) {
326332
skuArray.add(match.value.replace("https://www.robotevents.com/robot-competitions/vex-robotics-competition/", "").replace(".html", ""))
327333
}
334+
println("Matches: $skuArray")
328335

329336
return skuArray
330337
}
@@ -487,7 +494,7 @@ data class Match(
487494
}
488495

489496
fun completed(): Boolean {
490-
return !(started == null || (startedDate ?: Date()).time > Date().time - 300000) && redScore != 0 && blueScore != 0
497+
return (this.redScore != 0 || this.blueScore != 0) || (this.startedDate != null && (startedDate.time < Date().time - 300000) && this.redScore == 0 && this.blueScore == 0)
491498
}
492499
}
493500

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
package com.sunkensplashstudios.VRCRoboScout.helperviews
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.Row
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.padding
8+
import androidx.compose.foundation.layout.width
9+
import androidx.compose.foundation.rememberScrollState
10+
import androidx.compose.foundation.verticalScroll
11+
import androidx.compose.material3.Card
12+
import androidx.compose.material3.CardColors
13+
import androidx.compose.material3.HorizontalDivider
14+
import androidx.compose.material3.MaterialTheme
15+
import androidx.compose.material3.Text
16+
import androidx.compose.runtime.Composable
17+
import androidx.compose.ui.Alignment
18+
import androidx.compose.ui.Modifier
19+
import androidx.compose.ui.graphics.Color
20+
import androidx.compose.ui.text.font.FontWeight
21+
import androidx.compose.ui.text.style.TextAlign
22+
import androidx.compose.ui.text.style.TextOverflow
23+
import androidx.compose.ui.unit.dp
24+
import androidx.compose.ui.unit.sp
25+
import com.sunkensplashstudios.VRCRoboScout.Match
26+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.allianceBlue
27+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.allianceRed
28+
29+
@Composable
30+
fun MatchesView(matchList: List<Match>) {
31+
val timeFormat = java.text.SimpleDateFormat("h:mm a", java.util.Locale.getDefault())
32+
Column(
33+
modifier = Modifier.verticalScroll(rememberScrollState())
34+
) {
35+
Card(
36+
modifier = Modifier.padding(10.dp),
37+
colors = CardColors(
38+
containerColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = 0.5f),
39+
disabledContainerColor = Color.Unspecified.copy(alpha = 0.5f),
40+
contentColor = MaterialTheme.colorScheme.onSurface,
41+
disabledContentColor = Color.Unspecified
42+
)
43+
) {
44+
Column(
45+
modifier = Modifier.padding(horizontal = 5.dp, vertical = 0.dp)
46+
) {
47+
(matchList).forEach { match ->
48+
Row(
49+
verticalAlignment = Alignment.CenterVertically
50+
) {
51+
Column(
52+
modifier = Modifier.width(65.dp),
53+
verticalArrangement = Arrangement.spacedBy((-3).dp)
54+
) {
55+
Text(
56+
text = match.shortName,
57+
fontSize = 16.sp,
58+
fontWeight = FontWeight.Bold,
59+
color = MaterialTheme.colorScheme.onSurface
60+
)
61+
Text(
62+
text = match.startedDate?.let { timeFormat.format(it) }
63+
?: match.scheduledDate?.let { timeFormat.format(it) }
64+
?: "",
65+
fontSize = 12.sp,
66+
color = MaterialTheme.colorScheme.onSurface
67+
)
68+
}
69+
Spacer(modifier = Modifier.width(10.dp))
70+
Row(
71+
verticalAlignment = Alignment.CenterVertically
72+
) {
73+
Column(
74+
horizontalAlignment = Alignment.CenterHorizontally,
75+
modifier = Modifier.width(60.dp),
76+
verticalArrangement = Arrangement.spacedBy((-5).dp)
77+
) {
78+
match.redAlliance.members.forEach{ member ->
79+
Text(
80+
text = member.team.name,
81+
fontSize = 15.sp,
82+
color = allianceRed
83+
)
84+
}
85+
}
86+
Spacer(modifier = Modifier.width(10.dp))
87+
if (match.completed()) {
88+
Text(
89+
match.redScore.toString(),
90+
fontSize = 18.sp,
91+
fontWeight = FontWeight.Bold,
92+
color = allianceRed,
93+
textAlign = TextAlign.Start,
94+
modifier = Modifier.width(50.dp)
95+
)
96+
Spacer(modifier = Modifier.weight(1f))
97+
Text(
98+
match.blueScore.toString(),
99+
fontSize = 18.sp,
100+
fontWeight = FontWeight.Bold,
101+
color = allianceBlue,
102+
textAlign = TextAlign.End,
103+
modifier = Modifier.width(50.dp)
104+
)
105+
}
106+
else {
107+
Spacer(modifier = Modifier.weight(1f))
108+
Text(
109+
match.field ?: "",
110+
fontSize = 14.sp,
111+
overflow = TextOverflow.Ellipsis,
112+
maxLines = 1,
113+
color = Color.Gray,
114+
textAlign = TextAlign.Center,
115+
modifier = Modifier.width(100.dp)
116+
)
117+
Spacer(modifier = Modifier.weight(1f))
118+
}
119+
Spacer(modifier = Modifier.width(10.dp))
120+
Column(
121+
horizontalAlignment = Alignment.CenterHorizontally,
122+
modifier = Modifier.width(60.dp),
123+
verticalArrangement = Arrangement.spacedBy((-5).dp)
124+
) {
125+
match.blueAlliance.members.forEach{ member ->
126+
Text(
127+
text = member.team.name,
128+
fontSize = 15.sp,
129+
color = allianceBlue
130+
)
131+
}
132+
}
133+
}
134+
}
135+
if (match != matchList.last()) {
136+
HorizontalDivider(
137+
thickness = 0.5.dp,
138+
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
139+
)
140+
}
141+
}
142+
}
143+
}
144+
}
145+
}

0 commit comments

Comments
 (0)