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))