diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/End2EndTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/End2EndTest.kt index d0f6e7320..87265be66 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/End2EndTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/End2EndTest.kt @@ -121,7 +121,7 @@ class End2EndTest { composeTestRule.onNodeWithTag("menu_screen").assertIsDisplayed() // Step 5: Navigate to MapScreen from MenuScreen - composeTestRule.onNodeWithText("Map").performClick() + composeTestRule.onNodeWithText("Sky Map").performClick() composeTestRule.waitForIdle() composeTestRule.onNodeWithTag("map_screen").assertIsDisplayed() composeTestRule.onNodeWithTag(TopLevelDestinations.MENU.textId).performClick() diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/map/MapKtTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/map/MapKtTest.kt index 2d280fff7..b4e75d2f6 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/map/MapKtTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/map/MapKtTest.kt @@ -53,9 +53,9 @@ class MapKtTest { @Test fun mapScreen_bottomNavigation_clickMapTab_doesNotNavigateToMap() { // Click on the "Map" tab - composeTestRule.onNodeWithTag("Map").performClick() + composeTestRule.onNodeWithTag("Sky Map").performClick() - val mapDestination = LIST_TOP_LEVEL_DESTINATION.first { it.textId == "Map" } + val mapDestination = LIST_TOP_LEVEL_DESTINATION.first { it.textId == "Sky Map" } // Verify that navigation to the Map screen does NOT occur verify(mockNavigationActions, never()).navigateTo(mapDestination) diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/LandingKtTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/LandingKtTest.kt index e6c79e82c..bbd24f2b5 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/LandingKtTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/LandingKtTest.kt @@ -66,7 +66,7 @@ class LandingKtTest { composeTestRule.waitForIdle() // Assert that the Map screen is displayed by checking for specific text or UI elements - verify(mockNavigationActions).navigateTo(Screen.MAP) + verify(mockNavigationActions).navigateTo(Screen.SKY_MAP) } @Test diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MenuKtTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MenuKtTest.kt index 91a7645bc..e447b2937 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MenuKtTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/overview/MenuKtTest.kt @@ -61,9 +61,9 @@ class MenuKtTest { } // Click on the Map tab - composeTestRule.onNodeWithTag("Map").performClick() + composeTestRule.onNodeWithTag("Sky Map").performClick() - val mapDestination = LIST_TOP_LEVEL_DESTINATION.first { it.textId == "Map" } + val mapDestination = LIST_TOP_LEVEL_DESTINATION.first { it.textId == "Sky Map" } // Verify that navigation to the Map screen is triggered with the correct object verify(mockNavigationActions).navigateTo(mapDestination) diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileKtTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileKtTest.kt index 34e7c9525..80be8f682 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileKtTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/ui/profile/ProfileKtTest.kt @@ -173,7 +173,7 @@ class ProfileKtTest { } // Ensure that the "Map" and "Menu" tabs are still displayed even if the route is empty - composeTestRule.onNodeWithText(getResourceString(R.string.map)).assertExists() + composeTestRule.onNodeWithText(getResourceString(R.string.sky_map)).assertExists() composeTestRule.onNodeWithText(getResourceString(R.string.menu)).assertExists() // Verify that currentRoute() was called 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 795663bd7..51f228192 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/MainActivity.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/MainActivity.kt @@ -100,8 +100,8 @@ fun LookUpApp() { composable(Screen.LOGIN) { LoginScreen(loginViewModel, navigationActions) } composable(Screen.REGISTER) { RegisterScreen(navigationActions, registerViewModel) } } - navigation(startDestination = Screen.MAP, route = Route.MAP) { - composable(Screen.MAP) { MapScreen(navigationActions, mapViewModel) } + navigation(startDestination = Screen.SKY_MAP, route = Route.SKY_MAP) { + composable(Screen.SKY_MAP) { MapScreen(navigationActions, mapViewModel) } } navigation( startDestination = Screen.LANDING, 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 025847e7d..fff781f29 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 @@ -111,7 +111,7 @@ fun MapScreen(navigationActions: NavigationActions, mapViewModel: MapViewModel) onTabSelect = { destination -> navigationActions.navigateTo(destination) }, tabList = LIST_TOP_LEVEL_DESTINATION, isUserLoggedIn = isUserLoggedIn, - selectedItem = Route.MAP) + selectedItem = Route.SKY_MAP) }) { innerPadding -> if (locationProvider.currentLocation.value != null) { Box(modifier = Modifier.fillMaxSize().padding(innerPadding).testTag("map_screen")) { 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 d5cc86ede..cba7e5554 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 @@ -1,8 +1,10 @@ package com.github.lookupgroup27.lookup.ui.navigation import android.widget.Toast +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar @@ -12,8 +14,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp @Composable @@ -30,7 +34,22 @@ fun BottomNavigationMenu( content = { tabList.forEach { tab -> NavigationBarItem( - icon = { Icon(tab.icon, contentDescription = null, tint = Color.White) }, + icon = { + // Load the correct icon based on the type (ImageVector or Painter) + when { + tab.iconVector != null -> + Icon( + imageVector = tab.iconVector, + contentDescription = null, + tint = Color.White) + tab.iconResource != null -> + Image( + painter = painterResource(id = tab.iconResource), + contentDescription = null, + modifier = Modifier.size(34.dp), + colorFilter = ColorFilter.tint(Color.White)) + } + }, label = { Text(text = tab.textId, color = Color.White) }, selected = tab.route == selectedItem, onClick = { diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActions.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActions.kt index 0c42673ca..68d9776ae 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActions.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActions.kt @@ -3,15 +3,15 @@ package com.github.lookupgroup27.lookup.ui.navigation import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.List import androidx.compose.material.icons.outlined.Menu -import androidx.compose.material.icons.outlined.Place import androidx.compose.ui.graphics.vector.ImageVector import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController +import com.github.lookupgroup27.lookup.R object Route { const val AUTH = "Auth" const val LANDING = "Landing" - const val MAP = "Map" + const val SKY_MAP = "SkyMap" const val CALENDAR = "Calendar" const val GOOGLE_MAP = "Google Map" const val QUIZ = "Quiz" @@ -33,7 +33,7 @@ object Route { object Screen { const val AUTH = "Auth Screen" const val LANDING = "Landing Screen" - const val MAP = "Map Screen" + const val SKY_MAP = "Sky Map Screen" const val CALENDAR = "Calendar Screen" const val GOOGLE_MAP = "Google Map Screen" const val QUIZ = "Quiz Screen" @@ -52,16 +52,25 @@ object Screen { const val EDIT_IMAGE = "Edit Image" } -data class TopLevelDestination(val route: String, val icon: ImageVector, val textId: String) +data class TopLevelDestination( + val route: String, + val iconVector: ImageVector? = null, // For ImageVector icons + val iconResource: Int? = null, // For PainterResource drawable icons + val textId: String +) object TopLevelDestinations { - val MENU = TopLevelDestination(route = Route.MENU, icon = Icons.Outlined.Menu, textId = "Menu") - val MAP = TopLevelDestination(route = Route.MAP, icon = Icons.Outlined.Place, textId = "Map") - val FEED = TopLevelDestination(route = Route.FEED, icon = Icons.Outlined.List, textId = "Feed") + val MENU = + TopLevelDestination(route = Route.MENU, iconVector = Icons.Outlined.Menu, textId = "Menu") + val SKY_MAP = + TopLevelDestination( + route = Route.SKY_MAP, iconResource = R.drawable.skymap_icon, textId = "Sky Map") + val FEED = + TopLevelDestination(route = Route.FEED, iconVector = Icons.Outlined.List, textId = "Feed") } val LIST_TOP_LEVEL_DESTINATION = - listOf(TopLevelDestinations.MENU, TopLevelDestinations.MAP, TopLevelDestinations.FEED) + listOf(TopLevelDestinations.MENU, TopLevelDestinations.SKY_MAP, TopLevelDestinations.FEED) open class NavigationActions( private val navController: NavHostController, 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 cc5559bfd..dd375ab4e 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 @@ -36,7 +36,7 @@ fun LandingScreen(navigationActions: NavigationActions) { BoxWithConstraints( modifier = Modifier.fillMaxSize().testTag("LandingScreen").clickable { - navigationActions.navigateTo(Screen.MAP) + navigationActions.navigateTo(Screen.SKY_MAP) }) { // Background Image BackgroundImage( diff --git a/app/src/main/res/drawable/skymap_icon.png b/app/src/main/res/drawable/skymap_icon.png new file mode 100644 index 000000000..8d42a0552 Binary files /dev/null and b/app/src/main/res/drawable/skymap_icon.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0cc866eff..051cd0bf1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,7 +19,7 @@ Change Avatar Personal Info > Your Collection > - Map + Sky Map Menu Reset map_slider_tag diff --git a/app/src/test/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActionsTest.kt b/app/src/test/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActionsTest.kt index e0788227a..f186ae28a 100644 --- a/app/src/test/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActionsTest.kt +++ b/app/src/test/java/com/github/lookupgroup27/lookup/ui/navigation/NavigationActionsTest.kt @@ -37,8 +37,8 @@ class NavigationActionsTest { @Test fun navigateToCallsController() { // Test navigating to top-level destinations - navigationActions.navigateTo(TopLevelDestinations.MAP) - verify(navHostController).navigate(eq(Route.MAP), any Unit>()) + navigationActions.navigateTo(TopLevelDestinations.SKY_MAP) + verify(navHostController).navigate(eq(Route.SKY_MAP), any Unit>()) navigationActions.navigateTo(TopLevelDestinations.MENU) verify(navHostController).navigate(eq(Route.MENU), any Unit>()) @@ -70,7 +70,7 @@ class NavigationActionsTest { @Test fun topLevelDestinationsListIsCorrect() { val expectedList = - listOf(TopLevelDestinations.MENU, TopLevelDestinations.MAP, TopLevelDestinations.FEED) + listOf(TopLevelDestinations.MENU, TopLevelDestinations.SKY_MAP, TopLevelDestinations.FEED) assertThat(LIST_TOP_LEVEL_DESTINATION, `is`(expectedList)) } @@ -78,8 +78,8 @@ class NavigationActionsTest { fun navigateToTopLevelDestinationSetsCorrectOptions() { val optionsCaptor = argumentCaptor Unit>() - navigationActions.navigateTo(TopLevelDestinations.MAP) - verify(navHostController).navigate(eq(Route.MAP), optionsCaptor.capture()) + navigationActions.navigateTo(TopLevelDestinations.SKY_MAP) + verify(navHostController).navigate(eq(Route.SKY_MAP), optionsCaptor.capture()) val navOptionsBuilder = NavOptionsBuilder().apply(optionsCaptor.firstValue) assertThat(navOptionsBuilder.launchSingleTop, `is`(true))