diff --git a/app/release/app-release.aab b/app/release/app-release.aab new file mode 100644 index 00000000..e0a44180 Binary files /dev/null and b/app/release/app-release.aab differ diff --git a/app/src/main/java/com/cornellappdev/android/eatery/MenuFragment.java b/app/src/main/java/com/cornellappdev/android/eatery/MenuFragment.java index ebd37531..a21c8cfe 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/MenuFragment.java +++ b/app/src/main/java/com/cornellappdev/android/eatery/MenuFragment.java @@ -11,16 +11,24 @@ import com.cornellappdev.android.eatery.model.MealMenuModel; import com.cornellappdev.android.eatery.model.MealModel; +import com.cornellappdev.android.eatery.util.Divider; import java.util.ArrayList; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; public class MenuFragment extends Fragment { int position; private MealMenuModel mMenu; private LinearLayout mLinear; + private MenuItemsAdapter adapter; + private RecyclerView menuRecyclerView; + private RecyclerView.LayoutManager linearLayoutManager; + @Override public View onCreateView( @@ -28,6 +36,12 @@ public View onCreateView( mMenu = ((MealModel) getArguments().getSerializable("cafeData")).getMenu(); View view = inflater.inflate(R.layout.fragment_menu, container, false); mLinear = view.findViewById(R.id.linearFragment); + menuRecyclerView = view.findViewById(R.id.menu_recycler_view); + linearLayoutManager = new LinearLayoutManager(getContext()); + adapter = new MenuItemsAdapter(mMenu, getContext()); + menuRecyclerView.setAdapter(adapter); + menuRecyclerView.setLayoutManager(linearLayoutManager); + menuRecyclerView.addItemDecoration(new Divider(getContext())); try { position = getArguments().getInt("position"); @@ -48,65 +62,65 @@ public View onCreateView( } ArrayList categories = (ArrayList) mMenu.getCategories(); - for (int i = 0; i < categories.size(); i++) { - // Add subheading for category of food - TextView categoryText = new TextView(getContext()); - categoryText.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL)); - categoryText.setText(categories.get(i)); - categoryText.setTextSize(16); - categoryText.setTextColor(ContextCompat.getColor(getContext(), R.color.primary)); - categoryText.setPadding( - (int) (16 * scale + 0.5f), (int) (12 * scale + 0.5f), 0, - (int) (12 * scale + 0.5f)); - mLinear.addView(categoryText); - - View blank = new View(getContext()); - blank.setLayoutParams( - new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1)); - blank.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.inactive)); - blank.setElevation(-1); - mLinear.addView(blank); - - ArrayList items = (ArrayList) mMenu.getItems(categories.get(i)); - for (int j = 0; j < items.size(); j++) { - TextView mealItemText = new TextView(getContext()); - mealItemText.setText(items.get(j)); - mealItemText.setTextSize(14); - mealItemText.setTextColor(ContextCompat.getColor(getContext(), R.color.primary)); - mealItemText.setPadding( - (int) (16 * scale + 0.5f), (int) (8 * scale + 0.5f), 0, - (int) (8 * scale + 0.5f)); - mLinear.addView(mealItemText); - if (j != items.size() - 1) { - View divider = new View(getContext()); - divider.setBackgroundColor( - ContextCompat.getColor(getContext(), R.color.inactive)); - LinearLayout.LayoutParams dividerParams = - new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, - 1); - dividerParams.setMargins((int) (15.8 * scale + 0.5f), 0, 0, 0); - divider.setElevation(-1); - divider.setLayoutParams(dividerParams); - mLinear.addView(divider); - } - } - - // Add horizontal line that separates each category - if (i < categories.size() - 1) { - View divider = new View(getContext()); - divider.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.inactive)); - divider.setLayoutParams( - new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1)); - divider.setElevation(-1); - mLinear.addView(divider); - } - - View grey = new View(getContext()); - grey.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.wash)); - grey.setLayoutParams( - new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 16)); - mLinear.addView(grey); - } +// for (int i = 0; i < categories.size(); i++) { +// // Add subheading for category of food +// TextView categoryText = new TextView(getContext()); +// categoryText.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL)); +// categoryText.setText(categories.get(i)); +// categoryText.setTextSize(16); +// categoryText.setTextColor(ContextCompat.getColor(getContext(), R.color.primary)); +// categoryText.setPadding( +// (int) (16 * scale + 0.5f), (int) (12 * scale + 0.5f), 0, +// (int) (12 * scale + 0.5f)); +// mLinear.addView(categoryText); +// +// View blank = new View(getContext()); +// blank.setLayoutParams( +// new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1)); +// blank.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.inactive)); +// blank.setElevation(-1); +// mLinear.addView(blank); +// +// ArrayList items = (ArrayList) mMenu.getItems(categories.get(i)); +// for (int j = 0; j < items.size(); j++) { +// TextView mealItemText = new TextView(getContext()); +// mealItemText.setText(items.get(j)); +// mealItemText.setTextSize(14); +// mealItemText.setTextColor(ContextCompat.getColor(getContext(), R.color.primary)); +// mealItemText.setPadding( +// (int) (16 * scale + 0.5f), (int) (8 * scale + 0.5f), 0, +// (int) (8 * scale + 0.5f)); +// mLinear.addView(mealItemText); +// if (j != items.size() - 1) { +// View divider = new View(getContext()); +// divider.setBackgroundColor( +// ContextCompat.getColor(getContext(), R.color.inactive)); +// LinearLayout.LayoutParams dividerParams = +// new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, +// 1); +// dividerParams.setMargins((int) (15.8 * scale + 0.5f), 0, 0, 0); +// divider.setElevation(-1); +// divider.setLayoutParams(dividerParams); +// mLinear.addView(divider); +// } +// } +// +// // Add horizontal line that separates each category +// if (i < categories.size() - 1) { +// View divider = new View(getContext()); +// divider.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.inactive)); +// divider.setLayoutParams( +// new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1)); +// divider.setElevation(-1); +// mLinear.addView(divider); +// } +// +// View grey = new View(getContext()); +// grey.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.wash)); +// grey.setLayoutParams( +// new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 16)); +// mLinear.addView(grey); +// } return view; } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/MenuItemsAdapter.java b/app/src/main/java/com/cornellappdev/android/eatery/MenuItemsAdapter.java new file mode 100644 index 00000000..1cb36a83 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/android/eatery/MenuItemsAdapter.java @@ -0,0 +1,123 @@ +package com.cornellappdev.android.eatery; + +import android.content.Context; +import android.graphics.Typeface; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.cornellappdev.android.eatery.model.MealMenuModel; + +import java.util.List; + +public class MenuItemsAdapter extends RecyclerView.Adapter { + + MealMenuModel menu; + List flatMenu; + Context context; + + final int CATEGORY = 0, ITEM = 1; + + public MenuItemsAdapter(MealMenuModel menu, Context context){ + this.menu = menu; + flatMenu = menu.getMenuAsList(); + this.context = context; + } + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + RecyclerView.ViewHolder viewHolder; + View view; + + if(viewType == CATEGORY){ + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.menu_category_title_item, parent, false); + viewHolder = new CategoryViewHolder(view); + } else { + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.menu_item, parent, false); + viewHolder = new ItemViewHolder(view); + } + return viewHolder; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + String item = flatMenu.get(position); + float scale = context.getResources().getDisplayMetrics().density; + switch (holder.getItemViewType()){ + case CATEGORY: + CategoryViewHolder viewHolder1 = (CategoryViewHolder) holder; + viewHolder1.categoryTv.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL)); + viewHolder1.categoryTv.setTextSize(16); + viewHolder1.categoryTv.setTextColor(ContextCompat.getColor(context, R.color.primary)); + viewHolder1.categoryTv.setPadding( + (int) (16 * scale + 0.5f), (int) (12 * scale + 0.5f), 0, + (int) (12 * scale + 0.5f)); + viewHolder1.categoryTv.setText(item); + break; + case ITEM: + ItemViewHolder viewHolder2 = (ItemViewHolder) holder; + viewHolder2.menuItemTv.setText(item); + viewHolder2.menuItemTv.setTextSize(14); + viewHolder2.menuItemTv.setTextColor(ContextCompat.getColor(context, R.color.primary)); + viewHolder2.menuItemTv.setPadding( + (int) (8 * scale + 0.5f), (int) (8 * scale + 0.5f), 0, + (int) (8 * scale + 0.5f)); + viewHolder2.starButton.setPadding((int) (16 * scale + 0.5f), (int) (8 * scale + 0.5f), 0, + (int) (8 * scale + 0.5f)); + viewHolder2.starButton.setOnClickListener(view -> { + if (viewHolder2.starButton.getDrawable().getConstantState() == context.getResources().getDrawable(R.drawable.ic_star_small).getConstantState()){ + viewHolder2.starButton.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.ic_star_filled)); + } else { + viewHolder2.starButton.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.ic_star_small)); + } + }); + break; + } + } + + @Override + public int getItemCount() { + return flatMenu.size(); + } + + @Override + public int getItemViewType(int position){ + String item = flatMenu.get(position); + if(menu.containsCategory(item)){ + return CATEGORY; + } + return ITEM; + } +} + +class CategoryViewHolder extends RecyclerView.ViewHolder{ + + TextView categoryTv; + + public CategoryViewHolder(@NonNull View itemView) { + super(itemView); + categoryTv = itemView.findViewById(R.id.category_title_tv); + } +} + +class ItemViewHolder extends RecyclerView.ViewHolder{ + + ImageButton starButton; + TextView menuItemTv; + + public ItemViewHolder(@NonNull View itemView){ + super(itemView); + starButton = itemView.findViewById(R.id.star_button); + menuItemTv = itemView.findViewById(R.id.menu_item_tv); + + } + +} + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/model/MealMenuModel.java b/app/src/main/java/com/cornellappdev/android/eatery/model/MealMenuModel.java index bbc21548..6d7e249e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/model/MealMenuModel.java +++ b/app/src/main/java/com/cornellappdev/android/eatery/model/MealMenuModel.java @@ -73,4 +73,8 @@ List getAllItems() { } return items; } + + public Map> getMenuLinkedHashMap(){ + return menu; + } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/util/Divider.java b/app/src/main/java/com/cornellappdev/android/eatery/util/Divider.java new file mode 100644 index 00000000..0e073df4 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/android/eatery/util/Divider.java @@ -0,0 +1,36 @@ +package com.cornellappdev.android.eatery.util; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.view.View; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; +import com.cornellappdev.android.eatery.R; + +public class Divider extends RecyclerView.ItemDecoration { + private Drawable mDivider; + + public Divider(Context context) { + mDivider = ContextCompat.getDrawable(context, R.drawable.divider_line); + } + + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + int left = parent.getPaddingLeft(); + int right = parent.getWidth() - parent.getPaddingRight(); + + int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = parent.getChildAt(i); + + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + + int top = child.getBottom() + params.bottomMargin; + int bottom = top + mDivider.getIntrinsicHeight(); + + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } +} diff --git a/app/src/main/res/drawable/divider_line.xml b/app/src/main/res/drawable/divider_line.xml new file mode 100644 index 00000000..1cf440d5 --- /dev/null +++ b/app/src/main/res/drawable/divider_line.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_star.xml b/app/src/main/res/drawable/ic_star.xml new file mode 100644 index 00000000..0202d43c --- /dev/null +++ b/app/src/main/res/drawable/ic_star.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_filled.xml b/app/src/main/res/drawable/ic_star_filled.xml new file mode 100644 index 00000000..f284e285 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_filled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_small.xml b/app/src/main/res/drawable/ic_star_small.xml new file mode 100644 index 00000000..fbc015a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_small.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/fragment_menu.xml b/app/src/main/res/layout/fragment_menu.xml index 0256ec98..0150ea18 100644 --- a/app/src/main/res/layout/fragment_menu.xml +++ b/app/src/main/res/layout/fragment_menu.xml @@ -7,4 +7,9 @@ android:paddingTop="16dp" tools:context="com.cornellappdev.android.eatery.MenuFragment"> + diff --git a/app/src/main/res/layout/menu_category_title_item.xml b/app/src/main/res/layout/menu_category_title_item.xml new file mode 100644 index 00000000..57166f62 --- /dev/null +++ b/app/src/main/res/layout/menu_category_title_item.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/menu_item.xml b/app/src/main/res/layout/menu_item.xml new file mode 100644 index 00000000..30807520 --- /dev/null +++ b/app/src/main/res/layout/menu_item.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file