diff --git a/.metadata b/.metadata
index 8d5d37ee..5f4336f9 100644
--- a/.metadata
+++ b/.metadata
@@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
- revision: "a14f74ff3a1cbd521163c5f03d68113d50af93d3"
+ revision: "adc901062556672b4138e18a4dc62a4be8f4b3c2"
channel: "stable"
project_type: app
@@ -13,11 +13,26 @@ project_type: app
migration:
platforms:
- platform: root
- create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
- platform: android
- create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
+ create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ - platform: ios
+ create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ - platform: linux
+ create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ - platform: macos
+ create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ - platform: web
+ create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ - platform: windows
+ create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
+ base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
# User provided section
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 5dfbaf38..92f16832 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -20,12 +20,12 @@ if (project.hasProperty('google-services.json')) {
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
- flutterVersionCode = "7"
+ flutterVersionCode = "14"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
- flutterVersionName = "1.1.0"
+ flutterVersionName = "1.2.6"
}
def keystorePropertiesFile = rootProject.file("key.properties")
@@ -35,15 +35,15 @@ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
namespace = "ae.gov.fcsc.stats"
compileSdk = flutter.compileSdkVersion
- // ndkVersion = flutter.ndkVersion
- ndkVersion = "25.1.8937393"
+ ndkVersion = flutter.ndkVersion
+// ndkVersion = "25.1.8937393"
compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
+ sourceCompatibility = JavaVersion.VERSION_21
+ targetCompatibility = JavaVersion.VERSION_21
}
kotlinOptions {
- jvmTarget = "17"
+ jvmTarget = "21"
}
defaultConfig {
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
new file mode 100644
index 00000000..a1dad0ab
--- /dev/null
+++ b/android/app/build.gradle.kts
@@ -0,0 +1,44 @@
+plugins {
+ id("com.android.application")
+ id("kotlin-android")
+ // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
+ id("dev.flutter.flutter-gradle-plugin")
+}
+
+android {
+ namespace = "ae.gov.fcsc.uae_stat"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_11.toString()
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId = "ae.gov.fcsc.uae_stat"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://flutter.dev/to/review-gradle-config.
+ minSdk = flutter.minSdkVersion
+ targetSdk = flutter.targetSdkVersion
+ versionCode = flutter.versionCode
+ versionName = flutter.versionName
+ }
+
+ 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.getByName("debug")
+ }
+ }
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 3e68b2f7..8d914b2a 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -33,17 +33,22 @@
android:value="true"/>
+
+
+
+
+
+
+
+
+
-
-
-
-
+ ,
diff --git a/android/app/src/main/kotlin/ae/gov/fcsc/uae_stat/MainActivity.kt b/android/app/src/main/kotlin/ae/gov/fcsc/uae_stat/MainActivity.kt
new file mode 100644
index 00000000..23f3ea36
--- /dev/null
+++ b/android/app/src/main/kotlin/ae/gov/fcsc/uae_stat/MainActivity.kt
@@ -0,0 +1,5 @@
+package ae.gov.fcsc.uae_stat
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity : FlutterActivity()
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 00000000..f74085f3
--- /dev/null
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 00000000..304732f8
--- /dev/null
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
index 81f8ba72..63610638 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -4,7 +4,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:8.6.0' // Update this if needed
+ classpath 'com.android.tools.build:gradle:8.7.1' // Update this if needed
classpath 'com.google.gms:google-services:4.3.10' // ✅ Required for Firebase
}
}
diff --git a/android/build.gradle.kts b/android/build.gradle.kts
new file mode 100644
index 00000000..dbee657b
--- /dev/null
+++ b/android/build.gradle.kts
@@ -0,0 +1,24 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+val newBuildDir: Directory =
+ rootProject.layout.buildDirectory
+ .dir("../../build")
+ .get()
+rootProject.layout.buildDirectory.value(newBuildDir)
+
+subprojects {
+ val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
+ project.layout.buildDirectory.value(newSubprojectBuildDir)
+}
+subprojects {
+ project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean") {
+ delete(rootProject.layout.buildDirectory)
+}
diff --git a/android/gradle.properties b/android/gradle.properties
index 476c2b1c..3f13b436 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,4 +1,13 @@
-org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError
-android.useAndroidX=true
-android.enableJetifier=true
+# Enable 16KB memory page support
+android.bundle.enableNativeCodeCompression=false
+android.experimental.enable16kPages=true
org.gradleorg.gradle.java.home=/usr/lib/jvm/openlogic-openjdk-17.0.13+11-linux-x64
+# Ensure compatibility
+org.gradle.jvmargs=-Xmx4G -XX:+UseParallelGC -XX:MaxMetaspaceSize=1G
+org.gradle.caching=true
+org.gradle.daemon=true
+org.gradle.parallel=true
+
+android.useAndroidX=true
+android.enableJetifier=false
+kotlin.code.style=official
\ No newline at end of file
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 5d6560a4..5e022813 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
+
diff --git a/android/settings.gradle b/android/settings.gradle
index a2ff7785..2d7bd528 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -18,8 +18,8 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
- id "com.android.application" version "8.2.1" apply false
- id "org.jetbrains.kotlin.android" version "1.9.24" apply false
+ id "com.android.application" version "8.6.0" apply false
+ id "org.jetbrains.kotlin.android" version "2.1.0" apply false
id("com.google.gms.google-services") version "4.4.2" apply false
}
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
new file mode 100644
index 00000000..fb605bc8
--- /dev/null
+++ b/android/settings.gradle.kts
@@ -0,0 +1,26 @@
+pluginManagement {
+ val flutterSdkPath =
+ run {
+ val properties = java.util.Properties()
+ file("local.properties").inputStream().use { properties.load(it) }
+ val flutterSdkPath = properties.getProperty("flutter.sdk")
+ require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
+ 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.9.1" apply false
+ id("org.jetbrains.kotlin.android") version "2.1.0" apply false
+}
+
+include(":app")
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 868ef877..7b484c4a 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,5 +1,5 @@
PODS:
- - app_links (0.0.2):
+ - app_links (6.4.1):
- Flutter
- app_settings (5.1.1):
- Flutter
@@ -13,47 +13,49 @@ PODS:
- GoogleUtilities/Environment (~> 8.0)
- GoogleUtilities/UserDefaults (~> 8.0)
- PromisesObjC (~> 2.4)
- - appsflyer_sdk (6.16.2):
- - AppsFlyerFramework (= 6.16.2)
+ - appsflyer_sdk (6.17.7):
+ - appsflyer_sdk/Core (= 6.17.7)
+ - appsflyer_sdk/Core (6.17.7):
+ - AppsFlyerFramework (= 6.17.7)
- Flutter
- - AppsFlyerFramework (6.16.2):
- - AppsFlyerFramework/Main (= 6.16.2)
- - AppsFlyerFramework/Main (6.16.2)
+ - AppsFlyerFramework (6.17.7):
+ - AppsFlyerFramework/Main (= 6.17.7)
+ - AppsFlyerFramework/Main (6.17.7)
- connectivity_plus (0.0.1):
- Flutter
- device_info_plus (0.0.1):
- Flutter
- - Firebase/CoreOnly (11.10.0):
- - FirebaseCore (~> 11.10.0)
- - Firebase/Messaging (11.10.0):
+ - Firebase/CoreOnly (11.15.0):
+ - FirebaseCore (~> 11.15.0)
+ - Firebase/Messaging (11.15.0):
- Firebase/CoreOnly
- - FirebaseMessaging (~> 11.10.0)
- - firebase_core (3.13.0):
- - Firebase/CoreOnly (= 11.10.0)
+ - FirebaseMessaging (~> 11.15.0)
+ - firebase_core (3.15.2):
+ - Firebase/CoreOnly (= 11.15.0)
- Flutter
- - firebase_messaging (15.2.5):
- - Firebase/Messaging (= 11.10.0)
+ - firebase_messaging (15.2.10):
+ - Firebase/Messaging (= 11.15.0)
- firebase_core
- Flutter
- - FirebaseCore (11.10.0):
- - FirebaseCoreInternal (~> 11.10.0)
- - GoogleUtilities/Environment (~> 8.0)
- - GoogleUtilities/Logger (~> 8.0)
- - FirebaseCoreInternal (11.10.0):
- - "GoogleUtilities/NSData+zlib (~> 8.0)"
- - FirebaseInstallations (11.10.0):
- - FirebaseCore (~> 11.10.0)
- - GoogleUtilities/Environment (~> 8.0)
- - GoogleUtilities/UserDefaults (~> 8.0)
+ - FirebaseCore (11.15.0):
+ - FirebaseCoreInternal (~> 11.15.0)
+ - GoogleUtilities/Environment (~> 8.1)
+ - GoogleUtilities/Logger (~> 8.1)
+ - FirebaseCoreInternal (11.15.0):
+ - "GoogleUtilities/NSData+zlib (~> 8.1)"
+ - FirebaseInstallations (11.15.0):
+ - FirebaseCore (~> 11.15.0)
+ - GoogleUtilities/Environment (~> 8.1)
+ - GoogleUtilities/UserDefaults (~> 8.1)
- PromisesObjC (~> 2.4)
- - FirebaseMessaging (11.10.0):
- - FirebaseCore (~> 11.10.0)
+ - FirebaseMessaging (11.15.0):
+ - FirebaseCore (~> 11.15.0)
- FirebaseInstallations (~> 11.0)
- GoogleDataTransport (~> 10.0)
- - GoogleUtilities/AppDelegateSwizzler (~> 8.0)
- - GoogleUtilities/Environment (~> 8.0)
- - GoogleUtilities/Reachability (~> 8.0)
- - GoogleUtilities/UserDefaults (~> 8.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
+ - GoogleUtilities/Environment (~> 8.1)
+ - GoogleUtilities/Reachability (~> 8.1)
+ - GoogleUtilities/UserDefaults (~> 8.1)
- nanopb (~> 3.30910.0)
- Flutter (1.0.0)
- flutter_native_splash (2.4.3):
@@ -63,8 +65,6 @@ PODS:
- FlutterMacOS
- flutter_uae_pass (0.0.1):
- Flutter
- - flutter_web_auth_2 (3.0.0):
- - Flutter
- fluttertoast (0.0.2):
- Flutter
- google_sign_in_ios (0.0.1):
@@ -135,9 +135,6 @@ PODS:
- video_player_avfoundation (0.0.1):
- Flutter
- FlutterMacOS
- - webview_flutter_wkwebview (0.0.1):
- - Flutter
- - FlutterMacOS
DEPENDENCIES:
- app_links (from `.symlinks/plugins/app_links/ios`)
@@ -151,7 +148,6 @@ DEPENDENCIES:
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`)
- flutter_uae_pass (from `.symlinks/plugins/flutter_uae_pass/ios`)
- - flutter_web_auth_2 (from `.symlinks/plugins/flutter_web_auth_2/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
@@ -161,7 +157,6 @@ DEPENDENCIES:
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
- - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`)
SPEC REPOS:
trunk:
@@ -204,8 +199,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin"
flutter_uae_pass:
:path: ".symlinks/plugins/flutter_uae_pass/ios"
- flutter_web_auth_2:
- :path: ".symlinks/plugins/flutter_web_auth_2/ios"
fluttertoast:
:path: ".symlinks/plugins/fluttertoast/ios"
google_sign_in_ios:
@@ -224,47 +217,43 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_ios/ios"
video_player_avfoundation:
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
- webview_flutter_wkwebview:
- :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
SPEC CHECKSUMS:
- app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
+ app_links: 3dbc685f76b1693c66a6d9dd1e9ab6f73d97dc0a
app_settings: 5127ae0678de1dcc19f2293271c51d37c89428b2
AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063
AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f
- appsflyer_sdk: ebe94dc3f00b07bdd001251dbc87879bda3c494a
- AppsFlyerFramework: fe5303bffcdfd941d5f570c2d21eaaea982e7bdc
+ appsflyer_sdk: 01d0cd834fe2fffd7f2372ab38690f7483587720
+ AppsFlyerFramework: ae7caf1688348f2d7a742037bd4fc6966d39d362
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
- Firebase: 1fe1c0a7d9aaea32efe01fbea5f0ebd8d70e53a2
- firebase_core: 2d4534e7b489907dcede540c835b48981d890943
- firebase_messaging: 75bc93a4df25faccad67f6662ae872ac9ae69b64
- FirebaseCore: 8344daef5e2661eb004b177488d6f9f0f24251b7
- FirebaseCoreInternal: ef4505d2afb1d0ebbc33162cb3795382904b5679
- FirebaseInstallations: 9980995bdd06ec8081dfb6ab364162bdd64245c3
- FirebaseMessaging: 2b9f56aa4ed286e1f0ce2ee1d413aabb8f9f5cb9
+ Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e
+ firebase_core: 995454a784ff288be5689b796deb9e9fa3601818
+ firebase_messaging: f4a41dd102ac18b840eba3f39d67e77922d3f707
+ FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e
+ FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4
+ FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843
+ FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_native_splash: 6cad9122ea0fad137d23137dd14b937f3e90b145
flutter_secure_storage_darwin: ce237a8775b39723566dc72571190a3769d70468
- flutter_uae_pass: 49160e01023a9815164b94a07b6f6ce3c79b1e56
- flutter_web_auth_2: 5c8d9dcd7848b5a9efb086d24e7a9adcae979c80
+ flutter_uae_pass: b643f2272a11abd3d1167f1760ad0adf35b31979
fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
- google_sign_in_ios: 205742c688aea0e64db9da03c33121694a365109
+ google_sign_in_ios: 00dfa94252eb10278b64828c81bcb7158a81a53a
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
- image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
+ image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
- path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
+ path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
- shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
- url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
- video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
- webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
+ shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
+ url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
+ video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
PODFILE CHECKSUM: 1959d098c91d8a792531a723c4a9d7e9f6a01e38
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..17462efd
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,774 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0158C53D8729FF3CAEDD63E1 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8321227CAF760684DE6073D /* Pods_RunnerTests.framework */; };
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ A77EABEF04180C888228A6B6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8FCB8E98366ECE496F9C6593 /* Pods_Runner.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 190F5FA1FAFE050ABAB22E9B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 36245650E9027DB0317FE314 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7692EB83BCA20EB7DB6148D9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 78330B354D57D0C89C5DB6C4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 8FCB8E98366ECE496F9C6593 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 938AA2808E77FAEF6A979134 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ CC3BC78662DC6B354B36AB2C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ D8321227CAF760684DE6073D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A77EABEF04180C888228A6B6 /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ B24AA7490A694194BE125B19 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0158C53D8729FF3CAEDD63E1 /* Pods_RunnerTests.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 128B0E4DC68FEAA53D10ACCE /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 36245650E9027DB0317FE314 /* Pods-Runner.debug.xcconfig */,
+ 78330B354D57D0C89C5DB6C4 /* Pods-Runner.release.xcconfig */,
+ 7692EB83BCA20EB7DB6148D9 /* Pods-Runner.profile.xcconfig */,
+ 938AA2808E77FAEF6A979134 /* Pods-RunnerTests.debug.xcconfig */,
+ 190F5FA1FAFE050ABAB22E9B /* Pods-RunnerTests.release.xcconfig */,
+ CC3BC78662DC6B354B36AB2C /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ 128B0E4DC68FEAA53D10ACCE /* Pods */,
+ C2DC67BE57D93B775E1BD572 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ C2DC67BE57D93B775E1BD572 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 8FCB8E98366ECE496F9C6593 /* Pods_Runner.framework */,
+ D8321227CAF760684DE6073D /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 73A2074E472182151AB9ED7A /* [CP] Check Pods Manifest.lock */,
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ B24AA7490A694194BE125B19 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 93BC14D0999CE33FAEA7EEE6 /* [CP] Check Pods Manifest.lock */,
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ 544AE9F477D1ED5A9363807B /* [CP] Embed Pods Frameworks */,
+ 4FA0629056C68E3C8427B28F /* [CP] Copy Pods Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1510;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 4FA0629056C68E3C8427B28F /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ inputPaths = (
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 544AE9F477D1ED5A9363807B /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ inputPaths = (
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 73A2074E472182151AB9ED7A /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 93BC14D0999CE33FAEA7EEE6 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = 9N5SRFUGK2;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = FCSC;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.2.5;
+ PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.frontend.ios;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 938AA2808E77FAEF6A979134 /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.uaeStat.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 190F5FA1FAFE050ABAB22E9B /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.uaeStat.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = CC3BC78662DC6B354B36AB2C /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.uaeStat.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = 9N5SRFUGK2;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = FCSC;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.2.5;
+ PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.frontend.ios;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = 9N5SRFUGK2;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = FCSC;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.2.5;
+ PRODUCT_BUNDLE_IDENTIFIER = ae.gov.fcsc.frontend.ios;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..919434a6
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..e3773d42
--- /dev/null
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..21a3cc14
--- /dev/null
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
new file mode 100644
index 00000000..62666446
--- /dev/null
+++ b/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import Flutter
+import UIKit
+
+@main
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000..f2e259c7
--- /dev/null
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..f3c28516
--- /dev/null
+++ b/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index c0d807cb..d12d8318 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -22,29 +22,22 @@
$(FLUTTER_BUILD_NAME)
CFBundleSignature
????
- LSApplicationQueriesSchemes
-
- uaepass
- uaepassqa
- uaepassdev
- uaepassstg
-
CFBundleURLTypes
-
- CFBundleURLSchemes
-
- fcscstats
-
-
-
- CFBundleURLName
- ae.gov.fcsc.frontend.ios
- CFBundleURLSchemes
-
- ae.gov.fcsc.frontend.ios
-
-
+
+ CFBundleURLSchemes
+
+ fcscstats
+
+
+
+ CFBundleURLName
+ ae.gov.fcsc.frontend.ios
+ CFBundleURLSchemes
+
+ ae.gov.fcsc.frontend.ios
+
+
CFBundleVersion
$(FLUTTER_BUILD_NUMBER)
@@ -56,6 +49,13 @@
ITSAppUsesNonExemptEncryption
+ LSApplicationQueriesSchemes
+
+ uaepass
+ uaepassqa
+ uaepassdev
+ uaepassstg
+
LSRequiresIPhoneOS
NSAppTransportSecurity
@@ -84,6 +84,8 @@
Main
UIStatusBarHidden
+ UIStatusBarStyle
+
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000..308a2a56
--- /dev/null
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/lib/config/my_router.dart b/lib/config/my_router.dart
index 9b59b19b..3b2d1940 100644
--- a/lib/config/my_router.dart
+++ b/lib/config/my_router.dart
@@ -13,6 +13,7 @@ import 'package:uae_stat/presentation/Screens/auth_verification/registration.dar
import 'package:uae_stat/presentation/Screens/auth_verification/terms&conditions.dart';
import 'package:uae_stat/presentation/Screens/charts/screens/chart_screen.dart';
import 'package:uae_stat/presentation/Screens/online_offline_verification/internet_check.dart';
+import 'package:uae_stat/presentation/routes/auth_routes/checkingUAEPass.dart';
import 'package:uae_stat/presentation/routes/auth_routes/fcsc_profile_linking.dart';
import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/Competitiveness/Detailedcompetitiveness.dart';
import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/Competitiveness/competitiveness.dart';
@@ -132,6 +133,10 @@ final GoRouter router = GoRouter(
path: '/myhomepage',
builder: (context, state) => MyHomePage(),
),
+ GoRoute(
+ path: '/checkingUAEPass',
+ builder: (context, state) => checkingUAEPass(),
+ ),
// GoRoute(
// path: '/DemoHome/:dataSets',
@@ -406,10 +411,24 @@ final GoRouter router = GoRouter(
),
],
redirect: (context, state) async {
+ // If UAE PASS redirected here with ?code=
+ final uri = state.uri;
+
+ // UAE PASS returned here with /login?code=xxxx
+ if (uri.path == '/login' && uri.queryParameters.containsKey('code')) {
+ final code = uri.queryParameters['code']!;
+ print("✨ UAE PASS Authorization Code Received: $code");
+
+ // Send user to /login with new param (so UI can read it)
+ return '/login?uaeCode=$code';
+ }
+
if (state.uri.path == '/SessionCheckScreen' ||
state.uri.path == '/login' ||
+ state.uri.path == '/checkingUAEPass' ||
state.uri.path == '/register' ||
state.uri.path.startsWith('/forgot-password/') ||
+ state.uri.path.startsWith('/forgot-password/') ||
state.uri.path == '/termsandconditions' ||
state.uri.path == '/privacy_policy' ||
state.uri.path == '/fcscprofilelinking') {
diff --git a/lib/presentation/Screens/auth_verification/registration.dart b/lib/presentation/Screens/auth_verification/registration.dart
index 85297e17..9c5f81a0 100644
--- a/lib/presentation/Screens/auth_verification/registration.dart
+++ b/lib/presentation/Screens/auth_verification/registration.dart
@@ -1569,19 +1569,19 @@ class _RegisterScreenState extends ConsumerState {
child: SizedBox(
width: screenwidth / 1,
child: ElevatedButton(
- // onPressed: isRegistering
- // ? null
- // : _registerUser?
- onPressed: () {
- if (isRegistering) {
- _registerUser;
- } else if (cameFromLinking) {
- oAuthOIDCLogin(context, ref,
- 'oidc'); //Open ID connect
- } else {
- null;
- }
- },
+ onPressed: isRegistering
+ ? null
+ : _registerUser,
+ // onPressed: () {
+ // if (isRegistering) {
+ // _registerUser;
+ // } else if (cameFromLinking) {
+ // oAuthOIDCLogin(context, ref,
+ // 'oidc'); //Open ID connect
+ // } else {
+ // null;
+ // }
+ // },
style: ElevatedButton.styleFrom(
backgroundColor: Color(
0xFFB68A34), // Brownish color for Register
diff --git a/lib/presentation/routes/auth_routes/OAthuLogin.dart b/lib/presentation/routes/auth_routes/OAthuLogin.dart
new file mode 100644
index 00000000..2dc1620f
--- /dev/null
+++ b/lib/presentation/routes/auth_routes/OAthuLogin.dart
@@ -0,0 +1,133 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:go_router/go_router.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:pocketbase/pocketbase.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+/// ===============================
+/// CONFIG
+/// ===============================
+const String pocketBaseUrl = 'https://pocket.fcsc.gov.ae'; // 🔁 change if needed
+
+/// ===============================
+/// LOGIN PAGE
+/// ===============================
+class LoginOAuthPage extends HookConsumerWidget
+ with WidgetsBindingObserver {
+ LoginOAuthPage({super.key});
+
+ final PocketBase pb = PocketBase(pocketBaseUrl);
+
+ /// ===============================
+ /// OAuth Auto-Close (App Resume)
+ /// ===============================
+ void _initOAuthAutoClose(BuildContext context) {
+ WidgetsBinding.instance.addObserver(
+ _OAuthLifecycle(
+ pb: pb,
+ context: context,
+ ),
+ );
+ }
+
+ @override
+ Widget build(BuildContext context, WidgetRef ref) {
+ /// Init lifecycle listener once
+ useEffect(() {
+ _initOAuthAutoClose(context);
+ return null;
+ }, const []);
+
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Login'),
+ ),
+ body: Padding(
+ padding: const EdgeInsets.all(24),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ /// GOOGLE LOGIN
+ SizedBox(
+ width: double.infinity,
+ child: OutlinedButton(
+ onPressed: () async {
+ await _startOAuth('google');
+ },
+ child: const Text('Sign in with Google'),
+ ),
+ ),
+
+ const SizedBox(height: 16),
+
+ /// APPLE LOGIN
+ SizedBox(
+ width: double.infinity,
+ child: OutlinedButton(
+ onPressed: () async {
+ await _startOAuth('apple');
+ },
+ child: const Text('Sign in with Apple'),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+
+ /// ===============================
+ /// Start OAuth (NON-BLOCKING)
+ /// ===============================
+ Future _startOAuth(String provider) async {
+ try {
+ final methods = await pb.collection('users').listAuthMethods();
+
+ final authProvider = methods.authProviders.firstWhere(
+ (p) => p.name == provider,
+ );
+
+ await launchUrl(
+ Uri.parse(authProvider.authUrl),
+ mode: LaunchMode.externalApplication,
+ );
+ } catch (e) {
+ debugPrint('❌ OAuth launch error: $e');
+ }
+ }
+}
+
+/// ===============================
+/// Lifecycle Observer
+/// ===============================
+class _OAuthLifecycle with WidgetsBindingObserver {
+ final PocketBase pb;
+ final BuildContext context;
+
+ _OAuthLifecycle({
+ required this.pb,
+ required this.context,
+ });
+
+ @override
+ void didChangeAppLifecycleState(AppLifecycleState state) {
+ if (state == AppLifecycleState.resumed) {
+ _handleResume();
+ }
+ }
+
+ void _handleResume() {
+ if (pb.authStore.isValid) {
+ debugPrint('✅ OAuth login detected');
+
+ final user = pb.authStore.model;
+ debugPrint('User ID: ${user?.id}');
+ debugPrint('Email: ${user?.data['email']}');
+
+ if (context.mounted) {
+ context.go('/myhomepage'); // 🔁 change route if needed
+ }
+ }
+ }
+}
diff --git a/lib/presentation/routes/auth_routes/checkingUAEPass.dart b/lib/presentation/routes/auth_routes/checkingUAEPass.dart
new file mode 100644
index 00000000..7a5c66a3
--- /dev/null
+++ b/lib/presentation/routes/auth_routes/checkingUAEPass.dart
@@ -0,0 +1,112 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_uae_pass/flutter_uae_pass.dart';
+
+class checkingUAEPass extends StatefulWidget {
+ const checkingUAEPass({super.key});
+
+ @override
+ State createState() => _checkingUAEPassState();
+}
+
+class _checkingUAEPassState extends State {
+ String? authCode;
+ String? accessToken;
+ ProfileData? profileData;
+
+ final _uaePass = UaePass();
+
+ @override
+ void initState() {
+ super.initState();
+ // _uaePass.setUpSandbox(); // This uses staging - correct for your staging app
+ _uaePass.setUpEnvironment(
+ clientId: "sandbox_stage", // from UAE PASS console
+ clientSecret: "sandbox_stage", // from UAE PASS console
+ isProduction: false, // staging environment
+ urlScheme: "fcscUaeStats", // 👈 this must match the scheme below
+ redirectUri: "fcscUaeStats://callback", // 👈 must match manifest + UAE PASS
+ scope: "urn:uae:digitalid:profile:general",
+ language: "en",
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ home: Scaffold(
+ appBar: AppBar(
+ title: const Text('UAE Pass'),
+ centerTitle: true,
+ ),
+ body: Center(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ MaterialButton(
+ onPressed: () => login(),
+ child: const Text('Sign in with UAE Pass'),
+ ),
+ const SizedBox(height: 100),
+ if (authCode != null)
+ ListTile(
+ title: const Text('Auth Code'),
+ subtitle: Text('${authCode?.substring(0, 6)}............'),
+ ),
+ if (accessToken != null)
+ ListTile(
+ title: const Text('Access Token'),
+ subtitle: Text('${accessToken?.substring(0, 6)}............'),
+ ),
+ if (profileData != null)
+ Column(
+ children: [
+ ListTile(
+ title: const Text('Emirates Id'),
+ subtitle: Text(profileData?.idn ?? ""),
+ ),
+ ListTile(
+ title: const Text('Full Name EN'),
+ subtitle: Text(profileData?.fullnameEN ?? ""),
+ ),
+ ListTile(
+ title: const Text('Full Name AR'),
+ subtitle: Text(profileData?.fullnameAR ?? ""),
+ ),
+ ListTile(
+ title: const Text('Mobile'),
+ subtitle: Text(profileData?.mobile ?? ""),
+ ),
+ ListTile(
+ title: const Text('Nationality EN'),
+ subtitle: Text(profileData?.nationalityEN ?? ""),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+
+ Future login() async {
+ authCode = null;
+ accessToken = null;
+ profileData = null;
+ setState(() {});
+ try {
+ authCode = await _uaePass.signIn();
+ accessToken = await _uaePass.getAccessToken(authCode ?? "");
+ profileData = await _uaePass.getProfile(accessToken ?? "");
+
+ setState(() {});
+ } catch (e) {
+ if (kDebugMode) {
+ print(e.toString());
+ }
+ }
+ setState(() {});
+ }
+}
\ No newline at end of file
diff --git a/lib/presentation/routes/auth_routes/flutter_inappwebview.dart b/lib/presentation/routes/auth_routes/flutter_inappwebview.dart
new file mode 100644
index 00000000..e69de29b
diff --git a/lib/presentation/routes/auth_routes/login_route.dart b/lib/presentation/routes/auth_routes/login_route.dart
index 18ee27aa..4e1c1b41 100644
--- a/lib/presentation/routes/auth_routes/login_route.dart
+++ b/lib/presentation/routes/auth_routes/login_route.dart
@@ -46,7 +46,7 @@ import 'package:uae_stat/config/api_config.dart';
import '../../components/indicators/locale_provider.dart';
import '../../components/my_toggle.dart';
-class LoginRoute extends HookConsumerWidget {
+class LoginRoute extends HookConsumerWidget with WidgetsBindingObserver{
final String? fromPage;
final Map? userInfo;
@@ -438,33 +438,46 @@ class LoginRoute extends HookConsumerWidget {
}
Future login(BuildContext context, ref) async {
- final email = profileData?.email ?? 'surendarsuri3450@gmail.com';
- final uuid = profileData?.uuid ?? 'eac45287-5e1b-4251-b338-6aa7f49464a0';
- await checkUserWithUhid(
- email: email ?? '',
- uuid: uuid ?? '',
- context: context,
- userInfo: profileData,
- );
+ // final email = profileData?.email ?? 'surendarsuri3450@gmail.com';
+ // final uuid = profileData?.uuid ?? 'eac45287-5e1b-4251-b338-6aa7f49464a0';
+ // await checkUserWithUhid(
+ // email: email ?? '',
+ // uuid: uuid ?? '',
+ // context: context,
+ // userInfo: profileData,
+ // );
authCode = null;
accessToken = null;
profileData = null;
try {
authCode = await _uaePass.signIn();
print('authCode $authCode');
- accessToken = await _uaePass.getAccessToken(authCode ?? "");
- print('accessToken $accessToken');
- profileData = await _uaePass.getProfile(accessToken ?? "");
- print('profileData $profileData');
- final email = profileData?.email ?? 'surendarsuri30@gmail.com';
- final uuid = profileData?.uuid ?? 'eac45287-5e1b-4251-b338-6aa7f49464a0';
-
- await checkUserWithUhid(
- email: email ?? '',
- uuid: uuid ?? '',
+ showDialog(
context: context,
- userInfo: profileData,
+ builder: (context) => AlertDialog(
+ title: const Text('Auth Code'),
+ content: Text('authCode: $authCode'),
+ actions: [
+ TextButton(
+ onPressed: () => Navigator.of(context).pop(),
+ child: const Text('OK'),
+ ),
+ ],
+ ),
);
+ // accessToken = await _uaePass.getAccessToken(authCode ?? "");
+ // print('accessToken $accessToken');
+ // profileData = await _uaePass.getProfile(accessToken ?? "");
+ // print('profileData $profileData');
+ // final email = profileData?.email ?? '';
+ // final uuid = profileData?.uuid ?? '';
+
+ // await checkUserWithUhid(
+ // email: email ?? '',
+ // uuid: uuid ?? '',
+ // context: context,
+ // userInfo: profileData,
+ // );
} catch (e) {
if (kDebugMode) {
print(e.toString());
@@ -490,27 +503,26 @@ class LoginRoute extends HookConsumerWidget {
print('platform $platform');
try {
print('platform $platform');
+ // final methods = await pb.collection('users').listAuthMethods();
+ // print(methods);
+ // final authProvider = methods.authProviders.firstWhere((p) => p.name == platform);
+ // print(authProvider);
+ // await launchUrl(
+ // Uri.parse(authProvider.authUrl),
+ // mode: LaunchMode.externalApplication,
+ // );
final authData =
await pb.collection('users').authWithOAuth2(platform, (url) async {
await launchUrl(url);
});
- // final authData = await pb.collection('users').authWithOAuth2(
- // platform, // 'google' or 'apple'
- // (providerUrl) async {
- // final Uri uri = Uri.parse(providerUrl.toString());
- //
- // // Inject redirect_url so PocketBase will redirect to the app when done
- // final newUri = uri.replace(queryParameters: {
- // ...uri.queryParameters,
- // 'redirect_url': deepLinkRedirect,
- // });
- //
- // // Open in external browser (ensures OS handles returning to app)
- // if (!await launchUrl(newUri, mode: LaunchMode.externalApplication)) {
- // throw 'Could not launch OAuth URL';
- // }
- // },
- // );
+ // final authData =
+ // await pb.collection('users').authWithOAuth2(platform, (url) async {
+ // await launchUrl(
+ // Uri.parse(url.toString()),
+ // mode: LaunchMode.platformDefault,
+ // );
+ // });
+
print('authData $authData');
// ✅ Check if authData is valid
if (authData.token.isNotEmpty && authData.record != null) {
@@ -771,13 +783,15 @@ class LoginRoute extends HookConsumerWidget {
// }
// }
- Future checkUserWithUhid1({
- required String email,
- required String uuid,
+ Future checkUserWithUhid({
+ required String code,
+ required ref,
+ // required String email,
+ // required String uuid,
required BuildContext context,
- required userInfo,
+ // required userInfo,
}) async {
- final url = Uri.parse('$apiUrl/api/checkUserWithUhid');
+ final url = Uri.parse('${apiUrl}api/checkUserWithUhid');
final headers = {
'Content-Type': 'application/json',
@@ -785,38 +799,135 @@ class LoginRoute extends HookConsumerWidget {
};
final body = jsonEncode({
- 'email': email,
- 'uuid': uuid,
+ // 'email': email,
+ // 'uuid': uuid,
+ 'code' : code
});
try {
final response = await http.post(url, headers: headers, body: body);
if (response.statusCode == 200) {
- final data = jsonDecode(response.body);
- print('✅ Success: $data');
- // final Map userInfoDetails = userInfo;
- final Map userInfoDetails = {
- "sub": "eac45287-5e1b-4251-b338-6aa7f49464a0",
- "fullnameAR": "سوريندر سوري",
- "gender": "Male",
- "spuuid": "ASdfsfdsgfg-4672n-4284jjbjvbckjsx",
- "mobile": "918056103381",
- "lastnameEN": "suri",
- "fullnameEN": "surendar suri",
- "uuid": "eac45287-5e1b-4251-b338-6aa7f49464a0",
- "lastnameAR": "سوري",
- "idn": "784000000009632",
- "nationalityEN": "ARE",
- "firstnameEN": "surendar",
- "userType": "SOP2",
- "nationalityAR": "اماراتى",
- "firstnameAR": "سوريندر",
- "email": "surendarsuri30@gmail.com"
- };
+ // final data = jsonDecode(response.body);
+ final apiParam = {
+ "data": {
+ "avatar": "",
+ "collectionId": "_pb_users_auth_",
+ "collectionName": "users",
+ "country_region": "",
+ "created": "2025-09-27 04:39:48.639Z",
+ "device_token": "",
+ "dob": "",
+ "emailVisibility": false,
+ "full_name": "",
+ "id": "iwxvax2m3ra8vry",
+ "is_oauth_login": 0,
+ "is_profile_completed": false,
+ "language": "",
+ "login_count": 4,
+ "pushed_notification": null,
+ "pw_reset_token": "",
+ "pw_reset_token_expiry": "",
+ "reviewed": false,
+ "role": "",
+ "status": "",
+ "theme": "",
+ "uname": "",
+ "updated": "2025-11-25 09:12:01.746Z",
+ "user_mail_verify": false,
+ "username": "users45431",
+ "verified": true
+ },
+ "expiresOn": 1765271521,
+ "message": "User found by email and UUID updated",
+ "status": "success",
+ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3NjUyNzE1MjEsImlkIjoiaXd4dmF4Mm0zcmE4dnJ5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.jSXeGByFWsPTv70nW2YvahZi8fYCzfibF8nWqhKYPA0"
- GoRouter.of(context).go('/fcscprofilelinking', extra: userInfoDetails);
+ };
+ print('✅ Success: $apiParam');
+ if (apiParam['token'] != null &&
+ apiParam['token'].toString().isNotEmpty &&
+ apiParam['status'] == 'success') {
+
+ print("✔ Token exists & login success!");
+
+ // final metaDetails = authData.meta;
+ final userDetails = apiParam['data'] as Map;
+ final token = apiParam['token'];
+ final userId = userDetails['id'];
+ final email = userDetails['email'] ?? '';
+ final uname = userDetails['uname'] ?? '';
+ final isProfileComplete = userDetails['is_profile_completed'] ?? false;
+ final loginCount = userDetails['login_count'] ?? 0;
+ // final expiresOn = apiParam['expiresOn'];
+
+ print("User ID: ${userId}");
+ print("Email: ${email}");
+ print("Email: ${isProfileComplete}");
+ print("Email: ${loginCount}");
+
+ final session = await context.loaderWithErrorDialog(
+ () => ref
+ .read(
+ authUseCaseProvider.notifier,
+ )
+ .googleAndAppleAuthencation(apiParam),
+ errorDialogBuilder: (
+ error, [
+ StackTrace? stackTrace,
+ ]) {
+ if (error == LoginError.invalidEmailPw) {
+ return context.simpleDialog(
+ title: context.translate(
+ 'Incorrect Credentials',
+ 'أوراق غير صحيحة',
+ ),
+ content: context.translate(
+ 'Your email or password is invalid. Please try again.',
+ 'بريدك الإلكتروني أو كلمة المرور غير صالحة. حاول مرة اخرى.',
+ ),
+ );
+ }
+ return context.simpleDialog();
+ },
+ );
+
+ print("sessionTST - $session");
+
+ await loginCountApi(userId!);
+ await updateOAuthUserDetails(userId!, uname, ref, token);
+ // await saveUserId(userId!, loginCount);
+ await getDeviceToken(context, userId, ref, token);
+ await initializeTheme(context, ref, userId);
+
+ // final se = _sessionEntityFromPocketbaseRecord(authData);
+ // await _LocalAuthRepo.storeLocally(se);
+
+ // Extract intendedPath from query parameters (if coming from redirect)
+ final String? intendedPath =
+ GoRouterState.of(context).uri.queryParameters['intendedPath'];
+ print("Extracted intendedPath after login: $intendedPath");
+
+ if (isProfileComplete) {
+ print('Redirecting to Home / Intended Path');
+ // **Set Default Locale in Provider**
+ if (preferredLanguage == 'ar') {
+ ref.read(localeProvider.notifier).setLocale(const Locale('ar'));
+ } else {
+ ref.read(localeProvider.notifier).setLocale(const Locale('en'));
+ }
+
+ context.go(intendedPath ?? '/myhomepage');
+ } else {
+ print('Redirecting to Profile Setup');
+
+ context.go('/profile/$userId');
+ }
+ } else {
+ print("❌ Login failed: Invalid authData");
+ }
} else {
+ GoRouter.of(context).go('/fcscprofilelinking', extra: userInfo);
print('❌ Error: ${response.statusCode} - ${response.body}');
}
} catch (e) {
@@ -824,17 +935,166 @@ class LoginRoute extends HookConsumerWidget {
}
}
- Future checkUserWithUhid({
- required String email,
- required String uuid,
- required BuildContext context,
- required userInfo,
- }) async {
- print('checkUserWithUhid');
+ String buildUaepassAuthorizationUrl() {
+ const String authorizeEndpoint = "https://stg-id.uaepass.ae/idshub/authorize";
+ const String clientId = "sandbox_stage";
+ const String scope = "urn:uae:digitalid:profile:general";
+ const String redirectUri = "http://localhost:56215/#/login";
+ const String acrValues = "urn:safelayer:tws:policies:authentication:level:low";
- signInWithUAEPASS();
+ // Generate random state (recommended)
+ final String state = DateTime.now().millisecondsSinceEpoch.toString();
+
+ final Uri uri = Uri.parse(authorizeEndpoint).replace(
+ queryParameters: {
+ "response_type": "code",
+ "client_id": clientId,
+ "scope": scope,
+ "redirect_uri": redirectUri,
+ "state": state,
+ "acr_values": acrValues,
+ },
+ );
+ print('UAEPASS URL : $uri');
+ return uri.toString();
}
+ Future openUaepassLogin(BuildContext context) async {
+ final authUrl = buildUaepassAuthorizationUrl(); // Now this exists
+
+ print('UAE Pass :$authUrl');
+
+ final uri = Uri.parse(authUrl);
+
+ if (!await launchUrl(uri, mode: LaunchMode.externalApplication)) {
+ throw 'Could not launch UAE PASS URL';
+ }
+
+ // Navigator.push(
+ // context,
+ // MaterialPageRoute(
+ // builder: (_) => Scaffold(
+ // appBar: AppBar(title: const Text("UAE PASS Login")),
+ // body: InAppWebView(
+ // initialUrlRequest: URLRequest(
+ // url: WebUri.uri(Uri.parse(authUrl)),
+ // ),
+ // initialOptions: InAppWebViewGroupOptions(
+ // crossPlatform: InAppWebViewOptions(
+ // useShouldOverrideUrlLoading: true,
+ // javaScriptEnabled: true,
+ // ),
+ // android: AndroidInAppWebViewOptions(),
+ // ios: IOSInAppWebViewOptions(),
+ // ),
+ // ),
+ // ),
+ // ),
+ // );
+ }
+
+ Future