Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions PennMobile/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ dependencies {
// If you want the foundation layout, use the bundle or the specific activity compose you have defined
implementation libs.androidx.activity.compose
implementation libs.androidx.material3.android
implementation libs.places
implementation libs.androidx.compose.ui.tooling.preview
// implementation libs.androidx.foundation.layout

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ open class DiningHall : Parcelable {
var image: Int
private set

// key date string "yyyy-MM-dd"
// populated by DiningFragment.getMenusForWeek() for today + 6 days.
@Transient
val menusByDate: MutableMap<String, MutableList<Menu>> = HashMap()

@SerializedName("tblDayPart")
var menus: MutableList<Menu> = ArrayList()

Expand Down Expand Up @@ -55,6 +60,16 @@ open class DiningHall : Parcelable {
this.menus.sortedWith(comparator)
}

// Sort and store menus for a specific date in menusByDate.
fun sortMealsForDate(
date: String,
menus: MutableList<Menu>,
) {
val mealOrder = listOf("Breakfast", "Brunch", "Lunch", "Dinner", "Express")
val sorted = menus.sortedBy { mealOrder.indexOf(it.name) }
menusByDate[date] = sorted.toMutableList()
}

override fun describeContents(): Int = 0

override fun writeToParcel(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ import dagger.hilt.android.AndroidEntryPoint
import rx.schedulers.Schedulers
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import kotlin.collections.listOf
import kotlin.text.get

@AndroidEntryPoint
class DiningFragment : Fragment() {
Expand Down Expand Up @@ -107,7 +109,7 @@ class DiningFragment : Fragment() {
val pullToRefreshState = rememberPullToRefreshState()
val isDataRefreshing by viewModel.isRefreshing.collectAsState()
val allDiningHalls by viewModel.allDiningHalls.collectAsState()
val favouriteDiningHalls by viewModel.favouriteDiningHalls.collectAsState(listOf())
val favouriteDiningHalls = viewModel.favouriteDiningHalls.collectAsState(initial = listOf<DiningHall>())

var isOnline by remember { mutableStateOf<Boolean?>(null) }
var isSortMenuExpanded by remember { mutableStateOf(false) }
Expand Down Expand Up @@ -278,7 +280,7 @@ class DiningFragment : Fragment() {

item {
FavouriteDiningHalls(
diningHalls = favouriteDiningHalls,
diningHalls = favouriteDiningHalls.value as List<DiningHall>,
toggleFavourite = { viewModel.toggleFavourite(it) },
openDiningHallMenu = { hall -> navigateToMenuFragment(hall) },
modifier =
Expand Down Expand Up @@ -306,7 +308,7 @@ class DiningFragment : Fragment() {
items(allDiningHalls) { diningHall ->
DiningHallCard(
diningHall = diningHall,
isFavourite = favouriteDiningHalls.contains(diningHall),
isFavourite = (favouriteDiningHalls.value as List<DiningHall>).any { it.id == diningHall.id },
toggleFavourite = { viewModel.toggleFavourite(diningHall) },
openDiningHallMenu = { hall -> navigateToMenuFragment(hall) },
)
Expand Down Expand Up @@ -342,36 +344,60 @@ class DiningFragment : Fragment() {
}

companion object {
// Gets the dining hall menus
fun getMenus(venues: MutableList<DiningHall>) {
try {
val idVenueMap = mutableMapOf<Int, DiningHall>()
venues.forEach { idVenueMap[it.id] = it }
val current = LocalDateTime.now()
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
val formatted = current.format(formatter)
val studentLife = MainActivity.studentLifeInstance
studentLife
.getMenus(formatted)
.subscribeOn(Schedulers.io())
.subscribe({ menus ->
menus?.filterNotNull()?.forEach { menu ->
menu.venue?.let { venue ->
idVenueMap[venue.venueId]?.let { diningHall ->
val diningHallMenus = diningHall.menus
diningHallMenus.add(menu)
diningHall.sortMeals(diningHallMenus)
private val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")

// Fetch menus for today + next 6 days for all venues (closed and open)
fun getMenusForWeek(venues: MutableList<DiningHall>) {
val idVenueMap = mutableMapOf<Int, DiningHall>()
venues.forEach { idVenueMap[it.id] = it }

val today = LocalDateTime.now()
for (offset in 0..6) {
val date = today.plusDays(offset.toLong())
val formatted = date.format(dateFormatter)

try {
val studentLife = MainActivity.studentLifeInstance
studentLife
.getMenus(formatted)
.subscribeOn(Schedulers.io())
.subscribe({ menus ->
menus?.filterNotNull()?.forEach { menu ->
menu.venue?.let { venue ->
idVenueMap[venue.venueId]?.let { diningHall ->
synchronized(diningHall.menusByDate) {
val dayMenus =
diningHall.menusByDate
.getOrPut(formatted) { ArrayList() }
(dayMenus as java.util.ArrayList).add(menu)
diningHall.sortMealsForDate(formatted, dayMenus)
}
// Keep today's menus in the legacy .menus field so existing code that reads it still works
if (offset == 0) {
synchronized(diningHall) {
diningHall.sortMeals(
diningHall.menusByDate[formatted]
?: ArrayList(),
)
}
}
}
}
}
}
}, { throwable ->
Log.e("DiningFragment", "Error getting Menus", throwable)
})
} catch (e: Exception) {
e.printStackTrace()
}, { throwable ->
Log.e("DiningFragment", "Error getting menus for $formatted", throwable)
})
} catch (e: Exception) {
Log.e("DiningFragment", "Exception fetching menus for $formatted", e)
}
}
}

// single-day fetch
fun getMenus(venues: MutableList<DiningHall>) {
getMenusForWeek(venues)
}

// Takes a venue then adds an image and modifies venue name if name is too long
fun createHall(venue: Venue): DiningHall {
when (venue.id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,11 @@ import org.joda.time.format.DateTimeFormat
*/
class DiningInfoFragment : Fragment() {
private lateinit var menuParent: RelativeLayout
private var mDiningHall: DiningHall? = null
var mDiningHall: DiningHall? = null
private lateinit var mActivity: MainActivity

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mDiningHall = arguments?.getParcelable("DiningHall")
mActivity = activity as MainActivity
}

Expand Down
Loading
Loading