diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 4c59370..0c0c338 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,20 +3,7 @@ - - - - - - - - - - - - - - + diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListAdapter.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListAdapter.java index 3801013..234444b 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListAdapter.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListAdapter.java @@ -10,6 +10,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.thebrokenrail.mtudining.activity.menu.MenuActivity; import com.thebrokenrail.mtudining.activity.task.Task; import com.thebrokenrail.mtudining.activity.task.TaskAdapter; +import com.thebrokenrail.mtudining.api.method.AllLocations; +import com.thebrokenrail.mtudining.util.Category; import com.thebrokenrail.mtudining.widget.CategoryView; /** @@ -31,25 +33,20 @@ class ListAdapter extends TaskAdapter { @Override protected void bindItemView(View view, int position) { - ListData.Category data = getResult().categories.get(position - getFirstElementPosition()); + Category data = getResult().categories.get(position - getFirstElementPosition()); // Setup View CategoryView category = (CategoryView) view; - category.setup(data.isOpen, data.name, () -> { + category.setup(data, () -> { // Open/Close Category data.isOpen = !data.isOpen; notifyItemChanged(getResult().categories.indexOf(data) + getFirstElementPosition()); + }, location -> { + // Open Menu + Intent intent = new Intent(category.getContext(), MenuActivity.class); + intent.putExtra(MenuActivity.ID_EXTRA, location.id); + intent.putExtra(MenuActivity.NAME_EXTRA, location.name); + category.getContext().startActivity(intent); }); - // Add Locations - category.clearItems(); - for (ListData.Category.Element location : data.locations) { - category.addItem(location.name, () -> { - // Open Menu - Intent intent = new Intent(category.getContext(), MenuActivity.class); - intent.putExtra(MenuActivity.ID_EXTRA, location.id); - intent.putExtra(MenuActivity.NAME_EXTRA, location.name); - category.getContext().startActivity(intent); - }); - } } @Override diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListData.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListData.java index b8f781a..6159737 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListData.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListData.java @@ -1,5 +1,8 @@ package com.thebrokenrail.mtudining.activity.list; +import com.thebrokenrail.mtudining.api.method.AllLocations; +import com.thebrokenrail.mtudining.util.Category; + import java.util.ArrayList; import java.util.List; @@ -7,28 +10,8 @@ import java.util.List; * Data to be displayed in {@link ListActivity}. */ class ListData { - public static class Category { - public static class Element { - public final String id; - public final String name; - - public Element(String id, String name) { - this.id = id; - this.name = name; - } - } - - public final String name; - public boolean isOpen = true; - public final List locations = new ArrayList<>(); - - public Category(String name) { - this.name = name; - } - } - public final String siteId; - public final List categories = new ArrayList<>(); + public final List> categories = new ArrayList<>(); ListData(String siteId) { this.siteId = siteId; diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListTask.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListTask.java index 9bb64b2..9bef532 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListTask.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/list/ListTask.java @@ -4,6 +4,7 @@ import com.thebrokenrail.mtudining.activity.task.Task; import com.thebrokenrail.mtudining.api.Connection; import com.thebrokenrail.mtudining.api.method.AllLocations; import com.thebrokenrail.mtudining.api.method.Info; +import com.thebrokenrail.mtudining.util.Category; import com.thebrokenrail.mtudining.util.Constants; /** @@ -30,15 +31,15 @@ class ListTask extends Task { for (AllLocations.Response.Building building : allLocationsResponse.buildings) { if (building.active) { // Found Active Building - ListData.Category category = new ListData.Category(building.name); + Category category = new Category<>(building.name); for (AllLocations.Response.Location location : building.locations) { if (location.active) { // Found Active Location - category.locations.add(new ListData.Category.Element(location.id, location.name)); + category.items.add(location); } } // Skip Empty Category - if (category.locations.size() > 0) { + if (category.items.size() > 0) { data.categories.add(category); } } diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/ItemDialog.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/ItemDialog.java new file mode 100644 index 0000000..f402ff9 --- /dev/null +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/ItemDialog.java @@ -0,0 +1,10 @@ +package com.thebrokenrail.mtudining.activity.menu; + +/** + * Dialog for a food item. + */ +public class ItemDialog { + public void show() { + + } +} diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuAdapter.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuAdapter.java index 332eb8e..e778057 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuAdapter.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuAdapter.java @@ -12,6 +12,8 @@ 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; @@ -56,21 +58,16 @@ class MenuAdapter extends TaskAdapter { protected void bindItemView(View view, int position) { MenuData.Meal meal = getMeal(); assert meal != null; - MenuData.Meal.Category data = meal.categories.get(position - getFirstElementPosition()); + Category data = meal.categories.get(position - getFirstElementPosition()); // Setup View CategoryView category = (CategoryView) view; - category.setup(data.isOpen, data.name, () -> { + category.setup(data, () -> { // Open/Close Category data.isOpen = !data.isOpen; notifyItemChanged(meal.categories.indexOf(data) + getFirstElementPosition()); + }, item -> { + // Do Something! }); - // Add Locations - category.clearItems(); - for (MenuData.Meal.Category.Element item : data.items) { - category.addItem(item.name, () -> { - // Do Something! - }); - } } @Override diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuData.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuData.java index daa0290..a596a3b 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuData.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuData.java @@ -1,33 +1,16 @@ package com.thebrokenrail.mtudining.activity.menu; +import com.thebrokenrail.mtudining.api.method.PeriodDetail; +import com.thebrokenrail.mtudining.util.Category; + import java.util.ArrayList; import java.util.List; class MenuData { public static class Meal { - public static class Category { - public static class Element { - public final String name; - public final String description; - - public Element(String name, String description) { - this.name = name; - this.description = description; - } - } - - public final String name; - public boolean isOpen = true; - public final List items = new ArrayList<>(); - - public Category(String name) { - this.name = name; - } - } - public final String id; public final String name; - public final List categories = new ArrayList<>(); + public final List> categories = new ArrayList<>(); public Meal(String id, String name) { this.id = id; diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuTask.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuTask.java index c154a3c..42beb46 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuTask.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/menu/MenuTask.java @@ -4,6 +4,7 @@ import com.thebrokenrail.mtudining.activity.task.Task; import com.thebrokenrail.mtudining.api.Connection; import com.thebrokenrail.mtudining.api.method.PeriodDetail; import com.thebrokenrail.mtudining.api.method.Periods; +import com.thebrokenrail.mtudining.util.Category; import com.thebrokenrail.mtudining.util.Constants; import java.util.Comparator; @@ -77,15 +78,13 @@ public class MenuTask extends Task { // Add Data for (PeriodDetail.Response.Menu.PeriodData.MenuCategory category : periodDetailResponse.menu.periods.categories) { - MenuData.Meal.Category menuCategory = new MenuData.Meal.Category(category.name); + Category menuCategory = new Category<>(category.name); // Sort Items category.items.sort(Comparator.comparingInt(a -> a.sort_order)); // Add Items To Category - for (PeriodDetail.Response.Menu.PeriodData.MenuCategory.MenuItem item : category.items) { - menuCategory.items.add(new MenuData.Meal.Category.Element(item.name, item.desc)); - } + menuCategory.items.addAll(category.items); // Skip Empty Category if (menuCategory.items.size() > 0) { diff --git a/app/src/main/java/com/thebrokenrail/mtudining/activity/task/TaskAdapter.java b/app/src/main/java/com/thebrokenrail/mtudining/activity/task/TaskAdapter.java index 6b3151c..6cc1990 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/activity/task/TaskAdapter.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/activity/task/TaskAdapter.java @@ -202,7 +202,7 @@ public abstract class TaskAdapter extends RecyclerView.Adapter void send(Method method, Consumer success, Runnable error) { // Build URL String url = Constants.API_BASE + method.getPath(); - System.out.println("GO: " + url); // Build Request Request request = new Request.Builder() diff --git a/app/src/main/java/com/thebrokenrail/mtudining/api/method/AllLocations.java b/app/src/main/java/com/thebrokenrail/mtudining/api/method/AllLocations.java index 8eabc03..4fbb054 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/api/method/AllLocations.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/api/method/AllLocations.java @@ -1,6 +1,7 @@ package com.thebrokenrail.mtudining.api.method; import com.thebrokenrail.mtudining.api.Method; +import com.thebrokenrail.mtudining.util.Category; import java.util.List; @@ -38,10 +39,15 @@ public class AllLocations implements Method { public List locations; } public List buildings; - public static class Location { + public static class Location implements Category.Named { public String id; public String name; public boolean active; + + @Override + public String getName() { + return name; + } } public List locations; } diff --git a/app/src/main/java/com/thebrokenrail/mtudining/api/method/PeriodDetail.java b/app/src/main/java/com/thebrokenrail/mtudining/api/method/PeriodDetail.java index b34eb80..197b7ca 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/api/method/PeriodDetail.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/api/method/PeriodDetail.java @@ -1,6 +1,7 @@ package com.thebrokenrail.mtudining.api.method; import com.thebrokenrail.mtudining.api.Method; +import com.thebrokenrail.mtudining.util.Category; import com.thebrokenrail.mtudining.util.DateUtil; import java.util.Date; @@ -33,10 +34,15 @@ public class PeriodDetail implements Method { public static class Menu { public static class PeriodData { public static class MenuCategory { - public static class MenuItem { + public static class MenuItem implements Category.Named { public String name; public String desc; public int sort_order; + + @Override + public String getName() { + return name; + } } public String name; public List items; diff --git a/app/src/main/java/com/thebrokenrail/mtudining/util/Category.java b/app/src/main/java/com/thebrokenrail/mtudining/util/Category.java new file mode 100644 index 0000000..1e8c801 --- /dev/null +++ b/app/src/main/java/com/thebrokenrail/mtudining/util/Category.java @@ -0,0 +1,30 @@ +package com.thebrokenrail.mtudining.util; + +import java.util.ArrayList; +import java.util.List; + +/** + * Simple class representing a category. + */ +public class Category { + public Category(String name) { + this.name = name; + } + + public interface Named { + String getName(); + } + + /** + * Category name. + */ + public final String name; + /** + * If category is open. + */ + public boolean isOpen = true; + /** + * Category items. + */ + public final List items = new ArrayList<>(); +} diff --git a/app/src/main/java/com/thebrokenrail/mtudining/widget/CategoryView.java b/app/src/main/java/com/thebrokenrail/mtudining/widget/CategoryView.java index 3b3bbad..85a2d0d 100644 --- a/app/src/main/java/com/thebrokenrail/mtudining/widget/CategoryView.java +++ b/app/src/main/java/com/thebrokenrail/mtudining/widget/CategoryView.java @@ -13,6 +13,9 @@ import androidx.appcompat.widget.AppCompatTextView; import com.google.android.material.card.MaterialCardView; import com.thebrokenrail.mtudining.R; +import com.thebrokenrail.mtudining.util.Category; + +import java.util.function.Consumer; /** * Widget that shows a category of items. @@ -64,21 +67,26 @@ public class CategoryView extends FrameLayout { /** * Setup widget. - * @param isOpen If category is open - * @param titleText The category's title + * @param category The category * @param onClickTitle Callback when clicking on title + * @param onClickItem Callback when clicking on an item */ - public void setup(boolean isOpen, String titleText, Runnable onClickTitle) { - titleText = (isOpen ? "▼" : "▶") + " " + titleText; + public void setup(Category category, Runnable onClickTitle, Consumer onClickItem) { + String titleText = (category.isOpen ? "▼" : "▶") + " " + category.name; title.setText(titleText); - card.setVisibility(isOpen ? VISIBLE : GONE); + card.setVisibility(category.isOpen ? VISIBLE : GONE); title.setOnClickListener(v -> onClickTitle.run()); + // Add Items + clearItems(); + for (T item : category.items) { + addItem(item.getName(), () -> onClickItem.accept(item)); + } } /** * Clear category. */ - public void clearItems() { + private void clearItems() { children.removeAllViews(); } @@ -87,7 +95,7 @@ public class CategoryView extends FrameLayout { * @param name Item name * @param onClick Click handler */ - public void addItem(String name, Runnable onClick) { + private void addItem(String name, Runnable onClick) { AppCompatTextView item = new AppCompatTextView(getContext()); // Text item.setText(name); diff --git a/app/src/main/res/layout/menu_header.xml b/app/src/main/res/layout/menu_header.xml index 5887cc4..730018a 100644 --- a/app/src/main/res/layout/menu_header.xml +++ b/app/src/main/res/layout/menu_header.xml @@ -3,14 +3,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" - android:orientation="vertical"> + android:orientation="horizontal" + android:padding="@dimen/margin"> + + +