mnemo_cards/lib/main.dart
2024-08-25 00:09:58 +03:00

295 lines
9.5 KiB
Dart

import 'dart:async';
import 'dart:developer';
import 'dart:io';
import 'package:auto_route/auto_route.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:jailbreak_root_detection/jailbreak_root_detection.dart';
import 'package:mnemo_cards/di/locator.dart';
import 'package:mnemo_cards/domain/router/app_router.dart';
import 'package:mnemo_cards/managers/repository/firebase_config_repository.dart';
import 'package:mnemo_cards/features/packs/pack_manager.dart';
import 'package:mnemo_cards/theme/themes.dart';
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
import 'package:no_screenshot/no_screenshot.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:yandex_mobileads/mobile_ads.dart';
import 'di/injector.dart';
import 'domain/router/app_router.gr.dart';
import 'firebase_options.dart';
import 'flags.dart';
import 'managers/repository/repository.dart';
final scaffoldKey = GlobalKey<ScaffoldState>();
final scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
late final SharedPreferences globalSharedPreferences;
late final FlutterSecureStorage secureStorage;
final appRouter = AppRouter(ADMIN_BUILD);
AndroidDeviceInfo? androidDeviceInfo;
Future<bool> _screenOff() async =>
ADMIN_BUILD || await NoScreenshot.instance.screenshotOff();
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final stopwatch = Stopwatch()..start();
print('ensureInitialized ${stopwatch.elapsedMilliseconds}');
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]);
androidDeviceInfo = kIsWeb ? null : await DeviceInfoPlugin().androidInfo;
print('deviceInfo ${stopwatch.elapsedMilliseconds}');
if (!kDebugMode) {
final isNotTrust = await JailbreakRootDetection.instance.isNotTrust;
print('No trusted ${stopwatch.elapsedMilliseconds}');
if (isNotTrust && !ADMIN_BUILD) {
print('Not trusted');
return;
}
final off = await _screenOff();
print('screenshot off ${stopwatch.elapsedMilliseconds}');
if (!off) {
print('Cant disable screenhsot');
return;
}
}
FlutterError.onError = (errorDetails) {
FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
};
try {
secureStorage = FlutterSecureStorage(
aOptions: const AndroidOptions(
encryptedSharedPreferences: true,
),
);
globalSharedPreferences = await SharedPreferences.getInstance();
await _fillSp();
print('global sp ${stopwatch.elapsedMilliseconds}');
await setInjections();
print('injections ${stopwatch.elapsedMilliseconds}');
unawaited(initFirebase());
print('initing... ${stopwatch.elapsedMilliseconds}');
await Future.wait([
locator.packCacheManager.init().then((_) => print('packCacheManager inited')),
locator.previewPackHolder.init().then((_) => print('previewPackHolder inited')),
locator.previewPackPoller.init().then((_) => print('previewPackPoller inited')),
locator.packManager.init().then((_) => print('packManager inited')),
locator.userManager.init().then((_) => print('userManager inited')),
locator.favoriteCardsController.init().then((_) => print('favoriteCardsController inited')),
locator.previewPackPoller.init().then((_) => print('previewPackPoller inited')),
locator.deeplinkManager.init().then((_) => print('deeplinkManager inited')),
]);
await locator.packUpdater.init().then((_) => print('packUpdater inited'));
print('initing complete ${stopwatch.elapsedMilliseconds}');
if (!kIsWeb) unawaited(MobileAds.initialize());
print('mobile ads ${stopwatch.elapsedMilliseconds}');
print('runApp ${stopwatch.elapsedMilliseconds}');
runApp(const MyApp());
} on Object catch (e, s) {
print('err: ${e.toString()}');
print('stacktrace: ${s.toString()}');
log(e.toString(), stackTrace: s);
exit(0);
}
}
Future<void> _fillSp() async {
final showAdmin = globalSharedPreferences.getBool('show_admin');
if (showAdmin == null && ADMIN_BUILD) {
await globalSharedPreferences.setBool('show_admin', true);
}
final soundOn = globalSharedPreferences.getBool('sound_on');
if (soundOn == null) {
await globalSharedPreferences.setBool('sound_on', true);
}
final soundSpeed = globalSharedPreferences.getDouble('sound_speed');
if (soundSpeed == null) {
await globalSharedPreferences.setDouble('sound_speed', 1.0);
}
final autoPlay = globalSharedPreferences.getBool('auto_play_sound_tests');
if (autoPlay == null) {
await globalSharedPreferences.setBool('auto_play_sound_tests', true);
}
final autoPlayView = globalSharedPreferences.getBool('auto_play_sound_view');
if (autoPlayView == null) {
await globalSharedPreferences.setBool('auto_play_sound_view', false);
}
}
Future<void> initFirebase() async {
try {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
await FirebaseRepository.update();
log('Firebase inited');
} on Object catch (e, s) {
log('Firebase not inited', error: e, stackTrace: s);
}
}
class MyApp extends StatelessWidget with WidgetsBindingObserver {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
WidgetsBinding.instance.addObserver(this);
return ScreenUtilInit(
designSize: const Size(370, 800),
minTextAdapt: true,
splitScreenMode: true,
child: ValueListenableBuilder(
builder: (context, themeMode, child) {
return MaterialApp.router(
theme: theme2,
darkTheme: darkTheme2,
themeMode: themeMode,
routerConfig: appRouter.config(
deepLinkBuilder: (link) {
return DeepLink.defaultPath;
},
),
scaffoldMessengerKey: scaffoldMessengerKey,
debugShowCheckedModeBanner: false,
);
},
valueListenable: themeNotifier,
),
);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
_screenOff();
break;
case AppLifecycleState.inactive:
_screenOff();
break;
case AppLifecycleState.paused:
_screenOff();
break;
case AppLifecycleState.detached:
break;
case AppLifecycleState.hidden:
break;
}
}
}
@RoutePage()
class MainTabsPage extends StatefulWidget {
const MainTabsPage({super.key});
@override
State<MainTabsPage> createState() => _MainTabsPageState();
}
class _MainTabsPageState extends State<MainTabsPage> {
late List<CardPackDto> cardPacks;
late List<GameCardDto> cards;
CardPackDto? pack;
late Repository repository;
late PackManager packManager;
_Tabs _currentTab = _Tabs.home;
@override
void didChangeDependencies() {
super.didChangeDependencies();
print('CHANGE DEPS');
}
@override
void initState() {
super.initState();
repository = locator.repository;
packManager = locator.packManager;
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context).textTheme;
return AutoTabsRouter.tabBar(
key: scaffoldKey,
homeIndex: 0,
routes: [
PageRouteInfo(HomePage.name),
// PageRouteInfo(ExplorePage.name),
// PageRouteInfo(ProfilePage.name),
],
builder: (_, child, tabsController) => Scaffold(
body: child,
// bottomNavigationBar: Container(
// child: DotNavigationBar(
// currentIndex: tabsController.index,
// dotIndicatorColor: Colors.white,
// unselectedItemColor: Colors.grey[300],
// marginR: EdgeInsets.symmetric(horizontal: 32),
// itemPadding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
// duration: Duration(milliseconds: 300),
// paddingR: EdgeInsets.zero,
// borderRadius: 32,
// enableFloatingNavBar: true,
// enablePaddingAnimation: false,
// splashBorderRadius: 32,
// boxShadow: [
// BoxShadow(
// color: Colors.black26,
// blurRadius: 8.0,
// )
// ],
// onTap: (i) {
// tabsController.index = i;
// },
// items: [
// /// Home
// DotNavigationBarItem(
// icon: Icon(
// Icons.home,
// size: 32,
// ),
// selectedColor: Colors.redAccent,
// ),
//
// /// Search
// DotNavigationBarItem(
// icon: Icon(
// Icons.search,
// size: 32,
// ),
// selectedColor: Colors.redAccent,
// ),
//
// /// Profile
// DotNavigationBarItem(
// icon: Icon(
// Icons.person,
// size: 32,
// ),
// selectedColor: Colors.redAccent,
// ),
// ],
// ),
// ),
),
);
}
}
enum _Tabs { home, packs, profile }