2023-06-17 20:57:57 +03:00
|
|
|
import 'package:connectivity_plus/connectivity_plus.dart';
|
|
|
|
import 'package:dynamic_color/dynamic_color.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter_displaymode/flutter_displaymode.dart';
|
|
|
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
|
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
|
|
import 'package:flutter_timezone/flutter_timezone.dart';
|
|
|
|
import 'package:get/get.dart';
|
|
|
|
import 'package:internet_connection_checker/internet_connection_checker.dart';
|
|
|
|
import 'package:isar/isar.dart';
|
|
|
|
import 'package:path_provider/path_provider.dart';
|
|
|
|
import 'package:rain/app/modules/home.dart';
|
|
|
|
import 'package:rain/app/modules/onboarding.dart';
|
|
|
|
import 'package:rain/theme/theme.dart';
|
|
|
|
import 'app/data/weather.dart';
|
|
|
|
import 'translation/translation.dart';
|
|
|
|
import 'theme/theme_controller.dart';
|
|
|
|
import 'package:timezone/data/latest_all.dart' as tz;
|
|
|
|
import 'package:timezone/timezone.dart' as tz;
|
|
|
|
|
|
|
|
late Isar isar;
|
|
|
|
late Settings settings;
|
|
|
|
final ValueNotifier<Future<bool>> isDeviceConnectedNotifier =
|
|
|
|
ValueNotifier(InternetConnectionChecker().hasConnection);
|
|
|
|
|
|
|
|
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
|
|
|
FlutterLocalNotificationsPlugin();
|
|
|
|
|
|
|
|
void main() async {
|
|
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
await isarInit();
|
|
|
|
await setOptimalDisplayMode();
|
|
|
|
Connectivity()
|
|
|
|
.onConnectivityChanged
|
|
|
|
.listen((ConnectivityResult result) async {
|
|
|
|
if (result != ConnectivityResult.none) {
|
|
|
|
isDeviceConnectedNotifier.value =
|
|
|
|
InternetConnectionChecker().hasConnection;
|
|
|
|
} else {
|
|
|
|
isDeviceConnectedNotifier.value = Future(() => false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
final String timeZoneName = await FlutterTimezone.getLocalTimezone();
|
|
|
|
const AndroidInitializationSettings initializationSettingsAndroid =
|
|
|
|
AndroidInitializationSettings('@mipmap/ic_launcher');
|
|
|
|
const InitializationSettings initializationSettings =
|
|
|
|
InitializationSettings(android: initializationSettingsAndroid);
|
|
|
|
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
|
|
|
|
tz.initializeTimeZones();
|
|
|
|
tz.setLocalLocation(tz.getLocation(timeZoneName));
|
|
|
|
runApp(MyApp());
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> setOptimalDisplayMode() async {
|
|
|
|
final List<DisplayMode> supported = await FlutterDisplayMode.supported;
|
|
|
|
final DisplayMode active = await FlutterDisplayMode.active;
|
|
|
|
|
|
|
|
final List<DisplayMode> sameResolution = supported
|
|
|
|
.where((DisplayMode m) =>
|
|
|
|
m.width == active.width && m.height == active.height)
|
|
|
|
.toList()
|
|
|
|
..sort((DisplayMode a, DisplayMode b) =>
|
|
|
|
b.refreshRate.compareTo(a.refreshRate));
|
|
|
|
|
|
|
|
final DisplayMode mostOptimalMode =
|
|
|
|
sameResolution.isNotEmpty ? sameResolution.first : active;
|
|
|
|
|
|
|
|
await FlutterDisplayMode.setPreferredMode(mostOptimalMode);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> isarInit() async {
|
|
|
|
isar = await Isar.open([
|
|
|
|
SettingsSchema,
|
|
|
|
MainWeatherCacheSchema,
|
|
|
|
LocationCacheSchema,
|
|
|
|
WeatherCardSchema,
|
|
|
|
], directory: (await getApplicationSupportDirectory()).path);
|
|
|
|
settings = await isar.settings.where().findFirst() ?? Settings();
|
|
|
|
}
|
|
|
|
|
|
|
|
class MyApp extends StatelessWidget {
|
|
|
|
MyApp({Key? key}) : super(key: key);
|
|
|
|
final themeController = Get.put(ThemeController());
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return DynamicColorBuilder(
|
|
|
|
builder: (lightColorScheme, darkColorScheme) {
|
|
|
|
return GetMaterialApp(
|
|
|
|
themeMode: themeController.theme,
|
|
|
|
theme: RainTheme.lightTheme,
|
|
|
|
darkTheme: RainTheme.darkTheme,
|
|
|
|
localizationsDelegates: const [
|
|
|
|
GlobalMaterialLocalizations.delegate,
|
|
|
|
GlobalWidgetsLocalizations.delegate,
|
|
|
|
GlobalCupertinoLocalizations.delegate,
|
|
|
|
],
|
|
|
|
translations: Translation(),
|
|
|
|
locale: Get.deviceLocale,
|
|
|
|
fallbackLocale: const Locale('en', 'US'),
|
|
|
|
supportedLocales: const [
|
|
|
|
Locale('en', 'US'),
|
|
|
|
Locale('ru', 'RU'),
|
|
|
|
Locale('it', 'IT'),
|
|
|
|
Locale('de', 'DE'),
|
|
|
|
Locale('fr', 'FR'),
|
|
|
|
Locale('tr', 'TR'),
|
|
|
|
Locale('pt', 'BR'),
|
|
|
|
Locale('es', 'ES'),
|
|
|
|
Locale('sk', 'SK'),
|
|
|
|
Locale('nl', 'NL'),
|
2023-06-26 16:43:06 +05:30
|
|
|
Locale('hi', 'IN')
|
2023-06-17 20:57:57 +03:00
|
|
|
],
|
|
|
|
localeResolutionCallback: (locale, supportedLocales) {
|
|
|
|
for (var supportedLocale in supportedLocales) {
|
|
|
|
if (supportedLocale.languageCode == locale?.languageCode) {
|
|
|
|
return supportedLocale;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return supportedLocales.first;
|
|
|
|
},
|
|
|
|
debugShowCheckedModeBanner: false,
|
|
|
|
home: settings.onboard == false
|
|
|
|
? const OnboardingPage()
|
|
|
|
: const HomePage(),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|