From 417570ee303020283c4edc5d302f5c39ba7e47d3 Mon Sep 17 00:00:00 2001 From: Rico Date: Tue, 8 Jan 2019 12:21:59 +0100 Subject: [PATCH 01/47] FIX: Remove debug sysout --- .../de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java index 5ca57835..e8d16a69 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java @@ -71,7 +71,6 @@ public void testGetFutureDaysCount() { cal.set(Calendar.SECOND,0); cal.add(Calendar.DATE, 1); Date tomorrow = cal.getTime(); - System.out.println(sdf.format(tomorrow)); ArrayList> arrayLists = new ArrayList<>(); TimeTableDay ttd = new TimeTableDay(sdf.format(tomorrow), WEEK_A, arrayLists); timeTable.addDay(ttd); From 264fe8c39690cf137036ace3acc81b0fb9f57aea Mon Sep 17 00:00:00 2001 From: Rico Date: Tue, 8 Jan 2019 12:24:40 +0100 Subject: [PATCH 02/47] TASK: Update versionCode to 29 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index db0633f7..5fed71c0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,7 +25,7 @@ android { applicationId "de.aurora.mggvertretungsplan" minSdkVersion 15 targetSdkVersion 28 - versionCode 28 + versionCode 29 versionName "3.2.1" multiDexEnabled true From 4a4c7461cacab497fb2ce1e5898edf489995e740 Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:22:52 +0100 Subject: [PATCH 03/47] TASK: Add new strings for new notifications --- app/src/main/res/values/strings.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0870aa4..4e823b6d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,11 +57,10 @@ Wähle die Farbe der App - - - Entfällt + entfällt Vertretung - + Neue Stundenplanänderung + EEEE, dd.MM. MGG Vertretungsplan Stundenplan Änderung! From 7fc163274bcdd39370c21e3d8239d059b3317fb4 Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:23:40 +0100 Subject: [PATCH 04/47] FIX: Rename "titel" to "title" Well... german, english, who cares? --- .../mggvertretungsplan/util/NotificationHelper.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java b/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java index 63c65d21..558a1b69 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java @@ -53,7 +53,7 @@ private void createNotificationChannel(String id, CharSequence name, String desc } } - private Notification buildNotification(String ticker, String titel, String text, String channel, PendingIntent pIntent) { + private Notification buildNotification(String ticker, String title, String text, String channel, PendingIntent pIntent) { int color; if (Build.VERSION.SDK_INT >= 23) color = getResources().getColor(R.color.colorAccent, getTheme()); @@ -62,7 +62,7 @@ private Notification buildNotification(String ticker, String titel, String text, color = getResources().getColor(R.color.colorAccent); NotificationCompat.Builder notification_builder = new NotificationCompat.Builder(this.context, channel) - .setContentTitle(titel) + .setContentTitle(title) .setContentText(text) .setStyle(new NotificationCompat.BigTextStyle().bigText(text)) .setTicker(ticker) @@ -75,18 +75,18 @@ private Notification buildNotification(String ticker, String titel, String text, return notification_builder.build(); } - public void notifyNews(String ticker, String titel, String text) { + public void notifyNews(String ticker, String title, String text) { Intent intent = new Intent(this.context, MainActivity.class); PendingIntent pIntent = PendingIntent.getActivity(this.context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - Notification notification = buildNotification(ticker, titel, text, newsChannelName, pIntent); + Notification notification = buildNotification(ticker, title, text, newsChannelName, pIntent); notificationManager.notify(notificationCounter, notification); notificationCounter++; } - public void notifyChanges(String ticker, String titel, String text) { + public void notifyChanges(String ticker, String title, String text) { Intent intent = new Intent(this.context, MainActivity.class); PendingIntent pIntent = PendingIntent.getActivity(this.context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - Notification notification = buildNotification(ticker, titel, text, defaultChannelName, pIntent); + Notification notification = buildNotification(ticker, title, text, defaultChannelName, pIntent); notificationManager.notify(notificationCounter, notification); notificationCounter++; } From 17375a5eb582d7d859026f8227b508242cc888d5 Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:24:47 +0100 Subject: [PATCH 05/47] TASK: Rename "zeile" to "row" --- .../de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index d9f05ae3..f0bb15b5 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -28,8 +28,8 @@ public TimeTableDay(String date, String week, ArrayList> timeT this.week = new Week(week); setDate(date); - for (ArrayList zeile : timeTableDay_List) { - TimeTableElement timeTableElement = new TimeTableElement(zeile.get(0), zeile.get(1), zeile.get(2), zeile.get(3), zeile.get(4), zeile.get(5), zeile.get(6)); + for (ArrayList row : timeTableDay_List) { + TimeTableElement timeTableElement = new TimeTableElement(row.get(0), row.get(1), row.get(2), row.get(3), row.get(4), row.get(5), row.get(6)); addElement(timeTableElement); } From fa9adb6eb95ef4639c95fbfabf1873e562e18bed Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:27:13 +0100 Subject: [PATCH 06/47] FEATURE: Method to notify changes on a TimeTableDay --- .../mggvertretungsplan/util/NotificationHelper.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java b/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java index 558a1b69..250c9168 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/util/NotificationHelper.java @@ -12,6 +12,7 @@ import androidx.core.app.NotificationCompat; import de.aurora.mggvertretungsplan.MainActivity; import de.aurora.mggvertretungsplan.R; +import de.aurora.mggvertretungsplan.datamodel.TimeTableDay; public class NotificationHelper extends ContextWrapper { private static final String TAG = "NotificationHelper"; @@ -90,4 +91,13 @@ public void notifyChanges(String ticker, String title, String text) { notificationManager.notify(notificationCounter, notification); notificationCounter++; } + + + public void notifyChange(TimeTableDay ttd) { + String ticker = ttd.getNotificationTicker(context); + String text = ttd.getNotificationText(context); + String title = ttd.getNotificationTitle(context); + + notifyChanges(ticker, title, text); + } } From 29d3d10d5f5ae18326461ae29b699da3b89c063a Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:31:17 +0100 Subject: [PATCH 07/47] TASK: New constructor for TimeTableDay To create a ttd from an existing ttd --- .../aurora/mggvertretungsplan/datamodel/TimeTableDay.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index f0bb15b5..c489c4ea 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -36,6 +36,12 @@ public TimeTableDay(String date, String week, ArrayList> timeT mergeConsecutiveCancellations(); } + public TimeTableDay(Date date, Week week, ArrayList timeTableElements) { + this.date = date; + this.week = week; + this.timeTableElements.addAll(timeTableElements); + } + public TimeTableDay(JSONObject jsonObject) { try { String date = jsonObject.getString("date"); From ef1493bdd1023ac574b2004396c94849956e41ba Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:33:04 +0100 Subject: [PATCH 08/47] TASK: Method to get notificationtitle from ttd --- .../datamodel/TimeTableDay.java | 9 +++++++ .../datamodel/TimeTableDayTest.java | 25 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index c489c4ea..2f5b9c52 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -1,5 +1,7 @@ package de.aurora.mggvertretungsplan.datamodel; +import android.content.Context; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -11,6 +13,7 @@ import java.util.GregorianCalendar; import java.util.Locale; +import de.aurora.mggvertretungsplan.R; import de.aurora.mggvertretungsplan.util.Logger; /** @@ -62,6 +65,12 @@ public TimeTableDay(JSONObject jsonObject) { } } + public String getNotificationTitle(Context context) { + String formatString = context.getString(R.string.notification_title_dateformat); + SimpleDateFormat sdf = new SimpleDateFormat(formatString, Locale.GERMANY); + return sdf.format(this.date); + } + private void addElement(TimeTableElement tte) { int index = 0; for (int i = 0; i < timeTableElements.size(); i++) { diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java index a15c8fb6..ff4ab062 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java @@ -1,7 +1,12 @@ package de.aurora.mggvertretungsplan.datamodel; +import android.content.Context; + import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -11,23 +16,43 @@ import java.util.GregorianCalendar; import java.util.Locale; +import de.aurora.mggvertretungsplan.R; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; /** * Created by Rico on 20.11.2017. */ +@RunWith(MockitoJUnitRunner.class) public class TimeTableDayTest { private static final String WEEK_A = "A"; private static final String WEEK_B = "B"; private ArrayList> testList; + @Mock + private Context context; + @Before public void setUp() { testList = new ArrayList<>(); } + @Test + public void getNotificationTitle() { + when(context.getString(R.string.notification_title_dateformat)).thenReturn("EEEE, dd.MM."); + TimeTableDay ttd = new TimeTableDay("01.01.2018", WEEK_A, testList); + assertEquals("Montag, 01.01.", ttd.getNotificationTitle(context)); + + TimeTableDay ttd1 = new TimeTableDay("01.01.2019", WEEK_A, testList); + assertEquals("Dienstag, 01.01.", ttd1.getNotificationTitle(context)); + + TimeTableDay ttd2 = new TimeTableDay("19.07.2019", WEEK_A, testList); + assertEquals("Freitag, 19.07.", ttd2.getNotificationTitle(context)); + } + @Test public void getDate() throws Exception { Calendar calendar = Calendar.getInstance(); From f957834d203adaa143c90ce1b01cf8e031ef1fb9 Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:35:28 +0100 Subject: [PATCH 09/47] TASK: Add method to get notificationticker from ttd --- .../aurora/mggvertretungsplan/datamodel/TimeTableDay.java | 4 ++++ .../mggvertretungsplan/datamodel/TimeTableDayTest.java | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index 2f5b9c52..17d47547 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -71,6 +71,10 @@ public String getNotificationTitle(Context context) { return sdf.format(this.date); } + public String getNotificationTicker(Context context) { + return context.getString(R.string.notification_ticker); + } + private void addElement(TimeTableElement tte) { int index = 0; for (int i = 0; i < timeTableElements.size(); i++) { diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java index ff4ab062..adf0c688 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java @@ -53,6 +53,14 @@ public void getNotificationTitle() { assertEquals("Freitag, 19.07.", ttd2.getNotificationTitle(context)); } + @Test + public void getNotificationTicker() { + //TimeTableElement tte = new TimeTableElement(hour, class_name, subject, newSubject, room, newRoom, info); + when(context.getString(R.string.notification_ticker)).thenReturn("Neue Stundenplanänderung"); + TimeTableDay ttd = new TimeTableDay("01.01.2018", WEEK_A, testList); + assertEquals("Neue Stundenplanänderung", ttd.getNotificationTicker(context)); + } + @Test public void getDate() throws Exception { Calendar calendar = Calendar.getInstance(); From 7f65d3b7c631d58b0df2e211078d80b39e3d8f13 Mon Sep 17 00:00:00 2001 From: Rico Date: Thu, 10 Jan 2019 23:35:48 +0100 Subject: [PATCH 10/47] TASK: Add method to get notificationText from ttd --- .../datamodel/TimeTableDay.java | 24 +++++++++++++++++++ .../datamodel/TimeTableDayTest.java | 19 +++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index 17d47547..7d8caaac 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -75,6 +75,30 @@ public String getNotificationTicker(Context context) { return context.getString(R.string.notification_ticker); } + public String getNotificationText(Context context) { + StringBuilder sb = new StringBuilder(); + + //'{hr}. Std: {subj} {action}' + String formatString = "%s. Std: %s %s\n"; + for (TimeTableElement tte: this.timeTableElements) { + String action = ""; + switch (tte.getType()) { + case TimeTableElement.SUBSTITUTION: + action = context.getString(R.string.cardInfo_representation); + break; + case TimeTableElement.CANCELLATION: + action = context.getString(R.string.cardInfo_cancelled); + break; + case TimeTableElement.EMPTY: + continue; + } + + sb.append(String.format(formatString, tte.getHour(), tte.getSubject(), action)); + } + + return sb.toString().trim(); + } + private void addElement(TimeTableElement tte) { int index = 0; for (int i = 0; i < timeTableElements.size(); i++) { diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java index adf0c688..d19fe380 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java @@ -61,6 +61,25 @@ public void getNotificationTicker() { assertEquals("Neue Stundenplanänderung", ttd.getNotificationTicker(context)); } + @Test + public void getNotificationText() { + when(context.getString(R.string.cardInfo_cancelled)).thenReturn("entfällt"); + when(context.getString(R.string.cardInfo_representation)).thenReturn("Vertretung"); + + String className = "K1"; + testList.add(new ArrayList<>(Arrays.asList("1", className, "4BK", "---", "BK3", "---", ""))); + testList.add(new ArrayList<>(Arrays.asList("3", className, "G", "D", "H202", "H202", ""))); + testList.add(new ArrayList<>(Arrays.asList("5-6", className, "E", "---", "H105", "---", "Teacher on holiday!"))); + + TimeTableDay ttd = new TimeTableDay("01.01.2018", WEEK_A, testList); + + String expectedText = "1. Std: Bildende Kunst entfällt\n" + + "3. Std: Geschichte Vertretung\n" + + "5-6. Std: Englisch entfällt"; + + assertEquals(expectedText, ttd.getNotificationText(context)); + } + @Test public void getDate() throws Exception { Calendar calendar = Calendar.getInstance(); From 277c9dde409e663ffd4c7e155bef35168dfcca41 Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 11 Jan 2019 03:00:06 +0100 Subject: [PATCH 11/47] FEATURE: Implement detailed notifications fixes #51 #50 --- .../datamodel/TimeTable.java | 10 +-- .../datamodel/TimeTableDay.java | 9 ++- .../parsing/MockParser.java | 2 +- .../services/DownloadTimeTableWorker.java | 41 +++++------- .../datamodel/TimeTableDayTest.java | 15 ++--- .../datamodel/TimeTableTest.java | 65 +++++++++++++++++++ 6 files changed, 98 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java index 2305feeb..61c692bc 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java @@ -88,9 +88,9 @@ public int getTotalCancellations(String className) { return cancellations; } - public int getTotalDifferences(TimeTable savedTimeTable, String className) { + public TimeTable getTotalDifferences(TimeTable savedTimeTable, String className) { Logger.d(TAG, "Getting differences of saved and downloaded timetable!"); - int differences = 0; + TimeTable differencesTimeTable = new TimeTable(); Date currentDate = new Date(); ArrayList savedDays = savedTimeTable.getAllDays(); @@ -108,7 +108,7 @@ public int getTotalDifferences(TimeTable savedTimeTable, String className) { Logger.d(TAG, String.format("Dates are the same - %s | %s", ttd.getDateString(), saved_ttd.getDateString())); Logger.d(TAG, String.format("%s", ttd.getElements(className).toString())); Logger.d(TAG, String.format("%s", saved_ttd.getElements(className).toString())); - differences += ttd.getDifferences(saved_ttd, className); + differencesTimeTable.addDay(ttd.getDifferences(saved_ttd, className)); newDay = false; break; } @@ -116,12 +116,12 @@ public int getTotalDifferences(TimeTable savedTimeTable, String className) { if (newDay) { int dayDiffs = ttd.getElementsCount(className); - differences += dayDiffs; + differencesTimeTable.addDay(ttd); Logger.d(TAG, String.format(Locale.GERMANY,"New Day found - %d cancellations for %s", dayDiffs, className)); } } - return differences; + return differencesTimeTable; } @Override diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index 7d8caaac..275c29c8 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -191,8 +191,7 @@ public int getElementsCount(String className) { return getElements(className).size(); } - // Returns the number of differences between two lists - public int getDifferences(TimeTableDay ttd, String className) { + TimeTableDay getDifferences(TimeTableDay ttd, String className) { ArrayList savedElements = ttd.getElements(className); ArrayList newElements = this.getElements(className); @@ -228,10 +227,10 @@ public int getDifferences(TimeTableDay ttd, String className) { // savedElements now contains only those elements which are no longer in the TimeTable // newElements now only contains those elements which are new (not saved yet) or have changed in a single part - int changesToOldCancellations = savedElements.size(); - int newCancellations = newElements.size(); + savedElements.addAll(newElements); + ArrayList tmp = savedElements; - return changesToOldCancellations + newCancellations; + return new TimeTableDay(date, week, tmp); } // Checks if this and the given day are at the same date diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/parsing/MockParser.java b/app/src/main/java/de/aurora/mggvertretungsplan/parsing/MockParser.java index a2cc4e63..a3351452 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/parsing/MockParser.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/parsing/MockParser.java @@ -58,7 +58,7 @@ public TimeTable parse(ArrayList websites) { timeTable1.addDay(ttd1); timeTable2.addDay(ttd2); - int diffs = timeTable1.getTotalDifferences(timeTable2, "K1"); + int diffs = timeTable1.getTotalDifferences(timeTable2, "K1").getDaysCount(); Logger.d("MockParser", String.format("Diffs: %s", diffs)); timeTableReturn.addDay(ttd1); diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java index f3e0f66c..e6147dad 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java @@ -14,6 +14,7 @@ import androidx.work.WorkerParameters; import de.aurora.mggvertretungsplan.R; import de.aurora.mggvertretungsplan.datamodel.TimeTable; +import de.aurora.mggvertretungsplan.datamodel.TimeTableDay; import de.aurora.mggvertretungsplan.parsing.BaseParser; import de.aurora.mggvertretungsplan.parsing.BaseParser.ParsingCompleteListener; import de.aurora.mggvertretungsplan.parsing.MGGParser; @@ -90,39 +91,29 @@ public void onParsingComplete(TimeTable timeTable) { } } - // Compare new data with old data - int totalDiffs = timeTable.getTotalDifferences(timeTable_saved, class_name); - - // Get new cancellations - // new_cancellations = ... - - // Get removed cancellations - // removed_cancellations = ... - - // Get changed cancellations - // changed_cancellations = ... - - // "x neue Ausfälle" - // "x Änderung/en am Vertretugnsplan" - // "..." - + NotificationHelper notificationHelper = new NotificationHelper(getApplicationContext()); + TimeTable diffTimeTable = timeTable.getTotalDifferences(timeTable_saved, class_name); + int totalDiffs = diffTimeTable.getTotalCancellations(class_name); Logger.d(TAG, String.format(Locale.GERMANY, "Total differences: %d", totalDiffs)); - Context context = getApplicationContext(); - String ticker = context.getResources().getString(R.string.notification_cancellations_ticker); - String title = context.getResources().getString(R.string.notification_cancellations_title); - String info = context.getResources().getQuantityString(R.plurals.notification_cancellations_info, totalDiffs, totalDiffs); - - NotificationHelper notificationHelper = new NotificationHelper(getApplicationContext()); - if (totalDiffs <= 0) { Logger.d(TAG, "Not sending a notification!"); return; } - Logger.d(TAG, "Notifying user"); - notificationHelper.notifyChanges(ticker, title, info); + if (sp.getBoolean("show_detailed_notifications", true)) { + for (TimeTableDay ttd : diffTimeTable.getAllDays()) { + Logger.d(TAG, "Notifying user"); + notificationHelper.notifyChange(ttd); + } + } else { + Context context = getApplicationContext(); + String ticker = context.getResources().getString(R.string.notification_cancellations_ticker); + String title = context.getResources().getString(R.string.notification_cancellations_title); + String info = context.getResources().getQuantityString(R.plurals.notification_cancellations_info, totalDiffs, totalDiffs); + notificationHelper.notifyChanges(ticker, title, info); + } saveData(timeTable); } diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java index d19fe380..6f6e5791 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java @@ -316,14 +316,13 @@ public void getDifferences() { TimeTableDay day7 = new TimeTableDay("01.01.2018", WEEK_A, day7List); - assertEquals(0, day1.getDifferences(day1, className)); - assertEquals(1, day1.getDifferences(day2, className)); - assertEquals(1, day1.getDifferences(day3, className)); - assertEquals(1, day1.getDifferences(day4, className)); - assertEquals(2, day1.getDifferences(day5, className)); - assertEquals(2, day1.getDifferences(day6, className)); - assertEquals(4, day1.getDifferences(day7, className)); - + assertEquals(0, day1.getDifferences(day1, className).getElementsCount(className)); + assertEquals(1, day1.getDifferences(day2, className).getElementsCount(className)); + assertEquals(1, day1.getDifferences(day3, className).getElementsCount(className)); + assertEquals(1, day1.getDifferences(day4, className).getElementsCount(className)); + assertEquals(2, day1.getDifferences(day5, className).getElementsCount(className)); + assertEquals(2, day1.getDifferences(day6, className).getElementsCount(className)); + assertEquals(4, day1.getDifferences(day7, className).getElementsCount(className)); } @Test diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java index e8d16a69..3f321717 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java @@ -191,6 +191,71 @@ public void testGetTotalCancellations() { } public void testGetTotalDifferences() { + ArrayList> dayList = new ArrayList<>(); + dayList.add(new ArrayList<>(Arrays.asList("1", "K1", "D", "---", "H202", "---", ""))); + dayList.add(new ArrayList<>(Arrays.asList("2", "7a", "E", "---", "H105", "---", ""))); + dayList.add(new ArrayList<>(Arrays.asList("3", "7a", "BIO", "---", "S320", "---", ""))); + dayList.add(new ArrayList<>(Arrays.asList("3", "5c", "G", "---", "M315", "---", "Test"))); + TimeTableDay ttd = new TimeTableDay("31.12.", WEEK_A, dayList); + timeTable.addDay(ttd); + + ArrayList> dayList2 = new ArrayList<>(); + dayList2.add(new ArrayList<>(Arrays.asList("1", "K2", "D", "---", "H202", "---", ""))); + //dayList2.add(new ArrayList<>(Arrays.asList("1", "K2", "D", "---", "H202", "---", ""))); //Duplicate - should not count + dayList2.add(new ArrayList<>(Arrays.asList("2", "5b", "E", "---", "H105", "---", ""))); + dayList2.add(new ArrayList<>(Arrays.asList("3", "7a", "BIO", "---", "S320", "---", ""))); + dayList2.add(new ArrayList<>(Arrays.asList("4", "7a", "BIO", "---", "S320", "---", ""))); // Getting merged with 3. lesson + dayList2.add(new ArrayList<>(Arrays.asList("3-4", "9c", "G", "---", "M315", "---", "Test"))); + dayList2.add(new ArrayList<>(Arrays.asList("5", "9c", "D", "---", "M315", "---", "Test"))); + dayList2.add(new ArrayList<>(Arrays.asList("8-9", "9c", "Sp", "---", "M315", "---", "Test"))); + TimeTableDay ttd2 = new TimeTableDay("30.12.", WEEK_A, dayList2); + timeTable.addDay(ttd2); + + // Second tt + TimeTable timeTable1 = new TimeTable(); + ArrayList> dayList3 = new ArrayList<>(); + dayList3.add(new ArrayList<>(Arrays.asList("1", "K1", "D", "---", "H202", "---", ""))); + dayList3.add(new ArrayList<>(Arrays.asList("2", "7a", "E", "---", "H105", "---", ""))); + dayList3.add(new ArrayList<>(Arrays.asList("3", "7a", "BIO", "---", "S320", "---", ""))); + dayList3.add(new ArrayList<>(Arrays.asList("3", "5c", "G", "---", "M315", "---", "Test"))); + TimeTableDay ttd3 = new TimeTableDay("31.12.", WEEK_A, dayList3); + timeTable1.addDay(ttd3); + + ArrayList> dayList4 = new ArrayList<>(); + dayList4.add(new ArrayList<>(Arrays.asList("1", "K2", "D", "---", "H202", "---", ""))); + dayList4.add(new ArrayList<>(Arrays.asList("2", "5b", "E", "---", "H105", "---", ""))); + dayList4.add(new ArrayList<>(Arrays.asList("3", "7a", "BIO", "---", "S320", "---", ""))); + dayList4.add(new ArrayList<>(Arrays.asList("4", "7a", "BIO", "---", "S320", "---", ""))); // Getting merged with 3. lesson + dayList4.add(new ArrayList<>(Arrays.asList("3-4", "9c", "G", "---", "M315", "---", "Test"))); + dayList4.add(new ArrayList<>(Arrays.asList("5", "9c", "D", "---", "M315", "---", "Test"))); + dayList4.add(new ArrayList<>(Arrays.asList("8-9", "9c", "Sp", "---", "M315", "---", "Test"))); + TimeTableDay ttd4 = new TimeTableDay("30.12.", WEEK_A, dayList4); + timeTable1.addDay(ttd4); + + assertEquals(0, timeTable.getTotalDifferences(timeTable1, "7a").getTotalCancellations("7a")); + assertEquals(0, timeTable.getTotalDifferences(timeTable1, "K2").getTotalCancellations("K2")); + assertEquals(0, timeTable.getTotalDifferences(timeTable1, "8f").getTotalCancellations("8f")); + + // The other way around + assertEquals(0, timeTable1.getTotalDifferences(timeTable, "7a").getTotalCancellations("7a")); + assertEquals(0, timeTable1.getTotalDifferences(timeTable, "K2").getTotalCancellations("K2")); + assertEquals(0, timeTable1.getTotalDifferences(timeTable, "8f").getTotalCancellations("8f")); + + // Another check + assertEquals(timeTable.getTotalDifferences(timeTable1, "7a").getTotalCancellations("7a"), timeTable1.getTotalDifferences(timeTable, "7a").getTotalCancellations("7a")); + assertEquals(timeTable.getTotalDifferences(timeTable1, "K2").getTotalCancellations("K2"), timeTable1.getTotalDifferences(timeTable, "K2").getTotalCancellations("K2")); + assertEquals(timeTable.getTotalDifferences(timeTable1, "8f").getTotalCancellations("8f"), timeTable1.getTotalDifferences(timeTable, "8f").getTotalCancellations("8f")); + + TimeTable timeTable2 = new TimeTable(); + timeTable2.addDay(ttd3); + + dayList4.add(new ArrayList<>(Arrays.asList("1-2", "K1", "D", "---", "H001", "---", "Test"))); + ttd4 = new TimeTableDay("30.12.", WEEK_A, dayList4); + timeTable2.addDay(ttd4); + + assertEquals(0, timeTable.getTotalDifferences(timeTable2, "7a").getTotalCancellations("7a")); + assertEquals(0, timeTable.getTotalDifferences(timeTable2, "K2").getTotalCancellations("K2")); + assertEquals(0, timeTable.getTotalDifferences(timeTable2, "8f").getTotalCancellations("8f")); } public void testToString() { From 6c4dfd236f355f24e61a85a6e7d9503853f81311 Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 11 Jan 2019 03:16:50 +0100 Subject: [PATCH 12/47] TASK: Add strings for notification/logging settings --- app/src/main/res/values/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e823b6d..0531c079 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,11 +57,17 @@ Wähle die Farbe der App + Logging + Aufzeichnen von Protokolldaten aktivieren + entfällt Vertretung Neue Stundenplanänderung EEEE, dd.MM. + Detail-Benachrichtigungen + Tatsächliche Stundenplanänderungen in Benachrichtigung anzeigen + MGG Vertretungsplan Stundenplan Änderung! From f149f7f94d3762486f39c469c82107e3222e4019 Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 11 Jan 2019 03:18:18 +0100 Subject: [PATCH 13/47] TASK: Detail notification switchpreference --- app/src/main/res/xml/preferences_main.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml index 6a3493c2..7c84c6c2 100644 --- a/app/src/main/res/xml/preferences_main.xml +++ b/app/src/main/res/xml/preferences_main.xml @@ -56,5 +56,11 @@ android:key="notification" android:title="@string/settings_notification_title" /> + + From 17e431c31d3e8b46cd06e92e583973b40ab21e55 Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 11 Jan 2019 03:18:33 +0100 Subject: [PATCH 14/47] TASK: Update version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5fed71c0..bbbce2c6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,7 +26,7 @@ android { minSdkVersion 15 targetSdkVersion 28 versionCode 29 - versionName "3.2.1" + versionName "3.2.2" multiDexEnabled true testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' From f8a326a6d4f7e020717cc518633a5a76d9402808 Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 11 Jan 2019 03:19:36 +0100 Subject: [PATCH 15/47] TASK: Add SwitchPreference for file logging This must be hidden somewhere from the user! --- app/src/main/res/xml/preferences_main.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml index 7c84c6c2..e4de07a5 100644 --- a/app/src/main/res/xml/preferences_main.xml +++ b/app/src/main/res/xml/preferences_main.xml @@ -62,5 +62,11 @@ android:title="@string/show_detailed_notifications_title" android:summary="@string/show_detailed_notifications_summary"/> + + From 9a848855bc4fc15f0b2b19619d70cc2324dc65c7 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:16:22 +0100 Subject: [PATCH 16/47] TASK: Refactor class_name to className --- .../datamodel/TimeTableDay.java | 6 +++--- .../datamodel/TimeTableElement.java | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index 275c29c8..a6759dbe 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -159,7 +159,7 @@ public ArrayList getElements(String className) { Grade grade = new Grade(className); for (TimeTableElement tte : timeTableElements) { - String elementClassName = tte.getClass_name(); + String elementClassName = tte.getClassName(); // TODO Remove the "contains" part if (grade.matches(elementClassName) || elementClassName.contains(className)) elementsOfClass.add(tte); @@ -253,7 +253,7 @@ private void mergeConsecutiveCancellations() { if (tte.getHour().length() <= 2 && tte2.getHour().length() <= 2 && tte.getHour_I() == (tte2.getHour_I() - 1)) { if (tte.getType() == tte2.getType() && - tte.getClass_name().equals(tte2.getClass_name()) && + tte.getClassName().equals(tte2.getClassName()) && tte.getRoom().equals(tte2.getRoom()) && tte.getNewRoom().equals(tte2.getNewRoom()) && tte.getSubject().equals(tte2.getSubject()) && @@ -269,7 +269,7 @@ else if (tte.getInfo().isEmpty() || tte2.getInfo().isEmpty()) else newInfo = String.format("%s - %s", tte.getInfo(), tte2.getInfo()); - TimeTableElement replacement = new TimeTableElement(newTime, tte.getClass_name(), tte.getSubject(), tte.getNewSubject(), tte.getRoom(), tte.getNewRoom(), newInfo); + TimeTableElement replacement = new TimeTableElement(newTime, tte.getClassName(), tte.getSubject(), tte.getNewSubject(), tte.getRoom(), tte.getNewRoom(), newInfo); timeTableElements.remove(tte); timeTableElements.remove(tte2); diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index ad25afb4..b9d0a8db 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -21,7 +21,7 @@ public class TimeTableElement { public static final int SUBSTITUTION = 1; private static final String TAG = "TimeTableElement"; private final String hour; - private final String class_name; + private final String className; private final String subject; private final String newSubject; private final String room; @@ -31,7 +31,7 @@ public class TimeTableElement { public TimeTableElement() { hour = ""; - class_name = ""; + className = ""; subject = ""; newSubject = ""; room = ""; @@ -40,9 +40,9 @@ public TimeTableElement() { info = ""; } - TimeTableElement(String hour, String class_name, String subject, String newSubject, String room, String newRoom, String info) { + TimeTableElement(String hour, String className, String subject, String newSubject, String room, String newRoom, String info) { this.hour = hour.replace(" - ", "-"); - this.class_name = class_name; + this.className = className; this.subject = getFullSubject(subject); this.newSubject = getFullSubject(newSubject); this.room = (room.isEmpty() ? "---" : room); @@ -53,7 +53,7 @@ public TimeTableElement() { TimeTableElement(JSONObject jsonObject) throws JSONException { this.hour = jsonObject.getString("hour"); - this.class_name = jsonObject.getString("class_name"); + this.className = jsonObject.getString("class_name"); this.subject = jsonObject.getString("subject"); this.newSubject = jsonObject.getString("newSubject"); this.room = jsonObject.getString("room"); @@ -168,8 +168,8 @@ public String getHour() { return hour; } - public String getClass_name() { - return this.class_name; + public String getClassName() { + return this.className; } public String getSubject() { @@ -253,14 +253,14 @@ private int calcType() { @Override public String toString() { - return String.format("%s | %s | %s | %s | %s | %s | %s", hour, class_name, subject, newSubject, room, newRoom, info); + return String.format("%s | %s | %s | %s | %s | %s | %s", hour, className, subject, newSubject, room, newRoom, info); } public JSONObject toJSON() throws JSONException { JSONObject jsonObject = new JSONObject(); jsonObject.put("hour", hour); - jsonObject.put("class_name", class_name); + jsonObject.put("class_name", className); jsonObject.put("subject", subject); jsonObject.put("newSubject", newSubject); jsonObject.put("room", room); From 361987f9384da9e525d65c4c2a6bd8eb99ccd972 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:24:55 +0100 Subject: [PATCH 17/47] TASK: Refactor variable names --- .../datamodel/TimeTableElement.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index b9d0a8db..4d76506a 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -64,19 +64,18 @@ public TimeTableElement() { // Returns the full name of a subject abbreviation @SuppressLint("DefaultLocale") - private static String getFullSubject(String subj) { + private static String getFullSubject(String subject) { String pattern = "[0-9]+([a-zA-Z]+)[0-9]*"; - String abbr; + String abbreviation; - if (subj.matches(pattern)) { - abbr = subj.replaceAll(pattern, "$1"); + if (subject.matches(pattern)) { } else - abbr = subj; + abbreviation = subject; - if (abbr.equals("")) { + if (abbreviation.equals("")) { return "Kein Fach"; } else { - switch (abbr.toUpperCase()) { + switch (abbreviation.toUpperCase(Locale.getDefault())) { case "D": return "Deutsch"; case "PH": @@ -144,7 +143,7 @@ private static String getFullSubject(String subj) { case "PHIL": return "Philosophie"; default: - return subj; + return subject; } } } From 04ec2fb819d207abb8846f6a00e6b4bea69866cd Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:25:10 +0100 Subject: [PATCH 18/47] FIX: Rename class_name to className --- .../aurora/mggvertretungsplan/datamodel/TimeTableElement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index 4d76506a..1edba216 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -240,7 +240,7 @@ int getDiffAmount(TimeTableElement tte) { // Returns the TTE object as ArrayList ArrayList getElementAsList() { - return new ArrayList<>(Arrays.asList(hour, class_name, subject, newSubject, room, newRoom, info)); + return new ArrayList<>(Arrays.asList(hour, className, subject, newSubject, room, newRoom, info)); } private int calcType() { From a77b59660543e5f9a4f522e88c213bc1a690c767 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:26:28 +0100 Subject: [PATCH 19/47] TASK: Add Javadoc to TimeTableElement --- .../datamodel/TimeTableElement.java | 69 +++++++++++++++++-- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index 1edba216..17681646 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -29,6 +29,9 @@ public class TimeTableElement { private final int type; private final String info; + /** + * Create an empty TimeTableElement + */ public TimeTableElement() { hour = ""; className = ""; @@ -40,6 +43,17 @@ public TimeTableElement() { info = ""; } + /** + * Create TimeTableElement by providing all the single data fields + * + * @param hour String describing the hour on which the element takes place + * @param className Name of the class as String + * @param subject Subject as String + * @param newSubject New subject (in case of substitution) as String + * @param room Room as String + * @param newRoom New room (in case of substitution) as String + * @param info String adding additional information to the + */ TimeTableElement(String hour, String className, String subject, String newSubject, String room, String newRoom, String info) { this.hour = hour.replace(" - ", "-"); this.className = className; @@ -51,6 +65,12 @@ public TimeTableElement() { this.info = info.trim(); } + /** + * Creates a TimeTable Element by a given JSONObject + * + * @param jsonObject A JSONObject representation of a TimeTableElement + * @throws JSONException When the given JSONObject can't be converted to a TimeTableElement + */ TimeTableElement(JSONObject jsonObject) throws JSONException { this.hour = jsonObject.getString("hour"); this.className = jsonObject.getString("class_name"); @@ -62,8 +82,12 @@ public TimeTableElement() { this.type = calcType(); } - // Returns the full name of a subject abbreviation - @SuppressLint("DefaultLocale") + /** + * Returns the full name to an sunject abbreviation + * + * @param subject An abbreviation subject string to be expanded to a full subject name + * @return Full subject name + */ private static String getFullSubject(String subject) { String pattern = "[0-9]+([a-zA-Z]+)[0-9]*"; String abbreviation; @@ -148,8 +172,11 @@ private static String getFullSubject(String subject) { } } - // Method to get the hour as integer value. - // Needed, because 'hour' can have values such as "1-2" which can't be converted to an integer + /** + * Calculates an integer value based on the hour String to be able to sort after the hour + * + * @return Integer value of the hour String + */ int getHour_I() { String hour = getHour(); try { @@ -195,6 +222,11 @@ public String getInfo() { return this.info; } + /** + * Performs some changes to the info string, to display it in the GUI. Returns the modified string. + * + * @return Optimized info string + */ public String getInfoForDisplay() { if ("! Raum".equals(info)) { return "Raumänderung"; @@ -224,7 +256,12 @@ boolean equals(TimeTableElement tte) { return getDiffAmount(tte) == 0; } - // Returns the number of differences between two elements + /** + * Calculates the number of differences of this and a given tte. + * + * @param tte Another TimeTableElement to be checked against + * @return Number of differences of two TimeTableElements + */ int getDiffAmount(TimeTableElement tte) { int diffs = 0; ArrayList list1 = getElementAsList(); @@ -238,11 +275,20 @@ int getDiffAmount(TimeTableElement tte) { return diffs; } - // Returns the TTE object as ArrayList + /** + * Generates an ArrayList of this TimeTableElement + * + * @return ArrayList with the data of this TimeTableElement + */ ArrayList getElementAsList() { return new ArrayList<>(Arrays.asList(hour, className, subject, newSubject, room, newRoom, info)); } + /** + * Calculates the type of this TimeTableElement, based on the newSubject and newRoom fields + * + * @return Type integer + */ private int calcType() { if (newSubject.equals("---") && newRoom.equals("---")) return CANCELLATION; @@ -250,11 +296,22 @@ private int calcType() { return SUBSTITUTION; } + /** + * Generates a string representation of this TimeTableElement + * + * @return String representation of this TimeTableElement + */ @Override public String toString() { return String.format("%s | %s | %s | %s | %s | %s | %s", hour, className, subject, newSubject, room, newRoom, info); } + /** + * Generates a JSONObject of this TimeTableElement + * + * @return JSONObject representation of this TimeTableElement + * @throws JSONException Thrown when the JSONObject coult not be generated + */ public JSONObject toJSON() throws JSONException { JSONObject jsonObject = new JSONObject(); From 2f9173e9a0ba43a7a1e4f48cdf07943396c1c7c5 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:27:29 +0100 Subject: [PATCH 20/47] TASK: Reformat if else code It was unnecessary to use the else, since we are returning if we execute the if part --- .../datamodel/TimeTableElement.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index 17681646..79ba9909 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -240,16 +240,20 @@ public String getInfoForDisplay() { } else { return info_e; } - } else if (type == CANCELLATION) { + } + + if (type == CANCELLATION) { return "Entfällt"; - } else if (type == SUBSTITUTION) { + } + + if (type == SUBSTITUTION) { if (!subject.equals(newSubject) && !newSubject.equals("---") && !newSubject.isEmpty()) { return String.format("%s - %s", this.newSubject, "Vertretung"); } else return "Vertretung"; - } else { - return this.newSubject; } + + return this.newSubject; } boolean equals(TimeTableElement tte) { From 0036a5a79bd59aea0d0f0972b84e4a29ade00eec Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:27:51 +0100 Subject: [PATCH 21/47] FIX: Add missing replace command --- .../de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index 79ba9909..fdffe745 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -93,6 +93,7 @@ private static String getFullSubject(String subject) { String abbreviation; if (subject.matches(pattern)) { + abbreviation = subject.replaceAll(pattern, "$1"); } else abbreviation = subject; From d3e5385f9421b8306d01ca125919b3e622d1f76a Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:27:59 +0100 Subject: [PATCH 22/47] TASK: More javadoc --- .../mggvertretungsplan/datamodel/TimeTableElement.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index fdffe745..8799a8e6 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -257,6 +257,12 @@ public String getInfoForDisplay() { return this.newSubject; } + /** + * Checks if this and a given tte are equal by comparing their fields. + * + * @param tte Another TimeTableElement to be checked for equality + * @return Boolean if both TimeTableElements are equal + */ boolean equals(TimeTableElement tte) { return getDiffAmount(tte) == 0; } From b393512a7e36751ec273d7c23719398d8cfa4640 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:28:10 +0100 Subject: [PATCH 23/47] TASK: Remove SuppressLint import --- .../aurora/mggvertretungsplan/datamodel/TimeTableElement.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index 8799a8e6..b21d48f1 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -1,7 +1,5 @@ package de.aurora.mggvertretungsplan.datamodel; -import android.annotation.SuppressLint; - import org.json.JSONException; import org.json.JSONObject; From 10ddf82216c9b191b6c9d8a2ce7e2b0dc7ff6f9e Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 15:31:30 +0100 Subject: [PATCH 24/47] TASK: Use default Locale --- .../aurora/mggvertretungsplan/datamodel/DateHeading.java | 2 +- .../de/aurora/mggvertretungsplan/datamodel/TimeTable.java | 2 +- .../aurora/mggvertretungsplan/datamodel/TimeTableDay.java | 8 ++++---- .../services/DownloadTimeTableWorker.java | 2 +- .../java/de/aurora/mggvertretungsplan/util/Logger.java | 4 ++-- .../mggvertretungsplan/datamodel/TimeTableDayTest.java | 6 +++--- .../mggvertretungsplan/datamodel/TimeTableTest.java | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/DateHeading.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/DateHeading.java index 8b3adf5f..b2b2bf25 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/DateHeading.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/DateHeading.java @@ -23,7 +23,7 @@ public DateHeading(Date date) { } public String getWholeDate() { - SimpleDateFormat wholeDate = new SimpleDateFormat("EEEE, dd.MM.yyyy", Locale.GERMANY); + SimpleDateFormat wholeDate = new SimpleDateFormat("EEEE, dd.MM.yyyy", Locale.getDefault()); return wholeDate.format(date); } diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java index 61c692bc..41a12b3f 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java @@ -117,7 +117,7 @@ public TimeTable getTotalDifferences(TimeTable savedTimeTable, String className) if (newDay) { int dayDiffs = ttd.getElementsCount(className); differencesTimeTable.addDay(ttd); - Logger.d(TAG, String.format(Locale.GERMANY,"New Day found - %d cancellations for %s", dayDiffs, className)); + Logger.d(TAG, String.format(Locale.getDefault(),"New Day found - %d cancellations for %s", dayDiffs, className)); } } diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index a6759dbe..f5ac995a 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -67,7 +67,7 @@ public TimeTableDay(JSONObject jsonObject) { public String getNotificationTitle(Context context) { String formatString = context.getString(R.string.notification_title_dateformat); - SimpleDateFormat sdf = new SimpleDateFormat(formatString, Locale.GERMANY); + SimpleDateFormat sdf = new SimpleDateFormat(formatString, Locale.getDefault()); return sdf.format(this.date); } @@ -129,7 +129,7 @@ public Date getDate() { } private void setDate(String date) { - SimpleDateFormat fullDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY); + SimpleDateFormat fullDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()); int currentYear = new GregorianCalendar().get(GregorianCalendar.YEAR); try { @@ -145,12 +145,12 @@ private void setDate(String date) { } public String getDateString() { - SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()); return dateFormat.format(date); } public String getFullDateString() { - SimpleDateFormat fullDateFormat = new SimpleDateFormat("EEEE, dd.MM.yyyy", Locale.GERMANY); + SimpleDateFormat fullDateFormat = new SimpleDateFormat("EEEE, dd.MM.yyyy", Locale.getDefault()); return fullDateFormat.format(date); } diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java index e6147dad..13be9024 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java @@ -95,7 +95,7 @@ public void onParsingComplete(TimeTable timeTable) { TimeTable diffTimeTable = timeTable.getTotalDifferences(timeTable_saved, class_name); int totalDiffs = diffTimeTable.getTotalCancellations(class_name); - Logger.d(TAG, String.format(Locale.GERMANY, "Total differences: %d", totalDiffs)); + Logger.d(TAG, String.format(Locale.getDefault(), "Total differences: %d", totalDiffs)); if (totalDiffs <= 0) { Logger.d(TAG, "Not sending a notification!"); diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java index 91a76ca6..6ee0988e 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java @@ -18,7 +18,7 @@ public class Logger { private static volatile Logger instance = null; private OutputStreamWriter streamWriter; private File logFile; - private SimpleDateFormat fullDateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS", Locale.GERMAN); + private SimpleDateFormat fullDateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS", Locale.getDefault()); public static Logger getInstance() { Logger localInstance = instance; @@ -36,7 +36,7 @@ public static Logger getInstance() { } public Logger() { - SimpleDateFormat dateFormat = new SimpleDateFormat("dd_MM_yyyy_HH_mm_ss", Locale.GERMANY); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd_MM_yyyy_HH_mm_ss", Locale.getDefault()); try { File sdCard = AppContext.applicationContext.getExternalFilesDir(null); diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java index 6f6e5791..74e905c5 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDayTest.java @@ -85,7 +85,7 @@ public void getDate() throws Exception { Calendar calendar = Calendar.getInstance(); calendar.set(2018, 0, 1); - SimpleDateFormat fullDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY); + SimpleDateFormat fullDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()); Date date = fullDateFormat.parse("01.01.2018"); TimeTableDay ttd = new TimeTableDay("01.01.2018", WEEK_A, testList); @@ -113,12 +113,12 @@ public void getDateString() { @Test public void getFullDateString() throws Exception { - SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()); Date date = dateFormat.parse("01.01.2018"); TimeTableDay ttd = new TimeTableDay("01.01.2018", WEEK_A, testList); - SimpleDateFormat fullDateFormat = new SimpleDateFormat("EEEE, dd.MM.yyyy", Locale.GERMANY); + SimpleDateFormat fullDateFormat = new SimpleDateFormat("EEEE, dd.MM.yyyy", Locale.getDefault()); assertEquals(fullDateFormat.format(date), ttd.getFullDateString()); } diff --git a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java index 3f321717..64e22c0f 100644 --- a/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java +++ b/app/src/test/java/de/aurora/mggvertretungsplan/datamodel/TimeTableTest.java @@ -60,7 +60,7 @@ public void testGetDaysCount() { } public void testGetFutureDaysCount() { - SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMANY); + SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.getDefault()); assertEquals(0, timeTable.getFutureDaysCount()); Calendar cal = Calendar.getInstance(); @@ -95,7 +95,7 @@ public void testGetFutureDaysCount() { assertEquals(2, timeTable.getFutureDaysCount()); // Check if a TimeTableDay on the same date is considered "future", if it is currently 15:59. - Calendar testCal = Calendar.getInstance(Locale.GERMANY); + Calendar testCal = Calendar.getInstance(Locale.getDefault()); testCal.set(Calendar.HOUR_OF_DAY,15); testCal.set(Calendar.MINUTE,59); testCal.set(Calendar.SECOND,0); From 7743d5d4f68aa20f035930f18b475ff42b236974 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 16:55:12 +0100 Subject: [PATCH 25/47] FIX: Don't use build in travis script, rather use assembleRelease --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5b1cdee6..829f219b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,7 +38,7 @@ before_install: script: - ./gradlew jacocoTestReport coveralls - - ./gradlew clean build + - ./gradlew clean assembleRelease deploy: provider: releases From 976f44749b1436c53cc0cea1689aedce49bb7e6a Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 17:02:09 +0100 Subject: [PATCH 26/47] FIX: Travis locale The build failed since the tests were checking for a string obtained from the german locale --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 829f219b..746eaec3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ env: - ANDROID_API=28 - EMULATOR_API=28 - ANDROID_BUILD_TOOLS=28.0.3 + - LC_ALL=de_DE android: components: From 7e290d9b7edec875ebe1395acde73d60280f6305 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 17:48:56 +0100 Subject: [PATCH 27/47] FIX: Another try to fix missing locale --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 746eaec3..687614ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,12 @@ android: - 'intel-android-extra-license-.+' - '.*' +addons: + apt: + packages: + - language-pack-en + - language-pack-de + notifications: email: false From bcf04144cd87b6462a94469342914e362d3d70d6 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 13 Jan 2019 18:02:10 +0100 Subject: [PATCH 28/47] FIX: Next try to clean up locale --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 687614ca..8511735d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ env: - ANDROID_API=28 - EMULATOR_API=28 - ANDROID_BUILD_TOOLS=28.0.3 - - LC_ALL=de_DE + - LC_ALL='de_DE.UTF-8' android: components: @@ -25,7 +25,6 @@ android: addons: apt: packages: - - language-pack-en - language-pack-de notifications: From 0a1346ea31d9086924ec5136aa994bd46cc0aaa3 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 20 Jan 2019 23:55:54 +0100 Subject: [PATCH 29/47] TASK: Update gradle --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index eb624524..e3fab0be 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.3.0' classpath 'org.jacoco:org.jacoco.core:0.8.2' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index eb400fb5..babf0c8a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Sep 30 23:50:08 CEST 2018 +#Sun Jan 20 18:46:43 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip From 74c33fbe5545f76a2730f2e8d66a07b2515597a2 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 10 Feb 2019 23:24:17 +0100 Subject: [PATCH 30/47] FEATURE: Add "active" propertie to TTE --- .../datamodel/TimeTableElement.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index b21d48f1..34905ab6 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -26,6 +26,7 @@ public class TimeTableElement { private final String newRoom; private final int type; private final String info; + private boolean active; /** * Create an empty TimeTableElement @@ -39,6 +40,7 @@ public TimeTableElement() { newRoom = ""; type = EMPTY; info = ""; + active = false; } /** @@ -52,7 +54,24 @@ public TimeTableElement() { * @param newRoom New room (in case of substitution) as String * @param info String adding additional information to the */ + @Deprecated TimeTableElement(String hour, String className, String subject, String newSubject, String room, String newRoom, String info) { + this(hour, className, subject, newSubject, room, newRoom, info, true); + } + + /** + * Create TimeTableElement by providing all the single data fields + * + * @param hour String describing the hour on which the element takes place + * @param className Name of the class as String + * @param subject Subject as String + * @param newSubject New subject (in case of substitution) as String + * @param room Room as String + * @param newRoom New room (in case of substitution) as String + * @param info String adding additional information to the + * @param active Indicator if this element is still active or if it has been removed + */ + TimeTableElement(String hour, String className, String subject, String newSubject, String room, String newRoom, String info, boolean active) { this.hour = hour.replace(" - ", "-"); this.className = className; this.subject = getFullSubject(subject); @@ -61,6 +80,7 @@ public TimeTableElement() { this.newRoom = (newRoom.isEmpty() ? "---" : newRoom); this.type = calcType(); this.info = info.trim(); + this.active = active; } /** @@ -171,6 +191,19 @@ private static String getFullSubject(String subject) { } } + /** + * Method to determine if a certain element is active and hasn't been removed from the TimeTable + * + * @return boolean, if an element is still active + */ + public boolean isActive() { + return this.active; + } + + public void setActive(boolean active) { + this.active = active; + } + /** * Calculates an integer value based on the hour String to be able to sort after the hour * From fb0d771436d230cf60e5d9c1917ca8b4603adcca Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 10 Feb 2019 23:25:02 +0100 Subject: [PATCH 31/47] FEATURE: Implement method to get new TTD with elements from a single class --- .../de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index f5ac995a..f07078a4 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -154,6 +154,10 @@ public String getFullDateString() { return fullDateFormat.format(date); } + public TimeTableDay getTTDbyClass(String className) { + return new TimeTableDay(this.date, this.week, this.getElements(className)); + } + public ArrayList getElements(String className) { ArrayList elementsOfClass = new ArrayList<>(); Grade grade = new Grade(className); From e168aea2465a0ed5d6918cf65931f6f6dbaff704 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 10 Feb 2019 23:28:29 +0100 Subject: [PATCH 32/47] TASK: Update mechanism to remove similar items --- .../datamodel/TimeTableDay.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index f07078a4..ac4e3541 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -195,6 +195,12 @@ public int getElementsCount(String className) { return getElements(className).size(); } + /** + * Calculates the differences between two TimeTableDays + * @param ttd The old/saved Timetable to be compared against + * @param className The name of the class to search for + * @return New TimeTableDay containing only the new elements for a certain class + */ TimeTableDay getDifferences(TimeTableDay ttd, String className) { ArrayList savedElements = ttd.getElements(className); ArrayList newElements = this.getElements(className); @@ -215,15 +221,12 @@ TimeTableDay getDifferences(TimeTableDay ttd, String className) { } // Remove similar elements, which are contained in both lists - for (int i = 0; i < newElements.size(); i++) { - TimeTableElement element1 = newElements.get(i); - for (int j = 0; j < savedElements.size(); j++) { - TimeTableElement element2 = savedElements.get(j); - - if (element1.getDiffAmount(element2) == 1) { + for (TimeTableElement tte1: newElements) { + for (TimeTableElement tte2: savedElements) { + if (tte1.getDiffAmount(tte2) == 1) { // This else part catches elements where only one part (hour, subject, etc.) has changed // Without it, every *change* of an existing element would be counted twice - savedElements.remove(j); + savedElements.remove(tte2); break; } } @@ -232,9 +235,7 @@ TimeTableDay getDifferences(TimeTableDay ttd, String className) { // savedElements now contains only those elements which are no longer in the TimeTable // newElements now only contains those elements which are new (not saved yet) or have changed in a single part savedElements.addAll(newElements); - ArrayList tmp = savedElements; - - return new TimeTableDay(date, week, tmp); + return new TimeTableDay(date, week, savedElements); } // Checks if this and the given day are at the same date From 8f98df7d27c112f61180869dbfa7c9890b8d5f8d Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 10 Feb 2019 23:29:30 +0100 Subject: [PATCH 33/47] FIX: Mark old TTEs as inactive --- .../aurora/mggvertretungsplan/datamodel/TimeTableDay.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java index ac4e3541..4c38150f 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableDay.java @@ -232,7 +232,12 @@ TimeTableDay getDifferences(TimeTableDay ttd, String className) { } } - // savedElements now contains only those elements which are no longer in the TimeTable + // Set the elements, which are no longer in the TimeTableDay to inactive, so they can be notified as "removed" + for (TimeTableElement tte: savedElements) { + tte.setActive(false); + } + + // savedElements now contains only those elements which are no longer in the TimeTableDay // newElements now only contains those elements which are new (not saved yet) or have changed in a single part savedElements.addAll(newElements); return new TimeTableDay(date, week, savedElements); From 3cd6521bdb0e7aba692833d937003a89a4251496 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 10 Feb 2019 23:36:51 +0100 Subject: [PATCH 34/47] FIX: Only adding TTEs with certain class --- .../java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java index 41a12b3f..2fbb5da8 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java @@ -116,7 +116,8 @@ public TimeTable getTotalDifferences(TimeTable savedTimeTable, String className) if (newDay) { int dayDiffs = ttd.getElementsCount(className); - differencesTimeTable.addDay(ttd); + + differencesTimeTable.addDay(ttd.getTTDbyClass(className)); Logger.d(TAG, String.format(Locale.getDefault(),"New Day found - %d cancellations for %s", dayDiffs, className)); } } From 089b838bcc1b0190d9efaa5e367521ec1500a98c Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 15 Feb 2019 02:08:09 +0100 Subject: [PATCH 35/47] FIX: Only notify non-empty days --- .../services/DownloadTimeTableWorker.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java index 13be9024..c55746f2 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java @@ -104,8 +104,10 @@ public void onParsingComplete(TimeTable timeTable) { if (sp.getBoolean("show_detailed_notifications", true)) { for (TimeTableDay ttd : diffTimeTable.getAllDays()) { - Logger.d(TAG, "Notifying user"); - notificationHelper.notifyChange(ttd); + if (ttd.getElementsCount(class_name) > 0) { + Logger.d(TAG, "Notifying user"); + notificationHelper.notifyChange(ttd); + } } } else { Context context = getApplicationContext(); From 657837fc5f957d00aa063f1429914c96344c3d5f Mon Sep 17 00:00:00 2001 From: Rico Date: Fri, 15 Feb 2019 02:08:17 +0100 Subject: [PATCH 36/47] TASK: Add comments --- .../mggvertretungsplan/services/DownloadTimeTableWorker.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java index c55746f2..93d86bdf 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/services/DownloadTimeTableWorker.java @@ -103,6 +103,7 @@ public void onParsingComplete(TimeTable timeTable) { } if (sp.getBoolean("show_detailed_notifications", true)) { + // If the user wants beautiful, daily seperated notifications -> Notify indivitually for (TimeTableDay ttd : diffTimeTable.getAllDays()) { if (ttd.getElementsCount(class_name) > 0) { Logger.d(TAG, "Notifying user"); @@ -110,6 +111,7 @@ public void onParsingComplete(TimeTable timeTable) { } } } else { + // If the user does not want detailed notifications -> Notify about total number of changes Context context = getApplicationContext(); String ticker = context.getResources().getString(R.string.notification_cancellations_ticker); String title = context.getResources().getString(R.string.notification_cancellations_title); From 2625045ebc5751bb938837731c57a2d1f442d9fd Mon Sep 17 00:00:00 2001 From: Rico Date: Mon, 24 Jun 2019 23:04:24 +0200 Subject: [PATCH 37/47] TASK: Update gradle --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index e3fab0be..c29ad695 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.4.1' classpath 'org.jacoco:org.jacoco.core:0.8.2' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index babf0c8a..0826e420 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Jan 20 18:46:43 CET 2019 +#Mon Jun 24 17:50:20 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip From 85722fa349a773e89e39f77a21e5eccb24354bbb Mon Sep 17 00:00:00 2001 From: Rico Date: Tue, 25 Jun 2019 19:11:01 +0200 Subject: [PATCH 38/47] TASK: Check if building a tag before building release apk On the one hand this saves time, on the other hand this should fix an issue when buildung pull requests due to encrypted env variables. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8511735d..f472a7cf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,11 +40,11 @@ cache: - $HOME/.android/build-cache before_install: - - openssl aes-256-cbc -K $encrypted_6ab911f61ce6_key -iv $encrypted_6ab911f61ce6_iv -in keystore.ks.enc -out keystore.ks -d + - 'if [ -n "$TRAVIS_TAG" ]; then openssl aes-256-cbc -K $encrypted_6ab911f61ce6_key -iv $encrypted_6ab911f61ce6_iv -in keystore.ks.enc -out keystore.ks -d; else echo "Not building a tagged commit! Skipping decrypting!"; fi' script: - ./gradlew jacocoTestReport coveralls - - ./gradlew clean assembleRelease + - 'if [ -n "$TRAVIS_TAG" ]; then ./gradlew clean assembleRelease; else echo "Not building a tagged commit! Skipping building release apk!"; fi' deploy: provider: releases From 57120958c66495c6cf32bc25c54a802f27302014 Mon Sep 17 00:00:00 2001 From: Rico Date: Tue, 25 Jun 2019 19:11:44 +0200 Subject: [PATCH 39/47] TASK: Add comment about possible bug --- .../java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java index 2fbb5da8..2ea2b6d0 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java @@ -118,6 +118,7 @@ public TimeTable getTotalDifferences(TimeTable savedTimeTable, String className) int dayDiffs = ttd.getElementsCount(className); differencesTimeTable.addDay(ttd.getTTDbyClass(className)); + //TODO Bug - ALL elements are added regardless of the class Logger.d(TAG, String.format(Locale.getDefault(),"New Day found - %d cancellations for %s", dayDiffs, className)); } } From beaaf2f7015765e714edf383993dee6cc1fabf8d Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 2 Feb 2020 22:07:56 +0100 Subject: [PATCH 40/47] fix: reverse string comparison order This is done to prevent NullPointers --- .../aurora/mggvertretungsplan/datamodel/TimeTableElement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index 98ec93d2..678ff87e 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -115,7 +115,7 @@ private static String getFullSubject(String subject) { } else abbreviation = subject; - if (abbreviation.equals("")) { + if ("".equals(abbreviation)) { return "Kein Fach"; } else { switch (abbreviation.toUpperCase(Locale.getDefault())) { From 3d743ed3616a0e24e3174d7033b79dff5636e5b6 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 2 Feb 2020 22:21:33 +0100 Subject: [PATCH 41/47] fix: add spo as abbreviation for sports --- .../de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java index 678ff87e..8e206bd4 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTableElement.java @@ -156,6 +156,7 @@ private static String getFullSubject(String subject) { case "MU": return "Musik"; case "SP": + case "SPO": return "Sport"; case "SW": return "Sport weibl."; From 67b7dcc709ca521ebcf7d9bd03b6346abca23fe8 Mon Sep 17 00:00:00 2001 From: Rico Date: Sun, 2 Feb 2020 23:06:08 +0100 Subject: [PATCH 42/47] fix: use proper date format --- app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java index 6ee0988e..f5ac31a8 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java @@ -36,7 +36,7 @@ public static Logger getInstance() { } public Logger() { - SimpleDateFormat dateFormat = new SimpleDateFormat("dd_MM_yyyy_HH_mm_ss", Locale.getDefault()); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.getDefault()); try { File sdCard = AppContext.applicationContext.getExternalFilesDir(null); From a3059213921de69cff8eaf358a8a54f93ad78d21 Mon Sep 17 00:00:00 2001 From: Rico Date: Mon, 3 Feb 2020 00:24:37 +0100 Subject: [PATCH 43/47] chore(dependencies): update packages and gradle --- app/build.gradle | 12 ++++++------ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0f61fda2..b5f186f8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,16 +78,16 @@ dependencies { testImplementation 'org.mockito:mockito-core:2.8.47' // Support libraries - implementation 'com.google.android.material:material:1.1.0-alpha02' + implementation 'com.google.android.material:material:1.1.0-rc02' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.appcompat:appcompat:1.1.0-alpha01' - implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha01' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.preference:preference:1.1.0-alpha02' + implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.browser:browser:1.0.0' - implementation 'androidx.core:core:1.1.0-alpha03' + implementation 'androidx.core:core:1.2.0-rc01' - implementation "android.arch.work:work-runtime:1.0.0-beta01" + implementation "android.arch.work:work-runtime:1.0.1" // Other libraries implementation 'org.jsoup:jsoup:1.10.2' diff --git a/build.gradle b/build.gradle index c29ad695..feda5dd7 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.3' classpath 'org.jacoco:org.jacoco.core:0.8.2' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.2' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0826e420..0f50581c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jun 24 17:50:20 CEST 2019 +#Tue Oct 29 13:04:04 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip From f2467c69d219c81567399fc8cb3044263ed84dbe Mon Sep 17 00:00:00 2001 From: Rico Date: Mon, 3 Feb 2020 00:25:27 +0100 Subject: [PATCH 44/47] fix(logging): make sure logging is disabled for now --- app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/preferences_main.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 68461e36..982498c6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,7 +57,7 @@ Wähle die Farbe der App - Logging + Logging (derzeit deaktiviert) Aufzeichnen von Protokolldaten aktivieren entfällt diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml index e4de07a5..024dec16 100644 --- a/app/src/main/res/xml/preferences_main.xml +++ b/app/src/main/res/xml/preferences_main.xml @@ -64,6 +64,7 @@ From 6f878cc65905a9cd37e1754dbd8f4124a56c1aa2 Mon Sep 17 00:00:00 2001 From: Rico Date: Mon, 3 Feb 2020 00:26:18 +0100 Subject: [PATCH 45/47] fix(logging): better separation of code --- .../mggvertretungsplan/util/Logger.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java index f5ac31a8..df7d9459 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java @@ -51,7 +51,6 @@ public Logger() { logFile = new File(dir, dateFormat.format(System.currentTimeMillis()) + ".txt"); Log.v(TAG, logFile.toString()); boolean res = logFile.createNewFile(); - Log.e(TAG, "Hi" + String.valueOf(res)); FileOutputStream stream = new FileOutputStream(logFile); streamWriter = new OutputStreamWriter(stream); @@ -67,7 +66,6 @@ public static void sendLogs() { } public static void deleteLogs() { - Logger logger = getInstance(); File sdCard = AppContext.applicationContext.getExternalFilesDir(null); if (sdCard == null) { @@ -119,21 +117,23 @@ public static void wtf(final String tag, final String message) { writeLog("WTF", tag, message); } + private void writeLog(String data) { + try { + this.streamWriter.write(data); + } catch (Exception e) { + Log.e(TAG, e.getMessage()); + } + } + private static void writeLog(final String level, final String tag, final String message) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(AppContext.applicationContext); - Boolean logToFile = sp.getBoolean("logToFile", false); + boolean logToFile = sp.getBoolean("logToFile", false); if (!logToFile) return; Logger logger = getInstance(); String timestamp = logger.fullDateFormat.format(System.currentTimeMillis()); - - try { - logger.streamWriter.write(String.format("%s - %s/%s - %s\n", timestamp, level, tag, message)); - logger.streamWriter.flush(); - } catch (Exception e) { - Log.e(TAG, e.getMessage()); - } + logger.writeLog(String.format("%s - %s/%s - %s\n", timestamp, level, tag, message)); } } From e2a4e0e79d4323bb0b0dd384dfaaa489f6c5216b Mon Sep 17 00:00:00 2001 From: Rico Date: Mon, 3 Feb 2020 00:26:36 +0100 Subject: [PATCH 46/47] fix(logging): use superior date format --- app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java index df7d9459..b277b9cc 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/util/Logger.java @@ -18,7 +18,7 @@ public class Logger { private static volatile Logger instance = null; private OutputStreamWriter streamWriter; private File logFile; - private SimpleDateFormat fullDateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS", Locale.getDefault()); + public SimpleDateFormat fullDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS", Locale.getDefault()); public static Logger getInstance() { Logger localInstance = instance; From 4563f23a2cd90d9b5a15074c86595aed1b9d4603 Mon Sep 17 00:00:00 2001 From: Rico Date: Mon, 3 Feb 2020 00:27:04 +0100 Subject: [PATCH 47/47] fix(logging): add text to better identify log messages --- .../de/aurora/mggvertretungsplan/datamodel/TimeTable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java index f3137170..602c7cb9 100644 --- a/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java +++ b/app/src/main/java/de/aurora/mggvertretungsplan/datamodel/TimeTable.java @@ -106,8 +106,8 @@ public TimeTable getTotalDifferences(TimeTable savedTimeTable, String className) for (TimeTableDay saved_ttd : savedDays) { if (ttd.isSameDay(saved_ttd)) { Logger.d(TAG, String.format("Dates are the same - %s | %s", ttd.getDateString(), saved_ttd.getDateString())); - Logger.d(TAG, String.format("%s", ttd.getElements(className).toString())); - Logger.d(TAG, String.format("%s", saved_ttd.getElements(className).toString())); + Logger.d(TAG, String.format("New TTD : %s", ttd.getElements(className).toString())); + Logger.d(TAG, String.format("Stored TTD: %s", saved_ttd.getElements(className).toString())); differencesTimeTable.addDay(ttd.getDifferences(saved_ttd, className)); newDay = false; break;