From a053ac4a6da01c5cdeeb3087d4b203afc7679c9e Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 4 Feb 2025 17:37:50 +0300 Subject: [PATCH] force update added, --- lib/controllers/api_routes/urls.dart | 10 +- .../providers/api/user_provider.dart | 1 + .../providers/settings/setting_provider.dart | 15 +++ lib/main.dart | 2 + lib/new_views/pages/splash_page.dart | 110 +++++++++++------- lib/new_views/swipe_module/swipe_view.dart | 2 +- lib/views/update_available_screen.dart | 54 +++++++++ 7 files changed, 147 insertions(+), 47 deletions(-) create mode 100644 lib/views/update_available_screen.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 7e87bdc1..4859b8db 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,12 +1,15 @@ class URLs { URLs._(); - // static const host1 = "https://atomsm.hmg.com"; // production url - static const host1 = "https://atomsmdev.hmg.com"; // local UAT url + static const String appReleaseBuildNumber = "14"; + + static const host1 = "https://atomsm.hmg.com"; // production url + // static const host1 = "https://atomsmdev.hmg.com"; // local UAT url // static String _baseUrl = "$_host/mobile"; // static String _baseUrl = "$_host/mobile"; - static String _baseUrl = "$_host/v3/mobile"; // new V3 apis + static String _baseUrl = "$_host/v2/mobile"; // new V2 apis + // static String _baseUrl = "$_host/v3/mobile"; // new V3 apis static String _host = host1; @@ -19,6 +22,7 @@ class URLs { // API Routes static get login => "$_baseUrl/MobileAuth/Login"; // web login static get checkLoginValidation => "$_baseUrl/Account/Authenticate"; // web login + static get checkAppVersion => "$_baseUrl/Account/CheckAppVersion"; // web login // static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // mobile login static get register => "$_baseUrl/handle/create/user"; // post static get updateProfile => "$_baseUrl/update/user/profile"; // post diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 557fe25a..3cecab21 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -232,6 +232,7 @@ class UserProvider extends ChangeNotifier { "userId": userId, "dateFrom": dateFrom.toIso8601String(), "dateTo": dateTo.toIso8601String(), + "IsSucces":true, }; try { response = await ApiManager.instance.post(URLs.getSwipeTransactionHistoryUrl, body: body); diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index 4824b6f3..73eb648d 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -204,4 +204,19 @@ class SettingProvider extends ChangeNotifier { return isValid; } } + + Future checkAppUpdate(String buildNumber, String osType) async { + Response response; + bool isValid = false; + try { + Map body = {"buildNumber": buildNumber, "osType": osType}; + response = await ApiManager.instance.post(URLs.checkAppVersion, body: body); + if (response.statusCode >= 200 && response.statusCode < 300) { + isValid = (jsonDecode(response.body)["data"]); + } + return isValid; + } catch (error) { + return isValid; + } + } } diff --git a/lib/main.dart b/lib/main.dart index 8b971f3d..73f7c9be 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -100,6 +100,7 @@ import 'package:test_sa/views/pages/user/requests/requests_page.dart'; import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart'; +import 'package:test_sa/views/update_available_screen.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; @@ -263,6 +264,7 @@ class MyApp extends StatelessWidget { SwipeSuccessView.routeName: (_) => const SwipeSuccessView(), SwipeHistoryView.routeName: (_) => SwipeHistoryView(), SwipeView.routeName: (_) => const SwipeView(), + UpdateAvailableScreen.routeName: (_) => UpdateAvailableScreen(), ///todo deleted //old.LandPage.id: (_) => const old.LandPage(), diff --git a/lib/new_views/pages/splash_page.dart b/lib/new_views/pages/splash_page.dart index 4f27f82a..2f7169c9 100644 --- a/lib/new_views/pages/splash_page.dart +++ b/lib/new_views/pages/splash_page.dart @@ -7,6 +7,8 @@ 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/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'; @@ -14,6 +16,7 @@ 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/usSafeDevice_view.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'; @@ -58,26 +61,44 @@ class _SplashPageState extends State { loading = true; }); - bool isValid = await _settingProvider.checkUserTokenValidation(token); - setState(() { - loading = false; - }); - if (isValid && _settingProvider.isLocalAuthEnable) { - bool isSuccess = await checkDualAuthentication(); - if (isSuccess) { - _userProvider.user = _settingProvider.user; - - if(_userProvider.user.onlySwipe){ - Navigator.of(context).pushNamedAndRemoveUntil(SwipeView.routeName, (routes) => true); - }else{ - Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => 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 && _settingProvider.isLocalAuthEnable) { + bool isSuccess = await checkDualAuthentication(); + if (isSuccess) { + _userProvider.user = _settingProvider.user; + + if (_userProvider.user.onlySwipe) { + Navigator.of(context).pushNamedAndRemoveUntil(SwipeView.routeName, (routes) => true); + } else { + Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); + } + } else { + Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); + } } else { Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); } - } else { - Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); } } @@ -110,35 +131,38 @@ class _SplashPageState extends State { )), SizedBox( width: MediaQuery.of(context).size.width / 1.1, - child: FlareActor( - "assets/rives/atoms_splash.flr", - fit: BoxFit.contain, - animation: "splash", - callback: (animation) async { - bool isSafe = await checkDeviceSafety(); - print('is safe is ${isSafe}'); - if (!isSafe) { - Navigator.pushNamedAndRemoveUntil(context, UnsafeDeviceScreen.routeName, (_) => false); - } else { - if (_settingProvider.isLoaded && (_settingProvider.user != null)) { - checkTokenValidity(_settingProvider.user.token); + child: Hero( + tag: "logo", + child: FlareActor( + "assets/rives/atoms_splash.flr", + fit: BoxFit.contain, + animation: "splash", + callback: (animation) async { + bool isSafe = await checkDeviceSafety(); + print('is safe is ${isSafe}'); + if (!isSafe) { + Navigator.pushNamedAndRemoveUntil(context, UnsafeDeviceScreen.routeName, (_) => false); } else { - Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); + 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); - // } - }, + + // 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, ], diff --git a/lib/new_views/swipe_module/swipe_view.dart b/lib/new_views/swipe_module/swipe_view.dart index 602d3e97..2c7310da 100644 --- a/lib/new_views/swipe_module/swipe_view.dart +++ b/lib/new_views/swipe_module/swipe_view.dart @@ -90,7 +90,7 @@ class _SwipeViewState extends State { child: ClipOval( child: snapshot.profileImage != null ? Image.file(snapshot.profileImage) - : (snapshot.user.profilePhotoName?.isNotEmpty ?? false) + : (snapshot.user?.profilePhotoName?.isNotEmpty ?? false) ? Image.network(snapshot.user.profilePhotoName) : const Icon(Icons.person, size: 24, color: Colors.white), ), diff --git a/lib/views/update_available_screen.dart b/lib/views/update_available_screen.dart new file mode 100644 index 00000000..56949089 --- /dev/null +++ b/lib/views/update_available_screen.dart @@ -0,0 +1,54 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class UpdateAvailableScreen extends StatelessWidget { + static const String routeName = "/UpdateAvailableScreen"; + + UpdateAvailableScreen({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Hero(tag: "logo", child: "logo".toSvgAsset(height: 64)), + 48.height, + Text( + "Update Available", + style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), + ), + 24.height, + Text( + "A new update is available on store.\nUpdate now to enjoy the latest features, improvements, and bug fixes for a smoother experience! ", + textAlign: TextAlign.center, + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + ), + 24.height, + AppFilledButton( + label: context.translation.update, + maxWidth: true, + onPressed: () { + if (Platform.isAndroid || Platform.isIOS) { + final appId = Platform.isAndroid ? 'com.hmg.atoms' : '6446684161'; + final url = Uri.parse(Platform.isAndroid ? "market://details?id=$appId" : "https://apps.apple.com/app/id$appId"); + launchUrl( + url, + mode: LaunchMode.externalApplication, + ); + } + }), + ], + ).paddingAll(24), + ); + } +}