diff --git a/lib/loginmanager.dart b/lib/loginmanager.dart index 0e00e60..b6e8ea5 100644 --- a/lib/loginmanager.dart +++ b/lib/loginmanager.dart @@ -1,16 +1,46 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; class LoginManager { - static Future?> getDetails() async { + static Future?> getDetails(String id) async { // zkontrolovat secure storage pokud je něco uložené const storage = FlutterSecureStorage(); - var user = await storage.read(key: "oc_user"); - var pass = await storage.read(key: "oc_pass"); - var url = await storage.read(key: "oc_url"); + var user = await storage.read(key: "oc_user_$id"); + var pass = await storage.read(key: "oc_pass_$id"); + var url = await storage.read(key: "oc_url_$id"); if (user == null || pass == null || url == null) return null; return {"user": user, "pass": pass, "url": url}; } + static Future>> ziskatVsechnyUlozene() async { + const storage = FlutterSecureStorage(); + + if (await storage.containsKey(key: "oc_user")) { + await prevest(); + } + var vsechno = await storage.readAll(); + vsechno.removeWhere((key, value) => key.startsWith("oc_pass_")); + var uzivatele = >{}; + vsechno.forEach((key, value) { + if (key.startsWith("oc_user_")) { + var user = int.parse(key.substring(8)); + if (uzivatele[user] == null) { + uzivatele[user] = [value]; + } else { + uzivatele[user]!.add(value); + } + } else { + var user = int.parse(key.substring(8)); + if (uzivatele[user] == null) { + uzivatele[user] = [value]; + } else { + uzivatele[user]!.add(value); + } + } + }); + print(uzivatele); + return uzivatele; + } + static Future setDetails(String user, String pass, String url) async { const storage = FlutterSecureStorage(); await storage.write(key: "oc_user", value: user); @@ -22,4 +52,21 @@ class LoginManager { const storage = FlutterSecureStorage(); return await storage.containsKey(key: "oc_pass"); } + + /// Převést na nový formát ukládání + static Future prevest() async { + const storage = FlutterSecureStorage(); + var user = await storage.read(key: "oc_user"); + var pass = await storage.read(key: "oc_pass"); + var url = await storage.read(key: "oc_url"); + if (user == null || pass == null || url == null) return false; + await storage.write(key: "oc_user_0", value: user); + await storage.write(key: "oc_pass_0", value: pass); + await storage.write(key: "oc_url_0", value: url); + + await storage.delete(key: "oc_user"); + await storage.delete(key: "oc_pass"); + await storage.delete(key: "oc_url"); + return true; + } } diff --git a/lib/main.dart b/lib/main.dart index 84357e2..e58150b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -59,46 +59,48 @@ void oznamitPredem(SharedPreferences prefs, tz.Location l) async { // TODO možnost brát z offline dat } else {*/ // bere online - var d = await LoginManager.getDetails(); // získat údaje - if (d != null) { - var c = Canteen(d["url"]!); - if (await c.login(d["user"]!, d["pass"]!)) { - var jidla = await c.jidelnicekDen(); - try { - var jidlo = jidla.jidla.singleWhere( - (element) => element.objednano); // získá objednané jídlo - var kdy = DateTime.parse(prefs.getString( - "oznameni_cas")!); // uložíme čas, kdy se má odeslat oznámení + if ((await LoginManager.ziskatVsechnyUlozene()).isNotEmpty) { + var d = await LoginManager.getDetails("0s"); // získat údaje + if (d != null) { + var c = Canteen(d["url"]!); + if (await c.login(d["user"]!, d["pass"]!)) { + var jidla = await c.jidelnicekDen(); + try { + var jidlo = jidla.jidla.singleWhere( + (element) => element.objednano); // získá objednané jídlo + var kdy = DateTime.parse(prefs.getString( + "oznameni_cas")!); // uložíme čas, kdy se má odeslat oznámení - // data o oznámení - const AndroidNotificationDetails androidSpec = - AndroidNotificationDetails('predobedem', 'Oznámení před obědem', - channelDescription: 'Oznámení o dnešním jídle', - importance: Importance.max, - priority: Priority.high, - ticker: 'today meal'); - const IOSNotificationDetails iOSpec = - IOSNotificationDetails(presentAlert: true, presentBadge: true); + // data o oznámení + const AndroidNotificationDetails androidSpec = + AndroidNotificationDetails('predobedem', 'Oznámení před obědem', + channelDescription: 'Oznámení o dnešním jídle', + importance: Importance.max, + priority: Priority.high, + ticker: 'today meal'); + const IOSNotificationDetails iOSpec = + IOSNotificationDetails(presentAlert: true, presentBadge: true); - // naplánovat - await flutterLocalNotificationsPlugin.zonedSchedule( - 0, - title, - "${jidlo.varianta} - ${jidlo.nazev}", - tz.TZDateTime.from( - casNaDate( - TimeOfDay(hour: kdy.hour, minute: kdy.minute), - ), - l), - const NotificationDetails(android: androidSpec, iOS: iOSpec), - androidAllowWhileIdle: true, - uiLocalNotificationDateInterpretation: - UILocalNotificationDateInterpretation.absoluteTime); - } on StateError catch (_) { - // nenalezeno + // naplánovat + await flutterLocalNotificationsPlugin.zonedSchedule( + 0, + title, + "${jidlo.varianta} - ${jidlo.nazev}", + tz.TZDateTime.from( + casNaDate( + TimeOfDay(hour: kdy.hour, minute: kdy.minute), + ), + l), + const NotificationDetails(android: androidSpec, iOS: iOSpec), + androidAllowWhileIdle: true, + uiLocalNotificationDateInterpretation: + UILocalNotificationDateInterpretation.absoluteTime); + } on StateError catch (_) { + // nenalezeno + } } + // } } - // } } } @@ -183,7 +185,7 @@ class _LoginPageState extends State { @override void initState() { super.initState(); - LoginManager.getDetails().then((r) async { + LoginManager.ziskatVsechnyUlozene().then((j) async { if (Platform.isIOS) { // žádat o oprávnění na iOS await flutterLocalNotificationsPlugin @@ -195,6 +197,11 @@ class _LoginPageState extends State { sound: true, ); } + Map? r; + if (j.isNotEmpty) { + r = await LoginManager.getDetails( + "0"); // TODO: změnit, aby šlo vybírat účet, který se použije + } if (r != null) { // Automaticky přihlásit showDialog( @@ -410,6 +417,9 @@ class _LoginPageState extends State { } }, child: Text(Languages.of(context)!.logIn)), + const Divider( + height: 5, + ) ], ), ), diff --git a/lib/okna/nastaveni.dart b/lib/okna/nastaveni.dart index 4839240..4df0352 100644 --- a/lib/okna/nastaveni.dart +++ b/lib/okna/nastaveni.dart @@ -217,7 +217,7 @@ class _NastaveniState extends State { void vytvoritOznameni(DateTime den) async { await widget.n.cancelAll(); - var d = await LoginManager.getDetails(); // získat údaje + var d = await LoginManager.getDetails("0"); // získat údaje TODO: změnit if (d != null) { // Nové oznámení var c = Canteen(d["url"]!);