1
0
mirror of https://github.com/go-vikunja/app synced 2024-06-03 19:19:46 +00:00
app-mirror-github/lib/main.dart

168 lines
5.5 KiB
Dart
Raw Normal View History

2022-08-24 21:45:12 +00:00
import 'dart:io';
import 'package:dynamic_color/dynamic_color.dart';
2018-09-14 16:59:13 +00:00
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:vikunja_app/api/task_implementation.dart';
import 'package:vikunja_app/api/client.dart';
import 'package:vikunja_app/service/services.dart';
2023-01-07 15:55:40 +00:00
import 'package:workmanager/workmanager.dart';
2018-09-22 20:56:16 +00:00
import 'package:vikunja_app/global.dart';
2019-03-16 13:29:00 +00:00
import 'package:vikunja_app/pages/home.dart';
import 'package:vikunja_app/pages/user/login.dart';
2019-03-11 20:38:05 +00:00
import 'package:vikunja_app/theme/theme.dart';
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:flutter_downloader/flutter_downloader.dart';
import 'api/user_implementation.dart';
import 'managers/notifications.dart';
2022-08-24 21:45:12 +00:00
class IgnoreCertHttpOverrides extends HttpOverrides {
2022-08-27 21:04:43 +00:00
bool ignoreCerts = false;
IgnoreCertHttpOverrides(bool _ignore) {
ignoreCerts = _ignore;
}
2022-08-24 21:45:12 +00:00
@override
2022-08-27 21:04:43 +00:00
HttpClient createHttpClient(SecurityContext? context) {
2022-08-24 21:45:12 +00:00
return super.createHttpClient(context)
..badCertificateCallback = (_, __, ___) => ignoreCerts;
}
}
2023-01-07 15:55:40 +00:00
@pragma('vm:entry-point')
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
2023-01-07 15:55:40 +00:00
print("Native called background task: $task"); //simpleTask will be emitted here.
if (task == "update-tasks" && inputData != null) {
2023-05-16 23:22:59 +00:00
Client client = Client(null,
token: inputData["client_token"],
base: inputData["client_base"],
authenticated: true);
tz.initializeTimeZones();
return SettingsManager(new FlutterSecureStorage())
.getIgnoreCertificates()
.then((value) async {
print("ignoring: $value");
client.reload_ignore_certs(value == "1");
TaskAPIService taskService = TaskAPIService(client);
NotificationClass nc = NotificationClass();
await nc.notificationInitializer();
return nc
.scheduleDueNotifications(taskService)
.then((value) => Future.value(true));
});
} else if( task == "refresh-token") {
print("running refresh from workmanager");
final FlutterSecureStorage _storage = new FlutterSecureStorage();
var currentUser = await _storage.read(key: 'currentUser');
if (currentUser == null) {
return Future.value(true);
}
var token = await _storage.read(key: currentUser);
var base = await _storage.read(key: '${currentUser}_base');
if (token == null || base == null) {
return Future.value(true);
}
Client client = Client(null);
client.configure(token: token, base: base, authenticated: true);
// load new token from server to avoid expiration
String? newToken = await UserAPIService(client).getToken();
if(newToken != null) {
_storage.write(key: currentUser, value: newToken);
}
return Future.value(true);
} else {
return Future.value(true);
2023-01-07 15:55:40 +00:00
}
});
}
2023-05-16 23:22:59 +00:00
final globalSnackbarKey = GlobalKey<ScaffoldMessengerState>();
final globalNavigatorKey = GlobalKey<NavigatorState>();
2023-01-07 15:55:40 +00:00
void main() async {
2023-01-07 15:55:40 +00:00
WidgetsFlutterBinding.ensureInitialized();
await Permission.notification.isDenied.then((value) {
if (value) {
Permission.notification.request();
}
});
await FlutterDownloader.initialize();
2023-01-07 22:58:30 +00:00
Workmanager().initialize(callbackDispatcher, isInDebugMode: false);
runApp(VikunjaGlobal(
child: new VikunjaApp(
home: HomePage(),
key: UniqueKey(),
2023-05-16 23:22:59 +00:00
navkey: globalNavigatorKey,
),
login: new VikunjaApp(
home: LoginPage(),
key: UniqueKey(),
)));
2022-08-24 21:45:12 +00:00
}
2023-05-17 10:52:26 +00:00
final ValueNotifier<bool> updateTheme = ValueNotifier(false);
2018-09-14 16:59:13 +00:00
2018-09-15 15:01:45 +00:00
class VikunjaApp extends StatelessWidget {
final Widget home;
2023-05-16 23:22:59 +00:00
final GlobalKey<NavigatorState>? navkey;
2023-05-16 23:22:59 +00:00
const VikunjaApp({Key? key, required this.home, this.navkey}) : super(key: key);
2018-09-14 16:59:13 +00:00
@override
Widget build(BuildContext context) {
2023-05-17 10:52:26 +00:00
SettingsManager manager = SettingsManager(new FlutterSecureStorage());
return new ValueListenableBuilder(valueListenable: updateTheme, builder: (_,mode,__) {
updateTheme.value = false;
FlutterThemeMode themeMode = FlutterThemeMode.system;
2023-05-17 10:52:26 +00:00
Future<ThemeData> theme = manager.getThemeMode().then((value) {
themeMode = value;
switch(value) {
case FlutterThemeMode.dark:
return buildVikunjaDarkTheme();
case FlutterThemeMode.materialYouLight:
return buildVikunjaMaterialLightTheme();
case FlutterThemeMode.materialYouDark:
return buildVikunjaMaterialDarkTheme();
default:
return buildVikunjaTheme();
2023-05-17 10:52:26 +00:00
}
2023-05-17 10:52:26 +00:00
});
return FutureBuilder<ThemeData>(
future: theme,
builder: (BuildContext context, AsyncSnapshot<ThemeData> data) {
if(data.hasData) {
return new DynamicColorBuilder(builder: (lightTheme, darkTheme)
{
ThemeData? themeData = data.data;
if(themeMode == FlutterThemeMode.materialYouLight)
themeData = themeData?.copyWith(colorScheme: lightTheme);
else if(themeMode == FlutterThemeMode.materialYouDark)
themeData = themeData?.copyWith(colorScheme: darkTheme);
return MaterialApp(
2023-05-17 10:52:26 +00:00
title: 'Vikunja',
theme: themeData,
2023-05-17 10:52:26 +00:00
scaffoldMessengerKey: globalSnackbarKey,
navigatorKey: navkey,
// <= this
home: this.home,
);
});
2023-05-17 10:52:26 +00:00
} else {
return Center(child: CircularProgressIndicator());
}
});});
2018-09-14 16:59:13 +00:00
}
2018-09-16 19:47:53 +00:00
}