Merge branch 'master' into development_aamir

# Conflicts:
#	lib/ui/login/login_screen.dart
merge-requests/188/head
Aamir Muhammad 3 years ago
commit 5a338199b9

@ -52,7 +52,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "hmg.cloudSolutions.mohem" applicationId "hmg.cloudSolutions.mohem"
minSdkVersion 21 minSdkVersion 28
targetSdkVersion 33 targetSdkVersion 33
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName

@ -21,6 +21,7 @@
android:allowBackup="false" android:allowBackup="false"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="Mohemm" android:label="Mohemm"
android:extractNativeLibs="true"
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"> android:roundIcon="@mipmap/ic_launcher_round">
<activity <activity

@ -31,7 +31,8 @@ class ChatApiClient {
"employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(), "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(),
"password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG", "password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG",
"isMobile": true, "isMobile": true,
"deviceToken": AppState().getDeviceToken, "deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken,
"isHuaweiDevice": AppState().getIsHuawei,
}, },
); );

@ -199,17 +199,17 @@ class DashboardApiClient {
}, url, postParams); }, url, postParams);
} }
// Future setAdvertisementViewed(String masterID, int advertisementId) async { Future setAdvertisementViewed(String masterID, int advertisementId) async {
// String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed"; String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed";
//
// Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
// "ItgNotificationMasterId": masterID, "ItgNotificationMasterId": masterID,
// "ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id "ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id
// }; };
// postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
// return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
// // ItgMainRes responseData = ItgMainRes.fromJson(json); // ItgMainRes responseData = ItgMainRes.fromJson(json);
// return json; return json;
// }, url, postParams); }, url, postParams);
// } }
} }

@ -34,6 +34,20 @@ class MarathonApiClient {
); );
} }
Future<int> 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<String> getProjectId() async { Future<String> getProjectId() async {
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -89,6 +103,7 @@ class MarathonApiClient {
); );
} }
Future<QuestionModel> getNextQuestion({required String? questionId, required String marathonId}) async { Future<QuestionModel> getNextQuestion({required String? questionId, required String marathonId}) async {
Map<String, String?> jsonObject = <String, String?>{ Map<String, String?> jsonObject = <String, String?>{
"previousQuestionId": questionId, "previousQuestionId": questionId,

@ -88,7 +88,7 @@ class AppState {
String get getHuaweiPushToken => _huaweiPushToken; 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() { void setPostParamsInitConfig() {
isAuthenticated = false; isAuthenticated = false;

@ -37,6 +37,7 @@ class ApiConsts {
static String marathonSubmitAnswerUrl = marathonBaseUrl + "question/submit"; static String marathonSubmitAnswerUrl = marathonBaseUrl + "question/submit";
static String marathonQualifiersUrl = marathonBaseUrl + "winner/getWinner/"; static String marathonQualifiersUrl = marathonBaseUrl + "winner/getWinner/";
static String marathonSelectedWinner = marathonBaseUrl + "winner/getSelectedWinner/"; static String marathonSelectedWinner = marathonBaseUrl + "winner/getSelectedWinner/";
static String marathonGetMarathonersCount = marathonBaseUrl + "Participant/GetRemainingParticipants";
//DummyCards for the UI //DummyCards for the UI
static CardContent dummyQuestion = const CardContent(); static CardContent dummyQuestion = const CardContent();

@ -226,6 +226,7 @@ class Utils {
return BoxDecoration( return BoxDecoration(
color: background, color: background,
border: Border.all( border: Border.all(
width: 1, // width: 1, //
color: background // <--- border width here color: background // <--- border width here
), ),

@ -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/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_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/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/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/provider/chat_call_provider.dart'; import 'package:mohem_flutter_app/provider/chat_call_provider.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
@ -146,10 +145,47 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchMenuEntries(); data.fetchMenuEntries();
data.getCategoryOffersListAPI(context); data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi(); marathonProvider.getMarathonDetailsFromApi();
if(isFromInit) {
checkERMChannel();
}
if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon(); if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon();
_refreshController.refreshCompleted(); _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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(

@ -2,10 +2,15 @@ import 'dart:convert';
import 'dart:io' as Io; import 'dart:io' as Io;
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; 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/api/dashboard_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.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/main.dart';
import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads; import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads;
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
@ -29,6 +34,7 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
ads.Advertisement? advertisementData; ads.Advertisement? advertisementData;
dynamic data; dynamic data;
String? masterID; String? masterID;
int videoDuration = 0;
void checkFileType() async { void checkFileType() async {
String? rFile = advertisementData!.viewAttachFileColl!.first.base64String; String? rFile = advertisementData!.viewAttachFileColl!.first.base64String;
@ -42,7 +48,7 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
_futureController = createVideoPlayer(rFile!); _futureController = createVideoPlayer(rFile!);
} }
setState(() {}); setState(() {});
initTimer(); // initTimer();
} }
Future processImage(String encodedBytes) async { Future processImage(String encodedBytes) async {
@ -76,7 +82,7 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
void initTimer() { void initTimer() {
Future.delayed(const Duration(seconds: 5), () { Future.delayed(const Duration(seconds: 5), () {
skip = true; skip = true;
setState(() {}); // setState(() {});
}); });
} }
@ -93,9 +99,11 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
if (masterID == null) masterID = data["masterId"]; if (masterID == null) masterID = data["masterId"];
if (advertisementData != null) { if (advertisementData != null) {
checkFileType(); checkFileType();
videoDuration = advertisementData?.durationInSeconds ?? 0;
print("VIDEO DURATION: $videoDuration");
} }
// double height = MediaQuery.of(context).size.height * .25;
return Scaffold( return Scaffold(
backgroundColor: Colors.black,
body: Stack( body: Stack(
children: [ children: [
if (isVideo) if (isVideo)
@ -104,11 +112,50 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
builder: (BuildContext context, AsyncSnapshot<Object?> snapshot) { builder: (BuildContext context, AsyncSnapshot<Object?> snapshot) {
if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) { if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) {
_controller = snapshot.data as VideoPlayerController; _controller = snapshot.data as VideoPlayerController;
return Positioned.fill( return Column(
child: AspectRatio( mainAxisAlignment: MainAxisAlignment.center,
aspectRatio: _controller.value.aspectRatio, children: [
child: VideoPlayer(_controller), 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 { } else {
return const Center( return const Center(
@ -118,15 +165,7 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
}, },
), ),
if (isImage) Image.file(imageFile), if (isImage) Image.file(imageFile),
if (skip) // if (skip)
ElevatedButton(
onPressed: () async {
// DashboardApiClient().setAdvertisementViewed(widget.addMasterId, widget.advertisement!.advertisementId!).then((value) {
// logger.d(value);
// });
},
child: const Text("Go To Dashboard"),
)
], ],
), ),
); );

@ -21,7 +21,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/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/chat/incomingCall.dart';
import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart';
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart';
@ -33,7 +32,7 @@ import 'package:mohem_flutter_app/widgets/input_widget.dart';
// import 'package:safe_device/safe_device.dart'; // import 'package:safe_device/safe_device.dart';
import 'package:wifi_iot/wifi_iot.dart'; import 'package:wifi_iot/wifi_iot.dart';
class LoginScreen extends StatefulWidget with WidgetsBindingObserver { class LoginScreen extends StatefulWidget {
LoginScreen({Key? key}) : super(key: key); LoginScreen({Key? key}) : super(key: key);
@override @override
@ -61,6 +60,7 @@ class _LoginScreenState extends State<LoginScreen> {
bool isDevelopmentModeEnable = false; bool isDevelopmentModeEnable = false;
late HmsApiAvailability hmsApiAvailability; late HmsApiAvailability hmsApiAvailability;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -114,7 +114,6 @@ class _LoginScreenState extends State<LoginScreen> {
firebaseToken = await _firebaseMessaging.getToken(); firebaseToken = await _firebaseMessaging.getToken();
AppNotifications().init(firebaseToken); AppNotifications().init(firebaseToken);
checkLoginInfo(); checkLoginInfo();
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
} }
}); });
@ -125,13 +124,11 @@ class _LoginScreenState extends State<LoginScreen> {
firebaseToken = await _firebaseMessaging.getToken(); firebaseToken = await _firebaseMessaging.getToken();
AppNotifications().init(firebaseToken); AppNotifications().init(firebaseToken);
checkLoginInfo(); checkLoginInfo();
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
} }
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
} }
} }

@ -358,6 +358,7 @@ class MarathonProvider extends ChangeNotifier {
} }
startTimerForQuestion(); startTimerForQuestion();
updateCardData(); updateCardData();
totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!);
Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen); Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen);
} else { } else {
currentQuestion = AppState().getIsDemoMarathon currentQuestion = AppState().getIsDemoMarathon

@ -175,7 +175,7 @@ class MarathonScreen extends StatelessWidget {
selectedLanguage: provider.marathonDetailModel.selectedLanguage ?? 0, selectedLanguage: provider.marathonDetailModel.selectedLanguage ?? 0,
arabicContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr ?? "", arabicContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr ?? "",
englishContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn ?? "", englishContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn ?? "",
).toText22( ).toText24(
color: MyColors.grey3AColor, color: MyColors.grey3AColor,
isCentered: true, isCentered: true,
), ),
@ -185,7 +185,7 @@ class MarathonScreen extends StatelessWidget {
) )
: const SizedBox(), : const SizedBox(),
if (provider.selectedWinners != null) ...<Widget>[ if (provider.selectedWinners != null) ...<Widget>[
provider.selectedWinners!.length == 1 provider.selectedWinners!.length == 1 && !provider.iAmWinner
? Column( ? Column(
children: <Widget>[ children: <Widget>[
displayLocalizedContent( displayLocalizedContent(

@ -4,6 +4,10 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:geolocator/geolocator.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:huawei_location/permission/permission_handler.dart';
import 'package:mohem_flutter_app/api/dashboard_api_client.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/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
@ -21,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/nfc/nfc_reader_sheet.dart';
import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart'; import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart';
import 'package:nfc_manager/nfc_manager.dart'; import 'package:nfc_manager/nfc_manager.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:wifi_iot/wifi_iot.dart'; import 'package:wifi_iot/wifi_iot.dart';
class MarkAttendanceWidget extends StatefulWidget { class MarkAttendanceWidget extends StatefulWidget {
@ -39,6 +44,8 @@ class MarkAttendanceWidget extends StatefulWidget {
class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> { class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
bool isNfcEnabled = false, isNfcLocationEnabled = false, isQrEnabled = false, isQrLocationEnabled = false, isWifiEnabled = false, isWifiLocationEnabled = false; bool isNfcEnabled = false, isNfcLocationEnabled = false, isQrEnabled = false, isQrLocationEnabled = false, isWifiEnabled = false, isWifiLocationEnabled = false;
int _locationUpdateCbId = 0;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -66,6 +73,36 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
}); });
} }
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<bool> requestPermissions() async {
var result = await [
Permission.location,
].request();
return (result[Permission.location] == PermissionStatus.granted || result[Permission.locationAlways] == PermissionStatus.granted);
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
@ -95,13 +132,17 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
// if (isNfcEnabled) // if (isNfcEnabled)
attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () { attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () {
if (isNfcLocationEnabled) { if (isNfcLocationEnabled) {
Location.getCurrentLocation((Position position, bool isMocked) { if (AppState().getIsHuawei) {
if (isMocked) { checkHuaweiLocationPermission("NFC");
markFakeAttendance("NFC", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); } else {
} else { Location.getCurrentLocation((Position position, bool isMocked) {
performNfcAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); if (isMocked) {
} markFakeAttendance("NFC", position.latitude.toString() ?? "", position.longitude.toString() ?? "");
}, context); } else {
performNfcAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? "");
}
}, context);
}
} else { } else {
performNfcAttendance(widget.model); performNfcAttendance(widget.model);
} }
@ -109,13 +150,17 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
if (isWifiEnabled) if (isWifiEnabled)
attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () { attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () {
if (isWifiLocationEnabled) { if (isWifiLocationEnabled) {
Location.getCurrentLocation((Position position, bool isMocked) { if (AppState().getIsHuawei) {
if (isMocked) { checkHuaweiLocationPermission("WIFI");
markFakeAttendance("WIFI", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); } else {
} else { Location.getCurrentLocation((Position position, bool isMocked) {
performWifiAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); if (isMocked) {
} markFakeAttendance("WIFI", position.latitude.toString() ?? "", position.longitude.toString() ?? "");
}, context); } else {
performWifiAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? "");
}
}, context);
}
} else { } else {
performWifiAttendance(widget.model); performWifiAttendance(widget.model);
} }
@ -124,13 +169,17 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
if (isQrEnabled) if (isQrEnabled)
attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async { attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async {
if (isQrLocationEnabled) { if (isQrLocationEnabled) {
Location.getCurrentLocation((Position position, bool isMocked) { if (AppState().getIsHuawei) {
if (isMocked) { checkHuaweiLocationPermission("QR");
markFakeAttendance("QR", position.latitude.toString() ?? "", position.longitude.toString() ?? ""); } else {
} else { Location.getCurrentLocation((Position position, bool isMocked) {
performQrCodeAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); if (isMocked) {
} markFakeAttendance("QR", position.latitude.toString() ?? "", position.longitude.toString() ?? "");
}, context); } else {
performQrCodeAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? "");
}
}, context);
}
} else { } else {
performQrCodeAttendance(widget.model); performQrCodeAttendance(widget.model);
} }
@ -143,6 +192,45 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
); );
} }
void getHuaweiCurrentLocation(String attendanceType) {
FusedLocationProviderClient locationService = FusedLocationProviderClient();
LocationRequest locationRequest = LocationRequest();
locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY;
locationRequest.interval = 1000;
List<LocationRequest> locationRequestList = <LocationRequest>[locationRequest];
LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList);
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) {
if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") {
// Location service not enabled.
}
});
}
Future<void> performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { Future<void> performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async {
if (Platform.isIOS) { if (Platform.isIOS) {
Utils.readNFc(onRead: (String nfcId) async { Utils.readNFc(onRead: (String nfcId) async {
@ -252,12 +340,26 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
bool status = await model.fetchAttendanceTracking(context); bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context); Utils.hideLoading(context);
await closeWifiRequest(); await closeWifiRequest();
showMDialog( if (g?.messageStatus == 2) {
context, showDialog(
backgroundColor: Colors.transparent, barrierDismissible: true,
isDismissable: false, context: context,
child: SuccessDialog(widget.isFromDashboard), 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) { } catch (ex) {
await closeWifiRequest(); await closeWifiRequest();
Utils.hideLoading(context); Utils.hideLoading(context);
@ -292,12 +394,26 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue); GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue);
bool status = await model.fetchAttendanceTracking(context); bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context); Utils.hideLoading(context);
showMDialog( if (g?.messageStatus == 2) {
context, showDialog(
backgroundColor: Colors.transparent, barrierDismissible: true,
isDismissable: true, context: context,
child: SuccessDialog(widget.isFromDashboard), 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) { } catch (ex) {
print(ex); print(ex);
Utils.hideLoading(context); Utils.hideLoading(context);

@ -68,6 +68,8 @@ class _QrScannerDialogState extends State<QrScannerDialog> {
} }
}); });
}); });
controller.pauseCamera();
controller.resumeCamera();
} }
@override @override

@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 3.6.4+2 version: 3.2.6+300026
environment: environment:
sdk: ">=2.16.0 <3.0.0" sdk: ">=2.16.0 <3.0.0"
@ -64,7 +64,7 @@ dependencies:
wifi_iot: ^0.3.18 wifi_iot: ^0.3.18
flutter_html: ^3.0.0-alpha.6 flutter_html: ^3.0.0-alpha.6
# flutter_barcode_scanner: ^2.0.0 # flutter_barcode_scanner: ^2.0.0
qr_code_scanner: ^1.0.0 qr_code_scanner: ^1.0.1
# qr_flutter: ^4.0.0 # qr_flutter: ^4.0.0
url_launcher: ^6.0.15 url_launcher: ^6.0.15
share: 2.0.4 share: 2.0.4

Loading…
Cancel
Save