Implement Webuntis HTTP Api and Display
This commit is contained in:
parent
7432972b3c
commit
2b6dc8e3e6
500
.idea/libraries/Dart_Packages.xml
generated
500
.idea/libraries/Dart_Packages.xml
generated
File diff suppressed because it is too large
Load Diff
36
.idea/libraries/Flutter_Plugins.xml
generated
36
.idea/libraries/Flutter_Plugins.xml
generated
@ -1,22 +1,26 @@
|
|||||||
<component name="libraryTable">
|
<component name="libraryTable">
|
||||||
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
|
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
|
||||||
<CLASSES>
|
<CLASSES>
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.2.17" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.2" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.2" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_native_splash-2.2.17" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.0.12" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.23" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences-2.0.17" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.14" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.1.3" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-3.0.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.14" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher-6.1.9" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-3.0.2" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.3" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-3.0.2" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/sqflite-2.2.4+1" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_android-6.0.23" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.8" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.1.3" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.0" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.9" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_foundation-2.1.1" />
|
||||||
<root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.1.0" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_android-2.0.22" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.1.3" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_web-2.0.4" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.3" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_android-2.0.15" />
|
||||||
</CLASSES>
|
</CLASSES>
|
||||||
<JAVADOC />
|
<JAVADOC />
|
||||||
<SOURCES />
|
<SOURCES />
|
||||||
|
32
lib/api/requestCache.dart
Normal file
32
lib/api/requestCache.dart
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:localstore/localstore.dart';
|
||||||
|
|
||||||
|
abstract class RequestCache<T> {
|
||||||
|
int maxCacheTime;
|
||||||
|
Function(T) onUpdate;
|
||||||
|
|
||||||
|
RequestCache(this.maxCacheTime, this.onUpdate);
|
||||||
|
|
||||||
|
void start(String file, String document) async {
|
||||||
|
Map<String, dynamic>? 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<T> onLoad();
|
||||||
|
}
|
23
lib/api/webuntis/queries/getRooms/getRoomsCache.dart
Normal file
23
lib/api/webuntis/queries/getRooms/getRoomsCache.dart
Normal file
@ -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<GetRoomsResponse> {
|
||||||
|
GetRoomsCache({onUpdate}) : super(60 * 60, onUpdate) {
|
||||||
|
start("rooms", "data");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<GetRoomsResponse> onLoad() {
|
||||||
|
return GetRooms().run();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
GetRoomsResponse onLocalData(String json) {
|
||||||
|
return GetRoomsResponse.fromJson(jsonDecode(json));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,7 +3,7 @@ import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
|
|||||||
|
|
||||||
part 'getRoomsResponse.g.dart';
|
part 'getRoomsResponse.g.dart';
|
||||||
|
|
||||||
@JsonSerializable()
|
@JsonSerializable(explicitToJson: true)
|
||||||
class GetRoomsResponse extends ApiResponse {
|
class GetRoomsResponse extends ApiResponse {
|
||||||
Set<GetRoomsResponseObject> result;
|
Set<GetRoomsResponseObject> result;
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ GetRoomsResponse _$GetRoomsResponseFromJson(Map<String, dynamic> json) =>
|
|||||||
|
|
||||||
Map<String, dynamic> _$GetRoomsResponseToJson(GetRoomsResponse instance) =>
|
Map<String, dynamic> _$GetRoomsResponseToJson(GetRoomsResponse instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'result': instance.result.toList(),
|
'result': instance.result.map((e) => e.toJson()).toList(),
|
||||||
};
|
};
|
||||||
|
|
||||||
GetRoomsResponseObject _$GetRoomsResponseObjectFromJson(
|
GetRoomsResponseObject _$GetRoomsResponseObjectFromJson(
|
||||||
|
16
lib/api/webuntis/queries/getSubjects/getSubjects.dart
Normal file
16
lib/api/webuntis/queries/getSubjects/getSubjects.dart
Normal file
@ -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<GetSubjectsResponse> run() async {
|
||||||
|
String rawAnswer = await query(this);
|
||||||
|
return finalize(GetSubjectsResponse.fromJson(jsonDecode(rawAnswer)));
|
||||||
|
}
|
||||||
|
}
|
23
lib/api/webuntis/queries/getSubjects/getSubjectsCache.dart
Normal file
23
lib/api/webuntis/queries/getSubjects/getSubjectsCache.dart
Normal file
@ -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<GetSubjectsResponse> {
|
||||||
|
GetSubjectsCache({onUpdate}) : super(60 * 60, onUpdate) {
|
||||||
|
start("subjects", "data");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<GetSubjectsResponse> onLoad() {
|
||||||
|
return GetSubjects().run();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
onLocalData(String json) {
|
||||||
|
return GetSubjectsResponse.fromJson(jsonDecode(json));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<GetSubjectsResponseObject> result;
|
||||||
|
|
||||||
|
GetSubjectsResponse(this.result);
|
||||||
|
|
||||||
|
factory GetSubjectsResponse.fromJson(Map<String, dynamic> json) => _$GetSubjectsResponseFromJson(json);
|
||||||
|
Map<String, dynamic> 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<String, dynamic> json) => _$GetSubjectsResponseObjectFromJson(json);
|
||||||
|
Map<String, dynamic> toJson() => _$GetSubjectsResponseObjectToJson(this);
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'getSubjectsResponse.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
GetSubjectsResponse _$GetSubjectsResponseFromJson(Map<String, dynamic> json) =>
|
||||||
|
GetSubjectsResponse(
|
||||||
|
(json['result'] as List<dynamic>)
|
||||||
|
.map((e) =>
|
||||||
|
GetSubjectsResponseObject.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toSet(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$GetSubjectsResponseToJson(
|
||||||
|
GetSubjectsResponse instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'result': instance.result.map((e) => e.toJson()).toList(),
|
||||||
|
};
|
||||||
|
|
||||||
|
GetSubjectsResponseObject _$GetSubjectsResponseObjectFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
GetSubjectsResponseObject(
|
||||||
|
json['id'] as int,
|
||||||
|
json['name'] as String,
|
||||||
|
json['longName'] as String,
|
||||||
|
json['alternateName'] as String,
|
||||||
|
json['active'] as bool,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$GetSubjectsResponseObjectToJson(
|
||||||
|
GetSubjectsResponseObject instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'id': instance.id,
|
||||||
|
'name': instance.name,
|
||||||
|
'longName': instance.longName,
|
||||||
|
'alternateName': instance.alternateName,
|
||||||
|
'active': instance.active,
|
||||||
|
};
|
@ -15,7 +15,6 @@ class GetTimetable extends WebuntisApi {
|
|||||||
@override
|
@override
|
||||||
Future<GetTimetableResponse> run() async {
|
Future<GetTimetableResponse> run() async {
|
||||||
String rawAnswer = await query(this);
|
String rawAnswer = await query(this);
|
||||||
log(rawAnswer);
|
|
||||||
return finalize(GetTimetableResponse.fromJson(jsonDecode(rawAnswer)));
|
return finalize(GetTimetableResponse.fromJson(jsonDecode(rawAnswer)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
40
lib/api/webuntis/queries/getTimetable/getTimetableCache.dart
Normal file
40
lib/api/webuntis/queries/getTimetable/getTimetableCache.dart
Normal file
@ -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<GetTimetableResponse> {
|
||||||
|
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<GetTimetableResponse> onLoad() async {
|
||||||
|
return GetTimetable(
|
||||||
|
GetTimetableParams(
|
||||||
|
options: GetTimetableParamsOptions(
|
||||||
|
element: GetTimetableParamsOptionsElement(
|
||||||
|
id: (await Authenticate.getSession()).personId,
|
||||||
|
type: 5,
|
||||||
|
keyType: GetTimetableParamsOptionsElementKeyType.id,
|
||||||
|
),
|
||||||
|
startDate: day,
|
||||||
|
endDate: day,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).run();
|
||||||
|
}
|
||||||
|
}
|
@ -20,7 +20,6 @@ abstract class WebuntisApi extends ApiRequest {
|
|||||||
|
|
||||||
Future<String> query(WebuntisApi untis) async {
|
Future<String> query(WebuntisApi untis) async {
|
||||||
String query = '{"id":"ID","method":"$method","params":${untis._body()},"jsonrpc":"2.0"}';
|
String query = '{"id":"ID","method":"$method","params":${untis._body()},"jsonrpc":"2.0"}';
|
||||||
log(query);
|
|
||||||
|
|
||||||
String sessionId = "0";
|
String sessionId = "0";
|
||||||
if(authenticatedResponse) {
|
if(authenticatedResponse) {
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
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:marianum_mobile/screen/pages/timetable/testTimetable.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.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/files/files.dart';
|
||||||
import 'screen/pages/more/overhang.dart';
|
import 'screen/pages/more/overhang.dart';
|
||||||
import 'screen/pages/talk/chatOverview.dart';
|
import 'screen/pages/talk/chatOverview.dart';
|
||||||
@ -43,7 +43,7 @@ class _AppState extends State<App> {
|
|||||||
PageView(
|
PageView(
|
||||||
controller: pageController,
|
controller: pageController,
|
||||||
children: const [
|
children: const [
|
||||||
TestTimeTable(),
|
StoredTimetable(),
|
||||||
Talk(),
|
Talk(),
|
||||||
Files(),
|
Files(),
|
||||||
Overhang(),
|
Overhang(),
|
||||||
|
11
lib/data/dataHolder.dart
Normal file
11
lib/data/dataHolder.dart
Normal file
@ -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<void> run();
|
||||||
|
}
|
12
lib/data/timetable/persistantTimetable.dart
Normal file
12
lib/data/timetable/persistantTimetable.dart
Normal file
@ -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);
|
||||||
|
}
|
60
lib/data/timetable/timetable.dart
Normal file
60
lib/data/timetable/timetable.dart
Normal file
@ -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<void> run() async {
|
||||||
|
GetTimetableCache(
|
||||||
|
day: day,
|
||||||
|
onUpdate: (data) =>
|
||||||
|
{
|
||||||
|
_getTimetableResponse = data,
|
||||||
|
notifyListeners(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
GetRoomsCache(
|
||||||
|
onUpdate: (data) =>
|
||||||
|
{
|
||||||
|
_getRoomsResponse = data,
|
||||||
|
notifyListeners(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
GetSubjectsCache(
|
||||||
|
onUpdate: (data) =>
|
||||||
|
{
|
||||||
|
_getSubjectsResponse = data,
|
||||||
|
notifyListeners(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -3,7 +3,7 @@ import 'dart:convert';
|
|||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:marianum_mobile/data/socketConnection.dart';
|
import 'package:marianum_mobile/dataOld/socketConnection.dart';
|
||||||
|
|
||||||
class IncomingPacket extends ChangeNotifier {
|
class IncomingPacket extends ChangeNotifier {
|
||||||
|
|
@ -1,9 +1,10 @@
|
|||||||
|
|
||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
import '../incomingPacket.dart';
|
||||||
|
|
||||||
class AuthenticatePacket extends IncomingPacket {
|
class AuthenticatePacket extends IncomingPacket {
|
||||||
AuthenticatePacket() : super("authenticate");
|
AuthenticatePacket() : super("authenticate");
|
||||||
|
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
|
||||||
|
import '../incomingPacket.dart';
|
||||||
|
|
||||||
class ErrorPacket extends IncomingPacket {
|
class ErrorPacket extends IncomingPacket {
|
||||||
ErrorPacket() : super("error", useJsonDecode: false);
|
ErrorPacket() : super("error", useJsonDecode: false);
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
import '../incomingPacket.dart';
|
||||||
|
|
||||||
class FileEntry {
|
class FileEntry {
|
||||||
String name;
|
String name;
|
@ -1,7 +1,6 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:marianum_mobile/data/socketConnection.dart';
|
|
||||||
|
|
||||||
import '../incomingPacket.dart';
|
import '../incomingPacket.dart';
|
||||||
|
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
|
||||||
|
import '../incomingPacket.dart';
|
||||||
|
|
||||||
class TalkMessage {
|
class TalkMessage {
|
||||||
bool self;
|
bool self;
|
@ -2,7 +2,8 @@ import 'dart:convert';
|
|||||||
|
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
|
||||||
|
import '../incomingPacket.dart';
|
||||||
|
|
||||||
class TalkContact {
|
class TalkContact {
|
||||||
String name;
|
String name;
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
|
||||||
|
import '../incomingPacket.dart';
|
||||||
|
|
||||||
class TalkNotificationsPacket extends IncomingPacket {
|
class TalkNotificationsPacket extends IncomingPacket {
|
||||||
TalkNotificationsPacket() : super("talkNotifications");
|
TalkNotificationsPacket() : super("talkNotifications");
|
@ -1,7 +1,6 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:marianum_mobile/data/socketConnection.dart';
|
|
||||||
|
|
||||||
import '../incomingPacket.dart';
|
import '../incomingPacket.dart';
|
||||||
|
|
@ -1,6 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:marianum_mobile/data/socketConnection.dart';
|
import 'package:marianum_mobile/dataOld/socketConnection.dart';
|
||||||
|
|
||||||
|
|
||||||
class OutgoingPacket {
|
class OutgoingPacket {
|
||||||
final String command;
|
final String command;
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:marianum_mobile/data/outgoingPacket.dart';
|
|
||||||
|
import '../outgoingPacket.dart';
|
||||||
|
|
||||||
class TalkContactsAskPacket extends OutgoingPacket {
|
class TalkContactsAskPacket extends OutgoingPacket {
|
||||||
TalkContactsAskPacket() : super(
|
TalkContactsAskPacket() : super(
|
@ -2,23 +2,23 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:marianum_mobile/data/accountModel.dart';
|
import 'package:marianum_mobile/data/timetable/timetable.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/screen/login/login.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:marianum_mobile/widget/loadingSpinner.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:web_socket_channel/web_socket_channel.dart';
|
import 'package:web_socket_channel/web_socket_channel.dart';
|
||||||
|
|
||||||
import 'app.dart';
|
import 'app.dart';
|
||||||
import 'data/incommingPackets/serverInfoPacket.dart';
|
import 'dataOld/accountModel.dart';
|
||||||
import 'data/incommingPackets/talkContactsPacket.dart';
|
import 'dataOld/incommingPackets/authenticatePacket.dart';
|
||||||
import 'data/incommingPackets/timetablePacket.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<void> main() async {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
@ -33,12 +33,13 @@ Future<void> main() async {
|
|||||||
providers: [
|
providers: [
|
||||||
ChangeNotifierProvider(create: (context) => AccountModel()),
|
ChangeNotifierProvider(create: (context) => AccountModel()),
|
||||||
ChangeNotifierProvider(create: (context) => ErrorPacket()),
|
ChangeNotifierProvider(create: (context) => ErrorPacket()),
|
||||||
ChangeNotifierProvider(create: (context) => ServerInfoPacket()),
|
// ChangeNotifierProvider(create: (context) => ServerInfoPacket()),
|
||||||
ChangeNotifierProvider(create: (context) => TalkContactsPaket()),
|
// ChangeNotifierProvider(create: (context) => TalkContactsPaket()),
|
||||||
ChangeNotifierProvider(create: (context) => TalkNotificationsPacket()),
|
ChangeNotifierProvider(create: (context) => TalkNotificationsPacket()),
|
||||||
ChangeNotifierProvider(create: (context) => FileListPacket()),
|
// ChangeNotifierProvider(create: (context) => FileListPacket()),
|
||||||
ChangeNotifierProvider(create: (context) => TalkChatPacket()),
|
// ChangeNotifierProvider(create: (context) => TalkChatPacket()),
|
||||||
ChangeNotifierProvider(create: (context) => TimetablePacket()),
|
// ChangeNotifierProvider(create: (context) => TimetablePacket()),
|
||||||
|
ChangeNotifierProvider(create: (context) => Timetable()),
|
||||||
],
|
],
|
||||||
child: const Main(),
|
child: const Main(),
|
||||||
)
|
)
|
||||||
|
@ -11,8 +11,7 @@ import 'package:shared_preferences/shared_preferences.dart';
|
|||||||
|
|
||||||
import '../../api/webuntis/queries/authenticate/authenticateParams.dart';
|
import '../../api/webuntis/queries/authenticate/authenticateParams.dart';
|
||||||
import '../../api/webuntis/queries/authenticate/authenticate.dart';
|
import '../../api/webuntis/queries/authenticate/authenticate.dart';
|
||||||
import '../../data/accountModel.dart';
|
import '../../dataOld/accountModel.dart';
|
||||||
|
|
||||||
|
|
||||||
class Login extends StatefulWidget {
|
class Login extends StatefulWidget {
|
||||||
const Login({Key? key}) : super(key: key);
|
const Login({Key? key}) : super(key: key);
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:marianum_mobile/data/incommingPackets/fileListPacket.dart';
|
|
||||||
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:webdav_client/webdav_client.dart';
|
import 'package:webdav_client/webdav_client.dart';
|
||||||
|
|
||||||
import '../../../data/accountModel.dart';
|
import '../../../dataOld/incommingPackets/fileListPacket.dart';
|
||||||
import '../../../widget/loadingSpinner.dart';
|
import '../../../widget/loadingSpinner.dart';
|
||||||
|
|
||||||
class Files extends StatefulWidget {
|
class Files extends StatefulWidget {
|
||||||
|
@ -3,12 +3,10 @@ import 'dart:convert';
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:marianum_mobile/data/outgoingPackets/talkContactsAskPacket.dart';
|
|
||||||
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import '../../../data/accountModel.dart';
|
import '../../../dataOld/incommingPackets/talkContactsPacket.dart';
|
||||||
import '../../../data/incommingPackets/talkContactsPacket.dart';
|
|
||||||
import '../../../widget/loadingSpinner.dart';
|
import '../../../widget/loadingSpinner.dart';
|
||||||
import 'chatView.dart';
|
import 'chatView.dart';
|
||||||
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
|
|
||||||
import 'package:bubble/bubble.dart';
|
import 'package:bubble/bubble.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:marianum_mobile/data/incommingPackets/talkChatPacket.dart';
|
|
||||||
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import '../../../dataOld/incommingPackets/talkChatPacket.dart';
|
||||||
|
|
||||||
class ChatView extends StatefulWidget {
|
class ChatView extends StatefulWidget {
|
||||||
final String userToken;
|
final String userToken;
|
||||||
const ChatView({Key? key, required this.userToken}) : super(key: key);
|
const ChatView({Key? key, required this.userToken}) : super(key: key);
|
||||||
|
104
lib/screen/pages/timetable/storedTimetable.dart
Normal file
104
lib/screen/pages/timetable/storedTimetable.dart
Normal file
@ -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<StoredTimetable> createState() => _StoredTimetableState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _StoredTimetableState extends State<StoredTimetable> {
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
||||||
|
Provider.of<Timetable>(context, listen: false).run();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Consumer<Timetable>(
|
||||||
|
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<LaneEvents> _buildLaneEvents(Timetable data) {
|
||||||
|
List<LaneEvents> laneEvents = List<LaneEvents>.empty(growable: true);
|
||||||
|
Jiffy.locale("de"); // todo move outwards
|
||||||
|
|
||||||
|
GetTimetableResponse timetable = data.getTimetableResponse!;
|
||||||
|
GetRoomsResponse rooms = data.getRoomsResponse!;
|
||||||
|
GetSubjectsResponse subjects = data.getSubjectsResponse!;
|
||||||
|
|
||||||
|
List<int> 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<TableEvent>.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)));
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,6 @@ import 'package:flutter/cupertino.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRooms.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/loadingSpinner.dart';
|
||||||
import 'package:marianum_mobile/widget/offlineError.dart';
|
import 'package:marianum_mobile/widget/offlineError.dart';
|
||||||
import 'package:timetable_view/timetable_view.dart';
|
import 'package:timetable_view/timetable_view.dart';
|
||||||
@ -132,14 +131,14 @@ class CustomTableStyle extends TimetableStyle {
|
|||||||
@override
|
@override
|
||||||
int get endHour => 17;
|
int get endHour => 17;
|
||||||
@override
|
@override
|
||||||
double get laneWidth => 100;
|
double get laneWidth => 300;
|
||||||
@override
|
@override
|
||||||
Color get cornerColor => Theme.of(context).primaryColor;
|
Color get cornerColor => Theme.of(context).primaryColor;
|
||||||
@override
|
@override
|
||||||
Color get timeItemTextColor => Theme.of(context).primaryColor;
|
Color get timeItemTextColor => Theme.of(context).primaryColor;
|
||||||
@override
|
@override
|
||||||
double get timeItemHeight => 60;
|
double get timeItemHeight => 80;
|
||||||
@override
|
@override
|
||||||
double get timeItemWidth => 40;
|
double get timeItemWidth => 70;
|
||||||
|
|
||||||
}
|
}
|
@ -3,11 +3,12 @@ import 'dart:developer';
|
|||||||
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart';
|
|
||||||
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:timetable_view/timetable_view.dart';
|
import 'package:timetable_view/timetable_view.dart';
|
||||||
|
|
||||||
|
import '../../../dataOld/incommingPackets/timetablePacket.dart';
|
||||||
|
|
||||||
class Timetable extends StatefulWidget {
|
class Timetable extends StatefulWidget {
|
||||||
const Timetable({Key? key}) : super(key: key);
|
const Timetable({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
import '../../data/accountModel.dart';
|
import '../../dataOld/accountModel.dart';
|
||||||
import '../../data/incommingPackets/serverInfoPacket.dart';
|
import '../../dataOld/incommingPackets/serverInfoPacket.dart';
|
||||||
import '../../widget/ListItem.dart';
|
import '../../widget/ListItem.dart';
|
||||||
|
|
||||||
class Settings extends StatefulWidget {
|
class Settings extends StatefulWidget {
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import '../dataOld/incomingPacket.dart';
|
||||||
|
|
||||||
class LoadingPacket extends StatefulWidget {
|
class LoadingPacket extends StatefulWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
final IncomingPacket packet;
|
final IncomingPacket packet;
|
||||||
|
@ -5,10 +5,14 @@
|
|||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
import path_provider_foundation
|
||||||
import shared_preferences_foundation
|
import shared_preferences_foundation
|
||||||
|
import sqflite
|
||||||
import url_launcher_macos
|
import url_launcher_macos
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||||
|
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,9 @@ dependencies:
|
|||||||
jiffy: ^5.0.0
|
jiffy: ^5.0.0
|
||||||
timetable_view: ^0.3.0
|
timetable_view: ^0.3.0
|
||||||
json_annotation: ^4.8.0
|
json_annotation: ^4.8.0
|
||||||
|
sqflite: ^2.2.4+1
|
||||||
|
localstore: ^1.2.3
|
||||||
|
intl: ^0.17.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user