From afdc02f2a4a40a46fa6d2d7d666ba5b7dcd83dbb Mon Sep 17 00:00:00 2001
From: Pupsi28 <larslukasneuhaus@gmx.de>
Date: Sat, 30 Mar 2024 18:26:33 +0100
Subject: [PATCH] added connected double lessons with own setting

---
 lib/storage/timetable/timetableSettings.dart  |  4 ++-
 .../timetable/timetableSettings.g.dart        |  8 +++--
 lib/view/pages/timetable/timetable.dart       | 36 ++++++++++++++++++-
 lib/view/settings/defaultSettings.dart        |  4 ++-
 lib/view/settings/settings.dart               | 13 +++++++
 5 files changed, 60 insertions(+), 5 deletions(-)

diff --git a/lib/storage/timetable/timetableSettings.dart b/lib/storage/timetable/timetableSettings.dart
index 69d0729..cd1098d 100644
--- a/lib/storage/timetable/timetableSettings.dart
+++ b/lib/storage/timetable/timetableSettings.dart
@@ -4,7 +4,9 @@ part 'timetableSettings.g.dart';
 
 @JsonSerializable()
 class TimetableSettings {
-  TimetableSettings();
+  bool connectDoubleLessons;
+
+  TimetableSettings({required this.connectDoubleLessons});
 
   factory TimetableSettings.fromJson(Map<String, dynamic> json) => _$TimetableSettingsFromJson(json);
   Map<String, dynamic> toJson() => _$TimetableSettingsToJson(this);
diff --git a/lib/storage/timetable/timetableSettings.g.dart b/lib/storage/timetable/timetableSettings.g.dart
index 03f2db8..29c7e48 100644
--- a/lib/storage/timetable/timetableSettings.g.dart
+++ b/lib/storage/timetable/timetableSettings.g.dart
@@ -7,7 +7,11 @@ part of 'timetableSettings.dart';
 // **************************************************************************
 
 TimetableSettings _$TimetableSettingsFromJson(Map<String, dynamic> json) =>
-    TimetableSettings();
+    TimetableSettings(
+      connectDoubleLessons: json['connectDoubleLessons'] as bool,
+    );
 
 Map<String, dynamic> _$TimetableSettingsToJson(TimetableSettings instance) =>
-    <String, dynamic>{};
+    <String, dynamic>{
+      'connectDoubleLessons': instance.connectDoubleLessons,
+    };
diff --git a/lib/view/pages/timetable/timetable.dart b/lib/view/pages/timetable/timetable.dart
index d0c9614..58e93c2 100644
--- a/lib/view/pages/timetable/timetable.dart
+++ b/lib/view/pages/timetable/timetable.dart
@@ -243,9 +243,43 @@ class _TimetableState extends State<Timetable> {
     ];
   }
 
+  List<GetTimetableResponseObject> _removeDuplicates(TimetableProps data, Duration maxTimeBetweenDouble) {
+
+    List<GetTimetableResponseObject> timetableList = data.getTimetableResponse.result.toList();
+
+    if(timetableList.isEmpty){ return timetableList; }
+
+    timetableList.sort((a, b) => _parseWebuntisTimestamp(a.date, a.startTime).compareTo(_parseWebuntisTimestamp(b.date, b.startTime)));
+
+    GetTimetableResponseObject previousElement = timetableList.first;
+    for (var i = 1; i < timetableList.length; i++) {
+      GetTimetableResponseObject currentElement = timetableList.elementAt(i);
+
+      bool isSameSubject() => (currentElement.su.firstOrNull?.id ?? 1) == (previousElement.su.firstOrNull?.id ?? 2);
+      bool isNotSeparated() => _parseWebuntisTimestamp(previousElement.date, previousElement.endTime).add(maxTimeBetweenDouble).add(const Duration(seconds: 1))
+          .isAfter(_parseWebuntisTimestamp(currentElement.date, currentElement.startTime));
+
+      if(isSameSubject() && isNotSeparated()){
+        previousElement.endTime = currentElement.endTime;
+        timetableList.remove(currentElement);
+        i--;
+      }else{
+        previousElement = currentElement;
+      }
+    }
+
+    return timetableList;
+  }
+
   TimetableEvents _buildTableEvents(TimetableProps data) {
 
-    List<Appointment> appointments = data.getTimetableResponse.result.map((element) {
+    List<GetTimetableResponseObject> timetableList = data.getTimetableResponse.result.toList();
+
+    if(settings.val().timetableSettings.connectDoubleLessons){
+      timetableList = _removeDuplicates(data, const Duration(minutes: 5));
+    }
+
+    List<Appointment> appointments = timetableList.map((element) {
 
       GetRoomsResponse rooms = data.getRoomsResponse;
       GetSubjectsResponse subjects = data.getSubjectsResponse;
diff --git a/lib/view/settings/defaultSettings.dart b/lib/view/settings/defaultSettings.dart
index 1b99f8d..e26034e 100644
--- a/lib/view/settings/defaultSettings.dart
+++ b/lib/view/settings/defaultSettings.dart
@@ -22,7 +22,9 @@ class DefaultSettings {
           askedForPreferredGradeSystem: false,
           inputs: []
       ),
-      timetableSettings: TimetableSettings(),
+      timetableSettings: TimetableSettings(
+        connectDoubleLessons: false,
+      ),
       talkSettings: TalkSettings(
         sortFavoritesToTop: true,
         sortUnreadToTop: false,
diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart
index ecdacd8..7d546e8 100644
--- a/lib/view/settings/settings.dart
+++ b/lib/view/settings/settings.dart
@@ -98,6 +98,19 @@ class _SettingsState extends State<Settings> {
 
             const Divider(),
 
+            ListTile(
+              leading: const Icon(Icons.calendar_view_day_outlined),
+              title: const Text("Doppelstunden als eine Stunde anzeigen"),
+              trailing: Checkbox(
+                value: settings.val().timetableSettings.connectDoubleLessons,
+                onChanged: (e) {
+                  settings.val(write: true).timetableSettings.connectDoubleLessons = e!;
+                },
+              ),
+            ),
+
+            const Divider(),
+
             ListTile(
               leading: const Icon(Icons.star_border),
               title: const Text("Favoriten im Talk nach oben sortieren"),