Skip to content

Commit

Permalink
feat: Implemented bottom navigation bar and added profile button in menu
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
rihabbelmekki committed Oct 14, 2024
1 parent 69498f7 commit e2ed3b5
Show file tree
Hide file tree
Showing 10 changed files with 134 additions and 52 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
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
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.*
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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.*

Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
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
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
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
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
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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) }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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")
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}

0 comments on commit e2ed3b5

Please sign in to comment.