diff --git a/android/app/build.gradle b/android/app/build.gradle index 512fe2a..92ec20d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,13 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id "dev.flutter.flutter-gradle-plugin" + id "com.google.gms.google-services" +// id "com.huawei.agconnect" //todo this will be done + +} + + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -27,16 +37,24 @@ if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'com.google.gms.google-services' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" -apply plugin: 'com.huawei.agconnect' +//apply plugin: 'com.android.application' +//apply plugin: 'kotlin-android' +//apply plugin: 'com.google.gms.google-services' +//apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +//apply plugin: 'com.huawei.agconnect' android { - compileSdkVersion 34 + namespace 'hmg.cloudSolutions.mohem' + compileSdkVersion 35 + + defaultConfig { + multiDexEnabled true + } compileOptions { + // Flag to enable support for the new language APIs + coreLibraryDesugaringEnabled true + // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } @@ -53,10 +71,13 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "hmg.cloudSolutions.mohem" minSdkVersion 28 - targetSdkVersion 34 + targetSdkVersion 35 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } + buildFeatures{ + buildConfig true + } signingConfigs { release { @@ -84,5 +105,58 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2' +// implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10" } + + +def targetProjects = ["huawei_push", "in_app_update", "qr_code_scanner"] + +subprojects { + afterEvaluate { subproject -> + if (targetProjects.contains(subproject.name) && subproject.extensions.findByName("android") != null) { + // Register the fix task only for target projects + def fixTask = subproject.tasks.register("fixManifestsAndNamespace") { + doLast { + def buildGradleFile = file("build.gradle") + def manifestFile = file("src/main/AndroidManifest.xml") + + // Step 1: Set namespace from package if not already present + if (manifestFile.exists()) { + def manifestContent = manifestFile.getText("UTF-8") + def matcher = (manifestContent =~ /package\s*=\s*"([^"]+)"/) + def packageName = matcher.find() ? matcher.group(1) : null + + if (packageName != null && !buildGradleFile.getText().contains("namespace")) { + println "Setting namespace in ${buildGradleFile.path}" + def updatedBuildGradle = buildGradleFile.getText().replaceFirst( + /android\s*\{/, + "android {\n namespace = \"${packageName}\"" + ) + buildGradleFile.write(updatedBuildGradle, "UTF-8") + } + } + + // Step 2: Remove `package` from all AndroidManifest.xml files in the project + def manifestFiles = fileTree("src/main") { + include "**/AndroidManifest.xml" + } + + manifestFiles.each { file -> + def content = file.getText() + if (content.contains("package=")) { + println "Removing package attribute from ${file.path}" + def updated = content.replaceAll(/package\s*=\s*"[^"]*"/, "") + file.write(updated) + } + } + } + } + + // Ensure the task runs before preBuild + subproject.tasks.matching { it.name.startsWith("preBuild") }.configureEach { + dependsOn fixTask + } + } + } +} \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 50ab38d..443c7bf 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + > diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d6d528d..132ad69 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + > diff --git a/android/app/src/main/kotlin/com/mohem_flutter_app/MainActivity.kt b/android/app/src/main/kotlin/hmg/cloudSolutions/mohem/MainActivity.kt similarity index 93% rename from android/app/src/main/kotlin/com/mohem_flutter_app/MainActivity.kt rename to android/app/src/main/kotlin/hmg/cloudSolutions/mohem/MainActivity.kt index 0023ec9..15133a2 100644 --- a/android/app/src/main/kotlin/com/mohem_flutter_app/MainActivity.kt +++ b/android/app/src/main/kotlin/hmg/cloudSolutions/mohem/MainActivity.kt @@ -1,4 +1,4 @@ -package com.mohem_flutter_app +package hmg.cloudSolutions.mohem //import io.flutter.embedding.android.FlutterActivity // diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 50ab38d..443c7bf 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + > diff --git a/android/build.gradle b/android/build.gradle index 2c90dbd..7536277 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,19 +1,19 @@ -buildscript { - ext.kotlin_version = '1.9.10' - repositories { - google() - mavenCentral() - maven { url 'https://developer.huawei.com/repo/' } - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.1.3' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.8' - classpath 'com.huawei.agconnect:agcp:1.8.0.300' - classpath "com.android.tools:r8:8.2.33" - } -} +//buildscript { +// ext.kotlin_version = '`1.9.10' +// repositories {` +// google() +// mavenCentral() +// maven { url 'https://developer.huawei.com/repo/' } +// } +// +// dependencies { +// classpath 'com.android.tools.build:gradle:7.1.3' +// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" +// classpath 'com.google.gms:google-services:4.3.8' +// classpath 'com.huawei.agconnect:agcp:1.8.0.300' +// classpath "com.android.tools:r8:8.2.33" +// } +//} allprojects { repositories { diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 1e830b7..7a00584 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Mar 06 11:40:30 AST 2025 +#Wed Jul 09 13:30:59 AST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/settings.gradle b/android/settings.gradle index 44e62bc..3a4691e 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,11 +1,40 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + maven { url 'https://developer.huawei.com/repo/' } + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == "com.huawei.agconnect") { + //https://flutter.dev/go/flutter-gradle-plugin-apply + //https://forums.developer.huawei.com/forumPortal/en/topic/0201148914110187023 + //https://stackoverflow.com/questions/78339717/huawei-agcp-plugin-cannot-be-applied + useModule("com.huawei.agconnect:agcp:1.9.1.304") + } + } + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id 'com.android.application' version "8.3.2" apply false + id 'dev.flutter.flutter-plugin-loader' version "1.0.0" // apply true + id "org.jetbrains.kotlin.android" version "2.0.0" apply false + id "com.google.gms.google-services" version "4.4.0" apply false +// id "com.google.gms.google-services" version "4.4.0" apply false + id "com.huawei.agconnect" version "1.9.1.304" apply false +// classpath 'com.huawei.agconnect:agcp:1.8.0.300' +} + +include ":app" \ No newline at end of file diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 145b039..5908de4 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; @@ -12,7 +14,7 @@ import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_main_response.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; -import 'package:platform_device_id/platform_device_id.dart'; +// import 'package:platform_device_id/platform_device_id.dart'; // import 'package:platform_device_id/platform_device_id.dart'; import 'package:uuid/uuid.dart'; @@ -165,10 +167,17 @@ class DashboardApiClient { }) async { String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; var uuid = Uuid(); + String? deviceId = ""; // Generate a v4 (random) id - + if (Platform.isAndroid) { + AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo; + deviceId = androidInfo.id; + } else if (Platform.isIOS) { + IosDeviceInfo iosInfo = await DeviceInfoPlugin().iosInfo; + deviceId = iosInfo.identifierForVendor; + } Map postParams = { - "UID": await PlatformDeviceId.getDeviceId, //uuid.v4(), //Mobile Id + "UID": deviceId, //uuid.v4(), //Mobile Id // "UID": uuid.v4(), //Mobile Id "Latitude": lat, "Longitude": long, diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 428c831..0545518 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -7,7 +7,7 @@ class ApiConsts { // static String baseUrl = "http://10.20.200.111:1010/"; // static String baseUrl = "https://webservices.hmg.com"; // PreProd - static String baseUrl = "https://mohemm.hmg.com"; + // static String baseUrl = "https://mohemm.hmg.com"; // static String baseUrl = "https://hmgwebservices.com"; // Live server // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver @@ -17,7 +17,7 @@ class ApiConsts { // static String baseUrl = "https://mohemm.hmg.com"; // New Live server // - // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver + static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver // static String baseUrl = "http://10.20.200.111:1010/"; // static String baseUrl = "https://webservices.hmg.com"; // PreProd diff --git a/lib/models/itg/advertisement.dart b/lib/models/itg/advertisement.dart index fb172ad..002f73d 100644 --- a/lib/models/itg/advertisement.dart +++ b/lib/models/itg/advertisement.dart @@ -1,6 +1,7 @@ class Advertisement { int? advertisementId; String? advertisementTitle; + String? advertisementTitleAr; int? durationInSeconds; bool? showDelete; dynamic acknowledgment; @@ -16,6 +17,7 @@ class Advertisement { Advertisement({ this.advertisementId, this.advertisementTitle, + this.advertisementTitleAr, this.durationInSeconds, this.showDelete, this.acknowledgment, @@ -34,6 +36,7 @@ class Advertisement { Advertisement.fromJson(Map json) { advertisementId = json['advertisementId']; advertisementTitle = json['advertisementTitle']; + advertisementTitleAr = json['advertisementTitleAr']; durationInSeconds = json['durationInSeconds']; showDelete = json['showDelete']; acknowledgment = json['acknowledgment']; @@ -63,6 +66,7 @@ class Advertisement { Map data = Map(); data['advertisementId'] = this.advertisementId; data['advertisementTitle'] = this.advertisementTitle; + data['advertisementTitleAr'] = this.advertisementTitleAr; data['durationInSeconds'] = this.durationInSeconds; data['showDelete'] = this.showDelete; data['acknowledgment'] = this.acknowledgment; diff --git a/lib/provider/chat_provider_model.dart b/lib/provider/chat_provider_model.dart index 084e8e4..4c19817 100644 --- a/lib/provider/chat_provider_model.dart +++ b/lib/provider/chat_provider_model.dart @@ -1659,7 +1659,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { void sRecoding() async { isVoiceMsg = true; recorderController.reset(); - await recorderController.record(path); + await recorderController.record(path: path); _recodeDuration = 0; _startTimer(); isRecoding = !isRecoding; @@ -1691,7 +1691,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { File file = File(path!); file.readAsBytesSync(); path = file.path; - await playerController.preparePlayer(file.path, 1.0); + await playerController.preparePlayer(path:file.path, volume: 1.0); _timer?.cancel(); notifyListeners(); } diff --git a/lib/ui/landing/itg/its_add_screen_video_image.dart b/lib/ui/landing/itg/its_add_screen_video_image.dart index 6e1358c..103fde1 100644 --- a/lib/ui/landing/itg/its_add_screen_video_image.dart +++ b/lib/ui/landing/itg/its_add_screen_video_image.dart @@ -11,8 +11,10 @@ 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/models/itg/advertisement.dart' as ads; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/my_video_progress_indicator.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'package:video_player/video_player.dart'; class ITGAdsScreen extends StatefulWidget { @@ -31,6 +33,8 @@ class _ITGAdsScreenState extends State { bool isAudio = false; String ext = ''; + bool isTextURL = false; + // late File imageFile; late String imageUrl; ads.Advertisement? advertisementData; @@ -45,23 +49,27 @@ class _ITGAdsScreenState extends State { late CountdownTimerController timerController; void checkFileType() { - String? rFile = advertisementData!.viewAttachFileColl!.first.base64String; - try { - rFile = advertisementData!.viewAttachFileColl!.where((element) => element.languageId == AppState().getLanguageID(context)).toList().first.base64String; - } catch (ex) {} - - String? rFileExt = advertisementData!.viewAttachFileColl!.first.fileName; - ext = "." + rFileExt!.split(".").last.toLowerCase(); - if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif") { - // await processImage(); - imageUrl = rFile!; - isImage = true; + if (advertisementData!.viewAttachFileColl!.first.contentType!.toLowerCase() == "text") { + isTextURL = true; } else { - if (ext == ".aac") { - isAudio = true; + String? rFile = advertisementData!.viewAttachFileColl!.first.base64String; + try { + rFile = advertisementData!.viewAttachFileColl!.where((element) => element.languageId == AppState().getLanguageID(context)).toList().first.base64String; + } catch (ex) {} + + String? rFileExt = advertisementData!.viewAttachFileColl!.first.fileName; + ext = "." + rFileExt!.split(".").last.toLowerCase(); + if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif") { + // await processImage(); + imageUrl = rFile!; + isImage = true; + } else { + if (ext == ".aac") { + isAudio = true; + } + isVideo = true; + _futureController = createVideoPlayer(rFile!); } - isVideo = true; - _futureController = createVideoPlayer(rFile!); } // advertisementData?.actionButtonsColl!.forEach((element) { @@ -132,7 +140,17 @@ class _ITGAdsScreenState extends State { timerController = CountdownTimerController(endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, onEnd: onTimerEnd); } return Scaffold( - backgroundColor: Colors.black, + backgroundColor: isTextURL ? Colors.white : Colors.black, + appBar: isTextURL + ? AppBar( + centerTitle: true, + automaticallyImplyLeading: false, + backgroundColor: Colors.white, + title: (AppState().isArabic(context) ? advertisementData!.advertisementTitleAr! : advertisementData!.advertisementTitleAr!).toText24(color: MyColors.darkTextColor, isBold: true), + + //advertisementData!.viewAttachFileColl!.first.base64String!.toText24(color: MyColors.darkTextColor, isBold: true), + ) + : null, body: Stack( children: [ if (isVideo) @@ -346,6 +364,45 @@ class _ITGAdsScreenState extends State { ], ), ), + if (isTextURL) + SingleChildScrollView( + padding: const EdgeInsets.all(21), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + (AppState().isArabic(context) ? advertisementData!.viewAttachFileColl![0].base64String! : advertisementData!.viewAttachFileColl![1].base64String!) + .toText16(color: MyColors.darkTextColor), + 24.height, + ListView.separated( + itemCount: advertisementData!.actionButtonsColl?.length ?? 0, + separatorBuilder: (cxt, index) => 16.height, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + itemBuilder: (cxt, index) => DefaultButton( + AppState().isArabic(context) ? advertisementData!.actionButtonsColl![index].btnTextAr : advertisementData!.actionButtonsColl![index].btnTextEn, + () async { + if (advertisementData!.actionButtonsColl![index].actionValue.toLowerCase() == "skip") { + Navigator.pop(context); + } else { + Uri uri = Uri.parse(advertisementData!.actionButtonsColl![index].iconOrImage); + // if (await canLaunchUrl(uri)) { + await launchUrl(uri, mode: LaunchMode.externalApplication).catchError((err) { + // print(err); + Utils.showToast('Could not launch'); + }); + Navigator.pop(context); + // } else { + // Utils.showToast('Could not launch'); + // } + } + }, + ), + ), + ], + ), + ), ], ), ); diff --git a/lib/ui/login/verify_last_login_screen.dart b/lib/ui/login/verify_last_login_screen.dart index 2cabedc..5c76092 100644 --- a/lib/ui/login/verify_last_login_screen.dart +++ b/lib/ui/login/verify_last_login_screen.dart @@ -112,7 +112,7 @@ class _VerifyLastLoginScreenState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, - children: [LocaleKeys.lastLoginDetails.tr().toText16(), DateUtil.formatDateToDate(DateUtil.convertStringToDate(mobileLoginInfoListModel!.editedOn!), false).toText12()], + children: [LocaleKeys.lastLoginDetails.tr().toText16(), DateUtil.formatDateToDate(DateUtil.convertStringToDate(mobileLoginInfoListModel!.editedOn ?? DateTime.now().toString()), false).toText12()], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart b/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart index ef54e65..c2fc9b8 100644 --- a/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart +++ b/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart @@ -16,7 +16,7 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:share/share.dart'; +import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; class OffersAndDiscountsDetails extends StatefulWidget { @@ -128,7 +128,12 @@ class _OffersAndDiscountsDetailsState extends State { Directory tempDir = await getTemporaryDirectory(); File file = await File('${tempDir.path}/${DateTime.now().toString()}.png').create(); await file.writeAsBytes(pngBytes); - await Share.shareFiles([(file.path)], text: AppState().isArabic(context) ? getOffersList[0].titleAr : getOffersList[0].titleEn); + + var params = ShareParams( + text: AppState().isArabic(context) ? getOffersList[0].titleAr : getOffersList[0].titleEn, + files: [XFile('${tempDir.path}/${DateTime.now().toString()}.png')], + ); + await SharePlus.instance.share(params); } catch (ex) { debugPrint(ex.toString()); } diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart index 508ed00..f5c8fb0 100644 --- a/lib/widgets/mark_attendance_widget.dart +++ b/lib/widgets/mark_attendance_widget.dart @@ -24,7 +24,7 @@ import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:platform_device_id/platform_device_id.dart'; +// import 'package:platform_device_id/platform_device_id.dart'; import 'package:wifi_iot/wifi_iot.dart'; class MarkAttendanceWidget extends StatefulWidget { diff --git a/lib/widgets/qr_scanner_dialog.dart b/lib/widgets/qr_scanner_dialog.dart index 11e2601..01a92de 100644 --- a/lib/widgets/qr_scanner_dialog.dart +++ b/lib/widgets/qr_scanner_dialog.dart @@ -1,8 +1,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; -import 'package:qr_code_scanner/qr_code_scanner.dart'; class QrScannerDialog extends StatefulWidget { @override @@ -11,8 +11,9 @@ class QrScannerDialog extends StatefulWidget { class _QrScannerDialogState extends State { final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); - Barcode? result; - QRViewController? controller; + // Barcode? result; + // QRViewController? controller; + Barcode? _barcode; bool isPicked = false; @override @@ -26,10 +27,7 @@ class _QrScannerDialogState extends State { children: [ Expanded( flex: 1, - child: QRView( - key: qrKey, - onQRViewCreated: _onQRViewCreated, - ), + child: MobileScanner(key : qrKey,onDetect: _handleBarcode), ), // Expanded( // flex: 1, @@ -55,25 +53,25 @@ class _QrScannerDialogState extends State { ); } - void _onQRViewCreated(QRViewController controller) { - this.controller = controller; - - controller.scannedDataStream.listen((scanData) { + void _handleBarcode(BarcodeCapture barcodes) { + // this.controller = controller; + Barcode? data = barcodes.barcodes.firstOrNull; + if(data == null || isPicked) { + return; + } + // controller.scannedDataStream.listen((scanData) { setState(() { - result = scanData; - if (!isPicked) { + // result = scanData; isPicked = true; - Navigator.pop(context, result!.code); - } + Navigator.pop(context, data.displayValue); }); - }); - controller.pauseCamera(); - controller.resumeCamera(); + // }); + // controller.pauseCamera(); + // controller.resumeCamera(); } @override void dispose() { - controller?.dispose(); super.dispose(); } } diff --git a/pubspec.yaml b/pubspec.yaml index 69e9595..03634cb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,11 +16,12 @@ 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.3.01+300040 -version: 3.6.3+300073 + +version: 3.6.6+300076 +#version: 3.8.999+2 environment: - sdk: ">=2.16.0 <3.5.0" + sdk: ">=3.0.0 <4.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -40,17 +41,17 @@ dependencies: injector: ^2.0.0 provider: ^6.0.1 easy_localization: ^3.0.0 - http: ^0.13.4 + http: ^1.4.0 permission_handler: ^10.2.0 flutter_svg: any sizer: ^2.0.15 local_auth: ^2.2.0 fluttertoast: ^8.0.8 - syncfusion_flutter_calendar: ^27.2.5 + syncfusion_flutter_calendar: ^29.1.38 # flutter_calendar_carousel: ^2.1.0 pie_chart: ^5.1.0 shared_preferences: ^2.0.12 - firebase_messaging: ^13.0.4 + firebase_messaging: ^15.2.9 shimmer: ^2.0.0 logger: ^1.1.0 flutter_countdown_timer: ^4.1.0 @@ -58,20 +59,24 @@ dependencies: # uuid: ^3.0.6 # device_info_plus: ^4.0.0 # android_id: ^0.1.3+1 - platform_device_id: ^1.0.1 +# platform_device_id: ^1.0.1 + device_info_plus: ^9.0.0 image_picker: ^0.8.5+3 - file_picker: 5.2.5 + file_picker: 8.1.3 + geolocator: ^11.1.0 month_year_picker: ^0.4.0+1 - month_picker_dialog: ^3.0.0 - geolocator: ^9.0.2 + month_picker_dialog: ^6.0.3 +# month_picker_dialog: ^6.2.3 + # open_file: ^3.2.1 open_filex: ^4.4.0 wifi_iot: ^0.3.19+1 flutter_html: ^3.0.0-alpha.6 + mobile_scanner: ^6.0.10 # flutter_barcode_scanner: ^2.0.0 - qr_code_scanner: ^1.0.1 +# qr_code_scanner: ^1.0.1 # qr_flutter: ^4.0.0 url_launcher: ^6.0.15 - share: 2.0.4 + share_plus: ^11.0.0 flutter_rating_bar: ^4.0.1 auto_size_text: ^3.0.0 pull_to_refresh: ^2.0.0 @@ -84,7 +89,7 @@ dependencies: safe_device: ^1.1.9 # networkImage - +# cached_network_image: ^3.2.2 #Chat signalr_netcore: ^1.3.3 @@ -92,11 +97,11 @@ dependencies: swipe_to: ^1.0.2 flutter_webrtc: ^0.9.17 camera: ^0.10.3 - flutter_local_notifications: ^17.2.1+2 + flutter_local_notifications: ^18.0.0 #firebase_analytics: any #Chat Voice Message Recoding & Play - audio_waveforms: ^0.1.5+1 + audio_waveforms: ^1.3.0 rxdart: ^0.27.7 #Encryption @@ -111,17 +116,21 @@ dependencies: # huawei_hmsavailability: ^6.6.0+300 # huawei_location: 6.0.0+302 huawei_location: ^6.11.0+301 - huawei_push: ^6.7.0+300 - firebase_crashlytics: ^2.9.0 +# huawei_push: ^6.13.0+300 + huawei_push: + git: + url: https://github.com/fleoparra/hms-flutter-plugin.git + path: flutter-hms-push + firebase_crashlytics: ^4.3.9 #Items for sale Image Carousel Slider - carousel_slider: ^4.2.1 + carousel_slider: ^5.1.1 #Huawei Specified # store_checker: ^1.1.0 - google_api_availability: ^3.0.1 + google_api_availability: ^5.0.1 google_maps_flutter_web: ^0.5.4 - in_app_update: 4.1.0 + in_app_update: 4.2.3 cached_network_image: ^3.3.0 # or newer flutter_blurhash: ^0.8.0 # #todo its for temporary purpose, later will remove this. @@ -130,9 +139,9 @@ dependencies: # saf: ^1.0.3+4 -dependency_overrides: - firebase_core_platform_interface: 4.5.1 - cached_network_image: ^3.2.0 +#dependency_overrides: +# firebase_core_platform_interface: 4.5.1 +# cached_network_image: ^3.2.0 dev_dependencies: flutter_test: