import 'dart:async'; import 'dart:io'; import 'package:app_links/app_links.dart'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/viewModels/PharmacyPagesViewModel.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/pages/conference/widgets/platform_exception_alert_dialog.dart'; import 'package:diplomaticquarterapp/pages/conference/zoom/call_screen.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/webRTC/OpenTok/OpenTok.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/payfort_services/payfort_view_model.dart'; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/theme/theme_notifier.dart'; import 'package:diplomaticquarterapp/theme/theme_value.dart'; import 'package:diplomaticquarterapp/uitl/DeepLinkHandler.dart'; import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; import 'config/size_config.dart'; import 'core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; import 'core/viewModels/project_view_model.dart'; import 'locator.dart'; import 'models/LiveCare/IncomingCallData.dart'; import 'pages/pharmacies/compare-list.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // Pass all uncaught "fatal" errors from the framework to Crashlytics // FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics // PlatformDispatcher.instance.onError = (error, stack) { // if (!kDebugMode) FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); // return true; // }; setupLocator(); HttpOverrides.global = MyHttpOverrides(); runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyApp createState() => new _MyApp(); } class MyHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { return super.createHttpClient(context)..badCertificateCallback = (X509Certificate cert, String host, int port) => true; } } class _MyApp extends State { // late AppUpdateInfo _updateInfo; StreamSubscription? _linkSubscription; final GlobalKey navigatorKey = GlobalKey(); //0537503378 //1231755 //0567184134 mobile //246305493 // checkForUpdate() { // // todo need to verify 'imp' // InAppUpdate.checkForUpdate().then((info) { // print("checkForUpdate!!!"); // print(info.toString()); // if (info.immediateUpdateAllowed) { // print("Immediate567184134 Allowed!!!"); // InAppUpdate.performImmediateUpdate().then((value) {}).catchError((e) => print(e.toString())); // } // }).catchError((e) { // print(e.toString()); // }); // } @override void initState() { //ProjectViewModel projectProvider; // projectProvider = Provider.of(context); // var font = projectProvider.isArabic ? 'Cairo' : 'WorkSans'; // Re-enable once going live // if (Platform.isAndroid) checkForUpdate(); ThemeNotifier(defaultTheme()); initDeepLinks(); super.initState(); } void dispose() { _linkSubscription?.cancel(); super.dispose(); } late final AppLifecycleListener _listener; Future initDeepLinks() async { // Handle links _linkSubscription = AppLinks().uriLinkStream.listen((uri) { debugPrint('onAppLink: $uri'); openAppLink(uri); }); _listener = AppLifecycleListener( onShow: () => {}, onResume: () =>{}, onHide: () => {}, onInactive: () => {}, onPause: () => {}, onDetach: () => {}, onRestart: () => {}, onStateChange: (state) async { if(state == AppLifecycleState.resumed) { await Future.delayed(Duration(seconds: 5)); _handleTransition(); } }, ); _handleTransition(shouldApplyDelay: true); } void _handleTransition({bool shouldApplyDelay = false}) async { var data = await AppSharedPreferences().getObject('call_data'); if(data == null) return; await AppSharedPreferences().remove('call_data'); if(shouldApplyDelay) await Future.delayed(Duration(seconds: 5)); var incomingcallData= IncomingCallData.fromJson(data); openCallPage(incomingcallData); } Future openCallPage(IncomingCallData incomingCallData) async { try { LandingPage.isOpenCallPage = false; if (incomingCallData!.background == "0") { // Zoom Call Page // Navigator.of(context).pop(); Navigator.pushNamed( locator().navigatorKey.currentContext!, "zoom_call_page", arguments: CallArguments(incomingCallData!.sessionId!, "123", "Patient", "40", "0", false, int.parse(incomingCallData!.appointmentNo!)), ); } else { // OpenTok Call Page await Navigator.of(locator().navigatorKey.currentContext!).push( MaterialPageRoute( builder: (BuildContext context) { return OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: incomingCallData!.sessionId!, token: incomingCallData!.token!); }, ), ); } } catch (err) { print(err); await PlatformExceptionAlertDialog( exception: Exception(err), ).show(context); } } void openAppLink(Uri uri) { print("the uri is $uri"); DeepLinkHandler.instance.handleDeepLinkAndNavigation( locator().navigatorKey.currentState, uri, context); } @override Widget build(BuildContext context) { PlatformBridge.init(context); AppGlobal.context = context; // SystemChrome.setPreferredOrientations([ // DeviceOrientation.portraitUp, // DeviceOrientationO.portraitDown, // ]); // final themeNotifier = Provider.of(context); precacheImage(AssetImage('assets/images/powerd-by.jpg'), context); return LayoutBuilder( builder: (context, constraints) { return OrientationBuilder( builder: (context, orientation) { SizeConfig().init(constraints, orientation); return MultiProvider( providers: [ ChangeNotifierProvider( create: (context) => PharmacyPagesViewModel(), ), ChangeNotifierProvider( create: (context) => ProjectViewModel(), ), ChangeNotifierProvider( create: (context) => DashboardViewModel(), ), ChangeNotifierProvider( create: (context) => ToDoCountProviderModel(), ), ChangeNotifierProvider( create: (context) => SearchProvider(), ), ChangeNotifierProvider.value( value: SearchProvider(), ), ChangeNotifierProvider( create: (context) => ThemeNotifier( defaultTheme(), ), ), StreamProvider.value( value: RobotProvider().intStream(), initialData: RobotProvider().setValue({}), ), ChangeNotifierProvider( create: (context) => CompareList(), ), ChangeNotifierProvider( create: (context) => OrderPreviewViewModel(), ), ChangeNotifierProvider(create: (context) => PayfortViewModel()), ], child: Consumer( builder: (context, projectProvider, child) => MaterialApp( builder: (context, mchild) { AppGlobal.projectViewModelContext = context; return MediaQuery( data: MediaQuery.of(context).copyWith( textScaler: TextScaler.linear(1.0), ), //set desired text scale factor here child: mchild!); // Container( // color: Colors.blue, // )); }, navigatorKey: locator().navigatorKey, showSemanticsDebugger: false, title: 'Dr. AlHabib', locale: projectProvider.appLocal, localizationsDelegates: [ TranslationBaseDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: [ const Locale('ar', ''), // Arabic const Locale('en', ''), // English ], theme: Provider.of(context).getTheme(), initialRoute: SPLASH, // initialRoute: CALL_PAGE, // initialRoute: OPENTOK_CALL_PAGE, // initialRoute: PACKAGES_OFFERS, // initialRoute: PACKAGES_ORDER_COMPLETED, routes: routes, debugShowCheckedModeBanner: false, ), ), ); }, ); }, ); } }