Skip to content

Commit bd30db2

Browse files
committed
dining hall header buttons and image
1 parent 0069462 commit bd30db2

9 files changed

Lines changed: 232 additions & 33 deletions

File tree

PennMobile/src/main/java/com/pennapps/labs/pennmobile/dining/fragments/DiningViewModel.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.pennapps.labs.pennmobile.dining.fragments
22

33
import android.content.SharedPreferences
44
import android.util.Log
5+
import androidx.compose.runtime.State
56
import androidx.core.content.edit
67
import androidx.lifecycle.ViewModel
78
import androidx.lifecycle.viewModelScope
@@ -16,6 +17,7 @@ import kotlinx.coroutines.delay
1617
import kotlinx.coroutines.flow.MutableStateFlow
1718
import kotlinx.coroutines.flow.SharingStarted
1819
import kotlinx.coroutines.flow.StateFlow
20+
import kotlinx.coroutines.flow.combine
1921
import kotlinx.coroutines.flow.map
2022
import kotlinx.coroutines.flow.stateIn
2123
import kotlinx.coroutines.launch
@@ -47,11 +49,17 @@ class DiningViewModel
4749
emptyList(),
4850
)
4951

52+
val favouriteDiningHallIds: StateFlow<List<Int>> = _favouriteDiningHalls
53+
5054
val favouriteDiningHalls =
5155
_favouriteDiningHalls
52-
.map { favouriteIDs ->
53-
allDiningHalls.value.filter { diningHall -> favouriteIDs.contains(diningHall.id) }
56+
.combine(allDiningHalls) { favouriteIDs, halls ->
57+
halls.filter { diningHall -> favouriteIDs.contains(diningHall.id) }
5458
}
59+
// when refreshed, wiped out the hearts in the all-dining-halls list
60+
// .map { favouriteIDs ->
61+
// allDiningHalls.value.filter { diningHall -> favouriteIDs.contains(diningHall.id) }
62+
// }
5563

5664
init {
5765
fetchSortOrder()

PennMobile/src/main/java/com/pennapps/labs/pennmobile/dining/fragments/MenuFragment.kt

Lines changed: 101 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.pennapps.labs.pennmobile.dining.fragments
22

3+
import android.content.Intent
34
import android.graphics.Color
45
import android.os.Bundle
56
import android.view.LayoutInflater
@@ -8,20 +9,33 @@ import android.view.MenuInflater
89
import android.view.MenuItem
910
import android.view.View
1011
import android.view.ViewGroup
11-
import androidx.appcompat.widget.Toolbar
12+
import android.widget.Button
13+
import android.widget.ImageButton
14+
import android.widget.ImageView
15+
import android.widget.TextView
16+
import androidx.appcompat.app.AppCompatActivity
17+
import androidx.core.content.ContextCompat
18+
import androidx.core.net.toUri
19+
import androidx.core.view.WindowInsetsControllerCompat
1220
import androidx.fragment.app.Fragment
1321
import androidx.fragment.app.FragmentManager
1422
import androidx.fragment.app.FragmentStatePagerAdapter
23+
import androidx.lifecycle.ViewModelProvider
24+
import androidx.lifecycle.lifecycleScope
1525
import androidx.viewpager.widget.PagerAdapter
1626
import androidx.viewpager.widget.ViewPager
27+
import com.google.android.material.appbar.CollapsingToolbarLayout
28+
import com.google.android.material.appbar.MaterialToolbar
29+
import com.google.android.material.tabs.TabLayout
1730
import com.pennapps.labs.pennmobile.MainActivity
1831
import com.pennapps.labs.pennmobile.R
1932
import com.pennapps.labs.pennmobile.dining.classes.DiningHall
33+
import kotlinx.coroutines.launch
2034
import org.apache.commons.lang3.StringUtils
2135

2236
class MenuFragment : Fragment() {
2337
private lateinit var mActivity: MainActivity
24-
private lateinit var toolBar: Toolbar
38+
private lateinit var viewModel: DiningViewModel
2539

2640
private var mDiningHall: DiningHall? = null
2741
private var pageAdapter: PagerAdapter? = null
@@ -92,7 +106,9 @@ class MenuFragment : Fragment() {
92106
super.onCreate(savedInstanceState)
93107
mDiningHall = arguments?.getParcelable("DiningHall")
94108
mActivity = activity as MainActivity
109+
viewModel = ViewModelProvider(requireActivity())[DiningViewModel::class.java]
95110
setHasOptionsMenu(true)
111+
viewModel.refreshData()
96112
}
97113

98114
override fun onCreateView(
@@ -106,17 +122,94 @@ class MenuFragment : Fragment() {
106122
val pager: ViewPager = v.findViewById(R.id.menu_pager)
107123
pager.adapter = pageAdapter
108124
v.setBackgroundColor(Color.WHITE)
109-
mActivity.addTabs(pageAdapter as TabAdapter, pager, true)
125+
126+
val tabLayout = v.findViewById<TabLayout>(R.id.dining_tab_layout)
127+
tabLayout.setupWithViewPager(pager)
128+
tabLayout.setTabTextColors(Color.WHITE, Color.WHITE)
129+
110130
return v
111131
}
112132

113133
override fun onViewCreated(
114134
view: View,
115135
savedInstanceState: Bundle?,
116136
) {
117-
super.onViewCreated(view, savedInstanceState)
118-
toolBar = mActivity.findViewById(R.id.toolbar)
119-
toolBar.visibility = View.VISIBLE
137+
WindowInsetsControllerCompat(requireActivity().window, requireView()).isAppearanceLightStatusBars = false
138+
139+
val localToolbar = view.findViewById<MaterialToolbar>(R.id.dining_toolbar)
140+
(activity as AppCompatActivity).setSupportActionBar(localToolbar)
141+
(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
142+
localToolbar.navigationIcon?.setTint(Color.WHITE)
143+
144+
// set image
145+
val imageView = view.findViewById<ImageView>(R.id.dining_header_image)
146+
imageView.setImageResource(mDiningHall?.image ?: 0)
147+
148+
// set title
149+
view.findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar).title = mDiningHall?.name
150+
view.findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar).setExpandedTitleColor(Color.WHITE)
151+
view.findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar).setCollapsedTitleTextColor(Color.WHITE)
152+
153+
// set toolbar buttons
154+
view.findViewById<ImageButton>(R.id.dining_location).setOnClickListener {
155+
val location =
156+
when (mDiningHall?.name) {
157+
"Accenture Café" -> "Towne Building"
158+
"Cafe West" -> "Gutmann College House"
159+
"Falk Kosher Dining" -> "Penn Hillel"
160+
"Joe's Café" -> "3620 Locust Walk"
161+
"McClelland Express" -> "3700 Spruce Street"
162+
"Pret a Manger Locust", "Pret a Manger MBA" -> "3730 Walnut St, Philadelphia, PA 19104"
163+
else -> mDiningHall?.name
164+
}
165+
val diningHallMapUrl = "https://maps.google.com/?q=$location"
166+
val intent = Intent(Intent.ACTION_VIEW, diningHallMapUrl.toUri())
167+
startActivity(intent)
168+
}
169+
170+
view.findViewById<ImageButton>(R.id.dining_website).setOnClickListener {
171+
val website =
172+
when (mDiningHall?.name) {
173+
"Falk Kosher Dining" -> "Falk Dining Commons"
174+
"Accenture Café" -> "Accenture Cafe"
175+
"Joe's Café" -> "Joes Cafe"
176+
"English House" -> "kings court english house"
177+
"McClelland Express" -> "pdss"
178+
"Pret a Manger Locust" -> "Pret a Manger Lower"
179+
"Pret a Manger MBA" -> "Pret a Manger Upper"
180+
else -> mDiningHall?.name
181+
}
182+
val formattedDiningName = website?.lowercase()?.replace(" ", "-")
183+
val diningHallMenuUrl = "https://university-of-pennsylvania.cafebonappetit.com/cafe/$formattedDiningName/"
184+
val intent = Intent(Intent.ACTION_VIEW, diningHallMenuUrl.toUri())
185+
startActivity(intent)
186+
}
187+
188+
val favoriteButton = view.findViewById<ImageButton>(R.id.favorite_dining)
189+
190+
fun updateFavoriteButton(isFavourite: Boolean) {
191+
val icon =
192+
if (isFavourite) {
193+
R.drawable.ic_star_24dp
194+
} else {
195+
R.drawable.ic_star_border_24dp
196+
}
197+
favoriteButton.setImageResource(icon)
198+
favoriteButton.setColorFilter(ContextCompat.getColor(requireContext(), android.R.color.holo_orange_light))
199+
}
200+
201+
viewLifecycleOwner.lifecycleScope.launch {
202+
viewModel.favouriteDiningHallIds.collect { favoriteIds ->
203+
updateFavoriteButton(favoriteIds.contains(mDiningHall?.id))
204+
}
205+
}
206+
207+
favoriteButton.setOnClickListener {
208+
mDiningHall?.let { hall ->
209+
viewModel.toggleFavourite(hall)
210+
updateFavoriteButton(viewModel.isFavourite(hall))
211+
}
212+
}
120213
mActivity.hideBottomBar()
121214
}
122215

@@ -150,13 +243,11 @@ class MenuFragment : Fragment() {
150243
val pager: ViewPager = requireView().findViewById(R.id.menu_pager)
151244
pager.adapter = null
152245
}
246+
WindowInsetsControllerCompat(requireActivity().window, requireView()).isAppearanceLightStatusBars = true
153247

154248
super.onDestroyView()
155-
mActivity.removeTabs()
156-
if (mActivity.supportActionBar != null) {
157-
mActivity.supportActionBar?.setDisplayHomeAsUpEnabled(false)
158-
}
159249
mActivity.supportActionBar?.hide()
250+
mActivity.showBottomBar()
160251
}
161252

162253
override fun onDestroy() {

PennMobile/src/main/java/com/pennapps/labs/pennmobile/dining/fragments/MenuTab.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class MenuTab : Fragment() {
4545
)
4646
},
4747
)
48+
// v - breakfast, lunch, dinner
4849
v.setBackgroundColor(Color.WHITE)
4950
return v
5051
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="960"
5+
android:viewportHeight="960">
6+
<path
7+
android:pathData="m300,660 l280,-80 80,-280 -280,80 -80,280ZM480,540q-25,0 -42.5,-17.5T420,480q0,-25 17.5,-42.5T480,420q25,0 42.5,17.5T540,480q0,25 -17.5,42.5T480,540ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q133,0 226.5,-93.5T800,480q0,-133 -93.5,-226.5T480,160q-133,0 -226.5,93.5T160,480q0,133 93.5,226.5T480,800ZM480,480Z"
8+
android:fillColor="#1f1f1f"/>
9+
</vector>

PennMobile/src/main/res/layout/activity_main.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
1+
<androidx.drawerlayout.widget.DrawerLayout
2+
xmlns:android="http://schemas.android.com/apk/res/android"
23
android:id="@+id/drawer_layout"
34
android:layout_width="match_parent"
45
android:layout_height="match_parent">

PennMobile/src/main/res/layout/fragment_dining_info.xml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
2-
android:layout_width="match_parent"
3-
android:layout_height="match_parent">
1+
<androidx.core.widget.NestedScrollView
2+
xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent">
5+
46
<LinearLayout
57
android:id="@+id/dining_info"
68
android:layout_width="match_parent"
@@ -35,4 +37,4 @@
3537
</RelativeLayout>
3638
</LinearLayout>
3739

38-
</ScrollView>
40+
</androidx.core.widget.NestedScrollView>

PennMobile/src/main/res/layout/fragment_home.xml

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto"
4-
xmlns:tools="http://schemas.android.com/tools"
54
android:id="@+id/coordinator"
65
android:layout_width="match_parent"
76
android:layout_height="match_parent"
@@ -14,8 +13,7 @@
1413
android:elevation="0dp"
1514
android:theme="@style/AppTheme.AppBarOverlay"
1615
app:elevation="0dp"
17-
android:fitsSystemWindows="true"
18-
tools:targetApi="lollipop">
16+
android:fitsSystemWindows="true">
1917

2018
<FrameLayout
2119
android:id="@+id/appbar_container"
@@ -29,13 +27,10 @@
2927
android:layout_height="wrap_content"
3028
android:layout_gravity="start|top"
3129
android:layout_marginStart="24dp"
32-
android:layout_marginLeft="24dp"
3330
android:layout_marginTop="24dp"
3431
android:layout_marginEnd="95dp"
35-
android:layout_marginRight="95dp"
3632
android:ellipsize="marquee"
37-
android:singleLine="true"
38-
android:text="SUNDAY, JAN 2019" />
33+
android:singleLine="true" />
3934

4035
<TextView
4136
android:id="@+id/title_view"
@@ -44,10 +39,8 @@
4439
android:layout_height="wrap_content"
4540
android:layout_gravity="start|bottom"
4641
android:layout_marginStart="24dp"
47-
android:layout_marginLeft="24dp"
4842
android:layout_marginBottom="4dp"
4943
android:maxLines="1"
50-
android:text="Activity"
5144
/>
5245

5346
<androidx.constraintlayout.widget.ConstraintLayout
@@ -57,7 +50,7 @@
5750
android:layout_gravity="center_vertical|end"
5851
android:layout_marginTop="4dp"
5952
android:layout_marginEnd="36dp"
60-
android:layout_marginRight="36dp">
53+
>
6154

6255
<ImageView
6356
android:id="@+id/profile_background"

0 commit comments

Comments
 (0)