diff --git a/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_deps b/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_deps
index adb916b..b354ddd 100755
Binary files a/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_deps and b/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_deps differ
diff --git a/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_log b/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_log
index ab45535..a5a026d 100755
--- a/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_log
+++ b/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_log
@@ -7,3 +7,4 @@
51 3269 1741777920308084919 CMakeFiles/native-lib.dir/native-lib.cpp.o 24041561fb88653e
3270 3846 1741777920881053528 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/arm64-v8a/libnative-lib.so d42fa60474264ab0
221 3448 1743588458940410891 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/arm64-v8a/libnative-lib.so d42fa60474264ab0
+44 596 1749722032357945285 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/arm64-v8a/libnative-lib.so d42fa60474264ab0
diff --git a/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/configure_fingerprint.bin
index 2e22541..dd1c4ca 100644
--- a/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/configure_fingerprint.bin
@@ -2,28 +2,28 @@ C/C++ Structured Log
}/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint 2 2~
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint Զ2 2~
|
-z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/android_gradle_build.json 2
+z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/android_gradle_build.json ն2
2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/android_gradle_build_mini.json 2 2p
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/android_gradle_build_mini.json ն2 2p
n
-l/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/build.ninja 2 2t
+l/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/build.ninja ն2 2t
r
-p/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/build.ninja.txt 2y
+p/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/build.ninja.txt ն2y
w
-u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/build_file_index.txt 2
^ 2z
+u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/build_file_index.txt ն2
^ 2z
x
-v/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/compile_commands.json 2 2~
+v/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/compile_commands.json ն2 2~
|
-z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/compile_commands.json.bin 2 2
+z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/compile_commands.json.bin ն2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/metadata_generation_command.txt 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/metadata_generation_command.txt ն2
2w
u
-s/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/prefab_config.json 2
( 2|
+s/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/prefab_config.json ն2
( 2|
z
-x/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/symbol_folder_index.txt 2
o 2b
+x/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/symbol_folder_index.txt ն2
o 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt 2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt ն2
Ў2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_deps b/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_deps
index 8d38981..de40bf5 100755
Binary files a/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_deps and b/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_deps differ
diff --git a/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_log b/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_log
index 7e1d6d5..922b64c 100755
--- a/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_log
+++ b/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/.ninja_log
@@ -7,3 +7,4 @@
8 1314 1741777922363581612 CMakeFiles/native-lib.dir/native-lib.cpp.o b06dc4e75654908c
1315 1463 1741777922497132871 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/armeabi-v7a/libnative-lib.so 8fa1d32c8851c815
10 278 1743588460622403369 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/armeabi-v7a/libnative-lib.so 8fa1d32c8851c815
+5 89 1749722034408576808 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/armeabi-v7a/libnative-lib.so 8fa1d32c8851c815
diff --git a/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/configure_fingerprint.bin
index 6324f92..abaa30e 100644
--- a/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log
/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint 2 2
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint 2 2
~
-|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/android_gradle_build.json 2 2
+|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/android_gradle_build.json 2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/android_gradle_build_mini.json 2 2r
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/android_gradle_build_mini.json 2 2r
p
-n/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/build.ninja 2 2v
+n/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/build.ninja 2 2v
t
-r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/build.ninja.txt 2{
+r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/build.ninja.txt 2{
y
-w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/build_file_index.txt 2
^ 2|
+w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/build_file_index.txt 2
^ 2|
z
-x/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/compile_commands.json 2 2
+x/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/compile_commands.json 2 2
~
-|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/compile_commands.json.bin 2 2
+|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/compile_commands.json.bin 2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/metadata_generation_command.txt 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/metadata_generation_command.txt 2
2y
w
-u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/prefab_config.json 2
( 2~
+u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/prefab_config.json 2
( 2~
|
-z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/symbol_folder_index.txt 2
q 2b
+z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/armeabi-v7a/symbol_folder_index.txt 2
q 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt 2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt 2
Ў2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_deps b/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_deps
index 47f15e2..ef46c65 100755
Binary files a/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_deps and b/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_deps differ
diff --git a/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_log b/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_log
index f605c80..0ccc6e4 100755
--- a/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_log
+++ b/android/app/.cxx/Debug/6a58wo5c/x86/.ninja_log
@@ -7,3 +7,4 @@
7 1419 1741777924028952436 CMakeFiles/native-lib.dir/native-lib.cpp.o b6bd31d87f9955ed
1419 1638 1741777924251456785 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/x86/libnative-lib.so a74e7c4bfd9047a
12 286 1743588461089758411 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/x86/libnative-lib.so a74e7c4bfd9047a
+4 118 1749722034570552110 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/x86/libnative-lib.so a74e7c4bfd9047a
diff --git a/android/app/.cxx/Debug/6a58wo5c/x86/configure_fingerprint.bin b/android/app/.cxx/Debug/6a58wo5c/x86/configure_fingerprint.bin
index 3da418b..3ab9b8b 100644
--- a/android/app/.cxx/Debug/6a58wo5c/x86/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/6a58wo5c/x86/configure_fingerprint.bin
@@ -2,28 +2,28 @@ C/C++ Structured Log{
y
w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ӏ2 2x
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ɷ2 2x
v
-t/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/android_gradle_build.json ӏ2
+t/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/android_gradle_build.json ɷ2
2}
{
-y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/android_gradle_build_mini.json ӏ2 2j
+y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/android_gradle_build_mini.json ɷ2 2j
h
-f/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/build.ninja ӏ2 2n
+f/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/build.ninja ɷ2 2n
l
-j/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/build.ninja.txt ӏ2s
+j/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/build.ninja.txt ɷ2s
q
-o/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/build_file_index.txt ӏ2
^ 2t
+o/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/build_file_index.txt ɷ2
^ 2t
r
-p/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/compile_commands.json ӏ2 2x
+p/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/compile_commands.json ɷ2 2x
v
-t/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/compile_commands.json.bin ӏ2 2~
+t/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/compile_commands.json.bin ɷ2 2~
|
-z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/metadata_generation_command.txt ԏ2
+z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/metadata_generation_command.txt ɷ2
2q
o
-m/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/prefab_config.json ԏ2
( 2v
+m/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/prefab_config.json ɷ2
( 2v
t
-r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/symbol_folder_index.txt ԏ2
i 2b
+r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86/symbol_folder_index.txt ɷ2
i 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt ԏ2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt ɷ2
Ў2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_deps b/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_deps
index 8ac5f06..bda3959 100755
Binary files a/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_deps and b/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_deps differ
diff --git a/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_log b/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_log
index 0d2101c..5459a34 100755
--- a/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_log
+++ b/android/app/.cxx/Debug/6a58wo5c/x86_64/.ninja_log
@@ -7,3 +7,4 @@
31 1333 1741777925679630953 CMakeFiles/native-lib.dir/native-lib.cpp.o cd23b75ae14e319a
1334 1500 1741777925862774067 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/x86_64/libnative-lib.so e95127d82673baa5
22 263 1743588461662904639 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/x86_64/libnative-lib.so e95127d82673baa5
+5 71 1749722034665043085 /Users/hamzaaleghwairyeen/development/App/driver_sefer/build/app/intermediates/cxx/Debug/6a58wo5c/obj/x86_64/libnative-lib.so e95127d82673baa5
diff --git a/android/app/.cxx/Debug/6a58wo5c/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/6a58wo5c/x86_64/configure_fingerprint.bin
index ad0b00d..153b7cd 100644
--- a/android/app/.cxx/Debug/6a58wo5c/x86_64/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/6a58wo5c/x86_64/configure_fingerprint.bin
@@ -2,28 +2,28 @@ C/C++ Structured Log~
|
z/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ̴2 2{
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ߷2 2{
y
-w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/android_gradle_build.json ̴2
+w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/android_gradle_build.json ߷2
2
~
-|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/android_gradle_build_mini.json ̴2 2m
+|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/android_gradle_build_mini.json ߷2 2m
k
-i/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/build.ninja ̴2 2q
+i/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/build.ninja ߷2 2q
o
-m/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/build.ninja.txt ̴2v
+m/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/build.ninja.txt ߷2v
t
-r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/build_file_index.txt ʹ2
^ 2w
+r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/build_file_index.txt ߷2
^ 2w
u
-s/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/compile_commands.json ʹ2 2{
+s/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/compile_commands.json ߷2 2{
y
-w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/compile_commands.json.bin ʹ2 2
+w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/compile_commands.json.bin ߷2 2
-}/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/metadata_generation_command.txt ʹ2
+}/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/metadata_generation_command.txt ߷2
2t
r
-p/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/prefab_config.json ʹ2
( 2y
+p/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/prefab_config.json ߷2
( 2y
w
-u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/symbol_folder_index.txt ʹ2
l 2b
+u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/Debug/6a58wo5c/x86_64/symbol_folder_index.txt ߷2
l 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt ʹ2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt ߷2
Ў2
\ No newline at end of file
diff --git a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/configure_fingerprint.bin
index e0bb041..a240df1 100644
--- a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/configure_fingerprint.bin
+++ b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log
/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint 2 2
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ܗϢ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/android_gradle_build.json 2 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/android_gradle_build.json ܗϢ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/android_gradle_build_mini.json 2 2y
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/android_gradle_build_mini.json ܗϢ2 2y
w
-u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/build.ninja 2 2}
+u/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/build.ninja ܗϢ2 2}
{
-y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/build.ninja.txt 2
+y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/build.ninja.txt ܗϢ2
-~/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/build_file_index.txt 2
^ 2
+~/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/build_file_index.txt ܗϢ2
^ 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/compile_commands.json 2 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/compile_commands.json ܗϢ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/compile_commands.json.bin 2 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/compile_commands.json.bin ܗϢ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/metadata_generation_command.txt 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/metadata_generation_command.txt ܗϢ2
2
~
-|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/prefab_config.json 2
( 2
+|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/prefab_config.json ܗϢ2
( 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/symbol_folder_index.txt 2
x 2b
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/arm64-v8a/symbol_folder_index.txt ܗϢ2
x 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt 2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt ܗϢ2
Ў2
\ No newline at end of file
diff --git a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/configure_fingerprint.bin
index c6c67c2..8be1766 100644
--- a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/configure_fingerprint.bin
+++ b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log
/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint 2 2
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint Ϣ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/android_gradle_build.json 2 ߣ2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/android_gradle_build.json Ϣ2 ߣ2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/android_gradle_build_mini.json 2 2{
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/android_gradle_build_mini.json Ϣ2 2{
y
-w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/build.ninja 2 Ң2
+w/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/build.ninja Ϣ2 Ң2
}
-{/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/build.ninja.txt 2
+{/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/build.ninja.txt Ϣ2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/build_file_index.txt 2
^ 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/build_file_index.txt Ϣ2
^ 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/compile_commands.json 2 Ţ2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/compile_commands.json Ϣ2 Ţ2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/compile_commands.json.bin 2 Ţ2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/compile_commands.json.bin Ϣ2 Ţ2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/metadata_generation_command.txt 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/metadata_generation_command.txt Ϣ2
2
-~/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/prefab_config.json 2
( 2
+~/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/prefab_config.json Ϣ2
( 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/symbol_folder_index.txt 2
z 2b
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/armeabi-v7a/symbol_folder_index.txt Ϣ2
z 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt 2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt Ϣ2
Ў2
\ No newline at end of file
diff --git a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/configure_fingerprint.bin
index b638f67..76023f7 100644
--- a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/configure_fingerprint.bin
+++ b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/configure_fingerprint.bin
@@ -2,28 +2,28 @@ C/C++ Structured Log
/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint 2 2
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint Ϣ2 2
-}/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/android_gradle_build.json 2
+}/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/android_gradle_build.json Ϣ2
2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/android_gradle_build_mini.json 2 2s
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/android_gradle_build_mini.json Ϣ2 2s
q
-o/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/build.ninja 2DŽ 2w
+o/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/build.ninja Ϣ2DŽ 2w
u
-s/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/build.ninja.txt 2|
+s/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/build.ninja.txt Ϣ2|
z
-x/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/build_file_index.txt 2
^ 2}
+x/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/build_file_index.txt Ϣ2
^ 2}
{
-y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/compile_commands.json 2 2
+y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/compile_commands.json Ϣ2 2
-}/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/compile_commands.json.bin 2 2
+}/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/compile_commands.json.bin Ϣ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/metadata_generation_command.txt 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/metadata_generation_command.txt Ϣ2
2z
x
-v/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/prefab_config.json 2
( 2
+v/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/prefab_config.json Ϣ2
( 2
}
-{/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/symbol_folder_index.txt 2
r 2b
+{/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86/symbol_folder_index.txt Ϣ2
r 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt 2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt Ϣ2
Ў2
\ No newline at end of file
diff --git a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/configure_fingerprint.bin b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/configure_fingerprint.bin
index c77f9fa..65402c8 100644
--- a/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/configure_fingerprint.bin
+++ b/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log
/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint 2 2
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint Ϣ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/android_gradle_build.json 2 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/android_gradle_build.json Ϣ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/android_gradle_build_mini.json 2 2v
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/android_gradle_build_mini.json Ϣ2 2v
t
-r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/build.ninja 2ф 2z
+r/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/build.ninja Ϣ2ф 2z
x
-v/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/build.ninja.txt 2
+v/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/build.ninja.txt Ϣ2
}
-{/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/build_file_index.txt 2
^ 2
+{/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/build_file_index.txt Ϣ2
^ 2
~
-|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/compile_commands.json 2 2
+|/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/compile_commands.json Ϣ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/compile_commands.json.bin 2 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/compile_commands.json.bin Ϣ2 2
-/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/metadata_generation_command.txt 2
+/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/metadata_generation_command.txt Ϣ2
2}
{
-y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/prefab_config.json 2
( 2
+y/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/prefab_config.json Ϣ2
( 2
-~/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/symbol_folder_index.txt 2
u 2b
+~/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/.cxx/RelWithDebInfo/4y6h5l4y/x86_64/symbol_folder_index.txt Ϣ2
u 2b
`
-^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt 2
Ў2
\ No newline at end of file
+^/Users/hamzaaleghwairyeen/development/App/driver_sefer/android/app/src/main/cpp/CMakeLists.txt Ϣ2
Ў2
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 0e3f6c1..3123846 100755
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -66,8 +66,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = 23
targetSdk = flutter.targetSdkVersion
- versionCode = 142
- versionName = '2.0.142'
+ versionCode = 143
+ versionName = '2.0.143'
multiDexEnabled =true
}
sourceSets {
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index d4f5feb..5261b2d 100755
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -35,7 +35,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 105
+ 106
CFBundleSignature
????
CFBundleURLTypes
@@ -50,7 +50,7 @@
CFBundleVersion
- 5.0.105
+ 5.0.106
FirebaseAppDelegateProxyEnabled
NO
GMSApiKey
diff --git a/lib/controller/auth/captin/login_captin_controller.dart b/lib/controller/auth/captin/login_captin_controller.dart
index 18e4adb..a75e4fa 100755
--- a/lib/controller/auth/captin/login_captin_controller.dart
+++ b/lib/controller/auth/captin/login_captin_controller.dart
@@ -232,10 +232,7 @@ class LoginDriverController extends GetxController {
Log.print('(BoxName.emailDriver): ${box.read(BoxName.emailDriver)}');
var res = await CRUD().get(link: AppLink.loginFromGoogleCaptin, payload: {
- 'email': email.toString().contains('@')
- // ? (box.read(BoxName.emailDriver))
- ? (email)
- : email,
+ 'email': email,
'id': driverID,
});
diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart
index a1bbf0a..d772bfb 100755
--- a/lib/controller/firebase/firbase_messge.dart
+++ b/lib/controller/firebase/firbase_messge.dart
@@ -408,7 +408,8 @@ class FirebaseMessagesController extends GetxController {
var encryptedKey = await storage.read(key: 'FCM_PRIVATE_KEY');
// Log.print('encryptedKey: ${encryptedKey}');
if (encryptedKey != null) {
- serviceAccountKeyJson = (encryptedKey);
+ serviceAccountKeyJson =
+ EncryptionHelper.instance.decryptData(encryptedKey);
// Log.print('serviceAccountKeyJson: ${serviceAccountKeyJson}');
} else {
print('🔴 Error: FCM_PRIVATE_KEY not found in Secure Storage');
diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart
index b8c7678..b08d583 100755
--- a/lib/controller/functions/crud.dart
+++ b/lib/controller/functions/crud.dart
@@ -4,7 +4,6 @@ import 'package:secure_string_operations/secure_string_operations.dart';
import 'package:sefer_driver/constant/box_name.dart';
import 'package:sefer_driver/constant/links.dart';
import 'package:sefer_driver/controller/auth/captin/login_captin_controller.dart';
-import 'package:sefer_driver/controller/functions/add_error.dart';
import 'package:sefer_driver/main.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
@@ -44,9 +43,9 @@ class CRUD {
'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}'
},
);
- // print(response.request);
- // Log.print('response.body: ${response.body}');
- // print(payload);
+ print(response.request);
+ Log.print('response.body: ${response.body}');
+ print(payload);
if (response.statusCode == 200) {
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
@@ -82,7 +81,7 @@ class CRUD {
}) async {
var s = await LoginDriverController().getJwtWallet();
final hmac = box.read(BoxName.hmac);
- Log.print('hmac: ${hmac}');
+ // Log.print('hmac: ${hmac}');
var url = Uri.parse(
link,
);
@@ -95,10 +94,9 @@ class CRUD {
'X-HMAC-Auth': hmac.toString(),
},
);
- // print(response.request);
- // // Log.print('response.request: ${response.request}');
- // Log.print('response.body: ${response.body}');
- // print(payload);
+ Log.print('response.request: ${response.request}');
+ Log.print('response.body: ${response.body}');
+ print(payload);
if (response.statusCode == 200) {
var jsonData = jsonDecode(response.body);
if (jsonData['status'] == 'success') {
@@ -145,9 +143,9 @@ class CRUD {
'X-HMAC-Auth': hmac.toString(),
},
);
- // print(response.request);
- // Log.print('response.body: ${response.body}');
- // print(payload);
+ print(response.request);
+ Log.print('response.body: ${response.body}');
+ print(payload);
if (response.statusCode == 200) {
try {
var jsonData = jsonDecode(response.body);
@@ -203,9 +201,9 @@ class CRUD {
// 'Authorization': 'Bearer ${box.read(BoxName.jwt)}'
},
);
- // print(response.request);
- // Log.print('response.body: ${response.body}');
- // print(payload);
+ print(response.request);
+ Log.print('response.body: ${response.body}');
+ print(payload);
if (response.statusCode == 200) {
try {
var jsonData = jsonDecode(response.body);
diff --git a/lib/controller/functions/location_controller.dart b/lib/controller/functions/location_controller.dart
index 5179fb3..c7fd7dc 100755
--- a/lib/controller/functions/location_controller.dart
+++ b/lib/controller/functions/location_controller.dart
@@ -4,10 +4,12 @@ import 'dart:math';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
+import 'package:sefer_driver/constant/table_names.dart';
import '../../constant/box_name.dart';
import '../../constant/links.dart';
import '../../main.dart';
+import '../../print.dart';
import '../home/captin/home_captain_controller.dart';
import '../home/payment/captain_wallet_controller.dart';
import 'crud.dart';
@@ -72,6 +74,8 @@ class LocationController extends GetxController {
}
int _insertCounter = 0;
+ double? _lastSpeed;
+ DateTime? _lastSpeedTime;
Future startLocationUpdates() async {
if (box.read(BoxName.driverID) != null) {
@@ -111,13 +115,17 @@ class LocationController extends GetxController {
if (_lastSavedPosition == null ||
_calculateDistanceInMeters(_lastSavedPosition!, myLocation) >=
10) {
+ double currentSpeed = speed; // m/s
+ double? acceleration = _calculateAcceleration(currentSpeed);
+
await sql.insertData({
'driver_id': box.read(BoxName.driverID).toString(),
'latitude': myLocation.latitude,
'longitude': myLocation.longitude,
+ 'acceleration': acceleration ?? 0.0,
'created_at': DateTime.now().toIso8601String(),
'updated_at': DateTime.now().toIso8601String(),
- }, 'car_locations');
+ }, TableName.behavior);
_lastSavedPosition = myLocation;
}
@@ -125,6 +133,7 @@ class LocationController extends GetxController {
// ✅ إدخال للسيرفر كل دقيقة
_insertCounter++;
+ Log.print('_insertCounter: ${_insertCounter}');
if (_insertCounter >= 12) {
_insertCounter = 0;
await CRUD().post(
@@ -199,4 +208,22 @@ class LocationController extends GetxController {
2;
return 12742 * 1000 * asin(sqrt(a)); // meters
}
+
+ double? _calculateAcceleration(double currentSpeed) {
+ final now = DateTime.now();
+ if (_lastSpeed != null && _lastSpeedTime != null) {
+ final deltaTime =
+ now.difference(_lastSpeedTime!).inMilliseconds / 1000.0; // seconds
+ if (deltaTime > 0) {
+ final acceleration = (currentSpeed - _lastSpeed!) / deltaTime;
+ _lastSpeed = currentSpeed;
+ _lastSpeedTime = now;
+ return double.parse(acceleration.toStringAsFixed(2));
+ }
+ }
+
+ _lastSpeed = currentSpeed;
+ _lastSpeedTime = now;
+ return null;
+ }
}
diff --git a/lib/controller/home/captin/home_captain_controller.dart b/lib/controller/home/captin/home_captain_controller.dart
index 33f311e..4837938 100755
--- a/lib/controller/home/captin/home_captain_controller.dart
+++ b/lib/controller/home/captin/home_captain_controller.dart
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:sefer_driver/constant/box_name.dart';
@@ -90,7 +91,8 @@ class HomeCaptainController extends GetxController {
isActive = !isActive;
if (isActive) {
if (double.parse(totalPoints) > -300) {
- // locationController.startLocationUpdates();
+ locationController.startLocationUpdates();
+ HapticFeedback.heavyImpact();
// locationBackController.startBackLocation();
activeStartTime = DateTime.now();
activeTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart
index 2a29ad5..a04e7f7 100755
--- a/lib/controller/home/captin/map_driver_controller.dart
+++ b/lib/controller/home/captin/map_driver_controller.dart
@@ -173,6 +173,7 @@ class MapDriverController extends GetxController {
cancelTripFromDriverAfterApplied() async {
if (formKeyCancel.currentState!.validate()) {
+ box.write(BoxName.statusDriverLocation, 'off');
FirebaseMessagesController().sendNotificationToDriverMAP(
"Cancel Trip from driver",
"Trip Cancelled from driver. We are looking for a new driver. Please wait."
diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart
index 6e5d1ac..d83ebaa 100755
--- a/lib/controller/local/translations.dart
+++ b/lib/controller/local/translations.dart
@@ -65,7 +65,7 @@ class MyTranslation extends Translations {
"Order Applied": "تم تطبيق الطلب",
//firebase above
- "cancel": "إلغاء",
+ "cancel": "إلغاء", "Syria": "سوريا",
"Security Warning": "تحذير أمني",
"Potential security risks detected. The application will close in @seconds seconds.":
"تم اكتشاف مخاطر أمنية محتملة. سيتم إغلاق التطبيق خلال @seconds ثانية.",
diff --git a/lib/main.dart b/lib/main.dart
index 1146e4f..e0d5df4 100755
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -44,11 +44,17 @@ final GlobalKey navigatorKey = GlobalKey();
@pragma('vm:entry-point')
Future backgroundMessageHandler(RemoteMessage message) async {
+ WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
-
+ if (!await FlutterOverlayWindow.isPermissionGranted()) {
+ // بإمكانك تجاهل الطلب في الخلفية والاكتفاء بالتنبيه
+ Log.print("Overlay permission not granted; showing only notification.");
+ }
if (Platform.isAndroid) {
if (message.notification != null && message.notification!.title != null) {
- if (message.notification?.title == 'Order'.tr ||
+ Log.print('message.notification!.title: ${message.notification!.title}');
+
+ if (message.notification?.title == 'طلب' ||
message.notification?.title == 'OrderSpeed') {
var myListString = message.data['DriverList'] ?? '[]';
Log.print('myListString: $myListString');
@@ -57,6 +63,7 @@ Future backgroundMessageHandler(RemoteMessage message) async {
List myList;
try {
myList = jsonDecode(myListString) as List;
+ Log.print('myList: ${myList}');
} catch (e) {
Log.print('Error decoding JSON: $e');
myList = [];
@@ -74,9 +81,9 @@ Future backgroundMessageHandler(RemoteMessage message) async {
flag: OverlayFlag.focusPointer,
// visibility: NotificationVisibility.visibilityPublic,
positionGravity: PositionGravity.auto,
- height: 700,
+ height: 1300,
width: WindowSize.matchParent,
- startPosition: const OverlayPosition(0, -150),
+ startPosition: const OverlayPosition(0, -40),
);
NotificationController().showNotification(
message.notification!.title.toString(),
@@ -175,10 +182,10 @@ class _MyAppState extends State {
FirebaseMessagesController().getToken(),
]);
- PermissionStatus status1 = await Permission.location.status;
- if (status1.isGranted) {
- await LocationController().startLocationUpdates();
- }
+ // PermissionStatus status1 = await Permission.location.status;
+ // if (status1.isGranted) {
+ // await LocationController().startLocationUpdates();
+ // }
}
String? key = (await storage.read(key: BoxName.payMobApikey));
diff --git a/lib/models/db_sql.dart b/lib/models/db_sql.dart
index ea3462f..ed5d1b5 100755
--- a/lib/models/db_sql.dart
+++ b/lib/models/db_sql.dart
@@ -19,9 +19,14 @@ class DbSql {
String path = join(await getDatabasesPath(), 'my_database.db');
return await openDatabase(
path,
- version: 1,
- onCreate: (db, version) async {
- await db.execute('''
+ version: 3,
+ onCreate: (db, version) async => await _createTables(db),
+ onUpgrade: (db, oldVersion, newVersion) async => await _createTables(db),
+ );
+ }
+
+ Future _createTables(Database db) async {
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.carLocations}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
driver_id TEXT,
@@ -31,7 +36,7 @@ class DbSql {
updated_at TEXT
)
''');
- await db.execute('''
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.placesFavorite}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
latitude REAL,
@@ -40,7 +45,7 @@ class DbSql {
rate TEXT
)
''');
- await db.execute('''
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.recentLocations}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
latitude REAL,
@@ -49,7 +54,7 @@ class DbSql {
rate TEXT
)
''');
- await db.execute('''
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.driverOrdersRefuse}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_id TEXT UNIQUE,
@@ -57,7 +62,7 @@ class DbSql {
driver_id TEXT
)
''');
- await db.execute('''
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.rideLocation}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_id TEXT ,
@@ -66,29 +71,31 @@ class DbSql {
lng TEXT
)
''');
- await db.execute('''
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.faceDetectTimes}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
faceDetectTimes INTEGER
)
''');
- await db.execute('''
- CREATE TABLE IF NOT EXISTS ${TableName.behavior}(
+
+ await db.execute('''
+ CREATE TABLE IF NOT EXISTS ${TableName.behavior} (
id INTEGER PRIMARY KEY AUTOINCREMENT,
- speed REAL,
- lat REAL,
- lng REAL,
+ driver_id TEXT,
+ latitude REAL,
+ longitude REAL,
acceleration REAL,
- timestamp TEXT
- )
+ created_at TEXT,
+ updated_at TEXT
+ );
''');
- await db.execute('''
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.captainNotification}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
faceDetectTimes INTEGER
)
''');
- await db.execute('''
+ await db.execute('''
CREATE TABLE IF NOT EXISTS ${TableName.applyRideFromOverLay}(
id INTEGER PRIMARY KEY AUTOINCREMENT,
start_location_lat TEXT,
@@ -129,8 +136,6 @@ class DbSql {
passenger_rate TEXT
)
''');
- },
- );
}
Future>> getAllData(String table) async {
diff --git a/lib/models/model/order_data.dart b/lib/models/model/order_data.dart
index 93deebb..f75530d 100755
--- a/lib/models/model/order_data.dart
+++ b/lib/models/model/order_data.dart
@@ -1,52 +1,90 @@
// lib/models/order_data.dart
+
class OrderData {
final String customerName;
- final double distance;
+ final double tripDistanceKm; // المسافة الكلية للرحلة بالكيلومتر
final String price;
- final String startLocation;
- final String endLocation;
- final String passengerDistance;
- final String duration;
+ final String startLocationAddress;
+ final String endLocationAddress;
+
+ final double distanceToPassengerKm; // المسافة إلى الراكب بالكيلومتر
+ final int tripDurationMinutes; // مدة الرحلة الكلية بالدقائق (مقربة لأعلى)
+ final int
+ durationToPassengerMinutes; // المدة إلى الراكب بالدقائق (مقربة لأعلى)
+
final String rideType;
final String orderId;
final String passengerId;
final String passengerRate;
+ final String? rawStartCoordinates;
+ final String? rawEndCoordinates;
+
OrderData({
required this.customerName,
- required this.distance,
+ required this.tripDistanceKm,
required this.price,
- required this.startLocation,
- required this.endLocation,
- required this.passengerDistance,
- required this.duration,
+ required this.startLocationAddress,
+ required this.endLocationAddress,
+ required this.distanceToPassengerKm,
+ required this.tripDurationMinutes,
+ required this.durationToPassengerMinutes,
required this.rideType,
required this.orderId,
required this.passengerId,
required this.passengerRate,
+ this.rawStartCoordinates,
+ this.rawEndCoordinates,
});
- // Factory constructor to create an OrderData instance from a List.
- // This handles parsing and provides default values for safety.
+ // دالة مساعدة لتحويل الثواني إلى دقائق وتقريبها لأعلى
+ static int _secondsToRoundedUpMinutes(String secondsString) {
+ final seconds = double.tryParse(secondsString) ?? 0.0;
+ if (seconds <= 0) return 0;
+ return (seconds / 60)
+ .ceil(); // .ceil() لتقريب الكسر لأعلى (مثلاً 0.1 دقيقة تصبح 1 دقيقة)
+ }
+
factory OrderData.fromList(List list) {
+ // بناءً على testList والافتراضات الجديدة:
+ // list[4]: durationToRide (مدة الرحلة الكلية بالثواني)
+ // list[5]: distance (المسافة الكلية للرحلة بالكيلومتر)
+ // list[12]: distanceByPassenger (المسافة إلى الراكب بالمتر)
+ // list[15]: durationToPassenger (المدة إلى الراكب بالثواني)
+
+ double distanceToPassengerMeters =
+ list.length > 12 ? (double.tryParse(list[12].toString()) ?? 0.0) : 0.0;
+
return OrderData(
customerName: list.length > 8 ? list[8].toString() : 'Unknown Customer',
- distance:
+ tripDistanceKm:
list.length > 5 ? (double.tryParse(list[5].toString()) ?? 0.0) : 0.0,
price: list.length > 2 ? list[2].toString().split('.')[0] : '0',
- startLocation: list.length > 29 ? list[29].toString() : 'Unknown',
- endLocation: list.length > 30 ? list[30].toString() : 'Unknown',
- passengerDistance: list.length > 12 ? list[12].toString() : 'Unknown',
- duration: list.length > 4
- ? (double.parse(list[4].toString()) / 60).toStringAsFixed(0)
- : 'Unknown',
+ startLocationAddress:
+ list.length > 29 ? list[29].toString() : 'Unknown Address',
+ endLocationAddress:
+ list.length > 30 ? list[30].toString() : 'Unknown Address',
+
+ distanceToPassengerKm:
+ distanceToPassengerMeters / 1000.0, // تحويل من متر إلى كيلومتر
+
+ tripDurationMinutes:
+ list.length > 4 ? _secondsToRoundedUpMinutes(list[4].toString()) : 0,
+ durationToPassengerMinutes: list.length > 15
+ ? _secondsToRoundedUpMinutes(list[15].toString())
+ : 0,
+
rideType:
list.length > 31 ? _getRideType(list[31].toString()) : 'Unknown',
- orderId: list.length > 16 ? list[16].toString() : 'Unknown',
- passengerId: list.length > 7 ? list[7].toString() : 'Unknown',
- passengerRate: list.length > 33 ? list[33].toString() : 'Unknown',
+ orderId: list.length > 16 ? list[16].toString() : 'N/A',
+ passengerId: list.length > 7 ? list[7].toString() : 'N/A',
+ passengerRate: list.length > 33 ? list[33].toString() : 'N/A',
+
+ rawStartCoordinates: list.isNotEmpty ? list[0].toString() : null,
+ rawEndCoordinates: list.length > 1 ? list[1].toString() : null,
);
}
+
static String _getRideType(String type) {
switch (type) {
case 'Comfort':
@@ -60,7 +98,50 @@ class OrderData {
case 'Rayeh Gai':
return 'رايح جاي';
default:
- return '';
+ return type;
}
}
+
+ Map? get startCoordinates {
+ if (rawStartCoordinates == null) return null;
+ final parts = rawStartCoordinates!.split(',');
+ if (parts.length == 2) {
+ return {
+ 'lat': double.tryParse(parts[0].trim()),
+ 'lng': double.tryParse(parts[1].trim())
+ };
+ }
+ return null;
+ }
+
+ Map? get endCoordinates {
+ if (rawEndCoordinates == null) return null;
+ final parts = rawEndCoordinates!.split(',');
+ if (parts.length == 2) {
+ return {
+ 'lat': double.tryParse(parts[0].trim()),
+ 'lng': double.tryParse(parts[1].trim())
+ };
+ }
+ return null;
+ }
+
+ Map toMap() {
+ return {
+ 'customerName': customerName,
+ 'tripDistanceKm': tripDistanceKm,
+ 'price': price,
+ 'startLocationAddress': startLocationAddress,
+ 'endLocationAddress': endLocationAddress,
+ 'distanceToPassengerKm': distanceToPassengerKm,
+ 'tripDurationMinutes': tripDurationMinutes,
+ 'durationToPassengerMinutes': durationToPassengerMinutes,
+ 'rideType': rideType,
+ 'orderId': orderId,
+ 'passengerId': passengerId,
+ 'passengerRate': passengerRate,
+ 'rawStartCoordinates': rawStartCoordinates,
+ 'rawEndCoordinates': rawEndCoordinates,
+ };
+ }
}
diff --git a/lib/views/auth/country_widget.dart b/lib/views/auth/country_widget.dart
index 42fb155..d739a40 100755
--- a/lib/views/auth/country_widget.dart
+++ b/lib/views/auth/country_widget.dart
@@ -16,6 +16,7 @@ class CountryPicker extends StatelessWidget {
final List countryOptions = [
'Jordan',
+ "Syria",
'USA',
'Egypt',
'Turkey',
diff --git a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart
index d6fa0f1..981e2a5 100755
--- a/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart
+++ b/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart
@@ -1,10 +1,6 @@
-import 'dart:io';
-
import 'package:sefer_driver/constant/box_name.dart';
-import 'package:sefer_driver/controller/auth/captin/login_captin_controller.dart';
import 'package:sefer_driver/controller/firebase/local_notification.dart';
import 'package:sefer_driver/main.dart';
-import 'package:sefer_driver/views/auth/captin/cards/sms_signup.dart';
import 'package:sefer_driver/views/home/Captin/orderCaptin/vip_order_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_font_icons/flutter_font_icons.dart';
@@ -12,7 +8,6 @@ import 'package:get/get.dart';
import 'package:sefer_driver/controller/home/captin/home_captain_controller.dart';
import '../../../../../constant/colors.dart';
-import '../../../../../controller/packages/lingo/lingo_hunter.dart';
import '../../../../Rate/ride_calculate_driver.dart';
GetBuilder leftMainMenuCaptainIcons() {
@@ -95,26 +90,72 @@ GetBuilder leftMainMenuCaptainIcons() {
)
: const SizedBox(),
// : const SizedBox(),
- AnimatedContainer(
- duration: const Duration(microseconds: 200),
- width: controller.widthMapTypeAndTraffic,
- decoration: BoxDecoration(
- color: AppColor.secondaryColor,
- border: Border.all(color: AppColor.blueColor),
- borderRadius: BorderRadius.circular(15)),
- child: Builder(builder: (context) {
- return IconButton(
- onPressed: () async {
- print(box.read(BoxName.paymentLink));
- },
- icon: const Icon(
- FontAwesome5.grin_tears,
- size: 29,
- color: AppColor.blueColor,
- ),
- );
- }),
- ),
+ // AnimatedContainer(
+ // duration: const Duration(microseconds: 200),
+ // width: controller.widthMapTypeAndTraffic,
+ // decoration: BoxDecoration(
+ // color: AppColor.secondaryColor,
+ // border: Border.all(color: AppColor.blueColor),
+ // borderRadius: BorderRadius.circular(15)),
+ // child: Builder(builder: (context) {
+ // return IconButton(
+ // onPressed: () async {
+ // final List testList = const [
+ // "32.1117875,36.0669891",
+ // "32.1364001,36.0707479",
+ // "24.84",
+ // "7.56",
+ // "436",
+ // "4.38",
+ // "109270481246447459618",
+ // "113172279072358305645",
+ // "hamza",
+ // "e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k",
+ // "+201010101010",
+ // "6",
+ // "43",
+ // "true",
+ // "c2tXiuBJQCSg4CU4IfqYOL:APA91bFA0f8R3QMnPQnPEEdNyjY-jcoKt4nLBHxcLLsmDSuJn5yd4jSvwq7qDIZpkkPkjfjdwdKsGL0-G0aHpPyjfiBvbCwFmlRMCUKftNMNT7MJx2Bp16Y",
+ // "6",
+ // "1188",
+ // "false",
+ // "109270481246447459618",
+ // "436",
+ // "startEnd",
+ // "32.12404505187645,36.06566168367863",
+ // "",
+ // "",
+ // "",
+ // "",
+ // "5.42",
+ // "0",
+ // "hamzaayedflutter@gmail.com",
+ // "4368+PPP، السخنة، الأردن",
+ // "43PC+C4G، السخنة، الأردن",
+ // "Speed",
+ // "8",
+ // "5.00"
+ // ];
+ // await FlutterOverlayWindow.shareData(testList);
+ // await FlutterOverlayWindow.showOverlay(
+ // enableDrag: true,
+ // flag: OverlayFlag.focusPointer,
+ // // visibility: NotificationVisibility.visibilityPublic,
+ // positionGravity: PositionGravity.auto,
+ // height: 1300,
+ // width: WindowSize.matchParent,
+ // startPosition: const OverlayPosition(0, -90),
+ // );
+ // debugPrint('Overlay opened: ');
+ // },
+ // icon: const Icon(
+ // FontAwesome5.grin_tears,
+ // size: 29,
+ // color: AppColor.blueColor,
+ // ),
+ // );
+ // }),
+ // ),
const SizedBox(
height: 5,
diff --git a/lib/views/home/Captin/orderCaptin/order_over_lay.dart b/lib/views/home/Captin/orderCaptin/order_over_lay.dart
index f6ccd01..c2d4d0c 100755
--- a/lib/views/home/Captin/orderCaptin/order_over_lay.dart
+++ b/lib/views/home/Captin/orderCaptin/order_over_lay.dart
@@ -1,401 +1,30 @@
-// import 'dart:async';
-// import 'package:sefer_driver/constant/colors.dart';
-// import 'package:flutter/material.dart';
-// import 'package:flutter_overlay_window/flutter_overlay_window.dart';
-// import 'package:get/get.dart';
-// import 'package:just_audio/just_audio.dart';
-// import '../../../../constant/box_name.dart';
-// import '../../../../constant/links.dart';
-// import '../../../../constant/style.dart';
-// import '../../../../controller/functions/crud.dart';
-// import '../../../../main.dart';
-// import '../../../../print.dart';
-//
-// class OrderOverlay extends StatefulWidget {
-// const OrderOverlay({Key? key}) : super(key: key);
-//
-// @override
-// State createState() => _OrderOverlayState();
-// }
-//
-// class _OrderOverlayState extends State
-// with WidgetsBindingObserver {
-// List d = [];
-// Timer? _timer;
-// double _progress = 1.0;
-// bool _isOverlayActive = false;
-// final AudioPlayer _audioPlayer = AudioPlayer();
-//
-// @override
-// void initState() {
-// super.initState();
-// WidgetsBinding.instance.addObserver(this);
-// _setupOverlayListener();
-// }
-//
-// void _setupOverlayListener() {
-// FlutterOverlayWindow.overlayListener.listen((event) {
-// if (mounted) {
-// setState(() {
-// d = event;
-// _resetAndStartTimer();
-// });
-// }
-// });
-// }
-//
-// @override
-// void didChangeAppLifecycleState(AppLifecycleState state) {
-// if (state == AppLifecycleState.resumed) {
-// _checkOverlayStatus();
-// }
-// }
-//
-// void _checkOverlayStatus() async {
-// bool isActive = await FlutterOverlayWindow.isActive();
-// if (isActive && mounted) {
-// _resetAndStartTimer();
-// }
-// }
-//
-// void _resetAndStartTimer() {
-// _timer?.cancel();
-// setState(() {
-// _progress = 1.0;
-// _isOverlayActive = true;
-// });
-// _playAudio();
-// _startTimer();
-// }
-//
-// void _startTimer() {
-// _timer = Timer.periodic(const Duration(milliseconds: 100), (timer) {
-// if (!_isOverlayActive) {
-// timer.cancel();
-// _stopAudio();
-// return;
-// }
-// if (mounted) {
-// setState(() {
-// _progress -=
-// 1 / 100; // Decrease progress over 15 seconds (150 * 100ms)
-// if (_progress <= 0) {
-// timer.cancel();
-// _rejectOrder();
-// _stopAudio();
-// }
-// });
-// }
-// });
-// }
-//
-// void _playAudio() async {
-// try {
-// await _audioPlayer.setAsset(
-// 'assets/order.mp3',
-// preload: true,
-// initialPosition: Duration.zero,
-// );
-// await _audioPlayer.play();
-// } catch (e) {
-// print('An error occurred while playing the audio: $e');
-// }
-// }
-//
-// void _stopAudio() {
-// _audioPlayer.stop();
-// }
-//
-// @override
-// void dispose() {
-// _timer?.cancel();
-// _stopAudio();
-// WidgetsBinding.instance.removeObserver(this);
-// super.dispose();
-// }
-//
-// void refuseOrder(
-// orderID,
-// ) async {
-// await CRUD().postFromDialogue(link: AppLink.addDriverOrder, payload: {
-// //TODO need review
-// 'driver_id': box.read(BoxName.driverID),
-// // box.read(BoxName.driverID).toString(),
-// 'order_id': orderID,
-// 'status': 'Refused'
-// });
-// await CRUD().post(link: AppLink.updateRides, payload: {
-// 'id': orderID,
-// // 'rideTimeStart': DateTime.now().toString(),
-// 'status': 'Refused',
-// 'driver_id': box.read(BoxName.driverID),
-// });
-// }
-//
-// addRideToNotificationDriverString(
-// orderID,
-// String startLocation,
-// String endLocation,
-// String date,
-// String time,
-// String price,
-// String passengerId,
-// String status,
-// String carType,
-// String passengerRate,
-// String priceForPassenger,
-// String distance,
-// String duration,
-// ) async {
-// await CRUD().post(link: AppLink.addWaitingRide, payload: {
-// 'id': orderID,
-// 'start_location': startLocation,
-// 'end_location': endLocation,
-// 'date': date,
-// 'time': time,
-// 'price': price,
-// 'passenger_id': passengerId,
-// 'status': status,
-// 'carType': carType,
-// 'passengerRate': passengerRate,
-// 'price_for_passenger': priceForPassenger,
-// 'distance': distance,
-// 'duration': duration,
-// });
-// }
-//
-// @override
-// Widget build(BuildContext context) {
-// String duration = (double.parse(d[4].toString()) / 60).toStringAsFixed(0);
-// Log.print('duration: ${duration}');
-// String price = d[2].toString().split('.')[0];
-// return Material(
-// color: Colors.transparent,
-// child: Center(
-// child: Container(
-// padding: const EdgeInsets.all(12.0),
-// width: double.infinity,
-// height: 450, // Adjust height as needed
-// decoration: BoxDecoration(
-// gradient: const LinearGradient(colors: [
-// AppColor.blueColor,
-// AppColor.blueColor,
-// ]),
-// borderRadius: BorderRadius.circular(12.0),
-// ),
-// child: GestureDetector(
-// onTap: () async {
-// bool isOverlayActive = await FlutterOverlayWindow.isActive();
-// if (isOverlayActive) {
-// await FlutterOverlayWindow.closeOverlay();
-// }
-// },
-// child: ListView(
-// // mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-// children: [
-// ListTile(
-// leading: _buildPriceAvatar(price),
-// title: Row(
-// mainAxisAlignment: MainAxisAlignment.spaceBetween,
-// children: [
-// Text(
-// d.isNotEmpty ? d[8] : '', // Customer name
-// style: const TextStyle(
-// fontSize: 16,
-// fontWeight: FontWeight.bold,
-// color: AppColor.secondaryColor,
-// ),
-// ),
-// Container(
-// decoration: BoxDecoration(
-// border: Border.all(
-// color: AppColor.redColor, width: 2)),
-// child: Padding(
-// padding: const EdgeInsets.all(3),
-// child: Text(
-// "${d[5]} KM",
-// style: AppStyle.number.copyWith(
-// color: AppColor.secondaryColor, fontSize: 18),
-// ),
-// )),
-// const Text('🛣️')
-// ],
-// ),
-// // subtitle: Text(d.isNotEmpty ? d[10] : ''), // Phone number
-// ),
-// Column(
-// crossAxisAlignment: CrossAxisAlignment.start,
-// children: [
-// _buildDetailRow("🟢", d.isNotEmpty ? d[29] : ''),
-// _buildDetailRow("🔴".tr, d.isNotEmpty ? d[30] : ''),
-// _buildDetailRow(
-// "المسافة للراكب", d.isNotEmpty ? d[12] : ''),
-// Row(
-// mainAxisAlignment: MainAxisAlignment.spaceBetween,
-// children: [
-// _buildDetailRow("مدة الرحلة".tr, '$duration '),
-// _buildDetailRow("نوع الطلب".tr, _getRideType(d[31]))
-// ],
-// ),
-// const SizedBox(
-// height: 30,
-// ),
-// const SizedBox(height: 8),
-// LinearProgressIndicator(
-// value: _progress,
-// minHeight: 15,
-// backgroundColor: Colors.white.withOpacity(0.3),
-// valueColor:
-// const AlwaysStoppedAnimation(Colors.white),
-// ),
-// ],
-// ),
-// ],
-// ),
-// ),
-// ),
-// ),
-// );
-// }
-//
-// Widget _buildDetailRow(String label, String value) {
-// return Padding(
-// padding: const EdgeInsets.symmetric(vertical: 2.0),
-// child: Row(
-// mainAxisAlignment: MainAxisAlignment.end,
-// children: [
-// Text(
-// value,
-// style: AppStyle.title.copyWith(color: AppColor.secondaryColor),
-// ),
-// Text(
-// label,
-// style: const TextStyle(
-// fontWeight: FontWeight.bold, color: AppColor.secondaryColor),
-// ),
-// ],
-// ),
-// );
-// }
-//
-// Widget _buildPriceAvatar(String price) {
-// return Container(
-// width: 80,
-// height: 80,
-// decoration: BoxDecoration(
-// shape: BoxShape.circle,
-// gradient: const RadialGradient(
-// colors: [Color(0xFF4CAF50), Color(0xFF2E7D32)],
-// center: Alignment.center,
-// radius: 0.8,
-// ),
-// boxShadow: [
-// BoxShadow(
-// color: Colors.black.withOpacity(0.2),
-// blurRadius: 8,
-// offset: const Offset(0, 4),
-// ),
-// ],
-// ),
-// child: Center(
-// child: Text(
-// '\$$price',
-// style: const TextStyle(
-// fontSize: 22,
-// fontWeight: FontWeight.bold,
-// color: Colors.white,
-// ),
-// ),
-// ),
-// );
-// }
-//
-// Widget _buildInfoRow(IconData icon, String label, String value) {
-// return Padding(
-// padding: const EdgeInsets.symmetric(vertical: 8.0),
-// child: Row(
-// children: [
-// Icon(icon, color: Colors.white.withOpacity(0.8), size: 24),
-// const SizedBox(width: 12),
-// Expanded(
-// child: Column(
-// crossAxisAlignment: CrossAxisAlignment.start,
-// children: [
-// Text(
-// label,
-// style: TextStyle(
-// color: Colors.white.withOpacity(0.8), fontSize: 14),
-// ),
-// Text(
-// value,
-// style: const TextStyle(
-// color: Colors.white,
-// fontSize: 16,
-// fontWeight: FontWeight.bold),
-// ),
-// ],
-// ),
-// ),
-// ],
-// ),
-// );
-// }
-//
-// String _getRideType(String type) {
-// switch (type) {
-// case 'Comfort':
-// return 'كمفورت ❄️';
-// case 'Lady':
-// return 'ليدي 👩';
-// case 'Speed':
-// return 'سبيد 🔻';
-// case 'Mashwari':
-// return 'مشواري';
-// case 'Rayeh Gai':
-// return 'رايح جاي';
-// default:
-// return '';
-// }
-// }
-//
-// void _rejectOrder() async {
-// box.write(BoxName.rideStatus, 'reject');
-// refuseOrder(
-// d[16].toString(),
-// );
-// addRideToNotificationDriverString(
-// d[16].toString(),
-// d[29].toString(),
-// d[30].toString(),
-// '${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day}',
-// '${DateTime.now().hour}:${DateTime.now().minute}',
-// d[2].toString(),
-// d[7].toString(),
-// 'wait',
-// d[31].toString(),
-// d[33].toString(),
-// d[2].toString(),
-// d[5].toString(),
-// d[4].toString()); //
-// bool isOverlayActive = await FlutterOverlayWindow.isActive();
-// if (isOverlayActive) {
-// await FlutterOverlayWindow.closeOverlay();
-// }
-// }
-// }
import 'dart:async';
-import 'package:sefer_driver/constant/colors.dart';
+import 'dart:convert'; // لإضافة jsonEncode إذا احتجت له لاحقًا
import 'package:flutter/material.dart';
import 'package:flutter_overlay_window/flutter_overlay_window.dart';
-import 'package:get/get.dart'; // If you're using GetX for translations
+import 'package:get/get.dart';
import 'package:just_audio/just_audio.dart';
-import '../../../../constant/box_name.dart'; //
+// تأكد من صحة هذه المسارات
+import '../../../../constant/box_name.dart';
import '../../../../constant/links.dart';
-import '../../../../constant/style.dart';
import '../../../../controller/functions/crud.dart';
-import '../../../../main.dart';
-import '../../../../models/model/order_data.dart';
-import '../../../../print.dart';
+import '../../../../main.dart'; // للحصول على `box`
+import '../../../../models/model/order_data.dart'; // مسار نموذج البيانات المحدث
+
+// --- الألوان ---
+class OverlayColors {
+ static const Color primaryBackground = Color(0xFF2C3E50);
+ static const Color cardBackground = Color(0xFF34495E);
+ static const Color primaryText = Colors.white;
+ static const Color secondaryText = Color(0xFFBDC3C7);
+ static const Color accentColor = Color(0xFF1ABC9C);
+ static const Color acceptButton = Color(0xFF2ECC71);
+ static const Color rejectButton = Color(0xFFE74C3C);
+ static const Color highlightColor = Color(0xFFF1C40F);
+}
+
+// --- OrderData Model (يفترض أنه موجود في ملف منفصل كما هو الحال عادةً) ---
+// class OrderData { ... } // الكود الخاص بـ OrderData الذي قدمته/عدلناه
class OrderOverlay extends StatefulWidget {
const OrderOverlay({Key? key}) : super(key: key);
@@ -406,38 +35,87 @@ class OrderOverlay extends StatefulWidget {
class _OrderOverlayState extends State
with WidgetsBindingObserver {
- OrderData? _orderData; // Use the OrderData model
+ OrderData? _orderData;
Timer? _timer;
- double _progress = 1.0;
- bool _isOverlayActive = false;
+ int _remainingSeconds = 20; // الوقت الافتراضي للمؤقت بالثواني
final AudioPlayer _audioPlayer = AudioPlayer();
+ bool _buttonsEnabled = true;
+
+ final String _googleStaticMapsApiKey =
+ "YOUR_GOOGLE_STATIC_MAPS_API_KEY_HERE"; // !!! استبدل هذا بمفتاحك !!!
+
+ bool get _canShowStaticMap {
+ if (_orderData == null ||
+ _googleStaticMapsApiKey == "YOUR_GOOGLE_STATIC_MAPS_API_KEY_HERE") {
+ return false;
+ }
+ final startCoords = _orderData!.startCoordinates;
+ final endCoords = _orderData!.endCoordinates;
+ return startCoords?['lat'] != null &&
+ startCoords?['lng'] != null &&
+ endCoords?['lat'] != null &&
+ endCoords?['lng'] != null;
+ }
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
_setupOverlayListener();
+ // // للاختبار، يمكنك إرسال بيانات ثابتة بعد ثانية
+ // Future.delayed(Duration(seconds: 1), () {
+ // if (mounted) {
+ // _processEventData(testList); // تأكد أن testList معرفة إذا كنت تستخدم هذا
+ // }
+ // });
}
void _setupOverlayListener() {
FlutterOverlayWindow.overlayListener.listen((event) {
if (mounted) {
- // Check if the event is a List
- if (event is List) {
- setState(() {
- _orderData = OrderData.fromList(event); // Parse the list
- _resetAndStartTimer();
- });
- } else {
- // Handle unexpected data format. Maybe log an error.
- print("Error: Received unexpected data format in overlay: $event");
- }
+ _processEventData(event);
}
});
}
-// ... (rest of your methods: didChangeAppLifecycleState, _checkOverlayStatus,
-// _resetAndStartTimer, _startTimer remain mostly the same. Just make sure
-// to use _orderData?.property where appropriate) ...
+
+ void _processEventData(dynamic event) {
+ _printToMainApp("Overlay: Received event data: $event");
+
+ if (event is List) {
+ _printToMainApp("Overlay: Event list length: ${event.length}");
+ if (event.length > 33) {
+ // مثال للتحقق من الطول قبل الوصول للفهارس
+ _printToMainApp("Overlay: list[0] (rawStartCoords): ${event[0]}");
+ _printToMainApp(
+ "Overlay: list[15] (durationToPassengerSec): ${event[15]}");
+ }
+
+ try {
+ final newOrderData = OrderData.fromList(event);
+ _printToMainApp("Overlay: Parsed OrderData: ${newOrderData.toMap()}");
+
+ setState(() {
+ _orderData = newOrderData;
+ _remainingSeconds = 20;
+ });
+ _resetAndStartTimer();
+ } catch (e, s) {
+ _printToMainApp("Overlay: Error parsing OrderData: $e\nStackTrace: $s");
+ }
+ } else if (event is Map && event['type'] == 'close_overlay_request') {
+ _closeOverlay();
+ } else {
+ _printToMainApp(
+ "Overlay: Received unexpected data format or type: $event");
+ }
+ }
+
+ // دالة لإرسال رسائل الطباعة للتطبيق الرئيسي
+ void _printToMainApp(String message) {
+ // قم بتعليق هذه إذا كانت تسبب مشاكل أو إذا لم يكن لديك مستمع في التطبيق الرئيسي
+ // FlutterOverlayWindow.shareData({'type': 'debug_log', 'message': "OVERLAY: $message"});
+ print("OVERLAY_PRINT: $message"); // اطبعها محليًا أيضًا كاحتياط
+ }
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
@@ -448,52 +126,55 @@ class _OrderOverlayState extends State
void _checkOverlayStatus() async {
bool isActive = await FlutterOverlayWindow.isActive();
- if (isActive && mounted) {
- _resetAndStartTimer();
+ if (isActive && mounted && _orderData != null) {
+ if (_remainingSeconds > 0 && (_timer == null || !_timer!.isActive)) {
+ _resetAndStartTimer();
+ }
}
}
void _resetAndStartTimer() {
_timer?.cancel();
+ _audioPlayer.stop();
setState(() {
- _progress = 1.0;
- _isOverlayActive = true;
+ _buttonsEnabled = true;
+ _remainingSeconds = 20;
});
_playAudio();
_startTimer();
}
void _startTimer() {
- _timer = Timer.periodic(const Duration(milliseconds: 100), (timer) {
- if (!_isOverlayActive) {
+ if (_orderData == null) return;
+ if (_remainingSeconds <= 0) _remainingSeconds = 20;
+
+ _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
+ if (!mounted) {
timer.cancel();
_stopAudio();
return;
}
- if (mounted) {
- setState(() {
- _progress -=
- 1 / 100; // Decrease progress over 15 seconds (150 * 100ms)
- if (_progress <= 0) {
- timer.cancel();
- _rejectOrder();
- _stopAudio();
+ setState(() {
+ if (_remainingSeconds > 0) {
+ _remainingSeconds--;
+ } else {
+ timer.cancel();
+ _stopAudio();
+ if (_buttonsEnabled) {
+ _handleOrderTimeout();
}
- });
- }
+ }
+ });
});
}
void _playAudio() async {
try {
- await _audioPlayer.setAsset(
- 'assets/order.mp3',
- preload: true,
- initialPosition: Duration.zero,
- );
+ await _audioPlayer.setAsset('assets/order.mp3', preload: true);
+ await _audioPlayer.setLoopMode(LoopMode.one);
await _audioPlayer.play();
} catch (e) {
- print('An error occurred while playing the audio: $e');
+ _printToMainApp('Error playing audio: $e');
}
}
@@ -505,271 +186,508 @@ class _OrderOverlayState extends State
void dispose() {
_timer?.cancel();
_stopAudio();
- _audioPlayer.dispose(); // Dispose the player
+ _audioPlayer.dispose();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
- void refuseOrder(String orderID) async {
- await CRUD().postFromDialogue(link: AppLink.addDriverOrder, payload: {
- 'driver_id': box.read(BoxName.driverID),
- 'order_id': orderID,
- 'status': 'Refused'
- });
-
- await CRUD().post(link: AppLink.updateRides, payload: {
- 'id': orderID,
- 'status': 'Refused',
- 'driver_id': box.read(BoxName.driverID),
- });
+ Future _closeOverlay() async {
+ _stopAudio();
+ if (await FlutterOverlayWindow.isActive()) {
+ await FlutterOverlayWindow.closeOverlay();
+ }
}
- addRideToNotificationDriverString({
- required String orderID,
- required String startLocation,
- required String endLocation,
- required String date,
- required String time,
- required String price,
- required String passengerId,
- required String status,
- required String carType,
- required String passengerRate,
- required String priceForPassenger,
- required String distance,
- required String duration,
- }) async {
- await CRUD().post(link: AppLink.addWaitingRide, payload: {
- 'id': orderID,
- 'start_location': startLocation,
- 'end_location': endLocation,
- 'date': date,
- 'time': time,
- 'price': price,
- 'passenger_id': passengerId,
- 'status': status,
- 'carType': carType,
- 'passengerRate': passengerRate,
- 'price_for_passenger': priceForPassenger,
- 'distance': distance,
- 'duration': duration,
+ void _disableButtonsAndProcess() {
+ setState(() {
+ _buttonsEnabled = false;
});
+ _timer?.cancel();
+ _stopAudio();
+ }
+
+ Future _acceptOrder() async {
+ if (!_buttonsEnabled || _orderData == null) return;
+ _disableButtonsAndProcess();
+ _printToMainApp("Order ACCEPTED: ${_orderData!.orderId}");
+ try {
+ // هنا يجب أن يكون طلب API الفعلي لقبول الطلب على السيرفر
+ // مثال:
+ // await CRUD().post(link: AppLink.acceptOrderLink, payload: { ... });
+ _printToMainApp(
+ "SIMULATING API CALL: Order Accepted on Server for ${_orderData!.orderId}");
+
+ await _closeOverlay();
+ await FlutterOverlayWindow.shareData({
+ 'action': 'navigate_to_trip_acceptance',
+ 'order_id': _orderData!.orderId,
+ 'order_data_map': _orderData!.toMap(),
+ });
+ // لا تستدعي launchApplication() إذا كنت ستعتمد على الطريقة الأصلية أو deep link
+ } catch (e) {
+ _printToMainApp("Error accepting order: $e");
+ if (mounted) setState(() => _buttonsEnabled = true);
+ }
+ }
+
+ Future _rejectOrder() async {
+ if (!_buttonsEnabled || _orderData == null) return;
+ _disableButtonsAndProcess();
+ _printToMainApp("Order REJECTED: ${_orderData!.orderId}");
+ box.write(BoxName.rideStatus, 'reject');
+ await _apiRefuseOrder(_orderData!.orderId);
+ await _closeOverlay();
+ }
+
+ void _handleOrderTimeout() {
+ if (_orderData == null) return;
+ _printToMainApp("Order TIMED OUT: ${_orderData!.orderId}");
+ _rejectOrder();
+ }
+
+ Future _apiRefuseOrder(String orderID) async {
+ if (orderID == "N/A") {
+ _printToMainApp("Cannot refuse order with N/A ID");
+ if (mounted) setState(() => _buttonsEnabled = true);
+ return;
+ }
+ try {
+ // تأكد من أن box.read(BoxName.driverID) يعيد قيمة صالحة
+ final driverId = box.read(BoxName.driverID)?.toString();
+ if (driverId == null) {
+ _printToMainApp("Driver ID is null, cannot refuse order.");
+ if (mounted) setState(() => _buttonsEnabled = true);
+ return;
+ }
+
+ await CRUD().post(link: AppLink.addDriverOrder, payload: {
+ 'driver_id': driverId,
+ 'order_id': orderID,
+ 'status': 'Refused'
+ });
+ await CRUD().post(link: AppLink.updateRides, payload: {
+ 'id': orderID,
+ 'status': 'Refused',
+ 'driver_id': driverId,
+ });
+ _printToMainApp("Order $orderID refused successfully.");
+ } catch (e) {
+ _printToMainApp("Error in _apiRefuseOrder for $orderID: $e");
+ if (mounted) setState(() => _buttonsEnabled = true);
+ }
}
@override
Widget build(BuildContext context) {
if (_orderData == null) {
- // Show a loading indicator or an empty state while waiting for data.
- return Material(
- color: Colors.transparent,
- child: Container(
- color: Colors.black.withOpacity(0.5),
- child: Center(child: CircularProgressIndicator()),
- ),
- );
+ return const Material(
+ color: Colors.transparent,
+ child: Center(
+ child:
+ CircularProgressIndicator(color: OverlayColors.accentColor)));
}
- // Access data using the model's properties:
- final orderData =
- _orderData!; // Safe to use ! because of the null check above
+ final order = _orderData!;
+ String staticMapUrl = "";
+
+ if (_canShowStaticMap) {
+ final startCoords = order.startCoordinates!;
+ final endCoords = order.endCoordinates!;
+ final startMarker =
+ Uri.encodeComponent("${startCoords['lat']},${startCoords['lng']}");
+ final endMarker =
+ Uri.encodeComponent("${endCoords['lat']},${endCoords['lng']}");
+ staticMapUrl =
+ "https://maps.googleapis.com/maps/api/staticmap?size=600x200&maptype=roadmap" // تقليل الارتفاع قليلاً
+ "&markers=color:green%7Clabel:S%7C$startMarker"
+ "&markers=color:red%7Clabel:D%7C$endMarker"
+ "&path=color:0x007bff%7Cweight:5%7C$startMarker%7C$endMarker"
+ "&key=$_googleStaticMapsApiKey";
+ _printToMainApp("Generated staticMapUrl: $staticMapUrl");
+ } else {
+ _printToMainApp(
+ "_canShowStaticMap is false. Check API key and coordinates.");
+ _printToMainApp("API Key used: $_googleStaticMapsApiKey");
+ _printToMainApp("Start Coords: ${order.startCoordinates}");
+ _printToMainApp("End Coords: ${order.endCoordinates}");
+ }
return Material(
- color: Colors.transparent,
+ color: Colors.black.withOpacity(0.3), // زيادة الشفافية للخلفية
child: Center(
child: Container(
- padding: const EdgeInsets.all(12.0),
- width: double.infinity,
- height: 450,
+ // Container رئيسي للـ Overlay card
+ margin: const EdgeInsets.symmetric(
+ horizontal: 8.0, vertical: 10.0), // هوامش أصغر
+ padding: const EdgeInsets.all(12.0), // حشوة أصغر
decoration: BoxDecoration(
- gradient: const LinearGradient(colors: [
- AppColor.blueColor,
- AppColor.blueColor,
- ]),
- borderRadius: BorderRadius.circular(12.0),
+ color: OverlayColors.cardBackground,
+ borderRadius: BorderRadius.circular(16.0), // حواف أقل دائرية
+ boxShadow: [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.45),
+ blurRadius: 10,
+ spreadRadius: 1,
+ )
+ ],
),
- child: GestureDetector(
- onTap: () async {
- bool isOverlayActive = await FlutterOverlayWindow.isActive();
- if (isOverlayActive) {
- await FlutterOverlayWindow.closeOverlay();
- }
- },
- child: ListView(
- children: [
- ListTile(
- leading: _buildPriceAvatar(orderData.price),
- title: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text(
- orderData.customerName,
- style: const TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.bold,
- color: AppColor.secondaryColor,
- ),
- ),
- Container(
- decoration: BoxDecoration(
- border:
- Border.all(color: AppColor.redColor, width: 2)),
- child: Padding(
- padding: const EdgeInsets.all(3),
- child: Text(
- "${orderData.distance} KM",
- style: AppStyle.number.copyWith(
- color: AppColor.secondaryColor, fontSize: 18),
- ),
- ),
- ),
- const Text('🛣️')
- ],
- ),
- ),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- _buildDetailRow("🟢", orderData.startLocation),
- _buildDetailRow("🔴".tr, orderData.endLocation),
- _buildDetailRow(
- "المسافة للراكب", orderData.passengerDistance),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- _buildDetailRow("مدة الرحلة".tr, orderData.duration),
- _buildDetailRow("نوع الطلب".tr, orderData.rideType)
- ],
- ),
- const SizedBox(height: 30),
- const SizedBox(height: 8),
- LinearProgressIndicator(
- value: _progress,
- minHeight: 15,
- backgroundColor: Colors.white.withOpacity(0.3),
- valueColor:
- const AlwaysStoppedAnimation(Colors.white),
- ),
- ],
- ),
- ],
- ),
- ),
- ),
- ),
- );
- }
-// ... (rest of your helper methods: _buildDetailRow, _buildPriceAvatar,
-// _buildInfoRow. Update them to use orderData.property) ...
-
- Widget _buildDetailRow(String label, String value) {
- return Padding(
- padding: const EdgeInsets.symmetric(vertical: 2.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.end,
- children: [
- Text(
- value,
- style: AppStyle.title.copyWith(color: AppColor.secondaryColor),
- ),
- Text(
- label,
- style: const TextStyle(
- fontWeight: FontWeight.bold, color: AppColor.secondaryColor),
- ),
- ],
- ),
- );
- }
-
- Widget _buildPriceAvatar(String price) {
- return Container(
- width: 80,
- height: 80,
- decoration: BoxDecoration(
- shape: BoxShape.circle,
- gradient: const RadialGradient(
- colors: [Color(0xFF4CAF50), Color(0xFF2E7D32)],
- center: Alignment.center,
- radius: 0.8,
- ),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.2),
- blurRadius: 8,
- offset: const Offset(0, 4),
- ),
- ],
- ),
- child: Center(
- child: Text(
- '\$$price',
- style: const TextStyle(
- fontSize: 22,
- fontWeight: FontWeight.bold,
- color: Colors.white,
- ),
- ),
- ),
- );
- }
-
- Widget _buildInfoRow(IconData icon, String label, String value) {
- return Padding(
- padding: const EdgeInsets.symmetric(vertical: 8.0),
- child: Row(
- children: [
- Icon(icon, color: Colors.white.withOpacity(0.8), size: 24),
- const SizedBox(width: 12),
- Expanded(
+ // استخدام IntrinsicHeight لجعل الـ Column يأخذ ارتفاع المحتوى
+ // أو يمكنك تحديد ارتفاع ثابت للـ Container إذا كان ذلك مناسبًا
+ child: SingleChildScrollView(
+ // مهم إذا كان المحتوى يمكن أن يتجاوز الارتفاع
child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize:
+ MainAxisSize.min, // مهم جدًا لجعل Column لا يتمدد بلا حدود
+ crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
- Text(
- label,
- style: TextStyle(
- color: Colors.white.withOpacity(0.8), fontSize: 14),
+ _buildHeaderWithTimer(),
+ const SizedBox(height: 10),
+
+ if (_canShowStaticMap && staticMapUrl.isNotEmpty)
+ ClipRRect(
+ borderRadius: BorderRadius.circular(10.0),
+ child: Image.network(
+ staticMapUrl,
+ height: 110, // ارتفاع أقل للخريطة
+ fit: BoxFit.cover,
+ errorBuilder: (context, error, stackTrace) {
+ _printToMainApp(
+ "Error loading static map image: $error");
+ return Container(
+ height: 80, // ارتفاع أقل عند الخطأ
+ decoration: BoxDecoration(
+ color: OverlayColors.primaryBackground
+ .withOpacity(0.25),
+ borderRadius: BorderRadius.circular(8),
+ ),
+ child: Center(
+ child: Icon(Icons.map_outlined,
+ color: OverlayColors.secondaryText
+ .withOpacity(0.6),
+ size: 28)),
+ );
+ },
+ loadingBuilder: (context, child, loadingProgress) {
+ if (loadingProgress == null) return child;
+ return SizedBox(
+ height: 110,
+ child: Center(
+ child: CircularProgressIndicator(
+ value: loadingProgress.expectedTotalBytes != null
+ ? loadingProgress.cumulativeBytesLoaded /
+ loadingProgress.expectedTotalBytes!
+ : null,
+ color: OverlayColors.accentColor,
+ strokeWidth: 2.0,
+ ),
+ ),
+ );
+ },
+ ),
+ ),
+ if (_canShowStaticMap && staticMapUrl.isNotEmpty)
+ const SizedBox(height: 10),
+
+ _buildRideInfoSection(order),
+ const SizedBox(height: 10),
+
+ _buildLocationDetail(
+ icon: Icons.trip_origin_outlined, // تغيير الأيقونة
+ label: "نقطة الانطلاق".tr,
+ value: order.startLocationAddress,
+ iconColor: Colors.greenAccent[400]!,
),
- Text(
- value,
- style: const TextStyle(
- color: Colors.white,
- fontSize: 16,
- fontWeight: FontWeight.bold),
+ Padding(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 25.0, vertical: 3.0),
+ child: Icon(Icons.more_vert_rounded,
+ color: OverlayColors.secondaryText.withOpacity(0.4),
+ size: 14),
),
+ _buildLocationDetail(
+ icon: Icons.flag_circle_outlined, // تغيير الأيقونة
+ label: "الوجهة النهائية".tr,
+ value: order.endLocationAddress,
+ iconColor: Colors.redAccent[200]!, // تغيير اللون
+ ),
+ const SizedBox(height: 10),
+ _buildPassengerAndRideTypeRow(order),
+ const SizedBox(height: 16), // مسافة أكبر قبل الأزرار
+ _buildActionButtons(),
],
),
),
- ],
+ ),
),
);
}
- void _rejectOrder() async {
- box.write(BoxName.rideStatus, 'reject');
- if (_orderData != null) {
- // Check for null
- refuseOrder(_orderData!.orderId);
- addRideToNotificationDriverString(
- orderID: _orderData!.orderId,
- startLocation: _orderData!.startLocation,
- endLocation: _orderData!.endLocation,
- date:
- '${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day}',
- time: '${DateTime.now().hour}:${DateTime.now().minute}',
- price: _orderData!.price,
- passengerId: _orderData!.passengerId,
- status: 'wait',
- carType: _orderData!.rideType,
- passengerRate: _orderData!.passengerRate,
- priceForPassenger: _orderData!.price,
- distance: _orderData!.distance.toString(),
- duration: _orderData!.duration,
- );
- }
+ Widget _buildHeaderWithTimer() {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Flexible(
+ // لجعل النص يتكيف مع المساحة
+ child: Row(
+ mainAxisSize: MainAxisSize.min, // مهم داخل Flexible
+ children: [
+ Icon(Icons.local_taxi_sharp,
+ color: OverlayColors.highlightColor,
+ size: 24), // أيقونة مختلفة
+ const SizedBox(width: 6),
+ Flexible(
+ // لجعل النص يتكيف
+ child: Text(
+ "طلب توصيل".tr, // نص أقصر
+ style: TextStyle(
+ color: OverlayColors.primaryText,
+ fontSize: 18,
+ fontWeight: FontWeight.w500),
+ overflow: TextOverflow.ellipsis, // إذا كان النص طويلاً
+ ),
+ ),
+ ],
+ ),
+ ),
+ Container(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 10, vertical: 5), // حشوة أصغر للعداد
+ decoration: BoxDecoration(
+ color: _remainingSeconds <= 5
+ ? OverlayColors.rejectButton.withOpacity(0.75)
+ : OverlayColors.primaryBackground.withOpacity(0.7),
+ borderRadius: BorderRadius.circular(14),
+ border: Border.all(
+ color: OverlayColors.accentColor.withOpacity(0.6),
+ width: 0.7)),
+ child: Text(
+ _remainingSeconds.toString(),
+ style: TextStyle(
+ color: OverlayColors.primaryText,
+ fontSize: 17,
+ fontWeight: FontWeight.bold,
+ fontFeatures: [FontFeature.tabularFigures()]),
+ ),
+ ),
+ ],
+ );
+ }
- bool isOverlayActive = await FlutterOverlayWindow.isActive();
- if (isOverlayActive) {
- await FlutterOverlayWindow.closeOverlay();
- }
+ Widget _buildRideInfoSection(OrderData order) {
+ return Container(
+ padding:
+ const EdgeInsets.symmetric(vertical: 8, horizontal: 6), // حشوة أصغر
+ decoration: BoxDecoration(
+ color: OverlayColors.primaryBackground.withOpacity(0.55),
+ borderRadius: BorderRadius.circular(8), // حواف أقل دائرية
+ ),
+ child: Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceAround,
+ children: [
+ Expanded(
+ child: _infoChip(
+ "السعر".tr,
+ "\$${order.price}",
+ Icons.attach_money_outlined,
+ OverlayColors.highlightColor,
+ valueFontSize: 15)),
+ Expanded(
+ child: _infoChip(
+ "مسافة الرحلة".tr,
+ "${order.tripDistanceKm.toStringAsFixed(1)} كم",
+ Icons.swap_calls_rounded,
+ OverlayColors.accentColor,
+ valueFontSize: 15)), // أيقونة مختلفة
+ ],
+ ),
+ const SizedBox(height: 6),
+ Divider(
+ color: OverlayColors.secondaryText.withOpacity(0.15),
+ height: 0.5,
+ thickness: 0.5), // فاصل أرق
+ const SizedBox(height: 6),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceAround,
+ children: [
+ Expanded(
+ child: _infoChip(
+ "لوصولك للراكب".tr,
+ "~${order.durationToPassengerMinutes} د",
+ Icons.schedule_outlined,
+ OverlayColors.secondaryText,
+ valueFontSize: 14)), // اختصار "دقيقة"
+ Expanded(
+ child: _infoChip(
+ "مسافة للراكب".tr,
+ "${order.distanceToPassengerKm.toStringAsFixed(1)} كم",
+ Icons.person_pin_circle_outlined,
+ OverlayColors.secondaryText,
+ valueFontSize: 14)), // أيقونة مختلفة
+ ],
+ ),
+ if (order.tripDurationMinutes > 0) ...[
+ const SizedBox(height: 6),
+ Divider(
+ color: OverlayColors.secondaryText.withOpacity(0.15),
+ height: 0.5,
+ thickness: 0.5),
+ const SizedBox(height: 6),
+ Row(
+ // استخدام Row لجعل الـ _infoChip يتمدد
+ children: [
+ Expanded(
+ child: _infoChip(
+ "مدة الرحلة".tr,
+ "~${order.tripDurationMinutes} د",
+ Icons.timelapse_outlined,
+ OverlayColors.accentColor,
+ valueFontSize: 14) // اختصار
+ ),
+ ],
+ ),
+ ]
+ ],
+ ));
+ }
+
+ Widget _infoChip(String label, String value, IconData icon, Color iconColor,
+ {double valueFontSize = 13}) {
+ // تم إزالة Expanded من هنا، ووضعها عند استدعاء _infoChip إذا لزم الأمر
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Icon(icon, color: iconColor, size: 17), // أيقونة أصغر
+ const SizedBox(height: 1),
+ Text(label,
+ style: TextStyle(
+ color: OverlayColors.secondaryText.withOpacity(0.85),
+ fontSize: 9.5),
+ textAlign: TextAlign.center,
+ overflow: TextOverflow.ellipsis), // خط أصغر للعنوان
+ // const SizedBox(height: 0.5),
+ Text(value,
+ style: TextStyle(
+ color: OverlayColors.primaryText,
+ fontSize: valueFontSize,
+ fontWeight: FontWeight.w500),
+ textAlign: TextAlign.center,
+ overflow: TextOverflow.ellipsis), // خط أصغر للقيمة
+ ],
+ );
+ }
+
+ Widget _buildLocationDetail({
+ required IconData icon,
+ required String label,
+ required String value,
+ Color iconColor = OverlayColors.accentColor,
+ }) {
+ return Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Icon(icon, color: iconColor, size: 16), // أيقونة أصغر
+ const SizedBox(width: 6),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min, // مهم
+ children: [
+ Text(
+ label,
+ style: TextStyle(
+ color: OverlayColors.secondaryText.withOpacity(0.75),
+ fontSize: 9.5,
+ fontWeight: FontWeight.w300),
+ ),
+ Text(
+ value,
+ style: TextStyle(
+ color: OverlayColors.primaryText,
+ fontSize: 12.5,
+ fontWeight: FontWeight.normal),
+ overflow: TextOverflow.ellipsis,
+ maxLines: 2,
+ ),
+ ],
+ ),
+ ),
+ ],
+ );
+ }
+
+ Widget _buildPassengerAndRideTypeRow(OrderData order) {
+ return Row(
+ children: [
+ Expanded(
+ child: _buildLocationDetail(
+ icon: Icons.person_search_outlined, // أيقونة مختلفة
+ label: "الراكب".tr,
+ value: order.customerName,
+ iconColor: OverlayColors.highlightColor.withOpacity(0.75),
+ ),
+ ),
+ const SizedBox(width: 8),
+ Expanded(
+ child: _buildLocationDetail(
+ icon: Icons.category_outlined, // أيقونة مختلفة
+ label: "نوع الطلب".tr,
+ value: order.rideType,
+ iconColor: OverlayColors.accentColor.withOpacity(0.75),
+ ),
+ ),
+ ],
+ );
+ }
+
+ Widget _buildActionButtons() {
+ return Row(
+ children: [
+ Expanded(
+ child: ElevatedButton.icon(
+ icon: const Icon(Icons.close_fullscreen_rounded,
+ color: Colors.white, size: 17), // أيقونة مختلفة
+ label: Text("رفض".tr,
+ style: const TextStyle(
+ color: Colors.white,
+ fontSize: 13.5,
+ fontWeight: FontWeight.w500)),
+ onPressed: _buttonsEnabled ? _rejectOrder : null,
+ style: ElevatedButton.styleFrom(
+ backgroundColor: OverlayColors.rejectButton.withOpacity(0.85),
+ padding: const EdgeInsets.symmetric(vertical: 9, horizontal: 6),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(7)),
+ disabledBackgroundColor:
+ OverlayColors.rejectButton.withOpacity(0.25),
+ ),
+ ),
+ ),
+ const SizedBox(width: 7),
+ Expanded(
+ child: ElevatedButton.icon(
+ icon: const Icon(Icons.task_alt_rounded,
+ color: Colors.white, size: 17), // أيقونة مختلفة
+ label: Text("قبول".tr,
+ style: const TextStyle(
+ color: Colors.white,
+ fontSize: 13.5,
+ fontWeight: FontWeight.w500)),
+ onPressed: _buttonsEnabled ? _acceptOrder : null,
+ style: ElevatedButton.styleFrom(
+ backgroundColor: OverlayColors.acceptButton.withOpacity(0.85),
+ padding: const EdgeInsets.symmetric(vertical: 9, horizontal: 6),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(7)),
+ disabledBackgroundColor:
+ OverlayColors.acceptButton.withOpacity(0.25),
+ ),
+ ),
+ ),
+ ],
+ );
}
}