From 22101387851a424c48c5896bb545df933fe78960 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Wed, 15 Aug 2018 01:36:49 +0200 Subject: [PATCH] Bug fixing and Canteen grouping --- .../fragments/canteen/MealAdapter.java | 157 ++++++++++++------ .../moddetails/ModDetailEventAdapter.java | 32 +--- .../moddetails/ModDetailGradebookAdapter.java | 21 +-- .../moddetails/ModDetailOverviewAdapter.java | 25 +-- .../fuplanner/services/KVV/KVVModuleList.java | 9 +- .../sebse/fuplanner/tools/DateSortedList.java | 4 +- app/src/main/res/layout/list_all_caption.xml | 2 +- .../main/res/layout/list_canteen_items.xml | 2 +- app/src/main/res/values/strings.xml | 8 + 9 files changed, 142 insertions(+), 118 deletions(-) diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java index 587a26e..47ab166 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/MealAdapter.java @@ -2,24 +2,35 @@ package de.sebse.fuplanner.fragments.canteen; import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.StringRes; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.Canteen.types.Day; import de.sebse.fuplanner.services.Canteen.types.Meal; import de.sebse.fuplanner.tools.Preferences; -import de.sebse.fuplanner.tools.ui.ItemViewHolder; +import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.ui.MealViewHolder; +import de.sebse.fuplanner.tools.ui.StringViewHolder; -class MealAdapter extends RecyclerView.Adapter { +class MealAdapter extends RecyclerView.Adapter { + private String[] CATEGORY_KEYS = new String[]{"Essen", "Aktionen", "Beilagen", "Desserts", "Salate", "Suppen", "Vorspeisen"}; + @StringRes + private int[] CATEGORY_VALS = new int[]{R.string.meals, R.string.special_meals, R.string.side_dishes, R.string.desserts, R.string.salats, R.string.soups, R.string.starters}; + @StringRes + private int CATEGORY_OTHER = R.string.others; + private ArrayList matchings = new ArrayList<>(); private Day mDay = null; private final Context mContext; + private Logger log = new Logger(this); public MealAdapter(Context context) { mContext = context; @@ -27,61 +38,81 @@ class MealAdapter extends RecyclerView.Adapter { @NonNull @Override - public MealViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { - View view = LayoutInflater.from(viewGroup.getContext()) - .inflate(R.layout.list_canteen_items, viewGroup, false); - return new MealViewHolder(view); + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + if (viewType == 0) { + View view = LayoutInflater.from(viewGroup.getContext()) + .inflate(R.layout.list_canteen_items, viewGroup, false); + return new MealViewHolder(view); + } else { + View view = LayoutInflater.from(viewGroup.getContext()) + .inflate(R.layout.list_all_caption, viewGroup, false); + return new StringViewHolder(view); + } } @Override - public void onBindViewHolder(@NonNull MealViewHolder viewHolder, int i) { - viewHolder.reset(); - Meal meal = getItem(i); - viewHolder.mTitle.setText(meal.getName()); - String value; - switch (Preferences.getString(mContext, R.array.pref_price_group)) { - case "student": - value = mContext.getString(R.string.price, meal.getPriceStdnt()); - break; - case "employee": - value = mContext.getString(R.string.price, meal.getPriceEmply()); - break; - case "other": - value = mContext.getString(R.string.price, meal.getPriceOther()); - break; - default: - value = mContext.getString(R.string.prices, meal.getPriceStdnt(), meal.getPriceEmply(), meal.getPriceOther()); + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + log.d(position, holder.getItemViewType(), getItemViewType(position)); + if (holder.getItemViewType() == 0) { + MealViewHolder viewHolder = ((MealViewHolder) holder); + viewHolder.reset(); + Meal meal = getMeal(position); + viewHolder.mTitle.setText(meal.getName()); + String value; + switch (Preferences.getString(mContext, R.array.pref_price_group)) { + case "student": + value = mContext.getString(R.string.price, meal.getPriceStdnt()); + break; + case "employee": + value = mContext.getString(R.string.price, meal.getPriceEmply()); + break; + case "other": + value = mContext.getString(R.string.price, meal.getPriceOther()); + break; + default: + value = mContext.getString(R.string.prices, meal.getPriceStdnt(), meal.getPriceEmply(), meal.getPriceOther()); + } + viewHolder.mSubTitle.setText(value); + StringBuilder string = new StringBuilder(); + List notes = meal.getNotes(); + for (int i1 = 0, notesSize = notes.size(); i1 < notesSize; i1++) { + if (i1 != 0) + string.append("\n"); + String s = notes.get(i1); + string.append(" - ").append(s); + } + viewHolder.mNotes.setText(string.toString()); + viewHolder.mCategory.setText(meal.getCategory()); + viewHolder.mIconVegan.setVisibility(meal.getVegan() == Meal.VEGAN_VEGAN ? View.VISIBLE : View.GONE); + viewHolder.mIconVegetarian.setVisibility(meal.getVegan() == Meal.VEGAN_VEGETERIAN ? View.VISIBLE : View.GONE); + viewHolder.mIconBio.setVisibility((meal.getCertificates() & Meal.CERT_BIO) != 0 ? View.VISIBLE : View.GONE); + viewHolder.mIconMsc.setVisibility((meal.getCertificates() & Meal.CERT_MSC) != 0 ? View.VISIBLE : View.GONE); + } else { + log.d(holder); + StringViewHolder viewHolder = ((StringViewHolder) holder); + viewHolder.mString.setText(getHeading(position)); } - viewHolder.mSubTitle.setText(value); - StringBuilder string = new StringBuilder(); - List notes = meal.getNotes(); - for (int i1 = 0, notesSize = notes.size(); i1 < notesSize; i1++) { - if (i1 != 0) - string.append("\n"); - String s = notes.get(i1); - string.append(" - ").append(s); - } - viewHolder.mNotes.setText(string.toString()); - viewHolder.mCategory.setText(meal.getCategory()); - viewHolder.mIconVegan.setVisibility(meal.getVegan() == Meal.VEGAN_VEGAN ? View.VISIBLE : View.GONE); - viewHolder.mIconVegetarian.setVisibility(meal.getVegan() == Meal.VEGAN_VEGETERIAN ? View.VISIBLE : View.GONE); - viewHolder.mIconBio.setVisibility((meal.getCertificates() & Meal.CERT_BIO) != 0 ? View.VISIBLE : View.GONE); - viewHolder.mIconMsc.setVisibility((meal.getCertificates() & Meal.CERT_MSC) != 0 ? View.VISIBLE : View.GONE); - } - - public Meal getItem(int groupPosition) { - if (this.mDay != null) - return this.mDay.get(groupPosition); - else - return null; } @Override public int getItemCount() { + return matchings.size(); + } + + @Override + public int getItemViewType(int position) { + return matchings.get(position) instanceof String ? 1 : 0; + } + + public Meal getMeal(int position) { if (this.mDay != null) - return this.mDay.size(); + return this.mDay.get((Integer) matchings.get(position)); else - return 0; + return null; + } + + public String getHeading(int position) { + return (String) matchings.get(position); } public void setDay(Day day) { @@ -90,6 +121,38 @@ class MealAdapter extends RecyclerView.Adapter { } public void setDay() { + HashMap> map = new HashMap<>(); + for (int i = 0; i < this.mDay.size(); i++) { + String category = this.mDay.get(i).getCategory(); + boolean found = false; + for (String category_key : CATEGORY_KEYS) { + if (category_key.equals(category)) { + found = true; + break; + } + } + if (!found) category = "---"; + ArrayList list = map.get(category); + if (list == null) { + list = new ArrayList<>(); + map.put(category, list); + } + list.add(i); + } + matchings.clear(); + for (int i = 0; i < CATEGORY_KEYS.length; i++) { + ArrayList list = map.get(CATEGORY_KEYS[i]); + if (list != null) { + matchings.add(mContext.getString(CATEGORY_VALS[i])); + matchings.addAll(list); + } + } + ArrayList list = map.get("---"); + if (list != null) { + matchings.add(mContext.getString(CATEGORY_OTHER)); + matchings.addAll(list); + } + Logger.n(this).d(matchings, map); this.notifyDataSetChanged(); } } \ No newline at end of file diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java index 63f92bd..7b86900 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapter.java @@ -16,6 +16,7 @@ import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.ui.CustomViewHolder; import de.sebse.fuplanner.tools.ui.ItemViewHolder; +import de.sebse.fuplanner.tools.ui.StringViewHolder; class ModDetailEventAdapter extends RecyclerView.Adapter { private static final int TYPE_HEADER = 0; @@ -61,7 +62,7 @@ class ModDetailEventAdapter extends RecyclerView.Adapter data = mPositionalData.get(position); switch (data.first) { case TYPE_HEADER: - HeaderViewHolder h = (HeaderViewHolder) holder; + StringViewHolder h = (StringViewHolder) holder; switch (data.second) { case SECTION_PAST: - h.mCaption.setText(R.string.past_events); + h.mString.setText(R.string.past_events); break; case SECTION_UPCOMING: - h.mCaption.setText(R.string.upcoming_events); + h.mString.setText(R.string.upcoming_events); break; } break; @@ -145,27 +146,4 @@ class ModDetailEventAdapter extends RecyclerView.Adapter { private static final int TYPE_TOTAL = 0; @@ -58,7 +59,7 @@ class ModDetailGradebookAdapter extends RecyclerView.Adapter data = mPositionalData.get(position); switch (data.first) { case TYPE_TOTAL: - HeaderViewHolder h = (HeaderViewHolder) holder; - h.mCaption.setText(h.mView.getResources().getString(R.string.current_percentage, mValue.getGradebookPercent()*100)); + StringViewHolder h = (StringViewHolder) holder; + h.mString.setText(h.mView.getResources().getString(R.string.current_percentage, mValue.getGradebookPercent()*100)); break; case TYPE_GRADE: int index = data.second / 1024; @@ -118,20 +119,6 @@ class ModDetailGradebookAdapter extends RecyclerView.Adapter { private static final int MAX_ITEMS_PER_PREVIEW = 2; @@ -77,7 +78,7 @@ class ModDetailOverviewAdapter extends RecyclerView.Adapter data = mPositionalData.get(position); switch (data.first) { case TYPE_HEADER: - HeaderViewHolder h = (HeaderViewHolder) holder; + StringViewHolder h = (StringViewHolder) holder; switch ((Integer) data.second) { case ModulePart.DESCRIPTION: - h.mCaption.setText(R.string.description); + h.mString.setText(R.string.description); break; case ModulePart.ANNOUNCEMENT: - h.mCaption.setText(h.mView.getResources().getString(R.string.announcements_count, getAnnounceCount())); + h.mString.setText(h.mView.getResources().getString(R.string.announcements_count, getAnnounceCount())); break; case ModulePart.ASSIGNMENT: - h.mCaption.setText(h.mView.getResources().getString(R.string.assignments_count, getAssignmentCount())); + h.mString.setText(h.mView.getResources().getString(R.string.assignments_count, getAssignmentCount())); break; case ModulePart.EVENT: - h.mCaption.setText(h.mView.getResources().getString(R.string.upcoming_events_count, getEventsCount())); + h.mString.setText(h.mView.getResources().getString(R.string.upcoming_events_count, getEventsCount())); break; } break; @@ -221,19 +222,7 @@ class ModDetailOverviewAdapter extends RecyclerView.Adapter extends ArrayList { @Override public T get(int index) { - if (split < 0) - sort(); + //if (split < 0) + // sort(); if (reversed()) index = size() - index - 1; return super.get(index); diff --git a/app/src/main/res/layout/list_all_caption.xml b/app/src/main/res/layout/list_all_caption.xml index fdc55a7..fca7b8c 100644 --- a/app/src/main/res/layout/list_all_caption.xml +++ b/app/src/main/res/layout/list_all_caption.xml @@ -6,7 +6,7 @@ android:orientation="horizontal"> + app:startExpanded="false" />