diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 5126f6d..7555dc6 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -5,6 +5,7 @@ import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; @@ -12,6 +13,7 @@ import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_main_response.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; +import 'package:platform_device_id/platform_device_id.dart'; import 'package:uuid/uuid.dart'; class DashboardApiClient { @@ -107,11 +109,11 @@ class DashboardApiClient { //Mark Attendance Future markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async { String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; - var uuid = Uuid(); + // var uuid = Uuid(); // Generate a v4 (random) id Map postParams = { - "UID": uuid.v4(), //Mobile Id + "UID": await PlatformDeviceId.getDeviceId, //uuid.v4(), //Mobile Id "Latitude": lat, "Longitude": long, "QRValue": QRValue, @@ -204,6 +206,7 @@ Future setAdvertisementViewed(String masterID, int advertisementId) async { Map postParams = { "ItgNotificationMasterId": masterID, + "EmployeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(), "ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id }; postParams.addAll(AppState().postParamsJson); diff --git a/lib/classes/notifications.dart b/lib/classes/notifications.dart index ffb0c8d..865d6c1 100644 --- a/lib/classes/notifications.dart +++ b/lib/classes/notifications.dart @@ -4,7 +4,8 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; + +// import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; import 'package:huawei_push/huawei_push.dart' as huawei_push; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; @@ -19,7 +20,7 @@ class AppNotifications { factory AppNotifications() => _instance; - late HmsApiAvailability hmsApiAvailability; + // late HmsApiAvailability hmsApiAvailability; String _huaweiToken = ''; @@ -40,9 +41,9 @@ class AppNotifications { } void init(String? firebaseToken) async { - if (Platform.isAndroid) { - hmsApiAvailability = HmsApiAvailability(); - } + // if (Platform.isAndroid) { + // hmsApiAvailability = HmsApiAvailability(); + // } await requestPermissions(); AppState().setDeviceToken = firebaseToken; @@ -68,22 +69,22 @@ class AppNotifications { }); if (Platform.isAndroid) { - await hmsApiAvailability.isHMSAvailable().then((value) async { - if (value == 0) { - huawei_push.Push.enableLogger(); - var result = await huawei_push.Push.setAutoInitEnabled(true); - - huawei_push.Push.onNotificationOpenedApp.listen((message) { - // newMessage(toFirebaseRemoteMessage(message)); - }, onError: (e) => print(e.toString())); - - huawei_push.Push.onMessageReceivedStream.listen((message) { - // newMessage(toFirebaseRemoteMessage(message)); - }, onError: (e) => print(e.toString())); - } - }).catchError((err) { - print(err); - }); + // await hmsApiAvailability.isHMSAvailable().then((value) async { + if (!(await Utils.isGoogleServicesAvailable())) { + huawei_push.Push.enableLogger(); + var result = await huawei_push.Push.setAutoInitEnabled(true); + + huawei_push.Push.onNotificationOpenedApp.listen((message) { + // newMessage(toFirebaseRemoteMessage(message)); + }, onError: (e) => print(e.toString())); + + huawei_push.Push.onMessageReceivedStream.listen((message) { + // newMessage(toFirebaseRemoteMessage(message)); + }, onError: (e) => print(e.toString())); + } + // }).catchError((err) { + // print(err); + // }); } } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 076e8ab..4b15577 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -7,6 +7,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; +import 'package:google_api_availability/google_api_availability.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/config/routes.dart'; @@ -20,6 +21,7 @@ import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:nfc_manager/platform_tags.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:store_checker/store_checker.dart'; // ignore_for_file: avoid_annotating_with_dynamic @@ -226,7 +228,6 @@ class Utils { return BoxDecoration( color: background, border: Border.all( - width: 1, // color: background // <--- border width here ), @@ -391,4 +392,28 @@ class Utils { print(err); }); } + + //HUAWEI DECISION MAKING + // static Future isAppInstalledFromHuawei() async { + // Source installationSource = await StoreChecker.getSource; + // + // if (installationSource == Source.IS_INSTALLED_FROM_HUAWEI_APP_GALLERY) { + // return true; + // } + // return false; + // } + // + // static Future getInstallationSource() async { + // Source installationSource = await StoreChecker.getSource; + // return installationSource.toString().split(".")[1]; + // } + + static Future isGoogleServicesAvailable() async { + GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability(); + String status = availability.toString().split('.').last; + if (status == "success") { + return true; + } + return false; + } } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index b9e1acd..45cfc05 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -22,7 +22,7 @@ extension TrimString on String { } } -String displayLocalizedContent({required bool isPhoneLangArabic,required int selectedLanguage,required String englishContent,required String arabicContent}) { +String displayLocalizedContent({required bool isPhoneLangArabic, required int selectedLanguage, required String englishContent, required String arabicContent}) { if (selectedLanguage == 1) { return englishContent; } else if (selectedLanguage == 2) { @@ -122,9 +122,10 @@ extension EmailValidator on String { decoration: isUnderLine ? TextDecoration.underline : null), ); - Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines, double? height}) => Text( + Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines, double? height, bool isCentered = false}) => Text( this, maxLines: maxlines, + textAlign: isCentered ? TextAlign.center : null, style: TextStyle( color: color ?? MyColors.darkTextColor, fontSize: 16, diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index d2008e9..e905919 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -26,6 +26,7 @@ import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_banner.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart'; @@ -62,7 +63,9 @@ class _DashboardScreenState extends State with WidgetsBindingOb data = Provider.of(context, listen: false); marathonProvider = Provider.of(context, listen: false); cProvider = Provider.of(context, listen: false); - _bHubCon(); + if (checkIfPrivilegedForChat()) { + _bHubCon(); + } _onRefresh(true); }); } @@ -143,7 +146,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb data.fetchMenuEntries(); data.getCategoryOffersListAPI(context); marathonProvider.getMarathonDetailsFromApi(); - if(isFromInit) { + if (isFromInit) { checkERMChannel(); } if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon(); @@ -166,15 +169,6 @@ class _DashboardScreenState extends State with WidgetsBindingOb "masterId": val.result!.data!.notificationMasterId, "advertisement": value.mohemmItgResponseItem!.result!.data!.advertisement, }); - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (BuildContext context) => ITGAdsScreen( - // addMasterId: val.result!.data!.notificationMasterId!, - // advertisement: value.mohemmItgResponseItem!.result!.data!.advertisement!, - // ), - // ), - // ); } } }, @@ -188,46 +182,6 @@ class _DashboardScreenState extends State with WidgetsBindingOb Widget build(BuildContext context) { return Scaffold( key: _scaffoldState, - // appBar: AppBar( - // actions: [ - // IconButton( - // onPressed: () { - // data.getITGNotification().then((val) { - // if (val!.result!.data != null) { - // print("-------------------- Survey ----------------------------"); - // if (val.result!.data!.notificationType == "Survey") { - // Navigator.pushNamed(context, AppRoutes.survey, arguments: val.result!.data); - // } else { - // print("------------------------------------------- Ads --------------------"); - // DashboardApiClient().getAdvertisementDetail(val.result!.data!.notificationMasterId ?? "").then( - // (value) { - // if (value!.mohemmItgResponseItem!.statusCode == 200) { - // if (value.mohemmItgResponseItem!.result!.data != null) { - // Navigator.pushNamed(context, AppRoutes.advertisement, arguments: { - // "masterId": val.result!.data!.notificationMasterId, - // "advertisement": value.mohemmItgResponseItem!.result!.data!.advertisement, - // }); - // - // // Navigator.push( - // // context, - // // MaterialPageRoute( - // // builder: (BuildContext context) => ITGAdsScreen( - // // addMasterId: val.result!.data!.notificationMasterId!, - // // advertisement: value.mohemmItgResponseItem!.result!.data!.advertisement!, - // // ), - // // ), - // // ); - // } - // } - // }, - // ); - // } - // } - // }); - // }, - // icon: Icon(Icons.add)) - // ], - // ), body: Column( children: [ Row( @@ -288,7 +242,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ LocaleKeys.welcomeBack.tr().toText14(color: MyColors.grey77Color), (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true), 16.height, @@ -673,7 +627,6 @@ class _DashboardScreenState extends State with WidgetsBindingOb } } }); - Navigator.pushNamed(context, AppRoutes.offersAndDiscountsDetails, arguments: getOffersDetailList); } } diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index 1eab45c..2e14cab 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -5,11 +5,10 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; +// import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; import 'package:mohem_flutter_app/api/login_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; @@ -59,12 +58,12 @@ class _LoginScreenState extends State { bool isOnExternalStorage = false; bool isDevelopmentModeEnable = false; - late HmsApiAvailability hmsApiAvailability; + // late HmsApiAvailability hmsApiAvailability; @override void initState() { super.initState(); - hmsApiAvailability = HmsApiAvailability(); + // hmsApiAvailability = HmsApiAvailability(); // checkFirebaseToken(); // if (kReleaseMode) { // checkDeviceSafety(); @@ -92,6 +91,9 @@ class _LoginScreenState extends State { super.dispose(); } + + + String? firebaseToken; GetMobileLoginInfoListModel? loginInfo; @@ -100,11 +102,14 @@ class _LoginScreenState extends State { Utils.showLoading(context); if (Platform.isAndroid) { try { - await hmsApiAvailability.isHMSAvailable().then((value) async { - if (value == 0) { + // await hmsApiAvailability.isHMSAvailable().then((value) async { + // if (await Utils.isAppInstalledFromHuawei() && !(await Utils.isGoogleServicesAvailable())) { + if (!(await Utils.isGoogleServicesAvailable())) { + print("HUAWEI APPPP GALLERYYYY!!!!"); AppState().setIsHuawei = true; AppNotifications().initHuaweiPush(checkLoginInfo); } else { + print("GOOGLE PLAY STOREEEE!!!!"); await Firebase.initializeApp(); _firebaseMessaging = FirebaseMessaging.instance; firebaseToken = await _firebaseMessaging.getToken(); @@ -112,7 +117,7 @@ class _LoginScreenState extends State { checkLoginInfo(); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } - }); + // }); } catch (ex) {} } else { await Firebase.initializeApp(); diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index 65b9353..908a8c0 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -279,8 +279,8 @@ class MarathonProvider extends ChangeNotifier { oneSec, (Timer timer) async { if (totalSecondsToWaitForWinner == 1) { - await callGetSelectedWinnersApi().whenComplete(() => updateQuestionCardStatus(QuestionCardStatus.winnerFound)); timer.cancel(); + await callGetSelectedWinnersApi().whenComplete(() => updateQuestionCardStatus(QuestionCardStatus.winnerFound)); return; } else if (totalSecondsToWaitForWinner == 15) { totalSecondsToWaitForWinner--; @@ -353,12 +353,15 @@ class MarathonProvider extends ChangeNotifier { gapTimeImage = currentQuestion.gapImage; gapTimeText = currentQuestion.gapText; gapTimeType = currentQuestion.gapType; + + startTimerForQuestion(); + updateCardData(); if (Utils.isLoading) { Utils.hideLoading(AppRoutes.navigatorKey.currentContext!); } - startTimerForQuestion(); - updateCardData(); - totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); + if (!AppState().getIsDemoMarathon) { + totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); + } Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen); } else { currentQuestion = AppState().getIsDemoMarathon diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart index 7c7e672..2ffa961 100644 --- a/lib/widgets/mark_attendance_widget.dart +++ b/lib/widgets/mark_attendance_widget.dart @@ -192,42 +192,53 @@ class _MarkAttendanceWidgetState extends State { } void getHuaweiCurrentLocation(String attendanceType) { - FusedLocationProviderClient locationService = FusedLocationProviderClient(); - LocationRequest locationRequest = LocationRequest(); - locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; - locationRequest.interval = 1000; - List locationRequestList = [locationRequest]; - LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList); + try { + FusedLocationProviderClient locationService = FusedLocationProviderClient(); + LocationRequest locationRequest = LocationRequest(); + locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; + locationRequest.interval = 1000; + List locationRequestList = [locationRequest]; + LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList); - locationService.checkLocationSettings(locationSettingsRequest).then((settings) async { - await locationService.getLastLocation().then((value) { - if (value.latitude == null || value.longitude == null) { - showDialog( - context: context, - builder: (BuildContext cxt) => ConfirmDialog( - message: "Unable to get your location, Please check your location settings & try again.", - onTap: () { - Navigator.pop(context); - }, - ), - ); - } else { - if (attendanceType == "QR") { - performQrCodeAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); - } - if (attendanceType == "WIFI") { - performWifiAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); - } - if (attendanceType == "NFC") { - performNfcAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); + locationService.checkLocationSettings(locationSettingsRequest).then((settings) async { + await locationService.getLastLocation().then((value) { + if (value.latitude == null || value.longitude == null) { + showDialog( + context: context, + builder: (BuildContext cxt) => ConfirmDialog( + message: "Unable to get your location, Please check your location settings & try again.", + onTap: () { + Navigator.pop(context); + }, + ), + ); + } else { + if (attendanceType == "QR") { + performQrCodeAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); + } + if (attendanceType == "WIFI") { + performWifiAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); + } + if (attendanceType == "NFC") { + performNfcAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); + } } + }).catchError((error) { + print("HUAWEI LOCATION getLastLocation ERROR!!!!!"); + print(error); + }); + }).catchError((error) { + print("HUAWEI LOCATION checkLocationSettings ERROR!!!!!"); + print(error); + if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") { + // Location service not enabled. } }); - }).catchError((error) { - if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") { - // Location service not enabled. - } - }); + } catch(error) { + print("HUAWEI LOCATION ERROR!!!!!"); + print(error); + } + } Future performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { diff --git a/pubspec.yaml b/pubspec.yaml index 3ce4818..fc040a7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 3.2.6+300026 +version: 3.2.91+300030 environment: sdk: ">=2.16.0 <3.0.0" @@ -54,7 +54,10 @@ dependencies: logger: ^1.1.0 flutter_countdown_timer: ^4.1.0 nfc_manager: ^3.2.0 - uuid: ^3.0.6 +# uuid: ^3.0.6 +# device_info_plus: ^4.0.0 +# android_id: ^0.1.3+1 + platform_device_id: ^1.0.1 image_picker: ^0.8.5+3 file_picker: ^4.6.1 geolocator: ^9.0.2 @@ -102,7 +105,7 @@ dependencies: flutter_layout_grid: ^2.0.1 #Huawei Dependencies - huawei_hmsavailability: ^6.6.0+300 +# huawei_hmsavailability: ^6.6.0+300 huawei_location: 6.0.0+302 huawei_push: ^6.7.0+300 firebase_crashlytics: ^2.9.0 @@ -110,6 +113,10 @@ dependencies: #Items for sale Image Carousel Slider carousel_slider: ^4.2.1 + #Huawei Specified + store_checker: ^1.1.0 + google_api_availability: ^3.0.1 + dependency_overrides: firebase_core_platform_interface: 4.5.1