From e2ed3b5c861937d794d816f9ab64a3bbf437be96 Mon Sep 17 00:00:00 2001 From: Rihab Date: Mon, 14 Oct 2024 18:52:32 +0200 Subject: [PATCH] feat: Implemented bottom navigation bar and added profile button in menu - added a bottom navigation bar to the menu screen with navigation to the map screen (and menu) - added a profile button to the menu screen to access the profile - wrote tests for the ProfileScreen and additional tests for the MenuScreen to ensure functionality --- .../overview}/CalendarScreenTest.kt | 3 +- .../{ => ui}/overview/LandingScreenTest.kt | 2 +- .../lookup/{ => ui}/overview/MapScreenTest.kt | 2 +- .../{ => ui}/overview/MenuScreenTest.kt | 17 +++- .../{ => ui}/overview/QuizScreenTest.kt | 3 +- .../lookup/ui/profile/ProfileScreenTest.kt | 41 ++++++++ .../skytracker}/SkyTrackerScreen.kt | 3 +- .../lookupgroup27/lookup/MainActivity.kt | 7 +- .../lookupgroup27/lookup/ui/overview/Menu.kt | 98 ++++++++++++------- .../lookup/ui/profile/Profile.kt | 10 +- 10 files changed, 134 insertions(+), 52 deletions(-) rename app/src/androidTest/java/com/github/lookupgroup27/lookup/{screen => ui/overview}/CalendarScreenTest.kt (96%) rename app/src/androidTest/java/com/github/lookupgroup27/lookup/{ => ui}/overview/LandingScreenTest.kt (98%) rename app/src/androidTest/java/com/github/lookupgroup27/lookup/{ => ui}/overview/MapScreenTest.kt (95%) rename app/src/androidTest/java/com/github/lookupgroup27/lookup/{ => ui}/overview/MenuScreenTest.kt (80%) rename app/src/androidTest/java/com/github/lookupgroup27/lookup/{ => ui}/overview/QuizScreenTest.kt (91%) create mode 100644 app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileScreenTest.kt rename app/src/androidTest/java/com/github/lookupgroup27/lookup/{overview => ui/skytracker}/SkyTrackerScreen.kt (91%) diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/screen/CalendarScreenTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/CalendarScreenTest.kt similarity index 96% rename from app/src/androidTest/java/com/github/lookupgroup27/lookup/screen/CalendarScreenTest.kt rename to app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/CalendarScreenTest.kt index eb6ab722b..74afaff17 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/screen/CalendarScreenTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/CalendarScreenTest.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.screen +package com.github.lookupgroup27.lookup.ui.overview import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule @@ -6,7 +6,6 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import com.github.lookupgroup27.lookup.model.calendar.CalendarViewModel import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions -import com.github.lookupgroup27.lookup.ui.overview.CalendarScreen import io.mockk.mockk import java.text.SimpleDateFormat import java.util.* diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/LandingScreenTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/LandingScreenTest.kt similarity index 98% rename from app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/LandingScreenTest.kt rename to app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/LandingScreenTest.kt index 02d0a08b5..c5ffeb136 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/LandingScreenTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/LandingScreenTest.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.overview +package com.github.lookupgroup27.lookup.ui.overview import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.assertIsDisplayed diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/MapScreenTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MapScreenTest.kt similarity index 95% rename from app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/MapScreenTest.kt rename to app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MapScreenTest.kt index 0fb282588..ad9240706 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/MapScreenTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MapScreenTest.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.overview +package com.github.lookupgroup27.lookup.ui.overview import androidx.compose.ui.test.* import androidx.compose.ui.test.junit4.createComposeRule diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/MenuScreenTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MenuScreenTest.kt similarity index 80% rename from app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/MenuScreenTest.kt rename to app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MenuScreenTest.kt index 118971bef..b21f4c64f 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/MenuScreenTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MenuScreenTest.kt @@ -1,9 +1,8 @@ -package com.github.lookupgroup27.lookup.overview +package com.github.lookupgroup27.lookup.ui.overview import androidx.compose.ui.test.* import androidx.compose.ui.test.junit4.createComposeRule import com.github.lookupgroup27.lookup.ui.navigation.* -import com.github.lookupgroup27.lookup.ui.overview.MenuScreen import org.junit.* import org.mockito.kotlin.* @@ -36,10 +35,24 @@ class MenuScreenTest { fun menuScreen_displaysAllButtons() { composeTestRule.setContent { MenuScreen(navigationActions = mockNavigationActions) } + // Check that the background is displayed + composeTestRule.onNodeWithTag("background_image").assertIsDisplayed() // Check that all buttons are displayed composeTestRule.onNodeWithText("Quizzes").assertIsDisplayed() composeTestRule.onNodeWithText("Calendar").assertIsDisplayed() composeTestRule.onNodeWithText("Sky Tracker").assertIsDisplayed() + composeTestRule.onNodeWithTag("profile_button").assertIsDisplayed() + } + + @Test + fun menuScreen_clickProfileButton_navigatesToProfile() { + composeTestRule.setContent { MenuScreen(navigationActions = mockNavigationActions) } + + // Click on profile button + composeTestRule.onNodeWithTag("profile_button").performClick() + + // Verify navigation to Profile screen is triggered + verify(mockNavigationActions).navigateTo(Screen.PROFILE) } @Test diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/QuizScreenTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/QuizScreenTest.kt similarity index 91% rename from app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/QuizScreenTest.kt rename to app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/QuizScreenTest.kt index 21fccaea4..e84695b6f 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/QuizScreenTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/QuizScreenTest.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.overview +package com.github.lookupgroup27.lookup.ui.overview import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule @@ -6,7 +6,6 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions -import com.github.lookupgroup27.lookup.ui.overview.QuizScreen import org.junit.Rule import org.junit.Test import org.mockito.kotlin.mock diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileScreenTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileScreenTest.kt new file mode 100644 index 000000000..f314ae959 --- /dev/null +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileScreenTest.kt @@ -0,0 +1,41 @@ +package com.github.lookupgroup27.lookup.ui.profile + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +class ProfileScreenTest { + + @get:Rule val composeTestRule = createComposeRule() + + private val mockNavigationActions: NavigationActions = mock() + + @Test + fun profileScreen_displaysProfileTextAndBackButton() { + composeTestRule.setContent { ProfileScreen(navigationActions = mockNavigationActions) } + + // Verify that the profile screen text is displayed + composeTestRule.onNodeWithText("Profile Screen").assertIsDisplayed() + + // Verify that the back button is displayed + composeTestRule.onNodeWithTag("go_back_button_profile").assertIsDisplayed() + } + + @Test + fun profileScreen_clickBackButton_navigatesBack() { + composeTestRule.setContent { ProfileScreen(navigationActions = mockNavigationActions) } + + // Click on back button + composeTestRule.onNodeWithTag("go_back_button_profile").performClick() + + // Verify that the navigation back action is triggered + verify(mockNavigationActions).goBack() + } +} diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/SkyTrackerScreen.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/skytracker/SkyTrackerScreen.kt similarity index 91% rename from app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/SkyTrackerScreen.kt rename to app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/skytracker/SkyTrackerScreen.kt index d2586ce43..6375dbbe2 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/overview/SkyTrackerScreen.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/skytracker/SkyTrackerScreen.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.overview +package com.github.lookupgroup27.lookup.ui.skytracker import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule @@ -6,7 +6,6 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions -import com.github.lookupgroup27.lookup.ui.skytracker.SkyTrackerScreen import org.junit.Rule import org.junit.Test import org.mockito.kotlin.mock diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/MainActivity.kt b/app/src/main/java/com/github/lookupgroup27/lookup/MainActivity.kt index 0aa0591c2..7a2d694cd 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/MainActivity.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/MainActivity.kt @@ -54,14 +54,15 @@ fun LookUpApp() { ) { composable(Screen.AUTH) { SignInScreen(navigationActions) } } - + navigation(startDestination = Screen.MAP, route = Route.MAP) { + composable(Screen.MAP) { MapScreen(navigationActions) } + } navigation( startDestination = Screen.LANDING, route = Route.LANDING, ) { composable(Screen.LANDING) { LandingScreen(navigationActions) } composable(Screen.MENU) { MenuScreen(navigationActions) } - composable(Screen.MAP) { MapScreen(navigationActions) } } navigation( @@ -70,9 +71,7 @@ fun LookUpApp() { ) { composable(Screen.MENU) { MenuScreen(navigationActions) } composable(Screen.PROFILE) { ProfileScreen(navigationActions) } - composable(Screen.CALENDAR) { CalendarScreen(calendarViewModel, navigationActions) } - composable(Screen.SKY_TRACKER) { SkyTrackerScreen(navigationActions) } composable(Screen.QUIZ) { QuizScreen(navigationActions) } } 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 76d06658e..2a0565eaa 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 @@ -1,56 +1,80 @@ package com.github.lookupgroup27.lookup.ui.overview -import androidx.compose.foundation.background +import android.annotation.SuppressLint +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.* import androidx.compose.runtime.Composable 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.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.github.lookupgroup27.lookup.ui.map.MapScreen +import com.github.lookupgroup27.lookup.R import com.github.lookupgroup27.lookup.ui.navigation.* +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun MenuScreen(navigationActions: NavigationActions) { - Box(modifier = Modifier.fillMaxSize().testTag("menu_screen")) { - // Blurred map screen as the background - MapScreen(navigationActions) // Empty function since the back button isn't needed in the blurred - // background - Spacer( - modifier = - Modifier.fillMaxSize() - .background(Color.Black.copy(alpha = 0.5f)) - .blur(70.dp) // Adjust blur strength here - ) - IconButton( - onClick = { navigationActions.goBack() }, - modifier = Modifier.padding(16.dp).align(Alignment.TopStart).testTag("back_button")) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Back", - tint = Color.White) - } + Scaffold( + bottomBar = { + BottomNavigationMenu( + onTabSelect = { destination -> navigationActions.navigateTo(destination) }, + tabList = LIST_TOP_LEVEL_DESTINATION, + selectedItem = Route.MENU) + }, + modifier = Modifier.testTag("menu_screen")) { paddingValues -> + Box(modifier = Modifier.fillMaxSize().padding(paddingValues)) { + // Blurred map screen as the background + Image( + painter = + painterResource(id = R.drawable.landing_screen_bckgrnd), // Import your image + contentDescription = "Background", + modifier = Modifier.fillMaxSize().testTag("background_image").blur(20.dp), + contentScale = ContentScale.Crop) - // Buttons in the foreground - Column( - modifier = Modifier.align(Alignment.Center).padding(horizontal = 32.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp)) { - Text( - text = "Welcome !", - color = Color.White, - style = MaterialTheme.typography.displaySmall) - Button(onClick = { navigationActions.navigateTo(Screen.QUIZ) }) { Text(text = "Quizzes") } - Button(onClick = { navigationActions.navigateTo(Screen.CALENDAR) }) { - Text(text = "Calendar") - } - Button(onClick = { navigationActions.navigateTo(Screen.SKY_TRACKER) }) { - Text(text = "Sky Tracker") - } + IconButton( + onClick = { navigationActions.goBack() }, + modifier = Modifier.padding(16.dp).align(Alignment.TopStart).testTag("back_button")) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Back", + tint = Color.White) + } + IconButton( + onClick = { navigationActions.navigateTo(Screen.PROFILE) }, + modifier = + Modifier.padding(16.dp).align(Alignment.TopEnd).testTag("profile_button")) { + Icon( + modifier = Modifier.size(56.dp), + imageVector = Icons.Default.AccountCircle, + contentDescription = "Profile", + tint = Color.White) + } + // Buttons in the foreground + Column( + modifier = Modifier.align(Alignment.Center).padding(horizontal = 32.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp)) { + Text( + text = "Welcome !", + color = Color.White, + style = MaterialTheme.typography.displaySmall) + Button(onClick = { navigationActions.navigateTo(Screen.QUIZ) }) { + Text(text = "Quizzes") + } + Button(onClick = { navigationActions.navigateTo(Screen.CALENDAR) }) { + Text(text = "Calendar") + } + Button(onClick = { navigationActions.navigateTo(Screen.SKY_TRACKER) }) { + Text(text = "Sky Tracker") + } + } } - } + } } 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 17ce0789c..51d9ddecd 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 @@ -2,5 +2,13 @@ package com.github.lookupgroup27.lookup.ui.profile import androidx.compose.runtime.Composable import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions +import com.github.lookupgroup27.lookup.ui.overview.SampleScreen -@Composable fun ProfileScreen(navigationActions: NavigationActions) {} +@Composable +fun ProfileScreen(navigationActions: NavigationActions) { + SampleScreen( + screenText = "Profile Screen", + navigationActions = navigationActions, + screenTag = "profile_screen", + backButtonTag = "go_back_button_profile") +}