Made google-play login working again, and fixed numerous bugs
All checks were successful
update version / increment-build-number (push) Successful in 9s
All checks were successful
update version / increment-build-number (push) Successful in 9s
This commit is contained in:
parent
2edec5ca3c
commit
62ae6a6e3c
@ -5,7 +5,7 @@ import 'package:http/http.dart' as http;
|
|||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
import '../../../model/accountData.dart';
|
import '../../../model/accountData.dart';
|
||||||
import '../../../model/timetable/endpointData.dart';
|
import '../../../model/endpointData.dart';
|
||||||
import 'autocompleteResponse.dart';
|
import 'autocompleteResponse.dart';
|
||||||
|
|
||||||
class AutocompleteApi {
|
class AutocompleteApi {
|
||||||
|
@ -4,7 +4,7 @@ import 'package:http/http.dart' as http;
|
|||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
import '../../../model/accountData.dart';
|
import '../../../model/accountData.dart';
|
||||||
import '../../../model/timetable/endpointData.dart';
|
import '../../../model/endpointData.dart';
|
||||||
import 'fileSharingApiParams.dart';
|
import 'fileSharingApiParams.dart';
|
||||||
|
|
||||||
class FileSharingApi {
|
class FileSharingApi {
|
||||||
|
@ -3,7 +3,7 @@ import 'dart:developer';
|
|||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
import '../../../model/accountData.dart';
|
import '../../../model/accountData.dart';
|
||||||
import '../../../model/timetable/endpointData.dart';
|
import '../../../model/endpointData.dart';
|
||||||
import '../../apiError.dart';
|
import '../../apiError.dart';
|
||||||
import '../../apiParams.dart';
|
import '../../apiParams.dart';
|
||||||
import '../../apiRequest.dart';
|
import '../../apiRequest.dart';
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import 'package:nextcloud/nextcloud.dart';
|
import 'package:nextcloud/nextcloud.dart';
|
||||||
|
|
||||||
import '../../../model/accountData.dart';
|
import '../../../model/accountData.dart';
|
||||||
import '../../../model/timetable/endpointData.dart';
|
import '../../../model/endpointData.dart';
|
||||||
import '../../apiRequest.dart';
|
import '../../apiRequest.dart';
|
||||||
import '../../apiResponse.dart';
|
import '../../apiResponse.dart';
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
import '../../model/timetable/endpointData.dart';
|
import '../../model/endpointData.dart';
|
||||||
import '../apiParams.dart';
|
import '../apiParams.dart';
|
||||||
import '../apiRequest.dart';
|
import '../apiRequest.dart';
|
||||||
import '../apiResponse.dart';
|
import '../apiResponse.dart';
|
||||||
|
@ -35,7 +35,7 @@ class AccountData {
|
|||||||
return _password!;
|
return _password!;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setData(BuildContext context, String username, String password) async {
|
Future<void> setData(String username, String password) async {
|
||||||
SharedPreferences storage = await _storage;
|
SharedPreferences storage = await _storage;
|
||||||
|
|
||||||
storage.setString(_usernameField, username);
|
storage.setString(_usernameField, username);
|
||||||
@ -43,9 +43,10 @@ class AccountData {
|
|||||||
await _updateFromStorage();
|
await _updateFromStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> removeData(BuildContext context) async {
|
Future<void> removeData({BuildContext? context}) async {
|
||||||
_populated = Completer();
|
_populated = Completer();
|
||||||
Provider.of<AccountModel>(context, listen: false).setState(AccountModelState.loggedOut);
|
|
||||||
|
if(context != null) Provider.of<AccountModel>(context, listen: false).setState(AccountModelState.loggedOut);
|
||||||
|
|
||||||
SharedPreferences storage = await _storage;
|
SharedPreferences storage = await _storage;
|
||||||
await storage.remove(_usernameField);
|
await storage.remove(_usernameField);
|
||||||
@ -54,12 +55,12 @@ class AccountData {
|
|||||||
|
|
||||||
Future<void> _updateFromStorage() async {
|
Future<void> _updateFromStorage() async {
|
||||||
SharedPreferences storage = await _storage;
|
SharedPreferences storage = await _storage;
|
||||||
await storage.reload();
|
//await storage.reload(); // This line was the cause of the first rejected google play upload :(
|
||||||
if(storage.containsKey(_usernameField) && storage.containsKey(_passwordField)) {
|
if(storage.containsKey(_usernameField) && storage.containsKey(_passwordField)) {
|
||||||
_username = storage.getString(_usernameField);
|
_username = storage.getString(_usernameField);
|
||||||
_password = storage.getString(_passwordField);
|
_password = storage.getString(_passwordField);
|
||||||
}
|
}
|
||||||
_populated.complete();
|
if(!_populated.isCompleted) _populated.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> waitForPopulation() async {
|
Future<bool> waitForPopulation() async {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import '../accountData.dart';
|
import 'accountData.dart';
|
||||||
|
|
||||||
enum EndpointMode {
|
enum EndpointMode {
|
||||||
live,
|
live,
|
||||||
@ -31,8 +31,6 @@ class Endpoint {
|
|||||||
class EndpointData {
|
class EndpointData {
|
||||||
static final EndpointData _instance = EndpointData._construct();
|
static final EndpointData _instance = EndpointData._construct();
|
||||||
|
|
||||||
String? usernameOverride;
|
|
||||||
|
|
||||||
factory EndpointData() {
|
factory EndpointData() {
|
||||||
return _instance;
|
return _instance;
|
||||||
}
|
}
|
||||||
@ -41,11 +39,7 @@ class EndpointData {
|
|||||||
|
|
||||||
EndpointMode getEndpointMode() {
|
EndpointMode getEndpointMode() {
|
||||||
late String existingName;
|
late String existingName;
|
||||||
if(usernameOverride != null) {
|
|
||||||
existingName = usernameOverride!;
|
|
||||||
} else {
|
|
||||||
existingName = AccountData().getUsername();
|
existingName = AccountData().getUsername();
|
||||||
}
|
|
||||||
return existingName.startsWith("google") ? EndpointMode.stage : EndpointMode.live;
|
return existingName.startsWith("google") ? EndpointMode.stage : EndpointMode.live;
|
||||||
}
|
}
|
||||||
|
|
@ -1,11 +1,12 @@
|
|||||||
|
|
||||||
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_login/flutter_login.dart';
|
import 'package:flutter_login/flutter_login.dart';
|
||||||
import 'package:marianum_mobile/model/timetable/endpointData.dart';
|
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoom.dart';
|
||||||
|
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomParams.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import '../../api/webuntis/queries/authenticate/authenticateParams.dart';
|
|
||||||
import '../../api/webuntis/queries/authenticate/authenticate.dart';
|
|
||||||
import '../../model/accountData.dart';
|
import '../../model/accountData.dart';
|
||||||
import '../../model/accountModel.dart';
|
import '../../model/accountModel.dart';
|
||||||
|
|
||||||
@ -24,26 +25,26 @@ class _LoginState extends State<Login> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<String?> _login(LoginData data) async {
|
Future<String?> _login(LoginData data) async {
|
||||||
await AccountData().removeData(context);
|
await AccountData().removeData();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
EndpointData().usernameOverride = data.name;
|
await AccountData().setData(data.name, data.password);
|
||||||
await Authenticate(
|
await GetRoom(
|
||||||
AuthenticateParams(
|
GetRoomParams(
|
||||||
user: data.name,
|
includeStatus: false,
|
||||||
password: data.password,
|
),
|
||||||
)
|
|
||||||
).run().then((value) async {
|
).run().then((value) async {
|
||||||
EndpointData().usernameOverride = null;
|
await AccountData().setData(data.name, data.password);
|
||||||
await AccountData().setData(context, data.name, data.password);
|
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
displayDisclaimerText = false;
|
displayDisclaimerText = false;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
return e.toString();
|
await AccountData().removeData();
|
||||||
|
log(e.toString());
|
||||||
|
return "Benutzername oder Password falsch! (${e.toString()})";
|
||||||
}
|
}
|
||||||
|
|
||||||
await Future.delayed(const Duration(seconds: 1));
|
await Future.delayed(const Duration(seconds: 1));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class AddTimerDialog extends StatefulWidget {
|
|
||||||
const AddTimerDialog({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AddTimerDialog> createState() => _AddTimerDialogState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AddTimerDialogState extends State<AddTimerDialog> {
|
|
||||||
DateTime selected = DateTime.now().add(const Duration(days: 1));
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return AlertDialog(
|
|
||||||
title: const Text("Timer hinzufügen"),
|
|
||||||
content: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
const TextField(
|
|
||||||
decoration: InputDecoration(
|
|
||||||
labelText: "Timer Name"
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
TextButton(onPressed: () async {
|
|
||||||
DateTime? selectedDate = await showDatePicker(context: context, initialDate: DateTime.now(), firstDate: DateTime.now(), lastDate: DateTime.now().add(const Duration(days: 365 * 10)));
|
|
||||||
if(selectedDate == null) return;
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
selected = selectedDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
}, child: const Text("Datum auswählen")),
|
|
||||||
|
|
||||||
TextButton(onPressed: () async {
|
|
||||||
TimeOfDay? selectedTime = await showTimePicker(context: context, initialTime: TimeOfDay.fromDateTime(DateTime.now()));
|
|
||||||
if(selectedTime == null) return;
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
selected = selected.copyWith(hour: selectedTime.hour, minute: selectedTime.minute);
|
|
||||||
});
|
|
||||||
}, child: const Text("Zeit auswählen")),
|
|
||||||
|
|
||||||
Text(selected.toString())
|
|
||||||
],
|
|
||||||
),
|
|
||||||
actions: [
|
|
||||||
TextButton(onPressed: () {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
}, child: const Text("Abbrechen")),
|
|
||||||
TextButton(onPressed: () {
|
|
||||||
// TODO add timer
|
|
||||||
}, child: const Text("Hinzufügen")),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'addTimerDialog.dart';
|
|
||||||
import 'timer.dart';
|
|
||||||
|
|
||||||
class Countdown extends StatefulWidget {
|
|
||||||
const Countdown({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<Countdown> createState() => _CountdownState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _CountdownState extends State<Countdown> {
|
|
||||||
List<Timer> timers = List.empty(growable: true);
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
timers.add(Timer(key: const Key("1"), target: DateTime.now().add(const Duration(seconds: 20)), label: "Countdown 1"));
|
|
||||||
timers.add(Timer(key: const Key("2"), author: "goldbaja", target: DateTime.now().add(const Duration(days: 20)), label: "Sommerferien"));
|
|
||||||
timers.add(Timer(key: const Key("3"), target: DateTime.now().add(const Duration(hours: 20)), label: "Joa"));
|
|
||||||
|
|
||||||
timers.sort((a, b) => a.target.compareTo(b.target));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text("Countdown"),
|
|
||||||
actions: [
|
|
||||||
IconButton(onPressed: () {
|
|
||||||
showDialog(context: context, builder: (context) => const AddTimerDialog());
|
|
||||||
}, icon: const Icon(Icons.add)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
body: ReorderableListView(
|
|
||||||
shrinkWrap: true,
|
|
||||||
footer: Container(
|
|
||||||
padding: const EdgeInsets.only(top: 30),
|
|
||||||
child: Center(
|
|
||||||
child: Text("Halte und Ziehe ein Element um es umzusortieren.", style: TextStyle(color: Theme.of(context).disabledColor)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onReorder: (int oldIndex, int newIndex) { },
|
|
||||||
children: timers,
|
|
||||||
|
|
||||||
),
|
|
||||||
// body: ListView.separated(
|
|
||||||
// itemBuilder: (context, index) => timers[index],
|
|
||||||
// separatorBuilder: (context, index) => const Divider(),
|
|
||||||
// itemCount: timers.length
|
|
||||||
// )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'animatedTime.dart';
|
|
||||||
|
|
||||||
class Timer extends StatefulWidget {
|
|
||||||
final DateTime target;
|
|
||||||
final String? author;
|
|
||||||
final String label;
|
|
||||||
const Timer({Key? key, required this.target, this.author, required this.label}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<Timer> createState() => _TimerState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _TimerState extends State<Timer> {
|
|
||||||
late bool isLocal;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
isLocal = widget.author == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListTile(
|
|
||||||
leading: const Icon(Icons.timer),
|
|
||||||
title: AnimatedTime(
|
|
||||||
callback: () {
|
|
||||||
if(widget.target.isBefore(DateTime.now())) return Duration.zero;
|
|
||||||
return widget.target.difference(DateTime.now());
|
|
||||||
},
|
|
||||||
),
|
|
||||||
trailing: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
if(!isLocal) Row(
|
|
||||||
children: [
|
|
||||||
const Text("5"),
|
|
||||||
IconButton(onPressed: () {
|
|
||||||
|
|
||||||
}, icon: const Icon(Icons.thumb_up_outlined)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
IconButton(onPressed: () {
|
|
||||||
|
|
||||||
}, icon: const Icon(Icons.star_outline))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
subtitle: Text("${widget.label}${!isLocal ? "\ngeteilt von ${widget.author}" : ""}"),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,7 +11,7 @@ import '../../../../widget/confirmDialog.dart';
|
|||||||
import '../../../../widget/debug/debugTile.dart';
|
import '../../../../widget/debug/debugTile.dart';
|
||||||
import '../../../../widget/loadingSpinner.dart';
|
import '../../../../widget/loadingSpinner.dart';
|
||||||
import '../../../../widget/placeholderView.dart';
|
import '../../../../widget/placeholderView.dart';
|
||||||
import '../countdown/animatedTime.dart';
|
import '../../../../widget/animatedTime.dart';
|
||||||
|
|
||||||
class Holidays extends StatefulWidget {
|
class Holidays extends StatefulWidget {
|
||||||
const Holidays({super.key});
|
const Holidays({super.key});
|
||||||
|
@ -5,7 +5,6 @@ import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
|
|||||||
|
|
||||||
import '../../../widget/ListItem.dart';
|
import '../../../widget/ListItem.dart';
|
||||||
import '../../settings/settings.dart';
|
import '../../settings/settings.dart';
|
||||||
import 'countdown/countdown.dart';
|
|
||||||
import 'gradeAverages/gradeAverage.dart';
|
import 'gradeAverages/gradeAverage.dart';
|
||||||
import 'holidays/holidays.dart';
|
import 'holidays/holidays.dart';
|
||||||
import 'message/message.dart';
|
import 'message/message.dart';
|
||||||
@ -29,7 +28,6 @@ class Overhang extends StatelessWidget {
|
|||||||
ListItemNavigator(icon: Icons.room, text: "Raumplan", target: Roomplan()),
|
ListItemNavigator(icon: Icons.room, text: "Raumplan", target: Roomplan()),
|
||||||
ListItemNavigator(icon: Icons.calculate, text: "Notendurschnittsrechner", target: GradeAverage()),
|
ListItemNavigator(icon: Icons.calculate, text: "Notendurschnittsrechner", target: GradeAverage()),
|
||||||
ListItemNavigator(icon: Icons.calendar_month, text: "Schulferien", target: Holidays()),
|
ListItemNavigator(icon: Icons.calendar_month, text: "Schulferien", target: Holidays()),
|
||||||
if(!kReleaseMode) ListItemNavigator(icon: Icons.timer, text: "Countdown", target: Countdown()),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||||
import 'package:marianum_mobile/model/timetable/endpointData.dart';
|
import 'package:marianum_mobile/model/endpointData.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
import '../../../api/marianumcloud/talk/chat/getChatResponse.dart';
|
import '../../../api/marianumcloud/talk/chat/getChatResponse.dart';
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:marianum_mobile/model/timetable/endpointData.dart';
|
import 'package:marianum_mobile/model/endpointData.dart';
|
||||||
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
|
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
import 'package:async/async.dart';
|
import 'package:async/async.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:marianum_mobile/model/timetable/endpointData.dart';
|
import 'package:marianum_mobile/model/endpointData.dart';
|
||||||
|
|
||||||
import '../../../api/marianumcloud/autocomplete/autocompleteApi.dart';
|
import '../../../api/marianumcloud/autocomplete/autocompleteApi.dart';
|
||||||
import '../../../api/marianumcloud/autocomplete/autocompleteResponse.dart';
|
import '../../../api/marianumcloud/autocomplete/autocompleteResponse.dart';
|
||||||
|
@ -53,8 +53,11 @@ class _SettingsState extends State<Settings> {
|
|||||||
onConfirm: () {
|
onConfirm: () {
|
||||||
SharedPreferences.getInstance().then((value) => {
|
SharedPreferences.getInstance().then((value) => {
|
||||||
value.clear(),
|
value.clear(),
|
||||||
}).then((value) {
|
}).then((value) async {
|
||||||
AccountData().removeData(context);
|
PaintingBinding.instance.imageCache.clear();
|
||||||
|
Provider.of<SettingsProvider>(context, listen: false).reset();
|
||||||
|
const CacheView().clear();
|
||||||
|
AccountData().removeData(context: context);
|
||||||
Navigator.popUntil(context, (route) => !Navigator.canPop(context));
|
Navigator.popUntil(context, (route) => !Navigator.canPop(context));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:animated_digit/animated_digit.dart';
|
import 'package:animated_digit/animated_digit.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class AnimatedTime extends StatefulWidget {
|
class AnimatedTime extends StatefulWidget {
|
@ -16,7 +16,7 @@ class _LoadingSpinnerState extends State<LoadingSpinner> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
timer = Timer(const Duration(seconds: 10), () {
|
timer = Timer(const Duration(seconds: 15), () {
|
||||||
setState(() {
|
setState(() {
|
||||||
textVisible = true;
|
textVisible = true;
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user