From 5eba0328870ca4f929238ec3772bf8de84b71acf Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Fri, 13 Jun 2025 01:56:06 +0300 Subject: [PATCH] 25-6-13/1 --- .../.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_deps | Bin 167996 -> 168064 bytes .../.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_log | 1 + .../arm64-v8a/configure_fingerprint.bin | 24 +- .../Debug/6a58wo5c/armeabi-v7a/.ninja_deps | Bin 167296 -> 167364 bytes .../Debug/6a58wo5c/armeabi-v7a/.ninja_log | 1 + .../armeabi-v7a/configure_fingerprint.bin | 24 +- .../app/.cxx/Debug/6a58wo5c/x86/.ninja_deps | Bin 168092 -> 168160 bytes .../app/.cxx/Debug/6a58wo5c/x86/.ninja_log | 1 + .../6a58wo5c/x86/configure_fingerprint.bin | 24 +- .../.cxx/Debug/6a58wo5c/x86_64/.ninja_deps | Bin 168132 -> 168200 bytes .../app/.cxx/Debug/6a58wo5c/x86_64/.ninja_log | 1 + .../6a58wo5c/x86_64/configure_fingerprint.bin | 24 +- .../arm64-v8a/configure_fingerprint.bin | 24 +- .../armeabi-v7a/configure_fingerprint.bin | 24 +- .../4y6h5l4y/x86/configure_fingerprint.bin | 24 +- .../4y6h5l4y/x86_64/configure_fingerprint.bin | 24 +- android/app/build.gradle | 4 +- ios/Runner/Info.plist | 4 +- .../auth/captin/login_captin_controller.dart | 5 +- lib/controller/firebase/firbase_messge.dart | 3 +- lib/controller/functions/crud.dart | 28 +- .../functions/location_controller.dart | 29 +- .../home/captin/home_captain_controller.dart | 4 +- .../home/captin/map_driver_controller.dart | 1 + lib/controller/local/translations.dart | 2 +- lib/main.dart | 23 +- lib/models/db_sql.dart | 43 +- lib/models/model/order_data.dart | 127 +- lib/views/auth/country_widget.dart | 1 + .../widget/left_menu_map_captain.dart | 91 +- .../Captin/orderCaptin/order_over_lay.dart | 1246 ++++++++--------- 31 files changed, 945 insertions(+), 862 deletions(-) diff --git a/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_deps b/android/app/.cxx/Debug/6a58wo5c/arm64-v8a/.ninja_deps index adb916b47f86b92c9d4b641f9a753b0a9cfd467c..b354ddd85de5bbba92642d242673e394516bc4f4 100755 GIT binary patch delta 34 qcmdn9fU994S3?Wq7ABhs{0yo2vncS{S!5HS_`iCw2u_ 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 47f15e245c15a9fe2eca8e708073e04c5a1aaf61..ef46c65cb17aeab83827e66f2be5cef180c72c7b 100755 GIT binary patch delta 34 qcmbQUkn6!hu7(!IElhJJ@H;RtG(<8pFz6*aw7qunn0`Ny$rJ$Au?w#N delta 13 VcmaE`kZaCDu7(!IElhJJ001hp1-bwL 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 8ac5f065cd346b839431a1510fa499217628e6a1..bda39599bb87505b069adac07e44195c4597c57c 100755 GIT binary patch delta 31 ncmX@IkgH=6S3?Wq7N#Q;rZ-Gr;$ZJJdDQ*d$z%HZcqUT-)ZYy1 delta 13 UcmeBJ#C2pLS3?Wq7N#Q;04OH~vj6}9 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), + ), + ), + ), + ], + ); } }