diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
index 8d4492f..9625e10 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 9.0
+ 11.0
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index eaa735c..0534f2b 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -22,16 +22,36 @@
????
CFBundleVersion
$(FLUTTER_BUILD_NUMBER)
+ LSApplicationQueriesSchemes
+
+ sms
+ tel
+ mailto
+
LSRequiresIPhoneOS
+ NSCameraUsageDescription
+ This app requires camera access to capture & upload pictures.
+ NSFaceIDUsageDescription
+ This app requires Face ID to allow biometric authentication for app login.
+ NSPhotoLibraryUsageDescription
+ This app requires photo library access to select image as document & upload it.
+ NSLocationAlwaysAndWhenInUseUsageDescription
+ This App requires access to your location to mark your attendance.
+ NSLocationAlwaysUsageDescription
+ This App requires access to your location to mark your attendance.
+ NSLocationWhenInUseUsageDescription
+ This App requires access to your location to mark your attendance.
+ NFCReaderUsageDescription
+ This App requires access to NFC to mark your attendance.
+ UIBackgroundModes
+
+ remote-notification
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
Main
- NSCameraUsageDescription
- This app requires camera access to capture & upload pictures.
- NSPhotoLibraryUsageDescription
- This app requires photo library access to select image as document & upload it.
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
@@ -45,13 +65,11 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
- LSApplicationQueriesSchemes
-
- sms
- tel
- mailto
-
UIViewControllerBasedStatusBarAppearance
+ com.apple.developer.nfc.readersession.felica.systemcodes
+
+ 0000
+
diff --git a/lib/classes/app_permissions.dart b/lib/classes/app_permissions.dart
index 983b400..1509b57 100644
--- a/lib/classes/app_permissions.dart
+++ b/lib/classes/app_permissions.dart
@@ -1,7 +1,12 @@
+import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
+import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:geolocator/geolocator.dart';
import 'package:permission_handler/permission_handler.dart';
-class AppPermissions{
- static void location(Function(bool) completion) {
+class AppPermissions {
+ static void location(Function(bool) completion, BuildContext context) {
Permission.location.isGranted.then((isGranted){
if(!isGranted){
Permission.location.request().then((granted){
@@ -10,21 +15,34 @@ class AppPermissions{
}
completion(isGranted);
});
-
}
- static void checkAll(Function(bool) completion){
- [
- Permission.location
- ].request().then((value){
+ static void showErrorLocationDialog(bool isPermissionError, BuildContext context) {
+ showDialog(
+ context: context,
+ builder: (cxt) => ConfirmDialog(
+ message: "Please provide location permission",
+ onTap: () {
+ if (isPermissionError) {
+ Geolocator.openAppSettings();
+ } else {
+ Geolocator.openLocationSettings();
+ }
+ Navigator.pop(context);
+ // createVacationRule(list);
+ },
+ ),
+ );
+ }
+ static void checkAll(Function(bool) completion) {
+ [Permission.location].request().then((value) {
bool allGranted = false;
value.values.forEach((element) {
allGranted = allGranted && element == PermissionStatus.granted;
});
completion(allGranted);
-
});
}
-}
\ No newline at end of file
+}
diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart
index 12f818e..17bd143 100644
--- a/lib/classes/consts.dart
+++ b/lib/classes/consts.dart
@@ -1,7 +1,7 @@
class ApiConsts {
//static String baseUrl = "http://10.200.204.20:2801/"; // Local server
- static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
- // static String baseUrl = "https://hmgwebservices.com"; // Live server
+ // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
+ static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrlServices = baseUrl + "/Services/"; // server
// static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server
static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/";
diff --git a/lib/ui/attendance/monthly_attendance_screen.dart b/lib/ui/attendance/monthly_attendance_screen.dart
index 53166d7..39f33a4 100644
--- a/lib/ui/attendance/monthly_attendance_screen.dart
+++ b/lib/ui/attendance/monthly_attendance_screen.dart
@@ -16,7 +16,7 @@ import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.
import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart';
-import 'package:month_picker_dialog/month_picker_dialog.dart';
+import 'package:month_picker_dialog_2/month_picker_dialog_2.dart';
import 'package:pie_chart/pie_chart.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart';
diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart
index 0410536..70b3ce0 100644
--- a/lib/ui/landing/dashboard_screen.dart
+++ b/lib/ui/landing/dashboard_screen.dart
@@ -59,7 +59,6 @@ class _DashboardScreenState extends State {
@override
Widget build(BuildContext context) {
- List namesD = ["Nostalgia Perfume Perfume", "Al Nafoura", "AlJadi", "Nostalgia Perfume"];
GlobalKey _key = GlobalKey(); //
return Scaffold(
key: _scaffoldState,
@@ -71,15 +70,17 @@ class _DashboardScreenState extends State {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
- Image.memory(
+ Image.memory(
Utils.getPostBytes(
AppState().memberInformationList!.eMPLOYEEIMAGE ?? "",
),
- errorBuilder: (BuildContext context, error, stackTrace) {
+ errorBuilder: (BuildContext context, error, stackTrace) {
return SvgPicture.asset(
- "assets/images/user.svg", height: 34, width: 34,
- );
- },
+ "assets/images/user.svg",
+ height: 34,
+ width: 34,
+ );
+ },
width: 34,
height: 34,
fit: BoxFit.cover,
diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart
index ebe3f7b..523c1cc 100644
--- a/lib/ui/landing/widget/app_drawer.dart
+++ b/lib/ui/landing/widget/app_drawer.dart
@@ -136,8 +136,8 @@ class _AppDrawerState extends State {
AppState().isAuthenticated = false;
AppState().isLogged = false;
AppState().setPostParamsInitConfig();
- SharedPreferences prefs = await SharedPreferences.getInstance();
- await prefs.clear();
- Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route route) => false, arguments: false);
+ // SharedPreferences prefs = await SharedPreferences.getInstance();
+ // await prefs.clear();
+ Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route route) => false, arguments: null);
}
}
diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart
index f50bb47..92a58db 100644
--- a/lib/ui/login/login_screen.dart
+++ b/lib/ui/login/login_screen.dart
@@ -50,7 +50,7 @@ class _LoginScreenState extends State {
@override
void initState() {
super.initState();
- // checkFirebaseToken();
+ // checkFirebaseToken();
}
@override
@@ -130,8 +130,8 @@ class _LoginScreenState extends State {
if (isAppOpenBySystem == null) {
isAppOpenBySystem = (ModalRoute.of(context)!.settings.arguments ?? true) as bool;
print('isAppOpenBySystem:$isAppOpenBySystem');
- username.text = "15153";
- password.text = "Abcd@12345";
+ // username.text = "15153";
+ // password.text = "Abcd@12345";
if (isAppOpenBySystem!) checkFirebaseToken();
}
diff --git a/lib/ui/login/verify_last_login_screen.dart b/lib/ui/login/verify_last_login_screen.dart
index faaf76e..7229b53 100644
--- a/lib/ui/login/verify_last_login_screen.dart
+++ b/lib/ui/login/verify_last_login_screen.dart
@@ -60,10 +60,10 @@ class _VerifyLastLoginScreenState extends State {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
- leading: IconButton(
- icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor),
- onPressed: () => Navigator.pop(context),
- ),
+ // leading: IconButton(
+ // icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor),
+ // onPressed: () => Navigator.pop(context),
+ // ),
actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width],
),
body: Column(
@@ -211,7 +211,7 @@ class _VerifyLastLoginScreenState extends State {
const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID');
bool authenticated = false;
try {
- authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, iOSAuthStrings: iosStrings);
+ authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, biometricOnly: true, iOSAuthStrings: iosStrings);
} on PlatformException catch (e) {
print(e);
Utils.hideLoading(context);
@@ -238,12 +238,13 @@ class _VerifyLastLoginScreenState extends State {
return;
} else {
if (mobileLoginInfoListModel!.loginType == 2 || mobileLoginInfoListModel!.loginType == 3) {
- bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics();
- if (!authenticateWithFaceAndTouchID) {
- return;
- } else {
- performApiCall(_title, _icon, _flag, isDirectLogin: true);
- }
+ // bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics();
+ // if (!authenticateWithFaceAndTouchID) {
+ // return;
+ // } else {
+ // performApiCall(_title, _icon, _flag, isDirectLogin: true);
+ // }
+ performApiCall(_title, _icon, _flag, isDirectLogin: true);
} else {
isNeedVerifyWithFaceIDAndBiometrics = true;
selectedFlag = _flag;
diff --git a/lib/ui/login/verify_login_screen.dart b/lib/ui/login/verify_login_screen.dart
index 1d66df9..a713c0f 100644
--- a/lib/ui/login/verify_login_screen.dart
+++ b/lib/ui/login/verify_login_screen.dart
@@ -517,7 +517,7 @@ class _VerifyLoginScreenState extends State {
const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID');
bool authenticated = false;
try {
- authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, iOSAuthStrings: iosStrings);
+ authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, biometricOnly: true, iOSAuthStrings: iosStrings);
} on PlatformException catch (e) {
print(e);
Utils.hideLoading(context);
diff --git a/lib/ui/my_team/view_attendance.dart b/lib/ui/my_team/view_attendance.dart
index 03f711f..5d55ee8 100644
--- a/lib/ui/my_team/view_attendance.dart
+++ b/lib/ui/my_team/view_attendance.dart
@@ -15,7 +15,7 @@ import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart';
import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart';
-import 'package:month_picker_dialog/month_picker_dialog.dart';
+import 'package:month_picker_dialog_2/month_picker_dialog_2.dart';
import 'package:pie_chart/pie_chart.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart';
diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart
index 2904e07..b0cfef1 100644
--- a/lib/ui/work_list/sheets/delegate_sheet.dart
+++ b/lib/ui/work_list/sheets/delegate_sheet.dart
@@ -200,7 +200,7 @@ class _DelegateSheetState extends State {
),
),
if (isNeedEnableTextField)
- FlatButton(
+ TextButton(
onPressed: () {
fetchUserByInput();
},
diff --git a/lib/widgets/location/Location.dart b/lib/widgets/location/Location.dart
index 47e2238..0ddca1c 100644
--- a/lib/widgets/location/Location.dart
+++ b/lib/widgets/location/Location.dart
@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:math';
import 'dart:ui';
+import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:geolocator/geolocator.dart';
@@ -45,7 +46,7 @@ class Location {
});
}
- static void getCurrentLocation(Function(LatLng?) callback) {
+ static void getCurrentLocation(Function(LatLng?) callback, BuildContext context) {
void done(Position position) {
//AppStorage.sp.saveLocation(position);
@@ -64,8 +65,10 @@ class Location {
done(value);
}
});
+ } else {
+ // AppPermissions
}
- });
+ }, context);
}
// static LatLng locationAwayFrom(
@@ -137,11 +140,11 @@ class _Map {
});
}
- void goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) {
- Location.getCurrentLocation((location) {
- moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!);
- });
- }
+ // void goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) {
+ // Location.getCurrentLocation((location) {
+ // moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!);
+ // });
+ // }
var routes = Map();
diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart
index a3ed0d5..08e7c5e 100644
--- a/lib/widgets/mark_attendance_widget.dart
+++ b/lib/widgets/mark_attendance_widget.dart
@@ -90,7 +90,7 @@ class _MarkAttendanceWidgetState extends State {
if (isNfcLocationEnabled) {
Location.getCurrentLocation((LatLng? latlng) {
performNfcAttendance(widget.model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
- });
+ }, context);
} else {
performNfcAttendance(widget.model);
}
@@ -100,7 +100,7 @@ class _MarkAttendanceWidgetState extends State {
if (isWifiLocationEnabled) {
Location.getCurrentLocation((LatLng? latlng) {
performWifiAttendance(widget.model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
- });
+ }, context);
} else {
performWifiAttendance(widget.model);
}
@@ -111,7 +111,7 @@ class _MarkAttendanceWidgetState extends State {
if (isQrLocationEnabled) {
Location.getCurrentLocation((LatLng? latlng) {
performQrCodeAttendance(widget.model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
- });
+ }, context);
} else {
performQrCodeAttendance(widget.model);
}
@@ -158,16 +158,19 @@ class _MarkAttendanceWidgetState extends State {
bool isConnected =
await WiFiForIoTPlugin.connect(AppState().getMohemmWifiSSID ?? "", password: AppState().getMohemmWifiPassword ?? "", joinOnce: true, security: NetworkSecurity.WPA, withInternet: false);
if (isConnected) {
+ Utils.showLoading(context);
await WiFiForIoTPlugin.forceWifiUsage(true);
- Utils.showLoading(context);
+ await Future.delayed(Duration(seconds: 1));
+
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();
+ // await closeWifiRequest();
} catch (ex) {
- await closeWifiRequest();
+ print("performWifiAttendance: "+ex.toString());
+ // await closeWifiRequest();
Utils.hideLoading(context);
Utils.handleException(ex, context, (msg) {
Utils.confirmDialog(context, msg);
@@ -179,7 +182,8 @@ class _MarkAttendanceWidgetState extends State {
}
Future closeWifiRequest() async {
- await WiFiForIoTPlugin.forceWifiUsage(false);
+ // await WiFiForIoTPlugin.forceWifiUsage(false);
+ // Future.delayed(Duration(seconds: 2));
return await WiFiForIoTPlugin.disconnect();
}
diff --git a/lib/widgets/nfc/nfc_reader_sheet.dart b/lib/widgets/nfc/nfc_reader_sheet.dart
index 53c0d4f..4ac055b 100644
--- a/lib/widgets/nfc/nfc_reader_sheet.dart
+++ b/lib/widgets/nfc/nfc_reader_sheet.dart
@@ -1,4 +1,5 @@
import 'dart:async';
+import 'dart:io';
import 'package:flutter/material.dart';
import 'package:nfc_manager/nfc_manager.dart';
@@ -41,9 +42,13 @@ class _NfcLayoutState extends State {
NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async {
print(tag.data);
- var f = MifareUltralight(tag: tag, identifier: tag.data["nfca"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22);
+ var f;
+ if (Platform.isAndroid) {
+ f = MifareUltralight(tag: tag, identifier: tag.data["nfca"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22);
+ } else {
+ f = MifareUltralight(tag: tag, identifier: tag.data["mifare"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22);
+ }
String identifier = f.identifier.map((e) => e.toRadixString(16).padLeft(2, '0')).join('');
- // print(identifier); // => 0428fcf2255e81
nfcId = identifier;
setState(() {
@@ -54,8 +59,16 @@ class _NfcLayoutState extends State {
Future.delayed(const Duration(seconds: 1), () {
NfcManager.instance.stopSession();
Navigator.pop(context);
+ // if (Platform.isAndroid) {
+ // Navigator.pop(context);
+ // } else {
+ // Navigator.pop(context);
+ // Navigator.pop(context);
+ // }
widget.onNcfScan(nfcId);
});
+ }).catchError((err) {
+ print(err);
});
}
@@ -107,12 +120,12 @@ class _NfcLayoutState extends State {
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
- child: RaisedButton(
+ child: TextButton(
onPressed: () {
NfcManager.instance.stopSession();
Navigator.pop(context);
},
- elevation: 0,
+ // elevation: 0,
child: Text("CANCEL"),
),
),
@@ -166,14 +179,14 @@ class _NfcLayoutState extends State {
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
- child: RaisedButton(
+ child: TextButton(
// onPressed: () {
// _stream?.cancel();
// widget.onNcfScan(nfcId);
// Navigator.pop(context);
// },
onPressed: null,
- elevation: 0,
+ // elevation: 0,
child: Text("DONE"),
),
),
diff --git a/pubspec.yaml b/pubspec.yaml
index e4f6dfc..14c034a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,4 +1,5 @@
name: mohem_flutter_app
+
description: A new Flutter application.
# The following line prevents the package from being accidentally published to
@@ -60,11 +61,11 @@ dependencies:
google_maps_flutter: ^2.0.2
google_maps_utils: ^1.4.0+1
google_directions_api: ^0.9.0
- geolocator: any
+ geolocator: ^9.0.2
# flutter_compass: ^0.6.1
google_maps_flutter_web: ^0.3.2
month_year_picker: ^0.2.0+1
- month_picker_dialog: ^0.4.0
+ month_picker_dialog_2: 0.5.5
open_file: ^3.2.1
wifi_iot: ^0.3.16
flutter_html: ^2.2.1