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