diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/authentication/SignInKtTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/authentication/SignInKtTest.kt index 659d7c290..e21222d8c 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/authentication/SignInKtTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/authentication/SignInKtTest.kt @@ -40,7 +40,7 @@ class SignInKtTest : TestCase() { // Scroll to make sure components are visible on smaller screens composeTestRule.onNodeWithTag("loginTitle").performScrollTo().assertIsDisplayed() - composeTestRule.onNodeWithTag("loginTitle").assertTextEquals("Welcome to the Cosmos") + composeTestRule.onNodeWithTag("loginTitle").assertTextEquals("Explore the Cosmos") composeTestRule.onNodeWithTag("loginButton").performScrollTo().assertIsDisplayed() composeTestRule.onNodeWithTag("loginButton").assertHasClickAction() diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformationKtTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformationKtTest.kt index 9e8483da3..e33dc2bc2 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformationKtTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformationKtTest.kt @@ -122,30 +122,78 @@ class ProfileInformationScreenTest { } @Test - fun deleteButtonWorks() { + fun deleteButtonShowsConfirmationDialog() { composeTestRule.setContent { ProfileInformationScreen(profileViewModel, navigationActions) } - // Assert: Save button is initially disabled - composeTestRule.onNodeWithTag("profileSaveButton").assertIsNotEnabled() + // Fill in the fields to enable the delete button + composeTestRule.onNodeWithTag("editProfileUsername").performTextInput("JohnDoe") + composeTestRule.onNodeWithTag("editProfileEmail").performTextInput("john.doe@example.com") + composeTestRule.onNodeWithTag("editProfileBio").performTextInput("This is a bio") - // Act: Fill in only the username + // Click delete button + composeTestRule.onNodeWithTag("profileDelete").performScrollTo().performClick() + + // Verify dialog appears + composeTestRule.onNodeWithTag("deleteConfirmationDialog").assertExists() + } + + @Test + fun deleteConfirmationDialogCancelWorks() { + composeTestRule.setContent { ProfileInformationScreen(profileViewModel, navigationActions) } + + // Fill in the fields to enable the delete button composeTestRule.onNodeWithTag("editProfileUsername").performTextInput("JohnDoe") - // Assert: Save button is still disabled - composeTestRule.onNodeWithTag("profileSaveButton").assertIsNotEnabled() + composeTestRule.onNodeWithTag("editProfileEmail").performTextInput("john.doe@example.com") + composeTestRule.onNodeWithTag("editProfileBio").performTextInput("This is a bio") - // Act: Fill in email + // Click delete button + composeTestRule.onNodeWithTag("profileDelete").performScrollTo().performClick() + + // Click cancel button + composeTestRule.onNodeWithTag("cancelDeleteButton").performClick() + + // Verify dialog disappears + composeTestRule.onNodeWithTag("deleteConfirmationDialog").assertDoesNotExist() + } + + @Test + fun deleteConfirmationDialogConfirmWorks() { + composeTestRule.setContent { ProfileInformationScreen(profileViewModel, navigationActions) } + + // Fill in the fields to enable the delete button + composeTestRule.onNodeWithTag("editProfileUsername").performTextInput("JohnDoe") composeTestRule.onNodeWithTag("editProfileEmail").performTextInput("john.doe@example.com") - // Assert: Save button is still disabled because bio is empty - composeTestRule.onNodeWithTag("profileSaveButton").assertIsNotEnabled() + composeTestRule.onNodeWithTag("editProfileBio").performTextInput("This is a bio") - // Act: Fill in the bio + // Click delete button + composeTestRule.onNodeWithTag("profileDelete").performScrollTo().performClick() + + // Click confirm button + composeTestRule.onNodeWithTag("confirmDeleteButton").performClick() + + // Verify navigation to menu screen + verify(navigationActions).navigateTo(Screen.MENU) + } + + @Test + fun deleteButtonWorks() { + composeTestRule.setContent { ProfileInformationScreen(profileViewModel, navigationActions) } + + // Fill in the fields + composeTestRule.onNodeWithTag("editProfileUsername").performTextInput("JohnDoe") + composeTestRule.onNodeWithTag("editProfileEmail").performTextInput("john.doe@example.com") composeTestRule.onNodeWithTag("editProfileBio").performTextInput("This is a bio") - composeTestRule.onNodeWithTag("profileSaveButton").performClick() - verify(navigationActions).navigateTo(Screen.PROFILE) - // Assert: Save button should now be enabled - composeTestRule.onNodeWithTag("profileDelete").assertIsEnabled() - // Scroll to the delete button if it's off-screen, then click it + + // Click delete button composeTestRule.onNodeWithTag("profileDelete").performScrollTo().performClick() + + // Verify dialog appears + composeTestRule.onNodeWithTag("deleteConfirmationDialog").assertExists() + + // Click confirm button + composeTestRule.onNodeWithTag("confirmDeleteButton").performClick() + + // Verify navigation to menu screen verify(navigationActions).navigateTo(Screen.MENU) } } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/authentication/SignIn.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/authentication/SignIn.kt index bb5307818..08cae3be4 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/authentication/SignIn.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/authentication/SignIn.kt @@ -44,6 +44,10 @@ import androidx.compose.ui.unit.sp import com.github.lookupgroup27.lookup.R import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions import com.github.lookupgroup27.lookup.ui.navigation.Screen +import com.github.lookupgroup27.lookup.ui.theme.CosmosPurple +import com.github.lookupgroup27.lookup.ui.theme.LightPurple +import com.github.lookupgroup27.lookup.ui.theme.PurpleBlue +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.android.gms.common.api.ApiException @@ -80,7 +84,7 @@ fun SignInScreen(navigationActions: NavigationActions) { Scaffold( modifier = Modifier.fillMaxSize().testTag("auth_screen"), - containerColor = Color.Black, + containerColor = PurpleBlue, topBar = { TopAppBar( title = {}, @@ -94,7 +98,7 @@ fun SignInScreen(navigationActions: NavigationActions) { tint = Color.White) } }, - colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Black)) + colors = TopAppBarDefaults.topAppBarColors(containerColor = PurpleBlue)) }, content = { padding -> Column( @@ -104,27 +108,25 @@ fun SignInScreen(navigationActions: NavigationActions) { .verticalScroll( rememberScrollState()), // Enable vertical scrolling in all orientations horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center) { - Spacer(modifier = Modifier.height(16.dp)) + verticalArrangement = Arrangement.Top) { + Spacer(modifier = Modifier.height(70.dp)) Image( painter = painterResource(id = R.drawable.app_logo), contentDescription = "App Logo", - modifier = Modifier.size(250.dp)) + modifier = Modifier.size(200.dp)) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.height(30.dp)) Text( modifier = Modifier.testTag("loginTitle"), - text = "Welcome to the Cosmos", - style = - MaterialTheme.typography.headlineMedium.copy( - fontSize = 42.sp, lineHeight = 50.sp, letterSpacing = 1.5.sp), + text = "Explore the Cosmos", + style = MaterialTheme.typography.displaySmall, fontWeight = FontWeight.SemiBold, textAlign = TextAlign.Center, - color = Color(0xFF8A9BB7)) + color = StarLightWhite) - Spacer(modifier = Modifier.height(48.dp)) + Spacer(modifier = Modifier.height(38.dp)) GoogleSignInButton( onSignInClick = { @@ -137,13 +139,14 @@ fun SignInScreen(navigationActions: NavigationActions) { launcher.launch(googleSignInClient.signInIntent) }) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.height(30.dp)) // Register Button Button( onClick = { navigationActions.navigateTo(Screen.REGISTER) }, modifier = Modifier.fillMaxWidth(0.8f).height(44.dp), - colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF1A1A2E))) { + colors = ButtonDefaults.buttonColors(containerColor = LightPurple), + border = BorderStroke(1.dp, StarLightWhite)) { Text("Register", color = Color.White) } @@ -153,7 +156,8 @@ fun SignInScreen(navigationActions: NavigationActions) { Button( onClick = { navigationActions.navigateTo(Screen.LOGIN) }, modifier = Modifier.fillMaxWidth(0.8f).height(44.dp), - colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF1A1A2E))) { + colors = ButtonDefaults.buttonColors(containerColor = LightPurple), + border = BorderStroke(1.dp, StarLightWhite)) { Text("Login", color = Color.White) } } @@ -168,11 +172,11 @@ fun GoogleSignInButton(onSignInClick: () -> Unit) { // Set dimensions based on orientation val buttonHeight = if (isLandscape) 40.dp else 48.dp val buttonWidthModifier = - if (isLandscape) Modifier.fillMaxWidth(0.7f) else Modifier.fillMaxWidth() + if (isLandscape) Modifier.fillMaxWidth(0.7f) else Modifier.fillMaxWidth(0.5f) Button( onClick = onSignInClick, - colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF1A1A2E)), + colors = ButtonDefaults.buttonColors(containerColor = CosmosPurple), shape = RoundedCornerShape(50), border = BorderStroke(1.dp, Color(0xFF9DACE6)), modifier = @@ -193,7 +197,7 @@ fun GoogleSignInButton(onSignInClick: () -> Unit) { Text( text = "Sign in with Google", - color = Color.White, + color = StarLightWhite, fontSize = 14.sp, // Slightly smaller font in landscape fontWeight = FontWeight.Medium) } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/feed/Feed.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/feed/Feed.kt index d586f360e..596aa5494 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/feed/Feed.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/feed/Feed.kt @@ -17,6 +17,7 @@ import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color @@ -164,10 +165,10 @@ fun FeedScreen( Color.Black.copy(alpha = 0.6f)))) }) { Image( - painter = painterResource(R.drawable.background_blurred), + painter = painterResource(R.drawable.landscape_background), contentDescription = null, contentScale = ContentScale.Crop, - modifier = Modifier.fillMaxSize()) + modifier = Modifier.fillMaxSize().blur(20.dp)) Scaffold( containerColor = Color.Transparent, diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/Map.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/Map.kt index 3edde2a87..3d3834a33 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/Map.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/Map.kt @@ -8,6 +8,8 @@ import android.content.pm.PackageManager import android.util.Log import android.widget.Toast import androidx.activity.ComponentActivity +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -32,9 +34,12 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -49,9 +54,9 @@ import com.github.lookupgroup27.lookup.ui.navigation.BottomNavigationMenu import com.github.lookupgroup27.lookup.ui.navigation.LIST_TOP_LEVEL_DESTINATION import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions import com.github.lookupgroup27.lookup.ui.navigation.Route -import com.github.lookupgroup27.lookup.ui.theme.DarkPurple +import com.github.lookupgroup27.lookup.ui.theme.LightPurple +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite import com.google.firebase.auth.FirebaseAuth -import components.BackgroundImage private const val LOCATION_PERMISSION_REQUEST_CODE: Int = 1001 @@ -164,10 +169,11 @@ fun MapScreen(navigationActions: NavigationActions, mapViewModel: MapViewModel) Box( modifier = Modifier.fillMaxSize().padding(innerPadding).testTag("map_screen"), contentAlignment = Alignment.Center) { - BackgroundImage( - painterResId = R.drawable.background_blurred, + Image( + painter = painterResource(R.drawable.landscape_background), contentDescription = stringResource(R.string.background_description), - testTag = "background_test_tag") + modifier = Modifier.fillMaxSize().testTag("background_test_tag").blur(20.dp), + contentScale = ContentScale.Crop) Column( horizontalAlignment = Alignment.CenterHorizontally, @@ -183,7 +189,8 @@ fun MapScreen(navigationActions: NavigationActions, mapViewModel: MapViewModel) onClick = { refreshKey++ }, colors = androidx.compose.material3.ButtonDefaults.buttonColors( - containerColor = DarkPurple, contentColor = Color.White), + containerColor = LightPurple, contentColor = StarLightWhite), + border = BorderStroke(0.7.dp, StarLightWhite), modifier = Modifier.testTag("refresh_button")) { Text("Refresh") } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/BottomNavigationMenu.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/BottomNavigationMenu.kt index 5ed80c101..18cb57add 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/BottomNavigationMenu.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/BottomNavigationMenu.kt @@ -35,7 +35,7 @@ fun BottomNavigationMenu( val context = LocalContext.current val isOnline = remember { mutableStateOf(NetworkUtils.isNetworkAvailable(context)) } NavigationBar( - modifier = Modifier.fillMaxWidth().height(60.dp).testTag("bottomNavigationMenu"), + modifier = Modifier.fillMaxWidth().height(80.dp).testTag("bottomNavigationMenu"), containerColor = Color(0xFF0D1023), content = { tabList.forEach { tab -> diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Landing.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Landing.kt index 8c53fbcfd..bd2bb9666 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Landing.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Landing.kt @@ -33,6 +33,7 @@ import androidx.navigation.compose.rememberNavController import com.github.lookupgroup27.lookup.R import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions import com.github.lookupgroup27.lookup.ui.navigation.Screen +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite import com.github.lookupgroup27.lookup.util.NetworkUtils import com.github.lookupgroup27.lookup.util.ToastHelper import components.BackgroundImage @@ -64,7 +65,7 @@ fun LandingScreen( }) { // Background Image BackgroundImage( - painterResId = R.drawable.landing_screen_bckgrnd, + painterResId = R.drawable.landscape_background, contentDescription = stringResource(R.string.background_description), ) @@ -77,19 +78,20 @@ fun LandingScreen( .padding(16.dp), verticalArrangement = Arrangement.SpaceBetween, horizontalAlignment = Alignment.CenterHorizontally) { + Spacer(modifier = Modifier.height(25.dp)) // Top Prompt Text Text( text = "Click for full map view", fontSize = 18.sp, - fontWeight = FontWeight.Bold, - color = Color.White, + fontWeight = FontWeight.Normal, + color = StarLightWhite, modifier = Modifier.padding(top = 32.dp)) // Centered Logo Image Image( painter = painterResource(id = R.drawable.app_logo), contentDescription = "Look Up Logo", - modifier = Modifier.size(250.dp).align(Alignment.CenterHorizontally), + modifier = Modifier.size(250.dp), contentScale = ContentScale.Fit) // Bottom Home Button diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Menu.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Menu.kt index 57a33cdd4..ce9a15dad 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Menu.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/overview/Menu.kt @@ -3,6 +3,7 @@ package com.github.lookupgroup27.lookup.ui.overview import android.annotation.SuppressLint import android.content.pm.ActivityInfo import androidx.activity.ComponentActivity +import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState @@ -23,6 +24,8 @@ import androidx.compose.ui.unit.dp import com.github.lookupgroup27.lookup.R import com.github.lookupgroup27.lookup.ui.navigation.* import com.github.lookupgroup27.lookup.ui.profile.profilepic.AvatarViewModel +import com.github.lookupgroup27.lookup.ui.theme.LightPurple +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite import com.github.lookupgroup27.lookup.util.NetworkUtils import com.github.lookupgroup27.lookup.util.ToastHelper import com.google.firebase.auth.FirebaseAuth @@ -66,7 +69,7 @@ fun MenuScreen( Box(modifier = Modifier.fillMaxSize().padding(paddingValues)) { // Blurred map screen as the background Image( - painter = painterResource(id = R.drawable.landing_screen_bckgrnd), + painter = painterResource(id = R.drawable.landscape_background), contentDescription = "Background", modifier = Modifier.fillMaxSize().testTag("background_image").blur(20.dp), contentScale = ContentScale.Crop) @@ -91,7 +94,7 @@ fun MenuScreen( Icon( painter = painterResource(id = iconRes!!), contentDescription = "Profile", - modifier = Modifier.size(56.dp), + modifier = Modifier.size(64.dp), tint = if (iconRes == R.drawable.default_profile_icon) Color.White else Color.Unspecified) @@ -116,13 +119,15 @@ fun MenuScreen( Button( onClick = { navigationActions.navigateTo(Screen.QUIZ) }, - modifier = Modifier.fillMaxWidth(0.6f)) { + colors = ButtonDefaults.buttonColors(LightPurple), + border = BorderStroke(0.5.dp, StarLightWhite), + modifier = Modifier.fillMaxWidth(0.8f).height(60.dp)) { Text( text = "Quizzes", style = MaterialTheme.typography.headlineSmall, - fontWeight = FontWeight.Bold) + color = StarLightWhite, + fontWeight = FontWeight.Normal) } - Spacer(modifier = Modifier.height(8.dp)) // Blocked buttons when offline Button( @@ -130,33 +135,41 @@ fun MenuScreen( if (isOnline.value) navigationActions.navigateTo(Screen.CALENDAR) else toastHelper.showNoInternetToast() }, - modifier = Modifier.fillMaxWidth(0.6f)) { + colors = ButtonDefaults.buttonColors(LightPurple), + border = BorderStroke(0.5.dp, StarLightWhite), + modifier = Modifier.fillMaxWidth(0.8f).height(60.dp)) { Text( text = "Calendar", style = MaterialTheme.typography.headlineSmall, - fontWeight = FontWeight.Bold) + color = StarLightWhite, + fontWeight = FontWeight.Normal) } - Spacer(modifier = Modifier.height(8.dp)) Button( onClick = { if (isOnline.value) navigationActions.navigateTo(Screen.GOOGLE_MAP) else toastHelper.showNoInternetToast() }, - modifier = Modifier.fillMaxWidth(0.6f)) { + colors = ButtonDefaults.buttonColors(LightPurple), + border = BorderStroke(0.5.dp, StarLightWhite), + modifier = Modifier.fillMaxWidth(0.8f).height(60.dp)) { Text( text = "Google Map", style = MaterialTheme.typography.headlineSmall, - fontWeight = FontWeight.Bold) + color = StarLightWhite, + fontWeight = FontWeight.Normal) } - Spacer(modifier = Modifier.height(8.dp)) + Button( onClick = { navigationActions.navigateTo(Screen.PLANET_SELECTION) }, - modifier = Modifier.fillMaxWidth(0.6f)) { + colors = ButtonDefaults.buttonColors(LightPurple), + border = BorderStroke(0.5.dp, StarLightWhite), + modifier = Modifier.fillMaxWidth(0.8f).height(60.dp)) { Text( text = "Planets", style = MaterialTheme.typography.headlineSmall, - fontWeight = FontWeight.Bold) + color = StarLightWhite, + fontWeight = FontWeight.Normal) } } } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Collection.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Collection.kt index 221996517..943676657 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Collection.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Collection.kt @@ -64,10 +64,10 @@ fun CollectionScreen( contentAlignment = Alignment.TopCenter, ) { Image( - painter = painterResource(id = R.drawable.landing_screen_bckgrnd), + painter = painterResource(id = R.drawable.landscape_background), contentDescription = "Background", contentScale = ContentScale.Crop, - modifier = Modifier.fillMaxSize().blur(10.dp).testTag("background_image")) + modifier = Modifier.fillMaxSize().blur(20.dp).testTag("background_image")) IconButton( onClick = { navigationActions.navigateTo(Screen.PROFILE) }, diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Profile.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Profile.kt index 6b852bfaf..1058d2608 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Profile.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/Profile.kt @@ -3,6 +3,7 @@ package com.github.lookupgroup27.lookup.ui.profile import android.content.pm.ActivityInfo import android.content.res.Configuration import androidx.activity.ComponentActivity +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -12,7 +13,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag @@ -31,7 +34,6 @@ import com.github.lookupgroup27.lookup.ui.profile.profilepic.AvatarViewModel import com.google.firebase.Firebase import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.auth -import components.BackgroundImage @Composable fun ProfileScreen(navigationActions: NavigationActions, avatarViewModel: AvatarViewModel) { @@ -67,9 +69,11 @@ fun ProfileScreen(navigationActions: NavigationActions, avatarViewModel: AvatarV }) { innerPadding -> Box(modifier = Modifier.fillMaxSize().padding(innerPadding).testTag("profile_screen")) { // Background Image - BackgroundImage( - painterResId = R.drawable.background_blurred, - contentDescription = stringResource(R.string.background_description)) + Image( + painter = painterResource(R.drawable.landscape_background), + modifier = Modifier.fillMaxSize().testTag("profile_background").blur(20.dp), + contentDescription = stringResource(R.string.background_description), + contentScale = ContentScale.Crop) // Scrollable Profile Content Column( diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformation.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformation.kt index b6626ae46..26064a677 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformation.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/ProfileInformation.kt @@ -11,14 +11,21 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.* +import androidx.compose.ui.draw.blur import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp +import com.github.lookupgroup27.lookup.R import com.github.lookupgroup27.lookup.model.profile.* import com.github.lookupgroup27.lookup.ui.navigation.* +import com.github.lookupgroup27.lookup.ui.theme.LightPurple +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite import com.google.firebase.auth.FirebaseAuth +@OptIn(ExperimentalMaterial3Api::class) @SuppressLint("StateFlowValueCalledInComposition") @Composable fun ProfileInformationScreen( @@ -39,119 +46,195 @@ fun ProfileInformationScreen( profileViewModel.fetchUserProfile() val profile = profileViewModel.userProfile.value - val user = FirebaseAuth.getInstance().currentUser // Get the current signed-in user + val user = FirebaseAuth.getInstance().currentUser val userEmail = user?.email ?: "" var username by remember { mutableStateOf(profile?.username ?: "") } var bio by remember { mutableStateOf(profile?.bio ?: "") } var email by remember { mutableStateOf(userEmail) } + val fieldColors = + OutlinedTextFieldDefaults.colors( + focusedTextColor = StarLightWhite, // Text color when focused + unfocusedTextColor = StarLightWhite, // Text color when not focused + disabledTextColor = StarLightWhite, // Text color when disabled + focusedContainerColor = Color.Black.copy(alpha = 0.2f), // Darker background when focused + unfocusedContainerColor = + Color.Black.copy(alpha = 0.2f), // Darker background when not focused + focusedBorderColor = StarLightWhite, // Border color when focused + unfocusedBorderColor = StarLightWhite, // Border color when not focused + ) + var showDeleteConfirmation by remember { mutableStateOf(false) } - Column( - verticalArrangement = Arrangement.Top, - horizontalAlignment = Alignment.Start, - modifier = - Modifier.padding(8.dp) - .width(412.dp) - .height(892.dp) - .verticalScroll(scrollState) - .testTag("editProfileScreen")) { - Spacer(modifier = Modifier.height(16.dp)) - Icon( - imageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = "Back", - modifier = - Modifier.padding(start = 16.dp) - .size(30.dp) - .clickable { navigationActions.goBack() } - .testTag("goBackButton")) - Spacer(modifier = Modifier.height(16.dp)) - Text( - text = "Your Personal Information", - style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.padding(start = 16.dp).fillMaxWidth().testTag("editProfileTitle")) - - Column( - verticalArrangement = Arrangement.spacedBy(0.dp, Alignment.Top), - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.padding(20.dp).fillMaxWidth()) { - Spacer(modifier = Modifier.height(16.dp)) - OutlinedTextField( - value = username, - onValueChange = { new_name -> username = new_name }, - label = { Text("Username") }, - placeholder = { Text("Enter username") }, - shape = RoundedCornerShape(16.dp), - modifier = - Modifier.padding(0.dp) - .width(312.dp) - .height(60.dp) - .testTag("editProfileUsername")) - Spacer(modifier = Modifier.height(30.dp)) - OutlinedTextField( - value = email, - onValueChange = { - if (userEmail.isEmpty()) { - email = it + Box(modifier = Modifier.fillMaxSize().testTag("background_box")) { + // Background Image + Image( + painter = painterResource(id = R.drawable.landscape_background), + contentDescription = "Background", + contentScale = ContentScale.Crop, + modifier = Modifier.fillMaxSize().blur(20.dp).testTag("background_image")) + + // Content + Column( + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.Start, + modifier = + Modifier.padding(8.dp) + .fillMaxSize() + .verticalScroll(scrollState) + .testTag("editProfileScreen")) { + Spacer(modifier = Modifier.height(16.dp)) + + // Back Button + Icon( + imageVector = Icons.AutoMirrored.Filled.ArrowBack, + contentDescription = "Back", + tint = Color.White, + modifier = + Modifier.padding(start = 16.dp) + .size(30.dp) + .clickable { navigationActions.goBack() } + .testTag("goBackButton")) + + Spacer(modifier = Modifier.height(16.dp)) + + // Title + Text( + text = "Your Personal Information", + style = MaterialTheme.typography.headlineMedium, + color = Color.White, + modifier = Modifier.padding(start = 16.dp).fillMaxWidth().testTag("editProfileTitle")) + + // Form Fields + Column( + verticalArrangement = Arrangement.spacedBy(0.dp, Alignment.Top), + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(20.dp).fillMaxWidth()) { + Spacer(modifier = Modifier.height(16.dp)) + + OutlinedTextField( + value = username, + onValueChange = { new_name -> username = new_name }, + label = { Text(text = "Username", color = StarLightWhite) }, + placeholder = { Text("Enter username") }, + shape = RoundedCornerShape(16.dp), + colors = fieldColors, + modifier = + Modifier.padding(0.dp) + .width(312.dp) + .height(60.dp) + .testTag("editProfileUsername")) + + Spacer(modifier = Modifier.height(30.dp)) + + OutlinedTextField( + value = email, + onValueChange = { + if (userEmail.isEmpty()) { + email = it + } + }, + label = { Text(text = "E-mail", color = StarLightWhite) }, + placeholder = { Text("Enter your e-mail") }, + shape = RoundedCornerShape(16.dp), + colors = fieldColors, + modifier = + Modifier.padding(0.dp) + .width(312.dp) + .height(60.dp) + .testTag("editProfileEmail")) + + Spacer(modifier = Modifier.height(30.dp)) + + OutlinedTextField( + value = bio, + onValueChange = { new_description -> bio = new_description }, + label = { Text(text = "Bio", color = StarLightWhite) }, + placeholder = { Text("Enter a bio") }, + shape = RoundedCornerShape(16.dp), + colors = fieldColors, + modifier = + Modifier.padding(0.dp) + .width(312.dp) + .height(80.dp) + .testTag("editProfileBio")) + + Spacer(modifier = Modifier.height(72.dp)) + + // Buttons + Button( + onClick = { + val newProfile: UserProfile = + profile?.copy(username = username, bio = bio, email = email) + ?: UserProfile(username = username, bio = bio, email = email) + profileViewModel.updateUserProfile(newProfile) + navigationActions.navigateTo(Screen.PROFILE) + }, + enabled = username.isNotEmpty() && bio.isNotEmpty() && email.isNotEmpty(), + colors = + ButtonDefaults.buttonColors( + containerColor = LightPurple, + disabledContainerColor = LightPurple.copy(alpha = 0.5f)), + border = BorderStroke(0.2.dp, StarLightWhite), + modifier = Modifier.width(131.dp).height(40.dp).testTag("profileSaveButton")) { + Text(text = "Save", color = Color.White) } - }, - label = { Text("E-mail") }, - placeholder = { Text("Enter your e-mail") }, - shape = RoundedCornerShape(16.dp), - modifier = - Modifier.padding(0.dp) - .width(312.dp) - .height(60.dp) - .testTag("editProfileEmail")) - Spacer(modifier = Modifier.height(30.dp)) - OutlinedTextField( - value = bio, - onValueChange = { new_description -> bio = new_description }, - label = { Text("Bio") }, - placeholder = { Text("Enter a bio") }, - shape = RoundedCornerShape(16.dp), - modifier = - Modifier.padding(0.dp).width(312.dp).height(80.dp).testTag("editProfileBio")) - Spacer(modifier = Modifier.height(72.dp)) - Spacer(modifier = Modifier.height(30.dp)) - - Button( - onClick = { - val newProfile: UserProfile = - profile?.copy(username = username, bio = bio, email = email) - ?: UserProfile(username = username, bio = bio, email = email) - profileViewModel.updateUserProfile(newProfile) - navigationActions.navigateTo(Screen.PROFILE) - }, - enabled = username.isNotEmpty() && bio.isNotEmpty() && email.isNotEmpty(), - colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF30315B)), - modifier = Modifier.width(131.dp).height(40.dp).testTag("profileSaveButton")) { - Text(text = "Save", color = Color.White) - } - Spacer(modifier = Modifier.height(30.dp)) - Button( - onClick = { - profileViewModel.logoutUser() - navigationActions.navigateTo(Screen.LANDING) - }, - enabled = true, - colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF410002)), - modifier = Modifier.width(131.dp).height(40.dp).testTag("profileLogout")) { - Text(text = "Sign out", color = Color.White) - } - Spacer(modifier = Modifier.height(30.dp)) - Button( - onClick = { - profile?.let { - profileViewModel.deleteUserProfile(it) + Spacer(modifier = Modifier.height(30.dp)) + + Button( + onClick = { profileViewModel.logoutUser() + navigationActions.navigateTo(Screen.LANDING) + }, + colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF410002)), + border = BorderStroke(0.2.dp, StarLightWhite), + modifier = Modifier.width(131.dp).height(40.dp).testTag("profileLogout")) { + Text(text = "Sign out", color = Color.White) } - navigationActions.navigateTo(Screen.MENU) - }, - enabled = username.isNotEmpty() && bio.isNotEmpty() && email.isNotEmpty(), - colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF410002)), - modifier = Modifier.width(131.dp).height(40.dp).testTag("profileDelete")) { - Text(text = "Delete", color = Color.White) + + Spacer(modifier = Modifier.height(30.dp)) + + Button( + onClick = { showDeleteConfirmation = true }, + enabled = username.isNotEmpty() && bio.isNotEmpty() && email.isNotEmpty(), + colors = + ButtonDefaults.buttonColors( + containerColor = Color(0xFF410002), + disabledContainerColor = Color(0xFF410002).copy(alpha = 0.5f)), + border = BorderStroke(0.2.dp, StarLightWhite), + modifier = Modifier.width(131.dp).height(40.dp).testTag("profileDelete")) { + Text(text = "Delete", color = Color.White) + } + } + } + + if (showDeleteConfirmation) { + AlertDialog( + onDismissRequest = { showDeleteConfirmation = false }, + title = { Text("Confirm Deletion") }, + text = { Text("Are you sure you want to delete your profile?") }, + confirmButton = { + Button( + onClick = { + profile?.let { + profileViewModel.deleteUserProfile(it) + profileViewModel.logoutUser() } - } - } + navigationActions.navigateTo(Screen.MENU) + }, + colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF410002)), + modifier = Modifier.testTag("confirmDeleteButton")) { + Text("Yes", color = Color.White) + } + }, + dismissButton = { + Button( + onClick = { showDeleteConfirmation = false }, + colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF30315B)), + modifier = Modifier.testTag("cancelDeleteButton")) { + Text("Cancel", color = Color.White) + } + }, + modifier = Modifier.testTag("deleteConfirmationDialog")) + } + } } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ChangeAvatarButton.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ChangeAvatarButton.kt index 0417c379b..e025c2e07 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ChangeAvatarButton.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ChangeAvatarButton.kt @@ -10,7 +10,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.github.lookupgroup27.lookup.R -import com.github.lookupgroup27.lookup.ui.theme.DarkPurple +import com.github.lookupgroup27.lookup.ui.theme.LightPurple +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite /** * A composable function that displays a "Change Avatar" button when a custom avatar is selected. @@ -37,7 +38,9 @@ fun ChangeAvatarButton( Button( onClick = onButtonClick, modifier = Modifier.padding(top = 16.dp), - colors = ButtonDefaults.buttonColors(DarkPurple)) { + colors = + ButtonDefaults.buttonColors( + containerColor = LightPurple, contentColor = StarLightWhite)) { Text(stringResource(R.string.profile_change_avatar)) } } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ProfileButtons.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ProfileButtons.kt index 5806cd5c8..d0b4035c4 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ProfileButtons.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/profile/components/ProfileButtons.kt @@ -3,6 +3,7 @@ package com.github.lookupgroup27.lookup.ui.profile.components import android.content.res.Configuration import androidx.compose.foundation.border import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape @@ -18,19 +19,22 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.github.lookupgroup27.lookup.ui.theme.DarkPurple +import com.github.lookupgroup27.lookup.ui.theme.LightPurple +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite @Composable fun ProfileButton(text: String, onClick: () -> Unit) { Button( onClick = onClick, - colors = ButtonDefaults.buttonColors(containerColor = DarkPurple, contentColor = Color.White), + colors = + ButtonDefaults.buttonColors(containerColor = LightPurple, contentColor = StarLightWhite), shape = RoundedCornerShape(174.dp), modifier = Modifier.width( if (LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE) 200.dp else 262.dp) + .height(80.dp) .padding(vertical = 8.dp) .border( width = 1.dp, @@ -39,7 +43,7 @@ fun ProfileButton(text: String, onClick: () -> Unit) { .shadow(elevation = 20.dp, shape = RoundedCornerShape(20.dp), clip = true)) { Text( text = text, - fontSize = 19.sp, + fontSize = 21.sp, fontWeight = FontWeight.W800, textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth()) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/Quiz.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/Quiz.kt index 2b414ea3b..1f6634679 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/Quiz.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/Quiz.kt @@ -3,6 +3,7 @@ package com.github.lookupgroup27.lookup.ui.quiz import android.annotation.SuppressLint import android.content.pm.ActivityInfo import androidx.activity.ComponentActivity +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -16,9 +17,12 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -27,7 +31,7 @@ import com.github.lookupgroup27.lookup.R import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions import com.github.lookupgroup27.lookup.ui.navigation.Screen import com.github.lookupgroup27.lookup.ui.quiz.components.QuizThemeButton -import components.BackgroundImage +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite /** * Composable function that displays the main screen for selecting a quiz. This screen includes a @@ -54,10 +58,11 @@ fun QuizScreen(viewModel: QuizViewModel, navigationActions: NavigationActions) { BoxWithConstraints(modifier = Modifier.fillMaxSize().testTag("quiz_screen")) { // Background Image - BackgroundImage( - painterResId = R.drawable.background_blurred, + Image( + painter = painterResource(id = R.drawable.landscape_background), contentDescription = stringResource(R.string.background_description), - testTag = "background_test_tag") + modifier = Modifier.fillMaxSize().testTag("background_test_tag").blur(20.dp), + contentScale = ContentScale.Crop) // Back Button IconButton( @@ -82,7 +87,7 @@ fun QuizScreen(viewModel: QuizViewModel, navigationActions: NavigationActions) { // Title Text( text = "Take a Quiz", - color = Color.White, + color = StarLightWhite, style = MaterialTheme.typography.displaySmall.copy( fontWeight = FontWeight.Bold, fontSize = 32.sp), diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/QuizPlay.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/QuizPlay.kt index 11abb51e8..7bd69bb87 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/QuizPlay.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/QuizPlay.kt @@ -31,7 +31,7 @@ import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions import com.github.lookupgroup27.lookup.ui.navigation.Route import com.github.lookupgroup27.lookup.ui.quiz.components.* import com.github.lookupgroup27.lookup.ui.theme.AnswerSelectedColor -import com.github.lookupgroup27.lookup.ui.theme.DarkPurple +import com.github.lookupgroup27.lookup.ui.theme.LightPurple /** * Displays the main QuizPlayScreen where the user interacts with questions and navigates through @@ -61,10 +61,10 @@ fun QuizPlayScreen(viewModel: QuizViewModel, navigationActions: NavigationAction BoxWithConstraints(modifier = Modifier.fillMaxSize()) { Image( - painter = painterResource(id = R.drawable.landing_screen_bckgrnd), + painter = painterResource(id = R.drawable.landscape_background), contentDescription = "Background", contentScale = ContentScale.Crop, - modifier = Modifier.fillMaxSize().blur(8.dp).testTag("quiz_background")) + modifier = Modifier.fillMaxSize().blur(10.dp).testTag("quiz_background")) Column( modifier = @@ -103,7 +103,7 @@ fun QuizPlayScreen(viewModel: QuizViewModel, navigationActions: NavigationAction Column(verticalArrangement = Arrangement.spacedBy(15.dp)) { question.answers.forEachIndexed { index, answer -> val backgroundColor = - if (selectedAnswer == answer) AnswerSelectedColor else DarkPurple + if (selectedAnswer == answer) AnswerSelectedColor else LightPurple AnswerButton( answer = answer, backgroundColor = backgroundColor, diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/LeaveQuizButton.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/LeaveQuizButton.kt index 9e7d1106c..b998ee5dd 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/LeaveQuizButton.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/LeaveQuizButton.kt @@ -23,7 +23,7 @@ fun LeaveQuizButton(onClick: () -> Unit, modifier: Modifier) { modifier = modifier, colors = androidx.compose.material3.ButtonDefaults.buttonColors( - containerColor = Color.Red, contentColor = Color.White), + containerColor = Color(0xFF410002), contentColor = Color.White), shape = RoundedCornerShape(8.dp)) { Text(text = "Leave Quiz", textAlign = TextAlign.Center, fontSize = 16.sp) } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/QuizThemeButton.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/QuizThemeButton.kt index 5e7b15243..9046f9716 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/QuizThemeButton.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/quiz/components/QuizThemeButton.kt @@ -1,5 +1,6 @@ package com.github.lookupgroup27.lookup.ui.quiz.components +import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -11,12 +12,13 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.github.lookupgroup27.lookup.ui.theme.LightPurple +import com.github.lookupgroup27.lookup.ui.theme.StarLightWhite /** * Button component to represent each quiz theme with its best score. @@ -32,9 +34,8 @@ fun QuizThemeButton(theme: String, bestScore: String, onClick: () -> Unit, testT onClick = onClick, shape = RoundedCornerShape(16.dp), modifier = Modifier.fillMaxWidth().height(56.dp).testTag(testTag), - colors = - androidx.compose.material3.ButtonDefaults.buttonColors( - containerColor = Color(0xFF4E5DAB))) { + colors = androidx.compose.material3.ButtonDefaults.buttonColors(containerColor = LightPurple), + border = BorderStroke(0.3.dp, StarLightWhite)) { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, @@ -43,14 +44,15 @@ fun QuizThemeButton(theme: String, bestScore: String, onClick: () -> Unit, testT text = theme, fontSize = 15.sp, fontWeight = FontWeight.Bold, - color = Color.White, + color = StarLightWhite, modifier = Modifier.padding(start = 4.dp)) Text( text = "Best Score: $bestScore/15", fontSize = 13.sp, fontStyle = FontStyle.Italic, fontWeight = FontWeight.Normal, - color = Color(0xFFDADADA)) + color = StarLightWhite.copy(alpha = 0.7f), + ) } } } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/theme/Color.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/theme/Color.kt index d837b40aa..4d3947db3 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/theme/Color.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/theme/Color.kt @@ -8,15 +8,19 @@ val NebulaPurple = Color(0xFF3D0075) // Deep purple for accents val StarlightBlue = Color(0xFF0077CC) // Blue for secondary highlights val CosmicPink = Color(0xFFB4004E) // Accent pink -val StarWhite = Color(0xFFFFFFFF) // Light color for text on dark backgrounds +var StarWhite = Color(0xFFFFFFFF) // White for text on dark backgrounds +val StarLightWhite = Color(0xFFFAFDE8) // Light color for text on dark backgrounds val MeteorGrey = Color(0xFF333333) // Subtle grey for background contrast -val DarkPurple = Color(0xFF30315B) +val DarkPurple = Color(0xFF1A1A2E) +val LightPurple = Color(0xFF30315B) +val CosmosPurple = Color(0xFF473074) val DarkBlue = Color(0xFF0D1023) // Dark blue +val PurpleBlue = Color(0xFF060817) val CorrectAnswerColor = Color(0xFF4CAF50) -val IncorrectAnswerColor = Color(0xFFF44336) +val IncorrectAnswerColor = Color(0xFF410002) val AnswerSelectedColor = Color(0xFFFF731F) val NextButtonEnabledColor = Color(0xFF00C853) val NextButtonDisabledColor = Color(0xFF6A9605) diff --git a/app/src/main/res/drawable/landscape_background.jpg b/app/src/main/res/drawable/landscape_background.jpg new file mode 100644 index 000000000..7a6d2d272 Binary files /dev/null and b/app/src/main/res/drawable/landscape_background.jpg differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3aec47864..81f6dbbc3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,8 +17,8 @@ Profile Icon Add Avatar Change Avatar - Personal Info > - Your Collection > + Personal Info + Your Collection Sky Map Menu Reset