Skip to content

Commit 555d04d

Browse files
committed
test
1 parent 1dd1651 commit 555d04d

11 files changed

Lines changed: 205 additions & 77 deletions

File tree

.github/workflows/android-lint.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515

1616
steps:
1717
- uses: actions/checkout@v3
18+
1819
- name: set up JDK 17
1920
uses: actions/setup-java@v3
2021
with:
@@ -24,4 +25,8 @@ jobs:
2425

2526
- name: Run Lint
2627
run: ./gradlew lint
27-
continue-on-error: false
28+
continue-on-error: false
29+
30+
- name: Create google-services.json
31+
run: |
32+
echo "${{ secrets.GOOGLE_SERVICES_JSON_BASE64 }}" | base64 --decode > app/google-services.json

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ dependencies {
7272
implementation(libs.material3)
7373
implementation("com.google.dagger:hilt-android:2.51.1")
7474
implementation(libs.androidx.material3)
75+
implementation(libs.androidx.foundation)
7576
kapt("com.google.dagger:hilt-android-compiler:2.51.1")
7677
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
7778
implementation("com.google.accompanist:accompanist-pager:0.24.0-alpha")

app/src/google-services.json

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.cornellappdev.score.components
2+
3+
import androidx.compose.foundation.clickable
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.foundation.layout.size
6+
import androidx.compose.material3.Icon
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.res.painterResource
10+
import androidx.compose.ui.unit.dp
11+
import com.cornellappdev.score.R
12+
13+
@Composable
14+
fun CustomRadioButton(
15+
selected: Boolean,
16+
onClick: () -> Unit,
17+
modifier: Modifier = Modifier
18+
) {
19+
Icon(
20+
painter = painterResource(
21+
id = if (selected) R.drawable.ic_radio_selected else R.drawable.ic_radio_unselected
22+
),
23+
contentDescription = if (selected) "Selected" else "Unselected",
24+
modifier = modifier
25+
.size(20.dp)
26+
.padding(end = 8.dp)
27+
.clickable(onClick = onClick)
28+
)
29+
}
Lines changed: 59 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.cornellappdev.score.components
22

3+
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.animation.animateContentSize
35
import androidx.compose.foundation.clickable
46
import androidx.compose.foundation.layout.Arrangement
57
import androidx.compose.foundation.layout.Column
68
import androidx.compose.foundation.layout.Row
79
import androidx.compose.foundation.layout.fillMaxWidth
810
import androidx.compose.foundation.layout.padding
911
import androidx.compose.material3.Icon
10-
import androidx.compose.material3.RadioButton
1112
import androidx.compose.material3.Text
1213
import androidx.compose.runtime.Composable
1314
import androidx.compose.runtime.getValue
@@ -18,13 +19,43 @@ import androidx.compose.ui.Alignment
1819
import androidx.compose.ui.Modifier
1920
import androidx.compose.ui.res.painterResource
2021
import androidx.compose.ui.unit.dp
21-
import androidx.compose.ui.unit.sp
2222
import com.cornellappdev.score.R
23+
import com.cornellappdev.score.theme.Style.bodyNormal
24+
import com.cornellappdev.score.theme.Style.heading2
25+
26+
interface DisplayableFilter {
27+
val displayName: String
28+
}
29+
30+
enum class PriceFilter(override val displayName: String) : DisplayableFilter {
31+
UNTICKETED("Unticketed"),
32+
UNDER_20("Under $20"),
33+
UNDER_50("Under $50"),
34+
OVER_50("Over $50")
35+
}
36+
37+
enum class LocationFilter(override val displayName: String) : DisplayableFilter {
38+
ON_CAMPUS("On Campus"),
39+
ONE_TO_TWO_HOURS("1-2 Hours"),
40+
TWO_TO_FOUR_HOURS("2-4 Hours"),
41+
OVER_FOUR_HOURS("Over 4 Hours")
42+
}
43+
44+
enum class DateFilter(override val displayName: String) : DisplayableFilter {
45+
TODAY("Today"),
46+
WITHIN_7_DAYS("Within 7 Days"),
47+
WITHIN_A_MONTH("Within a Month"),
48+
OVER_A_MONTH("Over a Month")
49+
}
2350

2451
@Composable
25-
fun ExpandableSection(title: String, options: List<String>) {
52+
fun <T : DisplayableFilter> ExpandableSection(
53+
title: String,
54+
options: List<T>,
55+
selectedOption: T?,
56+
onOptionSelected: (T?) -> Unit
57+
) {
2658
var expanded by remember { mutableStateOf(false) }
27-
var selectedOption by remember { mutableStateOf("Under $20") }
2859

2960
Column {
3061
Row(
@@ -34,7 +65,7 @@ fun ExpandableSection(title: String, options: List<String>) {
3465
horizontalArrangement = Arrangement.SpaceBetween,
3566
verticalAlignment = Alignment.CenterVertically
3667
) {
37-
Text(title, fontSize = 18.sp)
68+
Text(title, style = heading2)
3869
Icon(
3970
painter = painterResource(
4071
id = if (expanded) R.drawable.ic_round_minus else R.drawable.ic_round_plus
@@ -43,24 +74,31 @@ fun ExpandableSection(title: String, options: List<String>) {
4374
)
4475
}
4576

46-
if (expanded) {
47-
Column {
48-
options.forEach { option ->
49-
Row(
50-
verticalAlignment = Alignment.CenterVertically,
51-
modifier = Modifier
52-
.fillMaxWidth()
53-
.clickable { selectedOption = option }
54-
.padding(vertical = 4.dp)
55-
) {
56-
RadioButton(
57-
selected = (selectedOption == option),
58-
onClick = { selectedOption = option }
59-
)
60-
Text(option)
77+
// Options
78+
Column(
79+
modifier = Modifier
80+
.fillMaxWidth()
81+
.animateContentSize()
82+
) {
83+
AnimatedVisibility(visible = expanded) {
84+
Column {
85+
options.forEach { option ->
86+
Row(
87+
verticalAlignment = Alignment.CenterVertically,
88+
modifier = Modifier
89+
.fillMaxWidth()
90+
.clickable { onOptionSelected(option) }
91+
.padding(start = 16.dp, top = 4.dp, bottom = 4.dp)
92+
) {
93+
CustomRadioButton(
94+
selected = (selectedOption == option),
95+
onClick = { onOptionSelected(option) }
96+
)
97+
Text(option.displayName, style = bodyNormal)
98+
}
6199
}
62100
}
63101
}
64102
}
65103
}
66-
}
104+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.cornellappdev.score.components
2+
3+
import androidx.compose.foundation.BorderStroke
4+
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.layout.Box
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.foundation.layout.size
8+
import androidx.compose.foundation.shape.RoundedCornerShape
9+
import androidx.compose.material3.Icon
10+
import androidx.compose.material3.Surface
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.ui.Alignment
13+
import androidx.compose.ui.Modifier
14+
import androidx.compose.ui.graphics.Color
15+
import androidx.compose.ui.graphics.painter.Painter
16+
import androidx.compose.ui.unit.dp
17+
18+
@Composable
19+
fun IconButton(
20+
icon: Painter,
21+
contentDescription: String?,
22+
onClick: () -> Unit,
23+
modifier: Modifier = Modifier,
24+
tint: Color = Color.Unspecified,
25+
borderColor: Color = Color(0xFFD6D6D6)
26+
) {
27+
Surface(
28+
modifier = modifier
29+
.clickable(onClick = onClick),
30+
shape = RoundedCornerShape(100.dp),
31+
border = BorderStroke(1.dp, borderColor),
32+
color = Color.Transparent
33+
) {
34+
Box(
35+
modifier = Modifier
36+
.padding(horizontal = 12.dp, vertical = 4.dp)
37+
.size(height = 32.dp, width = 32.dp),
38+
contentAlignment = Alignment.Center
39+
) {
40+
Icon(
41+
painter = icon,
42+
contentDescription = contentDescription,
43+
modifier = Modifier.size(24.dp),
44+
tint = tint
45+
)
46+
}
47+
}
48+
}

app/src/main/java/com/cornellappdev/score/model/ScoreRepository.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ import javax.inject.Inject
1818
import javax.inject.Singleton
1919

2020
private const val TIMEOUT_TIME_MILLIS = 5000L
21+
private const val PAGE_LIMIT = 100
22+
private const val MAX_RETRIES = 3
23+
private const val PAGE_TIMEOUT_MILLIS = 3000L
2124

2225
/**
2326
* This is a singleton responsible for fetching and caching all data for Score.
@@ -38,12 +41,6 @@ class ScoreRepository @Inject constructor(
3841
MutableStateFlow<ApiResponse<GameDetailsGame>>(ApiResponse.Loading)
3942
val currentGamesFlow = _currentGameFlow.asStateFlow()
4043

41-
companion object {
42-
private const val PAGE_LIMIT = 100
43-
private const val MAX_RETRIES = 3
44-
private const val PAGE_TIMEOUT_MILLIS = 3000L
45-
}
46-
4744
/**
4845
* Asynchronously fetches the list of games from the API. Once finished, will send down
4946
* `upcomingGamesFlow` to be observed.

0 commit comments

Comments
 (0)