From 3b13701cec8f078c607feaf90f3469cf0c27328e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 14 Feb 2023 16:49:03 +0300 Subject: [PATCH 1/3] Android fixes --- android/app/build.gradle | 2 +- android/app/src/main/AndroidManifest.xml | 1 + lib/api/chat/chat_api_client.dart | 1 + pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index fa085a0..bc12304 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -52,7 +52,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "hmg.cloudSolutions.mohem" - minSdkVersion 21 + minSdkVersion 25 targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5b3b2ba..3f5e424 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="Mohemm" + android:extractNativeLibs="true" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round"> =2.16.0 <3.0.0" From 20109cbe9e410a011ea5416ed9dd7044088ddd68 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 16 Feb 2023 10:38:59 +0300 Subject: [PATCH 2/3] Attendance fixes --- android/app/build.gradle | 2 +- lib/api/chat/chat_api_client.dart | 2 +- lib/widgets/mark_attendance_widget.dart | 138 ++++++++++++++++++------ lib/widgets/qr_scanner_dialog.dart | 2 + pubspec.yaml | 2 +- 5 files changed, 110 insertions(+), 36 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index bc12304..5590740 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -52,7 +52,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "hmg.cloudSolutions.mohem" - minSdkVersion 25 + minSdkVersion 28 targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/lib/api/chat/chat_api_client.dart b/lib/api/chat/chat_api_client.dart index 7d4c61a..f727c7d 100644 --- a/lib/api/chat/chat_api_client.dart +++ b/lib/api/chat/chat_api_client.dart @@ -31,7 +31,7 @@ class ChatApiClient { "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(), "password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG", "isMobile": true, - "deviceToken": AppState().getDeviceToken, + "deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken, "isHuaweiDevice": AppState().getIsHuawei, }, ); diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart index a4558b9..16dd3bc 100644 --- a/lib/widgets/mark_attendance_widget.dart +++ b/lib/widgets/mark_attendance_widget.dart @@ -4,6 +4,9 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:huawei_location/location/fused_location_provider_client.dart'; +import 'package:huawei_location/location/location_request.dart'; +import 'package:huawei_location/location/location_settings_request.dart'; import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; @@ -39,6 +42,8 @@ class MarkAttendanceWidget extends StatefulWidget { class _MarkAttendanceWidgetState extends State { bool isNfcEnabled = false, isNfcLocationEnabled = false, isQrEnabled = false, isQrLocationEnabled = false, isWifiEnabled = false, isWifiLocationEnabled = false; + int _locationUpdateCbId = 0; + @override void initState() { super.initState(); @@ -95,13 +100,17 @@ class _MarkAttendanceWidgetState extends State { // if (isNfcEnabled) attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () { if (isNfcLocationEnabled) { - Location.getCurrentLocation((Position position, bool isMocked) { - if (isMocked) { - markFakeAttendance("NFC", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); - } else { - performNfcAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); - } - }, context); + if (AppState().getIsHuawei) { + getHuaweiCurrentLocation("NFC"); + } else { + Location.getCurrentLocation((Position position, bool isMocked) { + if (isMocked) { + markFakeAttendance("NFC", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); + } else { + performNfcAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); + } + }, context); + } } else { performNfcAttendance(widget.model); } @@ -109,13 +118,17 @@ class _MarkAttendanceWidgetState extends State { if (isWifiEnabled) attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () { if (isWifiLocationEnabled) { - Location.getCurrentLocation((Position position, bool isMocked) { - if (isMocked) { - markFakeAttendance("WIFI", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); - } else { - performWifiAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); - } - }, context); + if (AppState().getIsHuawei) { + getHuaweiCurrentLocation("WIFI"); + } else { + Location.getCurrentLocation((Position position, bool isMocked) { + if (isMocked) { + markFakeAttendance("WIFI", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); + } else { + performWifiAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); + } + }, context); + } } else { performWifiAttendance(widget.model); } @@ -124,13 +137,17 @@ class _MarkAttendanceWidgetState extends State { if (isQrEnabled) attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async { if (isQrLocationEnabled) { - Location.getCurrentLocation((Position position, bool isMocked) { - if (isMocked) { - markFakeAttendance("QR", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); - } else { - performQrCodeAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); - } - }, context); + if (AppState().getIsHuawei) { + getHuaweiCurrentLocation("QR"); + } else { + Location.getCurrentLocation((Position position, bool isMocked) { + if (isMocked) { + markFakeAttendance("QR", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); + } else { + performQrCodeAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); + } + }, context); + } } else { performQrCodeAttendance(widget.model); } @@ -143,6 +160,33 @@ 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); + + locationService.checkLocationSettings(locationSettingsRequest).then((settings) async { + await locationService.getLastLocation().then((value) { + 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) { + if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") { + // Location service not enabled. + } + }); + } + Future performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { if (Platform.isIOS) { Utils.readNFc(onRead: (String nfcId) async { @@ -252,12 +296,26 @@ class _MarkAttendanceWidgetState extends State { bool status = await model.fetchAttendanceTracking(context); Utils.hideLoading(context); await closeWifiRequest(); - showMDialog( - context, - backgroundColor: Colors.transparent, - isDismissable: false, - child: SuccessDialog(widget.isFromDashboard), - ); + if (g?.messageStatus == 2) { + showDialog( + barrierDismissible: true, + context: context, + builder: (cxt) => ConfirmDialog( + message: g?.errorEndUserMessage ?? "", + onTap: () { + Navigator.pop(context); + }, + onCloseTap: () {}, + ), + ); + } else { + showMDialog( + context, + backgroundColor: Colors.transparent, + isDismissable: false, + child: SuccessDialog(widget.isFromDashboard), + ); + } } catch (ex) { await closeWifiRequest(); Utils.hideLoading(context); @@ -292,12 +350,26 @@ class _MarkAttendanceWidgetState extends State { GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue); bool status = await model.fetchAttendanceTracking(context); Utils.hideLoading(context); - showMDialog( - context, - backgroundColor: Colors.transparent, - isDismissable: true, - child: SuccessDialog(widget.isFromDashboard), - ); + if (g?.messageStatus == 2) { + showDialog( + barrierDismissible: true, + context: context, + builder: (cxt) => ConfirmDialog( + message: g?.errorEndUserMessage ?? "", + onTap: () { + Navigator.pop(context); + }, + onCloseTap: () {}, + ), + ); + } else { + showMDialog( + context, + backgroundColor: Colors.transparent, + isDismissable: true, + child: SuccessDialog(widget.isFromDashboard), + ); + } } catch (ex) { print(ex); Utils.hideLoading(context); diff --git a/lib/widgets/qr_scanner_dialog.dart b/lib/widgets/qr_scanner_dialog.dart index 6082d4c..1889616 100644 --- a/lib/widgets/qr_scanner_dialog.dart +++ b/lib/widgets/qr_scanner_dialog.dart @@ -68,6 +68,8 @@ class _QrScannerDialogState extends State { } }); }); + controller.pauseCamera(); + controller.resumeCamera(); } @override diff --git a/pubspec.yaml b/pubspec.yaml index 2c1cce3..cd264ad 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,7 +64,7 @@ dependencies: wifi_iot: ^0.3.18 flutter_html: ^3.0.0-alpha.6 # flutter_barcode_scanner: ^2.0.0 - qr_code_scanner: ^1.0.0 + qr_code_scanner: ^1.0.1 # qr_flutter: ^4.0.0 url_launcher: ^6.0.15 share: 2.0.4 From 88abc86e390315685d521c8c0257aba12f28b569 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 16 Feb 2023 11:00:09 +0300 Subject: [PATCH 3/3] version id update --- lib/app_state/app_state.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 9cabbb9..2395bc1 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -88,7 +88,7 @@ class AppState { String get getHuaweiPushToken => _huaweiPushToken; - final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 4.2, mobileType: Platform.isAndroid ? "android" : "ios"); + final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 4.3, mobileType: Platform.isAndroid ? "android" : "ios"); void setPostParamsInitConfig() { isAuthenticated = false;