Merge remote-tracking branch 'origin/master'
# Conflicts: # app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java # app/src/main/java/de/sebse/fuplanner/services/KVV/Assignment.java
This commit is contained in:
@@ -142,7 +142,7 @@ public class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.
|
|||||||
Announcement announce = mValue.announcements.get(index);
|
Announcement announce = mValue.announcements.get(index);
|
||||||
i.mTitle.setText(announce.getTitle());
|
i.mTitle.setText(announce.getTitle());
|
||||||
i.mSubLeft.setText(announce.getCreatedBy());
|
i.mSubLeft.setText(announce.getCreatedBy());
|
||||||
i.mSubRight.setText(Conversion.getModifiedDate(announce.getCreatedOn()));
|
i.mSubRight.setText(Conversion.getModifiedDateTime(announce.getCreatedOn()));
|
||||||
i.mView.setOnClickListener(view -> log.d("Reference to:", SECTION_ANNOUNCEMENT, index));
|
i.mView.setOnClickListener(view -> log.d("Reference to:", SECTION_ANNOUNCEMENT, index));
|
||||||
break;
|
break;
|
||||||
case SECTION_ASSIGNMENT:
|
case SECTION_ASSIGNMENT:
|
||||||
@@ -152,16 +152,24 @@ public class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.
|
|||||||
i.mSubLeft.setText(i.mView.getResources().getText(R.string.open));
|
i.mSubLeft.setText(i.mView.getResources().getText(R.string.open));
|
||||||
else
|
else
|
||||||
i.mSubLeft.setText(i.mView.getResources().getText(R.string.close));
|
i.mSubLeft.setText(i.mView.getResources().getText(R.string.close));
|
||||||
i.mSubRight.setText(Conversion.getModifiedDate(assignment.getDueDate()));
|
i.mSubRight.setText(Conversion.getModifiedDateTime(assignment.getDueDate()));
|
||||||
i.mView.setOnClickListener(view -> log.d("Reference to:", SECTION_ASSIGNMENT, index));
|
i.mView.setOnClickListener(view -> log.d("Reference to:", SECTION_ASSIGNMENT, index));
|
||||||
break;
|
break;
|
||||||
case SECTION_EVENTS:
|
case SECTION_EVENTS:
|
||||||
Event event = mValue.events.get(index);
|
Event event = mValue.events.getUpcoming(index);
|
||||||
i.mTitle.setText(event.getTitle());
|
i.mTitle.setText(event.getTitle());
|
||||||
i.mSubLeft.setText(event.getType());
|
i.mSubLeft.setText(event.getType());
|
||||||
|
String start, end;
|
||||||
|
if (Conversion.dateEquals(event.getStartDate(), System.currentTimeMillis()))
|
||||||
|
start = Conversion.getModifiedTime(event.getStartDate());
|
||||||
|
else
|
||||||
|
start = Conversion.getModifiedDateTime(event.getStartDate());
|
||||||
|
if (Conversion.dateEquals(event.getStartDate(), event.getEndDate()))
|
||||||
|
end = Conversion.getModifiedTime(event.getEndDate());
|
||||||
|
else
|
||||||
|
end = Conversion.getModifiedDateTime(event.getEndDate());
|
||||||
i.mSubRight.setText(i.mView.getResources().getString(R.string.date_scale,
|
i.mSubRight.setText(i.mView.getResources().getString(R.string.date_scale,
|
||||||
Conversion.getModifiedDate(event.getStartDate()),
|
start, end
|
||||||
Conversion.getModifiedDate(event.getEndDate())
|
|
||||||
));
|
));
|
||||||
i.mView.setOnClickListener(view -> log.d("Reference to:", SECTION_EVENTS, index));
|
i.mView.setOnClickListener(view -> log.d("Reference to:", SECTION_EVENTS, index));
|
||||||
}
|
}
|
||||||
@@ -190,7 +198,7 @@ public class ModDetailOverviewAdapter extends RecyclerView.Adapter<RecyclerView.
|
|||||||
|
|
||||||
private int getEventsCount() {
|
private int getEventsCount() {
|
||||||
if (mValue.events != null)
|
if (mValue.events != null)
|
||||||
return mValue.events.size();
|
return mValue.events.sizeUpcoming();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,14 @@ import org.json.JSONException;
|
|||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.regex.MatchResult;
|
import java.util.regex.MatchResult;
|
||||||
|
|
||||||
import de.sebse.fuplanner.tools.AsyncQueue;
|
import de.sebse.fuplanner.tools.AsyncQueue;
|
||||||
|
import de.sebse.fuplanner.tools.EventList;
|
||||||
import de.sebse.fuplanner.tools.Regex;
|
import de.sebse.fuplanner.tools.Regex;
|
||||||
import de.sebse.fuplanner.tools.network.HTTPService;
|
import de.sebse.fuplanner.tools.network.HTTPService;
|
||||||
import de.sebse.fuplanner.tools.network.NetworkCallback;
|
import de.sebse.fuplanner.tools.network.NetworkCallback;
|
||||||
@@ -251,7 +254,7 @@ public class KVVModuleList extends HTTPService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getEventsUpgrade(String ID, final NetworkCallback<ArrayList<Event>> callback, final NetworkErrorCallback errorCallback) {
|
private void getEventsUpgrade(String ID, final NetworkCallback<EventList> callback, final NetworkErrorCallback errorCallback) {
|
||||||
//https://kvv.imp.fu-berlin.de/direct/calendar/site/91c6e9cc-58eb-486d-ab99-a22a40997d1b.json
|
//https://kvv.imp.fu-berlin.de/direct/calendar/site/91c6e9cc-58eb-486d-ab99-a22a40997d1b.json
|
||||||
get(String.format("https://kvv.imp.fu-berlin.de/direct/calendar/site/%s.json", ID), token.getCookies(), response -> {
|
get(String.format("https://kvv.imp.fu-berlin.de/direct/calendar/site/%s.json", ID), token.getCookies(), response -> {
|
||||||
String body = response.getParsed();
|
String body = response.getParsed();
|
||||||
@@ -259,7 +262,7 @@ public class KVVModuleList extends HTTPService {
|
|||||||
errorCallback.onError(new NetworkError(101401, 403, "No calendar retrieved!"));
|
errorCallback.onError(new NetworkError(101401, 403, "No calendar retrieved!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ArrayList<Event> events = new ArrayList<>();
|
EventList events = new EventList();
|
||||||
try {
|
try {
|
||||||
JSONObject json = new JSONObject(body);
|
JSONObject json = new JSONObject(body);
|
||||||
JSONArray sites = json.getJSONArray("calendar_collection");
|
JSONArray sites = json.getJSONArray("calendar_collection");
|
||||||
@@ -278,6 +281,7 @@ public class KVVModuleList extends HTTPService {
|
|||||||
errorCallback.onError(new NetworkError(101402, 403, "Cannot parse calendar entries!"));
|
errorCallback.onError(new NetworkError(101402, 403, "Cannot parse calendar entries!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
events.sort();
|
||||||
callback.onResponse(events);
|
callback.onResponse(events);
|
||||||
}, error -> errorCallback.onError(new NetworkError(101403, error.networkResponse.statusCode, "Cannot get calendar entries!")));
|
}, error -> errorCallback.onError(new NetworkError(101403, error.networkResponse.statusCode, "Cannot get calendar entries!")));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import java.util.HashSet;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import de.sebse.fuplanner.tools.Compare;
|
import de.sebse.fuplanner.tools.Compare;
|
||||||
|
import de.sebse.fuplanner.tools.EventList;
|
||||||
import de.sebse.fuplanner.tools.Regex;
|
import de.sebse.fuplanner.tools.Regex;
|
||||||
import de.sebse.fuplanner.tools.logging.Logger;
|
import de.sebse.fuplanner.tools.logging.Logger;
|
||||||
|
|
||||||
@@ -24,7 +25,10 @@ public class Modules /*extends EventEmitter<Triplet<Integer, Modules.UpgradeModu
|
|||||||
this.list = new SortedList<>(Module.class, new SortedList.Callback<Module>() {
|
this.list = new SortedList<>(Module.class, new SortedList.Callback<Module>() {
|
||||||
@Override
|
@Override
|
||||||
public int compare(Module o1, Module o2) {
|
public int compare(Module o1, Module o2) {
|
||||||
return o1.semester.compareTo(o2.semester);
|
int semester = o1.semester.compareTo(o2.semester);
|
||||||
|
if (semester != 0)
|
||||||
|
return semester;
|
||||||
|
return o1.title.compareToIgnoreCase(o2.title);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -189,7 +193,7 @@ public class Modules /*extends EventEmitter<Triplet<Integer, Modules.UpgradeModu
|
|||||||
private final String ID;
|
private final String ID;
|
||||||
public ArrayList<Announcement> announcements;
|
public ArrayList<Announcement> announcements;
|
||||||
public ArrayList<Assignment> assignments;
|
public ArrayList<Assignment> assignments;
|
||||||
public ArrayList<Event> events;
|
public EventList events;
|
||||||
|
|
||||||
/*private Module() {
|
/*private Module() {
|
||||||
this(null, null, null, null, null);
|
this(null, null, null, null, null);
|
||||||
|
|||||||
@@ -10,28 +10,37 @@ import java.util.Date;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
public class Conversion {
|
public class Conversion {
|
||||||
|
public static String getModifiedDateTime(long modified) {
|
||||||
|
return getModifiedDate(Locale.getDefault(), modified, "MM/dd/yy hh:mm");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getModifiedTime(long modified) {
|
||||||
|
return getModifiedDate(Locale.getDefault(), modified, "hh:mm");
|
||||||
|
}
|
||||||
|
|
||||||
public static String getModifiedDate(long modified) {
|
public static String getModifiedDate(long modified) {
|
||||||
return getModifiedDate(Locale.getDefault(), modified);
|
return getModifiedDate(Locale.getDefault(), modified, "MM/dd/yy");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SimpleDateFormat")
|
@SuppressLint("SimpleDateFormat")
|
||||||
public static String getModifiedDate(Locale locale, long modified) {
|
public static String getModifiedDate(Locale locale, long modified, String skeleton) {
|
||||||
SimpleDateFormat dateFormat;
|
SimpleDateFormat dateFormat;
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||||
dateFormat = new SimpleDateFormat(getDateFormat(locale));
|
dateFormat = new SimpleDateFormat(getDateFormat(locale, skeleton));
|
||||||
} else {
|
} else {
|
||||||
dateFormat = new SimpleDateFormat("MMM/dd/yyyy hh:mm:ss aa", locale);
|
dateFormat = new SimpleDateFormat(skeleton, locale);
|
||||||
}
|
}
|
||||||
|
|
||||||
return dateFormat.format(new Date(modified));
|
return dateFormat.format(new Date(modified));
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
|
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
|
||||||
public static String getDateFormat(Locale locale) {
|
public static String getDateFormat(Locale locale, String skeleton) {
|
||||||
return DateFormat.getBestDateTimePattern(locale, "MM/dd/yyyy hh:mm:ss aa");
|
return DateFormat.getBestDateTimePattern(locale, skeleton);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean dateEquals(long a, long b) {
|
||||||
|
return a / 86400000 == b / 86400000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
56
app/src/main/java/de/sebse/fuplanner/tools/EventList.java
Normal file
56
app/src/main/java/de/sebse/fuplanner/tools/EventList.java
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
package de.sebse.fuplanner.tools;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import de.sebse.fuplanner.services.KVV.Event;
|
||||||
|
|
||||||
|
public class EventList extends ArrayList<Event> {
|
||||||
|
private int split = 0;
|
||||||
|
|
||||||
|
public Event getPast(int index) {
|
||||||
|
if (split < 0)
|
||||||
|
sort();
|
||||||
|
if (index >= split)
|
||||||
|
throw new ArrayIndexOutOfBoundsException(String.format("Index %d out of bounds! Only %d past events found!", index, split));
|
||||||
|
return this.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Event getUpcoming(int index) {
|
||||||
|
if (split < 0)
|
||||||
|
sort();
|
||||||
|
index += split;
|
||||||
|
if (index >= this.size())
|
||||||
|
throw new ArrayIndexOutOfBoundsException(String.format("Index %d out of bounds! Only %d upcoming events found!", index-split, this.size()-split));
|
||||||
|
return this.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int sizePast() {
|
||||||
|
if (split < 0)
|
||||||
|
sort();
|
||||||
|
return split;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int sizeUpcoming() {
|
||||||
|
if (split < 0)
|
||||||
|
sort();
|
||||||
|
return this.size()-split;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean add(Event event) {
|
||||||
|
split = -1;
|
||||||
|
return super.add(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sort() {
|
||||||
|
Collections.sort(this, ((e1, e2) -> Long.compare(e1.getEndDate(), e2.getEndDate())));
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
split = 0;
|
||||||
|
for (Event event : this) {
|
||||||
|
if (event.getEndDate() < now)
|
||||||
|
split++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user