import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geolocator/geolocator.dart'; import 'package:huawei_location/huawei_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:platform_device_id/platform_device_id.dart'; import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/nfc/nfc_reader_sheet.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'; // import 'package:mohem_flutter_app/classes/utils.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/models/generic_response_model.dart'; // import 'package:mohem_flutter_app/models/privilege_list_model.dart'; // import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; // import 'package:mohem_flutter_app/ui/dialogs/success_dialog.dart'; // import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; // import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';im import 'package:test_sa/utilities/Location.dart' as location; import 'package:test_sa/views/widgets/dialogs/confirm_dialog.dart'; import 'package:test_sa/views/widgets/dialogs/success_dialog.dart'; import 'package:test_sa/views/widgets/qr_scanner_dialog.dart'; import 'package:wifi_iot/wifi_iot.dart'; import '../../app_style/app_color.dart'; class MarkAttendanceWidget extends StatefulWidget { // DashboardProviderModel model; double topPadding; bool isFromDashboard; MarkAttendanceWidget( {Key? key, this.topPadding = 0, this.isFromDashboard = false}) : super(key: key); // todo MarkAttendanceWidget(this.model, {Key? key, this.topPadding = 0, this.isFromDashboard = false}) : super(key: key); @override _MarkAttendanceWidgetState createState() { return _MarkAttendanceWidgetState(); } } 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(); checkAttendanceAvailability(); } void checkAttendanceAvailability() async { bool isAvailable = await NfcManager.instance.isAvailable(); // setState(() { // AppState().privilegeListModel!.forEach((PrivilegeListModel element) { // if (element.serviceName == "enableNFC") { // if (isAvailable) if (element.previlege ?? false) isNfcEnabled = true; // } else if (element.serviceName == "enableQR") { // if (element.previlege ?? false) isQrEnabled = true; // } else if (element.serviceName == "enableWIFI") { // if (element.previlege ?? false) isWifiEnabled = true; // } else if (element.serviceName!.trim() == "enableLocationNFC") { // if (element.previlege ?? false) isNfcLocationEnabled = true; // } else if (element.serviceName == "enableLocationQR") { // if (element.previlege ?? false) isQrLocationEnabled = true; // } else if (element.serviceName == "enableLocationWIFI") { // if (element.previlege ?? false) isWifiLocationEnabled = true; // } // }); // }); } void checkHuaweiLocationPermission(String attendanceType) async { // Permission_Handler permissionHandler = PermissionHandler(); location.Location.isEnabled((bool isEnabled) async { if (isEnabled) { location.Location.havePermission((bool permission) async { if (permission) { 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); }, ), ); } } }); } else { showDialog( context: context, builder: (BuildContext cxt) => ConfirmDialog( message: "You need to enable location services to mark attendance", onTap: () async { Navigator.pop(context); await Geolocator.openLocationSettings(); }, ), ); } }); // 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(); // Stop Session NfcManager.instance.stopSession(); } @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.only(left: 21, right: 21, bottom: 21, top: widget.topPadding), decoration: const BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: Colors.white), width: double.infinity, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ // LocaleKeys.markAttendance.tr().toSectionHeading(), // LocaleKeys.selectMethodOfAttendance.tr().toText11(color: const Color(0xff535353)), GridView( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, padding: const EdgeInsets.only(bottom: 0, top: 21), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8), children: [ attendanceMethod("NFC", Icons.nfc, isNfcEnabled, () { // if (AppState().getIsHuawei) { if (false) { checkHuaweiLocationPermission("NFC"); } else { location.Location.isEnabled((bool isEnabled) { if (isEnabled) { location.Location.havePermission((bool permission) { if (permission) { Utils.showLoading(context); location.Location.getCurrentLocation( (Position position, bool isMocked) { if (isMocked) { Utils.hideLoading(context); markFakeAttendance("NFC", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); } else { Utils.hideLoading(context); //todo performNfcAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); } }, () { Utils.hideLoading(context); Utils.confirmDialog(context, "Unable to determine your location, Please make sure that your location services are turned on & working."); }, context, ); } else { showDialog( context: context, builder: (BuildContext cxt) => ConfirmDialog( message: "You need to give location permission to mark attendance", onTap: () async { Navigator.pop(context); await Geolocator.openAppSettings(); }, ), ); } }); } else { showDialog( context: context, builder: (BuildContext cxt) => ConfirmDialog( message: "You need to enable location services to mark attendance", onTap: () async { Navigator.pop(context); await Geolocator.openLocationSettings(); }, ), ); } }); } }), //if (isWifiEnabled) //todo attendanceMethod("Wifi", Icons.wifi, isWifiEnabled, () { // if (AppState().getIsHuawei) { if (false) { checkHuaweiLocationPermission("WIFI"); } else { location.Location.isEnabled((bool isEnabled) { if (isEnabled) { location.Location.havePermission((bool permission) { if (permission) { Utils.showLoading(context); location.Location.getCurrentLocation( (Position position, bool isMocked) { if (isMocked) { Utils.hideLoading(context); markFakeAttendance("WIFI", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); } else { Utils.hideLoading(context); //todo performWifiAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); } }, () { Utils.hideLoading(context); Utils.confirmDialog(context, "Unable to determine your location, Please make sure that your location services are turned on & working."); }, context, ); } else { showDialog( context: context, builder: (BuildContext cxt) => ConfirmDialog( message: "You need to give location permission to mark attendance", onTap: () async { Navigator.pop(context); await Geolocator.openAppSettings(); }, ), ); } }); } else { showDialog( context: context, builder: (BuildContext cxt) => ConfirmDialog( message: "You need to enable location services to mark attendance", onTap: () async { Navigator.pop(context); await Geolocator.openLocationSettings(); }, ), ); } }); } }), // if (isQrEnabled) //todo attendanceMethod("QR", Icons.qr_code_2, isQrEnabled, () async { // if (AppState().getIsHuawei) { if (false) { checkHuaweiLocationPermission("QR"); } else { location.Location.isEnabled((bool isEnabled) { if (isEnabled) { location.Location.havePermission((bool permission) { if (permission) { Utils.showLoading(context); location.Location.getCurrentLocation( (Position position, bool isMocked) { if (isMocked) { Utils.hideLoading(context); markFakeAttendance("QR", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); } else { Utils.hideLoading(context); //todo performQrCodeAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); } }, () { Utils.hideLoading(context); Utils.confirmDialog(context, "Unable to determine your location, Please make sure that your location services are turned on & working."); }, context, ); } else { showDialog( context: context, builder: (BuildContext cxt) => ConfirmDialog( message: "You need to give location permission to mark attendance", onTap: () async { Navigator.pop(context); await Geolocator.openAppSettings(); }, ), ); } }); } else { showDialog( context: context, builder: (BuildContext cxt) => ConfirmDialog( message: "You need to enable location services to mark attendance", onTap: () async { Navigator.pop(context); await Geolocator.openLocationSettings(); }, ), ); } }); } }), ], ) ], ), ); } void getHuaweiCurrentLocation(String attendanceType) async { try { Utils.showLoading(context); FusedLocationProviderClient locationService = FusedLocationProviderClient()..initFusedLocationService(); LocationRequest locationRequest = LocationRequest(); locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; locationRequest.interval = 500; List locationRequestList = [locationRequest]; LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList); late StreamSubscription _streamSubscription; int requestCode = (await (locationService.requestLocationUpdates(locationRequest)))!; _streamSubscription = locationService.onLocationData!.listen( (Location location) async { Utils.hideLoading(context); await locationService.removeLocationUpdates(requestCode); if (attendanceType == "QR") { // todo performQrCodeAttendance(widget.model, lat: location.latitude.toString() ?? "", lng: location.longitude.toString() ?? ""); } if (attendanceType == "WIFI") { // todo performWifiAttendance(widget.model, lat: location.latitude.toString() ?? "", lng: location.longitude.toString() ?? ""); } if (attendanceType == "NFC") { //todo performNfcAttendance(widget.model, lat: location.latitude.toString() ?? "", lng: location.longitude.toString() ?? ""); } requestCode = 0; }, ); // 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. // } // }); } catch (error) { print("HUAWEI LOCATION ERROR!!!!!"); print(error); Utils.hideLoading(context); // Utils.handleException(error, context, null); } } // // Future performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { // if (Platform.isIOS) { // Utils.readNFc(onRead: (String nfcId) async { // Utils.showLoading(context); // try { // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId, isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); // if (g?.messageStatus != 1) { // Utils.hideLoading(context); // showDialog( // context: context, // builder: (BuildContext cxt) => ConfirmDialog( // message: g?.errorEndUserMessage ?? "Unexpected error occurred", // onTap: () { // Navigator.pop(context); // }, // ), // ); // } else { // bool status = await model.fetchAttendanceTracking(context); // if (Platform.isIOS) await Future.delayed(const Duration(seconds: 3)); // Utils.hideLoading(context); // showMDialog( // context, // backgroundColor: Colors.transparent, // isDismissable: true, // child: SuccessDialog(widget.isFromDashboard), // ); // } // } catch (ex) { // Utils.hideLoading(context); // Utils.handleException(ex, context, null); // } // }); // } else { // showNfcReader(context, onNcfScan: (String? nfcId) async { // Utils.showLoading(context); // try { // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); // if (g?.messageStatus != 1) { // Utils.hideLoading(context); // showDialog( // context: context, // builder: (BuildContext cxt) => ConfirmDialog( // message: g?.errorEndUserMessage ?? "Unexpected error occurred", // onTap: () { // Navigator.pop(context); // }, // ), // ); // } else { // bool status = await model.fetchAttendanceTracking(context); // Utils.hideLoading(context); // showMDialog( // context, // backgroundColor: Colors.transparent, // isDismissable: false, // child: SuccessDialog(widget.isFromDashboard), // ); // } // } catch (ex) { // print(ex); // Utils.hideLoading(context); // // Utils.handleException(ex, context, (String msg) { // // Utils.confirmDialog(context, msg); // // }); // } // }); // } // } void showMDialog(context, {Widget? child, Color? backgroundColor, bool isDismissable = true, bool isBusniessCard = false}) async { return showDialog( context: context, barrierDismissible: isDismissable, builder: (context) { return Dialog( shape: isBusniessCard ? const RoundedRectangleBorder( borderRadius: BorderRadius.all( Radius.circular(15.0), ), ) : null, backgroundColor: backgroundColor, child: child, ); }, ); } // // Future checkSession() async { // try { // Utils.showLoading(context); // await DashboardApiClient().getOpenMissingSwipes(); // Utils.hideLoading(context); // return true; // } catch (ex) { // Utils.hideLoading(context); // Utils.handleException(ex, context, null); // return false; // } // } // Future performWifiAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { // if (Platform.isAndroid) { // if (!(await checkSession())) { // return; // } // } // Utils.showLoading(context); // bool isConnected = await WiFiForIoTPlugin.connect(AppState().getMohemmWifiSSID ?? "", // password: AppState().getMohemmWifiPassword ?? "", joinOnce: Platform.isIOS ? false : true, security: NetworkSecurity.WPA, withInternet: false); // // if (Platform.isIOS) { // if (await WiFiForIoTPlugin.getSSID() == AppState().getMohemmWifiSSID) { // isConnected = true; // } else { // isConnected = false; // } // } // // if (isConnected && AppState().isAuthenticated) { // await WiFiForIoTPlugin.forceWifiUsage(true); // await Future.delayed(const Duration(seconds: 6)); // try { // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 3, nfcValue: "", isGpsRequired: isWifiLocationEnabled, lat: lat, long: lng); // bool status = await model.fetchAttendanceTracking(context); // Utils.hideLoading(context); // await closeWifiRequest(); // 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); // Utils.handleException(ex, context, null); // } // } else { // if (AppState().isAuthenticated) { // Utils.hideLoading(context); // Utils.confirmDialog(context, "LocaleKeys.comeNearHMGWifi.tr()"); // } else { // await closeWifiRequest(); // } // } // } Future closeWifiRequest() async { if (Platform.isAndroid) { await WiFiForIoTPlugin.forceWifiUsage(false); } return await WiFiForIoTPlugin.disconnect(); } // Future performQrCodeAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { // var qrCodeValue = await Navigator.of(context).push( // MaterialPageRoute( // builder: (BuildContext context) => QrScannerDialog(), // ), // ); // if (qrCodeValue != null) { // Utils.showLoading(context); // try { // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue); // bool status = await model.fetchAttendanceTracking(context); // Utils.hideLoading(context); // 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); // Utils.handleException(ex, context, null); // } // } // } void markFakeAttendance(String sourceName, String lat, String long) async { Utils.showLoading(context); try { // await DashboardApiClient().markFakeLocation(sourceName: sourceName, lat: lat, long: long); Utils.hideLoading(context); Utils.confirmDialog(context, "LocaleKeys.fakeLocation.tr()"); } catch (ex) { print(ex); Utils.hideLoading(context); //Utils.handleException(ex, context, null); } } Widget attendanceMethod(String title, IconData iconData, bool isEnabled, VoidCallback onPress) => Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isEnabled ? null : Colors.grey.withOpacity(.5), gradient: isEnabled ? const LinearGradient( transform: GradientRotation(.64), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ //MyColors.gradiantEndColor, // MyColors.gradiantStartColor, ], ) : null, ), clipBehavior: Clip.antiAlias, padding: const EdgeInsets.only(left: 10, right: 10, top: 14, bottom: 14), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // SvgPicture.asset(image, color: Colors.white, alignment: Alignment.topLeft).expanded, Icon(iconData, color: isEnabled ? AppColor.black35 : Colors.grey), title.heading6(context), // title.toText17(isBold: true, color: Colors.white), ], ), ).onPress( () { if (!isEnabled) return; onPress(); }, ); }