diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml
index 6a4da8f..7a5d985 100644
--- a/.idea/libraries/Dart_Packages.xml
+++ b/.idea/libraries/Dart_Packages.xml
@@ -5,14 +5,14 @@
-
+
-
+
@@ -47,14 +47,14 @@
-
+
-
+
@@ -103,7 +103,7 @@
-
+
@@ -124,21 +124,21 @@
-
+
-
+
-
+
@@ -152,7 +152,7 @@
-
+
@@ -208,7 +208,7 @@
-
+
@@ -229,7 +229,7 @@
-
+
@@ -257,7 +257,7 @@
-
+
@@ -268,10 +268,17 @@
+
+
+
+
+
+
+
-
+
@@ -299,7 +306,14 @@
-
+
+
+
+
+
+
+
+
@@ -327,7 +341,7 @@
-
+
@@ -341,7 +355,7 @@
-
+
@@ -397,7 +411,7 @@
-
+
@@ -418,7 +432,7 @@
-
+
@@ -432,14 +446,14 @@
-
+
-
+
@@ -467,7 +481,7 @@
-
+
@@ -488,14 +502,14 @@
-
+
-
+
@@ -530,28 +544,28 @@
-
+
-
+
-
+
-
+
@@ -572,7 +586,7 @@
-
+
@@ -590,6 +604,13 @@
+
+
+
+
+
+
+
@@ -621,7 +642,28 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -635,14 +677,14 @@
-
+
-
+
@@ -656,7 +698,7 @@
-
+
@@ -698,7 +740,7 @@
-
+
@@ -747,14 +789,14 @@
-
+
-
+
@@ -768,14 +810,7 @@
-
-
-
-
-
-
-
-
+
@@ -793,6 +828,13 @@
+
+
+
+
+
+
+
@@ -810,7 +852,7 @@
-
+
@@ -835,13 +877,6 @@
-
-
-
-
-
-
-
@@ -880,49 +915,49 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -957,14 +992,14 @@
-
+
-
+
@@ -978,14 +1013,14 @@
-
+
-
+
@@ -1020,63 +1055,63 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -1104,7 +1139,7 @@
-
+
@@ -1125,21 +1160,21 @@
-
+
-
+
-
+
@@ -1160,28 +1195,28 @@
-
+
-
+
-
+
-
+
@@ -1230,7 +1265,7 @@
-
+
@@ -1259,30 +1294,30 @@
-
-
-
-
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
+
@@ -1290,65 +1325,71 @@
-
+
-
+
-
+
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
+
+
-
+
+
+
+
-
-
+
+
-
+
@@ -1360,75 +1401,74 @@
-
-
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
+
diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml
index b386e50..e848caa 100644
--- a/.idea/libraries/Flutter_Plugins.xml
+++ b/.idea/libraries/Flutter_Plugins.xml
@@ -1,42 +1,44 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 00a4da9..0798e25 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -2,6 +2,9 @@
+
+
+
diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml
index 64c63c4..b0f704e 100644
--- a/android/.idea/gradle.xml
+++ b/android/.idea/gradle.xml
@@ -14,6 +14,7 @@
+
diff --git a/android/.idea/kotlinc.xml b/android/.idea/kotlinc.xml
index 4251b72..2b8a50f 100644
--- a/android/.idea/kotlinc.xml
+++ b/android/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/android/.idea/workspace.xml b/android/.idea/workspace.xml
index 42c9f91..d4d2719 100644
--- a/android/.idea/workspace.xml
+++ b/android/.idea/workspace.xml
@@ -1,18 +1,16 @@
-
-
-
-
-
-
+
+
+
-
+
+
@@ -33,7 +31,7 @@
-
+
@@ -120,11 +118,11 @@
-
- 1688931886854
+
+ 1689538905221
- 1688931886854
+ 1689538905221
diff --git a/lib/api/marianumcloud/autocomplete/autocompleteApi.dart b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart
index 9040aef..ce55cde 100644
--- a/lib/api/marianumcloud/autocomplete/autocompleteApi.dart
+++ b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart
@@ -5,6 +5,7 @@ import 'package:http/http.dart' as http;
import 'package:http/http.dart';
import '../../../model/accountData.dart';
+import '../../../model/timetable/endpointData.dart';
import 'autocompleteResponse.dart';
class AutocompleteApi {
@@ -21,7 +22,7 @@ class AutocompleteApi {
headers.putIfAbsent("Accept", () => "application/json");
headers.putIfAbsent("OCS-APIRequest", () => "true");
- Uri endpoint = Uri.https("${AccountData().buildHttpAuthString()}@cloud.marianum-fulda.de", "/ocs/v2.php/core/autocomplete/get", getParameters);
+ Uri endpoint = Uri.https("${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().domain}", "${EndpointData().nextcloud().path}/ocs/v2.php/core/autocomplete/get", getParameters);
Response response = await http.get(endpoint, headers: headers);
if(response.statusCode != HttpStatus.ok) throw Exception("Api call failed with ${response.statusCode}: ${response.body}");
diff --git a/lib/api/marianumcloud/files-sharing/fileSharingApi.dart b/lib/api/marianumcloud/files-sharing/fileSharingApi.dart
index 1ec7f7c..49dca74 100644
--- a/lib/api/marianumcloud/files-sharing/fileSharingApi.dart
+++ b/lib/api/marianumcloud/files-sharing/fileSharingApi.dart
@@ -4,6 +4,7 @@ import 'package:http/http.dart' as http;
import 'package:http/http.dart';
import '../../../model/accountData.dart';
+import '../../../model/timetable/endpointData.dart';
import 'fileSharingApiParams.dart';
class FileSharingApi {
@@ -12,7 +13,7 @@ class FileSharingApi {
headers.putIfAbsent("Accept", () => "application/json");
headers.putIfAbsent("OCS-APIRequest", () => "true");
- Uri endpoint = Uri.https("${AccountData().buildHttpAuthString()}@cloud.marianum-fulda.de", "/ocs/v2.php/apps/files_sharing/api/v1/shares", query.toJson().map((key, value) => MapEntry(key, value.toString())));
+ Uri endpoint = Uri.https("${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().domain}", "${EndpointData().nextcloud().path}/ocs/v2.php/apps/files_sharing/api/v1/shares", query.toJson().map((key, value) => MapEntry(key, value.toString())));
Response response = await http.post(endpoint, headers: headers);
if(response.statusCode != HttpStatus.ok) {
diff --git a/lib/api/marianumcloud/talk/talkApi.dart b/lib/api/marianumcloud/talk/talkApi.dart
index ed4830b..752b53b 100644
--- a/lib/api/marianumcloud/talk/talkApi.dart
+++ b/lib/api/marianumcloud/talk/talkApi.dart
@@ -3,6 +3,7 @@ import 'dart:developer';
import 'package:http/http.dart' as http;
import '../../../model/accountData.dart';
+import '../../../model/timetable/endpointData.dart';
import '../../apiError.dart';
import '../../apiParams.dart';
import '../../apiRequest.dart';
@@ -32,7 +33,7 @@ abstract class TalkApi extends ApiRequest {
getParameters?.update(key, (value) => value.toString());
});
- Uri endpoint = Uri.https("${AccountData().buildHttpAuthString()}@cloud.marianum-fulda.de", "/ocs/v2.php/apps/spreed/api/$path", getParameters);
+ Uri endpoint = Uri.https("${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().domain}", "${EndpointData().nextcloud().path}/ocs/v2.php/apps/spreed/api/$path", getParameters);
headers ??= {};
headers?.putIfAbsent("Accept", () => "application/json");
diff --git a/lib/api/marianumcloud/webdav/webdavApi.dart b/lib/api/marianumcloud/webdav/webdavApi.dart
index f1d6a4e..014f3e1 100644
--- a/lib/api/marianumcloud/webdav/webdavApi.dart
+++ b/lib/api/marianumcloud/webdav/webdavApi.dart
@@ -1,6 +1,7 @@
import 'package:nextcloud/nextcloud.dart';
import '../../../model/accountData.dart';
+import '../../../model/timetable/endpointData.dart';
import '../../apiRequest.dart';
import '../../apiResponse.dart';
@@ -17,10 +18,10 @@ abstract class WebdavApi extends ApiRequest {
static Future webdavConnectString = buildWebdavConnectString();
static Future establishWebdavConnection() async {
- return NextcloudClient("https://cloud.marianum-fulda.de/", username: AccountData().getUsername(), password: AccountData().getPassword(), loginName: AccountData().getUsername()).webdav;
+ return NextcloudClient("https://${EndpointData().nextcloud().full()}", username: AccountData().getUsername(), password: AccountData().getPassword(), loginName: AccountData().getUsername()).webdav;
}
static Future buildWebdavConnectString() async {
- return "https://${AccountData().buildHttpAuthString()}@cloud.marianum-fulda.de/remote.php/dav/files/${AccountData().getUsername()}/";
+ return "https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/remote.php/dav/files/${AccountData().getUsername()}/";
}
}
\ No newline at end of file
diff --git a/lib/api/webuntis/webuntisApi.dart b/lib/api/webuntis/webuntisApi.dart
index dbfb226..7890f05 100644
--- a/lib/api/webuntis/webuntisApi.dart
+++ b/lib/api/webuntis/webuntisApi.dart
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
+import '../../model/timetable/endpointData.dart';
import '../apiParams.dart';
import '../apiRequest.dart';
import '../apiResponse.dart';
@@ -8,7 +9,7 @@ import 'queries/authenticate/authenticate.dart';
import 'webuntisError.dart';
abstract class WebuntisApi extends ApiRequest {
- Uri endpoint = Uri.parse("https://peleus.webuntis.com/WebUntis/jsonrpc.do?school=marianum-fulda");
+ Uri endpoint = Uri.parse("https://${EndpointData().webuntis().full()}/WebUntis/jsonrpc.do?school=marianum-fulda");
String method;
ApiParams? genericParam;
http.Response? response;
diff --git a/lib/model/accountData.dart b/lib/model/accountData.dart
index d47bafd..c488ab0 100644
--- a/lib/model/accountData.dart
+++ b/lib/model/accountData.dart
@@ -43,13 +43,13 @@ class AccountData {
await _updateFromStorage();
}
- void removeData(BuildContext context) async {
+ Future removeData(BuildContext context) async {
_populated = Completer();
Provider.of(context, listen: false).setState(AccountModelState.loggedOut);
SharedPreferences storage = await _storage;
- storage.remove(_usernameField);
- storage.remove(_passwordField);
+ await storage.remove(_usernameField);
+ await storage.remove(_passwordField);
}
Future _updateFromStorage() async {
diff --git a/lib/model/timetable/endpointData.dart b/lib/model/timetable/endpointData.dart
new file mode 100644
index 0000000..3e3111b
--- /dev/null
+++ b/lib/model/timetable/endpointData.dart
@@ -0,0 +1,76 @@
+
+import '../accountData.dart';
+
+enum EndpointMode {
+ live,
+ stage,
+}
+
+class EndpointOptions {
+ Endpoint live;
+ Endpoint? staged;
+ EndpointOptions({required this.live, required this.staged});
+
+ Endpoint get(EndpointMode mode) {
+ if(staged == null || mode == EndpointMode.live) return live;
+ return staged!;
+ }
+}
+
+class Endpoint {
+ String domain;
+ String path;
+
+ Endpoint({required this.domain, this.path = ""});
+
+ String full() {
+ return domain + path;
+ }
+}
+
+class EndpointData {
+ static final EndpointData _instance = EndpointData._construct();
+
+ String? usernameOverride;
+
+ factory EndpointData() {
+ return _instance;
+ }
+
+ EndpointData._construct();
+
+ EndpointMode getEndpointMode() {
+ late String existingName;
+ if(usernameOverride != null) {
+ existingName = usernameOverride!;
+ } else {
+ existingName = AccountData().getUsername();
+ }
+ return existingName.startsWith("google") ? EndpointMode.stage : EndpointMode.live;
+ }
+
+ Endpoint webuntis() {
+ return EndpointOptions(
+ live: Endpoint(
+ domain: "peleus.webuntis.com",
+ ),
+ staged: Endpoint(
+ domain: "mhsl.eu",
+ path: "/marianum/marianummobile/webuntis/public/index.php/api"
+ ),
+ ).get(getEndpointMode());
+ }
+
+ Endpoint nextcloud() {
+ return EndpointOptions(
+ live: Endpoint(
+ domain: "cloud.marianum-fulda.de",
+ ),
+ staged: Endpoint(
+ domain: "mhsl.eu",
+ path: "/marianum/marianummobile/cloud",
+ )
+ ).get(getEndpointMode());
+ }
+
+}
\ No newline at end of file
diff --git a/lib/view/login/login.dart b/lib/view/login/login.dart
index d7280ed..715f6b1 100644
--- a/lib/view/login/login.dart
+++ b/lib/view/login/login.dart
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_login/flutter_login.dart';
+import 'package:marianum_mobile/model/timetable/endpointData.dart';
import 'package:provider/provider.dart';
import '../../api/webuntis/queries/authenticate/authenticateParams.dart';
@@ -23,15 +24,17 @@ class _LoginState extends State {
}
Future _login(LoginData data) async {
- AccountData().removeData(context);
+ await AccountData().removeData(context);
try {
+ EndpointData().usernameOverride = data.name;
await Authenticate(
AuthenticateParams(
user: data.name,
password: data.password,
)
).run().then((value) async {
+ EndpointData().usernameOverride = null;
await AccountData().setData(context, data.name, data.password);
setState(() {
@@ -41,7 +44,7 @@ class _LoginState extends State {
} catch(e) {
return e.toString();
}
-
+ await Future.delayed(const Duration(seconds: 1));
return null;
}
diff --git a/lib/view/pages/talk/chatMessage.dart b/lib/view/pages/talk/chatMessage.dart
index 8446d3c..cc7b9cd 100644
--- a/lib/view/pages/talk/chatMessage.dart
+++ b/lib/view/pages/talk/chatMessage.dart
@@ -2,6 +2,7 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_linkify/flutter_linkify.dart';
+import 'package:marianum_mobile/model/timetable/endpointData.dart';
import 'package:url_launcher/url_launcher_string.dart';
import '../../../api/marianumcloud/talk/chat/getChatResponse.dart';
@@ -48,7 +49,7 @@ class ChatMessage {
placeholder: (context, url) {
return const Padding(padding: EdgeInsets.all(10), child: CircularProgressIndicator());
},
- imageUrl: "https://cloud.marianum-fulda.de/core/preview?fileId=${file!.id}&x=100&y=-1&a=1",
+ imageUrl: "https://${EndpointData().nextcloud().full()}/core/preview?fileId=${file!.id}&x=100&y=-1&a=1",
httpHeaders: {
"Authorization": "Basic ${AccountData().buildHttpAuthString()}"
},
diff --git a/lib/view/pages/talk/chatTile.dart b/lib/view/pages/talk/chatTile.dart
index 20a252e..e724d87 100644
--- a/lib/view/pages/talk/chatTile.dart
+++ b/lib/view/pages/talk/chatTile.dart
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
+import 'package:marianum_mobile/model/timetable/endpointData.dart';
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
import 'package:shared_preferences/shared_preferences.dart';
@@ -48,7 +49,7 @@ class _ChatTileState extends State {
@override
Widget build(BuildContext context) {
CircleAvatar circleAvatar = CircleAvatar(
- foregroundImage: widget.data.type == GetRoomResponseObjectConversationType.oneToOne ? Image.network("https://cloud.marianum-fulda.de/avatar/${widget.data.name}/128").image : null,
+ foregroundImage: widget.data.type == GetRoomResponseObjectConversationType.oneToOne ? Image.network("https://${EndpointData().nextcloud().full()}/avatar/${widget.data.name}/128").image : null,
backgroundColor: Theme.of(context).primaryColor,
foregroundColor: Colors.white,
child: widget.data.type == GetRoomResponseObjectConversationType.group ? const Icon(Icons.group) : const Icon(Icons.person),
diff --git a/lib/view/pages/talk/joinChat.dart b/lib/view/pages/talk/joinChat.dart
index 9d1c97d..91e2071 100644
--- a/lib/view/pages/talk/joinChat.dart
+++ b/lib/view/pages/talk/joinChat.dart
@@ -1,6 +1,7 @@
import 'package:async/async.dart';
import 'package:flutter/material.dart';
+import 'package:marianum_mobile/model/timetable/endpointData.dart';
import '../../../api/marianumcloud/autocomplete/autocompleteApi.dart';
import '../../../api/marianumcloud/autocomplete/autocompleteResponse.dart';
@@ -62,7 +63,7 @@ class JoinChat extends SearchDelegate {
itemBuilder: (context, index) {
AutocompleteResponseObject object = snapshot.data!.data[index];
CircleAvatar circleAvatar = CircleAvatar(
- foregroundImage: Image.network("https://cloud.marianum-fulda.de/avatar/${object.id}/128").image,
+ foregroundImage: Image.network("https://${EndpointData().nextcloud().full()}/avatar/${object.id}/128").image,
backgroundColor: Theme.of(context).primaryColor,
foregroundColor: Colors.white,
child: const Icon(Icons.person),
diff --git a/lib/widget/loadingSpinner.dart b/lib/widget/loadingSpinner.dart
index fcb9fb3..8c27ff8 100644
--- a/lib/widget/loadingSpinner.dart
+++ b/lib/widget/loadingSpinner.dart
@@ -31,10 +31,15 @@ class _LoadingSpinnerState extends State {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
- const CircularProgressIndicator(),
+ Visibility(
+ visible: !textVisible,
+ replacement: const Icon(Icons.signal_wifi_connected_no_internet_4_outlined),
+ child: const CircularProgressIndicator(),
+ ),
+ const SizedBox(height: 30),
Visibility(
visible: textVisible,
- child: const Text("Bist du mit dem Internet verbunden?"),
+ child: const Text("Etwas scheint nicht zu funktionieren!\nBist du mit dem Internet verbunden?\n\nVersuche die App neuzustarten"),
),
],
),
diff --git a/pubspec.yaml b/pubspec.yaml
index 6460544..c62e135 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
-version: 0.0.1+10
+version: 0.0.1+12
environment:
sdk: '>3.0.0'