From dc864bcd05568d015f9b1fdf20c0311523516047 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Tue, 14 Feb 2023 16:42:21 +0300 Subject: [PATCH 1/8] Minor Fix --- lib/api/marathon/marathon_api_client.dart | 15 +++++++++++++++ lib/classes/consts.dart | 1 + lib/ui/marathon/marathon_provider.dart | 1 + 3 files changed, 17 insertions(+) diff --git a/lib/api/marathon/marathon_api_client.dart b/lib/api/marathon/marathon_api_client.dart index ee3810f..9497b48 100644 --- a/lib/api/marathon/marathon_api_client.dart +++ b/lib/api/marathon/marathon_api_client.dart @@ -34,6 +34,20 @@ class MarathonApiClient { ); } + Future getMarathonersCount({required String marathonId}) async { + Response response = await ApiClient().getJsonForResponse( + ApiConsts.marathonGetMarathonersCount + '?marathonId=$marathonId', + token: AppState().getMarathonToken == null || AppState().getMarathonToken == "" ? await getMarathonToken() : AppState().getMarathonToken, + ); + + var json = jsonDecode(response.body); + logger.i("json in getMarathonersCount: $json"); + + MarathonGenericModel marathonGenericModel = MarathonGenericModel.fromJson(json); + + return marathonGenericModel.data as int; + } + Future getProjectId() async { return await ApiClient().postJsonForObject( (json) { @@ -89,6 +103,7 @@ class MarathonApiClient { ); } + Future getNextQuestion({required String? questionId, required String marathonId}) async { Map jsonObject = { "previousQuestionId": questionId, diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 96fd4b0..688fd70 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -37,6 +37,7 @@ class ApiConsts { static String marathonSubmitAnswerUrl = marathonBaseUrl + "question/submit"; static String marathonQualifiersUrl = marathonBaseUrl + "winner/getWinner/"; static String marathonSelectedWinner = marathonBaseUrl + "winner/getSelectedWinner/"; + static String marathonGetMarathonersCount = marathonBaseUrl + "Participant/GetRemainingParticipants"; //DummyCards for the UI static CardContent dummyQuestion = const CardContent(); diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index e18b027..8b9e6af 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -195,6 +195,7 @@ class MarathonProvider extends ChangeNotifier { if (isUserWaiting) { MarathonApiClient().joinMarathonAsParticipant().whenComplete(() async { await callNextQuestionApi(); + totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); }); } else { isButtonEnabled = false; From 3b13701cec8f078c607feaf90f3469cf0c27328e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 14 Feb 2023 16:49:03 +0300 Subject: [PATCH 2/8] 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 9469997d33db17208a37e350f76954471452a283 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Tue, 14 Feb 2023 17:11:16 +0300 Subject: [PATCH 3/8] Updated --- lib/ui/marathon/marathon_provider.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index 8b9e6af..65b9353 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -195,7 +195,6 @@ class MarathonProvider extends ChangeNotifier { if (isUserWaiting) { MarathonApiClient().joinMarathonAsParticipant().whenComplete(() async { await callNextQuestionApi(); - totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); }); } else { isButtonEnabled = false; @@ -359,6 +358,7 @@ class MarathonProvider extends ChangeNotifier { } startTimerForQuestion(); updateCardData(); + totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen); } else { currentQuestion = AppState().getIsDemoMarathon From f37f748d6fe35cf8548116844ab65611d792aef5 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Wed, 15 Feb 2023 15:03:48 +0300 Subject: [PATCH 4/8] QuickFix --- lib/ui/marathon/marathon_screen.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ui/marathon/marathon_screen.dart b/lib/ui/marathon/marathon_screen.dart index 7ca267d..6dbbd18 100644 --- a/lib/ui/marathon/marathon_screen.dart +++ b/lib/ui/marathon/marathon_screen.dart @@ -175,7 +175,7 @@ class MarathonScreen extends StatelessWidget { selectedLanguage: provider.marathonDetailModel.selectedLanguage ?? 0, arabicContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr ?? "", englishContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn ?? "", - ).toText22( + ).toText24( color: MyColors.grey3AColor, isCentered: true, ), @@ -185,7 +185,7 @@ class MarathonScreen extends StatelessWidget { ) : const SizedBox(), if (provider.selectedWinners != null) ...[ - provider.selectedWinners!.length == 1 + provider.selectedWinners!.length == 1 && !provider.iAmWinner ? Column( children: [ displayLocalizedContent( From 20109cbe9e410a011ea5416ed9dd7044088ddd68 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 16 Feb 2023 10:38:59 +0300 Subject: [PATCH 5/8] 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 6/8] 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; From ca369f22434d58991302dba58ec3da31458d4251 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 16 Feb 2023 14:45:54 +0300 Subject: [PATCH 7/8] huawei attendance fixes --- lib/ui/login/login_screen.dart | 3 -- lib/widgets/mark_attendance_widget.dart | 66 ++++++++++++++++++++----- 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index d1f9592..1eab45c 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -110,7 +110,6 @@ class _LoginScreenState extends State { firebaseToken = await _firebaseMessaging.getToken(); AppNotifications().init(firebaseToken); checkLoginInfo(); - FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } }); @@ -121,13 +120,11 @@ class _LoginScreenState extends State { firebaseToken = await _firebaseMessaging.getToken(); AppNotifications().init(firebaseToken); checkLoginInfo(); - FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); - FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } } diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart index 16dd3bc..d6d111a 100644 --- a/lib/widgets/mark_attendance_widget.dart +++ b/lib/widgets/mark_attendance_widget.dart @@ -7,6 +7,7 @@ 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:huawei_location/permission/permission_handler.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'; @@ -24,6 +25,7 @@ import 'package:mohem_flutter_app/widgets/location/Location.dart'; import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart'; import 'package:nfc_manager/nfc_manager.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:wifi_iot/wifi_iot.dart'; class MarkAttendanceWidget extends StatefulWidget { @@ -71,6 +73,36 @@ class _MarkAttendanceWidgetState extends State { }); } + void checkHuaweiLocationPermission(String attendanceType) async { + PermissionHandler permissionHandler = PermissionHandler(); + + if (await permissionHandler.hasLocationPermission()) { + getHuaweiCurrentLocation(attendanceType); + } else { + bool has = await requestPermissions(); + if (has) { + getHuaweiCurrentLocation(attendanceType); + } else { + showDialog( + context: context, + builder: (BuildContext cxt) => ConfirmDialog( + message: "You need to give location permission to mark attendance", + onTap: () { + Navigator.pop(context); + }, + ), + ); + } + } + } + + Future requestPermissions() async { + var result = await [ + Permission.location, + ].request(); + return (result[Permission.location] == PermissionStatus.granted || result[Permission.locationAlways] == PermissionStatus.granted); + } + @override void dispose() { super.dispose(); @@ -101,7 +133,7 @@ class _MarkAttendanceWidgetState extends State { attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () { if (isNfcLocationEnabled) { if (AppState().getIsHuawei) { - getHuaweiCurrentLocation("NFC"); + checkHuaweiLocationPermission("NFC"); } else { Location.getCurrentLocation((Position position, bool isMocked) { if (isMocked) { @@ -119,7 +151,7 @@ class _MarkAttendanceWidgetState extends State { attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () { if (isWifiLocationEnabled) { if (AppState().getIsHuawei) { - getHuaweiCurrentLocation("WIFI"); + checkHuaweiLocationPermission("WIFI"); } else { Location.getCurrentLocation((Position position, bool isMocked) { if (isMocked) { @@ -138,7 +170,7 @@ class _MarkAttendanceWidgetState extends State { attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async { if (isQrLocationEnabled) { if (AppState().getIsHuawei) { - getHuaweiCurrentLocation("QR"); + checkHuaweiLocationPermission("QR"); } else { Location.getCurrentLocation((Position position, bool isMocked) { if (isMocked) { @@ -170,14 +202,26 @@ class _MarkAttendanceWidgetState extends State { 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() ?? ""); + 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) { From 5e22bcc1daa05b81856115806119c02dffabd0ac Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 16 Feb 2023 22:24:06 +0300 Subject: [PATCH 8/8] ERM Channel --- lib/api/dashboard_api_client.dart | 26 +++---- lib/classes/utils.dart | 1 + lib/ui/landing/dashboard_screen.dart | 38 +++++++++- .../itg/its_add_screen_video_image.dart | 75 ++++++++++++++----- 4 files changed, 108 insertions(+), 32 deletions(-) diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 95631a9..5126f6d 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -199,17 +199,17 @@ class DashboardApiClient { }, url, postParams); } -// Future setAdvertisementViewed(String masterID, int advertisementId) async { -// String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed"; -// -// Map postParams = { -// "ItgNotificationMasterId": masterID, -// "ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id -// }; -// postParams.addAll(AppState().postParamsJson); -// return await ApiClient().postJsonForObject((json) { -// // ItgMainRes responseData = ItgMainRes.fromJson(json); -// return json; -// }, url, postParams); -// } +Future setAdvertisementViewed(String masterID, int advertisementId) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed"; + + Map postParams = { + "ItgNotificationMasterId": masterID, + "ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + // ItgMainRes responseData = ItgMainRes.fromJson(json); + return json; + }, url, postParams); +} } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 3368f83..076e8ab 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -226,6 +226,7 @@ class Utils { return BoxDecoration( color: background, border: Border.all( + width: 1, // color: background // <--- border width here ), diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index ed064ac..1de8913 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -16,7 +16,6 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; @@ -143,10 +142,47 @@ class _DashboardScreenState extends State with WidgetsBindingOb data.fetchMenuEntries(); data.getCategoryOffersListAPI(context); marathonProvider.getMarathonDetailsFromApi(); + if(isFromInit) { + checkERMChannel(); + } if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon(); _refreshController.refreshCompleted(); } + void checkERMChannel() { + 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!, + // ), + // ), + // ); + } + } + }, + ); + } + } + }); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/ui/landing/itg/its_add_screen_video_image.dart b/lib/ui/landing/itg/its_add_screen_video_image.dart index bcb9ed4..d5fe237 100644 --- a/lib/ui/landing/itg/its_add_screen_video_image.dart +++ b/lib/ui/landing/itg/its_add_screen_video_image.dart @@ -2,10 +2,15 @@ import 'dart:convert'; import 'dart:io' as Io; import 'dart:io'; import 'dart:typed_data'; + import 'package:flutter/material.dart'; -import 'package:just_audio/just_audio.dart'; +import 'package:flutter_countdown_timer/index.dart'; import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads; import 'package:path_provider/path_provider.dart'; @@ -29,6 +34,7 @@ class _ITGAdsScreenState extends State { ads.Advertisement? advertisementData; dynamic data; String? masterID; + int videoDuration = 0; void checkFileType() async { String? rFile = advertisementData!.viewAttachFileColl!.first.base64String; @@ -42,7 +48,7 @@ class _ITGAdsScreenState extends State { _futureController = createVideoPlayer(rFile!); } setState(() {}); - initTimer(); + // initTimer(); } Future processImage(String encodedBytes) async { @@ -76,7 +82,7 @@ class _ITGAdsScreenState extends State { void initTimer() { Future.delayed(const Duration(seconds: 5), () { skip = true; - setState(() {}); + // setState(() {}); }); } @@ -93,9 +99,11 @@ class _ITGAdsScreenState extends State { if (masterID == null) masterID = data["masterId"]; if (advertisementData != null) { checkFileType(); + videoDuration = advertisementData?.durationInSeconds ?? 0; + print("VIDEO DURATION: $videoDuration"); } - // double height = MediaQuery.of(context).size.height * .25; return Scaffold( + backgroundColor: Colors.black, body: Stack( children: [ if (isVideo) @@ -104,11 +112,50 @@ class _ITGAdsScreenState extends State { builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) { _controller = snapshot.data as VideoPlayerController; - return Positioned.fill( - child: AspectRatio( - aspectRatio: _controller.value.aspectRatio, - child: VideoPlayer(_controller), - ), + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: AspectRatio( + aspectRatio: _controller.value.aspectRatio, + child: VideoPlayer(_controller), + ), + ), + 30.height, + CountdownTimer( + endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, + onEnd: null, + endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), + textStyle: const TextStyle(color: Colors.white, fontSize: 16, letterSpacing: -0.48, fontWeight: FontWeight.bold), + ), + 50.height, + Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor)) + .onPress(() { + try { + DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) { + logger.d(value); + Navigator.pop(context); + }); + } catch (ex) { + logger.wtf(ex); + Utils.handleException(ex, context, null); + } + }), + // DefaultButton(LocaleKeys.home.tr(), () async { + // DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) { + // logger.d(value); + // }); + // }).paddingOnly(left: 50, right: 50) + + // ElevatedButton( + // onPressed: () async { + // // DashboardApiClient().setAdvertisementViewed(widget.addMasterId, widget.advertisement!.advertisementId!).then((value) { + // // logger.d(value); + // // }); + // }, + // child: const Text("Go To Dashboard"), + // ) + ], ); } else { return const Center( @@ -118,15 +165,7 @@ class _ITGAdsScreenState extends State { }, ), if (isImage) Image.file(imageFile), - if (skip) - ElevatedButton( - onPressed: () async { - // DashboardApiClient().setAdvertisementViewed(widget.addMasterId, widget.advertisement!.advertisementId!).then((value) { - // logger.d(value); - // }); - }, - child: const Text("Go To Dashboard"), - ) + // if (skip) ], ), );