From 0a71a194b9f88d478a81e2c9f3b84bbf59a42ec5 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sat, 22 Jun 2024 16:34:02 +0300 Subject: [PATCH] first commit --- .gitignore | 46 + .metadata | 45 + README.md | 17 + analysis_options.yaml | 28 + android/.gitignore | 13 + android/app/build.gradle | 70 + android/app/google-services.json | 150 + android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 44 + .../com/example/sefer_admin1/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 1502 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 927 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 2051 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 3092 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 4034 bytes .../app/src/main/res/values-night/styles.xml | 18 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 32 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle | 29 + assets/images/logo.png | Bin 0 -> 12745 bytes assets/notify.mp3 | Bin 0 -> 160044 bytes firebase.json | 1 + ios/.gitignore | 34 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 2 + ios/Flutter/Release.xcconfig | 2 + ios/Podfile | 44 + ios/Podfile.lock | 192 + ios/Runner.xcodeproj/project.pbxproj | 757 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 31 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 41383 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 358 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 789 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1230 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 507 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1210 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1794 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 789 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1739 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2480 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 987 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 2040 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1156 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 2424 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2480 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3836 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 1502 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 3092 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1665 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3247 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3495 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/GoogleService-Info.plist | 36 + ios/Runner/Info.plist | 49 + ios/Runner/Runner-Bridging-Header.h | 1 + ios/Runner/Runner.entitlements | 8 + ios/RunnerTests/RunnerTests.swift | 12 + lib/constant/api_key.dart | 72 + lib/constant/box_name.dart | 73 + lib/constant/char_map.dart | 68 + lib/constant/colors.dart | 14 + lib/constant/credential.dart | 144 + lib/constant/info.dart | 4469 +++++++++++++++++ lib/constant/links.dart | 225 + lib/constant/style.dart | 80 + lib/constant/table_names.dart | 9 + .../admin/captain_admin_controller.dart | 105 + .../admin/dashboard_controller.dart | 38 + .../admin/passenger_admin_controller.dart | 108 + .../admin/ride_admin_controller.dart | 73 + .../admin/wallet_admin_controller.dart | 189 + lib/controller/bank_account/payout.dart | 116 + lib/controller/firebase/firbase_messge.dart | 461 ++ .../firebase/local_notification.dart | 29 + lib/controller/functions/crud.dart | 484 ++ lib/controller/functions/custom_pant.dart | 26 + lib/controller/functions/device_info.dart | 90 + .../functions/digit_obsecur_formate.dart | 42 + .../functions/document_scanner.dart | 41 + lib/controller/functions/gemeni.dart | 829 +++ lib/controller/functions/launch.dart | 63 + lib/controller/functions/llama_ai.dart | 36 + .../functions/location_controller.dart | 133 + .../functions/location_permission.dart | 16 + lib/controller/functions/log_out.dart | 181 + lib/controller/functions/scan_id_card.dart | 25 + lib/controller/functions/secure_storage.dart | 14 + lib/controller/functions/upload_image.dart | 108 + lib/controller/notification_controller.dart | 115 + lib/firebase_options.dart | 70 + lib/main.dart | 64 + lib/models/db_sql.dart | 116 + lib/models/feedback_qury.sql | 40 + lib/models/model/admin/monthly_ride.dart | 21 + lib/models/model/admin/passenger_model.dart | 79 + .../model/admin/rides_summary_model.dart | 12 + lib/models/model/locations.dart | 34 + lib/models/model/onboarding_model.dart | 30 + lib/print.dart | 13 + lib/views/admin/admin_home_page.dart | 393 ++ lib/views/admin/captain/captain.dart | 222 + lib/views/admin/captain/captain_details.dart | 167 + lib/views/admin/captain/form_captain.dart | 84 + lib/views/admin/passenger/form_passenger.dart | 86 + lib/views/admin/passenger/passenger.dart | 204 + .../passenger/passenger_details_page.dart | 167 + lib/views/admin/rides/rides.dart | 236 + lib/views/admin/static/static.dart | 13 + lib/views/admin/wallet/wallet.dart | 83 + lib/views/widgets/circle_container.dart | 63 + lib/views/widgets/elevated_btn.dart | 47 + lib/views/widgets/icon_widget_menu.dart | 66 + lib/views/widgets/my_scafold.dart | 50 + lib/views/widgets/my_textField.dart | 65 + lib/views/widgets/mycircular.dart | 37 + linux/.gitignore | 1 + linux/CMakeLists.txt | 145 + linux/flutter/CMakeLists.txt | 88 + linux/flutter/generated_plugin_registrant.cc | 19 + linux/flutter/generated_plugin_registrant.h | 15 + linux/flutter/generated_plugins.cmake | 25 + linux/main.cc | 6 + linux/my_application.cc | 124 + linux/my_application.h | 18 + macos/.gitignore | 7 + macos/Flutter/Flutter-Debug.xcconfig | 2 + macos/Flutter/Flutter-Release.xcconfig | 2 + macos/Flutter/GeneratedPluginRegistrant.swift | 26 + macos/Podfile | 43 + macos/Runner.xcodeproj/project.pbxproj | 705 +++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes macos/Runner/Base.lproj/MainMenu.xib | 343 ++ macos/Runner/Configs/AppInfo.xcconfig | 14 + macos/Runner/Configs/Debug.xcconfig | 2 + macos/Runner/Configs/Release.xcconfig | 2 + macos/Runner/Configs/Warnings.xcconfig | 13 + macos/Runner/DebugProfile.entitlements | 12 + macos/Runner/Info.plist | 32 + macos/Runner/MainFlutterWindow.swift | 15 + macos/Runner/Release.entitlements | 8 + macos/RunnerTests/RunnerTests.swift | 12 + pubspec.lock | 1138 +++++ pubspec.yaml | 91 + test/widget_test.dart | 30 + web/favicon.png | Bin 0 -> 917 bytes web/icons/Icon-192.png | Bin 0 -> 5292 bytes web/icons/Icon-512.png | Bin 0 -> 8252 bytes web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes web/index.html | 59 + web/manifest.json | 35 + windows/.gitignore | 17 + windows/CMakeLists.txt | 108 + windows/flutter/CMakeLists.txt | 109 + .../flutter/generated_plugin_registrant.cc | 23 + windows/flutter/generated_plugin_registrant.h | 15 + windows/flutter/generated_plugins.cmake | 27 + windows/runner/CMakeLists.txt | 40 + windows/runner/Runner.rc | 121 + windows/runner/flutter_window.cpp | 71 + windows/runner/flutter_window.h | 33 + windows/runner/main.cpp | 43 + windows/runner/resource.h | 16 + windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes windows/runner/runner.exe.manifest | 20 + windows/runner/utils.cpp | 65 + windows/runner/utils.h | 19 + windows/runner/win32_window.cpp | 288 ++ windows/runner/win32_window.h | 102 + 205 files changed, 17401 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/google-services.json create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/example/sefer_admin1/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 assets/images/logo.png create mode 100644 assets/notify.mp3 create mode 100644 firebase.json create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/GoogleService-Info.plist create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/Runner/Runner.entitlements create mode 100644 ios/RunnerTests/RunnerTests.swift create mode 100644 lib/constant/api_key.dart create mode 100644 lib/constant/box_name.dart create mode 100644 lib/constant/char_map.dart create mode 100644 lib/constant/colors.dart create mode 100644 lib/constant/credential.dart create mode 100644 lib/constant/info.dart create mode 100644 lib/constant/links.dart create mode 100644 lib/constant/style.dart create mode 100644 lib/constant/table_names.dart create mode 100644 lib/controller/admin/captain_admin_controller.dart create mode 100644 lib/controller/admin/dashboard_controller.dart create mode 100644 lib/controller/admin/passenger_admin_controller.dart create mode 100644 lib/controller/admin/ride_admin_controller.dart create mode 100644 lib/controller/admin/wallet_admin_controller.dart create mode 100644 lib/controller/bank_account/payout.dart create mode 100644 lib/controller/firebase/firbase_messge.dart create mode 100644 lib/controller/firebase/local_notification.dart create mode 100644 lib/controller/functions/crud.dart create mode 100644 lib/controller/functions/custom_pant.dart create mode 100644 lib/controller/functions/device_info.dart create mode 100644 lib/controller/functions/digit_obsecur_formate.dart create mode 100644 lib/controller/functions/document_scanner.dart create mode 100644 lib/controller/functions/gemeni.dart create mode 100644 lib/controller/functions/launch.dart create mode 100644 lib/controller/functions/llama_ai.dart create mode 100644 lib/controller/functions/location_controller.dart create mode 100644 lib/controller/functions/location_permission.dart create mode 100644 lib/controller/functions/log_out.dart create mode 100644 lib/controller/functions/scan_id_card.dart create mode 100644 lib/controller/functions/secure_storage.dart create mode 100644 lib/controller/functions/upload_image.dart create mode 100644 lib/controller/notification_controller.dart create mode 100644 lib/firebase_options.dart create mode 100644 lib/main.dart create mode 100644 lib/models/db_sql.dart create mode 100644 lib/models/feedback_qury.sql create mode 100644 lib/models/model/admin/monthly_ride.dart create mode 100644 lib/models/model/admin/passenger_model.dart create mode 100644 lib/models/model/admin/rides_summary_model.dart create mode 100644 lib/models/model/locations.dart create mode 100644 lib/models/model/onboarding_model.dart create mode 100644 lib/print.dart create mode 100644 lib/views/admin/admin_home_page.dart create mode 100644 lib/views/admin/captain/captain.dart create mode 100644 lib/views/admin/captain/captain_details.dart create mode 100644 lib/views/admin/captain/form_captain.dart create mode 100644 lib/views/admin/passenger/form_passenger.dart create mode 100644 lib/views/admin/passenger/passenger.dart create mode 100644 lib/views/admin/passenger/passenger_details_page.dart create mode 100644 lib/views/admin/rides/rides.dart create mode 100644 lib/views/admin/static/static.dart create mode 100644 lib/views/admin/wallet/wallet.dart create mode 100644 lib/views/widgets/circle_container.dart create mode 100644 lib/views/widgets/elevated_btn.dart create mode 100644 lib/views/widgets/icon_widget_menu.dart create mode 100644 lib/views/widgets/my_scafold.dart create mode 100644 lib/views/widgets/my_textField.dart create mode 100644 lib/views/widgets/mycircular.dart create mode 100644 linux/.gitignore create mode 100644 linux/CMakeLists.txt create mode 100644 linux/flutter/CMakeLists.txt create mode 100644 linux/flutter/generated_plugin_registrant.cc create mode 100644 linux/flutter/generated_plugin_registrant.h create mode 100644 linux/flutter/generated_plugins.cmake create mode 100644 linux/main.cc create mode 100644 linux/my_application.cc create mode 100644 linux/my_application.h create mode 100644 macos/.gitignore create mode 100644 macos/Flutter/Flutter-Debug.xcconfig create mode 100644 macos/Flutter/Flutter-Release.xcconfig create mode 100644 macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 macos/Podfile create mode 100644 macos/Runner.xcodeproj/project.pbxproj create mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 macos/Runner/AppDelegate.swift create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 macos/Runner/Base.lproj/MainMenu.xib create mode 100644 macos/Runner/Configs/AppInfo.xcconfig create mode 100644 macos/Runner/Configs/Debug.xcconfig create mode 100644 macos/Runner/Configs/Release.xcconfig create mode 100644 macos/Runner/Configs/Warnings.xcconfig create mode 100644 macos/Runner/DebugProfile.entitlements create mode 100644 macos/Runner/Info.plist create mode 100644 macos/Runner/MainFlutterWindow.swift create mode 100644 macos/Runner/Release.entitlements create mode 100644 macos/RunnerTests/RunnerTests.swift create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart create mode 100644 web/favicon.png create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/icons/Icon-maskable-192.png create mode 100644 web/icons/Icon-maskable-512.png create mode 100644 web/index.html create mode 100644 web/manifest.json create mode 100644 windows/.gitignore create mode 100644 windows/CMakeLists.txt create mode 100644 windows/flutter/CMakeLists.txt create mode 100644 windows/flutter/generated_plugin_registrant.cc create mode 100644 windows/flutter/generated_plugin_registrant.h create mode 100644 windows/flutter/generated_plugins.cmake create mode 100644 windows/runner/CMakeLists.txt create mode 100644 windows/runner/Runner.rc create mode 100644 windows/runner/flutter_window.cpp create mode 100644 windows/runner/flutter_window.h create mode 100644 windows/runner/main.cpp create mode 100644 windows/runner/resource.h create mode 100644 windows/runner/resources/app_icon.ico create mode 100644 windows/runner/runner.exe.manifest create mode 100644 windows/runner/utils.cpp create mode 100644 windows/runner/utils.h create mode 100644 windows/runner/win32_window.cpp create mode 100644 windows/runner/win32_window.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..014d0e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols +.env + +lib/env/env.dart +lib/env/env.g.dart +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..94c106f --- /dev/null +++ b/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "68bfaea224880b488c617afe30ab12091ea8fa4e" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + base_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + - platform: android + create_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + base_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + - platform: ios + create_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + base_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + - platform: linux + create_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + base_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + - platform: macos + create_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + base_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + - platform: web + create_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + base_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + - platform: windows + create_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + base_revision: 68bfaea224880b488c617afe30ab12091ea8fa4e + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..92aac27 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# sefer_admin1 + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. +# seferAdmin diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..b341872 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,70 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "com.example.sefer_admin1" + compileSdk flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.sefer_admin1" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion 23 + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies {} diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..2993aac --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,150 @@ +{ + "project_info": { + "project_number": "594687661098", + "project_id": "ride-b1bd8", + "storage_bucket": "ride-b1bd8.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:594687661098:android:8ec72f5f8b0b0ab8595f53", + "android_client_info": { + "package_name": "com.example.sefer_admin1" + } + }, + "oauth_client": [ + { + "client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "594687661098-2hfb9gumub3j60vb7mqtq794k8spihuh.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.mobileapp.store.ride" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:594687661098:android:683982cbf71fa423595f53", + "android_client_info": { + "package_name": "com.mobileapp.store.ride" + } + }, + "oauth_client": [ + { + "client_id": "594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.mobileapp.store.ride", + "certificate_hash": "9bf3876c66e490f30cd7982fa972d8e52e0edbb6" + } + }, + { + "client_id": "594687661098-4f8qbb4r223su1pphor33l3oe0ie2v46.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.mobileapp.store.ride", + "certificate_hash": "765bbb7c5d30bc58a7ba44372db614d6bbe6e34d" + } + }, + { + "client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "594687661098-2hfb9gumub3j60vb7mqtq794k8spihuh.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.mobileapp.store.ride" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:594687661098:android:46557bd4f534b5bb595f53", + "android_client_info": { + "package_name": "com.sefer_driver" + } + }, + "oauth_client": [ + { + "client_id": "594687661098-7mj1ngkp5aodosos3gsr4252qfemuvan.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.sefer_driver", + "certificate_hash": "765bbb7c5d30bc58a7ba44372db614d6bbe6e34d" + } + }, + { + "client_id": "594687661098-op7a9cpgm9dilgh8nl48bu6aor55f7qj.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.sefer_driver", + "certificate_hash": "6f83a0b80b7e1b30b3dd42811cbc2c60ee931a3b" + } + }, + { + "client_id": "594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "594687661098-2hfb9gumub3j60vb7mqtq794k8spihuh.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.mobileapp.store.ride" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8ed9141 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/example/sefer_admin1/MainActivity.kt b/android/app/src/main/kotlin/com/example/sefer_admin1/MainActivity.kt new file mode 100644 index 0000000..7523148 --- /dev/null +++ b/android/app/src/main/kotlin/com/example/sefer_admin1/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.sefer_admin1 + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db93cb7555e9c589cbb0aa581b502db7f8598259 GIT binary patch literal 1502 zcma)+`#Tc~7{`Z=*@zhB(lJTql8PKDmzH~)7NI()R#Z#KWiD%3?YK=^Zf%q>F>EJ7 zb2@Da$*6;4tn9F|r&uUkS&cTW&dziGfOCF$zwh(B&-=so`F@}0a|In9YzVQ00002P z(2#%#%?|lzz`7cZlCpyV08nFS0P+xCOM3ICkSG*vurdqAgGHA2>xJ3|mcyw55R*v0 zURf980(7lG2h5SM;|_Vx#e0?I@*t-`R^d9it#r9GrwO(`u>7szQaOI;%hv8klXKZq zAD`V++YcM9!M3rD{;Z|DCrk{dZmLg;SS*_Pt_ED*y{{BtA3`$Ov`62h4ycdL0V0sv zRJhiEoO{!eS+bY6VtkH2&AVcpgG4do14j8E_XPQFnYrYv2|<7;^HF0 z&kv)oit#TlPJi78>JHzxZ=;QkO;t^e#~r0lTvc6O9&lIsyfNnCg9qs7X!EG3sGBdo z)^0}`H_FjSgPED}=(Y!KdFB{nzNpc4I`+;F>`*C1CnJmy4P~fw(tEan(Lqd0V_va$fkWv@!7`Hk$ zHTB058#{`(%8`Oed4+{wOKa=SvpRyM;hXM+?1gcAf?D+(YSk8nK69q2w(#+FhXXD$ z|ANgStKFNycKX8n{CpL0)~x~lba%!(>JN7DaS)NEV@|1Q>1E1cXdi;bV%cJ`*y8Pt z6syCtjtNL%8%8)YJA3Nt8`EYTw;y{VfIJ>=?DZ3}V*M2%H#TT*V6%y-sn>w6c>|Nn zt(y7v?UL%tl3jjYUJ8ZHFm(v$Kg{~DGw8TmtczLV6&P}Y#;&MtjZaK`4$|6`fih;c zwl<1>Pkz6hvB$VVJwJa|jiVY#rPBL^Y-pnEQ%$7x0%l~U>F2LX-0`~y1*G=&ZM%r7 z9SVga_3QkY9XEBRz?X*3Xt3_RS0cgai2chDI=7&G<*gDkQc|C$-psGEQM#Ykx|8SP zsWjR`&SnP(7MmTpPBu3e+|kitE`WXqP(k@VN~T-cMsRFOQQ^wMLVOjSJ~z7k z=OJ|=YD_pa`r&C2`~+ZL#ekUiS-GJ ocQlq%x*K_>;r|2gUp#&>BwliWg>i7+8g2tZ1H%LE?mdz7Hye7!q5uE@ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uqm+dq^O#7i*a(TO4Qq2DWGX~bBErUArm|ooQ<0gc z@9*Dx{riuvdvEuo?x*yQ^Ugi*_c_0Fe)qm-17OED#-=&|y;uUOu>@3O38=;rP>m&^ z8cRSmh6yAkB_T305;HS1MosAwh6yw@G$1@Y{Cf)c`T3!+un^wf-iU~Zz}eZE5!1Sa zAp+&)85?unGo}MTwDw6iv z+8PcI57E@rgzW5W1O^7;`uZ9{K|yG4Zk91SJ3ClfT0&`QDLy|xC0qCR_jr4IgWYb& z@bIv?0y#N35+E5H8Ie2X)_aDU0sNcjYUdI3bwbm(bv}}0$l0b+*}L{ z49M8(>S`Is1)!v<0>#C}l72EdIqB@5n3zCkXQ#YZQc@xU%nlEDKtKTU^72F=BqRi> zsi|_!{QSIR#xwy2$MlnniwkUSZaUvPK0cOxo}8SFf`S6s|IE(x^t5a_W`e<&m6gF} z`|t(1ZthYir9~ zfv~VJ35xuw^i54oAwE7{+W!9j^18RThl7Iy#Kpxq?+t`iiX~Jlngqtj$K~&DoS&bg zqN3ureg@0Rf_6=dUnm3h*(5j}>~+EZ{iAtoww|Ib?l({h!zIA&;UIp{QO=|5DGOS-FOWh76fc z$*&Tvt*wU5W&Nz88cRSmmVjz30o7Ons<8xA^94Q|UuxTtT$%s?002ovPDHLkV1n|} BvKasX literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..09d4391482be68e9e4a07fab769b5de337d16eb1 GIT binary patch literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6b78c9cbd2e67b60d5378d1457e093da6d980d90 GIT binary patch literal 2051 zcmb_d`8(7L7yr&=Frkd~j^&!j#K>|(2!qg&B{##+P=m{8EKzAf%rx2cCd=GpW^AQo z8BI#UOu5NcWH*r|Ygw|CWwPCQ|AqH?e>mqn&v~Bnob!A>pXYp1-CQwJ`<3n?NY0y{Pdg7peQx_^SLgUw$Knpm$}GQ(sH&4BXh}eP!S_I+jMSbTVHlW9%r7 z1dTgeK##dP6%KoITbyu8#6Sa_3j=*f0fOuR!~db}d>DeQI?p2YmD)Jn)0;-;bfrF| zaspb;cH|k`17c7pw6DlktUb?Ir@s<^&$R&E5$8}OV+P{Jtewq1D0)Ce3mkgOaq#Nm z5WV>}+_u1q5@b;vk(xvOwKnfgM|m(?UR|Cp2JI8=qCq5n%Ru?4YZ97LU^fHQ-+%=_ zW*=W$91=9Y&(XG(QZg!(J>qJh;<0IW%6e&(tBppZm(8XiFzI7Kt7|>4t`L=sNpf+U z%Z(GTPlsf{r2aB{c^%K&f*b1#pDuP4+8D*Iho)l!lO4preyS#BRl(6WOgruyChzXL z;3*#O^$@m6lBDT*i0pr6jWnJ9emL|Zr1!od(WmNdyBX$=3Y&9jjMqIsSoPLy9Gm28 z{WeMJ$@P^9HYY>Ps%K@gBCw8ea*b1*dPDIV+ zkTzLXl>BzO4u-P3U38`Z-QD~6jK{awZ#^a0Z92zK-mTQ_kjIzn-W>nLJRm`4L=jwa znqK_Kg@H0tYK__6QwlO*92d4!0iQA_!F0QnOCGMqgtgyNgb@{idw{WbaMxVrf$ zzWW<*%9np2q=5>!koMDY19Tl+>D6yNKX-RxPehCZ-0Lf}W5iD9PtO9~m+IrTjvHSZ zwMe+2EXe>4d;N@V2<1O*6zmBF5eGh36Z&LgtD5+c$!Th`%R3Q;3T)45TRV5v^AO-S zGv0V>4rLSHdQV@?mm5P*Q_wwqPz{as(++69{c~*|7b95JTpZ<^(}U<|_3)6*Zs@BHe%4L4+Rj-1KwDzZ(^QOW*3QeV!zS*)oG)cpTUE9K%fq)Ko?(Q8nCs#=uR}9 zsE1}n-UYB;qiq;Xk<8uuMK*1bmqsBx;z(T-8l;7hP}Fn& zSYSnNMiAO_wAp_#HJubZ`a_4Fx4~_v`yV>Wj%|bv*XWj5&A#U76`tqD@aXym*;R^t za}ISg9=9CB$9R^y=NtHN+sp6366PUDaq=U8xl_945&p$my2!@XsI&o8aLhJ}%OleUfTpQwr@qOiBn$o4$@jGYB`yN_f_}ZGO z!Ao5neyQ)0YtZ-tX>B$irYC_$A7nssa3#^PrOTS+m&o0 zFG$2%O$wg~yTz2z4YjAV9xi>GIu$-6J?te*RV^z_^gM0-8vUx^<^k<PbU?KXrK!5teXV)mixAv?(fFhOngJ23Q;v198{y)w z4FbIssf;l40{@G}DR-&i{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..397b79b59168437da258be5222104945ec181ba7 GIT binary patch literal 3092 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 ZWsP?=quRCOjNd+!$qfsG_j)dv{{n(Eo^JpE literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0db98010d6039b632b6c0d8344c5a40e3aa07244 GIT binary patch literal 4034 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..f9e7f92 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,32 @@ +buildscript { + ext.kotlin_version = '2.0.0' // Update to the latest version + + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "com.android.tools.build:gradle:8.1.4" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..598d13f --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a6c0c1c --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..816dbe0 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d7dbea8f87f152bef171ed0b3d37d775765a80be GIT binary patch literal 12745 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

w*oVob| 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 yETk_;#*h>^k3MWGSRycV + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..04c36cf --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,44 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '14.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..b48d476 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,192 @@ +PODS: + - AppAuth (1.7.5): + - AppAuth/Core (= 1.7.5) + - AppAuth/ExternalUserAgent (= 1.7.5) + - AppAuth/Core (1.7.5) + - AppAuth/ExternalUserAgent (1.7.5): + - AppAuth/Core + - Firebase/CoreOnly (10.25.0): + - FirebaseCore (= 10.25.0) + - Firebase/Messaging (10.25.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 10.25.0) + - firebase_core (2.32.0): + - Firebase/CoreOnly (= 10.25.0) + - Flutter + - firebase_messaging (14.9.4): + - Firebase/Messaging (= 10.25.0) + - firebase_core + - Flutter + - FirebaseCore (10.25.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreInternal (10.27.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.27.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseMessaging (10.25.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.3) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Reachability (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - nanopb (< 2.30911.0, >= 2.30908.0) + - Flutter (1.0.0) + - flutter_secure_storage (6.0.0): + - Flutter + - google_sign_in_ios (0.0.1): + - AppAuth (>= 1.7.4) + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 7.1) + - GTMSessionFetcher (>= 3.4.0) + - GoogleDataTransport (9.4.1): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30911.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleSignIn (7.1.0): + - AppAuth (< 2.0, >= 1.7.3) + - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMSessionFetcher/Core (~> 3.3) + - GoogleUtilities/AppDelegateSwizzler (7.13.3): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Privacy + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.13.3): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (7.13.3): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.13.3)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.3) + - GoogleUtilities/Reachability (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.4.1): + - GTMSessionFetcher/Full (= 3.4.1) + - GTMSessionFetcher/Core (3.4.1) + - GTMSessionFetcher/Full (3.4.1): + - GTMSessionFetcher/Core + - local_auth_darwin (0.0.1): + - Flutter + - location (0.0.1): + - Flutter + - nanopb (2.30910.0): + - nanopb/decode (= 2.30910.0) + - nanopb/encode (= 2.30910.0) + - nanopb/decode (2.30910.0) + - nanopb/encode (2.30910.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.4.0) + - sqflite (0.0.3): + - Flutter + - FlutterMacOS + - url_launcher_ios (0.0.1): + - Flutter + - webview_flutter_wkwebview (0.0.1): + - Flutter + +DEPENDENCIES: + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - Flutter (from `Flutter`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) + - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) + - location (from `.symlinks/plugins/location/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - sqflite (from `.symlinks/plugins/sqflite/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) + +SPEC REPOS: + trunk: + - AppAuth + - Firebase + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + Flutter: + :path: Flutter + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + google_sign_in_ios: + :path: ".symlinks/plugins/google_sign_in_ios/darwin" + local_auth_darwin: + :path: ".symlinks/plugins/local_auth_darwin/darwin" + location: + :path: ".symlinks/plugins/location/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + sqflite: + :path: ".symlinks/plugins/sqflite/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" + +SPEC CHECKSUMS: + AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa + Firebase: 0312a2352584f782ea56f66d91606891d4607f06 + firebase_core: a626d00494efa398e7c54f25f1454a64c8abf197 + firebase_messaging: 06391e8f35dc65a00c56580266285263d2861f10 + FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483 + FirebaseCoreInternal: 4b297a2d56063dbea2c1d0d04222d44a8d058862 + FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869 + FirebaseMessaging: 88950ba9485052891ebe26f6c43a52bb62248952 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 + google_sign_in_ios: 07375bfbf2620bc93a602c0e27160d6afc6ead38 + GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a + GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db + GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + GTMSessionFetcher: 8000756fc1c19d2e5697b90311f7832d2e33f6cd + local_auth_darwin: 4d56c90c2683319835a61274b57620df9c4520ab + location: d5cf8598915965547c3f36761ae9cc4f4e87d22e + nanopb: 438bc412db1928dac798aa6fd75726007be04262 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + webview_flutter_wkwebview: be0f0d33777f1bfd0c9fdcb594786704dbf65f36 + +PODFILE CHECKSUM: 1959d098c91d8a792531a723c4a9d7e9f6a01e38 + +COCOAPODS: 1.15.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..e9f7149 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,757 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 536131ECA2F90A36243E82F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 51EDD0F6DE0C2DD1B481E60C /* GoogleService-Info.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + AE788943CA93312FDB0A3D6C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B7E216D92402E89BBF0C8A6 /* Pods_RunnerTests.framework */; }; + B5D96EA9C34A11D9DC922EB4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9AC52F9E7303DD2AADC56F7 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3DD7F287CDCC3C5A3FC9B074 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 51EDD0F6DE0C2DD1B481E60C /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 5BACD61BA97701EA585BB32D /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 69F3204B769FEC2193D583DD /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7B365EAF9143E50C184FBF9C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 8B7E216D92402E89BBF0C8A6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A9AC52F9E7303DD2AADC56F7 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C66754E42C263D38002C21AF /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + D3C7EF4530833ECC59D933EB /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + EE8DDDC671B36FB3C0532FA2 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B5D96EA9C34A11D9DC922EB4 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AEAB95EFF3B3BF7F893B510B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AE788943CA93312FDB0A3D6C /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2547B9228653078BD5BC8D85 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A9AC52F9E7303DD2AADC56F7 /* Pods_Runner.framework */, + 8B7E216D92402E89BBF0C8A6 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 89895ABD55CE43E236B6CAF3 /* Pods */ = { + isa = PBXGroup; + children = ( + 3DD7F287CDCC3C5A3FC9B074 /* Pods-Runner.debug.xcconfig */, + 69F3204B769FEC2193D583DD /* Pods-Runner.release.xcconfig */, + 5BACD61BA97701EA585BB32D /* Pods-Runner.profile.xcconfig */, + 7B365EAF9143E50C184FBF9C /* Pods-RunnerTests.debug.xcconfig */, + EE8DDDC671B36FB3C0532FA2 /* Pods-RunnerTests.release.xcconfig */, + D3C7EF4530833ECC59D933EB /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 89895ABD55CE43E236B6CAF3 /* Pods */, + 2547B9228653078BD5BC8D85 /* Frameworks */, + 51EDD0F6DE0C2DD1B481E60C /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + C66754E42C263D38002C21AF /* Runner.entitlements */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + B9EB5DEA5F772729C796DD11 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + AEAB95EFF3B3BF7F893B510B /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + F30F6A7446087F285F80AA2C /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + E9260FFCE0F15D904C6E7C16 /* [CP] Embed Pods Frameworks */, + 6A69BFBF5DAB5F688C4AF4E3 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 536131ECA2F90A36243E82F1 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 6A69BFBF5DAB5F688C4AF4E3 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + B9EB5DEA5F772729C796DD11 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E9260FFCE0F15D904C6E7C16 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + F30F6A7446087F285F80AA2C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7B365EAF9143E50C184FBF9C /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EE8DDDC671B36FB3C0532FA2 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D3C7EF4530833ECC59D933EB /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..8e3ca5d --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..beb37e3 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,31 @@ +// import UIKit +// import Flutter + +// @UIApplicationMain +// @objc class AppDelegate: FlutterAppDelegate { +// override func application( +// _ application: UIApplication, +// didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? +// ) -> Bool { +// GeneratedPluginRegistrant.register(with: self) +// return super.application(application, didFinishLaunchingWithOptions: launchOptions) +// } +// } + +import UIKit +import Flutter +import FirebaseCore + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + // GMSServices.provideAPIKey("AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0") + FirebaseApp.configure() + GeneratedPluginRegistrant.register(with: self) + return true + } +} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..6969d87be9cc3b02e3d88db8b1b0cfc3f0a37d29 GIT binary patch literal 41383 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 Ef@$5CyZ`_I literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb28c28f78989239fb8a8ff2c92cddded625f79 GIT binary patch literal 789 zcmV+w1M2*VP)Jflh#*?H$xXDVP{STj(I#pWR1kqdkS*FskPAf+OG6^X z78OKkLA&q|2sBzmL@(O(0DE}({UAy1joUcQy%O`?oSDPud^~4<=Zr-F(#Yc!{cphE zA_K)n28xXg6dM^RHa{C!US5vd+gqg5((RU_fYZ~{*xK4cEEfAN&u_^YSX^9;-rinl zG@ASbwzs#Vs;UZ|ot>ztsKE90^>?~5$r(62Jj^YPWM5w&78e)44fQcO0kv8!j7DST zd|+T8zkvPy{U|6Xz|PJNnwy)U*Xz;P*ob&Mj%YN>eap+s7#SIXTCGN9WhHKIZlF*o z@b>nGlamv?zP?Her1*S3TwGjWaBz^PoPevVt7vIy;R2eRoW$tpC>|dl@$&M*C>s5# zsVVN01V}fpuCB(z!vi)qH*tA+$-wUJZcI!}U~O#;4u=C}Wo2k>ZH3KdU0q$UTCIGY-|rW^EeZlQH8tV*_!yy3D60yO zj*hUuzYmp4#n0W+(h@u#4;B^{Fg7-Z+S*#K-j$UVK{&xcT97{r70<^|h1>0R)YaAT zIc{lsozwRS0@l~pXBJ+XQnT62RXH;=!-YXbGB-Duxt{t6 zNc(go5|JL5NF=xt3kwVJ^z;Om%fm6gHA$A=KZ$%G(+v$C?j)zPHUpJ!%fgcwdHmzFbvRMdpnrt)rs@adC0b+S*F@JUl!gCntx>x3{-oZf;IjPft(S-`@ux zA0Ie9J%!iTSDGZ8EWD42j65(E?Ck6eE-o%q{`~xe!NEb$*4Bo?!a{1x&d%lqx3siS zT}eraCL=O36589_DYz{zE`p7X4Lm$NfUmDFbai!szrR1MudhRSdAVHA$W(AjN(u=; zR##VHcXt>1`ud=tpn%$)oSeYT%?(yoR$yae1D2PUX{8Zd{qF8=GIc{kL(tIBfb;Wn zsIRXFb#--^oSbA5<(Ub_mHcYXot>R@-Q3(Hf$r|^R7Vp}O--dTt}-V$ARqutOiU<2 zIXgS!?`LLaQu+A!m{wh0m%gYO`EJsI22QL`=<>lqU&CLxA3=BYRZ7t~O z=~1$RW?fTLL;Y}tV`5_X-)L)VBY&0`W`em@LuO}Z;o{b^MV5d1HszbnncXc z&%@#2Ay`^k(*B*8m`K|h?%NzVDXfrNFbc(FgJWuH3Z9>zf9p3sJ`QhhZ=kBGO8%Oh zoD8LgrM*&7NgaBDY|BdwV!JIiU~oCtt(Ji&59r)s^aY zc6R(d3`n?j;bhp_+CpVzC4UbC8(Ix31nR$$^ZZW07*qoM6N<$f_~UJ-~a#s literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..eeafd09379107df346668de011b60e624cb4399a GIT binary patch literal 507 zcmV3YU`VUNg%oYYk$f6|Kl)-{QCIg#7QIf&r=i7OP zck^Cey1n&!mV3`Vr{~l2oYOrVfExr3PH6Che$an}noK54CKKUMsZ@$~yA8A1jKkp| z4C->ZU@#cq@pw?FRD?kzkqA8lfq*cm(P)ItX2WbYgVk!Ku~w@^JRV1}Sj1p3fI^|5 zwIY!SyWI}A+x=hqLny0~CG-3J7!HSsMx)4NGH|=yP%4!)r&g<>)9E0W%aPCLaXcP> zk4hvGghC^eoxh_R4N*m%VnfeDSA&PlZ3yFvb{W?&ydMv;5d%S>Er+a literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..93032072086cde592a1432f86c0dda396fe5d3ca GIT binary patch literal 1210 zcmV;r1V#IaP)gOpQ5F1Rt|LX;sSL((xs88TeBBXJ>9C>J`X$V`Tg48?_rbKwYA zh8rP=GP^L9V?6zzdUyDo`kcMq@6$f}S8txZ_j>L1d)Kp{wbs@rqDT4*(Eqd zDh*XsX{e$~LlspTs;JUXMU{pssx(wlxx~fAk&%%Rb$54b>lSZ9YocjsX=Gz#qij(J z2L}ob4JCbjee&}1qUGgfZQSNfXhk$PHln$e_Z)LT%jUO$ZmoC}w76O2U1(-|9^W7yb0<)2rtcC2D15MG+AZ z9BWb)sT>&@N!HfZbb5Nq=K=x($jr=)>}Ovc8>98XVA)AjW= zMMXvNxvZ=#s;sQ!Yj}oJQ&Tx!Utgz>A3t*J;^IP&kB{8`=g*(~BkAes(ap^b?d&r2I`QhPVIzK<>&LM3-eE2}Y!ND{+IZ5;L^DO4! z;lb?_6BDVXriSwK^U2iIlt*xUe4Izr($bPM6>dJ9RNeL}2Ey?Pi5K(h;bMCB$j*bo~ zekvLr9ZeP%7Ch3uy}eXhTg%U&lamt#1qIQ}%nY~l@$r!)k?JCrkwQe{-P5cTwq?Vas~zlsG*^OryqcoQGb8Gh^|Qp5iKn(<*JIR2?75d1Ei?t z70XLdcr>D-(-sI3?dj>^zgt^d`~fI303)N>bYuPcI~EoeXk}%Ef0U;yD^a|QVx*z1 zt&N{^Is4Av@vcOho13K_kZ9hOC@QkHcvqs@L={yUs;JUXMU{pssx(wlrJ;%{jlV|p Y7qJi8#m2-yIsgCw07*qoM6N<$f&zt76#xJL literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..666e4a21397ea60d7cf65617ade972928d6f3e6a GIT binary patch literal 1794 zcmbtV`#Tc~A75ydHMd;SBoT5+c~39OkzD3-3fsskqvdVOSi^AEES#fph+dZDxXfI# zNNz8-Sl;7SSghQ~IQ5R@l5K8nOzPeHynn)Zp6}(S&-48}-_Q4w3G?>`s~=GZ003ZL zA5VlbBmd|7fyx-$KZOSXfCIjsZb5hVh>JpeuK4NpA#rkup^t93`R_M%ec_t|8U1P&yu%DW$|p~1XV zU^h%XaAniRDSi_SI zH$o*eQcS3%1veTo^3+$jpl#*_Lm+hMKaxj8VdQ<2A}kimYI7iV0E8?5!o0=bX~qs! zl$DtzZm(Be>R30f=e~B=*U~~qeV*m8GrGuRvfURh<)sB%$xe&~)*>4mh@764sb-w8 zH`DkA2n^P1Kwi0mljM_P{UqFc8|S3iezD4~;!7o!O4X41UcUSk3~~6{5Eq7=w+n3# zns2ejU@*EzkKPHLOTb%e7&)O^_X2?<9Ta(Qg(VJ$D_>oWiHwXCO1Dya_1btdvbP1N zE5rkNmS=DEYt<%=GX3ILKe{P)ci1nJ<&vYb9h8DkJbKjZeYZ|D-6_@`rD^1p%M4)n zCnO}a++7QQUQ<(^o2zAivgbEVgJz)o6?r4Q)HTI_XlMw}2;|Jr%)AjnL67Ue&|-G< zhY@AJp-dA)M}iU5%L{?QRE-D2VCXzhV{IO>!1kK^($Z2mOtHD-0dXWewF+du|4s8) zb$k2u{iWyPm|7h22KK|F;-aFTl9Q8JtVfS@)^=C_)8o(vIM-lpAeRW(ISRQnx^;-* z%18%8ycn)2O!CI3%)&F|^;<>f6RchCu3n^O%cUPeq#+Tixaf~KCH-mv1!=Q@g30Igm8XNN#07Yc=*zxs#<3xC+0 z>(gwwSO3rV7LI0S_rLCnqe;tSRyo^N?mhLPoEK3UJyI#ZsVCBzIKRIxgzZ0e@`Tes z|GRf=gyTn?Wky=yzU%YufKu!HiHYFpKT`ha+W~<4yR`Eo?DiV}+dGAe0Z?X+dX-KyRYHp<$HLiz**dVM1ez*Te#Bc?a zbtbh7E>gi4SD_A8$Fb1Ci|$#dfWXnV+;d&sOzz&O$@@K4^>w4Twjhsmhsm1#xo}!#OLm6S6kFe*nH#N=_@>j zYrwlwm(QOp6(l8;(fcG&BohlZmE)t4B7L1@5Wl^SIUbbCf5_)x-s;zaK@e8ca(8;6 za1eN=tR1wvLY$kM6SS14ubwWu@QYLJgPsK&Di`yuj2&-x zOXue{Hkiu^=ytUIvMvWgX5?SU(s?ukf4BMvk3~{Rz&hX}_zqVKuu~WE<|^O3@q&}%R8J9U7s|C%3w<(k=PQ9WBGZ7^ z1V1j6OYP2n%t_k$87>zu!Vca4b%Ujpe|mb21T!HjL9vpw3di-?^mO2GdYtWn-fHuU z2Y*qVcTjTzE*~s`q07bs)kC320wQP>5m#@GG55D7(zj<1n|WDBpQsZBDSJSWW%c#s zvD1W^m&4-(666$d?Zk35L&X-4ko?&}X?=B@vUQnd(nU7XcZgZx+aq^`aYStfE%7Gn z-i~Z&{NGz8sK(pxj6+Jflh#*?H$xXDVP{STj(I#pWR1kqdkS*FskPAf+OG6^X z78OKkLA&q|2sBzmL@(O(0DE}({UAy1joUcQy%O`?oSDPud^~4<=Zr-F(#Yc!{cphE zA_K)n28xXg6dM^RHa{C!US5vd+gqg5((RU_fYZ~{*xK4cEEfAN&u_^YSX^9;-rinl zG@ASbwzs#Vs;UZ|ot>ztsKE90^>?~5$r(62Jj^YPWM5w&78e)44fQcO0kv8!j7DST zd|+T8zkvPy{U|6Xz|PJNnwy)U*Xz;P*ob&Mj%YN>eap+s7#SIXTCGN9WhHKIZlF*o z@b>nGlamv?zP?Her1*S3TwGjWaBz^PoPevVt7vIy;R2eRoW$tpC>|dl@$&M*C>s5# zsVVN01V}fpuCB(z!vi)qH*tA+$-wUJZcI!}U~O#;4u=C}Wo2k>ZH3KdU0q$UTCIGY-|rW^EeZlQH8tV*_!yy3D60yO zj*hUuzYmp4#n0W+(h@u#4;B^{Fg7-Z+S*#K-j$UVK{&xcT97{r70<^|h1>0R)YaAT zIc{lsozwRS0@l~pXBJ+XQnT62RXH;=!-YXbGB-Duxt{t6 zNc(go5|JL5NF=xt3kwVJ^z;Om%f7dR-Bl$e^RsD^~;mz88Dm4|oVpBp59y!EdI zI-$vQD{uP=mw zgR47A&t!Z$*cb7qnhD_n$%^Gt&raPu>XCo)p;gqRHt0ZRW#U!Dkc^sfk(9E*ut>1Z zZc%|@l&qt_pf5B>>yvGxCe64lx8VBv`gwSxcTaW9U@%Iu0`wzK^VE$O+1V<~%gg5T z(GSdAip=9wr>3WI{7+@RUS7f7U%|mmNIiwXz*)O}w1M{=v^Gw(dr#!#`~FB{)eRpBo>I^(r1SvRIj z=H`NCb_Ie89H)GwA!3L$nHfD}kpOMmzQEkFCW>q5RR` z&wDSkw8BJlv{KXUwF|<3<|S#xipd%_*7#MT%`iM8wu46{y*#XK!El+Q!C)zs=_~hW5xG zuo}YIA-as>V#>^0a*vS9$il*Bt4-s2W@hHtU!lN&CXwy_uL4FAB^5}T38TOhv1W2mySu&I45)qhqV9}Q%|%wa{4dtX_IvxE zS_L1U+ZZ7bc`W?Y(9lq|pcHk7GFdOJpfItmWpf+DX(RHF$n2pNk*)@*$aq|pnl=8j zv)b&p={G$hMM>B>Ijg9^w!65pH+!bQ)2D-K2#0f?C2H}-XaAIAa*;G!A2#sR z`MuR22YWI70|TW>x~L6;nrT3d61X$8Cw;8-4jy0Ux88H)GDs)pd^#B8a>d>KvEe9C zsr@m+^ZDryTr|+1aVb~|72KDlZyX9oRzj|9_V>F*PW8tx9ami8;pe+?LN|AJk*&I} zR9Om(b!y$owG@1a^is__tY0N36KWg#zWnW1bEQ&9-g!@=Dp=y0S*my!ku8hG%Jtyb zl6N=kR?p2tVIce(HN#4}hx}?-)<~CGK1I`MgBA0rU#L^yYRN3vb~B zBGzDP?b4~#;caqEOx<@d)+t0U<-voE`Sa4%xv{;=Nl8iLO=&RkAQb8_dC#P|xq0=3 zMy1pk@Jt${43UoA_`55m{b2Qer@?)$ghP(c<+PdCg^&Ujs!{Cb7gsk7W|bh@H!s{- zNxn?;kUj(gff~tz8|>qf+PknEND>3cy3XsSD>VR^jM{;O9h|SP3eU0=(OWzDyc4en zslne_<9-nS8qhkqPM#PaudmV4(C8JJng1E*SUT*dZGOy6-bK63*U>~0dn}}?Ec@6b z8jE`Jz^2w??@n6kYzzRBryhIe**%o z94bd9qmFnXN%6>)cC fp(zRfoAwUhI=IbhL1IbbCk1eIIqS@D3`+P9O^8S^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8509aef893d07d7d316a6f9d7f3b7959988db735 GIT binary patch literal 2480 zcmcJR`9IX#AIC>#EF;pw43mgt*O29+31cfu2sM{n|+%!@d zWM*V(#u}Np$TEyb*2`qFHzp*V3l7pyMJNaal0JXV z_9BpD{y!wdfZ6P-NgoI#8GYW?+A~IEsSuJX=X<0h>wQ#!%AduWQ7Q1$3?46qM^vH~ ztBMVi(n!A4JWbM@VLg)4Ft18^@6*PUk=VdN##?@U#BY|eL;0pPLtC822)MIs&1Lg(uHLL({`TXXUM4pqA5 z8(uTC6ps@mi-Y z(~ujHgo~;(ZMmoXWVohxb`yG5Cd)8Q39(~}p$dai_sC?0)73(IGThoCY7r?ZtC6y= zm6ak&$TYjNduDC!9|Fp+rwHYROCV75rUu{m++Lor_GW}DMJ^5-1XqO^Jvw z;VZ9-AfSLn7eZeE(7Cy>x(N5tThm>3IVWA7%P5(~QW*-)jQYt}IoX%v#Gc1cPfxO%Two@qSB?fHu>8{0dzegy(R&Kb zPIIG9SmPFZOKb?4);&MCwK{7HUvz?fHuyX(V2LLq+*j?##|LUNRmq4F_fq>u>Q3_7 zK6G8qQ;VU27lI(xdVTbdzRyoBrdId%5Ewmpi?05Air$=+Gq zgw?x#}QM`(&x$eTHhfx$Dz5N0>%PnDHK+BP0qUZALEDwx(W_hP9QMjH@*@u$1S;;>g z=p5g>3p@2kt3bO|DFhPmijdApk(#>-G{flD_j7ayRqJLs6{K?nUL;&sB57^m@dK&r zoPuk+XaD+UJ22auUR8afmv9_5(T-_|sZxM6XVl^wp;DGf+emhL4gguf9K6TQRL_TQ z1d-V2^DY!^F)gYLU-(iH_>=o%ym2Meulj1IbEREY)XI)9x~m9fflB-}u(G+??8uhz zeC1i*%pYw^w1}Tv?ru3cByC#)15mQyu3OQFB}39>zDuKwmu3+&G4z9`G8(Yrp-~kW zMhjkH(g2l$|N0FX#;!52BOS38svNAAjkHKvJ)8K8_MyUu5pDprzr6&34HKpQ1*^@H z$Jv7Itq5*?^r`wEJHm~bx=y9^i)v*){2*Awe9Qd<9&IE!fRyAXrZ@knp^dxHLq~@9 zD>8ADc&}L8zu?lMbpOWzQ|%cu3X2fDUL{4;<0J!{9C@V>>jrqkB_usU#CIaW#Q!OF z;~_?aKR3cDLdDNbf65JAlRz9^Eq_}wDC{UaVD)6xgh@}pW0xr^^JhL ztbwkRuMd%5yF1%FvpDz7YT=NGY;+NzKXFO1)HpLXQ!AV8O~YCbn4BEkK;9ckf=-PAV>Fb76ZmWyN&Fn;i4=v3Z9X)9&0XFXd-F_Xm;>ZAHdw6Fz>6Mw;O#z)dd#=hG|#$Q*F5^| z)+8p{YJk_IA8#UT*pK9R~m6QQdsv#vE^(_N3tn3jthPe!`&Hh=K+3gwuWm_UcsBge=GOD zbae$Bh3pki59f73+oL{UA7ed3vJcxA7=Ypqwlcq}qh-H;-uu>OP}q{6hE@;WT%LS% z%I|EBOa>>|;kBSyDm>hCS-Cl}Tyq@FO7{(4*3U-hziKO#-|kG1GaYS=-*DD9XA#5? zJl9KNC{=(*#h?<*2S{%)D*!AdyN!qLO2fUD6}1O_0>0ei5Fs*h+X&eS|1RQV6--Ln z9igP$(S4d$Ry5^{IpLl-2^H@jyn4o#y~u|WybXvgFW(_ND5rb$Ka0XW(D7-SVwzvM R9q3=9lB zVnW{J&AEMF?VWqwTc^EO=WMtAtJC_<-e<3~e(U?z+UINo05kpr47MJCD0C66p^In@ zT|{f>B3eTi(Hgpl)(|QZ6cmJ`qa%ENev0hYB7}-GH#eiRvlFwkvm(2-2w@_=zP?CL zPsiKa+s_s$EiHwkqa(7ivf$9$?r+(M~X<y?d@4k66xyd zLP$sm$5eKwr>APa_8Y223JMC~>gvjIOG^tXDk_kioXp3otE=(w@POmvV>xR@MMY?8 zYC>&oEly5O5D*Z6(9lqprg(C4Qc)&Vi%0`}e0;>j!~{!`2xTfiKOa3kJ?QQ2MPp+l z92^`_TwILS)>h8S-Q69wwzjacvcg$BI5@!B*_onos1k{cj6{5VJjYX0Q#|{_!^7z4 z=zx=x6HAf^&HViQJkrwA5FH(jh=>UE_4V;};o;#}TU+CpgtD`CJ ze2&WO{{EiV3ElDQ>gw?F^1^~uRaNl!_eV-f3f|w}5f~WA*HA{Eo}R2P^7Y;!m6Zf7 z{PFQ|mhkcM;p~tsl~-kDC1;9CibN#noEj8~&`f)HcwlpL6SudwSXx^8_L=VPZeAZm zTwENB?Ck9DE)^Rai`?8?e0+THc{;wav7y`o3Pq@Fq}}RYEH5v!z@N~}lZcy}n|zF< z)nfI3hyw!y{J+J;#f9HLKR@%@QHx@c;NW1c_4D&{&d%K29CC7UFgiMl)YMciA(P1j zgTcThC_%f^*w~o7ThUs&y1KHRh@YPy?>MwRXa^z@8aP2B`}_O+(}QOIs|Z2mC5ebA zD?+iz>gp=Lh=zs+Zrj@0xUH|R=XPjl=&#oB3eTi(Hgpl*3d)rqW literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..42d56003faf1f146cca698f4b89e08e9e49c3e13 GIT binary patch literal 2040 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 ZCTPz=TE&t)Q-Fzz!whMOsDiu1{0r*)k6Qo$ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8509aef893d07d7d316a6f9d7f3b7959988db735 GIT binary patch literal 2480 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 OEscSWiFP&28TCKyAz{4$ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..db93cb7555e9c589cbb0aa581b502db7f8598259 GIT binary patch literal 1502 zcma)+`#Tc~7{`Z=*@zhB(lJTql8PKDmzH~)7NI()R#Z#KWiD%3?YK=^Zf%q>F>EJ7 zb2@Da$*6;4tn9F|r&uUkS&cTW&dziGfOCF$zwh(B&-=so`F@}0a|In9YzVQ00002P z(2#%#%?|lzz`7cZlCpyV08nFS0P+xCOM3ICkSG*vurdqAgGHA2>xJ3|mcyw55R*v0 zURf980(7lG2h5SM;|_Vx#e0?I@*t-`R^d9it#r9GrwO(`u>7szQaOI;%hv8klXKZq zAD`V++YcM9!M3rD{;Z|DCrk{dZmLg;SS*_Pt_ED*y{{BtA3`$Ov`62h4ycdL0V0sv zRJhiEoO{!eS+bY6VtkH2&AVcpgG4do14j8E_XPQFnYrYv2|<7;^HF0 z&kv)oit#TlPJi78>JHzxZ=;QkO;t^e#~r0lTvc6O9&lIsyfNnCg9qs7X!EG3sGBdo z)^0}`H_FjSgPED}=(Y!KdFB{nzNpc4I`+;F>`*C1CnJmy4P~fw(tEan(Lqd0V_va$fkWv@!7`Hk$ zHTB058#{`(%8`Oed4+{wOKa=SvpRyM;hXM+?1gcAf?D+(YSk8nK69q2w(#+FhXXD$ z|ANgStKFNycKX8n{CpL0)~x~lba%!(>JN7DaS)NEV@|1Q>1E1cXdi;bV%cJ`*y8Pt z6syCtjtNL%8%8)YJA3Nt8`EYTw;y{VfIJ>=?DZ3}V*M2%H#TT*V6%y-sn>w6c>|Nn zt(y7v?UL%tl3jjYUJ8ZHFm(v$Kg{~DGw8TmtczLV6&P}Y#;&MtjZaK`4$|6`fih;c zwl<1>Pkz6hvB$VVJwJa|jiVY#rPBL^Y-pnEQ%$7x0%l~U>F2LX-0`~y1*G=&ZM%r7 z9SVga_3QkY9XEBRz?X*3Xt3_RS0cgai2chDI=7&G<*gDkQc|C$-psGEQM#Ykx|8SP zsWjR`&SnP(7MmTpPBu3e+|kitE`WXqP(k@VN~T-cMsRFOQQ^wMLVOjSJ~z7k z=OJ|=YD_pa`r&C2`~+ZL#ekUiS-GJ ocQlq%x*K_>;r|2gUp#&>BwliWg>i7+8g2tZ1H%LE?mdz7Hye7!q5uE@ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..397b79b59168437da258be5222104945ec181ba7 GIT binary patch literal 3092 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 ZWsP?=quRCOjNd+!$qfsG_j)dv{{n(Eo^JpE literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..11d5bf221bb8c395c9c3435ce97e9c73c523bfeb GIT binary patch literal 1665 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e18163194cd77150b4b78e44c713c586cfc94842 GIT binary patch literal 3495 zcmd5<`#;m)ANT1(ZXX&SjKUali}FEZDEFo2+C>b`%XSb} zU)H7a#il@=jH9HtAsh9+yz0DG)kjoSIE(biGuwB)Z<_PiBz$e%4mHIIW3NSTQuAPX zegk2l1DDa}G8E^3gU=_yp|5pQ>5{hzn6}rc{r5pAsy=_5V!B^RDSP zKzAmJg--^zQTMo}hW)=fAgQk;Q=AfB&lP1COF3ca(pXQtG`bktq_x*G% zkE`9F>}co9SedB(cQUYkTGrIY3kq|y_hn3B)~VA`%zoPM#<;@*O$8>Hri#|xdj_*v zr6tv&BgPBEjcC96*_gdX$71XLPsX4v7pH;N=)I;|8p?Q#KSIUNzl=gol#eVWd8fnT z1FyRJ{#8GRlWR(rP#bvF3`|ENaVyd6@z)M+k@h{~MjC311IFtsk*p=h(p7oP${h0C z+!4-vhS|W6X3*18GP&q{X~9ux_aWiPt#8)`JB&dQE*A%Ub38`3)@R$wXo@xT0MRUB z=34}NkaQC(YHr7^k{ktLgjDWk`r|1g zn(ZVA182KNtsip>tj(&X`{`xjYr63VU!Cn6FB^X+NoUj`D< zDYhlok_YG?5+sLX=aSF=LQ%?QBw^e2hn&5R4n)5ta4%O!A{`pdK>RxEypwF z?sj6w@~8BZ%L{pa1xwM_Ra{}$ZroL&Rd}{}$sHn*f?Fe+3L#du$n(2+az)E#3hxHG zUmr_@M6Y)%XRzXZ9q4gIyW8^_9O_L~n1%lMUU16>j(3o0ZyJ)RdU>;Rt4FO6-dVe2 z5;hfL!;|*~4mf@)d-Z_z#lAViboUOhyC$;{nZL=SiF0d&9-oL9!kpd5c^$irD68Y} zN7{ofe@X+-Ck8G&)hus#xjqga73{lSZ3G}H3WHlyh}mv0l;Hxv;zm<>2YYM3JHwo{SKERXvj0IhmxaQ)uv>5?rw@Bob@7EDr z6I0FgfDjM*)lWA=$9 zPbHUH;PE2`-rX%cqTOk50F&k!yE8*dYDVZ5mS99LpbceDBAhFmlW4riR4}#?h1s~Zk53TM(=D(IvXFbQK zkwwC-l*W`SBCWHl{tg(c^fDf`R5x;Kn|#)eg3(~ROT}2)&ATZ(n#-9_6~$9lBdbR6 zpA%0*mHh}1E|6cC%(mNJcQShNe0vfX(zKR8(0%3~&$T(uO=#UoiOV(P?W5m$fNjl@ zAg$3G{%`LXv-?SJw+<%!D|UQ@abLyXfXG0CYozHs7wH(9u|+Delx#@7t#z(;pin6j z_GBL(B~10p_8|zsp0OguOt-y)NJ>45P%z-xeLYr;)gcJc%6yOOTg(b2UU&3q@QyQ< z5?qY?%1Ut&6>L{P*bV^GeHxWdk@&!L{KB`23Y8L+#6_J&AmYE2w`5jV_2X(k`xQoy z2DWT`Y7e8dX;*hEHDcJ7D=U|dZ$EjF^Cm0PQY!uK6Gi$QJ&pij{njuB2@IysFHofn?A76To=i9*d6r_{>viS~Bnz5h4d_{&se(Q6@T=o$EC2E< zA9zU$JpiJ`dtiwiMG@dvpnk#;JB%DI7=7=gzA*ErB+bB|K-R{=yfNwPw{N{pqX(Q3 z>6doDf8pI(Taz-*b48e2pW$qj^C>VzD&1f(%|mC|7I|0_!C#i(TME49F;X)GQ6fIm zM?|A7BxZrinIWygF4p@fDC$1^<-%d)cp^Dbg{ILH^3HOtQbH|GVf?2Gu3$#q|Eajlnf7ZRsa2jmxyEA<1LEw^%7URF;!lbnlJsfW_LUzjQ)8UV)OPho9-Q zyI^41iQvU!$>8-?av(R%asPm#IHazyAsMxfcRq-f0X2) zCfFu^3(lwRj%g9UD4w8rA62yDFS}JC2=t&>ai6NNUXZJXiYUn{R5oD-1S?C+;keqA zDZ`$2WUDLiI_mtd5XjaLFr`~f48Yg__upb)n3CZ+|3yA=6ZnAfA*_&=<>p@T{{v9O B_P_uD literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..0d05278 --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 594687661098-aj48k038fjst4k8jiprfbq8895b11cci.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.594687661098-aj48k038fjst4k8jiprfbq8895b11cci + ANDROID_CLIENT_ID + 594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com + API_KEY + AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM + GCM_SENDER_ID + 594687661098 + PLIST_VERSION + 1 + BUNDLE_ID + com.example.seferAdmin1 + PROJECT_ID + ride-b1bd8 + STORAGE_BUCKET + ride-b1bd8.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:594687661098:ios:9f46a169fad13752595f53 + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..4230939 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Sefer Admin1 + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + sefer_admin1 + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/constant/api_key.dart b/lib/constant/api_key.dart new file mode 100644 index 0000000..f8ae211 --- /dev/null +++ b/lib/constant/api_key.dart @@ -0,0 +1,72 @@ +import '../env/env.dart'; +import 'char_map.dart'; +import 'credential.dart'; + +class AK { + static final AC a = AC(); + + static final String publishableKey = + AC().r(AC().r(AC().r(Env.stripePublishableKe, cn), cC), cs); + static final String secretKey = a.r(a.r(a.r(Env.secretKey, cn), cC), cs); + static final String basicAuthCredentials = + a.r(a.r(a.r(Env.basicAuthCredentials, cn), cC), cs); + static final String accountSIDTwillo = + a.r(a.r(a.r(Env.accountSIDTwillo, cn), cC), cs); + static final String serverAPI = a.r(a.r(a.r(Env.serverAPI, cn), cC), cs); + static final String mapAPIKEY = a.r(a.r(a.r(Env.mapAPIKEY, cn), cC), cs); + static final String twilloRecoveryCode = + a.r(a.r(a.r(Env.twilloRecoveryCode, cn), cC), cs); + static final String authTokenTwillo = + a.r(a.r(a.r(Env.authTokenTwillo, cn), cC), cs); + static final String chatGPTkey = a.r(a.r(a.r(Env.chatGPTkey, cn), cC), cs); + static final String transactionCloude = + a.r(a.r(a.r(Env.transactionCloude, cn), cC), cs); + static final String visionApi = a.r(a.r(a.r(Env.visionApi, cn), cC), cs); + static final String chatGPTkeySefer = + a.r(a.r(a.r(Env.chatGPTkeySefer, cn), cC), cs); + static final String chatGPTkeySeferNew = + a.r(a.r(a.r(Env.chatGPTkeySeferNew, cn), cC), cs); + static final String serverPHP = Env.serverPHP; + static final String llamaKey = a.r(a.r(a.r(Env.llamaKey, cn), cC), cs); + static final String cohere = a.r(a.r(a.r(Env.cohere, cn), cC), cs); + static final String claudeAiAPI = a.r(a.r(a.r(Env.claudeAiAPI, cn), cC), cs); + static final String payPalClientId = + a.r(a.r(a.r(Env.payPalClientId, cn), cC), cs); + static final String payPalSecret = + a.r(a.r(a.r(Env.payPalSecret, cn), cC), cs); + static final String geminiApi = a.r(a.r(a.r(Env.geminiApi, cn), cC), cs); + static final String agoraAppId = a.r(a.r(a.r(Env.agoraAppId, cn), cC), cs); + static final String agoraAppCertificate = + a.r(a.r(a.r(Env.agoraAppCertificate, cn), cC), cs); + static final String payPalClientIdLive = + a.r(a.r(a.r(Env.payPalClientIdLive, cn), cC), cs); + static final String payPalSecretLive = + a.r(a.r(a.r(Env.payPalSecretLive, cn), cC), cs); + static final String integrationIdPayMob = + a.r(a.r(a.r(Env.integrationIdPayMob, cn), cC), cs); + static final String passwordPayMob = + a.r(a.r(a.r(Env.passwordPayMob, cn), cC), cs); + static final String usernamePayMob = + a.r(a.r(a.r(Env.usernamePayMob, cn), cC), cs); + static final String payMobApikey = + a.r(a.r(a.r(Env.payMobApikey, cn), cC), cs); + static final String integrationIdPayMobWallet = + a.r(a.r(a.r(Env.integrationIdPayMobWallet, cn), cC), cs); + static final String smsPasswordEgypt = + a.r(a.r(a.r(Env.smsPasswordEgypt, cn), cC), cs); + static final String ocpApimSubscriptionKey = + a.r(a.r(a.r(Env.ocpApimSubscriptionKey, cn), cC), cs); + static final String chatGPTkeySeferNew4 = + a.r(a.r(a.r(Env.chatGPTkeySeferNew4, cn), cC), cs); + static final String anthropicAIkeySeferNew = + a.r(a.r(a.r(Env.anthropicAIkeySeferNew, cn), cC), cs); + static final String llama3Key = a.r(a.r(a.r(Env.llama3Key, cn), cC), cs); + static final String payMobOutClientSecrret = + a.r(a.r(a.r(Env.payMobOutClientSecrret, cn), cC), cs); + static final String payMobOutClient_id = + a.r(a.r(a.r(Env.payMobOutClient_id, cn), cC), cs); + static final String payMobOutPassword = + a.r(a.r(a.r(Env.payMobOutPassword, cn), cC), cs); + static final String payMobOutUserName = + a.r(a.r(a.r(Env.payMobOutUserName, cn), cC), cs); +} diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart new file mode 100644 index 0000000..932ad42 --- /dev/null +++ b/lib/constant/box_name.dart @@ -0,0 +1,73 @@ +class BoxName { + static const String driverID = "driverID"; + static const String countryCode = "countryCode"; + static const String googlaMapApp = "googlaMapApp"; + + static const String lang = "lang"; + static const String carType = "carType"; + static const String carPlate = "carPlate"; + static const String statusDriverLocation = "statusDriverLocation"; + static const String password = "password"; + static const String arrivalTime = "arrivalTime"; + static const String passwordDriver = "passwordDriver"; + static const String agreeTerms = "agreeTerms"; + static const String addWork = 'addWork'; + static const String addHome = 'addHome'; + static const String tipPercentage = 'tipPercentage'; + static const String accountIdStripeConnect = "accountIdStripeConnect"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String sosPhonePassenger = "sosPhonePassenger"; + static const String sosPhoneDriver = "sosPhoneDriver"; + static const String passengerID = "pasengerID"; + static const String phone = "phone"; + static const String phoneDriver = "phoneDriver"; + static const String dobDriver = "dobDriver"; + static const String sexDriver = "sexDriver"; + static const String lastNameDriver = "lastNameDriver"; + static const String name = "name"; + static const String nameDriver = "nameDriver"; + static const String driverPhotoUrl = "driverPhotoUrl"; + static const String email = "email"; + static const String emailDriver = "emailDriver"; + static const String tokens = "tokens"; + static const String tokensDrivers = "tokensDrivers"; + static const String tokensPassengers = "tokensPassengers"; + static const String tokenFCM = "tokenFCM"; + static const String tokenDriver = "tokenDriver"; + static const String cardNumber = "cardNumber"; + static const String cardNumberDriver = "cardNumberDriver"; + static const String cardHolderName = "cardHolderName"; + static const String cardHolderNameDriver = "cardHolderNameDriver"; + static const String expiryDate = "expiryDate"; + static const String expiryDateDriver = "expiryDateDriver"; + static const String cvvCode = "cvvCode"; + static const String cvvCodeDriver = "cvvCodeDriver"; + static const String passengerWalletDetails = "passengerWalletDetails"; + static const String passengerWalletTotal = "passengerWalletTotal"; + static const String passengerWalletFound = "passengerWalletFound"; + static const String periods = 'periods'; + static const String onBoarding = 'onBoarding'; + static const String stripePublishableKey = 'stripe_publishableKe'; + static const String apiKeyRun = 'apiKeyRun'; + static const String serverAPI = 'serverAPI'; + static const String secretKey = 'secretKey'; + static const String basicAuthCredentials = 'basicAuthCredentials'; + static const String mapAPIKEY = 'mapAPIKEY'; + static const String twilloRecoveryCode = 'twilloRecoveryCode'; + static const String accountSIDTwillo = 'accountSIDTwillo'; + static const String authTokenTwillo = 'authTokenTwillo'; + static const String chatGPTkey = 'chatGPTkey'; + static const String chatGPTkeySefer = 'chatGPTkeySefer'; + static const String transactionCloude = 'transactionCloude'; + static const String visionApi = 'visionApi'; + static const String vin = "vin"; + static const String make = "make"; + static const String model = "model"; + static const String year = "year"; + static const String expirationDate = "expirationDate"; + static const String color = "color"; + static const String owner = "owner"; + static const String registrationDate = "registrationDate"; + static const String recentLocations = 'recentLocations'; + static const String tripData = 'tripData'; +} diff --git a/lib/constant/char_map.dart b/lib/constant/char_map.dart new file mode 100644 index 0000000..d6a6ee7 --- /dev/null +++ b/lib/constant/char_map.dart @@ -0,0 +1,68 @@ +Map cn = { + "0": "3", + "1": "7", + "2": "1", + "3": "9", + "4": "0", + "5": "5", + "6": "2", + "7": "6", + "8": "4", + "9": "8" +}; +Map cs = { + "a": "q", + "b": "x", + "c": "f", + "d": "y", + "e": "j", + "f": "u", + "g": "k", + "h": "w", + "i": "o", + "j": "e", + "k": "g", + "l": "r", + "m": "n", + "n": "b", + "o": "i", + "p": "v", + "q": "a", + "r": "l", + "s": "z", + "t": "c", + "u": "h", + "v": "p", + "w": "t", + "x": "d", + "y": "s", + "z": "m" +}; +Map cC = { + "A": "Q", + "B": "X", + "C": "F", + "D": "Y", + "E": "J", + "F": "U", + "G": "K", + "H": "W", + "I": "O", + "J": "E", + "K": "G", + "L": "R", + "M": "N", + "N": "B", + "O": "I", + "P": "V", + "Q": "A", + "R": "L", + "S": "Z", + "T": "C", + "U": "H", + "V": "P", + "W": "T", + "X": "D", + "Y": "S", + "Z": "M" +}; diff --git a/lib/constant/colors.dart b/lib/constant/colors.dart new file mode 100644 index 0000000..18c087a --- /dev/null +++ b/lib/constant/colors.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class AppColor { + static const Color primaryColor = Colors.black; + static const Color secondaryColor = Colors.white; + static const Color accentColor = Colors.grey; + static const Color redColor = Color(0xFFEA4335); // Google Red + static const Color greenColor = Color(0xFF34A853); // Google Green + static const Color blueColor = + Color.fromARGB(255, 66, 135, 246); // Google Blue + static const Color yellowColor = Color(0xFFFBBC05); // Google Yellow + static Color deepPurpleAccent = + const Color.fromARGB(255, 123, 76, 254).withOpacity(0.3); +} diff --git a/lib/constant/credential.dart b/lib/constant/credential.dart new file mode 100644 index 0000000..0054b50 --- /dev/null +++ b/lib/constant/credential.dart @@ -0,0 +1,144 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; + +import '../controller/functions/crud.dart'; +import '../main.dart'; +import 'box_name.dart'; +import 'char_map.dart'; +import 'links.dart'; + +class AC { + gAK() async { + if (box.read(BoxName.apiKeyRun).toString() != 'run') { + var res = await CRUD().get(link: AppLink.getApiKey, payload: {}); + var decod = jsonDecode(res); + print(decod); + Map jsonData = {}; + for (var i = 0; i < decod['message'].length; i++) { + String h = decod['message'][i]['hashed_key'].toString(); + String retrievedString = r(r(r(h, cn), cC), cs); + + await storage.write( + key: decod['message'][i]['name'].toString(), + value: retrievedString.toString(), + ); + // + String name = decod['message'][i]['name'].toString(); + String value = decod['message'][i]['hashed_key'].toString(); + + jsonData[name] = value; + } + String jsonString = json.encode(jsonData); + print(jsonString); + box.write(BoxName.apiKeyRun, 'run'); + } + } + + String q(String b, String c) { + final d = utf8.encode(c); + final e = utf8.encode(b); + + final f = Hmac(sha256, d); + final g = f.convert(e); + + final h = g.bytes; + final i = base64Url.encode(h); + return i; + } + + String j(String k, String l) { + final m = utf8.encode(l); + final n = base64Url.decode(k); + + final o = Hmac(sha256, m); + final p = o.convert(n); + + final q = utf8.decode(p.bytes); + return q; + } + + String a(String b, String c) { + int d = b.length; + int e = d ~/ 4; + + List f = []; + for (int g = 0; g < d; g += e) { + int h = g + e; + if (h > d) { + h = d; + } + String i = b.substring(g, h); + f.add(i); + } + + print(f); + Map j = {}; + j['birinci'] = f[4]; + j['ikinci'] = f[2]; + j['üçüncü'] = c + f[1]; + j['dördüncü'] = f[0]; + j['beş'] = f[3]; + + String k = ''; + j.forEach((l, m) { + k += m; + }); + + return k; + } + + Map n(String o, String c) { + String p = o.replaceAll(c, ''); + + Map q = {}; + q['birinci'] = p[p.length - 5] + p[p.length - 3]; + q['ikinci'] = p[p.length - 1] + p[p.length - 15]; + q['üçüncü'] = p[p.length - 9] + p[p.length - 12]; + q['dördüncü'] = p[p.length - 11] + p[p.length - 6]; + q['beş'] = p[p.length - 2] + p[p.length - 8]; + + return q; + } + + String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/lib/constant/info.dart b/lib/constant/info.dart new file mode 100644 index 0000000..5254d29 --- /dev/null +++ b/lib/constant/info.dart @@ -0,0 +1,4469 @@ +class AppInformation { + static const String companyName = 'Mobile-App'; + static const String appName = 'SEFER'; + static const String phoneNumber = '962798583052'; + static const String linkedInProfile = + 'https://www.linkedin.com/in/hamza-ayed/'; + static const String website = 'https://mobile-app.store'; + static const String email = 'hamzaayed@mobile-app.store'; + + static const String privacyPolicy = + ''' + + + + + + + +

+ + + + +
+
+
+
+
+
+

Terms and Conditions

+

1 TERMS OF USE

+

By downloading, browsing, accessing or using the Mobile Application; “Sefer”, Users agree to be bound by these Terms and Conditions of Use. We reserve the right to amend these terms and conditions at any time. If the User disagrees with any of these Terms and Conditions of Use, the User must immediately discontinue their access to the Mobile Application and their use of the services offered on the Mobile Application. Continued use of the Mobile Application will constitute acceptance of these Terms and Conditions of Use, as may be amended from time to time.

+

2.1. DEFINITIONS

+

In these Terms and Conditions of Use, the following capitalized terms shall have the following meanings, except where the context otherwise requires:

+

“Mobile Application” or “Sefer” refers to the smartphone software through which the company mediates services between Users and Service Providers.

+

"Account" means an account created by a User or a Service Provider on the Mobile Application as part of Registration.

+

“Service Providers” refers to the individuals or companies registered within the Company to provide products or services approved and mediated by the Company/Mobile Application and that are requested/purchased by “Users”. “Service Provider” means any one of them.

+

"Users" means users of the Mobile Application, including you and "User" means any one of them. “Users” also includes Service Providers using the Mobile Application version dedicated to the use of Service Providers.

+

"Privacy Policy" means the privacy policy set out in Clause 14 of these Terms and Conditions of Use.

+

"Redeem" means to redeem a company’s products or services on these Terms and Conditions of Use and

+

"Redemption" means the act of redeeming such products or services.

+

"Register" means to create an Account on the Mobile Application and "Registration" means the act of creating such an Account.

+

"Services" means all the services provided by Service Providers via the Mobile Application and mediated by the Company to Users, and "Service" means any one of them.

+

2.2. WHAT IS THE MOBILE APPLICATION, “Sefer”?

+

The “Sefer” Mobile Application consists in a specialize service with the purpose to schedule/match the Service Provider with the User, however without creating any employee relationship with the Service Provider, meaning that the Mobile Application should be considered only as a service mediator with the purpose of scheduling/matching between Users and Service Providers for the latter to fulfill the service requested by Users. Through the system, the Company allows, totally free of charge, the Users to sign up and request the desired available services from Service Providers in a more efficient way than the conventional existing methods. The Service Providers, by their means, can register on the Mobile Application dedicated for Service Providers through the methods indicated by the Company, pending an evaluation from the Company and the necessary documentation when signing up in accordance with guidelines set by the Transportation General Authority (TGA) to provide services through the Mobile Application. The Service Provider will pay a profit margin fee determined by the Company -in knowledge of the Service Provider- per completed service. Users can pay their ride fare using Apple Pay as an additional payment method in Saudi Arabia on iPhones

+

+

3. GENERAL ISSUES ABOUT THE MOBILE APPLICATION AND THE SERVICES

+

3.1 Applicability of terms and conditions: The use of any Services and/or the Mobile Application and the making of any Redemptions are subject to these Terms and Conditions of Use.

+

3.2 Location: The Mobile Application, the Services and any Redemptions are intended solely for use by Users who access the Mobile Application where it operates and provides its services regionally. We make no representation that the Services (or any goods or services) are available or otherwise suitable for use outside of the regions indicated by the Company. Notwithstanding the above, if the User accesses the Mobile Application, use the Services or make any Redemptions from locations outside the regions indicated by the Service Provider, the User does so on their own initiative and are responsible for the consequences and for compliance with all applicable laws.

+

3.3 Scope: The Mobile Application, the Services and any Redemptions are for Users’ non-commercial, personal use only and must not be used for business purposes unless an official written permission is granted by the Company.

+

3.4 Prevention on use: We reserve the right to prevent the User using the Mobile Application and the Service (or any part of them) and to prevent the User from making any Redemptions.

+

3.5 Equipment and Networks: The provision of the Services and the Mobile Application does not include the provision of a mobile telephone or handheld device or other necessary equipment to access the Mobile Application or the Services or make any Redemptions. To use the Mobile Application or Services or to make Redemptions, the User will require Internet connectivity and appropriate telecommunication links. The User acknowledges that the terms of agreement with their respective mobile network provider will continue to apply when using the Mobile Application. As a result, the User may be charged by the Mobile Provider for access to network connection services for the duration of the connection while accessing the Mobile Application or any such third party charges as may arise. The User accepts responsibility for any such charges that arise.

+

3.6 Permission to use Mobile Application: If the User is not the bill payer for the mobile telephone or handheld device being used to access the Mobile Application, the User will be assumed to have received permission from the bill payer for using the Mobile Application.

+

3.7 License to Use Material: By submitting any text or images (including photographs) via the Application, the User represents that they are the owner of the Material, or have proper authorization from the owner of the Material to use, reproduce and distribute it. The User hereby grants us a worldwide, royalty-free, non-exclusive license to use the Material to promote any products or services.

+

4. REDEMPTIONS

+

4.1 Need for registration: a) Users must Register to make a Redemption from the Mobile Application. b) The Service Provider agrees that by registering they will be scrutinized to be accepted by the Company who may refuse or cancel the Service Provider account at any time, whether by complaints or by internal policy.

+

4.2 Application of these Terms and Conditions of Use: By making any Redemption, the User acknowledges that the Redemption is subject to these Terms and Conditions of Use.

+

4.3 Redemption: Any attempted Redemption not consistent with these Terms and Conditions of Use may be disallowed or rendered void at our or the relevant Service Provider’s discretion.

+

4.4 Responsibility for Redemptions of perishable products of services: Each Service Provider shall be responsible to ensure that any of its products or services for Redemption that are perishable has not expired.

+

4.5 Restrictions: (a) Reproduction, sale, resale or trading of any products or services or Redeemed products is prohibited. (b) If any product or service is Redeemed for less than its face value, there is no entitlement to a credit, cash or Sample equal to the difference between the face value and the amount Redeemed. (c) Redemption of products or services is subject to availability of the relevant Service Providers’ stocks.

+

4.6 Company Not Liable: For the avoidance of doubt, the Company shall not be liable for any losses or damages suffered by Users resulting from a failure by the relevant Service Provider to fulfil any Redemptions in accordance with Clause 4.4 or for a failure by us to deliver any products or services to Users due to the unavailability of such products or services pursuant to Clause 4.5(c). Users accept that the Mobile Application acts solely as a scheduling/matching service between its Users and Service Providers, and that it is not responsible for any issues that arise, including but not limited to accidents, delays, car discomfort, and unavailability of products or services.

+

4.7 Lost/stolen services: Neither we nor any Service Provider shall be responsible for lost or stolen Samples or products that have been Redeemed.

+

+

5. LOCATION ALERTS AND NOTIFICATIONS

+

5.1 The USer agrees to receive pre-programmed notifications (“Location Alerts”) on the Mobile Application from Service Providers if the User has turned on locational services on their mobile telephone or other handheld devices (as the case may be).

+

+

6. USERS’ OBLIGATIONS

+

6.1 Service Provider terms: Users agree to (and shall) abide by the terms and conditions of the relevant Service Provider for which their Redemption relates to, as may be amended from time to time.

+

6.2 Accurate information: The User warrants that all information provided on Registration and contained as part of their Account is true, complete and accurate and that the User will promptly inform us of any changes to such information by updating the information in their Account.

+

6.3 Content on the Mobile Application and Service: It is the User’s responsibility to ensure that any products, services or information available through the Mobile Application or the Services meet their specific requirements before making any Redemption.

+

6.4 Prohibitions in relation to usage of Services or Mobile Application: Without limitation, the User undertakes not to use or permit anyone else to use the Services or Mobile Application:-

+

6.4.1 to send or receive any material which is not civil or tasteful

+

6.4.2 to send or receive any material which is threatening, grossly offensive, of an indecent, obscene or menacing character, blasphemous or defamatory of any person, in contempt of court or in breach of confidence, copyright, rights of personality, publicity or privacy or any other third party rights;

+

6.4.3 to send or receive any material for which the User has not obtained all necessary licenses and/or approvals (from us or third parties); or which constitutes or encourages conduct that would be considered a criminal offence, give rise to civil liability, or otherwise be contrary to the law of or infringe the rights of any third party in any country in the world;

+

6.4.4 to send or receive any material which is technically harmful (including computer viruses, logic bombs, Trojan horses, worms, harmful components, corrupted data or other malicious software or harmful data);

+

6.4.5 to cause annoyance, inconvenience or needless anxiety;

+

6.4.6 to intercept or attempt to intercept any communications transmitted by way of a telecommunications system;

+

6.4.7 for a purpose other than which we have designed them or intended them to be used;

+

6.4.8 for any fraudulent purpose;

+

6.4.9 other than in conformance with accepted Internet practices and practices of any connected networks;

+

6.4.10 in any way which is calculated to incite hatred against any ethnic, religious or any other minority or is otherwise calculated to adversely affect any individual, group or entity; or

+

6.4.11 in such a way as to, or commit any act that would or does, impose an unreasonable or disproportionately large load on our infrastructure.

+

6.5 Prohibitions in relation to usage of Services, Mobile Application: Without limitation, the User further undertakes not to or permit anyone else to:-

+

6.5.1 resell any products or services;

+

6.5.2 furnish false data including false names, addresses and contact details and fraudulently use credit/debit card numbers;

+

6.5.3 attempt to circumvent our security or network including to access data not intended for the User, log into a server or account the User is not expressly authorized to access, or probe the security of other networks (such as running a port scan);

+

6.5.4 execute any form of network monitoring which will intercept data not intended for the User;

+

6.5.5 enter into fraudulent interactions or transactions with us or a Service Provider (including interacting or transacting purportedly on behalf of a third party where the User has no authority to bind that third party or the User is pretending to be a third party);

+

6.5.6 extract data from or hack into the Mobile Application;

+

6.5.7 use the Services or Mobile Application in breach of these Terms and Conditions of Use;

+

6.5.8 engage in any unlawful activity in connection with the use of the Mobile Application or the Services; or

+

6.5.9 engage in any conduct which, in our exclusive reasonable opinion, restricts or inhibits any other customer from properly using or enjoying the Mobile Application or Services.

+

+

7. RULES ABOUT USE OF THE SERVICE AND THE MOBILE APPLICATION

+

7.1 We will use reasonable endeavors to correct any errors or omissions as soon as practicable after being notified of them. However, we do not guarantee that the Services or the Mobile Application will be free of faults, and we do not accept liability for any such faults, errors or omissions. In the event of any such error, fault or omission, Users should report it by contacting us at JORDAN: 962798583052 .

+

7.2 We do not warrant that Users’ use of the Services or the Mobile Application will be uninterrupted and we do not warrant that any information (or messages) transmitted via the Services or the Mobile Application will be transmitted accurately, reliably, in a timely manner or at all. Notwithstanding that we will try to allow uninterrupted access to the Services and the Mobile Application, access to the Services and the Mobile Application may be suspended, restricted or terminated at any time.

+

7.3 We do not give any warranty that the Services and the Mobile Application are free from viruses or anything else which may have a harmful effect on any technology.

+

7.4 We reserve the right to change, modify, substitute, suspend or remove without notice any information or Services on the Mobile Application from time to time. Users’ access to the Mobile Application and/or the Services may also be occasionally restricted to allow for repairs, maintenance or the introduction of new facilities or services. We will attempt to restore such access as soon as we reasonably can. For the avoidance of doubt, we reserve the right to withdraw any information or Services from the Mobile Application at any time.

+

7.5 We reserve the right to block access to and/or to edit or remove any material which in our reasonable opinion may give rise to a breach of these Terms and Conditions of Use.

+

7.6 The acceptance and denial of the service request may occur at first by the Service Provider, who can accept or deny the service when receiving a notification for a request. The User may cancel the contract for any reason which may or may not apply cancellation fees for which the conditions and amount is determined and communicated by the Company. Both recognize that “Sefer” is not liable for any delays, cancellations, failure to cancel the contract and miscommunication between the User and the Service Provider, nor for any delay or failure in the delivery of services from the Service Provider.

+

+

8. SUSPENSION AND TERMINATION

+

8.1 If the User uses (or others, with the User’s permission use) the Mobile Application, any Services in contravention of these Terms and Conditions of Use, we may suspend their use of the Services and/or Mobile Application.

+

8.2 If we suspend the Services or Mobile Application, we may refuse to restore the Services or Mobile Application for the User’s use until we receive an assurance from them, in a form we deem acceptable, that there will be no further breach of the provisions of these Terms and Conditions of Use.

+

8.3 The Company shall fully co-operate with any law enforcement authorities or court order requesting or directing the Company to disclose the identity or locate anyone in breach of these Terms and Conditions of Use.

+

8.4 Without limitation to anything else in this Clause 8, we shall be entitled immediately or at any time (in whole or in part) to: (a) suspend the Services and/or Mobile Application; (b) suspend Users’ use of the Services and/or Mobile Application; and/or (c) suspend the use of the Services and/or Mobile Application for persons we believe to be connected (in whatever manner) to the concerned User, if:

+

8.4.1 the User commits any breach of these Terms and Conditions of Use;

+

8.4.2 we suspect, on reasonable grounds, that the User has, might or will commit a breach of these Terms and Conditions of Use; or

+

8.4.3 we suspect, on reasonable grounds, that the User may have committed or will be committing any fraud against us or any person.

+

8.5 Our rights under this Clause 8 shall not prejudice any other right or remedy we may have in respect of any breach or any rights, obligations or liabilities accrued prior to termination.

+

+

9. DISCLAIMER AND EXCLUSION OF LIABILITY

+

9.1 The Mobile Application, the Services, the information on the Mobile Application and use of all related facilities are provided on an "as is, as available" basis without any warranties whether express or implied.

+

9.2 The credit balance shall remain valid for the specific period. The credit in the wallet will be expired after 6 months of inactivity.

+

9.3 To the fullest extent permitted by applicable law, we disclaim all representations and warranties relating to the Mobile Application and its contents, including in relation to any inaccuracies or omissions in the Mobile Application, warranties of merchantability, quality, fitness for a particular purpose, accuracy, availability, non-infringement or implied warranties from course of dealing or usage of trade.

+

9.4 We do not warrant that the Mobile Application will always be accessible, uninterrupted, timely, secure, error free or free from computer virus or other invasive or damaging code or that the Mobile Application will not be affected by any acts of nature or other force majeure events, including inability to obtain or shortage of necessary materials, equipment facilities, power or telecommunications, lack of telecommunications equipment or facilities and failure of information technology or telecommunications equipment or facilities.

+

9.5 While we may use reasonable efforts to include accurate and up-to-date information on the Mobile Application, we make no warranties or representations as to its accuracy, timeliness or completeness.

+

9.6 We shall not be liable for any acts or omissions of any third parties howsoever caused, and for any direct, indirect, incidental, special, consequential or punitive damages, howsoever caused, resulting from or in connection with the Mobile Application and the services offered in the mobile application, Users’ access to, use of or inability to use the mobile application or the services offered in the mobile application, reliance on or downloading from the mobile application and/or services, or any delays, inaccuracies in the information or in its transmission including but not limited to damages for loss of business or profits, use, data or other intangible, even if we have been advised of the possibility of such damages.

+

9.7 We shall not be liable in contract, tort (including negligence or breach of statutory duty) or otherwise howsoever and whatever the cause thereof, for any indirect, consequential, collateral, special or incidental loss or damage suffered or incurred by the User in connection with the Mobile Application and these Terms and Conditions of Use. For the purposes of these Terms and Conditions of Use, indirect or consequential loss or damage includes, without limitation, loss of revenue, profits, anticipated savings or business, loss of data or goodwill, loss of use or value of any equipment including software, claims of third parties, and all associated and incidental costs and expenses.

+

9.8 The above exclusions and limitations apply only to the extent permitted by law. None of the User’s statutory rights as a consumer that cannot be excluded or limited are affected.

+

9.9 Notwithstanding our efforts to ensure that our system is secure, the User acknowledges that all electronic data transfers are potentially susceptible to interception by others. We cannot, and do not, warrant that data transfers pursuant to the Mobile Application, or electronic mail transmitted to and from us, will not be monitored or read by others.

+

+

10. INDEMNITY

+

The User agrees to indemnify and keep us indemnified against any claim, action, suit or proceeding brought or threatened to be brought against us which is caused by or arising out of (a) the User’s use of the Services, (b) any other party’s use of the Services using the User’s user ID, verification PIN and/or any identifier number allocated by the Company, and/or (c) the User’s breach of any of these Terms and Conditions of Use, and to pay us damages, costs and interest in connection with such claim, action, suit or proceeding.

+

+

11. INTELLECTUAL PROPERTY RIGHTS

+

11.1 All editorial content, information, photographs, illustrations, artwork and other graphic materials, and names, logos and trade marks on the Mobile Application are protected by copyright laws and/or other laws and/or international treaties, and belong to us and/or our suppliers, as the case may be. These works, logos, graphics, sounds or images may not be copied, reproduced, retransmitted, distributed, disseminated, sold, published, broadcasted or circulated whether in whole or in part, unless expressly permitted by us and/or our suppliers, as the case may be.

+

11.2 Nothing contained on the Mobile Application should be construed as granting by implication, estoppel, or otherwise, any license or right to use any trademark displayed on the Mobile Application without our written permission. Misuse of any trademarks or any other content displayed on the Mobile Application is prohibited.

+

11.3 We will not hesitate to take legal action against any unauthorized usage of our trade marks, name or symbols to preserve and protect its rights in the matter. All rights not expressly granted herein are reserved. Other product and company names mentioned herein may also be the trademarks of their respective owners.

+

+

12. AMENDMENTS

+

12.1 We may periodically make changes to the contents of the Mobile Application, including to the descriptions and prices of goods and services advertised, at any time and without notice. We assume no liability or responsibility for any errors or omissions in the content of the Mobile Application.

+

12.2 We reserve the right to amend these Terms and Conditions of Use from time to time without notice. The revised Terms and Conditions of Use will be posted on the Mobile Application and shall take effect from the date of such posting. The User is advised to review these terms and conditions periodically as they are binding upon the User.

+

+

13. APPLICABLE LAW AND JURISDICTION

+

13.1 These Terms and Conditions of Use shall be governed by and construed in accordance with the applicable Federal laws of Kingdom of Saudi Arabia.

+

13.2 The Mobile Application can be accessed from all countries around the world where the local technology permits. As each of these places have differing laws, by accessing the Mobile Application both the User and we agree that the laws of the country where accessed, without regard to the conflicts of laws principles thereof, will apply to all matters relating to the use of the Mobile Application.

+

13.3 the User accepts and agrees that both the User and we shall submit to the exclusive jurisdiction of the courts of the country where accessed in respect of any dispute arising out of and/or in connection with these Terms and Conditions of Use.

+

+

14. PRIVACY POLICY

+

14.1 Access to the Mobile Application and use of the Services offered on the Mobile Application by the Company and/or its group of companies & partners is subject to this Privacy Policy. By accessing the Mobile Application and by continuing to use the Services offered, Users are deemed to have accepted this Privacy Policy, and in particular, they are deemed to have consented to our use and disclosure of their personal information in the manner prescribed in this Privacy Policy and for the purposes set out in Clauses 3.7 and/or 4.1.1 We reserve the right to amend this Privacy Policy from time to time. If the User disagrees with any part of this Privacy Policy, the User must immediately discontinue their access to the Mobile Application and their use of the Services.

+

14.2 As part of the normal operation of our Services, we collect, use and, in some cases, disclose information about the User to third parties. Accordingly, we have developed this Privacy Policy in order for Users to understand how we collect, use, communicate and disclose and make use of their personal information when they use the Services on the Mobile Application:-

+

(a) Before or at the time of collecting personal information, we will identify the purposes for which information is being collected.

+

(b) We will collect and use of personal information solely with the objective of fulfilling those purposes specified by us and for other compatible purposes, unless we obtain the consent of the individual concerned or as required by law.

+

(c) We will only retain personal information as long as necessary for the fulfillment of those purposes.

+

(d) We will collect personal information by lawful and fair means and, where appropriate, with the knowledge or consent of the individual concerned.

+

(e) Personal information should be relevant to the purposes for which it is to be used, and, to the extent necessary for those purposes, should be accurate, complete, and up-to-date.

+

(f) We will protect personal information by reasonable security safeguards against loss or theft, as well as unauthorized access, disclosure, copying, use or modification.

+

(g) The Company further reserves the right to use all legal means possible and to identify the Users, as well as to request, at any time, additional data and documents it considers appropriate in order to verify personal data informed by the user.

+

We are committed to conducting our business in accordance with these principles in order to ensure that the confidentiality of personal information is protected and maintained.

+

14.3 Social logins policy
Our Services offers you the ability to register and login using Facebook. Where you choose to do this, we will receive certain profile information about you from your social media provider. The profile Information may include your name and social token.
We will use the information we receive only to associate your social token with your Sefer account or for the purposes that are described in this privacy policy.

14.4 Account and data deletion
Based on the applicable laws of your country, you may have the right to request the deletion of your personal data in some circumstances. If you want to delete your account or personal data in the application, please contact us via e-mail: support@mobile-app.store. We will respond to your request within 30 days.

+

15. In-Ride Policy

+

15.1 Smoking Policy:

+

No smoking or other use of tobacco products (including, but not limited to, cigarettes, pipes, cigars, snuff, or chewing tobacco) is permitted during rides. No cigarette butts or other traces of smell, litter, or tobacco use should be present in the vehicle. image

+

15.2 COVID-19 Policy: Face masks must be always worn during rides.

+
+
+
+
+
+
+ + + + + +
+
+ + + + +
+

+ All rights reserved. Fast Global Technology Holding Limited. © 2022 +

+
+
+ +
+ + + + +
+ + + + + + +
+ +'''; +} diff --git a/lib/constant/links.dart b/lib/constant/links.dart new file mode 100644 index 0000000..c51f7a9 --- /dev/null +++ b/lib/constant/links.dart @@ -0,0 +1,225 @@ +import '../env/env.dart'; + +class AppLink { + static final String server = Env.serverPHP; + static String googleMapsLink = 'https://maps.googleapis.com/maps/api/'; + static String llama = 'https://api.llama-api.com/chat/completions'; + static String gemini = + 'https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText'; + + static String test = "$server/test.php"; + //===============firebase========================== + static String getTokens = "$server/ride/firebase/get.php"; + static String getAllTokenDrivers = + "$server/ride/firebase/getALlTokenDrivers.php"; + static String getAllTokenPassengers = + "$server/ride/firebase/getAllTokenPassengers.php"; + static String addTokens = "$server/ride/firebase/add.php"; + static String addTokensDriver = "$server/ride/firebase/addDriver.php"; + + //=======================Wallet=================== + static String addPaymentTokenDriver = + "$ride/driverWallet/addPaymentToken.php"; + static String addSeferWallet = "$ride/seferWallet/add.php"; + static String getSeferWallet = "$ride/seferWallet/get.php"; + static String addDrivePayment = "$ride/payment/add.php"; + static String updatePaymetToPaid = "$ride/payment/updatePaymetToPaid.php"; + static String wallet = '$server/ride/passengerWallet'; + static String walletDriver = '$server/ride/driverWallet'; + static String getAllPassengerTransaction = + "$wallet/getAllPassengerTransaction.php"; + static String getWalletByPassenger = "$wallet/getWalletByPassenger.php"; + static String getPassengersWallet = "$wallet/get.php"; + static String getPassengerWalletArchive = + "$wallet/getPassengerWalletArchive.php"; + static String addPassengersWallet = "$wallet/add.php"; + static String deletePassengersWallet = "$wallet/delete.php"; + static String updatePassengersWallet = "$wallet/update.php"; + + static String getWalletByDriver = "$walletDriver/getWalletByDriver.php"; + static String getDriversWallet = "$walletDriver/get.php"; + static String addDriversWalletPoints = "$walletDriver/add.php"; + static String deleteDriversWallet = "$walletDriver/delete.php"; + static String updateDriversWallet = "$walletDriver/update.php"; + + //=======================promo===================ride.mobile-app.store/ride/promo/get.php + static String promo = '$server/ride/promo'; + static String getPassengersPromo = "$promo/get.php"; + static String getPromoBytody = "$promo/getPromoBytody.php"; + static String addPassengersPromo = "$promo/add.php"; + static String deletePassengersPromo = "$promo/delete.php"; + static String updatePassengersPromo = "$promo/update.php"; + + ////=======================cancelRide=================== + static String ride = '$server/ride'; + static String addCancelRideFromPassenger = "$server/ride/cancelRide/add.php"; + static String cancelRide = "$server/ride/cancelRide/get.php"; +//-----------------ridessss------------------ + static String addRides = "$ride/rides/add.php"; + static String getRides = "$ride/rides/get.php"; + static String getRideOrderID = "$ride/rides/getRideOrderID.php"; + static String getRideStatus = "$ride/rides/getRideStatus.php"; + static String getRideStatusBegin = "$ride/rides/getRideStatusBegin.php"; + static String getRideStatusFromStartApp = + "$ride/rides/getRideStatusFromStartApp.php"; + static String updateRides = "$ride/rides/update.php"; + static String updateStausFromSpeed = "$ride/rides/updateStausFromSpeed.php"; + static String deleteRides = "$ride/rides/delete.php"; + +//-----------------DriverPayment------------------ + static String adddriverScam = "$ride/driver_scam/add.php"; + static String getdriverScam = "$ride/driver_scam/get.php"; + +/////////---getKazanPercent===//////////// + static String getKazanPercent = "$ride/kazan/get.php"; + static String addKazanPercent = "$ride/kazan/add.php"; + +////-----------------DriverPayment------------------ + static String addDriverpayment = "$ride/payment/add.php"; + static String addDriverPaymentPoints = "$ride/driverPayment/add.php"; + static String getDriverPaymentPoints = "$ride/driverWallet/get.php"; + static String getDriverpaymentToday = "$ride/payment/get.php"; + static String getCountRide = "$ride/payment/getCountRide.php"; + static String getAllPaymentFromRide = "$ride/payment/getAllPayment.php"; + static String getAllPaymentVisa = "$ride/payment/getAllPaymentVisa.php"; + +//-----------------Passenger NotificationCaptain------------------ + static String addNotificationPassenger = + "$ride/notificationPassenger/add.php"; + static String getNotificationPassenger = + "$ride/notificationPassenger/get.php"; + static String updateNotificationPassenger = + "$ride/notificationPassenger/update.php"; +//-----------------Driver NotificationCaptain------------------ + static String addNotificationCaptain = "$ride/notificationCaptain/add.php"; + static String addWaitingRide = "$ride/notificationCaptain/addWaitingRide.php"; + static String getRideWaiting = "$ride/notificationCaptain/getRideWaiting.php"; + static String getNotificationCaptain = "$ride/notificationCaptain/get.php"; + static String updateNotificationCaptain = + "$ride/notificationCaptain/update.php"; + static String deleteNotificationCaptain = + "$ride/notificationCaptain/delete.php"; + //-----------------Api Key------------------ + static String addApiKey = "$ride/apiKey/add.php"; + static String getApiKey = "$ride/apiKey/get.php"; + static String getCnMap = "$server/auth/cnMap.php"; + static String updateApiKey = "$ride/apiKey/update.php"; + static String deleteApiKey = "$ride/apiKey/delete.php"; + +//-----------------Feed Back------------------ + static String addFeedBack = "$ride/feedBack/add.php"; + static String getFeedBack = "$ride/feedBack/get.php"; + static String updateFeedBack = "$ride/feedBack/updateFeedBack.php"; + + //-----------------Tips------------------ + static String addTips = "$ride/tips/add.php"; + static String getTips = "$ride/tips/get.php"; + static String updateTips = "$ride/tips/update.php"; + +//-----------------Help Center------------------ + static String addhelpCenter = "$ride/helpCenter/add.php"; + static String gethelpCenter = "$ride/helpCenter/get.php"; + static String getByIdhelpCenter = "$ride/helpCenter/getById.php"; + static String updatehelpCenter = "$ride/helpCenter/update.php"; + static String deletehelpCenter = "$ride/helpCenter/delete.php"; + + //-----------------license------------------ + static String addLicense = "$ride/license/add.php"; + static String getLicense = "$ride/license/get.php"; + static String updateLicense = "$ride/license/updateFeedBack.php"; +//-----------------RegisrationCar------------------ + static String addRegisrationCar = "$ride/RegisrationCar/add.php"; + static String getRegisrationCar = "$ride/RegisrationCar/get.php"; + static String updateRegisrationCar = "$ride/RegisrationCar/update.php"; + +//-----------------DriverOrder------------------ + + static String addDriverOrder = "$ride/driver_order/add.php"; + static String getDriverOrder = "$ride/driver_order/get.php"; + static String getOrderCancelStatus = + "$ride/driver_order/getOrderCancelStatus.php"; + static String updateDriverOrder = "$ride/driver_order/update.php"; + static String deleteDriverOrder = "$ride/driver_order/delete.php"; + + // ===================================== + static String addRateToPassenger = "$ride/rate/add.php"; + static String addRateToDriver = "$ride/rate/addRateToDriver.php"; + static String getDriverRate = "$ride/rate/getDriverRate.php"; + static String getPassengerRate = "$ride/rate/getPassengerRate.php"; + + ////////////////emails ============// + static String sendEmailToPassengerForTripDetails = + "$ride/rides/emailToPassengerTripDetail.php"; + static String sendEmailToDrivertransaction = + "https://api.sefer.live/sefer/Admin/sendEmailToDrivertransaction.php"; + +// =========================================== + static String pathImage = "$server/upload/types/"; + static String uploadImage = "$server/uploadImage.php"; + static String uploadImage1 = "$server/uploadImage1.php"; + static String uploadImagePortrate = "$server/uploadImagePortrate.php"; + static String uploadImageType = "$server/uploadImageType.php"; +//=============egypt documents ============== + static String uploadEgyptidFront = + "$server/EgyptDocuments/uploadEgyptidFront.php"; + static String uploadEgypt = "$server/uploadEgypt.php"; + + //==================certifcate========== + static String location = '$server/ride/location'; + static String getCarsLocationByPassenger = "$location/get.php"; + static String getFemalDriverLocationByPassenger = + "$location/getFemalDriver.php"; + static String getDriverCarsLocationToPassengerAfterApplied = + "$location/getDriverCarsLocationToPassengerAfterApplied.php"; + static String addCarsLocationByPassenger = "$location/add.php"; + static String deleteCarsLocationByPassenger = "$location/delete.php"; + static String updateCarsLocationByPassenger = "$location/update.php"; + static String getTotalDriverDuration = "$location/getTotalDriverDuration.php"; + static String getTotalDriverDurationToday = + "$location/getTotalDriverDurationToday.php"; + + //==================Blog============= + static String profile = '$server/ride/profile'; + static String getprofile = "$profile/get.php"; + static String getCaptainProfile = "$profile/getCaptainProfile.php"; + static String addprofile = "$profile/add.php"; + static String deleteprofile = "$profile/delete.php"; + static String updateprofile = "$profile/update.php"; + + //===================Auth============ + + static String auth = '$server/auth'; + static String login = "$auth/login.php"; + static String signUp = "$auth/signup.php"; + static String sendVerifyEmail = "$auth/sendVerifyEmail.php"; + static String passengerRemovedAccountEmail = + "$auth/passengerRemovedAccountEmail.php"; + static String verifyEmail = "$auth/verifyEmail.php"; +//===================Auth Captin============ + static String authCaptin = '$server/auth/captin'; + static String loginCaptin = "$authCaptin/login.php"; + static String signUpCaptin = "$authCaptin/register.php"; + static String sendVerifyEmailCaptin = "$authCaptin/sendVerifyEmail.php"; + static String verifyEmailCaptin = "$authCaptin/verifyEmail.php"; + static String removeUser = "$authCaptin/removeAccount.php"; + static String deletecaptainAccounr = "$authCaptin/deletecaptainAccounr.php"; + static String updateAccountBank = "$authCaptin/updateAccountBank.php"; + static String getAccount = "$authCaptin/getAccount.php"; + + //===================Admin Captin============ + + static String getPassengerDetailsByPassengerID = + "$server/Admin/getPassengerDetailsByPassengerID.php"; + static String getPassengerDetails = "$server/Admin/getPassengerDetails.php"; + static String getPassengerbyEmail = "$server/Admin/getPassengerbyEmail.php"; + static String addAdminUser = "$server/Admin/adminUser/add.php"; + static String getdashbord = "$server/Admin/dashbord.php"; + static String getAdminUser = "$server/Admin/adminUser/get.php"; + static String getCaptainDetailsByEmailOrIDOrPhone = + "$server/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php"; + static String getCaptainDetails = "$server/Admin/AdminCaptain/get.php"; + static String getVisaForEachDriver = "$server/Admin/getVisaForEachDriver.php"; + static String getRidesPerMonth = + "$server/Admin/AdminRide/getRidesPerMonth.php"; + static String getRidesDetails = "$server/Admin/AdminRide/get.php"; +} diff --git a/lib/constant/style.dart b/lib/constant/style.dart new file mode 100644 index 0000000..ddbf7d8 --- /dev/null +++ b/lib/constant/style.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import '../main.dart'; +import 'box_name.dart'; +import 'colors.dart'; + +class AppStyle { + static TextStyle headTitle = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 40, + color: AppColor.accentColor, + fontFamily: box.read(BoxName.lang) == 'en' + ? GoogleFonts.josefinSans().fontFamily + : box.read(BoxName.lang) == 'ar' + ? GoogleFonts.habibi().fontFamily + : GoogleFonts.josefinSans().fontFamily); + static TextStyle headTitle2 = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 26, + color: AppColor.primaryColor, + fontFamily: box.read(BoxName.lang) == 'en' + ? GoogleFonts.josefinSans().fontFamily + : box.read(BoxName.lang) == 'ar' + ? GoogleFonts.amiri().fontFamily + : GoogleFonts.josefinSans().fontFamily); + static TextStyle title = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: AppColor.primaryColor, + fontFamily: box.read(BoxName.lang) == 'en' + ? GoogleFonts.josefinSans().fontFamily + : box.read(BoxName.lang) == 'ar' + ? GoogleFonts.amiri().fontFamily + : GoogleFonts.josefinSans().fontFamily); + static TextStyle subtitle = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13, + color: AppColor.primaryColor, + fontFamily: box.read(BoxName.lang) == 'en' + ? GoogleFonts.josefinSans().fontFamily + : box.read(BoxName.lang) == 'ar' + ? GoogleFonts.amiri().fontFamily + : GoogleFonts.josefinSans().fontFamily); + static TextStyle number = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: AppColor.primaryColor, + fontFamily: GoogleFonts.averiaSansLibre().fontFamily); + + static BoxDecoration boxDecoration = const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(12)), + color: AppColor.secondaryColor, + boxShadow: [ + BoxShadow( + color: AppColor.accentColor, + offset: Offset(-3, -3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer), + BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer) + ]); + static BoxDecoration boxDecoration1 = const BoxDecoration( + boxShadow: [ + BoxShadow( + color: AppColor.accentColor, blurRadius: 5, offset: Offset(2, 4)), + BoxShadow( + color: AppColor.accentColor, blurRadius: 5, offset: Offset(-2, -2)) + ], + color: AppColor.secondaryColor, + borderRadius: BorderRadius.all( + Radius.elliptical(15, 30), + ), + ); +} diff --git a/lib/constant/table_names.dart b/lib/constant/table_names.dart new file mode 100644 index 0000000..47cd831 --- /dev/null +++ b/lib/constant/table_names.dart @@ -0,0 +1,9 @@ +class TableName { + static const String placesFavorite = "placesFavorite"; + static const String recentLocations = "recentLocations"; + static const String carLocations = "carLocations"; + static const String driverOrdersRefuse = "driverOrdersRefuse"; + static const String rideLocation = "rideLocation"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String captainNotification = "captainNotification"; +} diff --git a/lib/controller/admin/captain_admin_controller.dart b/lib/controller/admin/captain_admin_controller.dart new file mode 100644 index 0000000..debca72 --- /dev/null +++ b/lib/controller/admin/captain_admin_controller.dart @@ -0,0 +1,105 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class CaptainAdminController extends GetxController { + bool isLoading = false; + Map captainData = {}; + Map captain = {}; + final captainController = TextEditingController(); + final captainPrizeController = TextEditingController(); + final titleNotify = TextEditingController(); + final bodyNotify = TextEditingController(); + final formCaptainKey = GlobalKey(); + final formCaptainPrizeKey = GlobalKey(); + + Future getCaptainCount() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getCaptainDetails, payload: {}); + var d = jsonDecode(res); + if (d['status'] == 'success') { + captainData = d; + } + + isLoading = false; + update(); + } + + Future addCaptainPrizeToWallet() async { + String? paymentId; + //todo link to add wallet to captain + for (var i = 0; i < captainData['message'].length; i++) { + await CRUD().post(link: AppLink.addDriverPaymentPoints, payload: { + 'driverID': captainData['message'][i]['id'], + 'amount': captainPrizeController.text, + 'paymentMethod': 'Prize', + }).then((value) { + paymentId = value['message'].toString(); + }); + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'driverID': captainData['message'][i]['id'], + 'amount': captainPrizeController.text, + 'paymentMethod': 'Prize', + 'paymentID': paymentId.toString(), + }); + } + + Get.back(); + } + + void addCaptainsPrizeToWalletSecure() async { + try { + // Check if local authentication is available + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + ); + if (didAuthenticate) { + // User authenticated successfully, proceed with payment + await addCaptainPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } else { + // Authentication failed, handle accordingly + Get.snackbar('Authentication failed', '', + backgroundColor: AppColor.redColor); + // 'Authentication failed'); + } + } else { + // Local authentication not available, proceed with payment without authentication + await addCaptainPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } + } catch (e) { + rethrow; + } + } + + Future getCaptains() async { + var res = await CRUD() + .get(link: AppLink.getCaptainDetailsByEmailOrIDOrPhone, payload: { + 'driver_id': captainController.text, + 'driverEmail': captainController.text, + 'driverPhone': captainController.text, + }); + var d = jsonDecode(res); + if (d['status'] == 'success') { + captain = d; + } + update(); + } + + @override + void onInit() { + getCaptainCount(); + super.onInit(); + } +} diff --git a/lib/controller/admin/dashboard_controller.dart b/lib/controller/admin/dashboard_controller.dart new file mode 100644 index 0000000..71d152a --- /dev/null +++ b/lib/controller/admin/dashboard_controller.dart @@ -0,0 +1,38 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; + +import '../../constant/api_key.dart'; + +class DashboardController extends GetxController { + bool isLoading = false; + List dashbord = []; + int creditSMS = 0; + Future getDashBoard() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getdashbord, payload: {}); + if (res != 'failure') { + var d = jsonDecode(res); + dashbord = d['message']; + isLoading = false; + update(); + } + var res2 = await CRUD().kazumiSMS( + link: 'https://sms.kazumi.me/api/sms/check-credit', + payload: {"username": "Sefer", "password": AK.smsPasswordEgypt}, + ); + + creditSMS = res2['credit']; + + update(); + } + + @override + void onInit() { + getDashBoard(); + super.onInit(); + } +} diff --git a/lib/controller/admin/passenger_admin_controller.dart b/lib/controller/admin/passenger_admin_controller.dart new file mode 100644 index 0000000..eb6b50a --- /dev/null +++ b/lib/controller/admin/passenger_admin_controller.dart @@ -0,0 +1,108 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class PassengerAdminController extends GetxController { + bool isLoading = false; + Map passengersData = {}; + Map passengers = {}; + double height = 150; + final formPassKey = GlobalKey(); + final formPrizeKey = GlobalKey(); + final titleNotify = TextEditingController(); + final bodyNotify = TextEditingController(); + final passengerController = TextEditingController(); + final passengerPrizeController = TextEditingController(); + + Future getPassengerCount() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getPassengerDetails, payload: {}); + var d = jsonDecode(res); + if (d['status'] == 'success') { + passengersData = d; + } + + isLoading = false; + update(); + } + + Future addPassengerPrizeToWallet() async { + for (var i = 0; i < passengersData['message'].length; i++) { + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': passengersData['message'][i]['id'], + 'balance': passengerPrizeController.text, + }); + } + + Get.back(); + } + + void addPassengerPrizeToWalletSecure() async { + try { + // Check if local authentication is available + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + ); + if (didAuthenticate) { + // User authenticated successfully, proceed with payment + await addPassengerPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } else { + // Authentication failed, handle accordingly + Get.snackbar('Authentication failed', '', + backgroundColor: AppColor.redColor); + // 'Authentication failed'); + } + } else { + // Local authentication not available, proceed with payment without authentication + await addPassengerPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } + } catch (e) { + rethrow; + } + } + + Future getPassengers() async { + var res = await CRUD().get(link: AppLink.getPassengerbyEmail, payload: { + 'passengerEmail': passengerController.text, + 'passengerId': passengerController.text, + 'passengerphone': passengerController.text, + }); + var d = jsonDecode(res); + if (d['status'] == 'success') { + passengers = d; + } + update(); + } + + changeHeight() { + if (passengers.isEmpty) { + height = 0; + update(); + } + height = 150; + update(); + } + + void clearPlaces() { + passengers = {}; + update(); + } + + @override + void onInit() { + getPassengerCount(); + super.onInit(); + } +} diff --git a/lib/controller/admin/ride_admin_controller.dart b/lib/controller/admin/ride_admin_controller.dart new file mode 100644 index 0000000..ee1ffcd --- /dev/null +++ b/lib/controller/admin/ride_admin_controller.dart @@ -0,0 +1,73 @@ +import 'dart:convert'; + +import 'package:fl_chart/fl_chart.dart'; +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../../models/model/admin/monthly_ride.dart'; +import '../functions/crud.dart'; + +class RideAdminController extends GetxController { + bool isLoading = false; + late List rideData; + late Map jsonResponse; + List ridesDetails = []; + var chartData; + // late List chartDatasync; + Future getRidesAdminDash() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {}); + jsonResponse = jsonDecode(res); + rideData = (jsonResponse['message'] as List) + .map((item) => MonthlyDataModel.fromJson(item)) + .toList(); + + chartData = rideData + .map((data) => FlSpot(data.day.toDouble(), data.ridesCount.toDouble())) + .toList(); + + // chartDatasync = (jsonResponse['message'] as List) + // .map((item) => ChartDataS( + // item['year'], + // item['month'], + // item['day'], + // item['rides_count'], + // )) + // .toList(); + isLoading = false; + update(); + } + + Future getRidesDetails() async { + // isLoading = true; + // update(); + var res = await CRUD().get(link: AppLink.getRidesDetails, payload: {}); + + var d = jsonDecode(res); + ridesDetails = d['message']; + + // isLoading = false; + // update(); + } + + @override + void onInit() async { + List initializationTasks = [ + getRidesAdminDash(), + getRidesDetails(), + ]; + // cameras = await availableCameras(); + await Future.wait(initializationTasks); + super.onInit(); + } +} + +// class ChartDataS { +// ChartDataS(this.year, this.month, this.day, this.ridesCount); + +// final int year; +// final int month; +// final int day; +// final int ridesCount; +// } diff --git a/lib/controller/admin/wallet_admin_controller.dart b/lib/controller/admin/wallet_admin_controller.dart new file mode 100644 index 0000000..6315444 --- /dev/null +++ b/lib/controller/admin/wallet_admin_controller.dart @@ -0,0 +1,189 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../functions/crud.dart'; + +class WalletAdminController extends GetxController { + bool isLoading = false; + + late Map jsonResponse; + List walletDetails = []; + List driversWalletPoints = []; + + @override + void onInit() { + getWalletForEachDriverToPay(); + super.onInit(); + } + + Future getWalletAdminDash() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {}); + jsonResponse = jsonDecode(res); + } + + Future payToBankDriverAll() async { + for (var i = 0; i < driversWalletPoints.length; i++) { + String token = await getToken(); + await Future.delayed(const Duration(seconds: 1)); + try { + await payToDriverBankAccount( + token, + driversWalletPoints[i]['total_amount'].toString(), + driversWalletPoints[i]['accountBank'].toString(), + driversWalletPoints[i]['bankCode'].toString(), + driversWalletPoints[i]['name_arabic'].toString(), + driversWalletPoints[i]['driverID'].toString(), + driversWalletPoints[i]['phone'].toString(), + driversWalletPoints[i]['email'].toString(), + ); + await Future.delayed(const Duration(seconds: 3)); + } on FormatException catch (e) { + // Handle the error or rethrow the exception as needed + } + } + } + + Future payToDriverBankAccount( + String token, + String amount, + String bankCardNumber, + String bankCode, + String name, + String driverId, + String phone, + String email) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + + var body = jsonEncode({ + "issuer": "bank_card", + "amount": amount, + "full_name": name, + "bank_card_number": bankCardNumber, + "bank_code": bankCode, + "bank_transaction_type": "cash_transfer" + }); + + var response = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body); + + if (response.statusCode == 200) { + var d = jsonDecode(response.body); + + if (d['status_description'] == + "Transaction received and validated successfully. Dispatched for being processed by the bank") { + await addPayment('payFromSeferToDriver', driverId, + ((-1) * double.parse(amount)).toString()); + await addSeferWallet('payFromSeferToDriver', driverId, + ((-1) * double.parse(amount)).toString()); + await updatePaymentToPaid(driverId); + await sendEmail(driverId, amount, phone, name, bankCardNumber, email); + } + } else {} + } + + // String paymentToken = ''; + Future generateToken(String amount) async { + var res = await CRUD().post(link: AppLink.addPaymentTokenDriver, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'amount': amount.toString(), + }); + var d = jsonDecode(res); + return d['message']; + } + + Future sendEmail( + String driverId, amount, phone, name, bankCardNumber, email) async { + await CRUD().sendEmail(AppLink.sendEmailToDrivertransaction, { + "driverID": driverId, + "total_amount": amount, + "phone": phone, + "name_arabic": name, + "accountBank": bankCardNumber, + "email": email + }); + } + + Future addSeferWallet( + String paymentMethod, String driverID, String point) async { + var seferToken = await generateToken(point.toString()); + await CRUD().post(link: AppLink.addSeferWallet, payload: { + 'amount': point.toString(), + 'paymentMethod': paymentMethod, + 'passengerId': 'driver', + 'token': seferToken, + 'driverId': driverID.toString(), + }); + } + + Future addPayment( + String paymentMethod, String driverID, String amount) async { + var paymentToken = + await generateToken(((double.parse(amount))).toStringAsFixed(0)); + await CRUD().post(link: AppLink.addDrivePayment, payload: { + 'rideId': DateTime.now().toIso8601String(), + 'amount': ((double.parse(amount))).toStringAsFixed(0), + 'payment_method': paymentMethod, + 'passengerID': 'myself', + 'token': paymentToken, + 'driverID': driverID.toString(), + }); + } + + Future updatePaymentToPaid(String driverID) async { + await CRUD().post(link: AppLink.updatePaymetToPaid, payload: { + 'driverID': driverID.toString(), + }); + } + + Future getToken() async { + var headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + // 'Cookie': + // 'csrftoken=74iZJ8XYyuTm5WRq2W4tpWX5eqoJLZVK5QhuDrChWpDtzpgGA269bbCWuEcW85t4' + }; + var body = { + 'grant_type': 'password', + 'username': AK.payMobOutUserName, + 'password': AK.payMobOutPassword, + 'client_id': AK.payMobOutClient_id, + 'client_secret': AK.payMobOutClientSecrret + }; + var res = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/o/token/'), + headers: headers, + body: body, + ); + String token = ''; + if (res.statusCode == 200) { + var decode = jsonDecode(res.body); + token = decode['access_token']; + } + return token; + } + + Future getWalletForEachDriverToPay() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getVisaForEachDriver, payload: {}); + var d = jsonDecode(res); + driversWalletPoints = d['message']; + isLoading = false; + update(); + } +} diff --git a/lib/controller/bank_account/payout.dart b/lib/controller/bank_account/payout.dart new file mode 100644 index 0000000..dadd402 --- /dev/null +++ b/lib/controller/bank_account/payout.dart @@ -0,0 +1,116 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../../constant/links.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; + +class PaymobPayout extends GetxController { + bool isLoading = false; + String dropdownValue = 'etisalat'; + + Future getToken() async { + var headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + // 'Cookie': + // 'csrftoken=74iZJ8XYyuTm5WRq2W4tpWX5eqoJLZVK5QhuDrChWpDtzpgGA269bbCWuEcW85t4' + }; + var body = { + 'grant_type': 'password', + 'username': 'sefer_api_checker', + 'password': '#c3pSwbUxOKpQnr5hHZAgpkSW', + 'client_id': 'kmNWU5gKsL8LKVhsJFbOGTEb3YQ5sQhvBoB8pqoW', + 'client_secret': + 'htV6nFANLDd658ueTEuMrIqwjcXsocMXmBLAYof7FuutBcSxdTdoNqFl3EAvO6zrOgGPLdiMrofNp2V9ASVRpjoSlFjDNRzY7hfPunAJEgf2N5ZUuknN4QniaqIZvaNt' + }; + var res = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/o/token/'), + headers: headers, + body: body, + ); + String token = ''; + if (res.statusCode == 200) { + var decode = jsonDecode(res.body); + token = decode['access_token']; + } + return token; + } + + payToDriverWallet( + String token, String amount, String issuer, String msisdn) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + var body = json.encode({ + "amount": amount, //"10.00", + "issuer": issuer, //"vodafone", + "msisdn": msisdn, // "01023456789" + }); + var res = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body, + ); + var dec = jsonDecode(res.body); + if (dec['disbursement_status'] == 'successful') { + await CRUD().post(link: AppLink.addDriverpayment, payload: { + 'rideId': DateTime.now().toIso8601String(), + 'amount': ((-1) * (double.parse(dec['amount'])) + 5).toStringAsFixed(0), + 'payment_method': 'payout', + 'passengerID': 'myself', + 'driverID': box.read(BoxName.driverID).toString(), + }); + Get.snackbar('Transaction successful'.tr, + '${'Transaction successful'.tr} ${dec['amount']}', + backgroundColor: AppColor.greenColor); + // Get.find().getCaptainWalletFromRide(); + } else if (dec['disbursement_status'] == 'failed') { + Get.snackbar('Transaction failed'.tr, 'Transaction failed'.tr, + backgroundColor: AppColor.redColor); + } + } + + payToDriverBankAccount(String token, String amount, String bankCardNumber, + String bankCode) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + var body = { + "issuer": "bank_card", + "amount": amount, //9.0, + "full_name": + '${box.read(BoxName.nameDriver)} ${box.read(BoxName.lastNameDriver)}', + "bank_card_number": bankCardNumber, //"1111-2222-3333-4444", + "bank_code": bankCode, //"CIB", + "bank_transaction_type": "cash_transfer" + }; + var res = await http + .post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body, + ) + .then((value) {}); + } + + Future payToWalletDriverAll( + String amount, String issuer, String msisdn) async { + String token = await getToken(); + await payToDriverWallet(token, amount, issuer, msisdn); + } + + Future payToBankDriverAll( + String amount, String bankCardNumber, String bankCode) async { + String token = await getToken(); + await payToDriverBankAccount(token, amount, bankCardNumber, bankCode); + } +} diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart new file mode 100644 index 0000000..2bcf8af --- /dev/null +++ b/lib/controller/firebase/firbase_messge.dart @@ -0,0 +1,461 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../views/widgets/elevated_btn.dart'; +import 'local_notification.dart'; + +class FirebaseMessagesController extends GetxController { + final fcmToken = FirebaseMessaging.instance; + + List tokens = []; + List tokensPassengers = []; + List dataTokens = []; + late String driverID; + late String driverToken; + NotificationSettings? notificationSettings; + + Future getNotificationSettings() async { + // Get the current notification settings + NotificationSettings? notificationSettings = + await FirebaseMessaging.instance.getNotificationSettings(); + 'Notification authorization status: ${notificationSettings.authorizationStatus}'; + + // Call the update function if needed + update(); + } + + Future requestFirebaseMessagingPermission() async { + FirebaseMessaging messaging = FirebaseMessaging.instance; + + // Check if the platform is Android + if (Platform.isAndroid) { + // Request permission for Android + await messaging.requestPermission(); + } else if (Platform.isIOS) { + // Request permission for iOS + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: false, + sound: true, + ); + messaging.setForegroundNotificationPresentationOptions( + alert: true, badge: true, sound: true); + } + } + + Future getTokens() async { + var res = await http.post( + Uri.parse(AppLink.getTokens), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + body: {}, + ); + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + dataTokens = jsonResponse['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokens.add(jsonResponse['data'][i]['token']); + } + box.write(BoxName.tokens, tokens); + } else { + Get.defaultDialog(title: "Warning", middleText: "Server Error"); + } + } + + Future getAllTokenDrivers() async { + var res = await http.post( + Uri.parse(AppLink.getAllTokenDrivers), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + body: {}, + ); + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + dataTokens = jsonResponse['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokens.add(jsonResponse['data'][i]['token']); + } + box.write(BoxName.tokensDrivers, tokens); + } else { + Get.defaultDialog(title: "Warning", middleText: "Server Error"); + } + } + + Future getAllTokenPassengers() async { + var res = await http.post( + Uri.parse(AppLink.getAllTokenPassengers), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + body: {}, + ); + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + dataTokens = jsonResponse['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokensPassengers.add(jsonResponse['data'][i]['token']); + } + box.write(BoxName.tokensPassengers, tokensPassengers); + } else { + Get.defaultDialog(title: "Warning", middleText: "Server Error"); + } + } + + Future getToken() async { + fcmToken.getToken().then((token) { + if (box.read(BoxName.email) == null) { + box.write(BoxName.tokenDriver, token); + } else { + box.write(BoxName.tokenFCM, token); + } + }); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + // If the app is in the background or terminated, show a system tray message + RemoteNotification? notification = message.notification; + AndroidNotification? android = notification?.android; + // if (notification != null && android != null) { + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + } + + void fireBaseTitles(RemoteMessage message) { + if (message.notification!.title! == 'Order') { + if (Platform.isAndroid) { + // NotificationController().showNotification('Order', '', 'order'); + } + var myListString = message.data['DriverList']; + // var points = message.data['PolylineJson']; + + var myList = jsonDecode(myListString) as List; + // var myPoints = jsonDecode(points) as List; + driverToken = myList[14].toString(); + // This is for location using and uploading status + + update(); + } + } + + SnackbarController driverAppliedTripSnakBar() { + return Get.snackbar( + 'Driver Applied the Ride for You'.tr, + '', + colorText: AppColor.greenColor, + duration: const Duration(seconds: 3), + snackPosition: SnackPosition.TOP, + titleText: Text( + 'Applied'.tr, + style: const TextStyle(color: AppColor.redColor), + ), + messageText: Text( + 'Driver Applied the Ride for You'.tr, + style: AppStyle.title, + ), + icon: const Icon(Icons.approval), + shouldIconPulse: true, + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + ); + } + + Future passengerDialog(String message) { + return Get.defaultDialog( + barrierDismissible: false, + title: 'message From passenger'.tr, + titleStyle: AppStyle.title, + middleTextStyle: AppStyle.title, + middleText: message.tr, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + // FirebaseMessagesController().sendNotificationToPassengerToken( + // 'Hi ,I will go now'.tr, + // 'I will go now'.tr, + // Get.find().driverToken, []); + // Get.find() + // .startTimerDriverWaitPassenger5Minute(); + + Get.back(); + })); + } + + // Future driverFinishTripDialoge(List driverList) { + // return Get.defaultDialog( + // title: 'Driver Finish Trip'.tr, + // content: const DriverTipWidget(), + // confirm: MyElevatedButton( + // title: 'Yes'.tr, + // onPressed: () async { + // var tip = (Get.find().totalPassenger) * + // (double.parse(box.read(BoxName.tipPercentage.toString()))); + // var res = await CRUD().post(link: AppLink.addTips, payload: { + // 'passengerID': box.read(BoxName.passengerID), + // 'driverID': driverList[0].toString(), + // 'rideID': driverList[1].toString(), + // 'tipAmount': tip.toString(), + // }); + // await CRUD().post(link: AppLink.addPassengersWallet, payload: { + // 'passenger_id': box.read(BoxName.passengerID).toString(), + // 'balance': ((-1) * tip).toString() + // }); + + // await CRUD().post(link: AppLink.addDriversWalletPoints, payload: { + // 'driverID': driverList[0].toString(), + // 'paymentID': '${Get.find().rideId}tip', + // 'amount': (tip * 100).toString(), + // 'paymentMethod': 'visa-tip', + // }); + + // if (res != 'failure') { + // FirebaseMessagesController().sendNotificationToAnyWithoutData( + // 'You Have Tips', + // '${'${tip.toString()}\$${' tips\nTotal is'.tr}'} ${tip + (Get.find().totalPassenger)}', + // driverList[2].toString(), + // ); + // } + // Get.to(() => RateDriverFromPassenger(), arguments: { + // 'driverId': driverList[0].toString(), + // 'rideId': driverList[1].toString(), + // 'price': driverList[3].toString() + // }); + // }, + // kolor: AppColor.greenColor, + // ), + // cancel: MyElevatedButton( + // title: 'No,I want'.tr, + // onPressed: () { + // Get.to(() => RateDriverFromPassenger(), arguments: { + // 'driverId': driverList[0].toString(), + // 'rideId': driverList[1].toString(), + // 'price': driverList[3].toString() + // }); + // }, + // kolor: AppColor.redColor, + // )); + // } + + void sendNotificationAll(String title, body) async { + // Get the token you want to subtract. + String token = box.read(BoxName.tokenFCM); + tokens = box.read(BoxName.tokensDrivers); + // Subtract the token from the list of tokens. + tokens.remove(token); + + // Save the list of tokens back to the box. + // box.write(BoxName.tokens, tokens); + // tokens = box.read(BoxName.tokens); + for (var i = 0; i < tokens.length; i++) { + http + .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=${AK.serverAPI}' + }, + body: jsonEncode({ + 'notification': { + 'title': title, + 'body': body, + 'sound': 'start.wav' + }, + 'priority': 'high', + 'data': { + 'click_action': 'FLUTTER_NOTIFICATION_CLICK', + 'id': '1', + 'status': 'done' + }, + 'to': tokens[i], + })) + .whenComplete(() {}) + .catchError((e) {}); + } + } + + // for (var i = 0; i < tokens.length; i++) { + // http + // .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), + // headers: { + // 'Content-Type': 'application/json', + // 'Authorization': 'key=${storage.read(key: BoxName.serverAPI}' + // }, + // body: jsonEncode({ + // 'notification': { + // 'title': title, + // 'body': body, + // 'sound': 'true' + // }, + // 'priority': 'high', + // 'data': { + // 'click_action': 'FLUTTER_NOTIFICATION_CLICK', + // 'id': '1', + // 'status': 'done' + // }, + // 'to': tokens[i], + // })) + // .whenComplete(() {}) + // .catchError((e) { + // }); + // } + // } + + void sendNotificationToPassengerToken( + String title, body, token, List map) async { + try { + final response = await http.post( + Uri.parse('https://fcm.googleapis.com/fcm/send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=${AK.serverAPI}' + }, + body: jsonEncode({ + 'notification': { + 'title': title, + 'body': body, + 'sound': 'tone2.wav' + }, + 'data': { + 'passengerList': map, + }, + 'priority': 'high', + 'to': token, + }), + ); + + if (response.statusCode == 200) { + // Notification sent successfully + } else { + // Handle error response + 'Failed to send notification. Status code: ${response.statusCode}'; + } + } catch (e) { + // Handle other exceptions + } + } + + void sendNotificationToAnyWithoutData( + String title, String body, String token) async { + try { + final response = await http.post( + Uri.parse('https://fcm.googleapis.com/fcm/send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=${AK.serverAPI}' + }, + body: jsonEncode({ + 'notification': { + 'title': title, + 'body': body, + 'sound': 'notify.wav' + }, + 'data': { + 'click_action': 'FLUTTER_NOTIFICATION_CLICK', + 'id': '1', + 'status': 'done' + }, + 'priority': 'high', + 'to': token, + }), + ); + + if (response.statusCode == 200) { + // Notification sent successfully + } else { + // Handle error response + 'Failed to send notification. Status code: ${response.statusCode}'; + } + } catch (e) { + // Handle other exceptions + } + } + + void sendNotificationToDriverMAP( + String title, String body, String token, List data) async { + try { + final response = await http.post( + Uri.parse('https://fcm.googleapis.com/fcm/send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=${AK.serverAPI}' + }, + body: jsonEncode({ + 'notification': { + 'title': title, + 'body': body, + // 'sound': 'tone2.wav', + 'sound': 'order.wav' + }, + 'data': { + 'DriverList': data, + }, + 'priority': 'high', + 'to': token, + }), + ); + + if (response.statusCode == 200) { + // Notification sent successfully + } else { + // Handle error response + 'Failed to send notification. Status code: ${response.statusCode}'; + } + } catch (e) { + // Handle other exceptions + } + } + + void sendNotificationToDriverMapPolyline(String title, String body, + String token, List data, String polylineJson) async { + try { + final response = await http.post( + Uri.parse('https://fcm.googleapis.com/fcm/send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=${AK.serverAPI}' + }, + body: jsonEncode({ + 'notification': { + 'title': title, + 'body': body, + // 'sound': 'tone2.wav', + 'sound': 'order.wav' + }, + 'data': { + 'DriverList': data, + 'PolylineJson': polylineJson, + }, + 'priority': 'high', + 'to': token, + }), + ); + + if (response.statusCode == 200) { + // Notification sent successfully + } else { + // Handle error response + 'Failed to send notification. Status code: ${response.statusCode}'; + } + } catch (e) { + // Handle other exceptions + } + } +} diff --git a/lib/controller/firebase/local_notification.dart b/lib/controller/firebase/local_notification.dart new file mode 100644 index 0000000..6ea5160 --- /dev/null +++ b/lib/controller/firebase/local_notification.dart @@ -0,0 +1,29 @@ +// import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +// import 'package:get/get.dart'; + +// class NotificationController extends GetxController { +// final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = +// FlutterLocalNotificationsPlugin(); + +// // Initializes the local notifications plugin +// Future initNotifications() async { +// const AndroidInitializationSettings android = +// AndroidInitializationSettings('@mipmap/launcher_icon'); +// const InitializationSettings initializationSettings = +// InitializationSettings(android: android); +// await _flutterLocalNotificationsPlugin.initialize(initializationSettings); +// } + +// // Displays a notification with the given title and message +// void showNotification(String title, String message, String tone) async { +// AndroidNotificationDetails android = AndroidNotificationDetails( +// 'your channel id', 'your channel name', +// importance: Importance.max, +// priority: Priority.high, +// showWhen: false, +// sound: RawResourceAndroidNotificationSound(tone)); + +// NotificationDetails details = NotificationDetails(android: android); +// await _flutterLocalNotificationsPlugin.show(0, title, message, details); +// } +// } diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart new file mode 100644 index 0000000..7ba4186 --- /dev/null +++ b/lib/controller/functions/crud.dart @@ -0,0 +1,484 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../env/env.dart'; +import '../../main.dart'; +import 'gemeni.dart'; +import 'llama_ai.dart'; +import 'upload_image.dart'; + +class CRUD { + Future get({ + required String link, + Map? payload, + }) async { + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}', + }, + ); + // if (response.statusCode == 200) { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return response.body; + } + + return jsonData['status']; + } + // } + + Future getAgoraToken({ + required String channelName, + required String uid, + }) async { + var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + var res = await http.get( + Uri.parse( + 'https://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'), + headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'}); + + if (res.statusCode == 200) { + var response = jsonDecode(res.body); + return response['token']; + } else {} + } + + Future getLlama({ + required String link, + required String payload, + required String prompt, + }) async { + var url = Uri.parse( + link, + ); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': + 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy' + // 'Authorization': 'Bearer ${Env.llamaKey}' + }; + var data = json.encode({ + "model": "Llama-3-70b-Inst-FW", + // "model": "llama-13b-chat", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post( + url, + body: data, + headers: headers, + ); + + if (response.statusCode == 200) { + return response.body; + } + return response.statusCode; + } + + Future allMethodForAI(String prompt, linkPHP, imagePath) async { + // await ImageController().choosImage(linkPHP, imagePath); + Future.delayed(const Duration(seconds: 2)); + var extractedString = + await arabicTextExtractByVisionAndAI(imagePath: imagePath); + var json = jsonDecode(extractedString); + var textValues = getAllTextValuesWithLineNumbers(json); + // List textValues = getAllTextValues(json); + + // await AI().geminiAiExtraction(prompt, textValues); + } + + Map>> getAllTextValuesWithLineNumbers( + Map json) { + Map>> output = {}; + int lineNumber = 1; + + if (json.containsKey('regions')) { + List regions = json['regions']; + for (Map region in regions) { + if (region.containsKey('lines')) { + List lines = region['lines']; + List> linesWithText = []; + for (Map line in lines) { + if (line.containsKey('words')) { + List words = line['words']; + String lineText = ""; + for (Map word in words) { + if (word.containsKey('text')) { + lineText += word['text'] + " "; + } + } + lineText = lineText.trim(); + linesWithText.add( + {"line_number": lineNumber.toString(), "text": lineText}); + lineNumber++; + } + } + output["region_${region.hashCode}"] = linesWithText; + } + } + } + + return output; + } + + // List getAllTextValues(Map json) { + // List textValues = []; + + // if (json.containsKey('regions')) { + // List regions = json['regions']; + // for (Map region in regions) { + // if (region.containsKey('lines')) { + // List lines = region['lines']; + // for (Map line in lines) { + // if (line.containsKey('words')) { + // List words = line['words']; + // for (Map word in words) { + // if (word.containsKey('text')) { + // textValues.add(word['text']); + // } + // } + // } + // } + // } + // } + // } + + // return textValues; + // } + + Future arabicTextExtractByVisionAndAI({ + required String imagePath, + }) async { + var headers = { + 'Content-Type': 'application/json', + 'Ocp-Apim-Subscription-Key': '21010e54b50f41a4904708c526e102df' + }; + // var url = Uri.parse( + // 'https://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar', + // ); + String imagePathFull = + '${AppLink.server}card_image/$imagePath-${box.read(BoxName.driverID)}.jpg'; + + var request = http.Request( + 'POST', + Uri.parse( + 'https://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar')); + request.body = json.encode({"url": imagePathFull}); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + return await response.stream.bytesToString(); + } else {} + } + + Future getChatGPT({ + required String link, + required String payload, + }) async { + var url = Uri.parse( + link, + ); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}' + }; + var data = json.encode({ + "model": "gpt-3.5-turbo", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like vin,make,made,year,expiration_date,color,owner,registration_date just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post( + url, + body: data, + headers: headers, + ); + + if (response.statusCode == 200) { + return response.body; + } + return response.statusCode; + } + + Future postStripe({ + required String link, + Map? payload, + }) async { + // String? secretKey = await storage.read(key: BoxName.secretKey); + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': 'Bearer ${AK.secretKey}', + }, + ); + if (response.statusCode == 200) { + return response.body; + } else {} + } + + Future post({ + required String link, + Map? payload, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + return response.body; + } else { + return (jsonData['status']); + } + } else { + return response.statusCode; + } + } + + Future kazumiSMS({ + required String link, + Map? payload, + }) async { + var url = Uri.parse( + link, + ); + var headers = {'Content-Type': 'application/json'}; + var request = http.Request('POST', url); + request.body = json.encode({ + "username": "Sefer", + "password": AK.smsPasswordEgypt, + }); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + var responseBody = await response.stream.bytesToString(); + var data = json.decode(responseBody); + return data; + } else {} + } + + Future postPayMob({ + required String link, + Map? payload, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse( + link, + ); + var response = await http.post(url, + body: payload, headers: {'Content-Type': 'application/json'}); + + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + return response.body; + } else { + return (jsonData['status']); + } + } else { + return response.statusCode; + } + } + + sendEmail( + String link, + Map? payload, + ) async { + var headers = { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }; + var request = http.Request('POST', Uri.parse(link)); + request.bodyFields = payload!; + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + if (response.statusCode == 200) { + } else {} + } + + Future postFromDialogue({ + required String link, + Map? payload, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + + if (response.body.isNotEmpty) { + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + Get.back(); + // Get.snackbar( + // jsonData['status'], + // jsonData['message'], + // ); + + return response.body; + } + } + return (jsonData['status']); + } + } + + Future sendVerificationRequest(String phoneNumber) async { + final accountSid = AK.accountSIDTwillo; + final authToken = AK.authTokenTwillo; + final verifySid = AK.twilloRecoveryCode; + + final Uri verificationUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/Verifications'); + + // Send the verification request + final response = await http.post( + verificationUri, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: { + 'To': phoneNumber, + 'Channel': 'sms', + }, + ); + + if (response.statusCode == 201) { + } else {} + + // Prompt the user to enter the OTP + const otpCode = "123456"; // Replace with user input + + // Check the verification code + final checkUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/VerificationCheck'); + + final checkResponse = await http.post( + checkUri, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: { + 'To': phoneNumber, + 'Code': otpCode, + }, + ); + + if (checkResponse.statusCode == 201) { + } else {} + } + + Future getGoogleApi({ + required String link, + Map? payload, + }) async { + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + ); + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'OK') { + return jsonData; + } + return (jsonData['status']); + } + + Future update({ + required String endpoint, + required Map data, + required String id, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse('$endpoint/$id'); + var response = await http.put( + url, + body: json.encode(data), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + return json.decode(response.body); + } + + Future delete({ + required String endpoint, + required String id, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse('$endpoint/$id'); + var response = await http.delete( + url, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + return json.decode(response.body); + } +} diff --git a/lib/controller/functions/custom_pant.dart b/lib/controller/functions/custom_pant.dart new file mode 100644 index 0000000..8b85ce4 --- /dev/null +++ b/lib/controller/functions/custom_pant.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class LineChartPainter extends CustomPainter { + final List data; + + LineChartPainter(this.data); + + @override + void paint(Canvas canvas, Size size) { + // Calculate the scale factor. + final scaleFactor = size.height / 240; + + // Draw the line chart. + for (var i = 0; i < data.length - 1; i++) { + final x1 = i * size.width / data.length; + final y1 = data[i] * scaleFactor; + final x2 = (i + 1) * size.width / data.length; + final y2 = data[i + 1] * scaleFactor; + + canvas.drawLine(Offset(x1, y1), Offset(x2, y2), Paint()); + } + } + + @override + bool shouldRepaint(LineChartPainter oldDelegate) => false; +} diff --git a/lib/controller/functions/device_info.dart b/lib/controller/functions/device_info.dart new file mode 100644 index 0000000..3091394 --- /dev/null +++ b/lib/controller/functions/device_info.dart @@ -0,0 +1,90 @@ +// import 'dart:io'; + +// import 'package:device_info_plus/device_info_plus.dart'; + +// class DeviceInfoPlus { +// static List> deviceDataList = []; + +// static Future>> getDeviceInfo() async { +// final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + +// try { +// if (Platform.isAndroid) { +// AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; +// Map deviceData = { +// 'platform': 'Android', +// 'brand': androidInfo.brand, +// 'model': androidInfo.model, +// 'androidId': androidInfo.device, +// 'versionRelease': androidInfo.version.release, +// 'sdkVersion': androidInfo.version.sdkInt, +// 'manufacturer': androidInfo.manufacturer, +// 'isPhysicalDevice': androidInfo.isPhysicalDevice, +// 'serialNumber': androidInfo.serialNumber, +// 'fingerprint': androidInfo.fingerprint, +// 'type': androidInfo.type, +// 'data': androidInfo.data, +// 'version': androidInfo.version, +// 'tags': androidInfo.tags, +// 'display': androidInfo.display, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isIOS) { +// IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; +// Map deviceData = { +// 'brand': 'Apple', +// 'model': iosInfo.model, +// 'systemName': iosInfo.systemName, +// 'systemVersion': iosInfo.systemVersion, +// 'utsname': iosInfo.utsname, +// 'isPhysicalDevice': iosInfo.isPhysicalDevice, +// 'identifierForVendor': iosInfo.identifierForVendor, +// 'name': iosInfo.name, +// 'localizedModel': iosInfo.localizedModel, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isMacOS) { +// MacOsDeviceInfo macInfo = await deviceInfoPlugin.macOsInfo; +// Map deviceData = { +// 'platform': 'macOS', +// 'model': macInfo.model, +// 'version': macInfo.systemGUID, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isWindows) { +// WindowsDeviceInfo windowsInfo = await deviceInfoPlugin.windowsInfo; +// Map deviceData = { +// 'platform': 'Windows', +// 'manufacturer': windowsInfo.computerName, +// 'version': windowsInfo.majorVersion, +// 'deviceId': windowsInfo.deviceId, +// 'userName': windowsInfo.userName, +// 'productName': windowsInfo.productName, +// 'installDate': windowsInfo.installDate, +// 'productId': windowsInfo.productId, +// 'numberOfCores': windowsInfo.numberOfCores, +// 'systemMemoryInMegabytes': windowsInfo.systemMemoryInMegabytes, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isLinux) { +// LinuxDeviceInfo linuxInfo = await deviceInfoPlugin.linuxInfo; +// Map deviceData = { +// 'platform': 'Linux', +// 'manufacturer': linuxInfo.name, +// 'version': linuxInfo.version, +// }; +// deviceDataList.add(deviceData); +// } +// } catch (e) { +// } + +// return deviceDataList; +// } + +// // Method to print all device data +// static void printDeviceInfo() { +// for (Map deviceData in deviceDataList) { +// 'Version: ${deviceData['version'] ?? deviceData['versionRelease'] ?? 'N/A'}'); +// } +// } +// } diff --git a/lib/controller/functions/digit_obsecur_formate.dart b/lib/controller/functions/digit_obsecur_formate.dart new file mode 100644 index 0000000..b5972e4 --- /dev/null +++ b/lib/controller/functions/digit_obsecur_formate.dart @@ -0,0 +1,42 @@ +import 'package:flutter/services.dart'; + +class DigitObscuringFormatter extends TextInputFormatter { + @override + TextEditingValue formatEditUpdate( + TextEditingValue oldValue, TextEditingValue newValue) { + final maskedText = maskDigits(newValue.text); + return newValue.copyWith( + text: maskedText, + selection: updateCursorPosition(maskedText, newValue.selection)); + } + + String maskDigits(String text) { + final totalDigits = text.length; + final visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final firstVisibleDigits = text.substring(0, visibleDigits); + final lastVisibleDigits = text.substring(totalDigits - visibleDigits); + + final maskedDigits = List.filled(hiddenDigits, '*').join(); + + return '$firstVisibleDigits$maskedDigits$lastVisibleDigits'; + } + + TextSelection updateCursorPosition( + String maskedText, TextSelection currentSelection) { + final cursorPosition = currentSelection.baseOffset; + final cursorOffset = + currentSelection.extentOffset - currentSelection.baseOffset; + final totalDigits = maskedText.length; + const visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final updatedPosition = cursorPosition <= visibleDigits + ? cursorPosition + : hiddenDigits + visibleDigits + (cursorPosition - visibleDigits); + + return TextSelection.collapsed( + offset: updatedPosition, affinity: currentSelection.affinity); + } +} diff --git a/lib/controller/functions/document_scanner.dart b/lib/controller/functions/document_scanner.dart new file mode 100644 index 0000000..198992c --- /dev/null +++ b/lib/controller/functions/document_scanner.dart @@ -0,0 +1,41 @@ +// import 'dart:io'; +// +// import 'package:get/get.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:google_ml_kit/google_ml_kit.dart'; +// +// class ImagePickerController extends GetxController { +// RxBool textScanning = false.obs; +// RxString scannedText = ''.obs; +// +// Future getImage(ImageSource source) async { +// try { +// final pickedImage = await ImagePicker().pickImage(source: source); +// if (pickedImage != null) { +// textScanning.value = true; +// final imageFile = File(pickedImage.path); +// getRecognisedText(imageFile); +// } +// } catch (e) { +// textScanning.value = false; +// scannedText.value = "Error occurred while scanning"; +// } +// } +// +// Future getRecognisedText(File image) async { +// final inputImage = InputImage.fromFilePath(image.path); +// final textDetector = GoogleMlKit.vision.textRecognizer(); +// final RecognizedText recognisedText = +// await textDetector.processImage(inputImage); +// await textDetector.close(); +// +// scannedText.value = ''; +// for (TextBlock block in recognisedText.blocks) { +// for (TextLine line in block.lines) { +// scannedText.value += line.text + '\n'; +// } +// } +// +// textScanning.value = false; +// } +// } diff --git a/lib/controller/functions/gemeni.dart b/lib/controller/functions/gemeni.dart new file mode 100644 index 0000000..14bca12 --- /dev/null +++ b/lib/controller/functions/gemeni.dart @@ -0,0 +1,829 @@ +// import 'dart:convert'; +// import 'dart:io'; +// import 'package:get/get.dart'; +// import 'package:image_cropper/image_cropper.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:http/http.dart' as http; +// import 'package:image/image.dart' as img; +// import 'package:path_provider/path_provider.dart'; + +// import '../../constant/api_key.dart'; +// import '../../constant/colors.dart'; + +// class AI extends GetxController { +// final picker = ImagePicker(); +// Map responseMap = {}; +// Map responseCarLicenseMap = {}; +// Map responseBackCarLicenseMap = {}; +// Map responseIdCardeMap = {}; +// bool isloading = false; +// var image; +// CroppedFile? croppedFile; +// DateTime now = DateTime.now(); +// Future pickImage() async { +// final pickedImage = await picker.pickImage(source: ImageSource.gallery); + +// if (pickedImage != null) { +// image = File(pickedImage.path); +// // Crop the image +// croppedFile = await ImageCropper().cropImage( +// sourcePath: image!.path, +// aspectRatioPresets: [ +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio16x9 +// ], +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: 'Cropper'.tr, +// toolbarColor: AppColor.blueColor, +// toolbarWidgetColor: AppColor.yellowColor, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false), +// IOSUiSettings( +// title: 'Cropper'.tr, +// ), +// ], +// ); +// // image = croppedFile; + +// // Resize the image +// final rawImage = +// img.decodeImage(File(croppedFile!.path).readAsBytesSync()); +// final resizedImage = +// img.copyResize(rawImage!, width: 800); // Adjust the width as needed + +// final appDir = await getTemporaryDirectory(); +// final resizedImagePath = '${appDir.path}/resized_image.jpg'; + +// final resizedImageFile = File(resizedImagePath); +// resizedImageFile.writeAsBytesSync( +// img.encodeJpg(resizedImage)); // Save the resized image as JPEG + +// image = resizedImageFile; +// update(); +// } +// } + +// Future generateContent() async { +// await pickImage(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json for all data as first name ,last name,dob,licenseID,expiration date,issued date asdress class type ,output json type', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future geminiAiExtraction(String prompt, payload) async { +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// // { +// // 'inlineData': { +// // 'mimeType': 'image/jpeg', +// // 'data': imageData, +// // }, +// // }, +// { +// 'text': +// "Extract the desired information from the following passage as json decoded like $prompt .and look for this instruction first name in line 3or 2 ,fullname in line 4 from it written left to right but you modify it rtl,address in line 5 it written left to right but you modify it rtl and 6,dob,nationalid in the last line as just in this:\n\n$payload" +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safety_settings': [ +// {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, +// {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, +// { +// "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", +// "threshold": "BLOCK_NONE" +// }, +// { +// "category": "HARM_CATEGORY_DANGEROUS_CONTENT", +// "threshold": "BLOCK_NONE" +// }, +// ] +// }); + +// final response = await http.post( +// Uri.parse( +// // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=AIzaSyCyoLcSkDzK5_SMe00nhut56SSXWPR074w'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } + +// Future getDriverLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json for all data as first name ,last name,dob,id ,expiration date,issued date asdress class type,age in years ,output json type in arabic value and stay engish key and make date format like YYYY-MM-DD , for name please extract name in arabic in Name in json plus first_name ', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getCarLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the Jordanian ID card: +// Name +// National ID number +// Gender +// Date of birth +// Output the extracted information in the following JSON format''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// // 'https://${API_ENDPOINT}/v1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/publishers/google/models/${MODEL_ID}:streamGenerateContent'), +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future jordanID() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the Jordanian ID card: +// Name +// National ID number +// Gender +// Date of birth +// Output the extracted information in the following JSON format''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future carLicenseJordan() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the car license card in Jordan: + +// * name +// * Address +// * Vehicle type +// * car_kind +// * car_color +// * Vehicle category +// * car_year +// * car_plate +// * Registration type +// * Usage type +// * expire_date_of_license + +// Output the extracted information in the following JSON formate and make date format like YYYY-MM-DD''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getTextFromCard(String prompt) async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': prompt, +// }, +// ], +// }, +// ], +// 'generationConfig': { +// "temperature": 1, +// "topK": 32, +// "topP": 0.1, +// "maxOutputTokens": 4096, +// "stopSequences": [] +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseBackCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future generateBackCarLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json output from extracting car license back face for these key ,vin,fuelType,passengerType,curbWeight,insuranceCompany,policyNumber,notes,insuranceType and output it json .dont add data else this image', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 343, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseBackCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getFromCarRegistration() async { +// await pickImage(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write output json from image for[ vin, make, model, year, expiration_date, color, owner, registration_date ],output json type ', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// @override +// void onInit() { +// // generateContent(); +// super.onInit(); +// } +// } diff --git a/lib/controller/functions/launch.dart b/lib/controller/functions/launch.dart new file mode 100644 index 0000000..65b1232 --- /dev/null +++ b/lib/controller/functions/launch.dart @@ -0,0 +1,63 @@ +import 'package:url_launcher/url_launcher.dart'; +import 'dart:io'; + +void showInBrowser(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} + +void launchCommunication( + String method, String contactInfo, String message) async { + String url; + + if (Platform.isIOS) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + + case 'sms': + url = 'sms:$contactInfo?body=$message'; + break; + + case 'whatsapp': + url = 'https://api.whatsapp.com/send?phone=$contactInfo&text=$message'; + break; + + case 'email': + url = 'mailto:$contactInfo?subject=Subject&body=$message'; + break; + + default: + return; + } + } else if (Platform.isAndroid) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + + case 'sms': + url = 'sms:$contactInfo?body=$message'; + break; + + case 'whatsapp': + url = 'whatsapp://send?phone=$contactInfo&text=$message'; + break; + + case 'email': + url = 'mailto:$contactInfo?subject=Subject&body=$message'; + break; + + default: + return; + } + } else { + return; + } + + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} diff --git a/lib/controller/functions/llama_ai.dart b/lib/controller/functions/llama_ai.dart new file mode 100644 index 0000000..60e8c33 --- /dev/null +++ b/lib/controller/functions/llama_ai.dart @@ -0,0 +1,36 @@ +import 'dart:convert'; + +import '../../constant/links.dart'; +import 'crud.dart'; + +class LlamaAi { + Future getCarRegistrationData(String input, prompt) async { + Map exrtatDataFinal = {}; + String oneLine = input.replaceAll('\n', ' '); + // var res = await CRUD().getLlama(link: AppLink.gemini, payload: oneLine); + var res = await CRUD() + .getLlama(link: AppLink.llama, payload: oneLine, prompt: prompt); + + var decod = jsonDecode(res.toString()); + // exrtatDataFinal = jsonDecode(extractDataFromJsonString(decod['choices'])); + extractDataFromJsonString(decod['choices'][0]['message']['content']); + return exrtatDataFinal; + } + + String extractDataFromJsonString(String jsonString) { + // Remove any leading or trailing whitespace from the string + jsonString = jsonString.trim(); + + // Extract the JSON substring from the given string + final startIndex = jsonString.indexOf('{'); + final endIndex = jsonString.lastIndexOf('}'); + final jsonSubstring = jsonString.substring(startIndex, endIndex + 1); + + // Parse the JSON substring into a Map + final jsonData = jsonDecode(jsonSubstring); + + // Return the extracted data + + return jsonEncode(jsonData); + } +} diff --git a/lib/controller/functions/location_controller.dart b/lib/controller/functions/location_controller.dart new file mode 100644 index 0000000..35a57e7 --- /dev/null +++ b/lib/controller/functions/location_controller.dart @@ -0,0 +1,133 @@ +// import 'dart:async'; + +// import 'package:get/get.dart'; +// import 'package:google_maps_flutter/google_maps_flutter.dart'; +// import 'package:location/location.dart'; + +// import '../../constant/box_name.dart'; +// import '../../constant/links.dart'; +// import '../../main.dart'; +// import 'crud.dart'; + +// // LocationController.dart +// class LocationController extends GetxController { +// LocationData? _currentLocation; +// late Location location; +// bool isLoading = false; +// late double heading = 0; +// late double accuracy = 0; +// late double previousTime = 0; +// late double latitude; +// late double totalDistance = 0; +// late double longitude; +// late DateTime time; +// late double speed = 0; +// late double speedAccuracy = 0; +// late double headingAccuracy = 0; +// bool isActive = false; +// late LatLng myLocation; +// String totalPoints = '0'; +// LocationData? get currentLocation => _currentLocation; +// Timer? _locationTimer; + +// @override +// void onInit() async { +// super.onInit(); +// location = Location(); +// getLocation(); +// // startLocationUpdates(); +// } + +// Future startLocationUpdates() async { +// if (box.read(BoxName.driverID) != null) { +// _locationTimer = +// Timer.periodic(const Duration(seconds: 5), (timer) async { +// try { +// // if (isActive) { +// if (double.parse(totalPoints) > -300) { + +// await getLocation(); + +// // if (box.read(BoxName.driverID) != null) { +// await CRUD() +// .post(link: AppLink.addCarsLocationByPassenger, payload: { +// 'driver_id': box.read(BoxName.driverID).toString(), +// 'latitude': myLocation.latitude.toString(), +// 'longitude': myLocation.longitude.toString(), +// 'heading': heading.toString(), +// 'speed': (speed * 3.6).toStringAsFixed(1), +// 'distance': totalDistance == 0 +// ? '0' +// : totalDistance < 1 +// ? totalDistance.toStringAsFixed(3) +// : totalDistance.toStringAsFixed(1), +// 'status': box.read(BoxName.statusDriverLocation).toString() +// }); +// } +// } catch (e) { +// // Handle the error gracefully +// } +// }); +// } +// } + +// void stopLocationUpdates() { +// _locationTimer?.cancel(); +// } + +// Future getLocation() async { +// // isLoading = true; +// // update(); +// bool serviceEnabled; +// PermissionStatus permissionGranted; + +// // Check if location services are enabled +// serviceEnabled = await location.serviceEnabled(); +// if (!serviceEnabled) { +// serviceEnabled = await location.requestService(); +// if (!serviceEnabled) { +// // Location services are still not enabled, handle the error +// return; +// } +// } + +// // Check if the app has permission to access location +// permissionGranted = await location.hasPermission(); +// if (permissionGranted == PermissionStatus.denied) { +// permissionGranted = await location.requestPermission(); +// if (permissionGranted != PermissionStatus.granted) { +// // Location permission is still not granted, handle the error +// return; +// } +// } + +// // Configure location accuracy +// // LocationAccuracy desiredAccuracy = LocationAccuracy.high; + +// // Get the current location +// LocationData _locationData = await location.getLocation(); +// myLocation = +// (_locationData.latitude != null && _locationData.longitude != null +// ? LatLng(_locationData.latitude!, _locationData.longitude!) +// : null)!; +// speed = _locationData.speed!; +// heading = _locationData.heading!; + +// // isLoading = false; +// update(); +// } + +// double calculateDistanceInKmPerHour( +// double? startTime, double? endTime, double speedInMetersPerSecond) { +// // Calculate the time difference in hours +// double timeDifferenceInHours = (endTime! - startTime!) / 1000 / 3600; + +// // Convert speed to kilometers per hour +// double speedInKmPerHour = speedInMetersPerSecond * 3.6; + +// // Calculate the distance in kilometers +// double distanceInKilometers = speedInKmPerHour * timeDifferenceInHours; + +// return distanceInKilometers; +// } +// } diff --git a/lib/controller/functions/location_permission.dart b/lib/controller/functions/location_permission.dart new file mode 100644 index 0000000..9bbf33c --- /dev/null +++ b/lib/controller/functions/location_permission.dart @@ -0,0 +1,16 @@ +import 'package:location/location.dart'; +import 'package:get/get.dart'; + +class LocationPermissions { + late Location location; + + Future locationPermissions() async { + location = Location(); + var permissionStatus = await location.requestPermission(); + if (permissionStatus == PermissionStatus.denied) { + // The user denied the location permission. + Get.defaultDialog(title: 'GPS Required Allow !.'.tr, middleText: ''); + return null; + } + } +} diff --git a/lib/controller/functions/log_out.dart b/lib/controller/functions/log_out.dart new file mode 100644 index 0000000..3143884 --- /dev/null +++ b/lib/controller/functions/log_out.dart @@ -0,0 +1,181 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../../views/widgets/my_textField.dart'; +import 'crud.dart'; + +class LogOutController extends GetxController { + TextEditingController checkTxtController = TextEditingController(); + final formKey = GlobalKey(); + final formKey1 = GlobalKey(); + final emailTextController = TextEditingController(); + + Future deleteMyAccountDriver(String id) async { + await CRUD().post(link: AppLink.removeUser, payload: {'id': id}).then( + (value) => Get.snackbar('Deleted'.tr, 'Your Account is Deleted', + backgroundColor: AppColor.redColor)); + } + + checkBeforeDelete() async { + var res = await CRUD().post( + link: AppLink.deletecaptainAccounr, + payload: {'id': box.read(BoxName.driverID)}).then((value) => exit(0)); + } + + deletecaptainAccount() { + Get.defaultDialog( + backgroundColor: AppColor.yellowColor, + title: 'Are you sure to delete your account?'.tr, + middleText: + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month ', + titleStyle: AppStyle.title, + content: Column( + children: [ + Container( + width: Get.width, + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month' + .tr, + style: AppStyle.title.copyWith(color: AppColor.redColor), + ), + ), + ), + const SizedBox( + height: 20, + ), + Form( + key: formKey, + child: SizedBox( + width: Get.width, + child: MyTextForm( + controller: checkTxtController, + label: 'Enter Your First Name'.tr, + hint: 'Enter Your First Name'.tr, + type: TextInputType.name, + ), + )) + ], + ), + confirm: MyElevatedButton( + title: 'Delete'.tr, + onPressed: () { + if (checkTxtController.text == box.read(BoxName.nameDriver)) { + deletecaptainAccount(); + } + })); + } + + Future logOutPassenger() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.driverID); + box.remove(BoxName.email); + box.remove(BoxName.lang); + box.remove(BoxName.name); + box.remove(BoxName.passengerID); + box.remove(BoxName.phone); + box.remove(BoxName.tokenFCM); + box.remove(BoxName.tokens); + box.remove(BoxName.addHome); + box.remove(BoxName.addWork); + box.remove(BoxName.agreeTerms); + box.remove(BoxName.apiKeyRun); + box.remove(BoxName.countryCode); + box.remove(BoxName.accountIdStripeConnect); + box.remove(BoxName.passengerWalletTotal); + Get.offAll(const MainApp()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + Future logOutCaptain() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + titleStyle: AppStyle.title, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.driverID); + box.remove(BoxName.sexDriver); + box.remove(BoxName.dobDriver); + box.remove(BoxName.nameDriver); + box.remove(BoxName.emailDriver); + box.remove(BoxName.phoneDriver); + box.remove(BoxName.statusDriverLocation); + box.remove(BoxName.cvvCodeDriver); + box.remove(BoxName.lastNameDriver); + box.remove(BoxName.passwordDriver); + box.remove(BoxName.cardNumberDriver); + box.remove(BoxName.expiryDateDriver); + box.remove(BoxName.cardHolderNameDriver); + box.remove(BoxName.vin); + box.remove(BoxName.make); + box.remove(BoxName.year); + box.remove(BoxName.owner); + box.remove(BoxName.onBoarding); + box.remove(BoxName.agreeTerms); + Get.offAll(const MainApp()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + deletePassengerAccount() async { + if (formKey1.currentState!.validate()) { + if (box.read(BoxName.email).toString() == emailTextController.text) { + await CRUD().post(link: AppLink.passengerRemovedAccountEmail, payload: { + 'email': box.read(BoxName.email), + }); + } else { + Get.snackbar('Email Wrong'.tr, 'Email you inserted is Wrong.'.tr, + snackPosition: SnackPosition.BOTTOM, + backgroundColor: AppColor.redColor); + } + } + } +} diff --git a/lib/controller/functions/scan_id_card.dart b/lib/controller/functions/scan_id_card.dart new file mode 100644 index 0000000..b0e6336 --- /dev/null +++ b/lib/controller/functions/scan_id_card.dart @@ -0,0 +1,25 @@ +// import 'package:credit_card_scanner/credit_card_scanner.dart'; +// import 'package:get/get.dart'; +// +// class ScanIdCard extends GetxController { +// CardDetails? _cardDetails; +// CardScanOptions scanOptions = const CardScanOptions( +// scanCardHolderName: true, +// enableDebugLogs: true, +// validCardsToScanBeforeFinishingScan: 5, +// possibleCardHolderNamePositions: [ +// CardHolderNameScanPosition.aboveCardNumber, +// ], +// ); +// +// Future scanCard() async { +// final CardDetails? cardDetails = +// await CardScanner.scanCard(scanOptions: scanOptions); +// if (cardDetails == null) { +// return; +// } +// +// _cardDetails = cardDetails; +// update(); +// } +// } diff --git a/lib/controller/functions/secure_storage.dart b/lib/controller/functions/secure_storage.dart new file mode 100644 index 0000000..364dced --- /dev/null +++ b/lib/controller/functions/secure_storage.dart @@ -0,0 +1,14 @@ +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class SecureStorage { + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + + void saveData(String key, value) async { + await _storage.write(key: key, value: value); + } + + Future readData(String boxName) async { + final String? value = await _storage.read(key: boxName); + return value; + } +} diff --git a/lib/controller/functions/upload_image.dart b/lib/controller/functions/upload_image.dart new file mode 100644 index 0000000..635b3c2 --- /dev/null +++ b/lib/controller/functions/upload_image.dart @@ -0,0 +1,108 @@ +// import 'dart:convert'; +// import 'dart:io'; + +// import 'package:get/get.dart'; +// import 'package:http/http.dart' as http; +// import 'package:image_cropper/image_cropper.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:path/path.dart'; + +// import '../../constant/api_key.dart'; +// import '../../constant/box_name.dart'; +// import '../../constant/colors.dart'; +// import '../../main.dart'; + +// class ImageController extends GetxController { +// File? myImage; +// bool isloading = false; +// CroppedFile? croppedFile; +// final picker = ImagePicker(); +// var image; +// choosImage(String link, String imageType) async { +// final pickedImage = await picker.pickImage(source: ImageSource.gallery); +// image = File(pickedImage!.path); +// croppedFile = await ImageCropper().cropImage( +// sourcePath: image!.path, +// aspectRatioPresets: [ +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio16x9 +// ], +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: 'Cropper'.tr, +// toolbarColor: AppColor.blueColor, +// toolbarWidgetColor: AppColor.yellowColor, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false), +// IOSUiSettings( +// title: 'Cropper'.tr, +// ), +// ], +// ); +// myImage = File(pickedImage.path); +// isloading = true; +// update(); +// // Save the cropped image +// File savedCroppedImage = File(croppedFile!.path); +// try { +// await uploadImage( +// savedCroppedImage, +// { +// 'driverID': +// box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), +// 'imageType': imageType +// }, +// link, +// ); +// } catch (e) { +// Get.snackbar('Image Upload Failed'.tr, e.toString(), +// backgroundColor: AppColor.redColor); +// } finally { +// isloading = false; +// update(); +// } +// } + +// uploadImage(File file, Map data, String link) async { +// var request = http.MultipartRequest( +// 'POST', +// Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' +// ); + +// var length = await file.length(); +// var stream = http.ByteStream(file.openRead()); +// var multipartFile = http.MultipartFile( +// 'image', +// stream, +// length, +// filename: basename(file.path), +// ); +// request.headers.addAll({ +// 'Authorization': +// 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}', +// }); +// // Set the file name to the driverID +// request.files.add( +// http.MultipartFile( +// 'image', +// stream, +// length, +// filename: '${box.read(BoxName.driverID)}.jpg', +// ), +// ); +// data.forEach((key, value) { +// request.fields[key] = value; +// }); +// var myrequest = await request.send(); +// var res = await http.Response.fromStream(myrequest); +// if (res.statusCode == 200) { +// return jsonDecode(res.body); +// } else { +// throw Exception( +// 'Failed to upload image: ${res.statusCode} - ${res.body}'); +// } +// } +// } diff --git a/lib/controller/notification_controller.dart b/lib/controller/notification_controller.dart new file mode 100644 index 0000000..998a9b8 --- /dev/null +++ b/lib/controller/notification_controller.dart @@ -0,0 +1,115 @@ +import 'package:flutter/widgets.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/box_name.dart'; +import 'package:sefer_admin1/controller/firebase/firbase_messge.dart'; +import 'package:sefer_admin1/main.dart'; +import 'package:sefer_admin1/views/widgets/elevated_btn.dart'; +import 'package:sefer_admin1/views/widgets/my_textField.dart'; + +import '../constant/style.dart'; + +class NotificationController extends GetxController { + final formKey = GlobalKey(); + final title = TextEditingController(); + final body = TextEditingController(); + List tokensDriver = []; + List tokensPassengers = []; + + getTokensDrivers() async { + await FirebaseMessagesController().getAllTokenDrivers(); + } + + getTokensPassengers() async { + await FirebaseMessagesController().getAllTokenPassengers(); + } + + Future sendNotificationDrivers() { + return Get.defaultDialog( + title: 'send notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: formKey, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: title, + label: 'title notification'.tr, + hint: 'title notification'.tr, + type: TextInputType.name), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: body, + label: 'body notification'.tr, + hint: 'body notification'.tr, + type: TextInputType.name), + ), + ], + ), + ), + confirm: MyElevatedButton( + title: 'send'.tr, + onPressed: () async { + tokensDriver = box.read(BoxName.tokensDrivers); + if (formKey.currentState!.validate()) { + for (var i = 0; i < tokensDriver.length; i++) { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + title.text, body.text, tokensDriver[i]); + } + } + }), + cancel: MyElevatedButton( + title: 'cancel', + onPressed: () { + Get.back(); + })); + } + + Future sendNotificationPassengers() { + return Get.defaultDialog( + title: 'send notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: formKey, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: title, + label: 'title notification'.tr, + hint: 'title notification'.tr, + type: TextInputType.name), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: body, + label: 'body notification'.tr, + hint: 'body notification'.tr, + type: TextInputType.name), + ), + ], + ), + ), + confirm: MyElevatedButton( + title: 'send'.tr, + onPressed: () async { + tokensPassengers = box.read(BoxName.tokensPassengers); + for (var i = 0; i < tokensPassengers.length; i++) { + if (formKey.currentState!.validate()) { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + title.text, body.text, tokensPassengers[i]); + } + } + }), + cancel: MyElevatedButton( + title: 'cancel', + onPressed: () { + Get.back(); + })); + } +} diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..3974baf --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,70 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0', + appId: '1:594687661098:android:8ec72f5f8b0b0ab8595f53', + messagingSenderId: '594687661098', + projectId: 'ride-b1bd8', + storageBucket: 'ride-b1bd8.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM', + appId: '1:594687661098:ios:9f46a169fad13752595f53', + messagingSenderId: '594687661098', + projectId: 'ride-b1bd8', + storageBucket: 'ride-b1bd8.appspot.com', + androidClientId: '594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com', + iosClientId: '594687661098-aj48k038fjst4k8jiprfbq8895b11cci.apps.googleusercontent.com', + iosBundleId: 'com.example.seferAdmin1', + ); +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..27ebffc --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,64 @@ +import 'dart:io'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import 'controller/firebase/firbase_messge.dart'; +import 'firebase_options.dart'; +import 'models/db_sql.dart'; +import 'views/admin/admin_home_page.dart'; + +final box = GetStorage(); +const storage = FlutterSecureStorage(); +@pragma('vm:entry-point') +Future backgroundMessageHandler(RemoteMessage message) async { + await Firebase.initializeApp(); + if (message.data.isNotEmpty && message.notification != null) { + FirebaseMessagesController().fireBaseTitles(message); + } +} + +DbSql sql = DbSql.instance; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await GetStorage.init(); + if (Platform.isAndroid || Platform.isIOS) { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + await FirebaseMessagesController().requestFirebaseMessagingPermission(); + + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + + List initializationTasks = [ + FirebaseMessagesController().getNotificationSettings(), + FirebaseMessagesController().getToken(), + ]; + + await Future.wait(initializationTasks); + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]); + } + + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + @override + Widget build(BuildContext context) { + return const GetMaterialApp( + debugShowCheckedModeBanner: false, + home: AdminHomePage(), + ); + } +} diff --git a/lib/models/db_sql.dart b/lib/models/db_sql.dart new file mode 100644 index 0000000..7f0bb18 --- /dev/null +++ b/lib/models/db_sql.dart @@ -0,0 +1,116 @@ +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart'; + +import '../constant/table_names.dart'; + +class DbSql { + static final DbSql instance = DbSql._(); + + static Database? _database; + + DbSql._(); + + Future get database async { + if (_database != null) return _database!; + _database = await _initDatabase(); + return _database!; + } + + Future _initDatabase() async { + String path = join(await getDatabasesPath(), 'my_database.db'); + return await openDatabase( + path, + version: 1, + onCreate: (db, version) async { + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.carLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + driver_id TEXT, + latitude REAL, + longitude REAL, + created_at TEXT, + updated_at TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.placesFavorite}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT UNIQUE, + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.recentLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT , + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.driverOrdersRefuse}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT UNIQUE, + created_at TEXT, + driver_id TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.rideLocation}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT , + created_at TEXT, + lat TEXT, + lng TEXT + ) + '''); + 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.captainNotification}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + faceDetectTimes INTEGER + ) + '''); + }, + ); + } + + Future>> getAllData(String table) async { + Database db = await instance.database; + return await db.query(table); + } + + Future>> getCustomQuery(String query) async { + Database db = await instance.database; + return await db.rawQuery(query); + } + + Future insertData(Map map, String table) async { + Database db = await instance.database; + return await db.insert(table, map); + } + + Future updateData(Map map, String table, int id) async { + Database db = await instance.database; + + return await db.update(table, map, where: 'id = ?', whereArgs: [id]); + } + + Future deleteData(String table, int id) async { + Database db = await instance.database; + return await db.delete(table, where: 'id = ?', whereArgs: [id]); + } + + Future deleteAllData(String table) async { + Database db = await instance.database; + return await db.delete(table); + } +} diff --git a/lib/models/feedback_qury.sql b/lib/models/feedback_qury.sql new file mode 100644 index 0000000..a05fe96 --- /dev/null +++ b/lib/models/feedback_qury.sql @@ -0,0 +1,40 @@ +-- Frequent Complaint Passengers +SELECT + passengers.id AS passenger_id, + passengers.first_name, + passengers.last_name, + passengers.phone, + COUNT(`feedBack`.id) AS complaint_count +FROM + passengers +JOIN `feedBack` ON passengers.id = `feedBack`.`passengerId` +GROUP BY + passengers.id +ORDER BY + complaint_count +DESC +LIMIT 10; +--========== +-- to get all driver payment to pay to them +SELECT + p.driverID, + COALESCE(SUM(p.amount), 0) AS total_amount, + COALESCE(SUM(p.amount), 0) + COALESCE(pd.total_points, 0) AS diff +FROM + payments p +JOIN ( + SELECT + driverID, + SUM(amount) AS total_points + FROM + paymentsDriverPoints + WHERE + payment_method = 'fromBudgetToPoints' + GROUP BY + driverID +) pd ON p.driverID = pd.driverID +WHERE + p.isGiven = 'waiting' + AND p.payment_method IN ('visa-in', 'visa', 'visaRide', 'TransferFrom', 'payout', 'TransferTo') +GROUP BY + p.driverID; diff --git a/lib/models/model/admin/monthly_ride.dart b/lib/models/model/admin/monthly_ride.dart new file mode 100644 index 0000000..df4d600 --- /dev/null +++ b/lib/models/model/admin/monthly_ride.dart @@ -0,0 +1,21 @@ +class MonthlyDataModel { + final int year; + final int month; + final int day; + final int ridesCount; + + MonthlyDataModel({ + required this.year, + required this.month, + required this.day, + required this.ridesCount, + }); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + year: json['year'] as int, + month: json['month'] as int, + day: json['day'] as int, + ridesCount: json['rides_count'] as int, + ); +} diff --git a/lib/models/model/admin/passenger_model.dart b/lib/models/model/admin/passenger_model.dart new file mode 100644 index 0000000..ed920bb --- /dev/null +++ b/lib/models/model/admin/passenger_model.dart @@ -0,0 +1,79 @@ +class Passenger { + String id; + String phone; + String email; + String gender; + String status; + String birthdate; + String site; + String firstName; + String lastName; + String sosPhone; + String education; + String employmentType; + String maritalStatus; + String createdAt; + String updatedAt; + int countPassenger; + int countFeedback; + double ratingPassenger; + int countDriverRate; + int countPassengerCancel; + double passengerAverageRating; + int countPassengerRate; + int countPassengerRide; + + Passenger({ + required this.id, + required this.phone, + required this.email, + required this.gender, + required this.status, + required this.birthdate, + required this.site, + required this.firstName, + required this.lastName, + required this.sosPhone, + required this.education, + required this.employmentType, + required this.maritalStatus, + required this.createdAt, + required this.updatedAt, + required this.countPassenger, + required this.countFeedback, + required this.ratingPassenger, + required this.countDriverRate, + required this.countPassengerCancel, + required this.passengerAverageRating, + required this.countPassengerRate, + required this.countPassengerRide, + }); + + factory Passenger.fromJson(Map json) { + return Passenger( + id: json['id'], + phone: json['phone'], + email: json['email'], + gender: json['gender'], + status: json['status'], + birthdate: json['birthdate'], + site: json['site'], + firstName: json['first_name'], + lastName: json['last_name'], + sosPhone: json['sosPhone'], + education: json['education'], + employmentType: json['employmentType'], + maritalStatus: json['maritalStatus'], + createdAt: json['created_at'], + updatedAt: json['updated_at'], + countPassenger: json['countPassenger'], + countFeedback: json['countFeedback'], + ratingPassenger: json['ratingPassenger'].toDouble(), + countDriverRate: json['countDriverRate'], + countPassengerCancel: json['countPassengerCancel'], + passengerAverageRating: json['passengerAverageRating'].toDouble(), + countPassengerRate: json['countPassengerRate'], + countPassengerRide: json['countPassengerRide'], + ); + } +} diff --git a/lib/models/model/admin/rides_summary_model.dart b/lib/models/model/admin/rides_summary_model.dart new file mode 100644 index 0000000..b3b1113 --- /dev/null +++ b/lib/models/model/admin/rides_summary_model.dart @@ -0,0 +1,12 @@ +class MonthlyDataModel { + int day; + int totalDuration; + + MonthlyDataModel({required this.day, required this.totalDuration}); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + day: int.parse(json['day'].toString().split('-')[2]), + totalDuration: + int.parse(json['total_duration'].toString().split(':')[0])); +} diff --git a/lib/models/model/locations.dart b/lib/models/model/locations.dart new file mode 100644 index 0000000..3b18b60 --- /dev/null +++ b/lib/models/model/locations.dart @@ -0,0 +1,34 @@ +class CarLocationModel { + String id; + String driverId; + double latitude; + double heading; + double speed; + double longitude; + DateTime createdAt; + DateTime updatedAt; + + CarLocationModel({ + required this.id, + required this.driverId, + required this.latitude, + required this.longitude, + required this.heading, + required this.speed, + required this.createdAt, + required this.updatedAt, + }); + + factory CarLocationModel.fromJson(Map json) { + return CarLocationModel( + id: json['id'], + driverId: json['driver_id'], + latitude: double.parse(json['latitude'].toString()), + longitude: double.parse(json['longitude'].toString()), + heading: double.parse(json['heading'].toString()), + speed: double.parse(json['speed'].toString()), + createdAt: DateTime.parse(json['created_at']), + updatedAt: DateTime.parse(json['updated_at']), + ); + } +} diff --git a/lib/models/model/onboarding_model.dart b/lib/models/model/onboarding_model.dart new file mode 100644 index 0000000..199909f --- /dev/null +++ b/lib/models/model/onboarding_model.dart @@ -0,0 +1,30 @@ +import 'package:get/get.dart'; + +List onBoardingList = [ + OnBoardingModel( + title: 'Welcome to Sefer!'.tr, + image: 'assets/images/on1.png', + body: + 'Sefer is the ride-hailing app that is safe, reliable, and accessible.' + .tr, + ), + OnBoardingModel( + title: 'Get to your destination quickly and easily.'.tr, + image: 'assets/images/on2.png', + body: 'With Sefer, you can get a ride to your destination in minutes.'.tr, + ), + OnBoardingModel( + title: 'Enjoy a safe and comfortable ride.'.tr, + image: 'assets/images/on3.png', + body: + 'Sefer is committed to safety, and all of our captains are carefully screened and background checked.' + .tr, + ), +]; + +class OnBoardingModel { + final String? title; + final String? image; + final String? body; + OnBoardingModel({this.body, this.title, this.image}); +} diff --git a/lib/print.dart b/lib/print.dart new file mode 100644 index 0000000..ccc2fb5 --- /dev/null +++ b/lib/print.dart @@ -0,0 +1,13 @@ +import 'dart:developer' as developer; + +class Log { + Log._(); + + static void print(String value, {StackTrace? stackTrace}) { + developer.log(value, name: 'LOG', stackTrace: stackTrace); + } + + static Object? inspect(Object? object) { + return developer.inspect(object); + } +} diff --git a/lib/views/admin/admin_home_page.dart b/lib/views/admin/admin_home_page.dart new file mode 100644 index 0000000..d5f85a6 --- /dev/null +++ b/lib/views/admin/admin_home_page.dart @@ -0,0 +1,393 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get/get_rx/src/rx_typedefs/rx_typedefs.dart'; +import 'package:sefer_admin1/controller/admin/dashboard_controller.dart'; +import 'package:sefer_admin1/controller/notification_controller.dart'; +import 'package:sefer_admin1/views/widgets/mycircular.dart'; + +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../controller/functions/crud.dart'; +import '../../controller/functions/gemeni.dart'; +import '../widgets/my_scafold.dart'; +import 'captain/captain.dart'; +import 'passenger/passenger.dart'; +import 'rides/rides.dart'; +import 'static/static.dart'; +import 'wallet/wallet.dart'; + +class AdminHomePage extends StatelessWidget { + const AdminHomePage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DashboardController()); + + return MyScafolld( + title: 'Admin Home Page', + body: [ + GetBuilder(builder: (dashboardController) { + return dashboardController.dashbord.isEmpty + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.all(8.0), + child: ListView( + // crossAxisAlignment: WrapCrossAlignment.center, + // alignment: WrapAlignment.center, + children: [ + Container( + width: Get.width, + height: Get.height * .6, + decoration: AppStyle.boxDecoration1, + child: Wrap( + spacing: 6, + alignment: WrapAlignment.spaceBetween, + runAlignment: WrapAlignment.spaceBetween, + children: [ + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Sms', + style: AppStyle.title, + ), + Text(dashboardController.creditSMS + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Passengers', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['countPassengers'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Drivers', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['countDriver'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Rides this month', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['countRideThisMonth'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'avg costs', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['avg_passenger_price'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'completed ride', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['completed_rides'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'cancelled ride', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['cancelled_rides'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'payments to driver', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['payments'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'sefer wallet', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['seferWallet'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'count of transfer', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['transfer_from_count'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Morning', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['morning_ride_count'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'evening', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['evening_ride_count'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'night', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['night_ride_count'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'comfort', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['comfort'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Speed', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['speed'] + .toString()), + ], + ), + )), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Lady', + style: AppStyle.title, + ), + Text(dashboardController.dashbord[0] + ['lady'] + .toString()), + ], + ), + )), + ], + )), + AdminWidgetsDashBoard( + title: 'Passengers', + onPressed: () => Get.to(() => Passengrs(), + transition: Transition.topLevel)), + AdminWidgetsDashBoard( + title: 'Captains', + onPressed: () => Get.to(() => Captain(), + transition: Transition.size)), + AdminWidgetsDashBoard( + title: 'Wallet', + onPressed: () => Get.to(() => Wallet(), + transition: Transition.fade)), + AdminWidgetsDashBoard( + title: 'Rides', + onPressed: () => Get.to(() => Rides(), + transition: Transition.downToUp)), + AdminWidgetsDashBoard( + title: 'Static', + onPressed: () => Get.to(() => const StaticDash())), + AdminWidgetsDashBoard( + title: 'send notification Drivers', + onPressed: () async { + await Get.put(NotificationController()) + .getTokensDrivers(); + NotificationController() + .sendNotificationDrivers(); + }), + AdminWidgetsDashBoard( + title: 'send notification Passengers', + onPressed: () async { + await Get.put(NotificationController()) + .getTokensPassengers(); + NotificationController() + .sendNotificationPassengers(); + }), + // AdminWidgetsDashBoard( + // title: 'JordanID', onPressed: () => AI().jordanID()), + // AdminWidgetsDashBoard( + // title: 'Llama', + // onPressed: () => + // CarRegistrationRecognizerController().scanText()), + AdminWidgetsDashBoard( + title: 'Add device to be Admin', + onPressed: () async { + // Map device = DeviceInfoPlus.deviceData; + await CRUD() + .post(link: AppLink.addAdminUser, payload: { + // 'deviceNumber': device['serialNumber'].toString(), + 'name': 'b', + }); + }), + ], + ), + ); + }) + ], + isleading: false); + } +} + +class AdminWidgetsDashBoard extends StatelessWidget { + const AdminWidgetsDashBoard({ + super.key, + required this.title, + required this.onPressed, + }); + final String title; + final Callback onPressed; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: onPressed, + child: Container( + decoration: AppStyle.boxDecoration, + height: 50, + width: Get.width * .4, + child: Center( + child: Text( + title.tr, + style: AppStyle.title, + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/admin/captain/captain.dart b/lib/views/admin/captain/captain.dart new file mode 100644 index 0000000..2a3ac66 --- /dev/null +++ b/lib/views/admin/captain/captain.dart @@ -0,0 +1,222 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; +import '../../widgets/mycircular.dart'; +import 'captain_details.dart'; +import 'form_captain.dart'; + +class Captain extends StatelessWidget { + Captain({super.key}); + final CaptainAdminController captainAdminController = + Get.put(CaptainAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Captain'.tr, + body: [ + GetBuilder( + builder: (captainAdminController) => Column( + children: [ + captainAdminController.isLoading + ? const MyCircularProgressIndicator() + : Column( + children: [ + Padding( + padding: const EdgeInsets.all(5), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + captainAdmin( + captainAdminController, + 'Captains Count', + 'countPassenger', + ), + MyElevatedButton( + title: 'Add Prize to Gold Captains', + onPressed: () { + var date = DateTime.now(); + var day = date.weekday; + + if (day == 6) { + // Saturday is 6 + Get.defaultDialog( + title: + 'Add Prize to Gold Captains', + titleStyle: AppStyle.title, + content: Column( + children: [ + Text( + 'Add Points to their wallet as prize' + .tr, + style: AppStyle.title, + ), + Form( + key: captainAdminController + .formCaptainPrizeKey, + child: MyTextForm( + controller: + captainAdminController + .captainPrizeController, + label: + 'Count of prize' + .tr, + hint: 'Count of prize' + .tr, + type: TextInputType + .number)) + ], + ), + confirm: MyElevatedButton( + title: 'Add', + onPressed: () async { + if (captainAdminController + .formCaptainPrizeKey + .currentState! + .validate()) { + captainAdminController + .addCaptainsPrizeToWalletSecure(); + } + }, + ), + ); + } else { + Get.defaultDialog( + title: + 'This day is not allowed', + titleStyle: AppStyle.title, + middleText: + 'Saturday only Allowed day', + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.back(); + })); + } + }) + ], + ), + ), + const SizedBox( + height: 10, + ), + InkWell( + onTap: () { + //todo search + }, + child: Padding( + padding: const EdgeInsets.all(3), + child: Container( + width: Get.width, + height: 110, + decoration: BoxDecoration( + border: Border.all( + width: 2, + color: AppColor.greenColor)), + child: formSearchCaptain() + // ], + // ), + ), + ), + ), + SizedBox( + height: Get.height * .5, + child: ListView.builder( + itemCount: captainAdminController + .captainData['message'].length, + itemBuilder: (context, index) { + final user = captainAdminController + .captainData['message'][index]; + + return InkWell( + onTap: () { + Get.to(const CaptainsDetailsPage(), + arguments: { + 'data': user, + }); + }, + child: Padding( + padding: const EdgeInsets.all(3), + child: Container( + decoration: BoxDecoration( + border: Border.all(width: 2)), + child: ListTile( + title: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Name : ${user['first_name']} ${user['last_name']}', + style: AppStyle.title, + ), + Text( + 'Rating : ${user['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + subtitle: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Count Trip : ${user['countPassengerRide']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate : ${user['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + ), + ), + ), + ); + }, + ), + ), + ], + ), + ], + )) + ], + isleading: true, + ); + } + + Container captainAdmin(CaptainAdminController captainAdminController, + String title, String jsonField) { + return Container( + height: Get.height * .1, + decoration: BoxDecoration(border: Border.all(width: 2)), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + onTap: () {}, + child: Column( + children: [ + Text( + title.tr, + style: AppStyle.title, + ), + Text( + captainAdminController.captainData['message'][0][jsonField] + .toString(), + style: AppStyle.title, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/admin/captain/captain_details.dart b/lib/views/admin/captain/captain_details.dart new file mode 100644 index 0000000..4b0b877 --- /dev/null +++ b/lib/views/admin/captain/captain_details.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../../controller/firebase/firbase_messge.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; + +class CaptainsDetailsPage extends StatelessWidget { + const CaptainsDetailsPage({super.key}); + + @override + Widget build(BuildContext context) { + final arguments = Get.arguments; + final Map data = arguments['data']; + var key = Get.find().formCaptainPrizeKey; + var titleNotify = Get.find().titleNotify; + var bodyNotify = Get.find().bodyNotify; + return MyScafolld( + title: data['first_name'] + ' ' + data['last_name'], + body: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Email is ${data['email']}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Phone is ${data['phone']}', + style: AppStyle.title, + ), + Text( + 'gender is ${data['gender']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'status is ${data['status']}', + style: AppStyle.title, + ), + Text( + 'birthdate is ${data['birthdate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'site is ${data['site']}', + style: AppStyle.title, + ), + // Text( + // 'sosPhone is ${data['sosPhone']}', + // style: AppStyle.title, + // ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Feedback is ${data['countFeedback']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate is ${data['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Cancel is ${data['countPassengerCancel']}', + style: AppStyle.title, + ), + Text( + 'Count Ride is ${data['countPassengerRide']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Rating Captain Avarage is ${data['passengerAverageRating']}', + style: AppStyle.title, + ), + Text( + 'Rating is ${data['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + Container( + decoration: BoxDecoration( + border: Border.all(width: 3, color: AppColor.yellowColor)), + child: TextButton( + onPressed: () async { + Get.defaultDialog( + title: 'Send Notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: key, + child: Column( + children: [ + MyTextForm( + controller: titleNotify, + label: 'title'.tr, + hint: 'title notificaton'.tr, + type: TextInputType.name), + const SizedBox( + height: 10, + ), + MyTextForm( + controller: bodyNotify, + label: 'body'.tr, + hint: 'body notificaton'.tr, + type: TextInputType.name) + ], + ), + ), + confirm: MyElevatedButton( + title: 'Send', + onPressed: () { + if (key.currentState!.validate()) { + FirebaseMessagesController() + .sendNotificationToAnyWithoutData( + titleNotify.text, + bodyNotify.text, + data['passengerToken'], + ); + Get.back(); + } + })); + }, + child: Text( + "Send Notificaion to Captains ".tr, + style: AppStyle.title, + ), + ), + ) + ], + ), + ) + ], + isleading: true, + ); + } +} diff --git a/lib/views/admin/captain/form_captain.dart b/lib/views/admin/captain/form_captain.dart new file mode 100644 index 0000000..8856434 --- /dev/null +++ b/lib/views/admin/captain/form_captain.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import 'captain_details.dart'; + +GetBuilder formSearchCaptain() { + // DbSql sql = DbSql.instance; + return GetBuilder( + builder: (controller) => Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Container( + decoration: + const BoxDecoration(color: AppColor.secondaryColor), + child: TextField( + decoration: InputDecoration( + border: const OutlineInputBorder( + borderRadius: BorderRadius.only(), + gapPadding: 4, + borderSide: BorderSide( + color: AppColor.redColor, + width: 2, + )), + suffixIcon: InkWell( + onTap: () async { + if (controller.captainController.text.length > 4) { + await controller.getCaptains(); + + Get.defaultDialog( + title: controller.captain['message'][0] + ['email'], + titleStyle: AppStyle.title, + content: Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Name is ${controller.captain['message'][0]['first_name']} ${controller.captain['message'][0]['last_name']}', + style: AppStyle.title, + ), + Text( + 'phone is ${controller.captain['message'][0]['phone']}', + style: AppStyle.title, + ), + ], + ), + confirm: MyElevatedButton( + title: 'Go To Details'.tr, + onPressed: () { + Get.to( + () => const CaptainsDetailsPage(), + arguments: { + 'data': controller + .captain['message'][0], + }); + })); + } + }, + child: const Icon(Icons.search)), + hintText: 'Search for Passenger'.tr, + hintStyle: AppStyle.title, + hintMaxLines: 1, + prefixIcon: IconButton( + onPressed: () async { + controller.captainController.clear(); + // controller.clearPlaces(); + }, + icon: Icon( + Icons.clear, + color: Colors.red[300], + ), + ), + ), + controller: controller.captainController, + ), + ), + ) + ], + )); +} diff --git a/lib/views/admin/passenger/form_passenger.dart b/lib/views/admin/passenger/form_passenger.dart new file mode 100644 index 0000000..886a320 --- /dev/null +++ b/lib/views/admin/passenger/form_passenger.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import 'passenger_details_page.dart'; + +GetBuilder formSearchPassengers() { + // DbSql sql = DbSql.instance; + return GetBuilder( + builder: (controller) => Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Container( + decoration: + const BoxDecoration(color: AppColor.secondaryColor), + child: TextField( + decoration: InputDecoration( + border: const OutlineInputBorder( + borderRadius: BorderRadius.only(), + gapPadding: 4, + borderSide: BorderSide( + color: AppColor.redColor, + width: 2, + )), + suffixIcon: InkWell( + onTap: () async { + if (controller.passengerController.text.length > + 4) { + await controller.getPassengers(); + + Get.defaultDialog( + title: controller.passengers['message'][0] + ['email'], + titleStyle: AppStyle.title, + content: Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Name is ${controller.passengers['message'][0]['first_name']} ${controller.passengers['message'][0]['last_name']}', + style: AppStyle.title, + ), + Text( + 'phone is ${controller.passengers['message'][0]['phone']}', + style: AppStyle.title, + ), + ], + ), + confirm: MyElevatedButton( + title: 'Go To Details'.tr, + onPressed: () { + Get.to( + () => const PassengerDetailsPage(), + arguments: { + 'data': controller + .passengers['message'][0], + }); + })); + } + }, + child: const Icon(Icons.search)), + hintText: 'Search for Passenger'.tr, + hintStyle: AppStyle.title, + hintMaxLines: 1, + prefixIcon: IconButton( + onPressed: () async { + controller.passengerController.clear(); + controller.clearPlaces(); + }, + icon: Icon( + Icons.clear, + color: Colors.red[300], + ), + ), + ), + controller: controller.passengerController, + ), + ), + ) + ], + )); +} diff --git a/lib/views/admin/passenger/passenger.dart b/lib/views/admin/passenger/passenger.dart new file mode 100644 index 0000000..9ea0951 --- /dev/null +++ b/lib/views/admin/passenger/passenger.dart @@ -0,0 +1,204 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; +import '../../widgets/mycircular.dart'; +import 'form_passenger.dart'; +import 'passenger_details_page.dart'; + +class Passengrs extends StatelessWidget { + Passengrs({super.key}); + final PassengerAdminController passengerAdminController = + Get.put(PassengerAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Passengrs'.tr, + isleading: true, + body: [ + GetBuilder( + builder: (passengerAdminController) => Column( + children: [ + passengerAdminController.isLoading + ? const MyCircularProgressIndicator() + : Column( + children: [ + Padding( + padding: const EdgeInsets.all(5), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + passengerAdmin( + passengerAdminController, + 'Passengers Count', + 'countPassenger', + ), + MyElevatedButton( + title: 'Add Prize to Gold Passengers', + onPressed: () { + var date = DateTime.now(); + var day = date.weekday; + + if (day == 6) { + // Saturday is 6 + Get.defaultDialog( + title: + 'Add Prize to Gold Passengers', + titleStyle: AppStyle.title, + content: Column( + children: [ + Text( + 'Add Points to their wallet as prize' + .tr, + style: AppStyle.title, + ), + Form( + key: + passengerAdminController + .formPrizeKey, + child: MyTextForm( + controller: + passengerAdminController + .passengerPrizeController, + label: + 'Count of prize' + .tr, + hint: 'Count of prize' + .tr, + type: TextInputType + .number)) + ], + ), + confirm: MyElevatedButton( + title: 'Add', + onPressed: () async { + if (passengerAdminController + .formPrizeKey + .currentState! + .validate()) { + passengerAdminController + .addPassengerPrizeToWalletSecure(); + } + }, + ), + ); + } else { + Get.defaultDialog( + title: + 'This day is not allowed', + titleStyle: AppStyle.title, + middleText: + 'Saturday only Allowed day', + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.back(); + })); + } + }) + ], + ), + ), + const SizedBox( + height: 10, + ), + formSearchPassengers(), + SizedBox( + height: Get.height * .5, + child: ListView.builder( + itemCount: passengerAdminController + .passengersData['message'].length, + itemBuilder: (context, index) { + final user = passengerAdminController + .passengersData['message'][index]; + + return InkWell( + onTap: () { + Get.to(const PassengerDetailsPage(), + arguments: { + 'data': user, + }); + }, + child: Padding( + padding: const EdgeInsets.all(3), + child: Container( + decoration: BoxDecoration( + border: Border.all(width: 2)), + child: ListTile( + title: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Name : ${user['first_name']} ${user['last_name']}', + style: AppStyle.title, + ), + Text( + 'Rating : ${user['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + subtitle: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Count Trip : ${user['countPassengerRide']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate : ${user['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + ), + ), + ), + ); + }, + ), + ), + ], + ), + ], + )) + ], + ); + } + + Container passengerAdmin(PassengerAdminController passengerAdminController, + String title, String jsonField) { + return Container( + height: Get.height * .1, + decoration: BoxDecoration(border: Border.all(width: 2)), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + onTap: () {}, + child: Column( + children: [ + Text( + title.tr, + style: AppStyle.title, + ), + Text( + passengerAdminController.passengersData['message'][0][jsonField] + .toString(), + style: AppStyle.title, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/admin/passenger/passenger_details_page.dart b/lib/views/admin/passenger/passenger_details_page.dart new file mode 100644 index 0000000..1140721 --- /dev/null +++ b/lib/views/admin/passenger/passenger_details_page.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../../controller/firebase/firbase_messge.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; + +class PassengerDetailsPage extends StatelessWidget { + const PassengerDetailsPage({super.key}); + + @override + Widget build(BuildContext context) { + final arguments = Get.arguments; + final Map data = arguments['data']; + var key = Get.find().formPrizeKey; + var titleNotify = Get.find().titleNotify; + var bodyNotify = Get.find().bodyNotify; + return MyScafolld( + title: data['first_name'], + body: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Email is ${data['email']}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Phone is ${data['phone']}', + style: AppStyle.title, + ), + Text( + 'gender is ${data['gender']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'status is ${data['status']}', + style: AppStyle.title, + ), + Text( + 'birthdate is ${data['birthdate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'site is ${data['site']}', + style: AppStyle.title, + ), + Text( + 'sosPhone is ${data['sosPhone']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Feedback is ${data['countFeedback']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate is ${data['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Cancel is ${data['countPassengerCancel']}', + style: AppStyle.title, + ), + Text( + 'Count Ride is ${data['countPassengerRide']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Rating Captain Avarage is ${data['passengerAverageRating']}', + style: AppStyle.title, + ), + Text( + 'Rating is ${data['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + Container( + decoration: BoxDecoration( + border: Border.all(width: 3, color: AppColor.yellowColor)), + child: TextButton( + onPressed: () async { + Get.defaultDialog( + title: 'Send Notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: key, + child: Column( + children: [ + MyTextForm( + controller: titleNotify, + label: 'title'.tr, + hint: 'title notificaton'.tr, + type: TextInputType.name), + const SizedBox( + height: 10, + ), + MyTextForm( + controller: bodyNotify, + label: 'body'.tr, + hint: 'body notificaton'.tr, + type: TextInputType.name) + ], + ), + ), + confirm: MyElevatedButton( + title: 'Send', + onPressed: () { + if (key.currentState!.validate()) { + FirebaseMessagesController() + .sendNotificationToAnyWithoutData( + titleNotify.text, + bodyNotify.text, + data['passengerToken'], + ); + Get.back(); + } + })); + }, + child: Text( + "Send Notificaion to Passenger ".tr, + style: AppStyle.title, + ), + ), + ) + ], + ), + ) + ], + isleading: true, + ); + } +} diff --git a/lib/views/admin/rides/rides.dart b/lib/views/admin/rides/rides.dart new file mode 100644 index 0000000..2ef76da --- /dev/null +++ b/lib/views/admin/rides/rides.dart @@ -0,0 +1,236 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/ride_admin_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/mycircular.dart'; + +class Rides extends StatelessWidget { + Rides({super.key}); + RideAdminController rideAdminController = Get.put(RideAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld(title: 'Rides'.tr, isleading: true, body: [ + GetBuilder( + builder: (rideAdminController) => rideAdminController.isLoading + ? const Center(child: MyCircularProgressIndicator()) + : Column( + children: [ + SizedBox( + height: Get.height * .4, + child: LineChart( + duration: const Duration(milliseconds: 150), + curve: Curves.ease, + LineChartData( + lineBarsData: [ + LineChartBarData( + spots: rideAdminController.chartData, + isCurved: true, + color: Colors.deepPurpleAccent, // Custom color + barWidth: 3, // Thinner line + dotData: const FlDotData( + show: true), // Show dots on each point + belowBarData: BarAreaData( + // Add gradient fill below the line + show: true, + color: AppColor.deepPurpleAccent, + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: AppColor.yellowColor, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Text( + 'Days', + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total Trips on month'.tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Trips on month'.tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + ), + gridData: const FlGridData( + show: true, + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide(color: AppColor.accentColor), + left: BorderSide(color: AppColor.accentColor), + ), + ), + ), + ), + ), + // SizedBox( + // height: Get.height * .4, + // child: PieChart( + // PieChartData( + // sectionsSpace: 4, // Adjust spacing between sections + // centerSpaceRadius: + // 40, // Adjust radius of center space + // sections: [ + // for (final rideData in rideAdminController.rideData) + // PieChartSectionData( + // value: rideData.ridesCount.toDouble(), + // title: '${rideData.day}', showTitle: true, + // titleStyle: + // AppStyle.subtitle, // Display day as title + // radius: 60, // Adjust radius of each section + // color: + // AppColor.deepPurpleAccent, // Custom color + // ), + // ], + // ), + // ), + // ), + + // SizedBox( + // // height: 400, + // child: SfCartesianChart( + // legend: const Legend( + // isVisible: true, + // position: LegendPosition.bottom, + // overflowMode: LegendItemOverflowMode.wrap, + // textStyle: TextStyle( + // color: Colors.white, + // fontSize: 12, + // fontWeight: FontWeight.bold, + // ), + // ), + // borderWidth: 2, + // borderColor: AppColor.blueColor, + // plotAreaBorderColor: AppColor.deepPurpleAccent, + // enableAxisAnimation: true, + // primaryXAxis: CategoryAxis( + // borderColor: AppColor.accentColor, borderWidth: 2, + // title: AxisTitle( + // text: 'Total Trips on month'.tr, + // textStyle: AppStyle.title, + // ), + // // labelRotation: 45, + // majorGridLines: const MajorGridLines(width: 0), + // ), + // primaryYAxis: const NumericAxis(isVisible: false), + // series: >[ + // LineSeries( + // dataSource: rideAdminController.chartDatasync, + // xValueMapper: (ChartDataS data, _) => '${data.day}', + // yValueMapper: (ChartDataS data, _) => + // data.ridesCount, + // dataLabelSettings: + // const DataLabelSettings(isVisible: true), + // ), + // ], + // ), + // ), + + const SizedBox( + height: 20, + ), + Card( + elevation: 4, + color: AppColor.deepPurpleAccent, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Total Trips on this Month is ${rideAdminController.jsonResponse['message'][0]['current_month_rides_count']}', + style: AppStyle.title, + ), + ), + ), + const SizedBox( + height: 20, + ), + Card( + elevation: 4, + color: AppColor.yellowColor, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Driver Average Duration: ${rideAdminController.ridesDetails[0]['driver_avg_duration']}', + style: AppStyle.subtitle, + ), + Text( + 'Number of Drivers: ${rideAdminController.ridesDetails[0]['num_Driver']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Rides: ${rideAdminController.ridesDetails[0]['total_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Ongoing Rides: ${rideAdminController.ridesDetails[0]['ongoing_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Completed Rides: ${rideAdminController.ridesDetails[0]['completed_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Cancelled Rides: ${rideAdminController.ridesDetails[0]['cancelled_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Longest Duration: ${rideAdminController.ridesDetails[0]['longest_duration']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Distance: ${rideAdminController.ridesDetails[0]['total_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Average Distance: ${rideAdminController.ridesDetails[0]['average_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Longest Distance: ${rideAdminController.ridesDetails[0]['longest_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Total Driver Earnings: \$${rideAdminController.ridesDetails[0]['total_driver_earnings']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Company Earnings: \$${rideAdminController.ridesDetails[0]['total_company_earnings']}', + style: AppStyle.subtitle, + ), + Text( + 'Company Percentage: ${rideAdminController.ridesDetails[0]['companyPercent']} %', + style: AppStyle.subtitle, + ), + ], + ), + ), + ) + ], + )) + ]); + } +} diff --git a/lib/views/admin/static/static.dart b/lib/views/admin/static/static.dart new file mode 100644 index 0000000..6578c79 --- /dev/null +++ b/lib/views/admin/static/static.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../widgets/my_scafold.dart'; + +class StaticDash extends StatelessWidget { + const StaticDash({super.key}); + + @override + Widget build(BuildContext context) { + return MyScafolld(title: 'Static Dash'.tr, body: [], isleading: true); + } +} diff --git a/lib/views/admin/wallet/wallet.dart b/lib/views/admin/wallet/wallet.dart new file mode 100644 index 0000000..ca46975 --- /dev/null +++ b/lib/views/admin/wallet/wallet.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/style.dart'; +import 'package:sefer_admin1/views/widgets/elevated_btn.dart'; +import 'package:sefer_admin1/views/widgets/mycircular.dart'; + +import '../../../controller/admin/wallet_admin_controller.dart'; +import '../../widgets/my_scafold.dart'; + +class Wallet extends StatelessWidget { + Wallet({super.key}); + WalletAdminController walletAdminController = + Get.put(WalletAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Wallet'.tr, + body: [ + GetBuilder(builder: (walletAdminController) { + return Center( + child: walletAdminController.isLoading + ? const MyCircularProgressIndicator() + : Column( + children: [ + MyElevatedButton( + title: 'Pay to them to banks'.tr, + onPressed: () async { + await walletAdminController.payToBankDriverAll(); + }), + SizedBox( + height: Get.height * .8, + child: ListView.builder( + itemCount: + walletAdminController.driversWalletPoints.length, + itemBuilder: (BuildContext context, int index) { + var res = walletAdminController + .driversWalletPoints[index]; + + if (res != null && res['name_arabic'] != null) { + return Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'driver name: ${res['name_arabic'].toString()}'), + Text( + 'Amount: ${res['total_amount'].toString()}'), + ], + ), + ), + ), + ); + } else { + return Container(); // Return an empty container if the data is null + } + }, + ), + ) + ], + ), + ); + }) + ], + isleading: true, + action: IconButton( + onPressed: () async { + walletAdminController.getWalletForEachDriverToPay(); + }, + icon: const Icon( + Icons.refresh, + color: Colors.black, + ), + ), + ); + } +} diff --git a/lib/views/widgets/circle_container.dart b/lib/views/widgets/circle_container.dart new file mode 100644 index 0000000..9702b34 --- /dev/null +++ b/lib/views/widgets/circle_container.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class MyCircleContainer extends StatelessWidget { + final Widget child; + final Color backgroundColor; + final Color borderColor; + + MyCircleContainer({ + Key? key, + required this.child, + this.backgroundColor = AppColor.secondaryColor, + this.borderColor = AppColor.accentColor, + }) : super(key: key); + + final controller = Get.put(CircleController()); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: ((controller) => GestureDetector( + onTap: () { + controller.changeColor(); + }, + child: AnimatedContainer( + onEnd: () { + controller.onEnd(); + }, + duration: const Duration(milliseconds: 300), + width: controller.size, + height: controller.size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: controller.backgroundColor, + border: Border.all( + color: borderColor, + width: 1, + ), + ), + child: Center(child: child), + ), + ))); + } +} + +class CircleController extends GetxController { + Color backgroundColor = AppColor.secondaryColor; + double size = 40; + void changeColor() { + backgroundColor = backgroundColor == AppColor.secondaryColor + ? AppColor.accentColor + : AppColor.secondaryColor; + size = 60; + update(); + } + + void onEnd() { + size = 40; + update(); + } +} diff --git a/lib/views/widgets/elevated_btn.dart b/lib/views/widgets/elevated_btn.dart new file mode 100644 index 0000000..8ca37b5 --- /dev/null +++ b/lib/views/widgets/elevated_btn.dart @@ -0,0 +1,47 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyElevatedButton extends StatelessWidget { + final String title; + final VoidCallback onPressed; + final Color kolor; + final int vibrateDuration; + const MyElevatedButton({ + Key? key, + required this.title, + required this.onPressed, + this.kolor = AppColor.primaryColor, + this.vibrateDuration = 100, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(kolor), + ), + onPressed: () async { + // Handle haptic feedback for both iOS and Android + if (Platform.isIOS) { + HapticFeedback.selectionClick(); + } else { + // Vibration.vibrate(duration: 100); + // Vibrate.vibrateWithPauses(pauses); + } + + // Ensure the onPressed callback is called after haptic feedback + onPressed(); + }, + child: Text( + title, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith(color: AppColor.secondaryColor), + ), + ); + } +} diff --git a/lib/views/widgets/icon_widget_menu.dart b/lib/views/widgets/icon_widget_menu.dart new file mode 100644 index 0000000..604aa40 --- /dev/null +++ b/lib/views/widgets/icon_widget_menu.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class IconWidgetMenu extends StatelessWidget { + const IconWidgetMenu({ + Key? key, + required this.onpressed, + required this.icon, + required this.title, + }) : super(key: key); + + final VoidCallback onpressed; + final IconData icon; + final String title; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onpressed, + child: Padding( + padding: const EdgeInsets.only(top: 25), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 50, + decoration: const BoxDecoration( + color: AppColor.secondaryColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.secondaryColor, + offset: Offset(-2, -2), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + ], + ), + child: Center( + child: Icon( + icon, + size: 30, + color: AppColor.primaryColor, + ), + ), + ), + Text( + title, + style: AppStyle.subtitle, + ) + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/my_scafold.dart b/lib/views/widgets/my_scafold.dart new file mode 100644 index 0000000..fe50446 --- /dev/null +++ b/lib/views/widgets/my_scafold.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyScafolld extends StatelessWidget { + const MyScafolld({ + super.key, + required this.title, + required this.body, + this.action = const Icon( + Icons.clear, + color: AppColor.secondaryColor, + ), + required this.isleading, + }); + + final String title; + final List body; + final Widget action; + final bool isleading; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor, + appBar: AppBar( + backgroundColor: AppColor.secondaryColor, + elevation: 0, + leading: isleading + ? IconButton( + onPressed: () { + Get.back(); + }, + icon: const Icon( + Icons.arrow_back_ios_new, + color: AppColor.primaryColor, + ), + ) + : const SizedBox(), + actions: [action], + title: Text( + title, + style: AppStyle.title.copyWith(fontSize: 30), + ), + ), + body: SafeArea(child: Stack(children: body))); + } +} diff --git a/lib/views/widgets/my_textField.dart b/lib/views/widgets/my_textField.dart new file mode 100644 index 0000000..54f2bf0 --- /dev/null +++ b/lib/views/widgets/my_textField.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import '../../constant/colors.dart'; + +class MyTextForm extends StatelessWidget { + const MyTextForm({ + super.key, + required this.controller, + required this.label, + required this.hint, + required this.type, + }); + final TextEditingController controller; + final String label, hint; + final TextInputType type; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: SizedBox( + width: Get.width * .8, + child: TextFormField( + keyboardType: type, + cursorColor: AppColor.accentColor, + controller: controller, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(12))), + labelText: label.tr, + hintText: hint.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter $label.'.tr; + } + + if (type == TextInputType.emailAddress) { + if (!value.contains('@')) { + return 'Please enter a valid email.'.tr; + } + } else if (type == TextInputType.phone) { + if (value.length != 10) { + return 'Please enter a valid phone number.'.tr; + } + } + + return null; + }, + ), + ), + ); + } +} diff --git a/lib/views/widgets/mycircular.dart b/lib/views/widgets/mycircular.dart new file mode 100644 index 0000000..366d81a --- /dev/null +++ b/lib/views/widgets/mycircular.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class MyCircularProgressIndicator extends StatelessWidget { + final Color backgroundColor; + + const MyCircularProgressIndicator({ + super.key, + this.backgroundColor = Colors.transparent, + }); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + width: 110, + height: 110, + decoration: BoxDecoration( + color: backgroundColor, + shape: BoxShape.circle, + ), + child: Stack( + children: [ + const Center(child: CircularProgressIndicator()), + Column( + children: [ + Align( + alignment: Alignment.center, + child: Image.asset('assets/images/logo.png'), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt new file mode 100644 index 0000000..c69d6ce --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "sefer_admin1") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.sefer_admin1") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..38dd0bc --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..65240e9 --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + flutter_secure_storage_linux + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/linux/main.cc b/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/my_application.cc b/linux/my_application.cc new file mode 100644 index 0000000..4480642 --- /dev/null +++ b/linux/my_application.cc @@ -0,0 +1,124 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "sefer_admin1"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "sefer_admin1"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/linux/my_application.h b/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/macos/.gitignore b/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..d17c3a1 --- /dev/null +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,26 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import firebase_core +import firebase_messaging +import flutter_secure_storage_macos +import google_sign_in_ios +import location +import path_provider_foundation +import sqflite +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 0000000..c795730 --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5e4052c --- /dev/null +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* sefer_admin1.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "sefer_admin1.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* sefer_admin1.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* sefer_admin1.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sefer_admin1.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sefer_admin1"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sefer_admin1.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sefer_admin1"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sefer_admin1.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sefer_admin1"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..dcc9887 --- /dev/null +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..d53ef64 --- /dev/null +++ b/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..1c22b12 --- /dev/null +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = sefer_admin1 + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.seferAdmin1 + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..5418c9f --- /dev/null +++ b/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import FlutterMacOS +import Cocoa +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..143ca34 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1138 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "37a42d06068e2fe3deddb2da079a8c4d105f241225ba27b7122b37e9865fd8f7" + url: "https://pub.dev" + source: hosted + version: "1.3.35" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" + url: "https://pub.dev" + source: hosted + version: "2.4.9" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + url: "https://pub.dev" + source: hosted + version: "8.9.2" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" + source: hosted + version: "0.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + url: "https://pub.dev" + source: hosted + version: "2.3.6" + dio: + dependency: "direct main" + description: + name: dio + sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" + url: "https://pub.dev" + source: hosted + version: "5.4.3+1" + envied: + dependency: "direct main" + description: + name: envied + sha256: bbff9c76120e4dc5e2e36a46690cf0a26feb65e7765633f4e8d916bcd173a450 + url: "https://pub.dev" + source: hosted + version: "0.5.4+1" + envied_generator: + dependency: "direct dev" + description: + name: envied_generator + sha256: "517b70de08d13dcd40e97b4e5347e216a0b1c75c99e704f3c85c0474a392d14a" + url: "https://pub.dev" + source: hosted + version: "0.5.4+1" + equatable: + dependency: transitive + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "26de145bb9688a90962faec6f838247377b0b0d32cc0abecd9a4e43525fc856c" + url: "https://pub.dev" + source: hosted + version: "2.32.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "1003a5a03a61fc9a22ef49f37cbcb9e46c86313a7b2e7029b9390cf8c6fc32cb" + url: "https://pub.dev" + source: hosted + version: "5.1.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "6643fe3dbd021e6ccfb751f7882b39df355708afbdeb4130fc50f9305a9d1a3d" + url: "https://pub.dev" + source: hosted + version: "2.17.2" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: a1662cc95d9750a324ad9df349b873360af6f11414902021f130c68ec02267c4 + url: "https://pub.dev" + source: hosted + version: "14.9.4" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "87c4a922cb6f811cfb7a889bdbb3622702443c52a0271636cbc90d813ceac147" + url: "https://pub.dev" + source: hosted + version: "4.5.37" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "0d34dca01a7b103ed7f20138bffbb28eb0e61a677bf9e78a028a932e2c7322d5" + url: "https://pub.dev" + source: hosted + version: "3.8.7" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + sha256: "2b7c1f5d867da9a054661641c8f499c55c47c39acccb97b3bc673f5fa9a39e74" + url: "https://pub.dev" + source: hosted + version: "0.67.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + url: "https://pub.dev" + source: hosted + version: "0.13.1" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_paypal: + dependency: "direct main" + description: + name: flutter_paypal + sha256: "783d52ca84528b4b7a1213db5195e6946a2d27b2192f4fcd6d0b04b8c37e359e" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" + url: "https://pub.dev" + source: hosted + version: "2.0.19" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" + url: "https://pub.dev" + source: hosted + version: "9.2.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_spinkit: + dependency: transitive + description: + name: flutter_spinkit + sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 + url: "https://pub.dev" + source: hosted + version: "5.2.1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: e4e7335ede17452b391ed3b2ede016545706c01a02292a6c97619705e7d2a85e + url: "https://pub.dev" + source: hosted + version: "4.6.6" + get_storage: + dependency: "direct main" + description: + name: get_storage + sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6" + url: "https://pub.dev" + source: hosted + version: "4.0.4" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "9482364c9f8b7bd36902572ebc3a7c2b5c8ee57a9c93e6eb5099c1a9ec5265d8" + url: "https://pub.dev" + source: hosted + version: "0.3.1+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: "0b8787cb9c1a68ad398e8010e8c8766bfa33556d2ab97c439fb4137756d7308f" + url: "https://pub.dev" + source: hosted + version: "6.2.1" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: "7647893c65e6720973f0e579051c8f84b877b486614d9f70a404259c41a4632e" + url: "https://pub.dev" + source: hosted + version: "6.1.23" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: a058c9880be456f21e2e8571c1126eaacd570bdc5b6c6d9d15aea4bdf22ca9fe + url: "https://pub.dev" + source: hosted + version: "5.7.6" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "1f6e5787d7a120cc0359ddf315c92309069171306242e181c09472d1b00a2971" + url: "https://pub.dev" + source: hosted + version: "2.4.5" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: d606264c7a1a526a3aa79d938b85a601d8589731a478bd4a3dcbdeb14a572228 + url: "https://pub.dev" + source: hosted + version: "0.12.4+1" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + http: + dependency: "direct main" + description: + name: http + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.dev" + source: hosted + version: "0.13.6" + http_auth: + dependency: transitive + description: + name: http_auth + sha256: b7625acba2987fa69140d9600c679819f33227d665f525fbb2f394e08cf917d1 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: "280421b416b32de31405b0a25c3bd42dfcef2538dfbb20c03019e02a5ed55ed0" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: e0e5b1ea247c5a0951c13a7ee13dc1beae69750e6a2e1910d1ed6a3cd4d56943 + url: "https://pub.dev" + source: hosted + version: "1.0.38" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: e424ebf90d5233452be146d4a7da4bcd7a70278b67791592f3fde1bda8eef9e2 + url: "https://pub.dev" + source: hosted + version: "1.3.1" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: "505ba3367ca781efb1c50d3132e44a2446bccc4163427bc203b9b4d8994d97ea" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + location: + dependency: "direct main" + description: + name: location + sha256: "37ffdadcd4b1498b769824f45ebb4de8ed46663a4a67ac27b33a590ee486579f" + url: "https://pub.dev" + source: hosted + version: "6.0.2" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: "2ecde6bb0f88032b0bbbde37e18975b4468711dd92619c2235cc0c0ee93b4b8e" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + location_web: + dependency: transitive + description: + name: location_web + sha256: "15ad7b4c8a9f55abee513373755e093a40c04d7e24fc1b4f89676fe99523d034" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: "direct main" + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + url: "https://pub.dev" + source: hosted + version: "2.2.4" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d + url: "https://pub.dev" + source: hosted + version: "2.3.3+1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + url: "https://pub.dev" + source: hosted + version: "13.0.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + url: "https://pub.dev" + source: hosted + version: "2.4.5" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" + url: "https://pub.dev" + source: hosted + version: "4.8.0" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: "0d21cfc3bfdd2e30ab2ebeced66512b91134b39e72e97b43db2d47dda1c4e53a" + url: "https://pub.dev" + source: hosted + version: "3.16.3" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d + url: "https://pub.dev" + source: hosted + version: "2.10.0" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0" + url: "https://pub.dev" + source: hosted + version: "3.13.1" + win32: + dependency: transitive + description: + name: win32 + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" + url: "https://pub.dev" + source: hosted + version: "5.5.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.3.2 <4.0.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..2c95c4a --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,91 @@ +name: sefer_admin1 +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ">=3.3.2 <4.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + # agora_rtc_engine: ^6.3.0 + # device_info_plus: ^10.1.0 + dio: ^5.4.3+1 + envied: ^0.5.4+1 + firebase_core: ^2.30.1 + firebase_messaging: ^14.9.1 + fl_chart: ^0.67.0 + flutter: + sdk: flutter + flutter_launcher_icons: ^0.13.1 + # flutter_local_notifications: ^17.1.1 + flutter_paypal: ^0.2.0 + flutter_secure_storage: ^9.0.0 +# flutter_stripe: ^10.1.1 + get: ^4.6.6 + get_storage: ^2.1.1 + google_fonts: ^4.0.4 + # google_maps_flutter: ^2.6.1 + google_sign_in: ^6.2.1 + http: ^0.13.6 + # image: ^4.1.7 + # image_cropper: ^4.0.1 + # image_picker: ^1.1.1 + intl: ^0.19.0 + local_auth: ^2.2.0 + location: ^6.0.1 + path: ^1.9.0 + sqflite: ^2.3.3+1 + url_launcher: ^6.2.6 + webview_flutter: ^4.7.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^ 3.0.1 + envied_generator: ^0.5.2 + build_runner: ^2.4.6 + +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/images/logo.png" + min_sdk_android: 21 + web: + generate: true + image_path: "assets/images/logo.png" + background_color: "#hexcode" + theme_color: "#hexcode" + windows: + generate: true + image_path: "assets/images/logo.png" + icon_size: 48 + macos: + generate: true + image_path: "assets/images/logo.png" + +flutter: + uses-material-design: true + assets: + - assets/ + - assets/images/ diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..37961b4 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:sefer_admin1/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MainApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..9b142b5 --- /dev/null +++ b/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + sefer_admin1 + + + + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..363aad1 --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "sefer_admin1", + "short_name": "sefer_admin1", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 0000000..e7a47b5 --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(sefer_admin1 LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "sefer_admin1") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..028ccd2 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + LocalAuthPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalAuthPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..5df1253 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,27 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + firebase_core + flutter_secure_storage_windows + local_auth_windows + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 0000000..e1fa16d --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "sefer_admin1" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "sefer_admin1" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "sefer_admin1.exe" "\0" + VALUE "ProductName", "sefer_admin1" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 0000000..ee789a8 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"sefer_admin1", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..a42ea76 --- /dev/null +++ b/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 0000000..b2b0873 --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_