diff --git a/android/app/build.gradle b/android/app/build.gradle
index 9cd8b0e..198bc87 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -21,6 +21,12 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
@@ -44,18 +50,24 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.cloudSolutions.mohemmtest"
+ applicationId "hmg.cloudSolutions.mohem"
minSdkVersion 21
- targetSdkVersion 32
+ targetSdkVersion 33
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
+ signingConfigs {
+ release {
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+ storePassword keystoreProperties['storePassword']
+ }
+ }
buildTypes {
release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig signingConfigs.debug
+ signingConfig signingConfigs.release
}
}
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 8331694..070597d 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -7,13 +7,12 @@
-
-
+
CFBundleInfoDictionaryVersion
6.0
CFBundleName
- mohem_flutter_app
+ MOHEMM
CFBundlePackageType
APPL
CFBundleShortVersionString
@@ -42,6 +42,8 @@
This App requires access to your location to mark your attendance.
NSLocationWhenInUseUsageDescription
This App requires access to your location to mark your attendance.
+ NSPhotoLibraryUsageDescription
+ This app requires photo library access to select image as document & upload it.
NSMicrophoneUsageDescription
This app requires microphone access to for call.
NSPhotoLibraryUsageDescription
@@ -75,9 +77,16 @@
0000
+ ITSAppUsesNonExemptEncryption
+
+
com.apple.developer.nfc.readersession.formats
TAG
+ com.apple.developer.nfc.readersession.felica.systemcodes
+
+ 0000
+
diff --git a/lib/api/chat/chat_api_client.dart b/lib/api/chat/chat_api_client.dart
index 3ad0ed7..b4c0a2c 100644
--- a/lib/api/chat/chat_api_client.dart
+++ b/lib/api/chat/chat_api_client.dart
@@ -30,8 +30,8 @@ class ChatApiClient {
{
"employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(),
"password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG",
- "isMobile": true,
- "deviceToken": AppState().deviceNotificationToken
+ "isMobile": true,
+ "deviceToken": AppState().getDeviceToken,
},
);
diff --git a/lib/api/items_for_sale/items_for_sale_api_client.dart b/lib/api/items_for_sale/items_for_sale_api_client.dart
index eae6ffb..a04651e 100644
--- a/lib/api/items_for_sale/items_for_sale_api_client.dart
+++ b/lib/api/items_for_sale/items_for_sale_api_client.dart
@@ -32,7 +32,7 @@ class ItemsForSaleApiClient {
getSaleCategoriesListObj.titleAr = "الجميع";
getSaleCategoriesListObj.isActive = true;
getSaleCategoriesListObj.content =
- '';
+ '';
getSaleCategoriesList.add(getSaleCategoriesListObj);
diff --git a/lib/api/marathon/demo_marathon_repo.dart b/lib/api/marathon/demo_marathon_repo.dart
index a93a146..1e53472 100644
--- a/lib/api/marathon/demo_marathon_repo.dart
+++ b/lib/api/marathon/demo_marathon_repo.dart
@@ -11,16 +11,13 @@ class DemoMarathonRepo {
Future getDemoMarathonDetails() async {
String response = await rootBundle.loadString('assets/json/demo_upcoming_marathon');
var json = jsonDecode(response);
- logger.i("json in getDemoMarathonDetails: $json");
MarathonDetailModel marathonDetailModel = MarathonDetailModel.fromJson(json);
return marathonDetailModel;
}
Future getDemoNextQuestion({required int currentQuestionNumber}) async {
- print("currentNumber: $currentQuestionNumber");
String response = await rootBundle.loadString('assets/json/demo_questions_marathon');
List json = jsonDecode(response);
- logger.i("json in getDemoNextQuestion: $json");
QuestionModel currentQuestion = QuestionModel.fromJson(json.elementAt(currentQuestionNumber));
return currentQuestion;
diff --git a/lib/api/offers_and_discounts_api_client.dart b/lib/api/offers_and_discounts_api_client.dart
index 6189612..1d3153c 100644
--- a/lib/api/offers_and_discounts_api_client.dart
+++ b/lib/api/offers_and_discounts_api_client.dart
@@ -30,7 +30,7 @@ class OffersAndDiscountsApiClient {
getSaleCategoriesListObj.categoryNameAr = "الجميع";
getSaleCategoriesListObj.isActive = true;
getSaleCategoriesListObj.content =
- '';
+ '';
getSaleCategoriesList.add(getSaleCategoriesListObj);
diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart
index 4a2bd7e..731a45e 100644
--- a/lib/app_state/app_state.dart
+++ b/lib/app_state/app_state.dart
@@ -17,6 +17,12 @@ class AppState {
factory AppState() => _instance;
+ String? deviceToken = "";
+
+ set setDeviceToken(v) => deviceToken = v;
+
+ String? get getDeviceToken => deviceToken;
+
bool isAuthenticated = false;
set setIsAuthenticated(v) => isAuthenticated = v;
diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart
index 6679cbb..56b0008 100644
--- a/lib/classes/consts.dart
+++ b/lib/classes/consts.dart
@@ -3,8 +3,8 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart';
class ApiConsts {
//static String baseUrl = "http://10.200.204.20:2801/"; // Local server
// static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA 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/classes/push-notification-handler.dart b/lib/classes/push-notification-handler.dart
new file mode 100644
index 0000000..b95ceb2
--- /dev/null
+++ b/lib/classes/push-notification-handler.dart
@@ -0,0 +1,59 @@
+import 'dart:async';
+import 'dart:io';
+
+import 'package:firebase_messaging/firebase_messaging.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:mohem_flutter_app/app_state/app_state.dart';
+
+// |--> Push Notification Background
+Future backgroundMessageHandler(message) async {
+ print("Firebase backgroundMessageHandler!!!");
+}
+
+class PushNotificationHandler {
+ final BuildContext context;
+ static PushNotificationHandler? _instance;
+
+ PushNotificationHandler(this.context) {
+ PushNotificationHandler._instance = this;
+ }
+
+ static PushNotificationHandler getInstance() => _instance!;
+
+ void init() async {
+ FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
+ if (Platform.isIOS) {
+ await Future.delayed(Duration(milliseconds: 3000)).then((value) {
+ newMessage(message);
+ });
+ } else {
+ newMessage(message);
+ }
+ });
+
+ FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async {
+ if (Platform.isIOS) {
+ await Future.delayed(Duration(milliseconds: 3000)).then((value) {
+ newMessage(message);
+ });
+ } else {
+ newMessage(message);
+ }
+ });
+
+ FirebaseMessaging.instance.onTokenRefresh.listen((fcm_token) {
+ print("Push Notification onTokenRefresh: " + fcm_token);
+ AppState().setDeviceToken = fcm_token;
+ });
+
+ FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler);
+ }
+
+ void newMessage(RemoteMessage remoteMessage) async {
+ print("Remote Message: " + remoteMessage.data.toString());
+ if (remoteMessage.data.isEmpty) {
+ return;
+ }
+ }
+}
diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart
index 41b8952..b916f23 100644
--- a/lib/extensions/string_extensions.dart
+++ b/lib/extensions/string_extensions.dart
@@ -13,6 +13,15 @@ extension CapExtension on String {
String get capitalizeFirstofEach => this.trim().length > 0 ? this.trim().toLowerCase().split(" ").map((str) => str.inCaps).join(" ") : "";
}
+extension TrimString on String {
+ String trimString(int minThreshold) {
+ if (length > minThreshold) {
+ return "${substring(0, 10)}...${substring(length - 4, length)}";
+ }
+ return this;
+ }
+}
+
extension EmailValidator on String {
Widget get toWidget => Text(this);
diff --git a/lib/models/marathon/question_model.dart b/lib/models/marathon/question_model.dart
index 4501947..d79e42f 100644
--- a/lib/models/marathon/question_model.dart
+++ b/lib/models/marathon/question_model.dart
@@ -51,6 +51,7 @@ class QuestionModel {
json['questionOptions'].forEach((v) {
questionOptions!.add(QuestionOptions.fromJson(v));
});
+ questionOptions!.sort((QuestionOptions a, QuestionOptions b) => a.sequence!.compareTo(b.sequence!));
}
}
diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart
index 0028505..0ec0bdb 100644
--- a/lib/ui/login/login_screen.dart
+++ b/lib/ui/login/login_screen.dart
@@ -1,4 +1,3 @@
-import 'dart:convert';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
@@ -13,7 +12,7 @@ import 'package:mohem_flutter_app/api/login_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/consts.dart';
-import 'package:mohem_flutter_app/classes/notifications.dart';
+import 'package:mohem_flutter_app/classes/push-notification-handler.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
@@ -97,6 +96,7 @@ class _LoginScreenState extends State {
await Firebase.initializeApp();
_firebaseMessaging = FirebaseMessaging.instance;
firebaseToken = await _firebaseMessaging.getToken();
+ AppState().setDeviceToken = firebaseToken;
AppNotifications().initNotification(firebaseToken);
loginInfo = await LoginApiClient().getMobileLoginInfoNEW(firebaseToken ?? "", Platform.isAndroid ? "android" : "ios");
if (loginInfo == null) {
diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart
index 9781475..9185a19 100644
--- a/lib/ui/marathon/marathon_provider.dart
+++ b/lib/ui/marathon/marathon_provider.dart
@@ -221,19 +221,19 @@ class MarathonProvider extends ChangeNotifier {
getCorrectAnswerAndUpdateAnswerColor();
}
- if (totalCurrentQuestionTime == currentGapTime) {
+ if (totalCurrentQuestionTime - currentGapTime == -2) {
updateCardStatusToAnswer();
- scheduleMicrotask(() async {
- if (AppState().getIsDemoMarathon || isUserOutOfGame) {
- await callNextQuestionApi();
- } else {
- await callSubmitOptionApi().then((bool value) async {
- updateIsUserOutOfGame = !value;
- await callNextQuestionApi();
- });
- }
- });
+ // scheduleMicrotask(() async {
+ // if (AppState().getIsDemoMarathon || isUserOutOfGame) {
+ // await callNextQuestionApi();
+ // } else {
+ // await callSubmitOptionApi().then((bool value) async {
+ // updateIsUserOutOfGame = !value;
+ // await callNextQuestionApi();
+ // });
+ // }
+ // });
if (currentQuestionNumber == (AppState().getIsDemoMarathon ? demoMarathonDetailModel.totalQuestions! : marathonDetailModel.totalQuestions!)) {
isGettingQualifiers = true;
@@ -253,7 +253,7 @@ class MarathonProvider extends ChangeNotifier {
return;
} else {
- if (totalCurrentQuestionTime != currentGapTime) {
+ if (totalCurrentQuestionTime - currentGapTime != -2) {
totalCurrentQuestionTime--;
}
}
@@ -414,10 +414,31 @@ class MarathonProvider extends ChangeNotifier {
void getCorrectAnswerAndUpdateAnswerColor() {
if (selectedOptionIndex != null) {
- if (currentQuestion.questionOptions![selectedOptionIndex!].isCorrectOption!) {
- updateCurrentQuestionOptionStatus(QuestionsOptionStatus.correct, selectedOptionIndex!);
- } else {
- updateCurrentQuestionOptionStatus(QuestionsOptionStatus.wrong, selectedOptionIndex!);
+ scheduleMicrotask(() async {
+ if (AppState().getIsDemoMarathon) {
+ if (currentQuestion.questionOptions![selectedOptionIndex!].isCorrectOption!) {
+ updateCurrentQuestionOptionStatus(QuestionsOptionStatus.correct, selectedOptionIndex!);
+ } else {
+ updateCurrentQuestionOptionStatus(QuestionsOptionStatus.wrong, selectedOptionIndex!);
+ }
+ } else {
+ await callSubmitOptionApi().then((bool value) async {
+ updateIsUserOutOfGame = !value;
+ if (value) {
+ updateCurrentQuestionOptionStatus(QuestionsOptionStatus.correct, selectedOptionIndex!);
+ } else {
+ updateCurrentQuestionOptionStatus(QuestionsOptionStatus.wrong, selectedOptionIndex!);
+ }
+ });
+ }
+ });
+ } else {
+ if (!AppState().getIsDemoMarathon) {
+ scheduleMicrotask(() async {
+ await callSubmitOptionApi().then((bool value) async {
+ updateIsUserOutOfGame = !value;
+ });
+ });
}
}
}
@@ -427,7 +448,16 @@ class MarathonProvider extends ChangeNotifier {
return;
}
- if (selectedOptionIndex != null) {
+ scheduleMicrotask(() async {
+ await callNextQuestionApi();
+ });
+
+ if (selectedOptionIndex == null) {
+ updateQuestionCardStatus(QuestionCardStatus.skippedAnswer);
+ updateAnswerStatusesList(QuestionCardStatus.skippedAnswer);
+ return;
+ }
+ if (AppState().getIsDemoMarathon) {
if (currentQuestion.questionOptions![selectedOptionIndex!].isCorrectOption!) {
updateQuestionCardStatus(QuestionCardStatus.correctAnswer);
updateAnswerStatusesList(QuestionCardStatus.correctAnswer);
@@ -435,10 +465,15 @@ class MarathonProvider extends ChangeNotifier {
updateQuestionCardStatus(QuestionCardStatus.wrongAnswer);
updateAnswerStatusesList(QuestionCardStatus.wrongAnswer);
}
- } else {
- updateQuestionCardStatus(QuestionCardStatus.skippedAnswer);
- updateAnswerStatusesList(QuestionCardStatus.skippedAnswer);
+ return;
+ }
+ if (!isUserOutOfGame) {
+ updateQuestionCardStatus(QuestionCardStatus.correctAnswer);
+ updateAnswerStatusesList(QuestionCardStatus.correctAnswer);
+ return;
}
+ updateQuestionCardStatus(QuestionCardStatus.wrongAnswer);
+ updateAnswerStatusesList(QuestionCardStatus.wrongAnswer);
}
void resetValues() async {
diff --git a/lib/ui/marathon/marathon_sponsor_video_screen.dart b/lib/ui/marathon/marathon_sponsor_video_screen.dart
index 88c66f9..0bd8a1b 100644
--- a/lib/ui/marathon/marathon_sponsor_video_screen.dart
+++ b/lib/ui/marathon/marathon_sponsor_video_screen.dart
@@ -15,13 +15,13 @@ import 'package:video_player/video_player.dart';
class SponsorVideoScreen extends StatelessWidget {
const SponsorVideoScreen({Key? key}) : super(key: key);
-
@override
Widget build(BuildContext context) {
MarathonProvider provider = context.watch();
return WillPopScope(
onWillPop: () {
- provider.videoController.dispose();
+ provider.videoController.pause();
+ provider.disposeVideoPlayer();
provider.sponsorsSecondsCounter = 0;
provider.totalSponsorVideoSeconds = 0;
provider.timerForSponsorVideo.cancel();
@@ -52,11 +52,12 @@ class SponsorVideoScreen extends StatelessWidget {
child: provider.totalSponsorVideoSeconds == 0
? InkWell(
onTap: () {
- provider.videoController.dispose();
+ Navigator.pushReplacementNamed(context, AppRoutes.marathonIntroScreen);
+ provider.videoController.pause();
+ provider.disposeVideoPlayer();
provider.sponsorsSecondsCounter = 0;
provider.totalSponsorVideoSeconds = 0;
provider.timerForSponsorVideo.cancel();
- Navigator.pushReplacementNamed(context, AppRoutes.marathonIntroScreen);
},
child: const Icon(Icons.close, size: 12),
)
@@ -73,11 +74,12 @@ class SponsorVideoScreen extends StatelessWidget {
alignment: Alignment.topLeft,
child: InkWell(
onTap: () {
- provider.videoController.dispose();
+ Navigator.pushReplacementNamed(context, AppRoutes.marathonIntroScreen);
+ provider.videoController.pause();
+ provider.disposeVideoPlayer();
provider.sponsorsSecondsCounter = 0;
provider.totalSponsorVideoSeconds = 0;
provider.timerForSponsorVideo.cancel();
- Navigator.pushReplacementNamed(context, AppRoutes.marathonIntroScreen);
},
child: Container(
decoration: BoxDecoration(color: MyColors.white, borderRadius: BorderRadius.circular(15)),
diff --git a/lib/ui/marathon/widgets/countdown_timer_detail_screen.dart b/lib/ui/marathon/widgets/countdown_timer_detail_screen.dart
index cbf9884..c12a452 100644
--- a/lib/ui/marathon/widgets/countdown_timer_detail_screen.dart
+++ b/lib/ui/marathon/widgets/countdown_timer_detail_screen.dart
@@ -201,6 +201,7 @@ class CountdownTimerForDetailScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CountdownTimer(
+ // endTime: dummyTime,
endTime: timeToMarathon,
onEnd: null,
widgetBuilder: (BuildContext context, CurrentRemainingTime? time) {
diff --git a/lib/ui/marathon/widgets/marathon_banner.dart b/lib/ui/marathon/widgets/marathon_banner.dart
index 1c4d6b8..f6adff6 100644
--- a/lib/ui/marathon/widgets/marathon_banner.dart
+++ b/lib/ui/marathon/widgets/marathon_banner.dart
@@ -11,6 +11,7 @@ import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart';
@@ -428,14 +429,17 @@ class MarathonBanner extends StatelessWidget {
letterSpacing: -0.4,
),
),
- Text(
- AppState().isArabic(context) ? provider.marathonDetailModel.titleAr ?? "" : provider.marathonDetailModel.titleEn ?? "",
- style: TextStyle(
- fontStyle: FontStyle.italic,
- fontSize: isTablet ? 30 : 19,
- fontWeight: FontWeight.bold,
- color: MyColors.white.withOpacity(0.83),
- height: 32 / 22,
+ Flexible(
+ child: Text(
+ (AppState().isArabic(context) ? provider.marathonDetailModel.titleAr ?? "" : provider.marathonDetailModel.titleEn ?? "").trimString(15),
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ fontStyle: FontStyle.italic,
+ fontSize: isTablet ? 30 : 19,
+ fontWeight: FontWeight.bold,
+ color: MyColors.white.withOpacity(0.83),
+ height: 32 / 22,
+ ),
),
),
isTablet ? 10.height : 3.height,
diff --git a/lib/ui/marathon/widgets/marathon_details_card.dart b/lib/ui/marathon/widgets/marathon_details_card.dart
index dda7ef8..11a3d84 100644
--- a/lib/ui/marathon/widgets/marathon_details_card.dart
+++ b/lib/ui/marathon/widgets/marathon_details_card.dart
@@ -53,14 +53,24 @@ class MarathonDetailsCard extends StatelessWidget {
? Row(
children: [
"${LocaleKeys.prize.tr()} ".toText16(color: MyColors.grey77Color, isBold: true),
- Row(
- children: marathonDetailModel.sponsors!.first.sponsorPrizes!
- .map(
- (SponsorPrizes prizes) =>
- "${AppState().isArabic(context) ? prizes.marathonPrizeAr : prizes.marathonPrizeAr}".toText16(color: MyColors.greenColor, isBold: true).paddingOnly(right: 5),
- )
- .toList(),
- ),
+ Expanded(
+ child: SizedBox(
+ height: 30,
+ child: ListView.builder(
+ scrollDirection: Axis.horizontal,
+ shrinkWrap: true,
+ itemCount: marathonDetailModel.sponsors!.first.sponsorPrizes!.length,
+ itemBuilder: (BuildContext context, int index) {
+ SponsorPrizes prizes = marathonDetailModel.sponsors!.first.sponsorPrizes![index];
+ return Container(
+ decoration: BoxDecoration(color: MyColors.backgroundColor, borderRadius: BorderRadius.circular(100), border: Border.all(color: MyColors.grey57Color.withOpacity(0.1))),
+ child: "${AppState().isArabic(context) ? prizes.marathonPrizeAr : prizes.marathonPrizeEn}"
+ .toText16(color: MyColors.greenColor, isBold: true)
+ .paddingOnly(left: 5, right: 5),
+ ).paddingOnly(left: 5);
+ }),
+ ),
+ )
],
)
: const SizedBox(),
diff --git a/lib/ui/marathon/widgets/marathon_progress_container.dart b/lib/ui/marathon/widgets/marathon_progress_container.dart
index 6a71b32..3de86ce 100644
--- a/lib/ui/marathon/widgets/marathon_progress_container.dart
+++ b/lib/ui/marathon/widgets/marathon_progress_container.dart
@@ -57,7 +57,7 @@ class MarathonProgressContainer extends StatelessWidget {
? getDemoMarathonerText()
: "${provider.totalMarathoners} ${provider.totalMarathoners == 1 ? LocaleKeys.marathoner.tr() : LocaleKeys.marathoners.tr()}".toText14(),
provider.questionCardStatus == QuestionCardStatus.question
- ? "00:${(provider.totalCurrentQuestionTime - provider.currentGapTime) < 10 ? "0${provider.totalCurrentQuestionTime - provider.currentGapTime}" : provider.totalCurrentQuestionTime - provider.currentGapTime}"
+ ? "00:${provider.totalCurrentQuestionTime - provider.currentGapTime < 0 ? "00" : (provider.totalCurrentQuestionTime - provider.currentGapTime) < 10 ? "0${provider.totalCurrentQuestionTime - provider.currentGapTime}" : provider.totalCurrentQuestionTime - provider.currentGapTime}"
.toText18(color: provider.totalCurrentQuestionTime - provider.currentGapTime < 5 ? MyColors.redColor : MyColors.black)
: const SizedBox(),
],
diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart
index dfe3b79..6b89c42 100644
--- a/lib/widgets/mark_attendance_widget.dart
+++ b/lib/widgets/mark_attendance_widget.dart
@@ -218,6 +218,15 @@ class _MarkAttendanceWidgetState extends State {
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) {
if (Platform.isIOS) {
await closeWifiRequest();
diff --git a/pubspec.yaml b/pubspec.yaml
index b3d6c4c..189128d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -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.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
-version: 3.6.0+300060
+version: 3.2.0+300020
environment:
sdk: ">=2.16.0 <3.0.0"
@@ -40,7 +40,7 @@ dependencies:
provider: ^6.0.1
easy_localization: ^3.0.0
http: ^0.13.4
- permission_handler: ^9.2.0
+ permission_handler: ^10.2.0
flutter_svg: any
sizer: ^2.0.15
local_auth: ^1.1.9