diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/HomeSlidingToolbar.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/HomeSlidingToolbar.kt
new file mode 100644
index 000000000..2e70369e0
--- /dev/null
+++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/HomeSlidingToolbar.kt
@@ -0,0 +1,142 @@
+// fragments/HomeSlidingToolbar.kt
+package com.pennapps.labs.pennmobile.fragments
+
+import android.content.Context
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.*
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.draw.shadow
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.preference.PreferenceManager
+import com.pennapps.labs.pennmobile.R
+import com.pennapps.labs.pennmobile.data_classes.HomeSlidingToolbarElement
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.text.style.TextAlign
+
+val homeSlidingToolbarItems = listOf(
+ HomeSlidingToolbarElement(
+ iconRes = R.drawable.ic_dining_square,
+ title = "Dining",
+ ),
+ HomeSlidingToolbarElement(
+ iconRes = R.drawable.ic_gsr_square,
+ title = "GSR",
+ ),
+ HomeSlidingToolbarElement(
+ iconRes = R.drawable.ic_laundry_square,
+ title = "Laundry",
+ ),
+ HomeSlidingToolbarElement(
+ iconRes = R.drawable.ic_news2,
+ title = "News",
+ ),
+ HomeSlidingToolbarElement(
+ iconRes = R.drawable.ic_contacts2,
+ title = "Contacts", // TODO Confirm rename from Penn Contacts
+ ),
+ HomeSlidingToolbarElement(
+ iconRes = R.drawable.ic_fitness2,
+ title = "Fitness",
+ ),
+)
+
+@Composable
+fun HomeSlidingToolbar(context: Context = LocalContext.current, onFeatureClick: (Int) -> Unit) {
+ val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
+ val firstName = sharedPreferences.getString(context.getString(R.string.first_name), null) ?: "Guest"
+ val textColor = if (isSystemInDarkTheme()) {
+ colorResource(id = R.color.color_primary_light)
+ } else {
+ colorResource(id = R.color.color_primary_dark)
+ }
+
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ Spacer(Modifier.padding(10.dp))
+ Text(
+ text = "Welcome, $firstName!",
+ fontSize = 24.sp,
+ color = textColor,
+ fontWeight = FontWeight.Bold,
+ )
+ Spacer(Modifier.padding(10.dp))
+ LazyRow {
+ item{
+ Spacer(modifier = Modifier.width(8.dp))
+ }
+ items(homeSlidingToolbarItems.size) { index ->
+ HomeSlidingToolbarItem(index, onFeatureClick)
+ }
+ item{
+ Spacer(modifier = Modifier.width(8.dp))
+ }
+ }
+ }
+}
+
+@Composable
+fun HomeSlidingToolbarItem(
+ index: Int,
+ onFeatureClick: (Int) -> Unit
+) {
+ val feature = homeSlidingToolbarItems[index]
+ val lastPaddingEnd = if (index == homeSlidingToolbarItems.size - 1) 12.dp else 0.dp
+
+ // Set the textColor and backgroundColor
+ val textColor = colorResource(R.color.gray)
+ val backgroundColor = if (isSystemInDarkTheme()) {
+ colorResource(id = R.color.color_background_dark)
+ } else {
+ colorResource(id = R.color.color_background)
+ }
+
+ Box(
+ modifier = Modifier
+ .padding(6.dp)
+ .shadow(8.dp, RoundedCornerShape(20.dp)),
+ contentAlignment = Alignment.TopCenter
+ ) {
+ Column(
+ modifier = Modifier
+ .clip(RoundedCornerShape(20.dp))
+ .background(backgroundColor)
+ .clickable { onFeatureClick(index) }
+ .size(90.dp, 130.dp)
+ .padding(8.dp),
+ verticalArrangement = Arrangement.Top,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ // Icon Container
+ Image(
+ painter = painterResource(id = feature.iconRes),
+ contentDescription = feature.title,
+ modifier = Modifier
+ .padding(top = 8.dp)
+ .size(70.dp)
+ .align(Alignment.CenterHorizontally)
+ )
+ Spacer(modifier = Modifier.height(15.dp))
+ Text(
+ text = feature.title,
+ color = textColor,
+ fontWeight = FontWeight.Bold,
+ fontSize = 13.sp,
+ textAlign = TextAlign.Center
+ )
+ }
+ }
+}
diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/MainActivity.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/MainActivity.kt
index 493db3634..96e3b50f1 100644
--- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/MainActivity.kt
+++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/MainActivity.kt
@@ -325,6 +325,7 @@ class MainActivity : AppCompatActivity() {
val HOME_ID = R.id.nav_home
val GSR_ID = R.id.nav_gsr
val DINING_ID = R.id.nav_dining
+ val LAUNDRY_ID = R.id.nav_laundry
private var mStudentLife: StudentLife? = null
private var mPlatform: Platform? = null
diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/home/classes/HomeSlidingToolbarElement.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/home/classes/HomeSlidingToolbarElement.kt
new file mode 100644
index 000000000..c75e67844
--- /dev/null
+++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/home/classes/HomeSlidingToolbarElement.kt
@@ -0,0 +1,10 @@
+package com.pennapps.labs.pennmobile.data_classes
+
+import androidx.annotation.DrawableRes
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+
+data class HomeSlidingToolbarElement(
+ @DrawableRes val iconRes: Int,
+ val title: String,
+)
diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/home/fragments/HomeFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/home/fragments/HomeFragment.kt
index 1b2ae300e..7ba11ad31 100644
--- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/home/fragments/HomeFragment.kt
+++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/home/fragments/HomeFragment.kt
@@ -9,6 +9,7 @@ import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
@@ -20,9 +21,12 @@ import com.pennapps.labs.pennmobile.R
import com.pennapps.labs.pennmobile.api.OAuth2NetworkManager
import com.pennapps.labs.pennmobile.components.collapsingtoolbar.ToolbarBehavior
import com.pennapps.labs.pennmobile.databinding.FragmentHomeBinding
+import com.pennapps.labs.pennmobile.fragments.HomeSlidingToolbar
+import com.pennapps.labs.pennmobile.gsr.fragments.PottruckFragment
import com.pennapps.labs.pennmobile.home.HomepageViewModel
import com.pennapps.labs.pennmobile.home.adapters.HomeAdapter
import com.pennapps.labs.pennmobile.isOnline
+import com.pennapps.labs.pennmobile.more.fragments.SupportFragment
import com.pennapps.labs.pennmobile.utils.Utils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -86,6 +90,14 @@ class HomeFragment : Fragment() {
set to View.VISIBLE instead of View.INVISIBLE and hide loadingPanel
*/
toolbar = mActivity.findViewById(R.id.toolbar)
+
+ // Set up the ComposeView
+ binding.composeToolbar.setContent {
+ HomeSlidingToolbar { index ->
+ handleFeatureClick(index)
+ }
+ }
+
binding.homeCellsRv.layoutManager =
LinearLayoutManager(
context,
@@ -125,6 +137,38 @@ class HomeFragment : Fragment() {
getHomePage()
}
+ private fun handleFeatureClick(index: Int) {
+ when (index) {
+ 0 -> mActivity.setTab(MainActivity.DINING_ID)
+ 1 -> mActivity.setTab(MainActivity.GSR_ID)
+ 2 -> mActivity.setTab(MainActivity.LAUNDRY_ID)
+ 3 -> {
+ mActivity.supportFragmentManager
+ .beginTransaction()
+ .replace(R.id.content_frame, NewsFragment())
+ .addToBackStack(null)
+ .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .commit()
+ }
+ 4 -> {
+ mActivity.supportFragmentManager
+ .beginTransaction()
+ .replace(R.id.content_frame, SupportFragment())
+ .addToBackStack(null)
+ .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .commit()
+ }
+ 5 -> {
+ mActivity.supportFragmentManager
+ .beginTransaction()
+ .replace(R.id.content_frame, PottruckFragment())
+ .addToBackStack(null)
+ .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .commit()
+ }
+ }
+ }
+
private fun getOnline(): Boolean {
// displays banner if not connected
if (!isOnline(context)) {
diff --git a/PennMobile/src/main/res/drawable/ic_course_schedule_square.png b/PennMobile/src/main/res/drawable/ic_course_schedule_square.png
new file mode 100644
index 000000000..d8189770b
Binary files /dev/null and b/PennMobile/src/main/res/drawable/ic_course_schedule_square.png differ
diff --git a/PennMobile/src/main/res/drawable/ic_dining_square.png b/PennMobile/src/main/res/drawable/ic_dining_square.png
new file mode 100644
index 000000000..11d524a8b
Binary files /dev/null and b/PennMobile/src/main/res/drawable/ic_dining_square.png differ
diff --git a/PennMobile/src/main/res/drawable/ic_gsr_square.png b/PennMobile/src/main/res/drawable/ic_gsr_square.png
new file mode 100644
index 000000000..f3f4c481c
Binary files /dev/null and b/PennMobile/src/main/res/drawable/ic_gsr_square.png differ
diff --git a/PennMobile/src/main/res/drawable/ic_laundry_square.png b/PennMobile/src/main/res/drawable/ic_laundry_square.png
new file mode 100644
index 000000000..a4dc924e5
Binary files /dev/null and b/PennMobile/src/main/res/drawable/ic_laundry_square.png differ
diff --git a/PennMobile/src/main/res/drawable/ic_penn_events_square.png b/PennMobile/src/main/res/drawable/ic_penn_events_square.png
new file mode 100644
index 000000000..becaee0ab
Binary files /dev/null and b/PennMobile/src/main/res/drawable/ic_penn_events_square.png differ
diff --git a/PennMobile/src/main/res/drawable/ic_poll_history_square.png b/PennMobile/src/main/res/drawable/ic_poll_history_square.png
new file mode 100644
index 000000000..fbfe95998
Binary files /dev/null and b/PennMobile/src/main/res/drawable/ic_poll_history_square.png differ
diff --git a/PennMobile/src/main/res/drawable/img.png b/PennMobile/src/main/res/drawable/img.png
new file mode 100644
index 000000000..3fc917aef
Binary files /dev/null and b/PennMobile/src/main/res/drawable/img.png differ
diff --git a/PennMobile/src/main/res/layout/fragment_home.xml b/PennMobile/src/main/res/layout/fragment_home.xml
index 9642d6044..25fa2e2b1 100644
--- a/PennMobile/src/main/res/layout/fragment_home.xml
+++ b/PennMobile/src/main/res/layout/fragment_home.xml
@@ -123,10 +123,18 @@
+
+
+
diff --git a/PennMobile/src/main/res/values/colors.xml b/PennMobile/src/main/res/values/colors.xml
index 8613609bb..797db6121 100644
--- a/PennMobile/src/main/res/values/colors.xml
+++ b/PennMobile/src/main/res/values/colors.xml
@@ -44,6 +44,7 @@
#f4b400
#FFFFFF
+ #1b1b1b
#8BC34A
#F44336