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;
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<CustomViewHolder> {
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_GROUPED = 1;
private static final int TYPE_UNGROUPED = 2;
private static final int TYPE_HEADER = 3;
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);
@@ -75,15 +81,36 @@ class ModDetailEventAdapter extends RecyclerView.Adapter<CustomViewHolder> {
mPositionalData.clear();
for (Map.Entry<String, GroupedEvents> 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<String, EventList> 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<CustomViewHolder> {
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;
}
@Override
public void onBindViewHolder(@NonNull final CustomViewHolder holder, int position) {
if (mValue == null || position > mPositionalData.size())
return;
Triplet<Integer, String, Object> 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:
title = resources.getString(R.string.lecture);
break;
case VALUE_TUTORIAL:
title = resources.getString(R.string.tutorial);
break;
case VALUE_EXAM:
title = resources.getString(R.string.exam);
break;
case VALUE_DEADLINE:
title = resources.getString(R.string.deadline);
break;
case VALUE_OTHER:
title = resources.getString(R.string.others);
break;
default:
title = data.second;
}
h.mString.setText(title);
Pair<Integer, Object> data = mPositionalData.get(position);
Resources resources = holder.mView.getResources();
Context context = holder.mView.getContext();
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;
case TYPE_HEADER:
StringViewHolder s = (StringViewHolder) holder;
String title = "";
if (VALUE_LECTURE.equals(data.second)) {
title = resources.getString(R.string.lecture);
} else if (VALUE_TUTORIAL.equals(data.second)) {
title = resources.getString(R.string.tutorial);
} else if (VALUE_EXAM.equals(data.second)) {
title = resources.getString(R.string.exam);
} else if (VALUE_DEADLINE.equals(data.second)) {
title = resources.getString(R.string.deadline);
} else if (VALUE_OTHER.equals(data.second)) {
title = resources.getString(R.string.others);
}
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("");
}
}

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.putExtra(Intent.EXTRA_SUBJECT, mValue.title);
emailIntent.putExtra(Intent.EXTRA_TEXT, defaultText);
m.mView.getContext().startActivity(Intent.createChooser(emailIntent, mValue.title));
m.mView.getContext().startActivity(emailIntent);
});
break;
}

View File

@@ -11,26 +11,32 @@ import java.util.List;
import androidx.annotation.NonNull;
import de.sebse.fuplanner.tools.logging.Logger;
public class GroupedEvents {
public class GroupedEvents extends EventList {
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.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<Group> 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;
}