opencanteen/lib/okna/nastaveni.dart

212 lines
8.1 KiB
Dart
Raw Normal View History

import 'dart:io';
import 'package:canteenlib/canteenlib.dart';
2022-05-02 12:07:47 +02:00
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_native_timezone/flutter_native_timezone.dart';
import 'package:path_provider/path_provider.dart';
2022-05-09 16:55:20 +02:00
import 'package:shared_preferences/shared_preferences.dart';
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import '../lang/lang.dart';
import '../loginmanager.dart';
import '../util.dart';
2022-05-02 12:07:47 +02:00
class Nastaveni extends StatefulWidget {
const Nastaveni({Key? key, required this.n}) : super(key: key);
final FlutterLocalNotificationsPlugin n;
2022-05-02 12:07:47 +02:00
@override
State<Nastaveni> createState() => _NastaveniState();
}
class _NastaveniState extends State<Nastaveni> {
2022-05-09 16:55:20 +02:00
bool _ukladatOffline = false;
bool _preskakovatVikend = false;
bool _kontrolovatTyden = false;
bool _oznameniObed = false;
TimeOfDay _oznameniCas = TimeOfDay.now();
2022-05-09 16:55:20 +02:00
void najitNastaveni() async {
var preferences = await SharedPreferences.getInstance();
setState(() {
_ukladatOffline = preferences.getBool("offline") ?? false;
_preskakovatVikend = preferences.getBool("skip") ?? false;
_kontrolovatTyden = preferences.getBool("tyden") ?? false;
_oznameniObed = preferences.getBool("oznamit") ?? false;
var _casStr = preferences.getString("oznameni_cas");
if (_casStr == null) {
var now = DateTime.now();
_oznameniCas = TimeOfDay.fromDateTime(DateTime.now());
preferences.setString("oznameni_cas", now.toString());
} else {
_oznameniCas = TimeOfDay.fromDateTime(DateTime.parse(_casStr));
}
});
2022-05-09 16:55:20 +02:00
}
void zmenitNastaveni(String key, bool value) async {
var preferences = await SharedPreferences.getInstance();
preferences.setBool(key, value);
}
@override
void initState() {
super.initState();
najitNastaveni();
}
2022-05-02 12:07:47 +02:00
@override
Widget build(BuildContext context) {
2022-05-09 16:55:20 +02:00
return Scaffold(
appBar: AppBar(
title: Text(Languages.of(context)!.settings),
2022-05-09 16:55:20 +02:00
),
body: Center(
child: SizedBox(
width: MediaQuery.of(context).size.width / 1.1,
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(Languages.of(context)!.saveOffline),
Switch(
value: _ukladatOffline,
onChanged: (value) {
2022-05-20 08:03:53 +02:00
setState(() {
_ukladatOffline = value;
2022-05-20 08:03:53 +02:00
cistit(value);
zmenitNastaveni("offline", value);
});
})
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(Languages.of(context)!.skipWeekend),
Switch(
value: _preskakovatVikend,
onChanged: (value) {
setState(() {
_preskakovatVikend = value;
zmenitNastaveni("skip", value);
});
})
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(child: Text(Languages.of(context)!.checkOrdered)),
Switch(
value: _kontrolovatTyden,
onChanged: (value) {
setState(() {
_kontrolovatTyden = value;
zmenitNastaveni("tyden", value);
});
})
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(child: Text(Languages.of(context)!.notifyLunch)),
Switch(
value: _oznameniObed,
onChanged: (value) {
setState(() {
_oznameniObed = value;
zmenitNastaveni("oznamit",
value); // TODO: změnit pouze s uloženými údaji
});
})
],
),
Text(Languages.of(context)!.notifyAt),
TextButton(
style: ButtonStyle(
textStyle: MaterialStateProperty.all(TextStyle(
color: (_oznameniObed) ? Colors.grey : Colors.purple))),
onPressed: () async {
if (_oznameniObed) {
var cas = await showTimePicker(
context: context, initialTime: _oznameniCas);
if (cas != null) {
var prefs = await SharedPreferences.getInstance();
prefs.setString(
"oznameni_cas",
casNaDate(cas)
.toString()); // aktualizovat vybraný čas
var d = await LoginManager.getDetails(); // získat údaje
if (d != null) {
// Nové oznámení
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);
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);
debugPrint(casNaDate(cas).toString());
var l = tz.getLocation(
await FlutterNativeTimezone.getLocalTimezone());
await widget.n.zonedSchedule(
// Vytvoří nové oznámení pro daný čas a datum
0,
Languages.of(context)!.lunchNotif,
"${jidlo.nazev} - ${jidlo.varianta}",
tz.TZDateTime.from(casNaDate(cas), l),
const NotificationDetails(
android: androidSpec, iOS: iOSpec),
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation
.absoluteTime);
} on StateError catch (_) {
// nenalezeno
}
}
}
}
setState(() {
_oznameniCas = cas ?? _oznameniCas;
});
}
},
child: Text(
"${(_oznameniCas.hour < 10 ? "0" : "") + _oznameniCas.hour.toString()}:${(_oznameniCas.minute < 10 ? "0" : "") + _oznameniCas.minute.toString()}")),
],
),
2022-05-09 16:55:20 +02:00
)),
);
2022-05-02 12:07:47 +02:00
}
2022-05-20 08:03:53 +02:00
void cistit(bool value) async {
if (!value) {
Directory appDocDir = await getApplicationDocumentsDirectory();
for (var f in appDocDir.listSync()) {
// Vymažeme obsah
if (f.path.contains("jidelnicek")) {
f.deleteSync();
}
}
}
}
2022-05-02 12:07:47 +02:00
}