214 lines
6.2 KiB
Dart
214 lines
6.2 KiB
Dart
|
|
import 'dart:developer';
|
||
|
|
import 'dart:io';
|
||
|
|
|
||
|
|
import 'package:auto_route/annotations.dart';
|
||
|
|
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:flutter/material.dart';
|
||
|
|
import 'package:flutter_screenutil/flutter_screenutil.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>();
|
||
|
|
SharedPreferences? globalSharedPreferences;
|
||
|
|
|
||
|
|
final appRouter = AppRouter(ADMIN_BUILD);
|
||
|
|
|
||
|
|
AndroidDeviceInfo? androidDeviceInfo;
|
||
|
|
|
||
|
|
Future<bool> _screenOff() async =>
|
||
|
|
ADMIN_BUILD || await NoScreenshot.instance.screenshotOff();
|
||
|
|
|
||
|
|
void main() async {
|
||
|
|
WidgetsFlutterBinding.ensureInitialized();
|
||
|
|
androidDeviceInfo = await DeviceInfoPlugin().androidInfo;
|
||
|
|
final isNotTrust = await JailbreakRootDetection.instance.isNotTrust;
|
||
|
|
if (isNotTrust && !ADMIN_BUILD) {
|
||
|
|
print('Not trusted');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
final off = await _screenOff();
|
||
|
|
if (!off) {
|
||
|
|
print('Cant disable screenhsot');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
try {
|
||
|
|
globalSharedPreferences = await SharedPreferences.getInstance();
|
||
|
|
await setInjections();
|
||
|
|
await initFirebase();
|
||
|
|
await locator.packCacheManager.init();
|
||
|
|
await locator.packManager.init();
|
||
|
|
await locator.userManager.init();
|
||
|
|
await locator.favoriteCardsController.init();
|
||
|
|
await locator.previewPackPoller.init();
|
||
|
|
await locator.packUpdater.init();
|
||
|
|
await MobileAds.initialize();
|
||
|
|
runApp(const MyApp());
|
||
|
|
} on Object catch (e, s) {
|
||
|
|
log(e.toString(), stackTrace: s);
|
||
|
|
exit(0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Future<void> initFirebase() async {
|
||
|
|
try {
|
||
|
|
await Firebase.initializeApp(
|
||
|
|
options: DefaultFirebaseOptions.currentPlatform,
|
||
|
|
).timeout(Duration(seconds: 2));
|
||
|
|
await FirebaseRepository.update();
|
||
|
|
} 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: MaterialApp.router(
|
||
|
|
theme: lightTheme,
|
||
|
|
routerConfig: appRouter.config(),
|
||
|
|
scaffoldMessengerKey: scaffoldMessengerKey,
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
@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 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 }
|