diff --git a/lib/extensions/dateTime.dart b/lib/extensions/dateTime.dart index 5ae297c..ebfda66 100644 --- a/lib/extensions/dateTime.dart +++ b/lib/extensions/dateTime.dart @@ -16,4 +16,15 @@ extension IsSameDay on DateTime { TimeOfDay toTimeOfDay() { return TimeOfDay(hour: hour, minute: minute); } + + bool isSameDateTime(DateTime other) { + bool isSameDay = this.isSameDay(other); + bool isSameTimeOfDay = (toTimeOfDay() == other.toTimeOfDay()); + + return isSameDay && isSameTimeOfDay; + } + + bool isSameOrAfter(DateTime other) { + return isSameDateTime(other) || isAfter(other); + } } \ No newline at end of file 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 json) => _$TimetableSettingsFromJson(json); Map 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 json) => - TimetableSettings(); + TimetableSettings( + connectDoubleLessons: json['connectDoubleLessons'] as bool, + ); Map _$TimetableSettingsToJson(TimetableSettings instance) => - {}; + { + 'connectDoubleLessons': instance.connectDoubleLessons, + }; diff --git a/lib/view/pages/timetable/timetable.dart b/lib/view/pages/timetable/timetable.dart index b3b7034..0475af6 100644 --- a/lib/view/pages/timetable/timetable.dart +++ b/lib/view/pages/timetable/timetable.dart @@ -244,9 +244,66 @@ class _TimetableState extends State { ]; } + List _removeDuplicates(TimetableProps data, Duration maxTimeBetweenDouble) { + + List 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 isSameLesson() { + int? currentSubjectId = currentElement.su.firstOrNull?.id; + int? previousSubjectId = previousElement.su.firstOrNull?.id; + + if(currentSubjectId == null || previousSubjectId == null || currentSubjectId != previousSubjectId) return false; + + int? currentRoomId = currentElement.ro.firstOrNull?.id; + int? previousRoomId = previousElement.ro.firstOrNull?.id; + + if(currentRoomId != previousRoomId) return false; + + int? currentTeacherId = currentElement.te.firstOrNull?.id; + int? previousTeacherId = previousElement.te.firstOrNull?.id; + + if(currentTeacherId != previousTeacherId) return false; + + String? currentStatusCode = currentElement.code; + String? previousStatusCode = previousElement.code; + + if(currentStatusCode != previousStatusCode) return false; + + return true; + } + + bool isNotSeparated() => _parseWebuntisTimestamp(previousElement.date, previousElement.endTime).add(maxTimeBetweenDouble) + .isSameOrAfter(_parseWebuntisTimestamp(currentElement.date, currentElement.startTime)); + + if(isSameLesson() && isNotSeparated()) { + previousElement.endTime = currentElement.endTime; + timetableList.remove(currentElement); + i--; + } else { + previousElement = currentElement; + } + } + + return timetableList; + } + TimetableEvents _buildTableEvents(TimetableProps data) { - List appointments = data.getTimetableResponse.result.map((element) { + List timetableList = data.getTimetableResponse.result.toList(); + + if(settings.val().timetableSettings.connectDoubleLessons) { + timetableList = _removeDuplicates(data, const Duration(minutes: 5)); + } + + List 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 debfe18..311da12 100644 --- a/lib/view/settings/defaultSettings.dart +++ b/lib/view/settings/defaultSettings.dart @@ -23,7 +23,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 a929011..fc3473a 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -8,6 +8,7 @@ import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../model/accountData.dart'; +import '../../model/timetable/timetableProps.dart'; import '../../notification/notifyUpdater.dart'; import '../../storage/base/settingsProvider.dart'; import '../../theming/appTheme.dart'; @@ -98,6 +99,20 @@ class _SettingsState extends State { const Divider(), + ListTile( + leading: const Icon(Icons.calendar_view_day_outlined), + title: const Text('Doppelstunden zusammenhängend anzeigen'), + trailing: Checkbox( + value: settings.val().timetableSettings.connectDoubleLessons, + onChanged: (e) { + settings.val(write: true).timetableSettings.connectDoubleLessons = e!; + Provider.of(context, listen: false).run(renew: false); + }, + ), + ), + + const Divider(), + ListTile( leading: const Icon(Icons.star_border), title: const Text('Favoriten im Talk nach oben sortieren'),