import 'dart:developer'; import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flare_flutter/flare_actor.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:local_auth/local_auth.dart'; import 'package:provider/provider.dart'; import 'package:safe_device/safe_device.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/login_page.dart'; import 'package:test_sa/new_views/pages/unsafe_device_view.dart'; import 'package:test_sa/new_views/swipe_module/dialoge/local_auth_failed_dialog.dart'; import 'package:test_sa/new_views/swipe_module/dialoge/single_btn_dialog.dart'; import 'package:test_sa/new_views/swipe_module/swipe_view.dart'; import 'package:test_sa/views/update_available_screen.dart'; import '../../models/size_config.dart'; class SplashPage extends StatefulWidget { static const String routeName = '/splash_page'; const SplashPage({Key? key}) : super(key: key); @override State createState() => _SplashPageState(); } class _SplashPageState extends State { late SettingProvider _settingProvider; late UserProvider _userProvider; bool loading = false; @override void initState() { Firebase.initializeApp(); // NotificationManger.initialisation((notificationDetails) { // // todo @sikander, check notifications payload, because notification model is different to need to check from backend // // SystemNotificationModel notification = SystemNotificationModel.fromJson(json.decode(notificationDetails.payload)); // // if (notification.path == null || notification.path.isEmpty) return; // // Navigator.pushNamed(context, notification.path, arguments: notification.requestId); // // isnotificationCame = true; // "initialisation:${notificationDetails?.toString()}".showToast; // // // Navigator.of(context).push(MaterialPageRoute( // // builder: (_) => ServiceRequestDetailsPage( // // serviceRequest: ServiceRequest(id: "72348"), // // ))); // // }, (id, title, body, payload) async {}); super.initState(); } void checkTokenValidity(String token) async { setState(() { loading = true; }); String osType; if (Platform.isIOS) { osType = "IOS"; } else { if (await FirebaseNotificationManger.isGoogleServicesAvailable()) { osType = "GOOGLE"; } else { osType = "HUAWEI"; } } bool isAppUpdateAvailable = await _settingProvider.checkAppUpdate(URLs.appReleaseBuildNumber, osType); if (isAppUpdateAvailable) { setState(() { loading = false; }); Navigator.of(context).pushNamedAndRemoveUntil(UpdateAvailableScreen.routeName, (routes) => true); } else { bool isValid = await _settingProvider.checkUserTokenValidation(token); setState(() { loading = false; }); if (isValid == false) { showDialog( context: context, builder: (BuildContext cxt) => SingleBtnDialog( title: "Session Expired", message: "Login session is expired, Please login.", okTitle: "Login", onTap: () { Navigator.pop(context); Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); }), ); } else { ApiManager.instance.user = _settingProvider.user!; if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); setState(() { loading = true; }); await _userProvider.getUserInfo(fireBaseToken: FirebaseNotificationManger.token).then((status) async { setState(() { loading = false; }); if (status && _userProvider.refreshedUser != null) { _userProvider.refreshedUser!.token = _settingProvider.user?.token; await _settingProvider.setUser(_userProvider.refreshedUser!); _userProvider.setUser(_userProvider.refreshedUser!); await _settingProvider.setAuth(_settingProvider.user?.isEnabledFaceId ?? false); } if (_settingProvider.isLocalAuthEnable) { handleLocalAuth(); return; } Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); }); } } } void handleLocalAuth() async { bool isSuccess = false; try { isSuccess = await checkDualAuthentication(); } catch (ex) { // ios exception when scan failed. } if (isSuccess) { // _userProvider.setUser(_settingProvider.user!); // if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); // await _userProvider.getUserInfo(fireBaseToken: FirebaseNotificationManger.token).then((status) async { // if (status && _userProvider.refreshedUser != null) { // _userProvider.refreshedUser!.token = _settingProvider.user?.token; // await _settingProvider.setUser(_userProvider.refreshedUser!); // _userProvider.setUser(_settingProvider.user!); // await _settingProvider.setAuth(_settingProvider.user?.isEnabledFaceId ?? false); // } // }); if (_userProvider.user!.onlySwipe!) { Navigator.of(context).pushNamedAndRemoveUntil(SwipeView.routeName, (routes) => true); } else { Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); } } else { showDialog( context: context, builder: (BuildContext cxt) => LocalAuthFailedDialog( onRetry: () { handleLocalAuth(); }, onLogin: () { Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); }, ), ); } } Future checkDualAuthentication() async { return await _settingProvider.auth.authenticate( localizedReason: Platform.isAndroid ? "Scan your fingerprint to authenticate" : "Scan with face id to authenticate", options: const AuthenticationOptions(), ); } @override Widget build(BuildContext context) { SizeConfig.init(context); _settingProvider = Provider.of(context, listen: false); _userProvider = Provider.of(context, listen: false); return Scaffold( body: Stack( alignment: Alignment.center, children: [ if (loading) const Positioned( bottom: 100, child: SizedBox( width: 36, height: 36, child: CircularProgressIndicator( color: Color(0xff4A8DB7), strokeWidth: 3, ), )), SizedBox( width: MediaQuery.of(context).size.width / 1.1, child: Hero( tag: "logo", child: FlareActor( "assets/rives/atoms_splash.flr", fit: BoxFit.contain, animation: "splash", callback: (animation) async { bool isSafe = await checkDeviceSafety(); if (!isSafe) { Navigator.pushNamedAndRemoveUntil(context, UnsafeDeviceScreen.routeName, (_) => false); } else { if (_settingProvider.isLoaded && (_settingProvider.user != null)) { checkTokenValidity(_settingProvider.user!.token!); } else { Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); } } // if (_settingProvider.isLoaded && (_settingProvider.user?.isLiveToken ?? false)) { // _userProvider.user = _settingProvider.user; // Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); // // if(isnotificationCame) // // Navigator.of(context).push(MaterialPageRoute( // // builder: (_) => ServiceRequestDetailsPage( // // serviceRequest: ServiceRequest(id: "72348"), // // ))); // /// The below line for the new design // // Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); // } }, ), ), ).center, ], ), ); } Future checkDeviceSafety() async { if (!kReleaseMode) return true; bool isJailBroken = false; bool isRealDevice = false; try { isJailBroken = await SafeDevice.isJailBroken; isRealDevice = await SafeDevice.isRealDevice; if (isJailBroken || !isRealDevice) { return false; } else { return true; } } catch (error) { print(error); return false; } } }