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