Event List Design updated
This commit is contained in:
@@ -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;
|
|
||||||
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);
|
|
||||||
switch (data.first) {
|
switch (data.first) {
|
||||||
case TYPE_GROUPED:
|
case TYPE_HEADER:
|
||||||
adapter.setData((GroupedEvents) data.third, h.mView.getContext());
|
StringViewHolder s = (StringViewHolder) holder;
|
||||||
break;
|
String title = "";
|
||||||
case TYPE_UNGROUPED:
|
if (VALUE_LECTURE.equals(data.second)) {
|
||||||
adapter.setData((EventList) data.third, h.mView.getContext());
|
title = resources.getString(R.string.lecture);
|
||||||
break;
|
|
||||||
|
} 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("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user