From 2b6dc8e3e6fccca4eebf96db715f8b993ec34e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Wed, 15 Feb 2023 20:33:05 +0100 Subject: [PATCH] Implement Webuntis HTTP Api and Display --- .idea/libraries/Dart_Packages.xml | 500 ++++++++++-------- .idea/libraries/Flutter_Plugins.xml | 36 +- lib/api/requestCache.dart | 32 ++ .../queries/getRooms/getRoomsCache.dart | 23 + .../queries/getRooms/getRoomsResponse.dart | 2 +- .../queries/getRooms/getRoomsResponse.g.dart | 2 +- .../queries/getSubjects/getSubjects.dart | 16 + .../queries/getSubjects/getSubjectsCache.dart | 23 + .../getSubjects/getSubjectsResponse.dart | 28 + .../getSubjects/getSubjectsResponse.g.dart | 41 ++ .../queries/getTimetable/getTimetable.dart | 1 - .../getTimetable/getTimetableCache.dart | 40 ++ lib/api/webuntis/webuntisApi.dart | 1 - lib/app.dart | 6 +- lib/data/dataHolder.dart | 11 + lib/data/timetable/persistantTimetable.dart | 12 + lib/data/timetable/timetable.dart | 60 +++ lib/{data => dataOld}/accountModel.dart | 0 lib/{data => dataOld}/incomingPacket.dart | 2 +- .../incommingPackets/authenticatePacket.dart | 3 +- .../incommingPackets/errorPacket.dart | 3 +- .../incommingPackets/fileListPacket.dart | 2 +- .../incommingPackets/serverInfoPacket.dart | 1 - .../incommingPackets/talkChatPacket.dart | 3 +- .../incommingPackets/talkContactsPacket.dart | 3 +- .../talkNotificationsPacket.dart | 3 +- .../incommingPackets/timetablePacket.dart | 1 - lib/{data => dataOld}/outgoingPacket.dart | 3 +- .../talkContactsAskPacket.dart | 3 +- lib/{data => dataOld}/socketConnection.dart | 0 lib/main.dart | 31 +- lib/screen/login/login.dart | 3 +- lib/screen/pages/files/files.dart | 3 +- lib/screen/pages/talk/chatOverview.dart | 4 +- lib/screen/pages/talk/chatView.dart | 3 +- .../pages/timetable/storedTimetable.dart | 104 ++++ lib/screen/pages/timetable/testTimetable.dart | 7 +- lib/screen/pages/timetable/timetable.dart | 3 +- lib/screen/settings/settings.dart | 4 +- lib/widget/loadingPacket.dart | 3 +- macos/Flutter/GeneratedPluginRegistrant.swift | 4 + pubspec.yaml | 3 + 42 files changed, 746 insertions(+), 287 deletions(-) create mode 100644 lib/api/requestCache.dart create mode 100644 lib/api/webuntis/queries/getRooms/getRoomsCache.dart create mode 100644 lib/api/webuntis/queries/getSubjects/getSubjects.dart create mode 100644 lib/api/webuntis/queries/getSubjects/getSubjectsCache.dart create mode 100644 lib/api/webuntis/queries/getSubjects/getSubjectsResponse.dart create mode 100644 lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart create mode 100644 lib/api/webuntis/queries/getTimetable/getTimetableCache.dart create mode 100644 lib/data/dataHolder.dart create mode 100644 lib/data/timetable/persistantTimetable.dart create mode 100644 lib/data/timetable/timetable.dart rename lib/{data => dataOld}/accountModel.dart (100%) rename lib/{data => dataOld}/incomingPacket.dart (94%) rename lib/{data => dataOld}/incommingPackets/authenticatePacket.dart (87%) rename lib/{data => dataOld}/incommingPackets/errorPacket.dart (87%) rename lib/{data => dataOld}/incommingPackets/fileListPacket.dart (91%) rename lib/{data => dataOld}/incommingPackets/serverInfoPacket.dart (91%) rename lib/{data => dataOld}/incommingPackets/talkChatPacket.dart (91%) rename lib/{data => dataOld}/incommingPackets/talkContactsPacket.dart (95%) rename lib/{data => dataOld}/incommingPackets/talkNotificationsPacket.dart (79%) rename lib/{data => dataOld}/incommingPackets/timetablePacket.dart (96%) rename lib/{data => dataOld}/outgoingPacket.dart (78%) rename lib/{data => dataOld}/outgoingPackets/talkContactsAskPacket.dart (69%) rename lib/{data => dataOld}/socketConnection.dart (100%) create mode 100644 lib/screen/pages/timetable/storedTimetable.dart diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 97f306b..307aa47 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -5,224 +5,224 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -236,21 +236,21 @@ - - - @@ -271,329 +271,357 @@ - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -607,320 +635,348 @@ - - - + + + + + + + + + + + + - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml index 3e1b5a3..0ed35db 100644 --- a/.idea/libraries/Flutter_Plugins.xml +++ b/.idea/libraries/Flutter_Plugins.xml @@ -1,22 +1,26 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/lib/api/requestCache.dart b/lib/api/requestCache.dart new file mode 100644 index 0000000..5e716bb --- /dev/null +++ b/lib/api/requestCache.dart @@ -0,0 +1,32 @@ +import 'dart:convert'; + +import 'package:localstore/localstore.dart'; + +abstract class RequestCache { + int maxCacheTime; + Function(T) onUpdate; + + RequestCache(this.maxCacheTime, this.onUpdate); + + void start(String file, String document) async { + Map? tableData = await Localstore.instance.collection(file).doc(document).get(); + if(tableData != null) { + onUpdate(onLocalData(tableData['json'])); + } + + if(DateTime.now().millisecondsSinceEpoch - (maxCacheTime * 1000) < (tableData?['lastupdate'] ?? 0)) { + return; + } + + T newValue = await onLoad(); + onUpdate(newValue); + + Localstore.instance.collection(file).doc(document).set({ + "json": jsonEncode(newValue), + "lastupdate": DateTime.now().millisecondsSinceEpoch + }); + } + + T onLocalData(String json); + Future onLoad(); +} \ No newline at end of file diff --git a/lib/api/webuntis/queries/getRooms/getRoomsCache.dart b/lib/api/webuntis/queries/getRooms/getRoomsCache.dart new file mode 100644 index 0000000..1104637 --- /dev/null +++ b/lib/api/webuntis/queries/getRooms/getRoomsCache.dart @@ -0,0 +1,23 @@ +import 'dart:convert'; + +import 'package:marianum_mobile/api/requestCache.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.dart'; + +import 'getRooms.dart'; + +class GetRoomsCache extends RequestCache { + GetRoomsCache({onUpdate}) : super(60 * 60, onUpdate) { + start("rooms", "data"); + } + + @override + Future onLoad() { + return GetRooms().run(); + } + + @override + GetRoomsResponse onLocalData(String json) { + return GetRoomsResponse.fromJson(jsonDecode(json)); + } + +} \ No newline at end of file diff --git a/lib/api/webuntis/queries/getRooms/getRoomsResponse.dart b/lib/api/webuntis/queries/getRooms/getRoomsResponse.dart index 37d8689..4f1cfe3 100644 --- a/lib/api/webuntis/queries/getRooms/getRoomsResponse.dart +++ b/lib/api/webuntis/queries/getRooms/getRoomsResponse.dart @@ -3,7 +3,7 @@ import 'package:marianum_mobile/api/webuntis/apiResponse.dart'; part 'getRoomsResponse.g.dart'; -@JsonSerializable() +@JsonSerializable(explicitToJson: true) class GetRoomsResponse extends ApiResponse { Set result; diff --git a/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart b/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart index f2c2825..7dbdf7a 100644 --- a/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart +++ b/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart @@ -16,7 +16,7 @@ GetRoomsResponse _$GetRoomsResponseFromJson(Map json) => Map _$GetRoomsResponseToJson(GetRoomsResponse instance) => { - 'result': instance.result.toList(), + 'result': instance.result.map((e) => e.toJson()).toList(), }; GetRoomsResponseObject _$GetRoomsResponseObjectFromJson( diff --git a/lib/api/webuntis/queries/getSubjects/getSubjects.dart b/lib/api/webuntis/queries/getSubjects/getSubjects.dart new file mode 100644 index 0000000..78a0a0f --- /dev/null +++ b/lib/api/webuntis/queries/getSubjects/getSubjects.dart @@ -0,0 +1,16 @@ +import 'dart:convert'; + +import 'package:marianum_mobile/api/webuntis/webuntisApi.dart'; + +import '../../apiResponse.dart'; +import 'getSubjectsResponse.dart'; + +class GetSubjects extends WebuntisApi { + GetSubjects() : super("getSubjects", null); + + @override + Future run() async { + String rawAnswer = await query(this); + return finalize(GetSubjectsResponse.fromJson(jsonDecode(rawAnswer))); + } +} \ No newline at end of file diff --git a/lib/api/webuntis/queries/getSubjects/getSubjectsCache.dart b/lib/api/webuntis/queries/getSubjects/getSubjectsCache.dart new file mode 100644 index 0000000..8c4a6ba --- /dev/null +++ b/lib/api/webuntis/queries/getSubjects/getSubjectsCache.dart @@ -0,0 +1,23 @@ +import 'dart:convert'; + +import 'package:marianum_mobile/api/requestCache.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResponse.dart'; + +import 'getSubjects.dart'; + +class GetSubjectsCache extends RequestCache { + GetSubjectsCache({onUpdate}) : super(60 * 60, onUpdate) { + start("subjects", "data"); + } + + @override + Future onLoad() { + return GetSubjects().run(); + } + + @override + onLocalData(String json) { + return GetSubjectsResponse.fromJson(jsonDecode(json)); + } + +} \ No newline at end of file diff --git a/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.dart b/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.dart new file mode 100644 index 0000000..897e2ae --- /dev/null +++ b/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.dart @@ -0,0 +1,28 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:marianum_mobile/api/webuntis/apiResponse.dart'; + +part 'getSubjectsResponse.g.dart'; + +@JsonSerializable(explicitToJson: true) +class GetSubjectsResponse extends ApiResponse { + Set result; + + GetSubjectsResponse(this.result); + + factory GetSubjectsResponse.fromJson(Map json) => _$GetSubjectsResponseFromJson(json); + Map toJson() => _$GetSubjectsResponseToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class GetSubjectsResponseObject { + int id; + String name; + String longName; + String alternateName; + bool active; + + GetSubjectsResponseObject(this.id, this.name, this.longName, this.alternateName, this.active); + + factory GetSubjectsResponseObject.fromJson(Map json) => _$GetSubjectsResponseObjectFromJson(json); + Map toJson() => _$GetSubjectsResponseObjectToJson(this); +} \ No newline at end of file diff --git a/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart b/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart new file mode 100644 index 0000000..05e5626 --- /dev/null +++ b/lib/api/webuntis/queries/getSubjects/getSubjectsResponse.g.dart @@ -0,0 +1,41 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'getSubjectsResponse.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +GetSubjectsResponse _$GetSubjectsResponseFromJson(Map json) => + GetSubjectsResponse( + (json['result'] as List) + .map((e) => + GetSubjectsResponseObject.fromJson(e as Map)) + .toSet(), + ); + +Map _$GetSubjectsResponseToJson( + GetSubjectsResponse instance) => + { + 'result': instance.result.map((e) => e.toJson()).toList(), + }; + +GetSubjectsResponseObject _$GetSubjectsResponseObjectFromJson( + Map json) => + GetSubjectsResponseObject( + json['id'] as int, + json['name'] as String, + json['longName'] as String, + json['alternateName'] as String, + json['active'] as bool, + ); + +Map _$GetSubjectsResponseObjectToJson( + GetSubjectsResponseObject instance) => + { + 'id': instance.id, + 'name': instance.name, + 'longName': instance.longName, + 'alternateName': instance.alternateName, + 'active': instance.active, + }; diff --git a/lib/api/webuntis/queries/getTimetable/getTimetable.dart b/lib/api/webuntis/queries/getTimetable/getTimetable.dart index e1e1885..6d75057 100644 --- a/lib/api/webuntis/queries/getTimetable/getTimetable.dart +++ b/lib/api/webuntis/queries/getTimetable/getTimetable.dart @@ -15,7 +15,6 @@ class GetTimetable extends WebuntisApi { @override Future run() async { String rawAnswer = await query(this); - log(rawAnswer); return finalize(GetTimetableResponse.fromJson(jsonDecode(rawAnswer))); } diff --git a/lib/api/webuntis/queries/getTimetable/getTimetableCache.dart b/lib/api/webuntis/queries/getTimetable/getTimetableCache.dart new file mode 100644 index 0000000..48290ca --- /dev/null +++ b/lib/api/webuntis/queries/getTimetable/getTimetableCache.dart @@ -0,0 +1,40 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:localstore/localstore.dart'; +import 'package:marianum_mobile/api/requestCache.dart'; + +import '../authenticate/authenticate.dart'; +import 'getTimetable.dart'; +import 'getTimetableParams.dart'; +import 'getTimetableResponse.dart'; + +class GetTimetableCache extends RequestCache { + int day; + + GetTimetableCache({required onUpdate, required this.day}) : super(30, onUpdate) { + start("timetable", "$day"); + } + + @override + GetTimetableResponse onLocalData(String json) { + return GetTimetableResponse.fromJson(jsonDecode(json)); + } + + @override + Future onLoad() async { + return GetTimetable( + GetTimetableParams( + options: GetTimetableParamsOptions( + element: GetTimetableParamsOptionsElement( + id: (await Authenticate.getSession()).personId, + type: 5, + keyType: GetTimetableParamsOptionsElementKeyType.id, + ), + startDate: day, + endDate: day, + ) + ) + ).run(); + } +} \ No newline at end of file diff --git a/lib/api/webuntis/webuntisApi.dart b/lib/api/webuntis/webuntisApi.dart index 5efae62..1df6327 100644 --- a/lib/api/webuntis/webuntisApi.dart +++ b/lib/api/webuntis/webuntisApi.dart @@ -20,7 +20,6 @@ abstract class WebuntisApi extends ApiRequest { Future query(WebuntisApi untis) async { String query = '{"id":"ID","method":"$method","params":${untis._body()},"jsonrpc":"2.0"}'; - log(query); String sessionId = "0"; if(authenticatedResponse) { diff --git a/lib/app.dart b/lib/app.dart index 9066fa0..b4133b2 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:marianum_mobile/data/incommingPackets/talkNotificationsPacket.dart'; +import 'package:marianum_mobile/screen/pages/timetable/storedTimetable.dart'; import 'package:marianum_mobile/screen/pages/timetable/testTimetable.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'data/accountModel.dart'; +import 'dataOld/incommingPackets/talkNotificationsPacket.dart'; import 'screen/pages/files/files.dart'; import 'screen/pages/more/overhang.dart'; import 'screen/pages/talk/chatOverview.dart'; @@ -43,7 +43,7 @@ class _AppState extends State { PageView( controller: pageController, children: const [ - TestTimeTable(), + StoredTimetable(), Talk(), Files(), Overhang(), diff --git a/lib/data/dataHolder.dart b/lib/data/dataHolder.dart new file mode 100644 index 0000000..08e140e --- /dev/null +++ b/lib/data/dataHolder.dart @@ -0,0 +1,11 @@ +import 'package:flutter/cupertino.dart'; +import 'package:localstore/localstore.dart'; + +abstract class DataHolder extends ChangeNotifier { + + CollectionRef storage(String path) { + return Localstore.instance.collection(path); + } + + Future run(); +} \ No newline at end of file diff --git a/lib/data/timetable/persistantTimetable.dart b/lib/data/timetable/persistantTimetable.dart new file mode 100644 index 0000000..27af2c7 --- /dev/null +++ b/lib/data/timetable/persistantTimetable.dart @@ -0,0 +1,12 @@ +import 'dart:async'; + +import 'package:flutter/widgets.dart'; +import 'package:path/path.dart'; +import 'package:sqflite/sqflite.dart'; + +class PersistantTimetable { + final int id; + final String json; + + PersistantTimetable(this.id, this.json); +} \ No newline at end of file diff --git a/lib/data/timetable/timetable.dart b/lib/data/timetable/timetable.dart new file mode 100644 index 0000000..082a631 --- /dev/null +++ b/lib/data/timetable/timetable.dart @@ -0,0 +1,60 @@ +import 'dart:collection'; +import 'dart:convert'; +import 'dart:developer'; + +import 'package:intl/intl.dart'; +import 'package:marianum_mobile/api/webuntis/queries/authenticate/authenticate.dart'; +import 'package:marianum_mobile/api/webuntis/queries/authenticate/authenticateResponse.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsCache.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsCache.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResponse.dart'; +import 'package:marianum_mobile/data/dataHolder.dart'; + +import '../../api/webuntis/queries/getTimetable/getTimetable.dart'; +import '../../api/webuntis/queries/getTimetable/getTimetableCache.dart'; +import '../../api/webuntis/queries/getTimetable/getTimetableParams.dart'; +import '../../api/webuntis/queries/getTimetable/getTimetableResponse.dart'; + +class Timetable extends DataHolder { + int day = int.parse(DateFormat("yyyyMMdd").format(DateTime.now())); + + Timetable() : super(); + + GetTimetableResponse? _getTimetableResponse; + GetTimetableResponse? get getTimetableResponse => _getTimetableResponse; + + GetRoomsResponse? _getRoomsResponse; + GetRoomsResponse? get getRoomsResponse => _getRoomsResponse; + + GetSubjectsResponse? _getSubjectsResponse; + GetSubjectsResponse? get getSubjectsResponse => _getSubjectsResponse; + + @override + Future run() async { + GetTimetableCache( + day: day, + onUpdate: (data) => + { + _getTimetableResponse = data, + notifyListeners(), + } + ); + + GetRoomsCache( + onUpdate: (data) => + { + _getRoomsResponse = data, + notifyListeners(), + } + ); + + GetSubjectsCache( + onUpdate: (data) => + { + _getSubjectsResponse = data, + notifyListeners(), + } + ); + } +} \ No newline at end of file diff --git a/lib/data/accountModel.dart b/lib/dataOld/accountModel.dart similarity index 100% rename from lib/data/accountModel.dart rename to lib/dataOld/accountModel.dart diff --git a/lib/data/incomingPacket.dart b/lib/dataOld/incomingPacket.dart similarity index 94% rename from lib/data/incomingPacket.dart rename to lib/dataOld/incomingPacket.dart index 72e1ecc..29f4dc0 100644 --- a/lib/data/incomingPacket.dart +++ b/lib/dataOld/incomingPacket.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'dart:developer'; import 'package:flutter/cupertino.dart'; -import 'package:marianum_mobile/data/socketConnection.dart'; +import 'package:marianum_mobile/dataOld/socketConnection.dart'; class IncomingPacket extends ChangeNotifier { diff --git a/lib/data/incommingPackets/authenticatePacket.dart b/lib/dataOld/incommingPackets/authenticatePacket.dart similarity index 87% rename from lib/data/incommingPackets/authenticatePacket.dart rename to lib/dataOld/incommingPackets/authenticatePacket.dart index 9e718a0..6a999d2 100644 --- a/lib/data/incommingPackets/authenticatePacket.dart +++ b/lib/dataOld/incommingPackets/authenticatePacket.dart @@ -1,9 +1,10 @@ import 'dart:developer'; -import 'package:marianum_mobile/data/incomingPacket.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../incomingPacket.dart'; + class AuthenticatePacket extends IncomingPacket { AuthenticatePacket() : super("authenticate"); diff --git a/lib/data/incommingPackets/errorPacket.dart b/lib/dataOld/incommingPackets/errorPacket.dart similarity index 87% rename from lib/data/incommingPackets/errorPacket.dart rename to lib/dataOld/incommingPackets/errorPacket.dart index 588f4b6..83b8576 100644 --- a/lib/data/incommingPackets/errorPacket.dart +++ b/lib/dataOld/incommingPackets/errorPacket.dart @@ -1,4 +1,5 @@ -import 'package:marianum_mobile/data/incomingPacket.dart'; + +import '../incomingPacket.dart'; class ErrorPacket extends IncomingPacket { ErrorPacket() : super("error", useJsonDecode: false); diff --git a/lib/data/incommingPackets/fileListPacket.dart b/lib/dataOld/incommingPackets/fileListPacket.dart similarity index 91% rename from lib/data/incommingPackets/fileListPacket.dart rename to lib/dataOld/incommingPackets/fileListPacket.dart index fe2976a..48722f8 100644 --- a/lib/data/incommingPackets/fileListPacket.dart +++ b/lib/dataOld/incommingPackets/fileListPacket.dart @@ -1,5 +1,5 @@ -import 'package:marianum_mobile/data/incomingPacket.dart'; +import '../incomingPacket.dart'; class FileEntry { String name; diff --git a/lib/data/incommingPackets/serverInfoPacket.dart b/lib/dataOld/incommingPackets/serverInfoPacket.dart similarity index 91% rename from lib/data/incommingPackets/serverInfoPacket.dart rename to lib/dataOld/incommingPackets/serverInfoPacket.dart index ecbb3cc..8a0649d 100644 --- a/lib/data/incommingPackets/serverInfoPacket.dart +++ b/lib/dataOld/incommingPackets/serverInfoPacket.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; -import 'package:marianum_mobile/data/socketConnection.dart'; import '../incomingPacket.dart'; diff --git a/lib/data/incommingPackets/talkChatPacket.dart b/lib/dataOld/incommingPackets/talkChatPacket.dart similarity index 91% rename from lib/data/incommingPackets/talkChatPacket.dart rename to lib/dataOld/incommingPackets/talkChatPacket.dart index d53d0a2..1b99429 100644 --- a/lib/data/incommingPackets/talkChatPacket.dart +++ b/lib/dataOld/incommingPackets/talkChatPacket.dart @@ -1,4 +1,5 @@ -import 'package:marianum_mobile/data/incomingPacket.dart'; + +import '../incomingPacket.dart'; class TalkMessage { bool self; diff --git a/lib/data/incommingPackets/talkContactsPacket.dart b/lib/dataOld/incommingPackets/talkContactsPacket.dart similarity index 95% rename from lib/data/incommingPackets/talkContactsPacket.dart rename to lib/dataOld/incommingPackets/talkContactsPacket.dart index c414f6d..f06015d 100644 --- a/lib/data/incommingPackets/talkContactsPacket.dart +++ b/lib/dataOld/incommingPackets/talkContactsPacket.dart @@ -2,7 +2,8 @@ import 'dart:convert'; import 'package:intl/intl.dart'; import 'package:jiffy/jiffy.dart'; -import 'package:marianum_mobile/data/incomingPacket.dart'; + +import '../incomingPacket.dart'; class TalkContact { String name; diff --git a/lib/data/incommingPackets/talkNotificationsPacket.dart b/lib/dataOld/incommingPackets/talkNotificationsPacket.dart similarity index 79% rename from lib/data/incommingPackets/talkNotificationsPacket.dart rename to lib/dataOld/incommingPackets/talkNotificationsPacket.dart index 2e99e59..43f5b41 100644 --- a/lib/data/incommingPackets/talkNotificationsPacket.dart +++ b/lib/dataOld/incommingPackets/talkNotificationsPacket.dart @@ -1,4 +1,5 @@ -import 'package:marianum_mobile/data/incomingPacket.dart'; + +import '../incomingPacket.dart'; class TalkNotificationsPacket extends IncomingPacket { TalkNotificationsPacket() : super("talkNotifications"); diff --git a/lib/data/incommingPackets/timetablePacket.dart b/lib/dataOld/incommingPackets/timetablePacket.dart similarity index 96% rename from lib/data/incommingPackets/timetablePacket.dart rename to lib/dataOld/incommingPackets/timetablePacket.dart index b8826b0..642fbac 100644 --- a/lib/data/incommingPackets/timetablePacket.dart +++ b/lib/dataOld/incommingPackets/timetablePacket.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; -import 'package:marianum_mobile/data/socketConnection.dart'; import '../incomingPacket.dart'; diff --git a/lib/data/outgoingPacket.dart b/lib/dataOld/outgoingPacket.dart similarity index 78% rename from lib/data/outgoingPacket.dart rename to lib/dataOld/outgoingPacket.dart index 8579537..d2ad0dd 100644 --- a/lib/data/outgoingPacket.dart +++ b/lib/dataOld/outgoingPacket.dart @@ -1,6 +1,7 @@ import 'dart:convert'; -import 'package:marianum_mobile/data/socketConnection.dart'; +import 'package:marianum_mobile/dataOld/socketConnection.dart'; + class OutgoingPacket { final String command; diff --git a/lib/data/outgoingPackets/talkContactsAskPacket.dart b/lib/dataOld/outgoingPackets/talkContactsAskPacket.dart similarity index 69% rename from lib/data/outgoingPackets/talkContactsAskPacket.dart rename to lib/dataOld/outgoingPackets/talkContactsAskPacket.dart index 54bd0f6..beacb17 100644 --- a/lib/data/outgoingPackets/talkContactsAskPacket.dart +++ b/lib/dataOld/outgoingPackets/talkContactsAskPacket.dart @@ -1,4 +1,5 @@ -import 'package:marianum_mobile/data/outgoingPacket.dart'; + +import '../outgoingPacket.dart'; class TalkContactsAskPacket extends OutgoingPacket { TalkContactsAskPacket() : super( diff --git a/lib/data/socketConnection.dart b/lib/dataOld/socketConnection.dart similarity index 100% rename from lib/data/socketConnection.dart rename to lib/dataOld/socketConnection.dart diff --git a/lib/main.dart b/lib/main.dart index 9f6a147..7497568 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,23 +2,23 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:marianum_mobile/data/accountModel.dart'; -import 'package:marianum_mobile/data/incommingPackets/authenticatePacket.dart'; -import 'package:marianum_mobile/data/incommingPackets/errorPacket.dart'; -import 'package:marianum_mobile/data/incommingPackets/fileListPacket.dart'; -import 'package:marianum_mobile/data/incommingPackets/talkChatPacket.dart'; -import 'package:marianum_mobile/data/incommingPackets/talkNotificationsPacket.dart'; +import 'package:marianum_mobile/data/timetable/timetable.dart'; import 'package:marianum_mobile/screen/login/login.dart'; -import 'package:marianum_mobile/screen/pages/timetable/timetable.dart'; import 'package:marianum_mobile/widget/loadingSpinner.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import 'app.dart'; -import 'data/incommingPackets/serverInfoPacket.dart'; -import 'data/incommingPackets/talkContactsPacket.dart'; -import 'data/incommingPackets/timetablePacket.dart'; +import 'dataOld/accountModel.dart'; +import 'dataOld/incommingPackets/authenticatePacket.dart'; +import 'dataOld/incommingPackets/errorPacket.dart'; +import 'dataOld/incommingPackets/fileListPacket.dart'; +import 'dataOld/incommingPackets/serverInfoPacket.dart'; +import 'dataOld/incommingPackets/talkChatPacket.dart'; +import 'dataOld/incommingPackets/talkContactsPacket.dart'; +import 'dataOld/incommingPackets/talkNotificationsPacket.dart'; +import 'dataOld/incommingPackets/timetablePacket.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -33,12 +33,13 @@ Future main() async { providers: [ ChangeNotifierProvider(create: (context) => AccountModel()), ChangeNotifierProvider(create: (context) => ErrorPacket()), - ChangeNotifierProvider(create: (context) => ServerInfoPacket()), - ChangeNotifierProvider(create: (context) => TalkContactsPaket()), + // ChangeNotifierProvider(create: (context) => ServerInfoPacket()), + // ChangeNotifierProvider(create: (context) => TalkContactsPaket()), ChangeNotifierProvider(create: (context) => TalkNotificationsPacket()), - ChangeNotifierProvider(create: (context) => FileListPacket()), - ChangeNotifierProvider(create: (context) => TalkChatPacket()), - ChangeNotifierProvider(create: (context) => TimetablePacket()), + // ChangeNotifierProvider(create: (context) => FileListPacket()), + // ChangeNotifierProvider(create: (context) => TalkChatPacket()), + // ChangeNotifierProvider(create: (context) => TimetablePacket()), + ChangeNotifierProvider(create: (context) => Timetable()), ], child: const Main(), ) diff --git a/lib/screen/login/login.dart b/lib/screen/login/login.dart index c333634..4785d15 100644 --- a/lib/screen/login/login.dart +++ b/lib/screen/login/login.dart @@ -11,8 +11,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import '../../api/webuntis/queries/authenticate/authenticateParams.dart'; import '../../api/webuntis/queries/authenticate/authenticate.dart'; -import '../../data/accountModel.dart'; - +import '../../dataOld/accountModel.dart'; class Login extends StatefulWidget { const Login({Key? key}) : super(key: key); diff --git a/lib/screen/pages/files/files.dart b/lib/screen/pages/files/files.dart index ddf46ee..1104312 100644 --- a/lib/screen/pages/files/files.dart +++ b/lib/screen/pages/files/files.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:marianum_mobile/data/incommingPackets/fileListPacket.dart'; import 'package:marianum_mobile/widget/loadingPacket.dart'; import 'package:provider/provider.dart'; import 'package:webdav_client/webdav_client.dart'; -import '../../../data/accountModel.dart'; +import '../../../dataOld/incommingPackets/fileListPacket.dart'; import '../../../widget/loadingSpinner.dart'; class Files extends StatefulWidget { diff --git a/lib/screen/pages/talk/chatOverview.dart b/lib/screen/pages/talk/chatOverview.dart index 4e22bc9..be89182 100644 --- a/lib/screen/pages/talk/chatOverview.dart +++ b/lib/screen/pages/talk/chatOverview.dart @@ -3,12 +3,10 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; -import 'package:marianum_mobile/data/outgoingPackets/talkContactsAskPacket.dart'; import 'package:marianum_mobile/widget/loadingPacket.dart'; import 'package:provider/provider.dart'; -import '../../../data/accountModel.dart'; -import '../../../data/incommingPackets/talkContactsPacket.dart'; +import '../../../dataOld/incommingPackets/talkContactsPacket.dart'; import '../../../widget/loadingSpinner.dart'; import 'chatView.dart'; diff --git a/lib/screen/pages/talk/chatView.dart b/lib/screen/pages/talk/chatView.dart index 44e126f..0da55cf 100644 --- a/lib/screen/pages/talk/chatView.dart +++ b/lib/screen/pages/talk/chatView.dart @@ -1,10 +1,11 @@ import 'package:bubble/bubble.dart'; import 'package:flutter/material.dart'; -import 'package:marianum_mobile/data/incommingPackets/talkChatPacket.dart'; import 'package:marianum_mobile/widget/loadingPacket.dart'; import 'package:provider/provider.dart'; +import '../../../dataOld/incommingPackets/talkChatPacket.dart'; + class ChatView extends StatefulWidget { final String userToken; const ChatView({Key? key, required this.userToken}) : super(key: key); diff --git a/lib/screen/pages/timetable/storedTimetable.dart b/lib/screen/pages/timetable/storedTimetable.dart new file mode 100644 index 0000000..0a63e79 --- /dev/null +++ b/lib/screen/pages/timetable/storedTimetable.dart @@ -0,0 +1,104 @@ +import 'dart:developer'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:jiffy/jiffy.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRoomsResponse.dart'; +import 'package:marianum_mobile/api/webuntis/queries/getSubjects/getSubjectsResponse.dart'; +import 'package:marianum_mobile/data/timetable/timetable.dart'; +import 'package:marianum_mobile/screen/pages/timetable/testTimetable.dart'; +import 'package:marianum_mobile/widget/loadingSpinner.dart'; +import 'package:provider/provider.dart'; +import 'package:timetable_view/timetable_view.dart'; + +import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart'; + +class StoredTimetable extends StatefulWidget { + const StoredTimetable({Key? key}) : super(key: key); + + @override + State createState() => _StoredTimetableState(); +} + +class _StoredTimetableState extends State { + @override + void initState() { + super.initState(); + + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + Provider.of(context, listen: false).run(); + }); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, value, child) { + if(value.getTimetableResponse == null) { + return const LoadingSpinner(); + } + + return TimetableView( + laneEventsList: _buildLaneEvents(value), + onEventTap: (TableEvent event) {}, + timetableStyle: CustomTableStyle(context), + onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {}, + ); + }, + ); + } + + + List _buildLaneEvents(Timetable data) { + List laneEvents = List.empty(growable: true); + Jiffy.locale("de"); // todo move outwards + + GetTimetableResponse timetable = data.getTimetableResponse!; + GetRoomsResponse rooms = data.getRoomsResponse!; + GetSubjectsResponse subjects = data.getSubjectsResponse!; + + List dayList = timetable.result.map((e) => e.date).toSet().toList(); + dayList.sort((a, b) => a-b); + dayList.forEach((day) { + //Every Day + + laneEvents.add( + LaneEvents( + lane: Lane( + laneIndex: day, + name: "${Jiffy(day.toString()).format("dd.MM.yy")}\n${Jiffy(day.toString()).format("EEEE")}", + textStyle: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold, + fontSize: 14 + ) + ), + events: List.generate( + timetable.result.where((element) => element.date == day).length, + (index) { + GetTimetableResponseObject tableEvent = timetable.result.where((element) => element.date == day).elementAt(index); + return TableEvent( + title: subjects.result.firstWhere((subject) => subject.id == tableEvent.su[0]['id']).longName, + eventId: tableEvent.id, + laneIndex: day, + startTime: parseTime(tableEvent.startTime), + endTime: parseTime(tableEvent.endTime), + padding: const EdgeInsets.all(5), + backgroundColor: Theme.of(context).primaryColor, + location: "\n${rooms.result.firstWhere((room) => room.id == tableEvent.ro[0]['id']).name}", + ); + } + ) + ) + ); + + }); + + return laneEvents; + } + + TableEventTime parseTime(int input) { + String time = input.toString().length < 4 ? "0$input" : input.toString(); + return TableEventTime(hour: int.parse(time.substring(0, 2)), minute: int.parse(time.substring(2, 4))); + } +} diff --git a/lib/screen/pages/timetable/testTimetable.dart b/lib/screen/pages/timetable/testTimetable.dart index 35f7b8d..3023a8c 100644 --- a/lib/screen/pages/timetable/testTimetable.dart +++ b/lib/screen/pages/timetable/testTimetable.dart @@ -4,7 +4,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:jiffy/jiffy.dart'; import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRooms.dart'; -import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart'; import 'package:marianum_mobile/widget/loadingSpinner.dart'; import 'package:marianum_mobile/widget/offlineError.dart'; import 'package:timetable_view/timetable_view.dart'; @@ -132,14 +131,14 @@ class CustomTableStyle extends TimetableStyle { @override int get endHour => 17; @override - double get laneWidth => 100; + double get laneWidth => 300; @override Color get cornerColor => Theme.of(context).primaryColor; @override Color get timeItemTextColor => Theme.of(context).primaryColor; @override - double get timeItemHeight => 60; + double get timeItemHeight => 80; @override - double get timeItemWidth => 40; + double get timeItemWidth => 70; } \ No newline at end of file diff --git a/lib/screen/pages/timetable/timetable.dart b/lib/screen/pages/timetable/timetable.dart index 6e756a6..9beb944 100644 --- a/lib/screen/pages/timetable/timetable.dart +++ b/lib/screen/pages/timetable/timetable.dart @@ -3,11 +3,12 @@ import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart'; import 'package:marianum_mobile/widget/loadingPacket.dart'; import 'package:provider/provider.dart'; import 'package:timetable_view/timetable_view.dart'; +import '../../../dataOld/incommingPackets/timetablePacket.dart'; + class Timetable extends StatefulWidget { const Timetable({Key? key}) : super(key: key); diff --git a/lib/screen/settings/settings.dart b/lib/screen/settings/settings.dart index 47caa2c..f269c99 100644 --- a/lib/screen/settings/settings.dart +++ b/lib/screen/settings/settings.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../../data/accountModel.dart'; -import '../../data/incommingPackets/serverInfoPacket.dart'; +import '../../dataOld/accountModel.dart'; +import '../../dataOld/incommingPackets/serverInfoPacket.dart'; import '../../widget/ListItem.dart'; class Settings extends StatefulWidget { diff --git a/lib/widget/loadingPacket.dart b/lib/widget/loadingPacket.dart index 58878c5..807e509 100644 --- a/lib/widget/loadingPacket.dart +++ b/lib/widget/loadingPacket.dart @@ -1,8 +1,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:marianum_mobile/data/incomingPacket.dart'; import 'package:provider/provider.dart'; +import '../dataOld/incomingPacket.dart'; + class LoadingPacket extends StatefulWidget { final Widget child; final IncomingPacket packet; diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 997e35d..63ad0d1 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,10 +5,14 @@ import FlutterMacOS import Foundation +import path_provider_foundation import shared_preferences_foundation +import sqflite import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/pubspec.yaml b/pubspec.yaml index 64a8842..8da3b6d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,6 +47,9 @@ dependencies: jiffy: ^5.0.0 timetable_view: ^0.3.0 json_annotation: ^4.8.0 + sqflite: ^2.2.4+1 + localstore: ^1.2.3 + intl: ^0.17.0 dev_dependencies: flutter_test: