Event List Design updated

This commit is contained in:
Caesar2011
2018-11-15 18:06:56 +01:00
parent 547a62d07b
commit 5ba6c899be
4 changed files with 116 additions and 155 deletions

View File

@@ -1,6 +1,8 @@
package de.sebse.fuplanner.fragments.moddetails; package de.sebse.fuplanner.fragments.moddetails;
import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.util.Pair;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; 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.GroupedEvents;
import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.services.KVV.types.Modules;
import de.sebse.fuplanner.tools.Triplet; import de.sebse.fuplanner.tools.Triplet;
import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
import de.sebse.fuplanner.tools.ui.CustomViewHolder; 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.ListViewHolder;
import de.sebse.fuplanner.tools.ui.StringViewHolder;
class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> { class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
private static final String VALUE_LECTURE = "Class section - Lecture"; private static final String VALUE_LECTURE = "Class section - Lecture";
@@ -33,9 +38,10 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
private static final int TYPE_NONE = 0; private static final int TYPE_NONE = 0;
private static final int TYPE_GROUPED = 1; private static final int TYPE_GROUPED = 1;
private static final int TYPE_UNGROUPED = 2; private static final int TYPE_UNGROUPED = 2;
private static final int TYPE_HEADER = 3;
private Modules.Module mValue; private Modules.Module mValue;
private final ArrayList<Triplet<Integer, String, Object>> mPositionalData; private final ArrayList<Pair<Integer, Object>> mPositionalData;
private final Logger log = new Logger(this); private final Logger log = new Logger(this);
@@ -75,15 +81,36 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
mPositionalData.clear(); mPositionalData.clear();
for (Map.Entry<String, GroupedEvents> value: listsGrouped.entrySet()) { for (Map.Entry<String, GroupedEvents> value: listsGrouped.entrySet()) {
if (value.getValue().getGroups().size() > 0) if (value.getValue().getGroups().size() > 0) {
mPositionalData.add(new Triplet<>(TYPE_GROUPED, value.getKey(), value.getValue())); 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<String, EventList> value: listsUngrouped.entrySet()) { for (Map.Entry<String, EventList> value: listsUngrouped.entrySet()) {
if (value.getValue().size() > 0) if (value.getValue().size() > 0) {
mPositionalData.add(new Triplet<>(TYPE_UNGROUPED, value.getKey(), value.getValue())); mPositionalData.add(new Pair<>(TYPE_HEADER, value.getKey()));
for (Event event : value.getValue()) {
mPositionalData.add(new Pair<>(TYPE_UNGROUPED, event));
}
}
} }
if (mPositionalData.size() == 0) if (mPositionalData.size() == 0)
mPositionalData.add(new Triplet<>(TYPE_NONE, null, null)); mPositionalData.add(new Pair<>(TYPE_NONE, null));
this.notifyDataSetChanged(); this.notifyDataSetChanged();
} }
@@ -92,66 +119,95 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view; View view;
switch (viewType) { 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()) view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_all_no_items, parent, false); .inflate(R.layout.list_all_no_items, parent, false);
return new CustomViewHolder(view); return new CustomViewHolder(view);
default:
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_all_cardview_list, parent, false);
return new ListViewHolder(view);
} }
} }
@Override @Override
public int getItemViewType(int position) { public int getItemViewType(int position) {
// Note that unlike in ListView adapters, types don't have to be contiguous // Note that unlike in ListView adapters, types don't have to be contiguous
if (position < mPositionalData.size()) return mPositionalData.get(position).first;
return mPositionalData.get(position).first;
else return -1;
} }
@Override @Override
public void onBindViewHolder(@NonNull final CustomViewHolder holder, int position) { public void onBindViewHolder(@NonNull final CustomViewHolder holder, int position) {
if (mValue == null || position > mPositionalData.size()) if (mValue == null || position > mPositionalData.size())
return; return;
Triplet<Integer, String, Object> data = mPositionalData.get(position); Pair<Integer, Object> data = mPositionalData.get(position);
if (data.first != TYPE_NONE) { Resources resources = holder.mView.getResources();
ListViewHolder h; Context context = holder.mView.getContext();
ModDetailEventAdapterInner adapter; switch (data.first) {
h = (ListViewHolder) holder; case TYPE_HEADER:
Resources resources = h.mView.getResources(); StringViewHolder s = (StringViewHolder) holder;
adapter = new ModDetailEventAdapterInner(); String title = "";
String title; if (VALUE_LECTURE.equals(data.second)) {
switch (data.second) {
case VALUE_LECTURE:
title = resources.getString(R.string.lecture); title = resources.getString(R.string.lecture);
break;
case VALUE_TUTORIAL: } else if (VALUE_TUTORIAL.equals(data.second)) {
title = resources.getString(R.string.tutorial); title = resources.getString(R.string.tutorial);
break;
case VALUE_EXAM: } else if (VALUE_EXAM.equals(data.second)) {
title = resources.getString(R.string.exam); title = resources.getString(R.string.exam);
break;
case VALUE_DEADLINE: } else if (VALUE_DEADLINE.equals(data.second)) {
title = resources.getString(R.string.deadline); title = resources.getString(R.string.deadline);
break;
case VALUE_OTHER: } else if (VALUE_OTHER.equals(data.second)) {
title = resources.getString(R.string.others); title = resources.getString(R.string.others);
break; }
default: s.mString.setText(title);
title = data.second; return;
} case TYPE_GROUPED:
h.mString.setText(title); ItemViewHolder ig = (ItemViewHolder) holder;
switch (data.first) { GroupedEvents.Group group = ((GroupedEvents.Group) data.second);
case TYPE_GROUPED: long firstDateTime = group.getFirstDate()+group.getStartTime();
adapter.setData((GroupedEvents) data.third, h.mView.getContext()); long lastDateTime = group.getLastDate()+group.getStartTime()+group.getDuration();
break; String start, end, weekday, startTime, endTime;
case TYPE_UNGROUPED: StringBuilder excepts = null;
adapter.setData((EventList) data.third, h.mView.getContext()); start = UtilsDate.getModifiedDate(firstDateTime);
break; end = UtilsDate.getModifiedDate(lastDateTime);
} weekday = UtilsDate.getModifiedDate(context, firstDateTime, "E");
h.mList.setAdapter(adapter); 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("");
} }
} }

View File

@@ -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<ItemViewHolder> {
private final ArrayList<Entry> 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;
}
}
}

View File

@@ -214,7 +214,7 @@ class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
emailIntent.setData(Uri.parse("mailto:"+lecturer.getMail())); emailIntent.setData(Uri.parse("mailto:"+lecturer.getMail()));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, mValue.title); emailIntent.putExtra(Intent.EXTRA_SUBJECT, mValue.title);
emailIntent.putExtra(Intent.EXTRA_TEXT, defaultText); emailIntent.putExtra(Intent.EXTRA_TEXT, defaultText);
m.mView.getContext().startActivity(Intent.createChooser(emailIntent, mValue.title)); m.mView.getContext().startActivity(emailIntent);
}); });
break; break;
} }

View File

@@ -11,26 +11,32 @@ import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
public class GroupedEvents { public class GroupedEvents extends EventList {
private ArrayList<Group> arrayList = new ArrayList<>(); private ArrayList<Group> 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 calendar = Calendar.getInstance();
calendar.setTimeInMillis(event.getStartDate()); calendar.setTimeInMillis(event.getStartDate());
long dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); long dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
for (Group group : arrayList) { for (Group group : arrayList) {
if (group.add(event)) { if (group.add(event)) {
return; return result;
} }
} }
arrayList.add(new Group(event)); arrayList.add(new Group(event));
return result;
} }
public List<Group> getGroups() { public List<Group> getGroups() {
return Collections.unmodifiableList(arrayList); return Collections.unmodifiableList(arrayList);
} }
public int getSkippedDayCount() {
return skippedDayCount;
}
public class Group { public class Group {
private long firstDate; private long firstDate;
private long lastDate; private long lastDate;
@@ -73,16 +79,19 @@ public class GroupedEvents {
firstDate = addDays(firstDate, -7); firstDate = addDays(firstDate, -7);
while (firstDate > date) { while (firstDate > date) {
skippedDates.add(firstDate); skippedDates.add(firstDate);
skippedDayCount += 1;
firstDate = addDays(firstDate, -7); firstDate = addDays(firstDate, -7);
} }
} else if (date > lastDate) { } else if (date > lastDate) {
lastDate = addDays(lastDate, 7); lastDate = addDays(lastDate, 7);
while (lastDate < date) { while (lastDate < date) {
skippedDates.add(lastDate); skippedDates.add(lastDate);
skippedDayCount += 1;
lastDate = addDays(lastDate, 7); lastDate = addDays(lastDate, 7);
} }
} else { } else {
skippedDates.remove(date); skippedDates.remove(date);
skippedDayCount -= 1;
} }
return true; return true;
} }