MTU-Dining/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuAdapter.java
2024-02-18 00:41:47 -05:00

148 lines
5.2 KiB
Java

package com.thebrokenrail.mtudining.activity.menu;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textfield.MaterialAutoCompleteTextView;
import com.google.android.material.textfield.TextInputLayout;
import com.thebrokenrail.mtudining.R;
import com.thebrokenrail.mtudining.activity.task.Task;
import com.thebrokenrail.mtudining.activity.task.TaskAdapter;
import com.thebrokenrail.mtudining.api.method.PeriodDetail;
import com.thebrokenrail.mtudining.util.Category;
import com.thebrokenrail.mtudining.util.DateUtil;
import com.thebrokenrail.mtudining.widget.CategoryView;
import com.thebrokenrail.mtudining.widget.CustomDropDownView;
import java.util.Date;
/**
* Adapter for listing dining halls.
*/
class MenuAdapter extends TaskAdapter<MenuData> {
/**
* Current state.
*/
private final MenuState state;
MenuAdapter(Task<MenuData> task, MenuState state) {
super(task);
this.state = state;
}
@Override
protected View createItemView(@NonNull ViewGroup parent) {
// Create View
CategoryView category = new CategoryView(parent.getContext(), null);
RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT);
category.setLayoutParams(layoutParams);
return category;
}
/**
* Get currently selected meal.
* @return A meal menu
*/
private MenuData.Meal getMeal() {
if (getResult() != null) {
String selectedMeal = state.getSelectedMeal();
for (MenuData.Meal meal : getResult().meals) {
if (meal.name.equals(selectedMeal)) {
// Found Meal
return meal;
}
}
}
// Could Not Find Meal
return null;
}
@Override
protected void bindItemView(View view, int position) {
MenuData.Meal meal = getMeal();
assert meal != null;
Category<PeriodDetail.Response.Menu.PeriodData.MenuCategory.MenuItem> data = meal.categories.get(position - getFirstElementPosition());
// Setup View
CategoryView category = (CategoryView) view;
category.setup(data, () -> {
// Open/Close Category
data.isOpen = !data.isOpen;
notifyItemChanged(meal.categories.indexOf(data) + getFirstElementPosition());
}, item -> {
// Show Dialog
ItemDialog.show(view.getContext(), item);
});
}
@Override
protected int getDataSize() {
MenuData.Meal meal = getMeal();
if (meal != null) {
return meal.categories.size();
} else {
return 0;
}
}
@Override
protected View createHeader(@NonNull ViewGroup parent) {
// Inflate Header XML
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
return layoutInflater.inflate(R.layout.menu_header, parent, false);
}
@Override
protected void bindHeader(View view) {
// Set Date
CustomDropDownView dateField = view.findViewById(R.id.menu_date_field);
MaterialAutoCompleteTextView date = view.findViewById(R.id.menu_date);
Date current = state.getDate();
date.setText(DateUtil.toString(current));
// Handle Click
dateField.setup();
dateField.setOnDropDown(() -> {
// Open Date Picker
MenuDatePicker.show(current, ((MenuActivity) view.getContext()).getSupportFragmentManager());
});
// Set Meal
boolean isLoaded = getResult() != null;
TextInputLayout mealField = view.findViewById(R.id.menu_meal_field);
MaterialAutoCompleteTextView meal = view.findViewById(R.id.menu_meal);
if (isLoaded) {
// Enable/Disable Field
isLoaded = getResult().meals.size() > 0;
mealField.setEnabled(isLoaded);
if (isLoaded) {
// Set Dropdown Options
meal.setSimpleItems(getResult().meals.stream().map(x -> x.name).toArray(String[]::new));
// Set Selection
meal.setText(state.getSelectedMeal(), false);
// Handle Meal Selection
meal.setOnItemClickListener((parent, view1, position, id) -> {
// Get New Meal
String newMeal = (String) parent.getAdapter().getItem(position);
// Update UI
if (!newMeal.equals(state.getSelectedMeal())) {
int oldItemCount = getItemCount();
state.setSelectedMeal(newMeal);
reloadUI(oldItemCount);
}
});
} else {
// Show N/A
meal.setText(meal.getResources().getString(R.string.not_available), false);
}
} else {
// Disable Field
mealField.setEnabled(false);
// Show No Text
meal.setText("", false);
}
}
}