diff --git a/android/build.gradle b/android/build.gradle index 8a97f515..46c8995a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -66,6 +66,20 @@ allprojects { jvmTarget = "21" } } + + if (project.name == 'nfc_manager') { + project.tasks.matching { it.name.startsWith("compile") && it.name.endsWith("Kotlin") }.configureEach { + doFirst { + def translatorFile = project.file("src/main/kotlin/io/flutter/plugins/nfcmanager/Translator.kt") + if (translatorFile.exists()) { + def content = translatorFile.text + if (content.contains("toLowerCase(Locale.ROOT)")) { + translatorFile.text = content.replace("toLowerCase(Locale.ROOT)", "lowercase(Locale.ROOT)") + } + } + } + } + } } } } diff --git a/assets/images/all_categories.png b/assets/images/all_categories.png deleted file mode 100644 index aa6f8959..00000000 Binary files a/assets/images/all_categories.png and /dev/null differ diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 7c569640..1dc6cf76 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 6aac74dd..03a06b13 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 0AD79F8B1905C17FADC8B42C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8F0CC8EAC13AF3E07BEE567 /* Pods_Runner.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 1CCF895CFB3C95DEBB84A05F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8F0CC8EAC13AF3E07BEE567 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 76AE113C28E078EA00513112 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76AE113B28E078EA00513112 /* GoogleService-Info.plist */; }; @@ -57,7 +57,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1CCF895CFB3C95DEBB84A05F /* Pods_Runner.framework in Frameworks */, + 0AD79F8B1905C17FADC8B42C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -144,7 +144,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, C4CFBC4C5CAC00182015ACD5 /* [CP] Embed Pods Frameworks */, - EF29CE25BB57F5AA48CE1136 /* [CP] Copy Pods Resources */, + 8ED1493DD0011941609D6F99 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -242,7 +242,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6C6E76E4FB19FAF11C24005D /* [CP] Copy Pods Resources */ = { + 8ED1493DD0011941609D6F99 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -454,7 +454,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -504,7 +504,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 9c12df59..bb7d20fe 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -3,9 +3,23 @@ LastUpgradeVersion = "1510" version = "1.3"> + + + + sms tel mailto + https + http + comgooglemaps + googlechromes + waze LSRequiresIPhoneOS @@ -46,19 +51,23 @@ NSCameraUsageDescription - This app requires camera access to capture & upload picture as profile image. + This app requires camera access to capture & upload picture as profile image, and scan QR codes. NSFaceIDUsageDescription This app requires Face ID to allow biometric authentication for app login. + NSLocalNetworkUsageDescription + This app requires access to local network to connect to company Wi-Fi networks for attendance. NSLocationAlwaysAndWhenInUseUsageDescription - This App requires access to your location to mark your attendance. + This app requires access to your location to mark your attendance and discover nearby offers and merchants. NSLocationAlwaysUsageDescription - This App requires access to your location to mark your attendance. + This app requires access to your location to mark your attendance and discover nearby offers and merchants. NSLocationWhenInUseUsageDescription - This App requires access to your location to mark your attendance. + This app requires access to your location to mark your attendance and discover nearby offers and merchants. NSMicrophoneUsageDescription - This app requires microphone access to for call. + This app requires microphone access for audio calls and recording voice messages. NSPhotoLibraryUsageDescription This app requires photo library access to select image as document & upload it. + NSPhotoLibraryAddUsageDescription + This app requires access to save photos and documents to your photo library. UIApplicationSupportsIndirectInputEvents NSSpeechRecognitionUsageDescription diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 304aa000..98a55e2d 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -20,6 +20,7 @@ com.apple.developer.nfc.readersession.formats + NDEF TAG com.apple.developer.ubiquity-container-identifiers diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart index 0a2a3d97..65e5fc64 100644 --- a/lib/api/login_api_client.dart +++ b/lib/api/login_api_client.dart @@ -294,9 +294,9 @@ class LoginApiClient { return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json).basicMemberInformation, url, postParams); } - Future checkActivationCode(bool isDeviceNFC, String? mobileNumber, String activationCode, String? pUserName) async { + Future checkActivationCode(bool isDeviceNFC, String? mobileNumber, String activationCode, String? pUserName, String loginType) async { String url = "${ApiConsts.erpRest}CheckActivationCode"; - Map postParams = {"IsDeviceNFC": isDeviceNFC, "MobileNumber": mobileNumber, "activationCode": activationCode, "P_USER_NAME": pUserName}; + Map postParams = {"IsDeviceNFC": isDeviceNFC, "MobileNumber": mobileNumber, "activationCode": activationCode, "P_USER_NAME": pUserName, "LoginType":loginType}; postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index 23197a5c..7d58478a 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -551,6 +551,7 @@ class ProfileApiClient { if (personId != null) { postParams["P_PERSON_ID"] = personId; } + postParams["PatientIdentificationID"] = patientIdentificationId?.replaceAll('-', '').trim(); // Only the Grant call carries these - Revoke's payload stays exactly as it was before // this feature. P_BIRTH_DATE/P_NHIC_VERIFIED_FLAG are always sent (even as null, if the // source contact from GET_EMPLOYEE_CONTACTS didn't have a value) once we're granting. @@ -561,7 +562,7 @@ class ProfileApiClient { if (patientIdentificationId != null && patientIdentificationId.trim().isNotEmpty) { // National ID comes formatted with dashes (e.g. "2-5616-1545-7") - the backend wants // the plain digit string (e.g. "2561615457"). - postParams["PatientIdentificationID"] = patientIdentificationId.replaceAll('-', '').trim(); + } } postParams.addAll(AppState().postParamsJson); diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index d0b5f21d..42fba962 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -886,7 +886,7 @@ class CodegenLoader extends AssetLoader{ "offersCount": "{} عروض", "mazayaExclusive": "حصري لمزايا", "youAreAllCaughtUp": "لقد شاهدت كل العروض. المزيد قريباً.", - "selectCity": "اختر المدينة" + "selectCity": "اختر المدينة", }; static const Map _en_US = { "mohemm": "Mohemm", @@ -1760,7 +1760,7 @@ static const Map _en_US = { "offersCount": "{} offers", "mazayaExclusive": "MAZAYA EXCLUSIVE", "youAreAllCaughtUp": "You're all caught up. More little extras soon.", - "selectCity": "Select City" + "selectCity": "Select City", }; static const Map> mapLocales = {"ar_SA": _ar_SA, "en_US": _en_US}; } diff --git a/lib/ui/login/verify_last_login_screen.dart b/lib/ui/login/verify_last_login_screen.dart index 6234a951..20bc28f1 100644 --- a/lib/ui/login/verify_last_login_screen.dart +++ b/lib/ui/login/verify_last_login_screen.dart @@ -387,7 +387,7 @@ class _VerifyLastLoginScreenState extends State { Future performDirectApiCall(String _title, String _icon, int _flag, String value, TextEditingController? _pinPutController, {bool isDirectLogin = false}) async { try { - GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(true, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().getUserName); + GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(true, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().getUserName,_flag.toString()); String devToken = AppState().getIsHuawei ? AppState().getHuaweiPushToken : ((mobileLoginInfoListModel?.deviceToken != null && mobileLoginInfoListModel!.deviceToken!.isNotEmpty && mobileLoginInfoListModel!.deviceToken != "null") diff --git a/lib/ui/login/verify_login_screen.dart b/lib/ui/login/verify_login_screen.dart index 9fb1c7fb..cc485cb4 100644 --- a/lib/ui/login/verify_login_screen.dart +++ b/lib/ui/login/verify_login_screen.dart @@ -652,7 +652,7 @@ class _VerifyLoginScreenState extends State { (value, TextEditingController _pinPutController) async { Utils.showLoading(context); try { - GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(true, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().getUserName); + GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(true, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().getUserName, _flag.toString()); String devToken = AppState().getIsHuawei ? AppState().getHuaweiPushToken : ((firebaseToken != null && firebaseToken!.isNotEmpty && firebaseToken != "null")