diff --git a/Application.kt b/Application.kt index 0708653a..9b56779f 100644 --- a/Application.kt +++ b/Application.kt @@ -3,19 +3,19 @@ package com.ejada.hmg import io.flutter.app.FlutterApplication import io.flutter.plugin.common.PluginRegistry -import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback + import io.flutter.plugins.GeneratedPluginRegistrant import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService -class Application : FlutterApplication(), PluginRegistrantCallback { +class Application : FlutterApplication() { override fun onCreate() { super.onCreate() FlutterFirebaseMessagingService.setPluginRegistrant(this) } - override fun registerWith(registry: PluginRegistry) { - io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")); - } +// override fun registerWith(registry: PluginRegistry) { +// io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")); +// } } //import io.flutter.app.FlutterApplication diff --git a/FirebaseCloudMessagingPluginRegistrant.kt b/FirebaseCloudMessagingPluginRegistrant.kt index 9ac064cb..91a952a5 100644 --- a/FirebaseCloudMessagingPluginRegistrant.kt +++ b/FirebaseCloudMessagingPluginRegistrant.kt @@ -12,12 +12,12 @@ object FirebaseCloudMessagingPluginRegistrant { FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")) } - private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean { - val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName - if (registry?.hasPlugin(key)!!) { - return true - } - registry.registrarFor(key) - return false - } +// private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean { +// val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName +// if (registry?.hasPlugin(key)!!) { +// return true +// } +// registry.registrarFor(key) +// return false +// } } \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 5136988a..e8111289 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,25 +1,14 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } +plugins { + id "com.android.application" + id "kotlin-android" + id "com.google.gms.google-services" + id "dev.flutter.flutter-gradle-plugin" + id "com.google.firebase.crashlytics" + id "com.huawei.agconnect" +// id("com.mapbox.gradle.application") +// id("com.mapbox.gradle.plugins.ndk") } -def flutterRoot = localProperties.getProperty('flutter.sdk') -//if (flutterRoot == null) { -// throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -//} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') @@ -27,63 +16,35 @@ if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } -apply plugin: 'com.android.application' -apply plugin: 'com.huawei.agconnect' -apply plugin: 'kotlin-android' -apply plugin: 'com.google.gms.google-services' -//apply plugin: 'com.google.firebase.crashlytics' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - - -configurations.all { - c -> - c.resolutionStrategy.eachDependency { - DependencyResolveDetails dependency -> - println dependency.requested.group - if (dependency.requested.group == 'org.bouncycastle') { - dependency.useTarget 'org.bouncycastle:bcprov-jdk15to18:1.68' - } - } -} - -//configurations.all { -// resolutionStrategy { -// force 'androidx.core:core-ktx:1.6.0' -// } -//} android { - compileSdkVersion 34 -// ndkVersion "24.0.8215888" - - buildFeatures { - viewBinding true - dataBinding true - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - lintOptions { - disable 'MissingTranslation' - checkReleaseBuilds false - } - + namespace 'com.ejada.hmg' + compileSdk 36 + ndkVersion '28.2.13676358' defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.ejada.hmg" +// minSdk 24 minSdkVersion 26 - targetSdkVersion 34 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + targetSdkVersion 36 + compileSdkVersion 36 +// targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName multiDexEnabled true } - sourceSets.main { - jniLibs.srcDir 'src/main/libs' - jni.srcDirs = [] //disable automatic ndk-build call + buildFeatures { + viewBinding true + dataBinding true + } + + sourceSets { + main { + java.srcDirs += 'src/main/kotlin' + jniLibs.srcDir 'src/main/libs' + jni.srcDirs = [] // disables automatic ndk-build + } } signingConfigs { @@ -101,44 +62,42 @@ android { signingConfig signingConfigs.debug minifyEnabled false shrinkResources false -// ndk { -// abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64' -// } } release { debuggable false signingConfig signingConfigs.release minifyEnabled true shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } staging { - // Specifies a sorted list of fallback build types that the - // plugin should try to use when a dependency does not include a - // "staging" build type. You may specify as many fallbacks as you - // like, and the plugin selects the first build type that's - // available in the dependency. matchingFallbacks = ['debug', 'qa', 'release'] } } - packagingOptions { - exclude 'META-INF/proguard/androidx-annotations.pro' - pickFirst 'lib/x86/libc++_shared.so' - pickFirst 'lib/x86_64/libc++_shared.so' - pickFirst 'lib/armeabi-v7a/libc++_shared.so' - pickFirst 'lib/arm64-v8a/libc++_shared.so' - pickFirst '**/*.so' + jniLibs { + pickFirsts += ['lib/x86/libc++_shared.so', 'lib/x86_64/libc++_shared.so', 'lib/armeabi-v7a/libc++_shared.so', 'lib/arm64-v8a/libc++_shared.so', '**/*.so'] + useLegacyPackaging true + } + resources { + excludes += ['META-INF/proguard/androidx-annotations.pro'] + } } - + // Enable core library desugaring compileOptions { -// coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + coreLibraryDesugaringEnabled true } - kotlinOptions { - jvmTarget = '1.8' + +// kotlinOptions { +// jvmTarget = '17' +// } + + lint { + disable 'MissingTranslation' + checkReleaseBuilds false } } @@ -146,86 +105,103 @@ flutter { source '../..' } +configurations.all { + resolutionStrategy { + force 'androidx.core:core-ktx:1.16.0' + force 'androidx.core:core:1.16.0' + } +} + dependencies { -// coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' - - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "com.google.firebase:firebase-messaging:21.0.0" -// implementation ('com.google.firebase:firebase-inappmessaging-display:19.1.2',{ -// exclude group: 'com.google.protobuf',module: 'protobuf-javalite' -// exclude group: 'com.google.protobuf',module: 'protobuf-lite' -// }) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.20" + implementation "com.google.firebase:firebase-messaging:24.1.2" implementation 'pub.devrel:easypermissions:3.0.0' -// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0' - // implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0' - implementation 'com.google.guava:guava:27.0.1-android' - // Dependency on local binaries - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.google.code.gson:gson:2.8.6' - - // Dependency on a remote binary -// implementation 'com.example.android:app-magic:12.3' - - - implementation "us.zoom.videosdk:zoomvideosdk-core:1.10.1" - implementation "us.zoom.videosdk:zoomvideosdk-annotation:1.10.1" - implementation "us.zoom.videosdk:zoomvideosdk-videoeffects:1.10.1" + implementation 'com.google.guava:guava:33.4.0-android' + implementation fileTree(dir: 'libs', include: ['*.jar'], exclude: ['bcprov-jdk16-1.46.jar']) - // Native Dependency + implementation 'com.google.code.gson:gson:2.12.0' -// implementation "us.zoom.videosdk:ZoomVideoSDK:1.10.11" -// implementation group: 'us.zoom.videosdk', name: 'zoomvideosdk-core', version: '1.10.11' + // Zoom SDKs + implementation "us.zoom.videosdk:zoomvideosdk-core:1.12.10" + implementation "us.zoom.videosdk:zoomvideosdk-annotation:1.12.10" + implementation "us.zoom.videosdk:zoomvideosdk-videoeffects:1.12.10" -// implementation "us.zoom.videosdk:zoomvideosdk-core:1.10.1" -// implementation "us.zoom.videosdk:zoomvideosdk-annotation:1.10.1" -// implementation "us.zoom.videosdk:zoomvideosdk-videoeffects:1.10.1" + // Networking + implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.11' + implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.11' + implementation 'com.squareup.retrofit2:retrofit:2.11.0' + implementation 'com.squareup.retrofit2:converter-gson:2.11.0' + implementation 'com.squareup.retrofit2:adapter-java8:2.11.0' - implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3' - implementation 'com.squareup.retrofit2:retrofit:2.9.0' - implementation 'com.squareup.retrofit2:converter-gson:2.9.0' - implementation 'com.squareup.retrofit2:adapter-java8:2.4.0' - implementation 'com.google.code.gson:gson:2.8.9' + // Google Services implementation 'com.google.android.gms:play-services-location:21.3.0' - implementation 'com.squareup.okhttp3:okhttp:4.10.0' - implementation 'androidx.test.ext:junit:1.1.5' + implementation 'com.google.android.gms:play-services-basement:18.7.0' + implementation 'com.android.volley:volley:1.2.1' - implementation 'androidx.constraintlayout:constraintlayout:2.2.0' - implementation 'androidx.navigation:navigation-fragment-ktx:2.8.5' - implementation 'androidx.navigation:navigation-ui-ktx:2.8.5' - implementation 'androidx.activity:activity:1.9.3' - def room_version = "2.4.0-alpha04" + implementation 'androidx.constraintlayout:constraintlayout:2.2.1' + implementation 'androidx.navigation:navigation-fragment-ktx:2.9.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.9.0' + implementation 'androidx.activity:activity-ktx:1.10.1' + + def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" - implementation 'net.zetetic:android-database-sqlcipher:4.5.2' + + implementation 'net.zetetic:android-database-sqlcipher:4.5.4' implementation 'com.intuit.ssp:ssp-android:1.1.0' implementation 'com.intuit.sdp:sdp-android:1.1.0' - implementation 'com.github.bumptech.glide:glide:4.12.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' -// implementation "com.mapbox.maps:android:10.16.6" - implementation 'com.mapbox.maps:android:11.3.1' + implementation 'com.github.bumptech.glide:glide:4.16.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0' + + implementation 'com.mapbox.maps:android:11.5.0' + implementation 'com.mapbox.mapboxsdk:mapbox-sdk-turf:7.3.1' +// implementation 'com.mapbox.maps:android:11.4.0' + // AARs implementation files('libs/PenNavUI.aar') implementation files('libs/Penguin.aar') implementation files('libs/PenguinRenderer.aar') -// implementation "org.jetbrains.anko:anko-commons:0.10.4" - implementation 'com.github.kittinunf.fuel:fuel:2.3.0' //for JVM - implementation 'com.github.kittinunf.fuel:fuel-android:2.3.0' - implementation 'com.google.android.gms:play-services-location:17.1.0'//for Android - implementation 'com.google.android.gms:play-services-basement:17.5.0' - implementation "com.opentok.android:opentok-android-sdk:2.21.4" - implementation 'com.facebook.stetho:stetho:1.5.1' - implementation 'com.facebook.stetho:stetho-urlconnection:1.5.1' - implementation 'androidx.core:core-ktx:1.6.0' - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'com.google.android.material:material:1.9.0' - implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.22' - androidTestImplementation "androidx.test:core:1.4.0" -// implementation 'com.airbnb.android:lottie:5.2.0' -// implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.22' - implementation 'com.whatsapp.otp:whatsapp-otp-android-sdk:0.1.0' + implementation 'com.github.kittinunf.fuel:fuel:2.3.1' + implementation 'com.github.kittinunf.fuel:fuel-android:2.3.1' + + implementation "com.opentok.android:opentok-android-sdk:2.25.2" + + implementation 'com.facebook.stetho:stetho:1.6.0' + implementation 'com.facebook.stetho:stetho-urlconnection:1.6.0' + + implementation 'androidx.core:core-ktx:1.16.0' + implementation 'androidx.appcompat:appcompat:1.7.1' + implementation 'com.google.android.material:material:1.12.0' + implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.25' + + androidTestImplementation "androidx.test:core:1.6.1" implementation 'com.whatsapp.otp:whatsapp-otp-android-sdk:0.1.0' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' +// implementation project(':vitalSignEngine') +} + +tasks.whenTaskAdded { task -> + if (task.name.contains("merge") && task.name.contains("NativeLibs")) { + task.doLast { + // Note: project.buildDir is deprecated in newer Gradle; + // layout.buildDirectory.asFile.get() is the modern alternative + def outputDir = new File(project.buildDir, "intermediates/merged_native_libs/release/out/lib") + + // Handle both architectures + def abis = ["arm64-v8a", "armeabi-v7a"] + abis.each { abi -> + def targetFile = new File(outputDir, "$abi/libc++_shared.so") + def sourceFile = file("src/main/jniLibs/$abi/libc++_shared.so") + if (sourceFile.exists() && targetFile.exists()) { + println("FORCING: Overwriting $abi version with known-good 1.2MB library") + + ant.copy(file: sourceFile, tofile: targetFile, overwrite: true) + } + } + } + } } diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/Application.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/Application.kt index e179bc6a..bb9302b5 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/Application.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/Application.kt @@ -4,10 +4,10 @@ package com.ejada.hmg import com.facebook.stetho.Stetho import io.flutter.app.FlutterApplication import io.flutter.plugin.common.PluginRegistry -import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback +//import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback //import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService -class Application : FlutterApplication(), PluginRegistrantCallback { +class Application : FlutterApplication() { override fun onCreate() { super.onCreate() // FlutterFirebaseMessagingService.setPluginRegistrant(this) @@ -37,9 +37,9 @@ class Application : FlutterApplication(), PluginRegistrantCallback { Stetho.initialize(initializer) } - override fun registerWith(registry: PluginRegistry) { - // io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")); - } +// override fun registerWith(registry: PluginRegistry) { +// // io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")); +// } } //import io.flutter.app.FlutterApplication diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/FirebaseCloudMessagingPluginRegistrant.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/FirebaseCloudMessagingPluginRegistrant.kt index df471796..1c0e74f9 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/FirebaseCloudMessagingPluginRegistrant.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/FirebaseCloudMessagingPluginRegistrant.kt @@ -6,20 +6,20 @@ import io.flutter.plugin.common.PluginRegistry object FirebaseCloudMessagingPluginRegistrant { fun registerWith(registry: PluginRegistry?) { - if (alreadyRegisteredWith(registry)) { - return - } +// if (alreadyRegisteredWith(registry)) { +// return +// } // FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")) } - private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean { - val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName - if (key?.let { registry?.hasPlugin(it) }!!) { - return true - } - if (registry != null) { - registry.registrarFor(key) - } - return false - } +// private fun alreadyRegisteredWith(registry: PluginRegistry?): Boolean { +// val key: String? = FirebaseCloudMessagingPluginRegistrant::class.java.canonicalName +// if (key?.let { registry?.hasPlugin(it) }!!) { +// return true +// } +// if (registry != null) { +// registry.registrarFor(key) +// } +// return false +// } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/hmgwifi/HMG_Internet.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/hmgwifi/HMG_Internet.kt index dcfa5488..b1dc1308 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/hmgwifi/HMG_Internet.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/hmgwifi/HMG_Internet.kt @@ -48,7 +48,7 @@ class HMG_Internet(flutterMainActivity: MainActivity) { "https://captive.apple.com".httpGet().response { request, response, result -> result.fold(success = { - val html = String(it).toLowerCase(Locale.ENGLISH) + val html = String(it).lowercase() .replace(" ", "", true) .replace("\n","",true) val have = html.contains("success", true) diff --git a/android/build.gradle b/android/build.gradle index 1849765a..74abf447 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,61 +1,32 @@ buildscript { - ext.kotlin_version = '1.8.0' - -// if (System.properties['os.arch'] == "aarch64") { -// // For M1 Users we need to use the NDK 24 which added support for aarch64 -// ndkVersion = "24.0.8215888" -// } else { -// // Otherwise we default to the side-by-side NDK version from AGP. -// ndkVersion = "21.4.7075529" -// } - repositories { - google() - jcenter() mavenCentral() - maven { url 'https://developer.huawei.com/repo/' } + google() + maven { url "https://developer.huawei.com/repo/" } maven { - url 'https://api.mapbox.com/downloads/v2/releases/maven' - + url = uri("https://api.mapbox.com/downloads/v2/releases/maven") credentials { - username = 'mapbox' - password = "sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg" -// password = "pk.eyJ1IjoicndhaWQiLCJhIjoiY2x5cGo4aHNjMGNsbTJyc2djempobGQxaSJ9.RCaC6WrUt4A4YnZNfxnONQ" + username = "mapbox" + password = "sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg" if (password == null || password == "") { - throw new GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the enviroment variables.") + throw new GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the environment variables.") } } authentication { basic(BasicAuthentication) } } - -// maven { -// url "https://dl.bintray.com/kotlin/kotlin-eap/" -// } } - dependencies { - classpath 'com.android.tools.build:gradle:7.1.3' -// classpath 'com.android.tools.build:gradle:8.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.8' -// classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' - classpath 'com.huawei.agconnect:agcp:1.5.2.300' - classpath("com.android.tools:r8:8.2.42") - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' - classpath "com.mapbox.gradle.plugins:access-token:0.4.0" + classpath 'com.android.tools.build:gradle:8.1.0' + classpath 'com.huawei.agconnect:agcp:1.9.1.304' } } allprojects { repositories { google() -// jcenter() mavenCentral() - flatDir { - dirs 'libs' - } maven { url 'https://developer.huawei.com/repo/' } @@ -69,7 +40,7 @@ allprojects { username = 'mapbox' password = "sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg" if (password == null || password == "") { - throw new GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the enviroment variables.") + throw new GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the environment variables.") } } authentication { @@ -77,8 +48,58 @@ allprojects { } } } + + // Exclude old BouncyCastle globally to avoid duplicate classes + configurations.all { + exclude group: 'org.bouncycastle', module: 'bcprov-jdk16' + } + + tasks.withType(JavaCompile).configureEach { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } + + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions { + jvmTarget = "21" + } + } + + subprojects { + afterEvaluate { project -> + if (project.hasProperty('android')) { + project.android { + if (namespace == null) { + namespace project.group + } + + buildFeatures { + if (buildConfig == null) { + buildConfig true + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } + } + } + // Force Java 17 for all JavaCompile tasks in all subprojects (including plugins) + project.tasks.withType(JavaCompile).configureEach { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } + // Force Kotlin JVM target for all subprojects + project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions { + jvmTarget = "21" + } + } + } + } } + rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" @@ -88,11 +109,5 @@ subprojects { } tasks.register("clean", Delete) { - delete rootProject.buildDir -} - -configurations.all { - resolutionStrategy { - force 'androidx.core:core-ktx:1.6.0' - } + delete rootProject.layout.buildDirectory } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index e35a66a3..7f19c88a 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon May 18 15:37:56 AST 2026 +#Wed Jul 02 15:26:33 AST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/settings.gradle b/android/settings.gradle index 2977ea9f..39151228 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,29 +1,203 @@ +//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 +// }() +// +// includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") +// +// repositories { +// google() +// mavenCentral() +// gradlePluginPortal() +// } +// +// plugins { +// id "dev.flutter.flutter-plugin-loader" version "1.0.0" +// id "com.android.application" version "8.1.0" apply false +// id "org.jetbrains.kotlin.android" version "2.1.10" apply false +// id "com.google.gms.google-services" version "4.4.2" apply false +// id "com.google.firebase.crashlytics" version "3.0.3" apply false +// +// } +//} +// +// +//dependencyResolutionManagement { +// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) +// +// repositories { +// google() +// mavenCentral() +// flatDir { +// dirs 'libs' +// } +// maven { +// url 'https://developer.huawei.com/repo/' +// } +// maven { +// url "https://artifactory.ess-dev.com/artifactory/gradle-dev-local" +// } +// maven { +// url 'https://api.mapbox.com/downloads/v2/releases/maven' +// +// credentials { +// username = 'mapbox' +// password = "sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg" +// if (password == null || password == "") { +// throw new GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the environment variables.") +// } +// } +// authentication { +// basic(BasicAuthentication) +// } +// } +// } +//} +// +// +//// Load local properties +//def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +//def properties = new Properties() +//assert localPropertiesFile.exists() +//localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } +// +//// Get Flutter SDK path +//def flutterSdkPath = properties.getProperty('flutter.sdk') +//assert flutterSdkPath != null : "flutter.sdk not set in local.properties" +// +//// Get vital-sign-engine path +//def vitalSignEnginePath = properties.getProperty('vital.sign.engine.path') +//assert vitalSignEnginePath != null : "vital.sign.engine.path not set in local.properties" +// +//// Include modules +//include ':app' +////project(':vital-sign-engine').projectDir = file(vitalSignEnginePath) +//// ':vital-sign-engine' + + +//include ':app' +// +//def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() +// +//def plugins = new Properties() +//def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +//if (pluginsFile.exists()) { +// pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +//} +// +//plugins.each { name, path -> +// def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() +// include ":$name" +// project(":$name").projectDir = pluginDirectory +//} + +//// Load local properties +//def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +//def properties = new Properties() +//assert localPropertiesFile.exists() +//localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } +// +//// Get Flutter SDK path +//def flutterSdkPath = properties.getProperty('flutter.sdk') +//assert flutterSdkPath != null : "flutter.sdk not set in local.properties" +// +//// Get vital-sign-engine path +//def vitalSignEnginePath = properties.getProperty('vital.sign.engine.path') +//assert vitalSignEnginePath != null : "vital.sign.engine.path not set in local.properties" +// + pluginManagement { def flutterSdkPath = { - def properties = new java.util.Properties() + def properties = new Properties() file("local.properties").withInputStream { properties.load(it) } - def sdk = properties.getProperty("flutter.sdk") - assert sdk != null : "flutter.sdk not set in local.properties" - return sdk + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath }() - includeBuild("${flutterSdkPath}/packages/flutter_tools/gradle") + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + // Get vital-sign-engine path +// def vitalSignEngine = { +// def properties = new Properties() +// file("local.properties").withInputStream { properties.load(it) } +// def vitalSignEnginePath = properties.getProperty("vital.sign.engine.path") +// assert vitalSignEnginePath != null, "vital.sign.engine.path not set in local.properties" +// return vitalSignEnginePath +// }() repositories { google() mavenCentral() + maven { url 'https://developer.huawei.com/repo/' } gradlePluginPortal() - maven { url = uri("https://developer.huawei.com/repo/") } + } + + resolutionStrategy { + eachPlugin { + if (requested.id.id == "com.huawei.agconnect") { + useModule("com.huawei.agconnect:agcp:1.9.1.304") + } + } + } + + dependencyResolutionManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + flatDir { + dirs 'libs' + } + maven { + url 'https://developer.huawei.com/repo/' + } + maven { + url "https://artifactory.ess-dev.com/artifactory/gradle-dev-local" + } + maven { + url 'https://api.mapbox.com/downloads/v2/releases/maven' + credentials { + username = 'mapbox' + password = "sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg" + if (password == null || password == "") { + throw new GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the environment variables.") + } + } + authentication { + basic(BasicAuthentication) + } + } + } } } plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.9.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false - id "com.google.gms.google-services" version "4.4.2" apply false + id "com.android.application" version '8.11.0' apply false + id("org.jetbrains.kotlin.android") version "2.2.0" apply false + id("com.google.gms.google-services") version "4.4.3" apply false + id("com.google.firebase.crashlytics") version "3.0.4" apply false + id('org.gradle.toolchains.foojay-resolver-convention') version '0.9.0' apply false + id "com.huawei.agconnect" version "1.9.1.304" apply false + + } -include ':app' -include ':vital-sign-engine' -project(':vital-sign-engine').projectDir = new java.io.File('/Users/mohamedmekawy/Documents/Work/DiplomaticQuarter_3.16/packages/vital_sign_camera/android/libs') +include ":app" + +//// Add the following to include vitalSignEngine as a module +//def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +//def properties = new Properties() +//assert localPropertiesFile.exists() +//localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } +//def vitalSignEnginePath = properties.getProperty('vital.sign.engine.path') +//assert vitalSignEnginePath != null : "vital.sign.engine.path not set in local.properties" +// +//include ':vitalSignEngine' +//project(':vitalSignEngine').projectDir = file(vitalSignEnginePath) diff --git a/assets/images/new/hmg_logo.png b/assets/images/new/hmg_logo.png deleted file mode 100644 index 2555cfa9..00000000 Binary files a/assets/images/new/hmg_logo.png and /dev/null differ diff --git a/assets/images/new/rsg_logo.png b/assets/images/new/rsg_logo.png new file mode 100644 index 00000000..33d2f4c1 Binary files /dev/null and b/assets/images/new/rsg_logo.png differ diff --git a/lib/config/config.dart b/lib/config/config.dart index 8d75daae..f9fbebe5 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -21,8 +21,8 @@ var PACKAGES_ORDERS = '/api/orders'; var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'http://10.50.100.198:2018/'; - // var BASE_URL = 'https://uat.hmgwebservices.com/'; -var BASE_URL = 'https://hmgwebservices.com/'; + var BASE_URL = 'https://uat.hmgwebservices.com/'; +// var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'http://10.201.204.103/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; @@ -354,7 +354,7 @@ var CAN_PAY_FOR_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/CanPayForWal var CHANNEL = 3; var GENERAL_ID = 'Cs2020@2016\$2958'; var IP_ADDRESS = '10.20.10.20'; -var VERSION_ID = 18.7; +var VERSION_ID = 20.4; var SETUP_ID = '91877'; var LANGUAGE = 2; // var PATIENT_OUT_SA = 0; diff --git a/lib/pages/landing/widgets/slider_view.dart b/lib/pages/landing/widgets/slider_view.dart index 286706aa..d148203b 100644 --- a/lib/pages/landing/widgets/slider_view.dart +++ b/lib/pages/landing/widgets/slider_view.dart @@ -8,6 +8,8 @@ import 'package:diplomaticquarterapp/widgets/buttons/custom_text_button.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../theme/colors.dart'; + class SliderView extends StatefulWidget { VoidCallback onLoginClick; @@ -48,7 +50,7 @@ class _SliderViewState extends State { children: [ mFlex(3), Container( - decoration: projectViewModel.isArabic ? containerColorRadiusLeft(Color(0xFFFBF2E31), 100) : containerColorRadiusRight(Color(0xFFFBF2E31), 100), + decoration: projectViewModel.isArabic ? containerColorRadiusLeft(CustomColors.accentColor, 100) : containerColorRadiusRight(CustomColors.accentColor, 100), padding: EdgeInsets.only(left: projectViewModel.isArabic ? 16 : 20, right: projectViewModel.isArabic ? 20 : 16, top: 6, bottom: 6), child: Text( TranslationBase.of(context).medicalFile, diff --git a/lib/services/permission/permission_service.dart b/lib/services/permission/permission_service.dart index 274f394e..2f6bf490 100644 --- a/lib/services/permission/permission_service.dart +++ b/lib/services/permission/permission_service.dart @@ -7,17 +7,22 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:geolocator/geolocator.dart' as geo; class PermissionService extends BaseService { - final LocalStorage storage = localStorage; + PermissionService(){ + initLocalStorage(); + storage = localStorage; + } + LocalStorage? storage; geo.LocationPermission? locationPermission; AppGlobal appGlobal = new AppGlobal(); setVibrationPermission(flag) async { - storage.setItem('isVibration', flag); + + storage?.setItem('isVibration', flag); } isVibrationEnabled() { - return (storage.getItem('isVibration') == null) || - (storage.getItem('isVibration')) == false + return (storage?.getItem('isVibration') == null) || + (storage?.getItem('isVibration')) == false ? false : true; } @@ -35,11 +40,11 @@ class PermissionService extends BaseService { } setTheme(flag) async { - storage.setItem('isTheme', flag); + storage?.setItem('isTheme', flag); } isThemeEnabled() { - return storage.getItem('isTheme'); + return storage?.getItem('isTheme'); } cameraPermission() async { diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 7fcd5e24..e7be1dd4 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -107,7 +107,7 @@ class _SplashScreenState extends State { Padding( padding: EdgeInsets.symmetric(horizontal: 53), child: Image.asset( - 'assets/images/new/hmg_logo.png', + 'assets/images/new/rsg_logo.png', fit: BoxFit.fitWidth, width: MediaQuery.of(context).size.width, ), diff --git a/lib/widgets/Loader/gif_loader_container.dart b/lib/widgets/Loader/gif_loader_container.dart index f48e9778..a2d81b89 100644 --- a/lib/widgets/Loader/gif_loader_container.dart +++ b/lib/widgets/Loader/gif_loader_container.dart @@ -1,4 +1,5 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:gif_view/gif_view.dart'; class GifLoaderContainer extends StatefulWidget { @@ -42,10 +43,12 @@ class _GifLoaderContainerState extends State with TickerProv //progress-loading.gif child: Container( // margin: EdgeInsets.only(bottom: 40), - child: GifView( - controller: controller, - image: AssetImage("assets/images/progress-loading-red.gif"), //NetworkImage("http://img.mp.itc.cn/upload/20161107/5cad975eee9e4b45ae9d3c1238ccf91e.jpg"), - ), + // child: GifView( + // controller: controller, + // image: AssetImage("assets/images/progress-loading-red.gif"), //NetworkImage("http://img.mp.itc.cn/upload/20161107/5cad975eee9e4b45ae9d3c1238ccf91e.jpg"), + // ) + // , + child: CircularProgressIndicator(color: Color(0xFF14384B)), ), ), ); diff --git a/pubspec.yaml b/pubspec.yaml index 7a69b4a4..613c8bd8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: flutter_localizations: sdk: flutter - webview_flutter: 4.8.0 + webview_flutter: ^4.8.0 app_links: ^6.4.0 http: ^1.4.0 connectivity_plus: 6.1.0 @@ -40,7 +40,7 @@ dependencies: maps_launcher: ^3.0.0+1 url_launcher: ^6.3.1 url_launcher_ios: ^6.3.2 - shared_preferences: ^2.5.5 + shared_preferences: ^2.5.3 # fluttertoast: ^8.0.8 fluttertoast: ^8.2.12 @@ -55,7 +55,7 @@ dependencies: gif_view: ^1.0.3 expandable: ^5.0.1 flutter_charts: ^0.5.2 - google_maps_flutter: ^2.17.0 + google_maps_flutter: ^2.12.3 # huawei_map: ^6.11.2+304 huawei_map: git: @@ -72,7 +72,7 @@ dependencies: # Qr code Scanner location: ^8.0.1 - barcode_scan2: ^4.7.1 + barcode_scan2: ^4.5.1 flutter_rating_bar: ^4.0.1 syncfusion_flutter_calendar: ^29.2.11+1 # timezone: 0.10.1 @@ -87,7 +87,7 @@ dependencies: hijri: ^3.0.0 flutter_datetime_picker_plus: ^2.1.0 carousel_pro_nullsafety: ^2.0.0 - flutter_local_notifications: 21.0.0 + flutter_local_notifications: any device_calendar: ^4.3.3 geolocator: ^14.0.2 geolocator_android: ^5.0.2 @@ -95,7 +95,7 @@ dependencies: jiffy: ^6.2.1 #Flutter WebRTC -# screen_brightness: ^2.1.5 + screen_brightness: ^2.1.5 map_launcher: ^3.0.1 flutter_countdown_timer: ^4.1.0 carousel_slider: ^5.0.0 @@ -105,7 +105,7 @@ dependencies: wakelock_plus: ^1.3.2 after_layout: ^1.1.0 cached_network_image: ^3.4.1 - flutter_tts: ^4.2.5 + flutter_tts: ^4.2.3 flutter_nfc_kit: ^3.6.0 #geofencing: any