diff --git a/CHANGELOG.md b/CHANGELOG.md index 326172f..f3d1b7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# 1.3.1 +- Odstranit zbytečné podmínky +- Přidat oznámení o optimalizaci baterie +- Změnit ID kanálu pro android oznámení +- Změnit ikonu pro přesunutí na aktuální den +- Přidat varování před odhlášením +- Při prvním zapnutí nastavovat výchozí čas pro oznámení o hodinu dopředu +- V oznámení zobrazit nejdřív variantu a pak název jídla # 1.3.0 - Odstranit connectivity_plus - Přidat možnost oznámení s info o obědu v daný čas diff --git a/README.md b/README.md index 163d169..051371b 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # OpenCanteen -Open-Source **neoficiální** iCanteen klient +Open-Source **neoficiální** aplikace pro přístup do iCanteen [![wakatime](https://wakatime.com/badge/user/17178fab-a33c-430f-a764-7b3f26c7b966/project/e3ff9994-0026-4041-a529-1cb2041bdf4b.svg)](https://wakatime.com/badge/user/17178fab-a33c-430f-a764-7b3f26c7b966/project/e3ff9994-0026-4041-a529-1cb2041bdf4b) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fhernikplays%2Fopencanteen.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fhernikplays%2Fopencanteen?ref=badge_shield) [![Codemagic build status](https://api.codemagic.io/apps/62863e4c96304ce0518a1694/62863e4c96304ce0518a1693/status_badge.svg)](https://codemagic.io/apps/62863e4c96304ce0518a1694/62863e4c96304ce0518a1693/latest_build) [![Commit Style: Conventional Commits](https://img.shields.io/badge/commit%20style-conventional%20commits-pink)](https://www.conventionalcommits.org/en/v1.0.0/) ## Co umí -Aplikace vás přihlásí do instance iCanteen ***pokud ji podporuje [canteenlib](https://github.com/hernikplays/canteenlib/blob/main/COMPATIBILITY.md), jinak experimentálně***, a umožní vám zobrazit, objednávat obědy, objednávat nebo přidávat jídlo na burzubeta. +Aplikace vás přihlásí do vaší iCanteen ***pokud ji podporuje [canteenlib](https://github.com/hernikplays/canteenlib/blob/main/COMPATIBILITY.md), jinak experimentálně***, a umožní vám zobrazit, objednávat obědy, objednávat nebo přidávat jídlo na burzubeta. ## Co se plánuje - Offline ukládání jídelníčku a zakoupených jídel diff --git a/lib/lang/lang.dart b/lib/lang/lang.dart index 6c2a9d1..129b784 100644 --- a/lib/lang/lang.dart +++ b/lib/lang/lang.dart @@ -89,6 +89,8 @@ abstract class Languages { String get noOrder; + String get signOutWarn; + // Uvítací obrazovka String get welcome; @@ -149,6 +151,8 @@ abstract class Languages { String get notifyAt; + String get notifyWarning; + // Offline String get offline; diff --git a/lib/lang/lang_cz.dart b/lib/lang/lang_cz.dart index 749d04f..a2f3329 100644 --- a/lib/lang/lang_cz.dart +++ b/lib/lang/lang_cz.dart @@ -224,4 +224,11 @@ class LanguageCz extends Languages { @override String get needRemember => "Musíte své přihlašovací údaje uložit na přihlašovací obrazovce"; + + @override + String get notifyWarning => + "Vaše zařízení může mít povolenou optimalizaci baterie, což může způsobovat neodesílání oznámení. Zkontrolujte nastavení ve vašem zařízení."; + + @override + String get signOutWarn => "Opravdu se chcete odhlásit?"; } diff --git a/lib/lang/lang_en.dart b/lib/lang/lang_en.dart index 2e653dc..2563053 100644 --- a/lib/lang/lang_en.dart +++ b/lib/lang/lang_en.dart @@ -222,4 +222,11 @@ class LanguageEn extends Languages { @override String get needRemember => "You need to save your login details on the login screen first"; + + @override + String get notifyWarning => + "Your device may have battery optimization enabled. This may cause notifications to not be sent. Check the application info in your device's settings."; + + @override + String get signOutWarn => "Do you really want to sign out?"; } diff --git a/lib/main.dart b/lib/main.dart index eb561fb..fc42683 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -55,44 +55,50 @@ void oznamitPredem(SharedPreferences prefs, tz.Location l) async { title = LanguageEn().lunchNotif; } - if (prefs.getBool("offline") ?? false) { + /*if (prefs.getBool("offline") ?? false) { // 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); - var kdy = DateTime.parse(prefs.getString("oznameni_cas")!); - const AndroidNotificationDetails androidSpec = - AndroidNotificationDetails('opencanteen', 'predobjedem', - 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); - await flutterLocalNotificationsPlugin.zonedSchedule( - 0, - title, - "${jidlo.nazev} - ${jidlo.varianta}", - 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 - } + } 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í + + // 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 } } + // } } } @@ -107,6 +113,7 @@ void main() async { oznamitPredem(prefs, l); } + // nastavit oznámení const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('notif_icon'); @@ -130,6 +137,8 @@ void main() async { debugPrint('notification payload: $payload'); } }); + + // spustit aplikaci runApp(const MyApp()); } @@ -400,6 +409,7 @@ class _LoginPageState extends State { )); } + /// Získá offline soubor a zobrazí údaje void goOffline() async { Directory appDocDir = await getApplicationDocumentsDirectory(); var den = DateTime.now(); diff --git a/lib/okna/jidelnicek.dart b/lib/okna/jidelnicek.dart index cd1f588..e6834c6 100644 --- a/lib/okna/jidelnicek.dart +++ b/lib/okna/jidelnicek.dart @@ -304,13 +304,29 @@ class _JidelnicekPageState extends State { }); } - void kliknuti( - String value, BuildContext context, FlutterLocalNotificationsPlugin n) { + Future kliknuti(String value, BuildContext context, + FlutterLocalNotificationsPlugin n) async { if (value == Languages.of(context)!.signOut) { - const storage = FlutterSecureStorage(); - storage.deleteAll(); - Navigator.pushReplacement( - context, MaterialPageRoute(builder: (c) => const LoginPage())); + await showDialog( + context: context, + builder: (c) => AlertDialog( + title: Text(Languages.of(context)!.warning), + content: Text(Languages.of(context)!.signOutWarn), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: Text(Languages.of(context)!.yes)), + TextButton( + onPressed: () { + const storage = FlutterSecureStorage(); + storage.deleteAll(); + Navigator.pushReplacement(context, + MaterialPageRoute(builder: (c) => const LoginPage())); + }, + child: Text(Languages.of(context)!.no)) + ], + ), + ); } else if (value == Languages.of(context)!.reportBugs) { launch("https://github.com/hernikplays/opencanteen/issues/new/choose"); } else if (value == Languages.of(context)!.about) { @@ -444,7 +460,7 @@ class _JidelnicekPageState extends State { den = DateTime.now(); nactiJidlo(); }), - icon: const Icon(Icons.calendar_today)) + icon: const Icon(Icons.today)) ]), SingleChildScrollView( physics: const AlwaysScrollableScrollPhysics(), diff --git a/lib/okna/nastaveni.dart b/lib/okna/nastaveni.dart index 05baa81..f2d2fe3 100644 --- a/lib/okna/nastaveni.dart +++ b/lib/okna/nastaveni.dart @@ -40,7 +40,8 @@ class _NastaveniState extends State { var _casStr = preferences.getString("oznameni_cas"); if (_casStr == null) { var now = DateTime.now(); - _oznameniCas = TimeOfDay.fromDateTime(DateTime.now()); + _oznameniCas = TimeOfDay.fromDateTime( + DateTime.now().add(const Duration(hours: 1))); preferences.setString("oznameni_cas", now.toString()); } else { _oznameniCas = TimeOfDay.fromDateTime(DateTime.parse(_casStr)); @@ -143,6 +144,23 @@ class _NastaveniState extends State { setState(() { _oznameniObed = value; if (_oznameniObed) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: + Text(Languages.of(context)!.warning), + content: Text( + Languages.of(context)!.notifyWarning), + actions: [ + TextButton( + child: + Text(Languages.of(context)!.ok), + onPressed: () { + Navigator.of(context).pop(); + }, + ) + ], + )); vytvoritOznameni(casNaDate(_oznameniCas)); } zmenitNastaveni("oznamit", value); @@ -222,7 +240,7 @@ class _NastaveniState extends State { // Vytvoří nové oznámení pro daný čas a datum 0, Languages.of(context)!.lunchNotif, - "${jidlo.nazev} - ${jidlo.varianta}", + "${jidlo.varianta} - ${jidlo.nazev}", tz.TZDateTime.from(den, l), const NotificationDetails(android: androidSpec, iOS: iOSpec), androidAllowWhileIdle: true, diff --git a/pubspec.yaml b/pubspec.yaml index 9c73992..4cd6527 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 # followed by an optional build number separated by a +. -version: 1.3.0+15 +version: 1.3.1+17 environment: sdk: ">=2.16.1 <3.0.0"