From f0d090fb8d54826c53dfb68692526c553a0f06e6 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Mon, 4 Feb 2019 02:06:25 +0100 Subject: [PATCH] Better event listing --- .../moddetails/ModDetailEventAdapter.java | 64 +++++++++++++++---- .../fuplanner/services/kvv/ModulesEvents.java | 13 +++- .../services/kvv/types/GroupedEvents.java | 28 +++++++- 3 files changed, 90 insertions(+), 15 deletions(-) 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 8cb3691..2897a33 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,7 +1,9 @@ package de.sebse.fuplanner.fragments.moddetails; +import android.app.AlertDialog; import android.content.Context; import android.content.res.Resources; +import android.text.TextUtils; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; @@ -81,19 +83,20 @@ class ModDetailEventAdapter extends RecyclerView.Adapter { for (Map.Entry value: listsGrouped.entrySet()) { 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) { + ArrayList ungroupedGroups = new ArrayList<>(); + for (GroupedEvents.Group group: value.getValue().getGroups()) { + boolean showAsGrouped = true; + if (group.getSkippedDates().size() > 3 || group.size() < 3) { showAsGrouped = false; - break; + } + if (showAsGrouped) { + mPositionalData.add(new Pair<>(TYPE_GROUPED, group)); + } else { + ungroupedGroups.add(group); } } - if (showAsGrouped) { - for (GroupedEvents.Group group : value.getValue().getGroups()) { - mPositionalData.add(new Pair<>(TYPE_GROUPED, group)); - } - } else { - for (Event event : value.getValue()) { + for (GroupedEvents.Group ungroupedGroup : ungroupedGroups) { + for (Event event: ungroupedGroup) { mPositionalData.add(new Pair<>(TYPE_UNGROUPED, event)); } } @@ -186,9 +189,30 @@ class ModDetailEventAdapter extends RecyclerView.Adapter { excepts.append(", ").append(UtilsDate.getModifiedDate(skippedDate)); } } - ig.mTitle.setText(context.getString(R.string.event_scale, weekday, startTime, endTime)); + String groupTitle = context.getString(R.string.event_scale, weekday, startTime, endTime); + if (!TextUtils.isEmpty(group.getTitle()) && !group.getTitle().equals(mValue.title)) + groupTitle += " ("+group.getTitle()+")"; + ig.mTitle.setText(groupTitle); ig.mSubLeft.setText(context.getString(R.string.date_scale, start, end)); ig.mSubRight.setText(excepts != null ? context.getString(R.string.except_list, excepts.toString()) : ""); + String moduleName = mValue.title; + StringBuilder finalExcepts = excepts; + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ig.mView.getContext()); + ig.mView.setOnClickListener(v -> { + alertDialogBuilder + .setTitle(R.string.events) + .setMessage( + ig.mView.getResources().getString(R.string.module_name, moduleName) + "\n" + + ig.mView.getResources().getString(R.string.location_name, group.getLocation()) + "\n" + + context.getString(R.string.event_scale, weekday, startTime, endTime) + "\n" + + context.getString(R.string.date_scale, start, end) + "\n" + + (finalExcepts != null ? context.getString(R.string.except_list, finalExcepts.toString()) : "") + ) + .setCancelable(true) + .setNeutralButton(R.string.close, (dialog, id) -> dialog.cancel()); + AlertDialog alertDialog = alertDialogBuilder.create(); + alertDialog.show(); + }); return; case TYPE_UNGROUPED: ItemViewHolder iu = (ItemViewHolder) holder; @@ -205,7 +229,23 @@ class ModDetailEventAdapter extends RecyclerView.Adapter { date = context.getString(R.string.date_scale, start, end); iu.mTitle.setText(event.getTitle()); iu.mSubLeft.setText(date); - iu.mSubRight.setText(""); + iu.mSubRight.setText(event.getLocation()); + String moduleName1 = mValue.title; + AlertDialog.Builder alertDialogBuilder1 = new AlertDialog.Builder(iu.mView.getContext()); + iu.mView.setOnClickListener(v -> { + alertDialogBuilder1 + .setTitle(moduleName1) + .setMessage( + iu.mView.getResources().getString(R.string.module_name, moduleName1) + "\n" + + iu.mView.getResources().getString(R.string.location_name, event.getLocation()) + "\n" + + date + ) + .setCancelable(true) + .setNeutralButton(R.string.close, (dialog, id) -> dialog.cancel()); + + AlertDialog alertDialog = alertDialogBuilder1.create(); + alertDialog.show(); + }); } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java index 769914c..75bf944 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java @@ -94,6 +94,11 @@ public class ModulesEvents extends PartModules { return; } this.mList.find(ID, module -> { + if (module.lvNumber.size() == 0) { + // Events not available + callback.onResponse(new EventList()); + return; + } super.head(String.format("https://www.fu-berlin.de/vv/de/search?utf8=✓&query=%s", module.lvNumber.iterator().next()), null, response -> { String location = response.getHeaders().get("Location"); if (location == null) { @@ -110,6 +115,12 @@ public class ModulesEvents extends PartModules { e.printStackTrace(); return; } + // 462854, 465661, 462126, 463782, 437050, 433843, 471614, 464205 + //String[] tests = {"462854", "465661", "462126", "463782", "437050", "433843", "471614", "464205"}; + //String[] tests = {"461459", "424564", "459494", "429737", "463765", "476477", "464082", "459577", "459743", "464318", "449358", "454327", "461784", "468081", "485919"}; + //group = tests[new Random().nextInt(tests.length)]; + //log.d("LAAAAAAST", group); + //group = "462126"; super.get(String.format("https://www.fu-berlin.de/vv/de/lv/%s", group), null, response1 -> { String body = response1.getParsed(); if (body == null) { @@ -129,7 +140,7 @@ public class ModulesEvents extends PartModules { return; } try { - title = Regex.regex("
([^<]*?)
", entry, 0); + title = Regex.regex("
([^<]*?)
", entry, 1); } catch (NoSuchFieldException ignored) {} if (TextUtils.isEmpty(title)) title = module.title; diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/types/GroupedEvents.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/GroupedEvents.java index ee1780e..e3eba8f 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/types/GroupedEvents.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/types/GroupedEvents.java @@ -6,6 +6,7 @@ import android.annotation.SuppressLint; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; +import java.util.Iterator; import java.util.List; import androidx.annotation.NonNull; @@ -36,15 +37,17 @@ public class GroupedEvents extends EventList { return skippedDayCount; } - public class Group { + public class Group implements Iterable { private long firstDate; private long lastDate; private final ArrayList skippedDates; + private final ArrayList allEvents = new ArrayList<>(); private final int dayOfWeek; private final long startTime; private final long duration; private final String location; + private final String title; private Group(Event event) { Calendar calendar = Calendar.getInstance(); @@ -53,6 +56,7 @@ public class GroupedEvents extends EventList { startTime = calendar.get(Calendar.HOUR_OF_DAY)*3600000+calendar.get(Calendar.MINUTE)*60000+calendar.get(Calendar.SECOND)*1000+calendar.get(Calendar.MILLISECOND); duration = event.getEndDate()-event.getStartDate(); location = event.getLocation(); + title = event.getTitle(); skippedDates = new ArrayList<>(); calendar.set(Calendar.HOUR_OF_DAY, 0); @@ -61,6 +65,7 @@ public class GroupedEvents extends EventList { calendar.set(Calendar.MILLISECOND, 0); firstDate = calendar.getTimeInMillis(); lastDate = firstDate; + allEvents.add(event); } private boolean add(Event event) { @@ -70,7 +75,7 @@ public class GroupedEvents extends EventList { int startTime = calendar.get(Calendar.HOUR_OF_DAY)*3600000+calendar.get(Calendar.MINUTE)*60000+calendar.get(Calendar.SECOND)*1000+calendar.get(Calendar.MILLISECOND); long length = event.getEndDate()-event.getStartDate(); String location = event.getLocation(); - if (this.dayOfWeek != dayOfWeek || this.startTime != startTime || this.duration != length || this.location.equals(location)) + if (this.dayOfWeek != dayOfWeek || this.startTime != startTime || this.duration != length || !this.location.equals(location)) return false; calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); @@ -95,6 +100,7 @@ public class GroupedEvents extends EventList { skippedDates.remove(date); skippedDayCount -= 1; } + allEvents.add(event); return true; } @@ -129,11 +135,29 @@ public class GroupedEvents extends EventList { return duration; } + public String getLocation() { + return location; + } + + public String getTitle() { + return title; + } + @SuppressLint("DefaultLocale") @NonNull @Override public String toString() { return String.format("%d - %d - %d - %s", dayOfWeek, startTime, duration, skippedDates); } + + @NonNull + @Override + public Iterator iterator() { + return Collections.unmodifiableList(allEvents).iterator(); + } + + public int size() { + return allEvents.size(); + } } }