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 fd80dee..79ce984 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 @@ -1,6 +1,8 @@ package de.sebse.fuplanner.fragments.moddetails; +import android.content.Context; import android.content.res.Resources; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,9 +19,12 @@ import de.sebse.fuplanner.services.KVV.types.EventList; import de.sebse.fuplanner.services.KVV.types.GroupedEvents; import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.tools.Triplet; +import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.ui.CustomViewHolder; +import de.sebse.fuplanner.tools.ui.ItemViewHolder; import de.sebse.fuplanner.tools.ui.ListViewHolder; +import de.sebse.fuplanner.tools.ui.StringViewHolder; class ModDetailEventAdapter extends RecyclerView.Adapter { private static final String VALUE_LECTURE = "Class section - Lecture"; @@ -33,9 +38,10 @@ class ModDetailEventAdapter extends RecyclerView.Adapter { private static final int TYPE_NONE = 0; private static final int TYPE_GROUPED = 1; private static final int TYPE_UNGROUPED = 2; + private static final int TYPE_HEADER = 3; private Modules.Module mValue; - private final ArrayList> mPositionalData; + private final ArrayList> mPositionalData; private final Logger log = new Logger(this); @@ -75,15 +81,36 @@ class ModDetailEventAdapter extends RecyclerView.Adapter { mPositionalData.clear(); for (Map.Entry value: listsGrouped.entrySet()) { - if (value.getValue().getGroups().size() > 0) - mPositionalData.add(new Triplet<>(TYPE_GROUPED, value.getKey(), value.getValue())); + if (value.getValue().getGroups().size() > 0) { + mPositionalData.add(new Pair<>(TYPE_HEADER, value.getKey())); + boolean showAsGrouped = true; + for (GroupedEvents.Group group : value.getValue().getGroups()) { + if (group.getSkippedDates().size() > 2) { + showAsGrouped = false; + break; + } + } + if (showAsGrouped) { + for (GroupedEvents.Group group : value.getValue().getGroups()) { + mPositionalData.add(new Pair<>(TYPE_GROUPED, group)); + } + } else { + for (Event event : value.getValue()) { + mPositionalData.add(new Pair<>(TYPE_UNGROUPED, event)); + } + } + } } for (Map.Entry value: listsUngrouped.entrySet()) { - if (value.getValue().size() > 0) - mPositionalData.add(new Triplet<>(TYPE_UNGROUPED, value.getKey(), value.getValue())); + if (value.getValue().size() > 0) { + mPositionalData.add(new Pair<>(TYPE_HEADER, value.getKey())); + for (Event event : value.getValue()) { + mPositionalData.add(new Pair<>(TYPE_UNGROUPED, event)); + } + } } if (mPositionalData.size() == 0) - mPositionalData.add(new Triplet<>(TYPE_NONE, null, null)); + mPositionalData.add(new Pair<>(TYPE_NONE, null)); this.notifyDataSetChanged(); } @@ -92,66 +119,95 @@ class ModDetailEventAdapter extends RecyclerView.Adapter { public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view; switch (viewType) { - case TYPE_NONE: + case TYPE_GROUPED: + case TYPE_UNGROUPED: + view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_all_items, parent, false); + return new ItemViewHolder(view); + case TYPE_HEADER: + view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.list_all_caption, parent, false); + return new StringViewHolder(view); + default: view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_all_no_items, parent, false); return new CustomViewHolder(view); - default: - view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.list_all_cardview_list, parent, false); - return new ListViewHolder(view); } } @Override public int getItemViewType(int position) { // Note that unlike in ListView adapters, types don't have to be contiguous - if (position < mPositionalData.size()) - return mPositionalData.get(position).first; - else return -1; + return mPositionalData.get(position).first; } @Override public void onBindViewHolder(@NonNull final CustomViewHolder holder, int position) { if (mValue == null || position > mPositionalData.size()) return; - Triplet data = mPositionalData.get(position); - if (data.first != TYPE_NONE) { - ListViewHolder h; - ModDetailEventAdapterInner adapter; - h = (ListViewHolder) holder; - Resources resources = h.mView.getResources(); - adapter = new ModDetailEventAdapterInner(); - String title; - switch (data.second) { - case VALUE_LECTURE: + Pair data = mPositionalData.get(position); + Resources resources = holder.mView.getResources(); + Context context = holder.mView.getContext(); + switch (data.first) { + case TYPE_HEADER: + StringViewHolder s = (StringViewHolder) holder; + String title = ""; + if (VALUE_LECTURE.equals(data.second)) { title = resources.getString(R.string.lecture); - break; - case VALUE_TUTORIAL: + + } else if (VALUE_TUTORIAL.equals(data.second)) { title = resources.getString(R.string.tutorial); - break; - case VALUE_EXAM: + + } else if (VALUE_EXAM.equals(data.second)) { title = resources.getString(R.string.exam); - break; - case VALUE_DEADLINE: + + } else if (VALUE_DEADLINE.equals(data.second)) { title = resources.getString(R.string.deadline); - break; - case VALUE_OTHER: + + } else if (VALUE_OTHER.equals(data.second)) { title = resources.getString(R.string.others); - break; - default: - title = data.second; - } - h.mString.setText(title); - switch (data.first) { - case TYPE_GROUPED: - adapter.setData((GroupedEvents) data.third, h.mView.getContext()); - break; - case TYPE_UNGROUPED: - adapter.setData((EventList) data.third, h.mView.getContext()); - break; - } - h.mList.setAdapter(adapter); + } + s.mString.setText(title); + return; + case TYPE_GROUPED: + ItemViewHolder ig = (ItemViewHolder) holder; + GroupedEvents.Group group = ((GroupedEvents.Group) data.second); + long firstDateTime = group.getFirstDate()+group.getStartTime(); + long lastDateTime = group.getLastDate()+group.getStartTime()+group.getDuration(); + String start, end, weekday, startTime, endTime; + StringBuilder excepts = null; + start = UtilsDate.getModifiedDate(firstDateTime); + end = UtilsDate.getModifiedDate(lastDateTime); + weekday = UtilsDate.getModifiedDate(context, firstDateTime, "E"); + startTime = UtilsDate.getModifiedTime(context, firstDateTime); + endTime = UtilsDate.getModifiedTime(context, lastDateTime); + for (long skippedDate : group.getSkippedDates()) { + if (excepts == null) { + excepts = new StringBuilder(UtilsDate.getModifiedDate(skippedDate)); + } else { + excepts.append(", ").append(UtilsDate.getModifiedDate(skippedDate)); + } + } + ig.mTitle.setText(context.getString(R.string.event_scale, weekday, startTime, endTime)); + ig.mSubLeft.setText(context.getString(R.string.date_scale, start, end)); + ig.mSubRight.setText(excepts != null ? context.getString(R.string.except_list, excepts.toString()) : ""); + return; + case TYPE_UNGROUPED: + ItemViewHolder iu = (ItemViewHolder) holder; + Event event = (Event) data.second; + String date; + if (UtilsDate.dateEquals(event.getStartDate(), System.currentTimeMillis())) + start = UtilsDate.getModifiedTime(context, event.getStartDate()); + else + start = UtilsDate.getModifiedDateTime(context, event.getStartDate()); + if (UtilsDate.dateEquals(event.getStartDate(), event.getEndDate())) + end = UtilsDate.getModifiedTime(context, event.getEndDate()); + else + end = UtilsDate.getModifiedDateTime(context, event.getEndDate()); + date = context.getString(R.string.date_scale, start, end); + iu.mTitle.setText(event.getTitle()); + iu.mSubLeft.setText(date); + iu.mSubRight.setText(""); } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapterInner.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapterInner.java deleted file mode 100644 index 2ff1e72..0000000 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventAdapterInner.java +++ /dev/null @@ -1,104 +0,0 @@ -package de.sebse.fuplanner.fragments.moddetails; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import java.util.ArrayList; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; -import de.sebse.fuplanner.R; -import de.sebse.fuplanner.services.KVV.types.Event; -import de.sebse.fuplanner.services.KVV.types.EventList; -import de.sebse.fuplanner.services.KVV.types.GroupedEvents; -import de.sebse.fuplanner.tools.UtilsDate; -import de.sebse.fuplanner.tools.ui.ItemViewHolder; - -class ModDetailEventAdapterInner extends RecyclerView.Adapter { - private final ArrayList mPositionalData; - - ModDetailEventAdapterInner() { - mPositionalData = new ArrayList<>(); - } - - public void setData(GroupedEvents events, final Context context) { - mPositionalData.clear(); - for (GroupedEvents.Group group : events.getGroups()) { - long firstDateTime = group.getFirstDate()+group.getStartTime(); - long lastDateTime = group.getLastDate()+group.getStartTime()+group.getDuration(); - String start, end, weekday, startTime, endTime; - StringBuilder excepts = null; - start = UtilsDate.getModifiedDate(firstDateTime); - end = UtilsDate.getModifiedDate(lastDateTime); - weekday = UtilsDate.getModifiedDate(context, firstDateTime, "E"); - startTime = UtilsDate.getModifiedTime(context, firstDateTime); - endTime = UtilsDate.getModifiedTime(context, lastDateTime); - for (long skippedDate : group.getSkippedDates()) { - if (excepts == null) { - excepts = new StringBuilder(UtilsDate.getModifiedDate(skippedDate)); - } else { - excepts.append(", ").append(UtilsDate.getModifiedDate(skippedDate)); - } - } - mPositionalData.add(new Entry( - context.getString(R.string.event_scale, weekday, startTime, endTime), - context.getString(R.string.date_scale, start, end), - excepts != null ? context.getString(R.string.except_list, excepts.toString()) : "")); - } - this.notifyDataSetChanged(); - } - - public void setData(EventList events, final Context context) { - mPositionalData.clear(); - for (Event event : events) { - String date; - String start, end; - if (UtilsDate.dateEquals(event.getStartDate(), System.currentTimeMillis())) - start = UtilsDate.getModifiedTime(context, event.getStartDate()); - else - start = UtilsDate.getModifiedDateTime(context, event.getStartDate()); - if (UtilsDate.dateEquals(event.getStartDate(), event.getEndDate())) - end = UtilsDate.getModifiedTime(context, event.getEndDate()); - else - end = UtilsDate.getModifiedDateTime(context, event.getEndDate()); - date = context.getString(R.string.date_scale, start, end); - mPositionalData.add(new Entry(event.getTitle(), date, "")); - } - this.notifyDataSetChanged(); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view; - view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.list_all_items, parent, false); - return new ItemViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull final ItemViewHolder holder, int position) { - holder.mTitle.setText(mPositionalData.get(position).title); - holder.mSubLeft.setText(mPositionalData.get(position).subtitleLeft); - holder.mSubRight.setText(mPositionalData.get(position).subtitleRight); - } - - @Override - public int getItemCount() { - return mPositionalData.size(); - } - - private class Entry { - private String title; - private String subtitleLeft; - private String subtitleRight; - - private Entry(String title, String subtitleLeft, String subtitleRight) { - this.title = title; - this.subtitleLeft = subtitleLeft; - this.subtitleRight = subtitleRight; - } - } -} diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java index 8b14a70..32f9b39 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java @@ -214,7 +214,7 @@ class ModDetailOverviewAdapter extends RecyclerView.Adapter arrayList = new ArrayList<>(); - private Logger log = new Logger(this); + private int skippedDayCount = 0; - public void add(Event event) { + public boolean add(Event event) { + boolean result = super.add(event); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(event.getStartDate()); long dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); for (Group group : arrayList) { if (group.add(event)) { - return; + return result; } } arrayList.add(new Group(event)); + return result; } public List getGroups() { return Collections.unmodifiableList(arrayList); } + public int getSkippedDayCount() { + return skippedDayCount; + } + public class Group { private long firstDate; private long lastDate; @@ -73,16 +79,19 @@ public class GroupedEvents { firstDate = addDays(firstDate, -7); while (firstDate > date) { skippedDates.add(firstDate); + skippedDayCount += 1; firstDate = addDays(firstDate, -7); } } else if (date > lastDate) { lastDate = addDays(lastDate, 7); while (lastDate < date) { skippedDates.add(lastDate); + skippedDayCount += 1; lastDate = addDays(lastDate, 7); } } else { skippedDates.remove(date); + skippedDayCount -= 1; } return true; }