diff --git a/android/app/build.gradle b/android/app/build.gradle index 5ad2b550..61ac68e0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -33,7 +33,8 @@ apply plugin: "com.huawei.agconnect" android { compileSdkVersion 34 - ndkVersion flutter.ndkVersion +// ndkVersion flutter.ndkVersion + ndkVersion = "25.1.8937393" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 222ad014..6db0fdc1 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -37,6 +37,8 @@ class UserProvider extends ChangeNotifier { bool get isLoading => _loading; + bool isUserConfirmSwipe = false; + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index 152af656..f811e452 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -91,7 +91,9 @@ class _AppTextFormFieldState extends State { widget.controller?.text = widget.initialValue!; } _focusNode = widget.node ?? FocusNode(); - _initSpeech(); + if(widget.showSpeechToText) { + _initSpeech(); + } super.initState(); } diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index 24595584..3a3a74dd 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -6,6 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/app_settings.dart'; import 'package:test_sa/dashboard_latest/dashboard_view.dart'; +import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; @@ -15,6 +16,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/pages/land_page/create_request-type_bottomsheet.dart'; import 'package:test_sa/new_views/pages/land_page/my_request/my_requests_page.dart'; +import 'package:test_sa/new_views/pages/land_page/non_hmg_employee_swipe_view.dart'; import 'package:test_sa/new_views/pages/settings_page.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; @@ -100,16 +102,18 @@ class _LandPageState extends State { Widget build(BuildContext context) { if (_userProvider == null) { _userProvider = Provider.of(context, listen: false); - _pages = [ - DashboardView(onDrawerPress: (() { - _scaffoldKey.currentState!.isDrawerOpen ? _scaffoldKey.currentState!.closeDrawer() : _scaffoldKey.currentState!.openDrawer(); - })), - // const old_page.LandPage(), - const MyRequestsPage(), - if (_userProvider!.user!.type != UsersTypes.engineer) const SizedBox(), - // if (_userProvider!.user!.type != UsersTypes.engineer) const CalendarPage(), - const MyAssetsPage(fromBottomBar: true), - ]; + if (_userProvider!.isUserConfirmSwipe) { + _pages = [ + DashboardView(onDrawerPress: (() { + _scaffoldKey.currentState!.isDrawerOpen ? _scaffoldKey.currentState!.closeDrawer() : _scaffoldKey.currentState!.openDrawer(); + })), + // const old_page.LandPage(), + const MyRequestsPage(), + if (_userProvider!.user!.type != UsersTypes.engineer) const SizedBox(), + // if (_userProvider!.user!.type != UsersTypes.engineer) const CalendarPage(), + const MyAssetsPage(fromBottomBar: true), + ]; + } checkLocalAuth(); } @@ -129,42 +133,53 @@ class _LandPageState extends State { }, child: Scaffold( key: _scaffoldKey, + appBar: _pages.isEmpty + ? PreferredSize( + preferredSize: const Size.fromHeight(kToolbarHeight), + child: AppBarWidget( + onDrawerPress: () { + _scaffoldKey.currentState!.isDrawerOpen ? _scaffoldKey.currentState!.closeDrawer() : _scaffoldKey.currentState!.openDrawer(); + }, + )) + : null, drawer: const AppDrawer(), - body: _pages[currentPageIndex], - bottomNavigationBar: AppBottomNavigationBar( - selectedIndex: currentPageIndex, - onPressed: (index) { - bool isEngineer = _userProvider!.user!.type == UsersTypes.engineer; - if (!isEngineer && index == 2) { - showModalBottomSheet( - context: context, - useSafeArea: true, - backgroundColor: Colors.white, - builder: (context) => const CreateRequestTypeBottomSheet(), - ); - } else if (index == (!isEngineer ? 4 : 3)) { - showModalBottomSheet( - context: context, - useSafeArea: true, - backgroundColor: Colors.transparent, - builder: (context) => const ContactUsBottomSheet(), - ); - } else { - setState(() { - currentPageIndex = index; - }); - if (index == 1) { - setState(() { - showAppbar = false; - }); - } else { - setState(() { - showAppbar = true; - }); - } - } - }, - ), + body: _pages.isEmpty ? NonHmgEmployeeSwipeView() : _pages[currentPageIndex], + bottomNavigationBar: _pages.isEmpty + ? null + : AppBottomNavigationBar( + selectedIndex: currentPageIndex, + onPressed: (index) { + bool isEngineer = _userProvider!.user!.type == UsersTypes.engineer; + if (!isEngineer && index == 2) { + showModalBottomSheet( + context: context, + useSafeArea: true, + backgroundColor: Colors.white, + builder: (context) => const CreateRequestTypeBottomSheet(), + ); + } else if (index == (!isEngineer ? 4 : 3)) { + showModalBottomSheet( + context: context, + useSafeArea: true, + backgroundColor: Colors.transparent, + builder: (context) => const ContactUsBottomSheet(), + ); + } else { + setState(() { + currentPageIndex = index; + }); + if (index == 1) { + setState(() { + showAppbar = false; + }); + } else { + setState(() { + showAppbar = true; + }); + } + } + }, + ), ), ); } diff --git a/lib/new_views/pages/land_page/non_hmg_employee_swipe_view.dart b/lib/new_views/pages/land_page/non_hmg_employee_swipe_view.dart new file mode 100644 index 00000000..0c0c4c14 --- /dev/null +++ b/lib/new_views/pages/land_page/non_hmg_employee_swipe_view.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:nfc_manager/nfc_manager.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; + +class NonHmgEmployeeSwipeView extends StatefulWidget { + NonHmgEmployeeSwipeView({Key? key}) : super(key: key); + + @override + _NonHmgEmployeeSwipeViewState createState() { + return _NonHmgEmployeeSwipeViewState(); + } +} + +class _NonHmgEmployeeSwipeViewState extends State { + bool isNfcEnabled = false; + + @override + void initState() { + super.initState(); + checkForNfcAndLocationPermission(); + } + + void checkForNfcAndLocationPermission() async { + isNfcEnabled = await NfcManager.instance.isAvailable(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.only(top: 21), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: Colors.white, border: Border.all(color: AppColor.white936.withOpacity(.05), width: 1)), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Mark Attendance", + style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + GridView( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: const EdgeInsets.only(bottom: 0, top: 16), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 16, mainAxisSpacing: 16), + children: [ + gridItem("Nfc", Icons.nfc, isNfcEnabled).onPress(isNfcEnabled ? () {} : null), + gridItem("Qr Scan", Icons.qr_code, true).onPress(() {}), + ], + ) + ], + ), + ); + } + + Widget gridItem(String label, IconData iconData, bool enable) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(25), color: AppColor.white30, border: Border.all(color: AppColor.white936.withOpacity(.03), width: 1)), + alignment: Alignment.center, + child: Column( + //mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Icon(iconData, color: enable ? AppColor.black35 : Colors.grey), + Text( + label, + style: AppTextStyles.heading6.copyWith(color: enable ? AppColor.black35 : Colors.grey), + ), + ], + ), + ); + } +} diff --git a/lib/new_views/pages/land_page/non_hmg_employee_view.dart b/lib/new_views/pages/land_page/non_hmg_employee_view.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/utilities/location.dart b/lib/utilities/location.dart new file mode 100644 index 00000000..6cb3a875 --- /dev/null +++ b/lib/utilities/location.dart @@ -0,0 +1,67 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class Location { + static void havePermission(Function(bool) callback) { + Geolocator.checkPermission().then((value) async { + if (value == LocationPermission.denied || value == LocationPermission.deniedForever) { + value = await Geolocator.requestPermission(); + callback(![LocationPermission.denied, LocationPermission.deniedForever].contains(value)); + } else { + callback(true); + } + }); + } + + static void isEnabled(Function(bool) callback) { + Geolocator.isLocationServiceEnabled().then((value) => callback(value)); + } + + static bool _listeningSettingChange = true; + + static void listenGPS({bool change = true, Function(bool)? onChange}) async { + _listeningSettingChange = change; + if (change == false) return; + + Future.doWhile(() async { + await Future.delayed(const Duration(milliseconds: 1000)); + var enable = await Geolocator.isLocationServiceEnabled(); + onChange!(enable); + return _listeningSettingChange; + }); + } + + static void locationFun(Function(bool) completion, BuildContext context) { + Permission.location.isGranted.then((isGranted) { + if (!isGranted) { + Permission.location.request().then((granted) { + completion(granted == PermissionStatus.granted); + }); + } + completion(isGranted); + }); + } + + static void getCurrentLocation(Function(Position position, bool isMocked) callback, Function errorCallBack, BuildContext context) { + void done(Position position) { + //AppStorage.sp.saveLocation(position); + bool isMocked = position.isMocked; + callback(position, isMocked); + } + + locationFun((granted) { + if (granted) { + Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.medium, timeLimit: const Duration(seconds: 5)).then((value) { + done(value); + }).catchError((err) { + errorCallBack(); + }); + } else { + // AppPermissions + } + }, context); + } +} diff --git a/pubspec.lock b/pubspec.lock index d697b8e8..fbb9dc5e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -949,6 +949,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + nfc_manager: + dependency: "direct main" + description: + name: nfc_manager + sha256: f5be75e90f8f2bff3ee49fbd7ef65bdd4a86ee679c2412e71ab2846a8cff8c59 + url: "https://pub.dev" + source: hosted + version: "3.5.0" octo_image: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 8d591cec..d143c266 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -89,6 +89,7 @@ dependencies: huawei_push: ^6.5.0+300 huawei_location: ^6.11.0+301 geolocator: ^9.0.2 + nfc_manager: ^3.2.0 local_auth_darwin: any dev_dependencies: