148 lines
5.2 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|