Skip to content

Commit c5eeadb

Browse files
authored
Merge pull request #104 from cuappdev/mihili/settingsPage
Settings Page
2 parents 4ea518d + 519d89b commit c5eeadb

27 files changed

Lines changed: 1166 additions & 65 deletions

app/src/main/java/com/cornellappdev/transit/ui/NavigationController.kt

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

33
import androidx.compose.runtime.Composable
4-
import androidx.compose.ui.platform.LocalContext
54
import androidx.hilt.navigation.compose.hiltViewModel
65
import androidx.navigation.compose.NavHost
76
import androidx.navigation.compose.composable
@@ -10,6 +9,11 @@ import com.cornellappdev.transit.ui.screens.DetailsScreen
109
import com.cornellappdev.transit.ui.screens.HomeScreen
1110
import com.cornellappdev.transit.ui.screens.RouteScreen
1211
import com.cornellappdev.transit.ui.screens.SettingsScreen
12+
import com.cornellappdev.transit.ui.screens.settings.AboutScreen
13+
import com.cornellappdev.transit.ui.screens.settings.FavoritesScreen
14+
import com.cornellappdev.transit.ui.screens.settings.NotifsAndPrivacyScreen
15+
import com.cornellappdev.transit.ui.screens.settings.PrivacySettingsScreen
16+
import com.cornellappdev.transit.ui.screens.settings.SupportScreen
1317
import com.cornellappdev.transit.ui.viewmodels.HomeViewModel
1418
import com.cornellappdev.transit.ui.viewmodels.RouteViewModel
1519

@@ -43,9 +47,32 @@ fun NavigationController(
4347
}
4448

4549
composable("settings") {
46-
SettingsScreen(
47-
LocalContext.current
50+
SettingsScreen (
51+
onAboutClick = {navController.navigate("about")},
52+
onSupportClick = {navController.navigate("support")},
53+
onNotificationsAndPrivacyClick = {navController.navigate("notifs_privacy")})
54+
}
55+
56+
composable("about") {
57+
AboutScreen()
58+
}
59+
60+
composable("notifs_privacy") {
61+
NotifsAndPrivacyScreen (
62+
onPrivacyClick = {navController.navigate("privacy_settings")}
4863
)
4964
}
65+
66+
composable("privacy_settings") {
67+
PrivacySettingsScreen()
68+
}
69+
70+
composable("favorites") {
71+
FavoritesScreen()
72+
}
73+
74+
composable("support") {
75+
SupportScreen()
76+
}
5077
}
5178
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.cornellappdev.transit.ui.components
2+
3+
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.fillMaxWidth
7+
import androidx.compose.foundation.layout.padding
8+
import androidx.compose.material.icons.Icons
9+
import androidx.compose.material.icons.outlined.KeyboardArrowDown
10+
import androidx.compose.material.icons.outlined.KeyboardArrowUp
11+
import androidx.compose.material3.Text
12+
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.getValue
14+
import androidx.compose.runtime.mutableStateOf
15+
import androidx.compose.runtime.remember
16+
import androidx.compose.runtime.setValue
17+
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.graphics.Color
19+
import androidx.compose.ui.tooling.preview.Preview
20+
import androidx.compose.ui.unit.dp
21+
22+
//TODO: No FAQs are on the app at the moment
23+
/**
24+
*Compose function to display a FAQ item with a title and expandable content.
25+
* @param title The title of the FAQ item.
26+
* @param dropdownText The content to be displayed when the FAQ item is expanded.
27+
* **/
28+
@Composable
29+
fun FAQ(
30+
title: String,
31+
dropdownText: String,
32+
) {
33+
var expanded by remember { mutableStateOf(false) }
34+
35+
Column(
36+
modifier = Modifier
37+
.fillMaxWidth()
38+
.clickable { expanded = !expanded }
39+
.padding(12.dp)
40+
) {
41+
42+
PrivacyOptionItem(
43+
title,
44+
"",
45+
{ expanded = !expanded },
46+
if (expanded) Icons.Outlined.KeyboardArrowUp else Icons.Outlined.KeyboardArrowDown
47+
)
48+
49+
AnimatedVisibility(visible = expanded) {
50+
Column(modifier = Modifier.padding(top = 8.dp, start = 20.dp)) {
51+
Text(
52+
text = dropdownText,
53+
color = Color.Gray
54+
)
55+
}
56+
}
57+
}
58+
}
59+
60+
@Preview(showBackground = true)
61+
@Composable
62+
private fun FAQPreview() {
63+
FAQ(
64+
title = "How do I use this?",
65+
dropdownText = "Click here to learn more about how to use this feature.",
66+
)
67+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.cornellappdev.transit.ui.components
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Row
5+
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.foundation.shape.RoundedCornerShape
7+
import androidx.compose.material3.Icon
8+
import androidx.compose.material3.Text
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.ui.Alignment
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.graphics.Color
13+
import androidx.compose.ui.res.painterResource
14+
import androidx.compose.ui.tooling.preview.Preview
15+
import androidx.compose.ui.unit.dp
16+
import com.cornellappdev.transit.R
17+
18+
/**
19+
* Compose function to display a member item with a star icon and name.
20+
* @param name The name of the member.
21+
* **/
22+
@Composable
23+
fun MemberItem(name: String) {
24+
Row {
25+
Icon(
26+
painter = painterResource(id = R.drawable.small_star),
27+
contentDescription = null,
28+
tint = Color.LightGray,
29+
modifier = Modifier
30+
.align(Alignment.CenterVertically)
31+
)
32+
Text(
33+
text = name,
34+
modifier = Modifier
35+
.padding(8.dp)
36+
.background(
37+
color = Color.LightGray,
38+
shape = RoundedCornerShape(32.dp)
39+
)
40+
.padding(12.dp)
41+
)
42+
}
43+
}
44+
45+
@Preview
46+
@Composable
47+
private fun PreviewMemberItem() {
48+
MemberItem(name = "Alice")
49+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.cornellappdev.transit.ui.components
2+
3+
import androidx.compose.animation.core.LinearEasing
4+
import androidx.compose.animation.core.tween
5+
import androidx.compose.foundation.gestures.animateScrollBy
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.foundation.lazy.LazyRow
8+
import androidx.compose.foundation.lazy.rememberLazyListState
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.runtime.LaunchedEffect
11+
import androidx.compose.runtime.getValue
12+
import androidx.compose.runtime.mutableStateOf
13+
import androidx.compose.runtime.remember
14+
import androidx.compose.runtime.rememberCoroutineScope
15+
import androidx.compose.runtime.setValue
16+
import androidx.compose.ui.Alignment
17+
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.platform.LocalConfiguration
19+
import androidx.compose.ui.tooling.preview.Preview
20+
import androidx.compose.ui.unit.dp
21+
import kotlinx.coroutines.launch
22+
23+
/**
24+
* Compose function to display a list of member items in a horizontal scrolling row.
25+
* * @param names The list of member names to be displayed.
26+
* **/
27+
@Composable
28+
fun MemberList(names: List<String>) {
29+
var scrolled by remember { mutableStateOf(false) }
30+
31+
val listState = rememberLazyListState()
32+
val coroutineScope = rememberCoroutineScope()
33+
34+
// Get the screen density and calculate the scroll distance
35+
val configuration = LocalConfiguration.current
36+
val screenDensity = configuration.densityDpi / 160f
37+
val screenWidth = configuration.screenWidthDp.toFloat() * screenDensity
38+
val scrollDist = ((screenWidth / 2 + (Math.random() * screenWidth)) * .65).toFloat() * 50000
39+
40+
// Calculate the total number of items to be displayed to simulate infinite scrolling
41+
val nameRepeatCount = 1000
42+
val totalItems = nameRepeatCount * names.size
43+
44+
// Scroll to the middle of the list on first composition
45+
LaunchedEffect(Unit) {
46+
listState.scrollToItem(totalItems / 2)
47+
}
48+
49+
LazyRow(
50+
modifier = Modifier.padding(top = 8.dp),
51+
verticalAlignment = Alignment.CenterVertically,
52+
state = listState,
53+
) {
54+
// Trigger animated scroll only once
55+
if (!scrolled) {
56+
coroutineScope.launch {
57+
scrolled = true
58+
listState.animateScrollBy(
59+
scrollDist,
60+
tween(250000000, 0, LinearEasing)
61+
)
62+
}
63+
}
64+
items(totalItems) { index ->
65+
val memberIndex = index % names.size
66+
MemberItem(name = names[memberIndex])
67+
}
68+
}
69+
}
70+
71+
@Preview(showBackground = true)
72+
@Composable
73+
private fun PreviewMemberList() {
74+
MemberList(
75+
names = listOf("Alice", "Bob", "Charlie", "David", "Eve")
76+
)
77+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.cornellappdev.transit.ui.components
2+
3+
import androidx.compose.foundation.clickable
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.fillMaxWidth
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.material.icons.Icons
10+
import androidx.compose.material.icons.outlined.KeyboardArrowRight
11+
import androidx.compose.material3.Icon
12+
import androidx.compose.material3.Text
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.ui.Alignment
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.graphics.Color
17+
import androidx.compose.ui.graphics.vector.ImageVector
18+
import androidx.compose.ui.text.font.FontWeight
19+
import androidx.compose.ui.tooling.preview.Preview
20+
import androidx.compose.ui.unit.dp
21+
import androidx.compose.ui.unit.sp
22+
import com.cornellappdev.transit.ui.theme.TransitBlue
23+
import com.cornellappdev.transit.ui.theme.robotoFamily
24+
25+
/**
26+
* Compose function to display a clickable privacy item with a title, subtext, and an icon.
27+
* @param text The title of the privacy item.
28+
* @param subtext The subtext of the privacy item.
29+
* @param onClick The callback function to be executed when the item is clicked.
30+
* @param icon The icon to be displayed next to the item.
31+
* **/
32+
@Composable
33+
fun PrivacyOptionItem(text: String, subtext: String = "", onClick: () -> Unit = {}, icon: ImageVector) {
34+
Row(
35+
modifier = Modifier
36+
.padding(top = 8.dp, bottom = 8.dp)
37+
.fillMaxWidth()
38+
.clickable { onClick() },
39+
verticalAlignment = Alignment.CenterVertically
40+
) {
41+
42+
Column {
43+
Text(
44+
text = text,
45+
fontSize = 20.sp,
46+
fontWeight = FontWeight.Bold,
47+
modifier = Modifier.padding(start = 16.dp),
48+
fontFamily = robotoFamily,
49+
)
50+
if (subtext.isNotEmpty()) {
51+
Text(
52+
text = subtext,
53+
fontSize = 12.sp,
54+
fontFamily = robotoFamily,
55+
modifier = Modifier.padding(start = 16.dp),
56+
color = Color.Gray
57+
)
58+
}
59+
60+
}
61+
62+
Spacer(modifier = Modifier.weight(1f))
63+
64+
Icon(icon, null, tint = TransitBlue)
65+
}
66+
}
67+
68+
@Preview(showBackground = true)
69+
@Composable
70+
private fun PrivacyOptionItemPreview() {
71+
PrivacyOptionItem(
72+
text = "Privacy Policy",
73+
subtext = "Learn more about how we handle your data",
74+
onClick = {},
75+
icon = Icons.Outlined.KeyboardArrowRight
76+
)
77+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.cornellappdev.transit.ui.components
33
import androidx.compose.foundation.layout.Box
44
import androidx.compose.foundation.layout.fillMaxSize
55
import androidx.compose.foundation.layout.size
6-
import androidx.compose.material.CircularProgressIndicator
6+
import androidx.compose.material3.CircularProgressIndicator
77
import androidx.compose.runtime.Composable
88
import androidx.compose.ui.Alignment
99
import androidx.compose.ui.Modifier

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

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

0 commit comments

Comments
 (0)