From 2e27d592786c05f5083bc3aecdca9bc09d6adc39 Mon Sep 17 00:00:00 2001 From: anhtunz Date: Sun, 15 Dec 2024 00:59:02 +0700 Subject: [PATCH] Complete refactoring SFM App Source Code --- .gitignore | 44 + .metadata | 45 + analysis_options.yaml | 29 + android/.gitignore | 13 + android/app/build.gradle | 84 ++ android/app/google-services.json | 29 + android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 76 ++ .../com/example/sfm_app/MainActivity.kt | 6 + .../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 .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/raw/warning_alarm.mp3 | Bin 0 -> 321120 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 | 34 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle | 11 + assets/icons/en_icon.png | Bin 0 -> 19575 bytes assets/icons/fire_station_marker.png | Bin 0 -> 16115 bytes assets/icons/flame_icon.png | Bin 0 -> 9133 bytes assets/icons/hospital_marker.png | Bin 0 -> 8508 bytes assets/icons/normal_icon.png | Bin 0 -> 18883 bytes assets/icons/offline_icon.png | Bin 0 -> 18918 bytes assets/icons/vi_icon.png | Bin 0 -> 17434 bytes assets/images/background_bottom.png | Bin 0 -> 5682 bytes assets/images/background_top.png | Bin 0 -> 35863 bytes assets/images/error_page.png | Bin 0 -> 360766 bytes assets/images/fire_warning.png | Bin 0 -> 14725 bytes assets/images/logo.png | Bin 0 -> 19469 bytes assets/images/low_battery.png | Bin 0 -> 3942 bytes firebase.json | 1 + ios/.gitignore | 34 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Podfile | 68 ++ ios/Runner.xcodeproj/project.pbxproj | 613 ++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 25 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 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/Info.plist | 70 ++ ios/Runner/Runner-Bridging-Header.h | 1 + ios/RunnerTests/RunnerTests.swift | 12 + l10n.yaml | 4 + lib/feature/auth/login/bloc/login_bloc.dart | 18 + lib/feature/auth/login/model/login_model.dart | 17 + .../auth/login/screen/login_screen.dart | 234 +++++ lib/feature/bell/bell_bloc.dart | 22 + lib/feature/bell/bell_model.dart | 75 ++ lib/feature/bell/bell_screen.dart | 253 +++++ .../devices/add_new_device_widget.dart | 97 ++ lib/feature/devices/delete_device_widget.dart | 61 ++ .../device_detail/device_detail_bloc.dart | 79 ++ .../device_detail/device_detail_screen.dart | 361 +++++++ lib/feature/devices/device_model.dart | 171 ++++ .../device_update/device_update_bloc.dart | 255 +++++ .../device_update/device_update_screen.dart | 515 ++++++++++ .../devices/device_update/geocode_model.dart | 47 + .../devices/device_update/map_dialog.dart | 298 ++++++ lib/feature/devices/devices_manager_bloc.dart | 35 + .../devices/devices_manager_screen.dart | 274 ++++++ lib/feature/error/not_found_screen.dart | 36 + lib/feature/home/device_alias_model.dart | 79 ++ lib/feature/home/home_bloc.dart | 92 ++ lib/feature/home/home_screen.dart | 411 ++++++++ lib/feature/home/shared/alert_card.dart | 130 +++ lib/feature/home/shared/overview_card.dart | 77 ++ lib/feature/home/shared/status_card.dart | 42 + lib/feature/home/shared/warning_card.dart | 248 +++++ .../add_device_to_group_dialog.dart | 134 +++ .../group_detail/group_detail_bloc.dart | 118 +++ .../group_detail/group_detail_model.dart | 133 +++ .../group_detail/group_detail_screen.dart | 552 +++++++++++ .../inter_family/groups/groups_model.dart | 46 + .../inter_family/groups/groups_screen.dart | 161 +++ .../inter_family/groups/groups_widget.dart | 95 ++ .../inter_family/inter_family_bloc.dart | 119 +++ .../inter_family/inter_family_screen.dart | 163 ++++ .../inter_family/inter_family_widget.dart | 152 +++ lib/feature/log/device_logs_bloc.dart | 82 ++ lib/feature/log/device_logs_model.dart | 66 ++ lib/feature/log/device_logs_screen.dart | 295 ++++++ lib/feature/main/main_bloc.dart | 39 + lib/feature/main/main_screen.dart | 393 ++++++++ lib/feature/map/map_bloc.dart | 74 ++ lib/feature/map/map_screen.dart | 237 +++++ .../map/widget/on_tap_marker_widget.dart | 344 +++++++ .../map/widget/show_direction_widget.dart | 124 +++ .../map/widget/show_nearest_place.dart | 226 +++++ .../device_notification_settings_bloc.dart | 42 + .../device_notification_settings_model.dart | 56 ++ .../device_notification_settings_screen.dart | 313 ++++++ .../settings/profile/profile_model.dart | 37 + .../settings/profile/profile_screen.dart | 440 +++++++++ lib/feature/settings/settings_bloc.dart | 25 + lib/feature/settings/settings_screen.dart | 153 +++ lib/firebase_options.dart | 86 ++ lib/main.dart | 80 ++ lib/product/base/bloc/base_bloc.dart | 72 ++ lib/product/base/screen/base_screen.dart | 142 +++ .../dialog/request_permission_dialog.dart | 61 ++ lib/product/cache/local_manager.dart | 42 + .../constant/app/api_path_constant.dart | 24 + lib/product/constant/app/app_constants.dart | 21 + .../constant/enums/app_route_enums.dart | 16 + .../constant/enums/app_theme_enums.dart | 3 + .../constant/enums/local_keys_enums.dart | 10 + lib/product/constant/enums/role_enums.dart | 7 + lib/product/constant/icon/icon_constants.dart | 13 + .../constant/image/image_constants.dart | 9 + .../constant/lang/language_constants.dart | 6 + .../navigation/navigation_router.dart | 156 +++ .../status_code/status_code_constants.dart | 7 + lib/product/extention/context_extention.dart | 103 ++ lib/product/lang/l10n/app_en.arb | 242 +++++ lib/product/lang/l10n/app_vi.arb | 242 +++++ lib/product/lang/language_model.dart | 18 + lib/product/network/network_manager.dart | 114 +++ .../permission/notification_permission.dart | 31 + lib/product/services/api_services.dart | 386 ++++++++ lib/product/services/language_services.dart | 36 + lib/product/services/map_services.dart | 63 ++ .../services/notification_services.dart | 103 ++ .../error/dio_handle_error.dart | 137 +++ .../error/error_response_model.dart | 19 + .../model/place_detail_model.dart | 234 +++++ .../model/prediction_model.dart | 157 +++ .../shared_map_search_location.dart | 313 ++++++ lib/product/shared/model/district_model.dart | 43 + .../shared/model/near_by_search_model.dart | 172 ++++ lib/product/shared/model/province_model.dart | 42 + lib/product/shared/model/ward_model.dart | 43 + lib/product/shared/shared_background.dart | 44 + .../shared/shared_input_decoration.dart | 18 + lib/product/shared/shared_snack_bar.dart | 56 ++ lib/product/shared/shared_transition.dart | 137 +++ lib/product/theme/app_theme.dart | 5 + lib/product/theme/app_theme_dark.dart | 53 + lib/product/theme/app_theme_light.dart | 54 + lib/product/theme/provider/app_provider.dart | 23 + lib/product/theme/theme_notifier.dart | 104 ++ lib/product/utils/date_time_utils.dart | 16 + lib/product/utils/device_utils.dart | 269 +++++ lib/product/utils/qr_utils.dart | 34 + lib/product/utils/response_status_utils.dart | 23 + lib/product/utils/string_utils.dart | 32 + linux/.gitignore | 1 + linux/CMakeLists.txt | 139 +++ 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 | 104 ++ linux/my_application.h | 18 + macos/.gitignore | 7 + macos/Flutter/Flutter-Debug.xcconfig | 1 + macos/Flutter/Flutter-Release.xcconfig | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 24 + macos/Runner.xcodeproj/project.pbxproj | 695 +++++++++++++ .../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 | 919 ++++++++++++++++++ pubspec.yaml | 114 +++ sfmTranslateErrors.txt | 1 + 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 | 102 ++ windows/flutter/CMakeLists.txt | 104 ++ .../flutter/generated_plugin_registrant.cc | 26 + windows/flutter/generated_plugin_registrant.h | 15 + windows/flutter/generated_plugins.cmake | 28 + windows/runner/CMakeLists.txt | 40 + windows/runner/Runner.rc | 121 +++ windows/runner/flutter_window.cpp | 66 ++ 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 ++ 247 files changed, 18390 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata 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/sfm_app/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-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/raw/warning_alarm.mp3 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/icons/en_icon.png create mode 100644 assets/icons/fire_station_marker.png create mode 100644 assets/icons/flame_icon.png create mode 100644 assets/icons/hospital_marker.png create mode 100644 assets/icons/normal_icon.png create mode 100644 assets/icons/offline_icon.png create mode 100644 assets/icons/vi_icon.png create mode 100644 assets/images/background_bottom.png create mode 100644 assets/images/background_top.png create mode 100644 assets/images/error_page.png create mode 100644 assets/images/fire_warning.png create mode 100644 assets/images/logo.png create mode 100644 assets/images/low_battery.png 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/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-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-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/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/RunnerTests/RunnerTests.swift create mode 100644 l10n.yaml create mode 100644 lib/feature/auth/login/bloc/login_bloc.dart create mode 100644 lib/feature/auth/login/model/login_model.dart create mode 100644 lib/feature/auth/login/screen/login_screen.dart create mode 100644 lib/feature/bell/bell_bloc.dart create mode 100644 lib/feature/bell/bell_model.dart create mode 100644 lib/feature/bell/bell_screen.dart create mode 100644 lib/feature/devices/add_new_device_widget.dart create mode 100644 lib/feature/devices/delete_device_widget.dart create mode 100644 lib/feature/devices/device_detail/device_detail_bloc.dart create mode 100644 lib/feature/devices/device_detail/device_detail_screen.dart create mode 100644 lib/feature/devices/device_model.dart create mode 100644 lib/feature/devices/device_update/device_update_bloc.dart create mode 100644 lib/feature/devices/device_update/device_update_screen.dart create mode 100644 lib/feature/devices/device_update/geocode_model.dart create mode 100644 lib/feature/devices/device_update/map_dialog.dart create mode 100644 lib/feature/devices/devices_manager_bloc.dart create mode 100644 lib/feature/devices/devices_manager_screen.dart create mode 100644 lib/feature/error/not_found_screen.dart create mode 100644 lib/feature/home/device_alias_model.dart create mode 100644 lib/feature/home/home_bloc.dart create mode 100644 lib/feature/home/home_screen.dart create mode 100644 lib/feature/home/shared/alert_card.dart create mode 100644 lib/feature/home/shared/overview_card.dart create mode 100644 lib/feature/home/shared/status_card.dart create mode 100644 lib/feature/home/shared/warning_card.dart create mode 100644 lib/feature/inter_family/group_detail/add_device_to_group_dialog.dart create mode 100644 lib/feature/inter_family/group_detail/group_detail_bloc.dart create mode 100644 lib/feature/inter_family/group_detail/group_detail_model.dart create mode 100644 lib/feature/inter_family/group_detail/group_detail_screen.dart create mode 100644 lib/feature/inter_family/groups/groups_model.dart create mode 100644 lib/feature/inter_family/groups/groups_screen.dart create mode 100644 lib/feature/inter_family/groups/groups_widget.dart create mode 100644 lib/feature/inter_family/inter_family_bloc.dart create mode 100644 lib/feature/inter_family/inter_family_screen.dart create mode 100644 lib/feature/inter_family/inter_family_widget.dart create mode 100644 lib/feature/log/device_logs_bloc.dart create mode 100644 lib/feature/log/device_logs_model.dart create mode 100644 lib/feature/log/device_logs_screen.dart create mode 100644 lib/feature/main/main_bloc.dart create mode 100644 lib/feature/main/main_screen.dart create mode 100644 lib/feature/map/map_bloc.dart create mode 100644 lib/feature/map/map_screen.dart create mode 100644 lib/feature/map/widget/on_tap_marker_widget.dart create mode 100644 lib/feature/map/widget/show_direction_widget.dart create mode 100644 lib/feature/map/widget/show_nearest_place.dart create mode 100644 lib/feature/settings/device_notification_settings/device_notification_settings_bloc.dart create mode 100644 lib/feature/settings/device_notification_settings/device_notification_settings_model.dart create mode 100644 lib/feature/settings/device_notification_settings/device_notification_settings_screen.dart create mode 100644 lib/feature/settings/profile/profile_model.dart create mode 100644 lib/feature/settings/profile/profile_screen.dart create mode 100644 lib/feature/settings/settings_bloc.dart create mode 100644 lib/feature/settings/settings_screen.dart create mode 100644 lib/firebase_options.dart create mode 100644 lib/main.dart create mode 100644 lib/product/base/bloc/base_bloc.dart create mode 100644 lib/product/base/screen/base_screen.dart create mode 100644 lib/product/base/widget/dialog/request_permission_dialog.dart create mode 100644 lib/product/cache/local_manager.dart create mode 100644 lib/product/constant/app/api_path_constant.dart create mode 100644 lib/product/constant/app/app_constants.dart create mode 100644 lib/product/constant/enums/app_route_enums.dart create mode 100644 lib/product/constant/enums/app_theme_enums.dart create mode 100644 lib/product/constant/enums/local_keys_enums.dart create mode 100644 lib/product/constant/enums/role_enums.dart create mode 100644 lib/product/constant/icon/icon_constants.dart create mode 100644 lib/product/constant/image/image_constants.dart create mode 100644 lib/product/constant/lang/language_constants.dart create mode 100644 lib/product/constant/navigation/navigation_router.dart create mode 100644 lib/product/constant/status_code/status_code_constants.dart create mode 100644 lib/product/extention/context_extention.dart create mode 100644 lib/product/lang/l10n/app_en.arb create mode 100644 lib/product/lang/l10n/app_vi.arb create mode 100644 lib/product/lang/language_model.dart create mode 100644 lib/product/network/network_manager.dart create mode 100644 lib/product/permission/notification_permission.dart create mode 100644 lib/product/services/api_services.dart create mode 100644 lib/product/services/language_services.dart create mode 100644 lib/product/services/map_services.dart create mode 100644 lib/product/services/notification_services.dart create mode 100644 lib/product/shared/find_location_maps/error/dio_handle_error.dart create mode 100644 lib/product/shared/find_location_maps/error/error_response_model.dart create mode 100644 lib/product/shared/find_location_maps/model/place_detail_model.dart create mode 100644 lib/product/shared/find_location_maps/model/prediction_model.dart create mode 100644 lib/product/shared/find_location_maps/shared_map_search_location.dart create mode 100644 lib/product/shared/model/district_model.dart create mode 100644 lib/product/shared/model/near_by_search_model.dart create mode 100644 lib/product/shared/model/province_model.dart create mode 100644 lib/product/shared/model/ward_model.dart create mode 100644 lib/product/shared/shared_background.dart create mode 100644 lib/product/shared/shared_input_decoration.dart create mode 100644 lib/product/shared/shared_snack_bar.dart create mode 100644 lib/product/shared/shared_transition.dart create mode 100644 lib/product/theme/app_theme.dart create mode 100644 lib/product/theme/app_theme_dark.dart create mode 100644 lib/product/theme/app_theme_light.dart create mode 100644 lib/product/theme/provider/app_provider.dart create mode 100644 lib/product/theme/theme_notifier.dart create mode 100644 lib/product/utils/date_time_utils.dart create mode 100644 lib/product/utils/device_utils.dart create mode 100644 lib/product/utils/qr_utils.dart create mode 100644 lib/product/utils/response_status_utils.dart create mode 100644 lib/product/utils/string_utils.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/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 sfmTranslateErrors.txt 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..24476c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# 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 +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# 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..2e239db --- /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. + +version: + revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + - platform: android + create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + - platform: ios + create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + - platform: linux + create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + - platform: macos + create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + - platform: web + create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + - platform: windows + create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2 + + # 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/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..61b6c4d --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,29 @@ +# 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-lang.github.io/linter/lints/index.html. + # + # 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..fd80708 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,84 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + // throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +// START: FlutterFire Configuration +apply plugin: 'com.google.gms.google-services' +// END: FlutterFire Configuration +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + namespace "com.example.sfm_app" + compileSdkVersion 34 + ndkVersion flutter.ndkVersion + + compileOptions { + // Flag to enable support for the new language APIs + coreLibraryDesugaringEnabled true + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // START: Flutter Local Notifications + multiDexEnabled true + // END: Flutter Local Notifications + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.sfm_app" + // 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 33 + 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 { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2' + implementation 'androidx.window:window:1.0.0' + implementation 'androidx.window:window-java:1.0.0' +} diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..7b35503 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "910110439150", + "project_id": "sfm-notification", + "storage_bucket": "sfm-notification.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:910110439150:android:c3dbc3b4a85d7cb75b65ff", + "android_client_info": { + "package_name": "com.example.sfm_app" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyADdZ66_q4HALlb0-yEGgeyGnsbwmlvDsA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "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..c8e16ef --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/example/sfm_app/MainActivity.kt b/android/app/src/main/kotlin/com/example/sfm_app/MainActivity.kt new file mode 100644 index 0000000..495c626 --- /dev/null +++ b/android/app/src/main/kotlin/com/example/sfm_app/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.sfm_app + +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-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@Uy!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-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( 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-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/raw/warning_alarm.mp3 b/android/app/src/main/res/raw/warning_alarm.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..987934660e5f932fed697985bff3153aa4dbd693 GIT binary patch literal 321120 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�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 z z1qkIk@MPq|^QGsPprn%k377{h?J$-lgqrKg#58I%k&J969O!r=fbxb#140Bq*3bt+ z%~JU$!iS27OhYM=4DKq`DU*rk*KbTbbag&a(newqR4Cj%YE({|F`=>XwJltg$m%ptzLB$9>rj)D+9ki>d{-iojh zah&SlgoX+d0U!zNU=Wf4-$dZ0M0mHpa+ChXht@Zr%(@EMCFsAoze!BO0i<+mR;byo z5AsLGKZb!EhC6Iq1?3KowyrRC`SVc7Z}GoD;plJiQXAc&NMFQBQbz4nKU8;fwrCCD z2vF9qjC8}uYjN(KjIGL$qu;+c6WuI(#wX5&@%s3J~&T`W$p)6l7*}5?nmjnygb3SxBk%DX@QlJH6 zC>J7B?lQ)uOOc->W~&A8d=n9xtS6S33{v#G%1d{%H2!>1_9hLk>cHgWYt7c&o8#LV z+GDvqMtP>$lRU+0XPMH;rMw0nb&70cwKJ%PT7HaNcW>81W% z#dv+-Y(U{M?O?mlfnEK461=a z9Uj7cESpuLBD&MeFTmYkm!z|8ITB!LnaTv@t{hFG7{KlU<)E`J1uFam+(cN4uBbR6 zDv59bHw;ZrszSgl6jO9M5}YQ9keI_OPTL4PLS%uIT|F_Hc$nGLu~NSN)9P|BdymZM zydXc7=ceD`hP(>{bv9GFHiLIlb%EtX{z^rYU!gE~qn-dhJN|-EgQX+gSo+xg16~@% zzCnA+&(e%G3KV8B{28P0w&*Mvc%$JOgWQHg+OHHfAP;yeov4pjuJ86OXN&Q2hMt$s z(EFCd&mvVvYEoms)0ml3OvDK6Q|I-&@OAucB4z4CEJP;%t5-~PuMyanDCRWBrdxj6 z@!*kH|HWXb&C-zJ3p<9cwL5J6_xo{w-+5yfll zYlW@-T9<(5wzc9bYyXvOlj@$sHg-HdNwPBO_NUjt+KY{mmdhq#B@$Mi2P@l6vU)^((Xg@UhmGk8@Z0M`D#bQv_g$>l1J$BAI_yQ8)B=pxxYvC87s7 zzT8u|rHXadv~r1bi+kO3MWtJ3uJVGku2YuKx#7FC-v6#CtX9|wcCuX^cG+hdH%wGC z8@(sk)>nhx|GM)h@Hb{n-gvyvw*QSojJ&A6!nV~|xaiyPEm7YrZPmwjt-T?Kva+IfU~w2W zF_0nVLJgEl7P_lVB}8y0Hnelv2Bj{3dM!BJpA1gxRJ}&jw=?!h-8xzO3(h=WzGPQ& z@RIOd+4s&ak+!PBI~TdvCBpeRb{VO&TBY};$Oh7rGLUK1ERs(}JnU|wlM#{@AOtN% z2qQa$ib3l&Ynjv39mqq?N0VOH{&{%Uwjkk2wHZ@U(|ISaRUD8%+`Yr~DO#VYZ0y>G z98Xird)iaI6OJygEa&l*Oqnr-#R?P3j%1r?d^`ss_4eutyofWSd&nc!0U?JLs&&S* z0ugxpGMF|q7+`5}sf?_vI(M<}TG<%0DaLzTwJ} zIuPEzsEUJP3lo?Gn2ZiZV|w#rr)wYl{p^qSm;L`eUR(RV88`FJ5X2|5k_V4JK>qky zZ1s9F^w?_kDx=bgr&6seQbf#UNsMzK*)0+;B;3)B>^a;pfU~dPe{`qcXAiF9mnN>? zSL(OF%dcN6a0aS@e5uVAWN{k2_x)Yg!lp_|d60ri@ zX^=q!CR#=EGx_rKP2)Sk2eO&ljy1vz6OR`**n5WNGWDKhC>|!?s-I?=p?4(<&=X|_ zGXON|MY*`6T8)4?l1_dmj9VpE84!;oTqSXR@#`RiHZ{sAL=z!D7uP5W1wR6hIw8OuozSbeTTs4a- zpjMv-CI|BM$c-Q>n`Vl=y&2O3pB)GUMY`^X8Jt?s{|Oq@=BY`-i(5*^=e^Et?b%;^ zacTIh>!zWL@$^{z(Z9X-kNgSw{VDN34);NRzXSp%%=p6R7Yq9z4)hfE-?EO40JS4~ zxtc^c?9u5?Pe9myy>#U45^LQS(v;*7dGIH3vYp_0VF!0+hP35+W=U{M=giwR-|wqV z)lwbBuWvT?;jJArx(M|>^L*#7$%v7D1voVNt-yngk`bVXHjqacR1_=d_6C#K>9XbB zL?CE#^!}8sk{^#oZ>t}0+>o~|I(*j3%%P^anGW<@uq*{47Z2$@E5tRM?mLPSz|)=ZQiNZe-CcygS5F!j5-8+{P=X}n-M8?E1n7Ge-W1-#Gc!tbMaz&e&$_ zzebP1pAi_JGl`AgF_Axl^#db4cTbesjxX@4_4#RN%aM&&L3(=2kVi__9LI=uC{1mljaoG2Y*? zT<~XTybCvG<;}&naiqy%aqnZ&xW01ZiO1g~J6NPqL}eW5O)}=<=Pkc#U50KPjygCg zK6iRscN-hUn6#bHn|jr;;!u3a1vs$c{@2&GYM&4V`w?;gK9e5YsRYFyFl zC$=N#Twxu!1!4DLP(ut`6aJSDJ|)cwYtO1UeQ9s-`WyPP_OBn_cTzGYFo+|vT=oP9 zMK6&PmGc$z)xR3;SZQWX_D`_A01l=-`4KLvhT zBjLp6GSyZ0NK+vpgk-*1yp!*XAIz@0_%*JF1n-CL(E=vMMp_k1TZZ|**Lp^_x(8p% zn8u4}`%WhN&^`H0ME`d8lI*^LE$VcDOtoSn%C^3G;Z^260QrT8iAx^7h5RqTO&?P6 z$ZI9S21|fEQlw{+GPsIxCb^# ziHbIuR)q*HETn}+G=j=@LOs8H;Qw50Cj?$f|?_Ew2%u%pt*-8Qm@{Vh3OW zKyd}UpoLt@r-*QX6ajV*eAyr;Ck00u@+!;_P|Qc)q0VBx=}f4{2*%IZic{GF-AH zro0zqpKHrqkd`}<{K7Ta=y^Fzaw;qia6qmVU-W#T&8noEwrEJG>jpOuCAS@EWHgNB z_pLr{ZoiEAchC6ObI2dnG;-S+1iZn(eZk6Ll#!`=kyx+yqTn9+Ss(vwf>(6t^3UCy zK3Tne$88RgivM&ur)b(&=`S|(Tz7Q^yATG2xqg0|fL%tnk-66dOxGRFO$ACXH+FlB z*WM%YRyiaA$*LRJTl?n%FD_M40XadLlRZrvTy^rsRGt<&Cg7>%q)U02Q~kvLP`GQB zu;jGiM{Io01Dpj_w`tF%TYZ~#*9M&Z1bxpOa4zjDHlZ`^b4DpHvGs`Am8016JZ?TGmcP`E`yvg~}P;fT}KBeSm zhVyw4f_#fRVjL(#wOA@(+upCVUmli_C25kNTC|TS$`llVkV|_N8nLo9E4wL6wy;g{ zq!MAsO`7(1>z);_<#E@xzg47^LTzTs!tBNc*2>1Fez(>oV;h?P9%cWcK~72VZp_7J z5bI<4Bl+AGBp*FOM&Ay=_&h!S$eDYH_0%4`fn)J)VCDxkFv;k4q&xWq z@<3A_Ci^02YuLN?n#NF7rEmEMc~th}paz_ZQF)5Wd8$fP1(rs}K=6#1hn_<$lcmTO zB~UDZfayc6C)t&BK3xEtLZCLgRI}BYrp&|{D6Sd`YM2w%yfNb33rvNpD&YqjqE(e5 z1N{KlSaU^sP-X4dfy|j zi;umo!1A!E_zTxk*W#wO6;C6r73b3gp|0;SiFW}T=a-dq^vvUdJAg~nn7{L%-rJ`@ z{ObJlNk6deAunGQKe*4_$lG=ECjqg)C4x{RKg1b556dFxsYFBaDx%0_PlP6|g}~5{ z5E$A_#L%t~3`!3}=F?M=`9_9}sz&OmV1|rDR}9b)OJSAJu84x3ih6Z|j}*he({nAn zz0{{l^np2+``|{EBNvK*qUj$Q$LJr>MDqyz=jaWJ+KSsvz@~C;R$B-EFKt1~mPI2&e z1n!5?bHF$kPWq$Zd_{P2?{d3aW$PSU9O>35_jv!?114gw+aPLyk2=o-8a)=mHv1VW z@^Meho((l{qp{H)pV;x{w0Sx!WkY!`r;sXU< zY}WVOTChOJ$NKME$)Tq&AbvGHc-Nul$RA)Z<>{`BXePQZo5~@Z5o_xPY;07(+4|3- z()Ju=A@5snzYtsAfM%hbW8=pH!Zr+Jz_IDkjZpPTNICO3@~g5bA?HHQ4Ndvc`RPUb zFy~*RhKdN|hs6002c23FafFgp?au0i)L~?JJgebW!?ocu_3EJc4c4*C$r;RqsoF^kpoQt4emW0yzc$1A~4oSnIFI`VaR#f3o^)F$hsS}mlTOnBJYnF znIe)KMcY0Gn0Rni(GnRZGx3UJjhd~KOBrdsld*`>tc-^FMC@=OsQO#=|V7xGyc{ZLN71zyTP%Mh`v z`XRt=KnYIAfwJ!vebBBNMO+ZVL=aL+Opu?AK9f^A zJ)!knsk@Yq9v3L-t~Bb%=;FfQul|H7TiLYK7@?MDx6B|g22Bg_a=9!wlX^*g3n;Z< zK_JrrRrxTS7|$LiI}_2lFmEnWZF z^Kg;i{P~}JGS8nkcS)6W@6@drW&lv14*Fcup8!7sORmRb$|sP zYYZ5gT&Lgnyxah?R|9Co(6W~wv43?^q(+*wB<>Ca51fSNpNF{-`IorK!lfr%S&!KEpQ9dq44j^rNO zb~EwXtG|8EY_L9sMKefhO96&ryHs8n6d3W1XmcpTsJdY)C#Fz;5nlgyRndRJ^L0}6 zcd|tns#0JM*^=Fwl~YE}=LK#*lAX`3RI+iiD_24P3HJuu6(7u!D-hdn@Fy_^ z?p5?US=_8J=PJf}67H^o4$oFYs}yE2OY4x`3}hz}U?)Y#sf=s0yxh3E&)eTI{s@QF zM^>b!;$nfkhOCCWjB1HLn~OPJv@fhk&44dCk@3%0s%?E`4GRCk0`u=Nnd~~uzi*1u z1ww(S$LVuXupq=-X)&vv^r%6)RxK_O~v4V;vP7T6OyGJk6wA z^(PW1AIJ~Ra-DGIQAaCG;MHMMi26r22M4>CR13SW3OF0knJMQK0((PWmsq}}npYDF z(SBB@koM_96){~*l9kCMeX0^ zf+S)%Aiml4GrpflhD({H%xlcwwL+lpgF`^?V3&&S@I6ClZzjPDOi=Wya4|~Yxh6pG z%&4<~4!ZXbdT+=pa80YCj8I82hg~OxWmP4Uj*MW_2Lix1SF8D(mHTYyjp12ZE<-hS}I)&}~4D!T5L>W&&0> zdbSSlar4!NLnqRpydVvNCZJ=psHo_25qqMMq)$RZ*IT zua%b*c(XaIm|jFn_+D(6>LSU=OqMBf18H1XOs5fB0XOBA^VC82wDVPSnu`jbIED|0 zhL2ohl;KDqGUan+(mQ3+6&&P+IoNFIGL!YD?m~Y=L|TD-9pLfYyaCS{E8lx~PLX2# zZ*|`Uzcjz`3)?X8B)G)EXc*vP&c;$6xwQ=XIJE#Py`9xwtNt+mI?TLyZC`RAQu5j3 zpN#myV-T?bdyF>HF<)#Qh;<_xo;VS>uRxJm|GyHab1+Ph}7#;5V7Zfv%w<-l;0K78|BqK%o_0 za5~9`At@>4a5z8=eV`pvQ7%xrEV0bF<}cV+ms-yU3}mQTdoVJ9_muWI){;HtqMqzq z>g^8?GRksev|DoGg+?4JDCkD>jmJe@N=(5 zrp(iO9__$J0Ac>|R@$T-zxPs*(!eWo7)mLtop`ONnF*mt`buVcZ2JngP2>X(kckp7 z4cqqR=G2URWjmV$p1w5}A?3gwSY|HD#*FqI62dXy`Mne^{%i)=*S#s5r7`M&Lmoi& zl`pdcifLXDk8E~QGG%sMZV}cR(PsDMH`Isrq!-GLj?)vvRm~&mAMftxM^OD$Dpn@$ zcsT4C#e6r;!X=J4BNylGC}2qum0)Fheu!*!)^8Omz92Jip)7LH4LLv| zH6K)TjEmjtJ~qH50=0uj367ai!12|x1BG)Il%WDfYq@sIJ&U|#n=61>MV4%HF<=*9 zcjd0L>7B9UZ*zJIK6JHu2Jiz-_W_duy=}mT1Y%oY>*Izt@+H0xacnv+XaIpCHABxf zreuiRhPG$CX{QiVX`Oo`+-)K<{O3vV5Nt1vx zY*nNKVjC@TPTssCDm^hCJ>qoS!@|zB6r{ZPYw<3rH$VP~MB%*-(E4OnZ))&f>m9W{ z)$T#6>%w^rlh+SSp1-HOIk#c*co|?=({)y+8gH!DFtjmv0yGBQNv_ad#+Qk$x#(DF zmxIy1Gj;*m-;MaerJt#_(C?=^QKCo!XR&YsFJRDU5-INOImimN%k;4=hcIW@W` z6NN!7Jc%(51cCq{wAU>xG5#7BwV<+c(96MK;BWfZl>1Lya8lB$Whk@=<0JG)G6ni! zilm}MBFTU$_)a{X9|1!#X(kR4kldueOt;**%=?al$Sc z6#iAxn(rdCziq8LErmQUroCy!7@efLX-yz)DM{+%?W>-1$Zi5yMMY;@uI3e{--N*Er%{%mUnsZJwDp3#dY#xlRmhlvKbqkZpK4|M6E&-Tao$hLQgZ{Q6HhiL+FFb zN;Q)z0aA}DM6Bg*M?YO!{GI)-fo~;FTiokflku+5W;b)sEa$_mZAvqyP{2lHVOb~E z)qQfC-jh1%UE-MO7HT^2TEcIEERe->Y~?$BidUHAnc3+9Ig_*r^xuOwX71QM*tjBU zdrE$0k9%}OskZK$P+;KVw`@n}KW2IigTL861%p)Yj1;7Qa{f1;>0i#%E1(OHZKRHO z6@cI+Sh5@0=z#_dE!B%UVX-<1uv7#u{UKPsg6#H{0dgl%x1Y|qa`zVkOjRp>DR4zJ zVE@UySYatE(M!==>k=^Y)+(KA)e=GV=MmEnbFJqNZXlIQi*Uc)RqmAs%`C(AJq zbjb(&!i3$1s{evM`*Ne-^T(qAKiELAgfJ|I#1PqGTnPCbaf1n(8zM!Xp*l`E635Jf zx;U+IZX6CE4S{iQrMsjlwkg9s*5J4B$n4Fu{9tQNQ@0n}y6Hgj3Y1OUjKg{YqcuYo z;N}V*$2N_E1tlPx#jZ*_eYkS6Z`v2NJ{M=wa0&CvG9%R$z9^@)pW~-!rBPcsY&Ego zSmF>4O1_Jormx1>(ja#X%6Mm$I<}*?k89{NH9nIdOtk~-y+CV){Ux}1-wUcvK;d_E z3=d+;AV@V2&J{w#Oo>PZl|r}=D5lXK#Ssb((R!!(aLd_aHfbZ4^!}_xnLb`*>uYR) zN#-JWs}OH>$2U7!(W?*0v+YvO+*#|p?yDq8txmz*asrP`v|zZzz@Q44txWa2mukzY zVQ^qdn9+Omhrb#Ca@VI{n3&4n-!$lg^(J!BAD;UHyXh4CXV-l9$)M*En~$w(?%Y#b z*w8Rgrn;J3)a{xv(m^Nlmv?qvJe{00=RwLx4YM0{*BznF68ksLU|#41l<4X2W7k)KF;>=mz=!JXzPISjz_=b47b2_YK1$;OSYAy@HkZ1SnRY6r*qNp?N zUddYymOOZK+T$k1G$Eo0h#}<3c9%{k*@)3>1juX%b1aX!g|pGR`1-Y(m!$_* zn9cR(r_Gi*R7iV@$|ik+YxSYL20$_RC&(;K_Za6P!|XQhZ~6uL1;2VjK$9Eja&G{- z+rGqLGU~9Oh%mOKNCmkP&;nBLiM|s8Nn=fN_ggm50TKkbM+Khro;pkRc zpe=lqHpc4+^FUdAwG6B-MMg^eP!WNPgiLj5kdrfcb8@;eh+FU#x}g!YwP{N^V1?6) zLt0@jih{%;2ck$Ed322ks)*;X;Ij3ST=JxDtsrRR<+6KhX8`ieeOXrjK{&LlThz_i zEx*HdHWjUfKm#BI!T+~91p{4%!Z2}Ii5%79!6<;Sa3EYuqA-mS1~+QvYi|Nq19!%h z#$Q0sX;C-o!1$bL5HVj)LB-v`zCA;b{zYd*4BRSE+H2Ps6%~g$n@)Vge^e3A0ZmDqgAdwbxMW&2v=eQ9W zJg%$^)Rv)fxD5@y8pciIIcP}-g`}7(2X0sxn-Ur)>_z}KNt`A(1%aI$g=C(ZFbBmh z3JGwm028^EWEyYR06zBNtmmU8AcFOm|D1VWcEfcHfB>>+y44qszoH-F6x92{(9<`s zN`jRvD0rCSSfG4jlVV<$9_{M2`ZvRH0 z9dy*)N#n&2v8?E*0`L|YvC0^q%pA2HD18Cy>->B_c?04b9ff*6(9T2vLTq>8q2pHV z04z2&2OoR9Z*Nv6T_qk$Ht{wY9{SqX+&bU?;Kty}H?M*;FMWee8lmZWpwNAc7PlB% zL|ew>Ey5y@d<3U}EW=w6oV0|3Isv$*3)Tb4vq6}2ct)4(dIpNh@mrj7tFpj+f}Ujt z%}M68!(;(o0BbXD$m!$_Q@wDTRjOtzEYXL@k+xa@sU#~ls3I%@3!Le`a)*Be$Y*_e z^+x&vurbPv$Nn|^97F%=f11$|RNM#R5%9M$XcWfszeN#1?s0GfNsWMb^mdq_m&004 z1cEz9P$QSQ$#*X<-*EtP!!<7@>NfAbkgffY9m%uXET>Z-?VF;f*S<@9{(j}RGuu|Q zZ%UfWiA~|DUVfeH$_9Qd1oHq%w6pap6R>BQJ!< z9Lc+T18Z_U_LdP`-CW`@B-Q)m<=>due&eMyrSxy?a8q9=D5 zx7rwb&>b!TIxtS>$Is0KfaO7EjzM==*EyaX>Uti6g>&~Z+!3|pWy%Q!n-GhQ`Wj(> z*x5gMnOSl%M!f#(sgXb2E{ggPC=N@c^icsjMk+PK#EBQUc*A_r>XleOH-Rn+vg4@) z>FKR?5aPt8QU>r9x`%Ut2Iy5SK2m zxi1-ybH@WU;=__ko!47hoPi^C42L<^P$Sc1^ zoCLboodu&Q;K znJlq#WI7zvy|;1%>=(hNI)inGK6v6SySCqv6&ki@MO}-r_fA;pp3GDZjP%d!n8@8$ zVo=6x0CUlXl8GWB?%`r@)N(J4T2@MGH??YCS?%yEmmBRnZELN2y(8z_An}nIE#qm& z9xqGrXdjzb?t2Pe7MPXjXJtO04GOd)x#l#2hS8YwsZcfmSYHZ2h=o#1I+UK_(PA*P z&uf+9v_0l1fsuCTG9pfcEgx=HhyZ497$Lhj)Kb9cH6XWO#vM-oWIS7MixGq{j9!nt ziI`4(g34Iew^i4bSSvv%filVc;Z-+Ur}iDe^GfF7g7SYCjFm^^IATGCIL zpdXEgaW=|Zu>zA11gDTu&rU`xqM^i2KKvm(@(+!wLKBpZi#c@EsJIB!5KU2ztcg>3 z4O+Nz6?r2PTmlj_dtw^j1T?vXC_q)K2`d@|q^rOTBZov`2nr72C~X&mNO6K;!jda5 zeGYOC>b+&4?gJ!}&RVT6w`HFLIBk&hp1!6X^~av-d`lE-biU$nEMO%kMc7qk9G_>M zPK-W-iXUwBZv1q_I6hBT&02$QVf|D$U$?whTQW9B6AYxvra!hsmj^tw!2;8|50%Ta zY`Maqp^Uc2`-V?!njaxhw#Q>is1y|m6l$VCp7i@5tMPu&!Is1BDNG6HnC&|{p|s@AGW z^;2EgJTOvAh3=db+&8pzEZxV74F=<~M+QzXIMb-$VB7$b7+h${|KP9tpEd43T7HU< zfFga+Gy8>85^slRac2h4Is9B!_}xq5mgV$!;|fF3q-Kwh9J;;Q`@cf}93?|ITFs9p zxH{EzRI>+WkZs_lM+o(GMgiH1C`bcBbh6B03dI}-6+A#L2Nzio<;e(rstbV$0%1xS z;RKJv;<>Y-IF*AoPRJ06R1Exya8-uz@Jh!esspVhDlhGm{jym+4wmra#>}8Ff)*kw z5=sne1?0!pnOqN{@q(xED**G&sCMLUWMQe; zTxd>s5F)^}F6e|~Ud z=2lf!2eiFyFvjpkSXh^+FC&3d!+pQO4{q&)Mtp-3E$z%uD*LVsD3`fY-K!%#b1P4M z?k1MDc^q`RXH#`@>)hC#J`dg#G{{FrTE=!i{Q7dw=Q(Zf7T4^MJ}Mnpb#dgAsOiJo z%<4YgmLS>Pc;aMt#g59Zp-oqE?Ka^_yF4o9UcTPR;hsGo&^7+$&baTTN3iVMtLv}b zZrcxDC$63O^7ta-t1|}l5F#ap2IpZys=6+a#gvSS7tz#YosfP*j%I;*>(_XvBF;QXlK1?Z*M(7oisJpTBOvH^N5 zi+@;jsA1agdL=d2KR&CevYUBm9_rPZdEHiWs+$_y;4_)M&}QZGRUtX?b5B`XHL`D( zP5w~-Y2@X0xY>XC{2@rRXlQ0|dq1~!U+%l?t=n06c5=Eb@#D$%PvS)B(9ZNir!-Xr z4u}<;W9V>*D3r&Mx$5US=9>$?+02Mbq_=8HTbHcAeSBR=-I6OPo90no?yzsrnfUqS znlmeG`m=b$mlMXncox3Y<2OGz&T|33qA)GSZ@A(`+83G2yYn=vv=zczMG4xG@*=-a z8@E;!C5*QO-n<;!?YXDrR_(x2kD0AUGJkYy5$H}1bb~kiGJW$h&xud@3$i0P^Whj` z{rQcAtw->e#%}X|`H83ZZK@yKIGwp-ZPMEGG}qGvogr*;Z7$!W4d|*hY2-!@rC_lp zc4CXkmdKZV7M0ttnR=P*9Q8tW{_sf|Ox|%FN_P2r^}yK^r+=DWI5L&-$Tl9KVLaa^ zo>sIMmX{mbM8|D9Oc8Sgcfo~RT-PC%iW3EQT>^yjPamU(L@V#MHAhO_d7?<36x;lv zA;9qa$4MEoIy%bx_!v&E1kKHZNgl)&$hZ*V`|DcA#!w_Mt_{t&C_UI-jCo z9AGgz_NzZ>+z}eb>3p6iXmmYt(ABC=DX5Do53OU&{<7e1q<6%k@W5?;&7015?jO8# zDE7F=64rV^baCt9_M5*7z9^ep6}Nx#WJ63~d{m|<=fEBCts9QKjpq6ezi9mIg3bAW xZApUT4Yy+BqqdiGeUo?bTw>kZFD(9Q^9k28=E;Bm=Ux1tVXS|}v;H48{u{~D*5LpE 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..164baa5 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,34 @@ +buildscript { + ext.kotlin_version = '1.8.20' + repositories { + google() + mavenCentral() + } + + dependencies { + // START: FlutterFire Configuration + classpath 'com.google.gms:google-services:4.3.15' + // END: FlutterFire Configuration + classpath 'com.android.tools.build:gradle:7.3.1' + 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..94adc3a --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +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..3c472b9 --- /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-7.5-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/assets/icons/en_icon.png b/assets/icons/en_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8be3aa9a33b93d9c2d2f5b600987f3c86f0a5b6d GIT binary patch literal 19575 zcmXtA1z42N^M8*J1f@&5L6j2dI^_TXDQPA2OG-=korHiO2ofR zbax&9J^cNB9-q5+Z{FRR`OM7j&g>GdrJ;PCh@J?7pzA6R5RV`T2YkhW2(N&TJ+HwN z@Nw1ofsrc&k+fj{!`hv4EkNT9H$_7?9VaU{&u1={kf*1oz;j1CSMz7imI6*L*2x<( z^bo`fsUYs@dZnyQdU{d0V+gi-Jw3$VsC$TKQq~SaFbcdn#;m}n4fD6d@ZYjzjS{EX zP$6Ws?yojTUjZ0YeqO=;2p3eLwWwSpUV#qL1acw{F^zZzbHdwzPclveZTTkl<@KOV}LO zr2cK8S{a4>~TIEnocS~65tQV=Q=;C+>KTIN# zUQtiW>%AFKRa{v|*d3Z1+Rf^Zghf-Z=?7DsP#m!qz&v2>sPXo{eXb z$9KSI^7lIkAcL=j6`5OcOeE-(^E+(D_>I zXtTZCee*jpKggM$RxS})MF=FU>C={tN2&E|hk9GInyNj_cC)2KS1jOq{t08IX4TDv zpxiK5#~m*jhp;6a_7%h9X|8n4Tiv7X)ooa`_{R%*-m$MTC!a#25mAh3N(dusj4R4D z&9Z8oRHO|jP#KT#u~k1Vgcng?U!On|@kx47=B4m(s%zTJwwDj3cJ{96+M!O1%~F^( zOZtX66*cvOYu#iLVo#dffd~&LnTbT1TZ0YKC6yLNmHk;_?k^*Lwxsh{4rvWZQ#SEDufV9!_jo>X9Ya7Zw&)lkYx%#Ov`8I)}qhZxa#|X&p)o zPbmBKQg+pDnA5uS@MkUJD7KRIv$E5-O7cW}pYyCS_Pt@g8otD%5~&z6}K|2~ma_m!DOI4hZR-K2Dwjb34$-=tn_&L+6kCSjW6SC9Ku|N<$0|9CUr56};#@neceilHh5>eEz7@ zVUi>~jWi=u3u-Fn{y9B$-1MU~ha`pXhTQDDzj~*C{Xqz1u|;({Dp)sJ5Wq%H=_o1t zH!BDE!rgAj#xhaAUr^57b#XFl5%(=FK6GuNqR7K@%D3LjrLANxvxxua8~(#tF{eI# zBSloexWUYkgW0zN?&a13S?0$kef*96(GK*=8UgERroMNPXM+N0-*L3|}jwgBs&camt@X^LVr{_r6~u++BM4Ze-EThNdFJ zePAo`krHQIL>lRgF<{`9rocm%6z^Q;9R(3rL8%SCmQ5bIN6)@Q7yNLpdh%{IpzssN zntav6>6C;%zLgN#&9xfcJ$op=I0%1s>NLP_;%8a<0nyTd(<>Yg##2Q3J$V^>8ug$ymp!&-9A_3 zPpDX!MRef*I6zZ1o6CgdsOD%+;6TvFGt!$bn*9oYCWPWnOG=-*C0+DqU;6U~`p$@+ zKzJGfT=3ve0%H9Ke@)Jh;rhB)8e`R8%p-CMrsxNJlb32(kHCw0%zonQl}yU7P2ZR7 zIrGTm5@h&zB)hnSCN-S8$f+2Wr7=wBGy{-a_^KQpH|b-P=(+?uf1KS(w4F} z0+Uj?zcz}jB2=oEyrD>e^I~!C^J33m9})`N+qyMQOASJowyQOuIN%A_52g-%8Js$H zx{ZowxA=J`7P$L&A-rV&8m?!jE^3ZWDYiBH(?ys@A2`8kuCn8DfbpL3Q+r;Bb=+?H zW7SlWj+Ez4tU{0`weF0V92B1_ko&grXnjym{!?Alq{MoaS#4!lweN|nKX4r4$gB9! z%KBLJfb@pU-_*mo#CCzh8H_*lbHVr4sQ8y-gVC&R0w-_Ffi_2e_RSP2KH(=|wA;Lp zmUUU8Rpq(pfb?NOders%TexA1HxEjvu zwV)Z9FJC5hW)mEo{40+;mN;^@!~Gy7*V>HxCl=>FX63D`cQ4LY{wiM3+0cs!NY>on zGtLk^$|u46ZIpbH&M1j2SX|eunJ2?QZ5|VPR+zb}dhMcsrJMDK1qHnkX#{)t(q63W zSywk5>z)l@0&6xe{OU`Vj3Bs?5szwfnMT}4PT59}`@O^3*>V9(&D2@eINMs#{fRw6 z5el(2{-bGM`9+W2 z8_cmfuOF$H8PVYYVr2f%Su>w@{K=A5TQ%z4`{W5Txh$y-sWNoGqx^fF;K@zdi!$$g z&2nm4VrWUh!}K}g;KQ$^^Yq7ugYhQ+IR-3D$uTJQ;{Arh2w@_$Ea4BOJ?4;tNY|y> z=0|>6yikhME~eRPSyGX~F{$yncdyk?M~#{s|1Ura6A65>KS~WrJ|p9Hhl|LaRh3|Q zXfU^02Cfz$FKf|1Y`<7tRW;4w!>mOc1>t>B{_7a|Q|c!F`QFGo+%uT*Bq`)xC0Hfl zaHpZ%A7mA&D#PW&t;Gyp$=r5wO5GaTRBT62`_RvlLZ!|c<=g|4^JQil zObp`IgsqOy7+{^$7A>2d2?%7EoF@C!6A{r9#A8htXFuV6Oe^|USa zp)s5hp#=rDn(tQ1pPzJ2w5W+K?vps54Us~fvne)X9@e2Fi7c{0&%gB;AbN2-;V_}< z!^Y`x_tCgFk|K#r{>NL(kBkRkP@d%9+v4gM2V3ugbi^3bwil)fvld^zx(5>~CYTz> z{MRWic|+dbwelOwIh29l6RyARR)N|4rEudyoX6qSk~duL?7I!Tsv%}-ZRzIWhp}7H z9+Uv0;Lkc~M9Y)ut}G0D6R#MgrJ4nOFJk`8XITfHd?SZ~ZtM;Z`wm;DNbIaKlQy$J z!KdDd`SXW$DWUD%8VrIyG`TE{Frl!Ir;qs6=ep3RHk09YFYH*Lr5`U0YL2rj+NYU! z=Gvq`R5-pEYWI4b!8SvPf=$Ro!?mjSp}#rigmQI&ly(f!ivwvTPqx1ZXw;9=wJR&zUkx8rnN~ zj$St{$FwRaS_b%82tstPs=9mSOg&wi<9iExRgH?XzbtuY*z!VBdwr+lMc(IiEt1op z{?5xifrP$RByB_yi~nUx+S*8903$6b!1|KLt?V(I^%Xn`o6@F?Y(6v)>Xnpp-d%f) z;IY~Caa%%Cmi0?CAiUaB^JCpZ6a5KU)_&^@#<)X(%Fx~*E@lgVL0V^AC@#5Jefp3` z3v$Z<|4Q2DjWiINCPM=~a!Gw}n)$u#pr)hdZVG>y##`6dDZA**DP@^^HBF1El9p;9 ze7Ho__@p=)p*>sHw|Fy#iLQIRFzBh9b;!k-S!46!?k69aG)>KzY_@crG=@*2edGW#aYLyQ~$P6KlayOH{7vghzdaF%vzo^( z8$4!K3A%SL>f#itM(M40 z-86FPDG>Nz1wK5#{na9JGILl=3kQO8ingF19k2X!nA}B6`MGp{jdEEGUSX4^`s-0A z?c5_y)=zEgL<|@}^s%4a(zE|rOx<%Kx7+c@C~s3o;d-pXJ?7}e`|Q6Fh!6gef!l2H?*oHmv-G#$Z=Y59QESRyt z2uI2;KEi@VR*ehrpcPx#d~wax^xmg*%ogGR%@XjWB>ola$KZ#+psu!!K4kwd%UY5a zh{by^diH_`o!*J5aygroW8-emu^Kg$EUvmrDIy+~)cs&QYerKn>YkukoMhbQk3?6TZdbG3SoyZ#qOLvP z-)MXPDug-_(mhK5w3j?&z)X)pqMz4l2PyCk_GhkMI5ixGRHakPhBAV_v}l#CU#R{K zj=}}9Mcfy2gg*$D>ZsWbXHi2xaaHMOAkG!Cj9PkOaS!zQfll_UKr@}G?!6xW-T>1(7s;86 z0ZhOe0u{+#$&-@{w^>zBZtS9A$ooXP^II)~{ z_&TQQ6~_%CiVPy<4NdQCi-R1`chhF`s{q=j+(4PLTS;LynFGs=h2I{$3Tn8JbYXtK zJGz?w;%NCs6*cl`h@rk(cX$WuBc5#ZnD{I@^XZz&4NflW zJ9pN$!*+CsF6BZxfelg zch;_%6lchSb?58N7f$r9J!sFmNs>?cHo9yLIr7^pfl8mIziRBROH&p8@c|lv3zA{< zR#Xww&OOwVhYac+8w=j5uXStBa+nsr+}OdGX%hn($gaQ ze6K%}b9VE~(i{9gsd5Ip>wGXSsELjYQ)(1u6F#uKcJsgatl)0uhTPoTkZFs@G^Y!z z+&ZUTY$9GcNE8R?nkX0<^!-8XUh2rIgMbSme@N?8iYv3Ww)QqZc}2`)(d=rLDQ;~p zC| zsGHn44YS#+F;l+!mXr&Evyfr(ZY+A#^>)2^N;&B39Nq59M*cHzPf5)}V&Z9<5Ap}*#=QERQga;@K$mp}Jl z7`rz;JJ%n{_H1Yf<)2Itv}5`wLoV*DU{7AEK<({^$)cl2k!G}9uEE+5*vzAK*k zR-)&QyI(dNECcj6i2GzW*FbDr2cq*5|9g#I(po%T4==ZPu($Dy|022O*5EOrH+i6y z;Q9V%oz=rX31{BlDspb5=^Y%g6u*NvPKR#V_965_gHwme4#&5m>N=@YZ(IUJ zs0a8SBt)`jy#ov5MUx&DYLhRW*UA=C%b$+KQA?*d3>k`Ff=^}(n8>BZ#0NZZt@Qp6 z)03!YR6}&FWF)o19(l%tW=?NiMfM|8GcUE5i8Cu0^?Ozm(JI+*y{aj5JXLzmq&FTG zc&((}q*3%DhvV3iyP_(H0?RI*G+_5JSd?WSFZ|kBKhD>kev9LVt~y71R?3zBcl!LN zz*qRCnggku%^3Lse4bBs$L0684;Jr^XFRN(8jw3MwVk(oUT82Vvu8#fhsBz8l=bX8 zIXMP_^n2Quv$~t+Yx#pjm`zK$cB*SbO8a1b_UzFZ>DhC_f7FIpY9L;eRM*4RLn=Y) z(ru|<>&zbADdqk79<`@oDKO1zQ~>Ho0A3V@=8;ZwsY8z`<>Ce%hg%r^lFR0Y9c_} zhNj%s#=pD^_~BMXC9ACN{44{wc!mMCQ|3#QJ^Wtu7oIBiz7U&SQ<*-M6SsA*UG(mE z9mE&7RKy4JAZn_8*h^ucjZb;Gx|z$sL-7J;BN;IWgm(z_+T!GKZ8fXbQQGeI@v?Y3{7aePF}; zPi`>Ty$F;%3lF;!MWYz-p~O8Qcb#}lt>v^e#FCRPV2x{Q~vqsfo zyUYXNFKCPm>By@&6)cE}PI44>-9F=-w(C~LfJFp$-pIY)Y?h)$iezWcsR~?|cqC)i zxq*}3Di|5y&{gX?e+wPL~v6yuK-qhV6-Mu$~LxY^GtXjBbOM-=ac zM_Z-}^shxh>O@V0nj+(cJqU`YrrNhVW37Se<1YHp*B zUIp~guT=i;qR9rEts{q_ZUSUXN0?zoh&*=wW_JGdhuh>{#~eqDt)s#a&fE39diP&C zj*na!zJ1(jhBJb-5=$`JuX?5k1HylIJ1GlN@25kqJ~aGw_V4vN*{Zw>%+nB%c{vH% zN+b5^heX< zV4`>=do1)uFwO)Ml);1*>bDsadR=g7XR!UoRn;PcZJgpo!yjudESNI`dJO_77uyfX zX@1T``|`}q&168*k5l|~AzTT);ck}qM`~6OFtlY45g^J_KP9=f z==}4FM33A)%#pJ6t6LRv--((UDZk%TEg)XG0yILG7}LUHa2oMVvVY2Wp;SKxN9Z(v z@ z!SZ*52cCR8ND)ZRYptca35}N$EAy5xUoM+3$S@hf4r8W@a?h*2;m<4|OBbn1>xM;K zxPb*191VVr8w|pa3U?j2BI+i4T>z?cjmVj)xj1=QhYRhscgzAg_CsB>TD%u-UN_MU zB7)oURefaUT^i|QgBw*#LvVQzw*hYGfL^|8o1gTKjvZ3;x)6>1B<7E>b*}f39@E*gT87eCMfT=`h zm?(&mtYCKt%*`z2#V?%hwLgy-_|Rcu>H+JJSo7(BvXWRQVM7QykS0X-se&R8lf;h; z4o}br>#pH8ze^(iItca9{td~q7Zqq>OXgcARTGw$)Trm_n;Z4AIk_bhZvyGCqR1+d zAdT0ZjGvIwh^3c$Y5Gcbb@D+*-ds126ot7{NFc4W{uY+d^Edgx{`yolcU= z0Y-Lf$vy($EDNk>_sS!)61U>$%C8p>o^k?5T2wd+BLB#|SD9A!H?E?vsK^!8G3vU; zrdbmGgMl~_j|-X+Bt#0m4y0fiPxAiSlTK#1h~vEEwoK^F@sb=1jrk>)>dGdcs)qI} zzz|8w5w$-U2qK9*3E;dUE=TjW7kw3{HrlwY1vseX$WdF}BR0;#dFx*KC-&7F zT%}M7C=;3`{WjC|Vsbrk->0-^gbGebDAIL8^_*Qw2PfczGKPbPDkV3-DBnH5M><6Z#mm zzJ$;0{5Hh}WVIYBvAXk2exk2HVc)$r9yCFFA+Dz8uSN_ZiA4imX%f(4^Rew(Q6+?} z;FD=*&CP=*6iw{T&Q4bTsZ|Ajlf9UkDuP>2343&R%D~d#y<928%`JqCbLVb@$BfikYN*E> zkKA3ypAkIw-9Ho=!-y|ZqXGj1O%WEu7M!3}EBX8UwwwH6gdP)YDf{OopE0|o4S9Bu z7Wf$oe4vM%FwlceY=wxyqfO3Vz^pjAHtEkcEDuA%Z9b`|h$i%Tc5!hr2f3oH6g6nh z{kgL3^*il61WgU0r_(dm|H-csi%Hl<-hv`ab{#1J88lCfhlA`oauviuV0$CHzle#6 z#_Ep@M`BTr7A0ap;L-2L4jTIIi}y(8pS7ps&vXyHtj40oDq)nWVV&QJOz|h0!GVEu zK@dubQ{_ZtRU3ST?&Fz%?ZoNRZu+MT`7%r|jFg73+3(R&DiQ*K`TZS znNG>`&?R!WY`=MrIhcUYHPqWC&V;kY3vTwglrsNH3wgn<(iK|lupIB~^{2+l^w_0b ziDv$+g{*^$83cXfpV=-o*I6v*mePSbNzxw_dXs}@!YcuZJmI-J>~JS-(#!$u;M^Y{ znUQ9R;KTU@mN`8xk-<5nac2YXorNeme2>Bo@_37urivp^27hK-j8^g*Xt4>RrK)7j zlfjwca}Hx704?QBlSqq31cJ($Rw?{ni&oOHH4*&Y`_UKRcQ`RP(W8Xm+_vm$t|1_W z0lgC9!wg=w>ge$Q>L0{S{Sn;@$Ux)7V$Q(oo!@GoONso5SizfwH$DG)#^5M^Usoi> z!twj6SH!s5%dArUECMW0*QpcBW4*Lri1dRKSrE#@OIyV?yt9)&f*I>|<&?bqcDG-o z3o7lgg2xOtGghTJ>VW(uN$>=hp4f~|$gR(cS-OXPRG_BT4^NC&ew~Ju8@!qy_BQt` zV>9+f<=i+F=??-wqC5;yBH^dFyx6xgTQ|)qc2B`_7(CF=VW4*%EMTVv9&Ex4jvma( zv1nj_38p}^D1%Sv{`JFSl{q=%OLiXl1vHCXw!Urc=I+OSMJ04|$94o`$AL0~lhiqd z%aZ9Wmc8*Jrysv`r3gJ|Il^AiUvAa~v`fS=>bpO=wEN0e{ zf|&Fcxhx^*#zq;O6jP6nWC>W2sgzLK-PK|jrb3A{3v8&zWIK|{ zUV-P1-lx1cV)=X_61~OVugaGOM4qzCM+{vWCSD1g)fsaW zO8%LkfZ)2%jn!C%x4F4_v>s-@7pIAin5>_f4P=}l)bBet%;g*E zZ#r{im)DoiPT)Pbv&3Pv-#-(Di88~4k{({V$i3V)4yeDspCByPaNu%Ea+nhFJUw5Y zu!GJJafQndKu;NbZKDU+R+YRt_wl#GUYt>=gu-FELLyx4p)^Mr})&#BOaL)2KSW?pl{V4kNndE{DuCe~w5$TiU`8lxGh~+$2Md(e*f%l-=1yVd520Nd7Z}6L}$|S>WLbLwiRVl?t;;Al}TLPt& zsAfI`q;Q4`tE!qx+CQ~jBdIQl@?W}T$gY7pvU_wih3qT)`uae__lkRT865S^%8ik? zpN)%GIBGmfF*(=)%fc@cp=A|YiPdynwZBbu>|jSX2g(9|HQ(mr+r1@1P51b{QC4)j zr>H$_OCw$FS*u`IkA* zz=O1P-y<|hR&`fHPlkMmp3e1Y;D%!x+^cE!*vdc-=d{1w zUoN>{xi0S#n9|brPM*hLcqhnLa_QaGN#2P^iDk89YZT)~nja(AbhXA;SN6tT?(KHi zvTzY*!e&V`!3HewUXGQvdu<3>1AUX}38H?a_(f9(8HP+%3#V!6aoek*=b;8U)3J*e zljfGE+~m~P8LmbWf>*(ACo)fAAZ%yZbN}RvKvBW2(}ODgH+L4I@sy~n5^TQV1 zXD6b7EV1~hFPT1UT)ZkrPW>QO+167^O z&+7BVnyV+jr7o;E-J;SRBJQ|?b$ZN9v3!$Rq%n@O6l?itc6Ys|UxbudnZe@p>#MlQ zKJTOvEb-zrbok9IGk(0Vr+6w%<}Pj5os5h}Mn+b}=K`(Br$>;SLPWvx@O>>D_@m;8G8n@@<74?l>sDN2pB|P6f8a+Aj!fg6L-`YPB z*Z?01-N`4jcTq8HXRtVs3e9qlD7u(MvM1qZ==B$;{`UkNOeAY%rn@1nXuNwJ}D=+>qqG|m$gn?FseX!iM#SOCk zJ^Dj#QnqmW*6HNNaOcUV3CnxF)xTNb{z?L{YU!r;wH2>p&n0C`rvXf#bOnh4ZT<$@mgz6@cXe|@PxjUM2i_f(MNg-MTX|NRGU4c#9PrN(yc4#{M08(8dhGM zD90IFBy=u(iNr|@o%VQj*djx1+7)#6MT7MAqTKq|v{!`$^dvx>y{-;yp>U6@Mxoqp zxO&QtzLr^W>Zja#7VRx;E@PH70}1#EmUAeGh%=17gP)-{_|Y&QzZZ`TZYZ5BV&|Ig%geFW*m1V0j<^WKeX7=J%#i$I7u4tl#9DlW^4mNzSMAoSt7?H}iKo+nzdw5QO$1CdDE}N5*$Y_oB(M?0ve-5$ zo5)uor#M|hEZx>^;Nq_(%6O32J6K4aG+sqf>VV3ltHA?_)|JRLniKcx! zNq;@m;6L1(r`gUHL_l0Cnf}T4r9`3Q0G0>PsCd3icu2Z7X;{*7fgqwqX^-3$to@qr zpBlRwj0S18%Qw`fxpb0g?pKm(fh>FO4@(mVJ0;_ZTEq``K8zz*d3YL~V_P;X{uRjn z&5|mCw1eJN5s{VA?vt=zt9oatsx=j-g%Ne5Bzz51TCeiYLGCW7pRNIKW&>I<86GM@ z{?6T~i!&|a+kEs$dYscw4t2-50__L(&wLzMx67yxKFYNoG6V#Dk^Qo?Jf2}5`6U}# zfi2iP;kTvB7y*|&msVWttu3nJiyk*vpRCC(E4Y`g!?<#pOk^|6z-tO&%AVG;o6Ktv zaf(uTxIDq0r;E)=f-E4|aEtN6GV_5;m3FQ9o9f%0=QZ4lENMb%^rwHpW;ZWI`$ojY zde`LF_k;d0^6sMH6FqG#`5oD`>qH76fu~IhsWa^m*n}JSxza!;rY(M#pY;h_QiwZi@fiZ zkvOzxKSH+%06=Pxz%`laCgy{Rn;ewUwk7;O19noMC{8ciSbWoln(>j>`}?-cDh3pn zL-iU8uUxZHj!H~$aDC0JKm$-SraST!jRecI>ZZp)Jr7rdfOqjj>*$bE#$t zb`<7`cJ3SK*uV12wCqag#IwEe0`7KjNwHqP(gSBf@*L`*#1? zDLKXkqz^YEO>yXDWjgz~SVsk}J=`Gk_nQh*DT+wBccfWnV7JN}5gyK*{f+NphvgT; ztQn{p2oZsE3(n7G%x-fl$&Nn;yH158&7GF;AM&RClQG;rQLmbwVNLw$T~ME&b!%b) zXB_O$mcD%)%3AFEu36$9d938iQO0&S11b=JOc#)a_*}JNbl7fx(t-iICH7P*R5Wwl zR!7sufgqw+8(XRXglI8sr6P=6)4c=3oy^fh;nB01rg9hHT)K{mqNByoTpacet>OR&0 zz8T{Cy;U|>mWO16unpu7l%8*lMoJEq2Vyf^yvUF%Y;z`^!>?7Lft-bd8i@|m`` z{XR}N=lhQ7DE6R;F@LbZ1NeZTAv1$aZm9o2J;8|pl@#K-+Y=}(OsXxZ$YEUK{sY(M zOHd&s{Oa4@r5xNj^Ojpu712!G7W3{OS8;?EUt*5M_ab}|t2(etxF94@Lb|pZs+DfC zuW0+7>&8k#(ekTRl@WYYn9cC0oNM9w`e?z>!DVQI<-G#b$_$XT()5=43AK3L`_I=GXLx#BDvw? z-z4bL5mB{3Wxa%4DB-LpC!$FwYhhFEy4bS>+CZ|;(?cSbHtE$0wqF_k^&0@f#egr? zzUG6<+V)knEf@HN9>Q4JYcn+m>>f)sQ>hbO_6vDqDebP>V5iSbO3#X{TY5>EL{0u9 z?i1p3bDwXjrV?Eix(ICOfXVC`;uLB+%2-bHX%J97$-Ht+4-7v=H|g6MKgs0FP|GYc zs|hR-bqCw)03~kGlGXV6#*v)hT`xs?5o5r>%CA@fCrVmv0Z;G$(UxLqTPSg#w1*^m z+WyDF>x++bqZF!_#>DF2`buDWIfpKcp-XEd&>{e~z^+MP_%QOyesOftsdMkUQZa$| zY{X!PcorHfNB>LuVDaQOwtxrLJpzDbL_CV&R1|}m4?S5vFuJG^wg+6i-ur${-Da{w zCvk)w8KrGEsy80l@Np~kYxC6;6nr(AW2V!QKTG%W8GrC$Z%N_Mk z6QH`cbJGYXi{qi67rIShlV!N;)7JZDJaxc>&w83%{wtpEJ@1i7gQ%?{c>thXCg{13 z68BjB{6oFic~6>Me5%IR3_cK|(q*SEey}x|=R~9_fWp9H{~ zTgxDx>*;c(Uw?MTf5jAUIaGeFN8UIMxLCon1ZWR>f55v6it%p>&_B#6haA~0~`Mlg@)ObU4}0h z{3cMPo*u|ZGpu`@n%}?j%kTjekR)l$zA+}u1<@M_M*9TR=c#eEqtfuUxJX-P$hGW} zx4eKS{rvsl9~SiY5zT3H!GNv;PvL5@oUDFF<+-xP+tUM{vzNbqF?`iuRbf*gB)bEY z$SWn~BffaX&CWOAGY-_KmE5m}+Fus_FADGdLkrclo%{B?f0utd8K=C(f&+wRGGAk6 zpL^^;32rky2D>G)7gDS{ZOCq?Dx1Gl>f(90YzDw-?Zw8eQ(V=j>;Zx{*SRt_*k6$v zk9+)Bs}mi2-xF+sRrvV&&BzjbTSr{bQ&tAvpuk$`$COHyp9EiO$(e}9KzeB&Xxuz( z$y#(c8c5Txg_CE!JUQgRa5sZiP37tslSu~+#LnJksK`oI9TMhov&Iw*2bKy=$K6a% z5*1CPGc=7mTX7T(?1k7&09XH+o6Dx`<c`6ku(pk0B0)exPoSOD=9AQv7{SC6vl2 z^JNIuaa<%AL&KJ&*mv$)$YLq;pYp=4`)fdDO53^Pg>|9?jd#^jzkrKRGmIW}=hkhbZ*<#p@Y&B`O*Z%Q03cMyMRumo zPnYcmhEhAdw4l7FWn=m-Jx)CAX6i*C%%HSG5Le%FzOFSNU8{_+k}LSB+ZKqUbv?9Y zn|jgj8o6H5TOf>3ZH53WQoA+Gj<(WhYnq@UwNpY1vIU8)zankiX{YW$iFgrD`C;VZ zru%wzy=E+2PdQuQu-uTJR>>`r$d5bIpcg{1Z~8dRPR#YClOttLAu7O6v{pPfxBe~>6Ym?5FQSZy`Pd`+@$GAjRk6^5UY_M1OR_U=mMsvL*P zISUiGMS>7A1irT$>L4~w)gMH6od|W!K`z5CB){la4tUhr zV^s>qVbw{-FPdU;KXrGy6JfON&H;!>-Ar*h!O~8yz#;8 zv)2V!yZ6Z&pwMcQWC75lsbs@qGC{s|+*?qVWxL2O?PJ*1l_Fv+)yFalEd-*4k)*vU zi$GY43c@cxwP?$qt-8kCORwlsvno_!r}*O56xM14mOtWEbE(w+cC5PKbP0R<5+~#B zL3-nXV>ZD?_0V9}7j$FShsWYMqnm%<4(26&b-*%99H`cGwdYv=zyJOddp+tUbRVXr zb#_bhb`;}bk=jp_--*NSHy95HAP#bEoXacAFyO$+Rt(o+ybw`@W>WRdxv3{oA^V#P zU)L+Jmcjl;t!V}1e805JcJ%*eo{5JK$KTd`BTN5cGk5rzfmtcKb_A%hsiT}17FiMv z)J+!JGOO>v!3J*4aPhZa7j#6vNG_ZeCwc6-aR@A&?3(UvSc)s={=` z^kTQwC7>yIv34Kb?yN! zAaX&V`Mv8}&|NAf+QesK$%5=z>ib3{03s#UDm-w_;={wwFpz_;)1$whhr-Da&L8q= zwkk7GLKF=y>|^ypaf55dziv`aNJ{D??t|;MV=V~pY2-1OYX%}qq{DNoYezulsVQv5 z5Jy#VF&ji~3FBqKD?})`81NViP^BbZ!~R`>b;_P&E<~LFrEZ>DRK%fLB1^iMNZLam z_u?b(!N|I2o$V7jzp#)Od_AKFh8=iMlw1B^zRI z4;)I40u#&A7y4Ic5PPqGS}|CajoJF^O68K`!+Ge;CmgHLJNpR(7uQ8*XK5iandYC7 zMH3r7>)jQaN2^NMD@0cP=I3bvUWWNE8^#~!H%O2{O}rFy4DoVz%O@*{nN<= z1ecudE*zMyrlA`h@?#Rk#<_*LeHbB>k9nkx;iHMds|M{ADN?25(cli*ZjvG?q*wR+ zsjoQszQ5a4)S~>P^G?mX4VO4kNGKRAYocqj7H$hVUO37r{uT@dKvGTpMDkz?} z+yCcg?lMt3+k*4+^K^W%`ksuIbPA48SR54%YgY26zw2t4-f~ZfatgRrXN?1~vfC~b z=2w3uAmmOJQwi+tW! zCgtj-l_eb{je_X^d5fr&!5Mw(g8y31s!S*LK8DGk)$I zA9W=>`g&0{cmH;4J;A$aW24iqZ*V|Qs9uxZKB#iBMut>ynb3b1oDFWfASuk<6va;u z7z84mgg3wa5my8^3|qiid)qZVCJhShou#qyjo-!X#|LQ>vAjSXC}B4zYCS(AgVUo! z?md%YjXj|ZdPW$b%P#Yh2=d1fQi9uf()Pu?4Y8aR9h7GoeP@@PR`l4X)$%9frutGH zd`~7r0MNs(Uj3R9hLJUY(MF86puTPN;qTfCX$CPkxXszN)VWcavP!`uE_!(5{M8tZVbD61{j+zSgXSg}%h6s*Hw2)Ap<>PTJ?TA-@k@9~BXtP_?F^ z-MHttz4!J*r0+LD9%UBSgjroOc-V6a^KDX1+xnT`R{rf#bl=Xvt<3dID44hHeRSBy zlj4oOu3L|GF;#yK>pzyhMlF>?5?`8%JRxrCKt0oDm-#jvSfroIAn85CjA1* zVX-V}RjwUHNrm1|%7~wYrCo&v`_VdkKhm~`#~0<^2WOw7a3G|Yxm(c!VsK}h)bpWn z{6VzB|)Ik!wwS|S`e zgibP-vqRD7X3^5fMo)jD*iByH6~BRr`Byyz!}d zaUdybyNWHaL`QR$hn*cF9XGuxG^g&QWmu!ErEc>xV6DR7rBwC0hD8;2dMT^n&qtK_XW9F{GC>nyoMs7n zqa(eBH3q4wNao{TOp~q&Va$Zr@WEAahmBU4a=6Xb;P>$->++_;p5IAEhIl3yBt)T% zm}(o>nO_12?o7$zwRV3SWTV5<2(TB-Eqt*>48&cF;nH*ACkM4=CW*^6r_KS---D}? zfqH7n?~%@e?RjdHa~pEI;ptFmCIk;sXZ-yI71m~wRQfkFfGPRm_={0rv*Bt*v_ zMiv=DR<-D1?X&=<0;dZ117Ep?fLGS;L0MYB^*7ZY1SE$|HJZ02u!W{_6`iN)jTUr= za)YJ1vq<)>TItev(uV2SEK8P27C~S}2o98YvbP=36>f9f6(J%pn)*a$btey8YxAS9sxfH1S~>${wY zmcRYOPREX%imAJf72mpPUqP%tfWrb1d?d!GPkXDYd#kAb#m5GodHJsX`J!in(1rp4 z!rectmy3ud5YdFuZ*95cgva;7wnK$iMO6Cf>KbHM?u8M(+=5 z+-C+piWl?<1psu3F%}@A*+euuWj{8tS>x1yvylzMD(8M!2qg(0sy*~a#MRZ5j{mjPkpd#fBcTa-sjQ|72cG3(A&7& zhi9XJI3|fv@3vNFuQpNNc5K|}g=g>Rp0i%`Pyls=0sw|Gc4()gM06h!-S_l|J3Ab9 zl}^e!QF{H3oWiDf&=6=L+{`GcL$s@VymfiEmXR+!c5}CVIIj;zgaQDDHT~XR2Z?Ab z5sjU*G^6?6W93gCI9Yn*?*|Iok>}Tna?43aMu2CFBOhE?k*j<_gHaab{;;V5bCc((};>5t*yH|Hjn(G zYttrgj2qsv7>D;En4kba(0OZOr!pd%b>=_x+$R}>a`H>=JCs*?*|uzNb0Wgg0XR=& zm_%J$MxE}|BJ$S@nl^fC+Fd=?927kifQnE6An3g~GT~<;`k9C*WpReJxg+diBD#`@ z1`|;qBEn}AgeE@`r4iAO%^hLup1Qg1Zz&@ZyxT-i1)vcW00=25BNDtRL_g9W|9R%r zsZ-Xlu&@D~^Gg|Hmk`nAM1)fY!O2fV+d1bO7-Q=hV?Wz$HmB&J07O9nfRNU-X;Uu| z{dDF(bfyqoe5MfeC!+pDWD_|f$mS-Z&7AX1jIs5lrKP_$Z{EB}^iTkLfdT+^Jc5nx`#1_dqV-LfdT+f zgELPg%slg-kBEpk=N6~a*;$gLBqB;8q9n#xA`w}|O&U_XM6{Q4o=HSoIp>^k4u+f&u_gPmHn3zcw?7XhG%I^YZdqS}d0Cobv?6Sml5BBBE$fvl?6(=llR; zEQ52N$r#J<`~8`*v9Y_)6f*#502BZKg*0i>B$tSC>CE*6L`0l(=5#vaB}uw~G1ifY zE+C={NMcEn&Du8L@rLv*iIUCANn$xfluATdM09|2o)riLvSMRnkKqtLfO*TK7?yluj*L{@&)P(Yc~$1qf9r00272IX4}D`Tb7ZQ_v|; zTGpOQ%31}yMa_9>S!1g3*(kuR0iVASD=CfimzG7aa-W%(mRbVdVhdx87?Y%c=l}PK z3E52akq0Jzp8u$PzJLG!|NHm<|9=K19RBU8vp>s6iK8PT}_ez0000< KMNUMnLSTa4PJXBW literal 0 HcmV?d00001 diff --git a/assets/icons/fire_station_marker.png b/assets/icons/fire_station_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..d98d46aec7aca33706b07e245a71b5ee4fbcd8c5 GIT binary patch literal 16115 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 literal 0 HcmV?d00001 diff --git a/assets/icons/flame_icon.png b/assets/icons/flame_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5836ce8cf0e46b4aedfd4982d69e6a30fb645897 GIT binary patch literal 9133 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 Gh5R40SzGh~ literal 0 HcmV?d00001 diff --git a/assets/icons/normal_icon.png b/assets/icons/normal_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab83a4c3e7ef8891ff31df70f31657fe2885591 GIT binary patch literal 18883 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%0D{nB6j3 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 literal 0 HcmV?d00001 diff --git a/assets/icons/offline_icon.png b/assets/icons/offline_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4cbc902324e96584c0c5e5a8d3cf30ec5572f1 GIT binary patch literal 18918 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 literal 0 HcmV?d00001 diff --git a/assets/icons/vi_icon.png b/assets/icons/vi_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..249be610ed28dfffe412cad319575d25292b984a GIT binary patch literal 17434 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 literal 0 HcmV?d00001 diff --git a/assets/images/background_bottom.png b/assets/images/background_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..663b6b15f90fb987b62790e5036fca55970cdff7 GIT binary patch literal 5682 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/mvvn_Q1)8@A&#*tqszVbEk$Lx7sefP$| z+WK9-80_>f!yKc=52Q-G9u>A4l?yD{`HR-P-aSuyOOX+$%%ttLucCLM^?O!t`j~D(NqOY?M`uKR=h5DLG z>|fgT5Ee_=6bv}39q{-BzG0#fm#DG9&?3?=M_{GXmp$)$J1sYW>9`*3DY(|PVdqVe zo|9VH;FP2bxwrZgS*Yz{a!Q^_7ot4bj;dg57bG;SzHD~#{&N;a&Z#}Wzq5E{3#J?` zkDD5@;Z_pw405Pn?J9z@i$iB?_Wpxc4V)kHe-&m-s?s0m5}=V!__F#^^UPd0_yx`F ze1;!{cBSqZ36AK*&HFEgv2`jW6*%&(Tn_?#qeN#rNQBaRm&cdYJ$hrTcw^%%$ZXm z&|!C5$U=J@?kjug4Gk4bhkf2Sd3v&M|bg&V~1l|vj{s)v=lcttkm>4Mj^*hxM$UhC^DD!10!bmCP!^jHZlupK%Eegw~ z^S3Tv)RFv(h8y(0+~1r&nbY=hTyGkpxGPk-alIW2&HsAO#bR8%Cq7V!hN(1hOzLcN zvvR3n_Q=qg3U~Ni62J#WC(K55G6t46B@Za!rh0=8h!dJ%3X0kukD$(0o(HHG4x!bgC1#y%n;grXSO#gj0oqR20N3|2N^eavEOM9!d<@cQBeY*T}1!PUt zvatBVKd^{G3Eid4tQ5$u3OM7hs9^CZmk*WWo_-YLbk(1?y(?ogc$_7eoP0=U(PR&s zmpD$|duEJtF!Ba9YdkndNzhb!X2uNkGSk&0S8fVQ_E_~F`ko(|ATBSr1_Xg7enKXf zZ#oV#lgBt>pJq$Dz=V`yY$VYUbB(uNm7=TcMhZQ`_UwM~B+b zN6mw!vvH1LaSxY0SZ1Hr*&vS7c2>Pl$x_GL^D;6)+vCr`3-^Eq1lz7H4&?h&>>?jt|Xs2Lb|6Pj)nF16r;fg6wF z`E`G=!ftQE*$)F5;{|V*~TGg2vNcwn}6@SsOB_xY?du z5bju1p4OTVXHX%ocyX;#6vC?Iht%wt4_DyO#4KFuQ?tMMa;6&z)2FcJR8ixeM65wp zuZcOA&(hTpX?#`Q$|BQ;eUTLOegGUsnOda*2QN&A#2(_`hHjdG30;O*BuTWtK(yxBY@~B3EtvTaVeuUf#70tZAB> zmgywr(_aIHt>%f@SEk~iOa0n-w@pA+m$C=iQkKTFt`VGTE4x`$K@Wg&|M^}mK^`h` zXLmd1_5quTka`X9nE`+=F`_1x2Qstk^d>&`#*1sy=MR#{@PrK$cHQj9trhA^Y{b2fC_`jr+ zj~7V40fh_2#NSpw^zofPjBgwwl+JD$CzlB$zU-1|)gK;rHLEBEk%eDsXV`B&`1EAH zHjk^AeFP{AkZ-itGIoWOz%` z(F-CIqv@kVL7r{Z$CnN(zq&04+ckK`x{|x-=q$N+Rhcj5a~N+XbLXi;p|s-OZwigD zlS*uex*bsRMSrED5YE8|dN~HLc=K22b0Zq!uvGW5rsiEa+-sakpIN)?mtfQ5OmveA zfv`8Wh#2Y4Yi>#p5SMCBJef7x58#mJ3Fs-jJRQ@>0bcJW`(c7%h`!X>@`Ar*Ja@*e zRgvoI{=zTQ2Y?Ub`IYJ54I(s)41H0V@UuK6`h+v#XnY#Z6gUz+B=N`eshwFh^f+zt zAt^90RPE9|mbj6NIHpw7T^J!hU}1FJS#Z@NOd-H$r)N`((;$6j=C6xyBJ?2+v`*$+ zb@3CQ?lnO@B1}e#;Cqh^@teG&=fl=TtK@us(!#>aw)0mj12-YxAPo+ z|JL`k>D>PqU;o`t=nrP(|6+ARLH&zxficSnq2pmzBf^3P*J-Znp-0kUU`JqZIIM~g zAnUpM8p}IHnU|-9fUpuQ3kkUCBM=2*ad6b!#xEx%XN$wCOI41kYJ^X@^0fsntC1Zyb$z97h# z{EqIS{;YB}_4k<&-Ct=WKKqLu!xtHdFSAI)@=u152V`vY`^i6)&dzPx8b90Wy1Je$ zie_=seZA)(#nVtaBa#yICr|Bi84p|fCODLd&Dg1`Zo~mywp45RF$m)Zq7W@1?Ays~ zAJ6z9ZuVqM16TtRooZug|6y%AW>LOI=TP^-u0J|+&1MjNzLaW}TomNAK8S2Q8hvO}9x_$Be~2N=?g>FW7h9QNBZN&# zWY+sUMy>z|W?WAi!H@f&k!Zybh4EV;&cz1n7sa7+gZ!Y~m?M`z{;}PAB|N(S5QIx~ zi69(%x|IwA{RhVifBv>)yv2Lz0uNl%@m~00;f;+1Rq^M+0F1THveTqvaa?sh)iyoM;` zgzHFGQ5urIDIu(J1agUllxYENa#i0TGE8>D$Rf_hjRMS zV!>{QUf~+u*?oue+^ZeLb#K1cy7>KtrKmu?1U7>_qx10 zYB~YOrnu+~4oowlcSB+k9Y6Kh*7(G`vsJk%gL*$%&SCp#;k%kC&63~gtMLoo=r!@C zU7i=^H@KC0l!ipTnG1VY>>+j}+!OKa5GdEN127bMCN|wb!pAnw&OjL=?{@iqH=P>- z=jbxY9beJ6yrr(!z0<}Wr6>JfsKE8A>9w9e5@t%d%sxh>F*|wf?76OvEzWkj*BiGt z%up~a?zWoFPLXP#+(LQUj=TfNRJubT7ip8*&k>St^T_!WDo*DpkP}FyR{U+%1Grgu z#`o9?o6}Ht26N&zxBk^tUG^t=VY1L0v`E@Bd01@|+u$_yIq+6EAWJr$sA{HUDt_gD z6P$9m5(NrXE9|1R!%(>Ag{4c4SkInL5mnw_RuvU4am%O=d zeGB&im{&>cOGTs8#mvY_TTWTP(@9u~z*UelZh*!UlUC*iAa-k!s))7pT>eWN7P&W2 z1Z~(VF|F9`FRi86-WfMKq}i5&vVvlouCxBEu1Z0<3a`dAd{zu-e?vW%PlNmMTCd%W z2P$`^MI5Prr=KqW4Tdh0`K)cE^WX+hTSRgQ60!1F<|Vs2#kaP2c0tVdz-_kxM;^ea zi#CfWy~}0VMtyPs_(I-Uwnw**}q-BVQnK8g5<`&7p=5dYf1BH_|dr!iyk&ncxBru$(S)s zmUogV9B#I`$MFcwqjLiy1%8-hx^B8S8M33}<%)TD-Rb#9eI`r@%hm!%b>>dg-P7UizSZ%n$NK8&(l{=*}a$A za}(mqG5oi%fHlU>FvJRf6-a=83MwUdIINbjUgkj5OaVzX&op=-6iizjJotk{mv zLs~j4%TaYk4%pq*=n3ifX-Gz7hVvQIXUyOX+)^-<9;A`u# zLw2do1J+uv(^;F#Tw)&6mAM?0ZBvp4@IF96(FV{?sulSA^V>3|0r zDU@a^)9%XxElZKwp4ARnlL1+$eisQtax6oDRv68$;6--ZzGT+=Va>E@KCzCd9CVO^| zbEtBJRQXtO_8wO@`OQV~_JjbPzbxuNCjd4>QFZ(Gq*F-8Tm>W`K@94HE9Z#&68}^d$dFsEo!Y# z_U-u^0cm$(=`|3=|CdWwX8+L5E@1r49h>VBAow@8(ehs+(i6uRkG1dmG%M+s2y49; zuj563GEpppnFG5&BFf72M6LC}64jTpxZAl~w4?g_ndQ%Ac zsI@oo3*v1?z?zBUy^9=ORFhoi4SllveNnT-Tk*jw$K`QU{ob;~e+LxFOL6>{7m|r4 zZWLBCf4g6PvqCrDNq8~e-=kGY=;0r!Uk)?2Nd_ z70*UWWBf}`wB?Z@eL&;!X6q9uUKZWejPEPp%)~M&2`|`0@+*2B9!*Gc`N&|5t{7hQ zVi)Z@KZ;_O#ow=NnJ}Hnjl{=%fQ-uR%2tG@T(quGqEMu1)|Iv%F9x;s`A{BH?Ho2m zpHm>EIRR_<)5nf2r7K`ejP|mlp4WdcknWWS3j4=YLjB?^IzsxlSN#3H*75{i2%%Nzx=ePj4t z35rao%)P!MN-1qFC_L>;HZU7mU3y>$4ht~hCAdyO0P@4Nj)!XDBn^0dH=Y*Qv0ws8 zrMoQ)kYupX?EOXIigGECZpvMa8$~T-5A&_hPFgOz0Y=>h(h9+z83{|DoUz4=hlz5S z%ve+xZ3MQn(ZGY@EpFuK{ZmHnC5zzO_>M*}Hpb(SoQ4hFBrM+WNY5!?a8hg`0WY5? z8{&AY!TUJ5w#dq4X@*#D5LmCYKYQH%=SwGDCABkTrE%mIE&POb;gA>cryJ0cO8Vqw z`n2(0xM&v+V>m1bzjE~ORa!yn#)nh+MezRXf88KKd^MHB_9YOA8BiaRg4}vM(21Pb zO7^~ZU5_hvy`SzR*R%*d%CJJ=C}{RY30Rgd;D|Bbt=I7lutPdghE{cT41eVJ(dqfg zJ4OS2Gb?h&t^wy^^=_w?a-6GGM-2y;3+wlb8+6+&0?r(k4*d>W1ha%W^mP7ZCW&i-aLP!I3(qJp_s7! z^I`u{{YiVU!2Od=(p#yW1&zwG9*MnZelX+J5utjympNBD@cXABR-;i}lV{P2z6LQ@)BciO=cRnH~g`V{nnuc00BGU8B0&+e_Q?8+_l- zT(q{ZWo=ApGr8+6`Rf}@29YE`1Dp$Y;T(F{)0pD)b((Uqz|@EBX{PQ zF6DqyB4YZDL!t4`yRp|zfcU-nWq^1k_)8O%Ff+CYzqHP=|8W&u&kHH->TZ$c11_tS z0f~>8F?T82*9&sxM6Lo=fg2X&vJ4-qoPo7=suq;fyxMb@qNmJo(N@czHke0F^CF>qtwNlcAqp&I-9eF_UP88enU>dN)d3b6Y^a- zCl9?L0-a)Z(D({qYxRwa-{{w|1Ky_S3va_+UDexGZHB9+a?*{OK34Ds;FS>XZ24-( zg~{}%?D97;q3bgd`;H4!bj@J5(#5_ikpm?TX+oDRVnyn^8>D*XI>>43BKl|odSK>q zw-uHB#C=$OE?`*u3pSf+0ek>d*XiZK6t2G%U3J;ew0Mf--RnSu{EvFW^=2nLj0-Qu zEK6}JWnE=1_hT`}P&Z$=G&yk{tD@!pFcWZC_r3N7x2J^6EPh6$>bz4M%q`${86f-H z@GC}*exJuIHase(G+gW~0C=mo@h8?#5GoyqV@Y>K^0z>PQ6g+`I*v zON*+8%?u&e^@CiDu07m>)H4IXWBW%HzL%kFY7EIW8$K#usxGi8+>Ot-sADgL$d|RY z^MU((VvC=zcIuBG(XVq|wdQsn{2&`)2VZrENuh;uUb2j&l)rOZ>dMq zTg7z7TBd?BxsodIRC^2K#rl}f-%x|AEx`v(r1G`EVOg#m5+?1*)Hpm>X*T8mYN7}Y z3+aXfGV6xJMJA;82?$MT!fPJn`!!D&FB?Qt|Noi{eM++>W}tei?vP`Y#c%!7853kX zCztz`5w1#o2FkBjeLT>(!Ot_JhG&_cf3L8bFwM+*4NnLVws&pBIe(hVbp8^j-_FSC zT}gOtEw2h9e#dHZO_UVnu#L!ns2)>o$oC^c(~9go1|5Q_mD~^ zaU_#3m%wC`T{5H_K#!!194)@qnt^S_Y>xN3U%2dQ@E@qGAp>QU1yX6xXa4 zDZs;Xw%7}x`dxJkVtyRO4KAN@7OLKs6us@l8m#*ma$In)I`sJkgc2wGs2j!4@ma$3 zISPl-_&38DYRAGr?b7}8y?6Lu<&^7((-5+0>fH8e5=%#a4^H`bJg;|lkOuI*D^Nt+ z_C)%ovw*NQrstm{4NbV0+qC8s6Z^mcs?r{iG2}M1pcF|x?Gg=wWKxPP8mH^7!)`#HXn?WyVY_>(JEYwvS=F8pM| zQ6?fu4&`S837dirp0S-CU?YB9x`BJr5miHSt5>bTU74GhF-xb*y!9Gr_=UFF>ObD| zA?Aa!QDJV7)%%Sh0K$euAtVX_SZziHUdSD+U>Cg2;FtyQ#P$0;UN~KFs=#s`2>*783ahEeR8G0aaLo_O+5j`h`f>|_1w`BvSCun0D^O&^ znYtVR5#b|^V178sO-B+>klz@ZvVQQ~n?o}*pTFIKuFKhwC9JXj0R$dRMx9HgwBciL z#`S9=eqgd$?YXfWWOl2kca-~ca=pQWIJv7;6w^z(lF;ethNq13p1${X=-{&#rwnrx zLDJecK-U!B#IjRe?oK4p1&S5H8;Ag1vB38an*=CUG0F%04bK?qw}+qk*B@~*QMTq& z#ELB^Yn;w@P;9{N)QwC(yoK4Ng?C92IOyAYU9ltcEgA@7pe}mE39@Tm4=&pZ?I@CH zce;oleFb)e%>2ybjz~XZ(BjW5lOhZt%{}P}rIA3XuMf~s_HPdT;;LTHsxSwClr0YQ zR^PQXDYbuw^Cj`*1pco)iiY-@I@#GnUIuxfozQ(b1G?P*u`oQZ!S*6C zv5(C#wSRb+|5YU%kZ>r}QO%$jh_=lRPH&RbtKgt?Pxo^l8vQ!F-P~gnE7_ms)|s)S z+S_>B7M4`SSJh+bMbX1JC>)$nesmFf+q?&W-Hm)smV)Zeg1K4zNGLVjh66atAGdAT z2VaGn?jiOsy54iOZKi{gW z_P2gO_lI}Gb&g;_Q1#3J;c|S+gNDOg)E?^*JL&g3eEu=FU_(!S^tWfs&WzjKvC6FR zI*JnBrH!OhM)wxnST{K1(w4^(uU5-!?2gffR;9u2w8gsL6%M9q)=}Y>4n;{C;Z0Rb*X&&ibUl6=gI|Sqa)AlaPJPU#+#^r z)rE~Bc5sq{$OSpxO!rG92$C_uSH7g8u6UBkQt@zp89Av>TVfhULtM2Wt{R~=bs<0K z!aj0*T--~Xg1_zVX@9B=$EG^B6yJBjxr0eRz24?;N=(rUid-Bn;*QQ0j5}jIR_s*p zMV;&9Twe}u?~WY`B59Gm%O{Sxy2dM6$L_qGHm|=hiksMjHcTvJFu2#VQE7g~vM*f) zw!fyN=$RYxR>~?W92@<$js-W}q22cerw~h@_`eKnp`?$Hy(Z&BJ+l!!9#00E#o;bV zpzR*4H{-{XzwQaxSkOw>ofWXAX*gEK0*kS4w^22C^I&S@sr+D|5~h=;8bc#vdfk2- z{R%U|U)g5(D^5~&K7#yyPVVpD2L=c5t{=H&&N9`<`!dZ)1hDl#!6&?XM(I4!(jVgZ zYf0FjI?C4jSEnA!K$?yAiJk8oQIrkBm4nTj> z8;w%g^8LtQL+EebOCgK&UX8#MB z7;vvz(?0pHy182m;|RE-qlie>prkP`<++Pjc=1FwmxaRrZGp(vE8*^7XLS^hD+z9{ZF2jpCcz zQKRfPfobXi&aV%M4d1Yp-a+Y>j-QWT$@4y{AMjb)R!ke=2a2Jkadte#c4d^2cS5HL zyePK_Sr#^093BLIR%+>kdpZjmxgA5Da}cYuRZo{tE$Ays9Zwa3Rib%#A52&6wK-su zYnno|Oc?vLwXcjZ48q2Wb_yIIWAnTCi7 zCqE~>u}h)PBfo4Cwtc{*IgJv|S`+L@ew5S*JIL*W#Q6}|mj|&qRC%#j+#`tNra`V> z`>sno%pXWE3r(A18cU2ER{F=7DL4I)9@#M3F8ZlHN*+xnKlaX^cYNR~hGC}bjzYLG z*vj}V=^DPe+U2byBNF}ssod5%EeyLJglUSNPsUp~W^(g!9mQ1AvKwc>+{CovX|sZs zL*&@hG%{~}+Lbpn&vBHhg7|L1-1j^r+3Lx_xB4jf;H+Bb;2~G3ahd5&zRe{f%IaN^=U6UdjfE_%|G?kX@&p(LoVH;Oh+`gn1=KQboX*NI{lbtpG6b*t({ zloN*5Bh^&g??)L8Z|zeKa{cDQRwC1TVf%C!4^AucLLPRT7 zh`@ zd(0{}oZkrxN21n~(^8u>h^x7tSw*0xPvUOJ{0wLwfYuzM4YXo6hIL5Ta4n4D-)Meb zsN`7G2)XgiReJg>xThM z*IEYA<#QXx0rMyPK%URKt1kie-Hh_T`OU0_b45EH7jw!_={mlSH9{4{4D*#$$4z~$ ztkO?3hab*S4Fi{Rzyg|ripLk%r`1_X4Apu~DR*)RN%_NXPY7I5$BJ{^bReRjz862J zYc(^*t4TQKy6f#;$yr;+Q`uly2-Bta@|V_JMQ&EiGn$Em){8uZ)sn=07OLuOm)mm@ zV&`9zuY+N*D;EDay@SlAFciZz_171mVUzZAx#Of8g;sVCa@}b-NNN%X+C)2@|cEuC63yC^l{G*Aa%wl9tR*y;Pk2K|

g+GSXr9QFbjqpC?wiXMSg76!53`Zup*Ea&~YnSJp zWmM&MOM=t%=}iDaTbmB~X%OC<4;N&1rUk_s#l z>*Qo+$y&S>)q?%8FxYtVX4-#_XHh(rsHJ2}>;it#i4*h^qsjG@q#u7=xvsSn-s_i3 zt3@MEPueG;Z?Ef?Cu;3$iEXZNMnd^wE0>iS)b!Ee&x#?hsyfEJx8X?*B8 ze(pc*pMKjnR2mh9z*7y<$%oJn3kWuvXR@KYMqZESX74fve*OkKbIn`B95lN(XAvyuB^~cSTFQESsc-!=E;>0~nQ0 z39i~NQ#8Q_VNaH0CEZkFY+(;wZ%gF= zTXejW#AZECnBSOMPPoalwWR$%wu_C?RN#@H zqrRTY$&UY9*QF$zk?mm08a5yVd?~JAke4b#DB;A!+CQoFy~p%6 zt0^?MJzTIR(&fC1Bf|sS&;2MS!bOl8B|m)yy573bfL?DqTw6_4sxfL8`w|0;lD@;_ zAH05V7{bM@(~SlB@X0(%BqX9A*Eb2V7%eC*23|HULi4CDG@6C|9(CXx zMW&Sh+J(N)=erm7;%)n z#@(b@x3Ip3a+0_E9nSnqyuylddqm$M0^OkwUFoE(QPZ z*yvV*dwQ^O%3w=3(?vlN zdYF%u+OIi4_(rP&BrW^9kMND;l%)8RcZ7b8y`N743*3M{Ku;GZl`yXZ8OvRZGBs8} zASI2w39|JT63K!NaAafj-4Qv&IIvEL{?t8G4TBeA3YXqdHw1>Ij5xoYoCB{p2W_tEr`1Q3Qf_h2KP1&*MdKC1Z$9Wph;MXc$|n zS?46ZxuhhKznI|YU7t&~s9MaNzBt&>8u}N13V>cVHromUM0d5{)QnY+WL>lH_Gep4 z5kh>>b)hcI9(=LIlTb=zUjo%2%_uF=L457`ChiiB~ucp>Gr`0TNMc4BaUgzLp zh$toEhPOPc8_w92v{;YZ*Rd_{(H2x6P!e^#Agf;J^}D&K`3q|Y9*L)52{r)%^f@`g znyF?jAqocbY8P^3k9(?0;d?|Wuzv|cBPhN-V+^<7Z*wDmZ zeos$yG1^57sI6qBQJ3yv6XISXS#9sU2to?n=W1Xtt&n&)+&W#6^_}gwXF0u%8qf-2 zUwWKjZ)FS-!`!v)N&0d8mb9$p@R_py(O2qh{uCuZ=1GXpvWc{9(FXOy#aG57^b&wg zO9NtH?EU@fm3=WeaTkX>O=>+vSu;;hk2%rMVSfcS&II#zH8Xfqz_ESFkCk@K*^!syy+@f_3Zo^pl^P9gWU+Vh$eTN{PvW zu73~i3V@{r^nhjbAXkk7&jVa@xAc)+cvQ<1(D)c_7W7+ZNyZb#l^nY2?f8EMjC#Xq zA+OJt1T!f>79yk)cb()xFK<5?n;pf#Nq3(r)Rgbsd@C!P-S-40}IC%|0w0lO%IZSh>r;^ z@VgTkpR)JU2B&2*XBBh^_fDELg3)pN87mLwOobNS-5w_Nwi1i?0=-T5x6}>Ph=1zi z`FQv&I-$AT$uai4thc3m+WLRp+0lcM-ZF@q>=$fg`*@wVPrk7`_GC@Aq8Ld+@9*b7 zL_5dJk2d<6bDs4|obL7?1;&ROh6ak!5KhwyTezOd@!WC#Mvj9HRyJYbOwxWid#SrxBb_Gww`lWF8x%Bg~W@j3#r&7UhD*4eMf!Tn|O(T#~MkR@%1ZFkt zli~O>Z?Ui@d@PcJaWXQc&X$51gHT{!W~MPA^m|M_sKpwcr3d@||fW zg#9fGxnD_-M3+~w%w|48w`}h4vgQA(uK07s;?Wfn=rq~1zUh&kgt0$o#OQ;+VtQY+ z{O~&Nw0=U(+xn#pGt;1cVOsspsBW9bLJVoH$kih8U_dkX3LBMu&u@?h5b|;K0dXHz z1-7SEbcd?EW<}mIsoYk}rWSE`1d60!KjP!`?Y+wtEW-}BU zLCYMk*Ih|L)vj3wD>KjAqdjQI3Jzl`I`!3NdrYg>;X~iuD7oeF)4!=7|7h(8We4C# zMM#>{*E+6Q+Ow#;jCEPNX9uf87DU0f>#4bCz8Tr7%$ks^7{{zyZwR_qu7nD|=oLLD zMD(t^krv|2P1x`9yLJC7-xr*~Ab+Ya-Jl89OBB#A-R-%U+&dHqSRjhTDV^ORX;AZ_ zims7xPM2zGJ9?Dr%H7dYsMyRCd;WiDIt#a^-p64R0tSMD5)uOuP(e}}HWU#RVJcD* z1L;o5je&HIkd7gI1e8WPMsIXT=YY`-BQ_Z0<@>v?_b)itb?SM}bMEK9J=!srq7kf` zY{=(4Kj4+c97IsB3{;jod7Hl|qeu+V(%y6|nusZh)H!_Bc;fq|g-w>2J;i*lrsqg> zs5P3|_C7KU&E)ayo#M(2w+n9AYZ`}Sd>Yvwr_$E#^*!PPrP zE^RR|3}V}}DhvKsO5lPVq&zw~(VjVW1BQ#-+{s5m|C>N&p@^6oFa&mdny*`0i#+Nn zHR}EKv{@Ezt!hgX_|c4{Mi?2vd@;Q|^h7GTEM|RGcJ>b!3el(=;u;KSZQ;E0`;Qr9 z-VLnycxZ9CNAUV`9f3B%UQqbWP^-P)S?6s?5Fxp=zHBaV?@<*zRFvEIAG9VR`K*TO z+QB`U^5I}PzV|aPa8AoQAx=N{t8SxzNpYcz{>b<721xEA4158!t-*IE<`av`snoMTqR05)!0Rx?PbOK zIX=VtanQfD4tynNt)W-xL;vPf=M3wEVl$NkJi_bToij^k6$gt`lETZ`vywE%Yj>O^n7M3`Gg!y?Q%@bk-*qv#^Zy zW(- z_Wu&yzP2kJj^s~owRcV~KO#JY+{AU_Cw{lN{`=Cr0Kh5QEsTS*VDV!NhKmZ0-bcXn zNo$3H1$*pAMl7(^*1kXG zsSK>q$b!8$zrJksAsJBbe7U-Z1zxCtk=_^WP?`aXC)|_b4CXpJDgUhe>z#)X-N5tr z9w0KIoAuV(2P$aX)$70Ut);WWjMLXILc7ccFEcN|s7K8q;5$$G+>>mOP&bLZ!#R9e z*o`v+*oxHm@gr*U(1o3KMdA8?)!Lja)9A_>W$nIvY0N`;R$%y3fTDxgf9ZeH?KGv= z`$sK7fbe?-ISIhNX8<8R0xP8&~ z)%WZ3~L2FuK)TDdaGIR=Islsr4Jtso=aWaLMFsh?uSZ3*H;>N5%d#X4u}7QZC)f_#zP9Hz!uSA(C+7lmIE zM=sBhmngS~H6CV2+X&=m?t?G?p#}*q+?)%p6^yPqD)P_;*Vqe5ba7d`w; zmjSx5BM7vaMqYg7^&9@w=a~ugmN1$bL-Tm_Q;=dV3B!WMb>~YPiHB!%g}Oe!S5K+y z>5?Le`<>s{U#tTAPC;JaLd8Ae!wbG*^h#Yf8vx1B`Kb5GXVZC5;Lx?8$*>d7K4kkc zc>seHKWYbi*%sc_vT6Pw_ay?LFO$*#J0&|sPB=b8tet({S?&I4U{00-+OA-j6cDg}OGWK!{yRx=WuoFrBcN;ysQL>qokkZNsa@+!byc2YDCfIjevnX<& zwlNpB;xtFEy8a{3)pD?|xG4c=n0`}|eKyGhj>~~ne`}K=r;>G|sBS@Nry zWe#)@ zWSN@>G%cPnH!cpY6=OY(rF!OXHKVGfmTIWCYl<^BCUu$z7CQyU91B(8`w0PaGAsnX z=5t|7$)v+v=ICp+LC6d<@Ec;KakXxGYwyC6pxz^cn5IC4;{iK{8AYKEJnHmb5S@8# z%U7}yzBPdHxPWX@aRGQQ*_&+`2U3~o)`Gyy=hBg%ce;A)U}xgL7qNsYIYnO|mV6^0 zaFp*Y&Jky(`%9^KzJ0^z^6AmJ;KAIe_+r{0cb$e$t-oQnp{pt8QT=sWW`H}F|L)dP zuMq4M;>;4h&S2K}ZJIwazBb`Vk>lxuW{pgJNqRdM*O%)ZH{p(SnkP4Tj09UY?izcWvO z@Ot`TO5>RQp1AUMj%70o(hmQY=@|CQM{ zy|h}r_%@{I%>u+B4RypFAgs7%W^oXz1?0R5yU7w|!5O$BZ#4L(jKxNLku8O&z+&HT z`J%w3(u||^WL@AP?)BO`Hi5{M5n7ULz;|&?jx{#c)(4Kp=46~I{K&SO=3Mo5h7t}? zAq3gyz@F<>?AqBQrTdeW)+VlYf*EVy>yY%bcSxUXz^gDKJ>&|T%mX)4s7!=ToenZn zEwo0Xx`n50VpX zQ3Kxomo?WX1siLPVhQ?JiM-?@zXXINLiT7xpJL#Rn~rkAdf~=9f)#8Z#G3IEDq;zD zvqqi|L`dmw7R_4jTEsubh{m!e*1?FJP!%Gy#NPc%iT0_D=F@aU5WYBlN+#f8m4%+xjF_76^t^q==dL>?M z*!cr9EZkL~@b-i0jGHPLcedQDH4Dm}U{}ChQ=4miz<1}s-=et+z4qnfM9wWmAywDy zwh2m{eN^Mf;a2IC)9Q7Pi&L7V!bXXGnQmpLgeinUXP zdn;xOA_CKu70$lMPfeUi`r+ao55pK4w;#<+xcPYqlbCuy=KEZpxQSYOEskEsZCAf8 z7JzJwG#2(%O|diYhPC<6LNm|1w2}w21o4Evmp*8j*MTh{6b=L|QepW}PbIe6VHfuv zK;q>W-3(G}nS{7Rm7FYbtcyc>29*U-1jwK8{0kcSS(&V}H)Lj=rMKxjzYE=GYkcd= ziaa(lc2o%i(Mq%@b`tHKETX3fo()f$^E*OcO{Z-4QJ3uGqd8fOIgg%^@+K8y`s5~! zF*H={!;F!D^OD3tm5_e(7;9B$b#&sBNOe#Lfz?v3(2{56`tD@N<^f{w_fV~Hy7NBY zjPu1Pdvu){O-)4kNP43e?}mRi|E2eGt~@vLm%aUI-Q)6^(h! z6s@Rp@7>ZIhW5>8D*I1L4J>p*jH8A zrhQMB|1FZXK&Lfa;c3DOFXN7v-owJX-oAD<*SF~o<(*sW4L(Xwn5g~x=G-yK+BUuX z>{b3VL3w25O8|NGk*Hj;5#fQLM>9IP`;`!2X0-Pq0&m&=*{$Qn#!yB7<2 z^{Q09jvYlKZdqsQA3J;lKKI%!ZfcoY`ka8qFrY%5@RiMuRWlSStfwOj`@IYIn!UwXEws0233-4pZJr!5XV{(*^5L$I`R`B5 zu1u=yr7SBMX8TSzWXH+l_=V*`= zurXl0c}gA;1mtXfWKiko4riKe)}fZc{N7R$-?Ydb=jXq`ag@CvYQJ}}6jr+dsH>ma z<+>L&y%Z4CsQ%!KHbx9(LWXqnvlp*FaLVHfZXIL<&mL8tiT0oh*it*{L?e8og~-a!N+fN48;VIm!o6iMKevOu@P+Iw!kC|~_WCAqH1hKT3YvlGpfbsM({P3U*{X+Sy z3O@AEJ=R8{z#RFmhRwnv(k6vjp zJ`z2Q!u}8asvd98rnif`JG{tW#7I$v+~De2*!8gw+qwWh_f(<yn}mkK8ZFkmkz1eOU9=-T?S75%!>WlU>mU}5;A_XC`| z#~Om{FQ;Z^*-+YV;YUhFoUV(IKFYjDh~#Ai+AzE$l?P;Jgi2E-dc8lNW}lKNxpG_v zu6-x*_M((BeVv{KU=(G8qTCSLtgdIiy1u;O%}l>S>WzOw3WpXbmpi?KKXK$S<^HO> zeq1c(`mT|S&KB}{P!o&$9zIfT6If~HT!|Lz4Zp11XicR46|~rX!|xi^WKF<rm8Ldo0>Jq15M&Wv$5;L-u=zkD!k3o<& zmdsVhKTV)0uRd{thQq|>2!vL9eWm@`wU*LdG{luETbV+kN>z>HVgpd5zV+2$ro|+$ z7zc7;k*vbICZvWJ{W?4O&3}G$@E6p28G16vdfc!ydOu^H&*rRS6PCF01u-SGR|Qt$ zzv>wDnO;4U*oRYTpG&7@k@k!Oj~3dHuf}zE#H5|)0(zTqk&2V;DEl$Zi)4h<2~s0w zPVa8M*>{jU9&wV11@Ub+93E%`D_mBSh=IT6a`_c_u1cmSHZ-rHQ$It$8{f`1nbux{ z@sDJtHdm?`+-}Be^B(`W1*w?2Tx8UgP_qzz@pjj1sriR<&h;bF!@&>e$t7Hm#EMqi z^DV&CP5zy)>^CV>0dy-?WF7_Lc4<4S!^oB!;v1f?J>J1)Mo%p$G@M=dEWyp8y_>`z zzwo>JaePeTwCcB<*X+Z=h&P9wj2#}YtGv=hKkkGAi;TE7pOHeI9cpYS4OR-}X0Dat z`R(eCHgA?AjUQgEyl-@DFedi?Xl`g#$T1sxABQM9+KdY(n1MDzQwQIj^hh!oF^$L@ zOX=6rrMCt9Md&oFSnV(m_J8cAJN3sUuXStvMSj`0YGzt$A08E%D_1QTpn->ZDU6dw>IaqJ-!NBGd^mR%qC%? zHAc*7;26_{-Sc^$DN~R)G|NbTH9xNo!=KE zpZ`kld*-iJ5gRNPmq3(VCSl zw4IMJ=5v#>?j&otH-6^CnM5nhJU%|Wad&^cK%tL<)~a)ug_U{H%=+9wd@4YBfzXPn z{3uS>qZZm!%f4{5vxZ)4Bt`8hnwr1c8HYPOLzQ=kpLF0kY(70`_y=*?(07b3Xt+B~eyp6g-$RRs#Z6@Hge)B=!?>m#0+j2V3k_Rq1 zvqvM9!e(W?R{oq^oZieS-0A4UvGUkyISkuwiBl08L?g?2Ui3dsf**@NL4L+49@ zWbYOv9itmkOYf$d=FI++4bY(w7P?(R{jpJxIR;Y7Hf_Stb=KOq9_0x#cAMoU4f8q~ z=I@5gK~H17WDYCes$espM*Z(EHZZjuwj7;X#|c`$IpRM~1;^*& z8}%NOLg_Bz0CoooNnBl(+L=%!tAq72ZtV)$8r{Hf*V&cN-Ov9oSCQEN?E<(DesLR) z_~NI}ZUuN=t=Rdh`=rI)Nm{7x0TRO_J`teU8Dtga7BJq{G-w=`HEXU4M?xCfGMwHg zdJm$Ihxb_6iHUpgSUFIlDh%Zx-6n&OZ_-%*h?_h0C=}3)SWEc2uXMV(#-Uo54-uv3 zs`Dsd-UHRq8U8wr@MU?o=CbiM{nO04HU8|s{B@HYET_V%A_Mw*v(OxcgUW3P;Bk^C zsMG1N(08s%f*TZ}`w}&LKMPCz061T(g_YJXt&{Ohhizhx1n(?gFQx_)?B2D4wL$5w zrF=$c`_4R45zMVtXQwQ5R*zKncFQtbLvx<5# zNe)W29j~unpinVRFvkYNIcD1s~WO)F5=2qWFDjo;y@@C z&3!L-m?!xP$8;3*=X~q4qj_|iBzI>>T_@aJ8g$Uuoy_}=$o|Ei5j*hpy)+m?@i`(_ zIBUd-t%) z*UAv+Es4e8Tg;JNSC@?L_#3J_pe#{bp98-C#A;UO3fdxMmHa^`%ct%Ab%+Y*uba)1 zq>g`r`1CX;Oi5b)O^WE-7e}<^Jz`y9Q!^ROq^s-om6C*8bdgSd^4hFtqz)k zf8q?>59d^!_Gpz2Q^{WLo{K^(QGyMS5;Sq}?QpDi({6zR?*HzFpS~36dkGjGOR}FrL%C z35pMdwt4z_q-jLZFkUU{&2CG~&Ny0R3hChlVS#9wiZ!T^iR^r!s6v#KT3FgWGbTxc zbNyQ7oVmuIpEu-_z~|-nR(M&bHvWFKf49nstO#FTR$$05i%Ax@)ywlSw>D&9p~?LH z=B%xrH+YkugVU=c3$*CPJxg$rgi^QtZvwp>Bs_EfMAtOywV9>uuIT=k_!)Y+^e_t-rj2(ap07ps`Xl_cs;S#1-IKLw1APZuFy zQ-w(Qs(dnvaviMcE6V{dW)6A1d9Pk_-y%YHT5xeeFID=J1dADp#I5j!>BP@6cv{tk z4fC>p`^nR+v=J`?Cdd1b=Fjt};AGwG`!j>h1J9%@(2PQZ`>;Vdrs%lqS0q*30@i1K zXDCue#1AQZ(f^m5aZ-^LMHmnzdESQ`yyvc?Q^Lu>*5aVuCD@NGrS>1X1igEDpt>g< zgR{P%Nc{v$yqBQ=g%#?%33T~-!@?nV@XykIA!;~+9-3C_GA^vsLgX7waDN>e*l56T z#QmnrwJXB+P_3TGIZo8~dIARStXwXHY6HUpW$2#wS*T}b^v$xBBA_21R465bF=p@E z>rI$>Dc{>26pOkZ@Jq3%;coF%gwOn-FR(Xjh3?DbMLdoMBW%GhG$_CDNJ`PK z-m>@5Up9H{N$xIov_%qn|uABJ=gJRmN8j%XH*A-9;rZ06+I(B-D3Oq|eiK`QO^5R}SL1==r{u+$wC|}l(5&aNaY}k`GSr)QokxpbPg(EQIJ?SUyqzvQJ2zjz36e46i(+*27-a?) zfm$go^%%`kJkQf==xCx5u{<=3$ur(%G+c4F7}xUh6DoKF+`uH}_OFeq`JuMu$n_`J z!di2)Tj7l=ugi#)cRxa7+iRlV+y;>4ZDxsPBgDD`apTKVl1n;$+>LCk{x^ToI9+<# z;mFVAn?LRZw-=lJ5^wB?dD%%Zw*Gi$1bDz#llryw!=nz}x_PT9%G?CkgTJLB0)31E zVy2oXstw0psL9~&*ExFW^E+I`Pr*A0;F6<+)&S<^BQR!VKut4B*Ka7kJN0+FjF0)r z-nB>BD{w>a_mD-L3~u`P+Qw#^Qx4ZNuXo;aw>ySE^|t1*&P6nY|CnrdYpzC9ALLr8 ztB7PBknS4rF6gdHdsIXVvcr8D&R-;UuM(@lRfI;}c7RCV3Za@JNC zXeRK9YwtTJuea~8lq2-D_^bigFph24Bx| zxlg8Skvni%+=_H2ddmo{bYQsGJL?eq8|VGM6(G_zI-_&U1H|yBew>)=LtAot%Y1t& z&ZL6B@4l++U1ZB<0*)o&7N4XEYQlIP@=*EV07!7M^T4hX#(z9UP%!tms#%j}X8`#< z=Dd@k2^CiT)9ska$f>Dd?d$(uq04@cH0<)VodIg=BX>8?Aw4iV+Cq%@Q)LScsiv16 zKM3a}PqLJI=#b*K^?DGn1U?CH`Y2&Ab`DZ4!DCWwL%z09fIQ$A!giDgY*Rbs4$K5; zD!f_K7JRUIBj-4Ak4H>%=*cm-`LOy0XYHMm+77W=1we^0m*9y~33ZKoo80Q+bCzw< zzI_eA?7u{Wy1V~pS>AIibHW;it-Ghj$2HV3ZLy*Wuja8vy#=^l6CBAp7Gp!25I7?V zl$7o>GrxAVSxP}OxR|6ad0@V~s1Io|_Y5^2!bCIfr^}UfH;t6CXKm?s&&#D!9 z3{pYW$F^8~xfoeba4d9^pGg3uzj@JNu_{I4Rxd|rv z3iMCz<$wFL-_dQi&%+Fs_bZn;)SlU$yU}`Kc|0I4Skri)kg| zS^ZwkMShmYOP~)5A5lB|_tU%CrkVz!;Vy!PvG>_c#8|&f*dKBET;aVQXKsfA{8ORf zr$t?^KPOk7(thx+^4=Czy7=$C8Ex~m5t7o049e&0nJdE9)Qo}jQxRoNOWJgmLe@`LSe*MVY%CMz3-SVXyI~ zMozboG|J<@sd6?q#WD<;G6!I=o{y6>XHi=prt|{^89;&%hC!#7s=N2yy1i|q&V4X6 zkPCataxr7j1sxeWVuz;=ZN70eFiLKfo-iT<5XcicP|89YUIZvSr`FP%rWGhy|3a>e zH=EKFb^d12RP-zXFvsjCXX+E#uQzxj@MNjMs5f*lLDW5!X@-Rq)0K-`(AF1k$Rwj5 zNI9OnpdB&M ziTO+nrO9nGi7ZxtER`n`Ij?>C68FmiwPbxoY-WF$`jiV!eP5^|ME#o9yvl5=&ICbW`<6F_wM}Tky#-r>oQF0XVm2(zs$+5{lP(JMp&{%__pAqJY`)wt!+);P8q3}RpB??+#(Zw!QZ zh5Fc91+)F+ox(@_e-{9{``Ob_jxy<>%(K5@z?_)2a^_~Zn51}RmTX_^#H7KlwJiJg z`J3O~r^%5Qc95fn{ zS$Y7IC;-P)SKnZ4UTFYTv<^4yv&t(HOvSR;qa4Pc9@@?14l1j1q0UFpf}FSI%k0ie z53k@r`(g6_Vw29j!wt_p!RP})EI$7tkMW*WSNKm(boKP7xX6*_VRr6Yx7isMW59UE z7#L4qi!~+cMChfa4a{{wI>q;jyISrnu%w?ab=H<$WOBRuq%G}tE~>*vf(RkP1FgEQ z!syrsCyWq>$RzlW`2DS*Khg_mQSMyn-vk8L2Zs7;1a=a9sf| z83cFKZFXNh-jkMe7;?fQYvl4p>!dM z+QHuOrxV1ym19V{+i|aonA2iM)B<|-v_3gi7(K}J{cTfve+(%Ls%YzbcVrxQdea#f zj}j{G|MoheTvkT1zJ%pm4r_*hIn;4_{<>uC?sD5(v9w^b8^fjfd2U!COQl2~Ezb@p z9b6lrF`HK!n;**QYe0H4z_JEQdW1IF9=^VbL+>e&MbX zx$(c(zb4@J+Xd$oN_~`&S!;ip!_A`r&7 zoWGKaX3kHn?!^W$0`Qdg0NR{)IbWpBa%Ly-rt)>tJ&^}k$WgS2coX9laS8xWRGAY# z_iu4F)664jy8Nm54naQa^al>O=m^5_XWxBRSHxWgr~%Utp96)H@)hQ^nFLASx94r( zSh;`&WquD1m@EKv(8+S9lAZAAcfb1WmmVd$_sLylY6FTA4m!RhFN#WW&5x?R-dU3@ z7-(+efh?_-Pn8F#{w!?qVIFOuim}xTW22pHKq?Fgqbj()8Ms&OukA83w7@0Uzo^nV z5P@}Ir*_*H>Vkf9I-u@AwEHE1{DRu9Y>SRW8RR_coyU_v!d<&aD4|Q<^4@BC5qB*e zYNH)&pPpbwnSPI;mt6)*n*Fy;VSY?$TlMQYcSf!F)w1$}t?zkhaqQ&-kXf~<^nCeB zp)ssT^~##n!Sa5zGjP5ZeVMUG5+y`=62>e@HXQ_r!~ zFjs-VT6fa&fE+_?t8q}BbT;3dVU=?;&Pbhtca#NY-w4t(0=x*2WEpDwP6go@wNc0o zjmu>h40RwqI}atz8?rt7(SJz@F-i9~Xb?)j$j*N;JdMzeWN*KR*s>m3TS}Z5%1NA^ zG!u(4x^OOWuFceED*)JDMk$?+0o9FuXc?`HS`dtAD40f*>{d1gthAealfBbm(NbRr z{R)7&;k%q_jyI@!``=C+esO7D#f_Z@NS2ArN@C=EWFNYkxVSs}=j2A;n=_HEjnmJK zW<;0n!zeCjP~gWNZ#k8=nY6$^I__pPeUE`V!0s4S5YUytxe`UAgpU5*_zfq8O(VwF0dNFrvgfxnxVyPjMjDmW>QSiPG z_^-+(D{g1bm|F45W4o;K*gN|<1;(7;eu~bm|K9Ek85L=s92bo7Q1?DUnhNFS`Gb1* zGf!Ky9P&4getMiHXmF8MOQBm9l6VjfERv|jKP9^zFg)1Z+(U6+ZQs2FD(vMq$k2%2 zz_kEFok~v-u7p2xCmu76hrir^S1tBBK3ZDDmD!xC@7>iy)C6-W>2Osj=Az-u*}2+85s!)n3QO4tpO>{~k82VK9h#HHaapVsD_$ z_&Wjts+~v=yZ$cN$y{|eXKM_KlLjMG2kG@NJ@{E>FyugtwcuQnW-!@vJ>D$({$BYe z{JD>)H@nd1-UdlO31HO1{Oc+7?Ywa%d( zp0L)h)%Z#DhS1LB+hOdmG~`%_8stg~T)!I&+?Q4My(SSir{;VU;YdfLsg?-7X?w=D z@W!jHX4i6{_Rt}`e=@@g&sGWt#1^7`@cd!LDt?~i3J1Lyx7b^TgqRM#tSy)g(0cc6CuJnG>|QnQY}KN7)3 z$#Ek8JGuFuZ$~fD#(Y{3DfSKnmkgO*8Sv!1&&~D?0 z8lMfVvhg5EQl0(}kb-Y3^E@(SkOvkz|35lP`KCt{93MfL6rEo3%4qODx{+%}*G}LNum8(Kx8>WTE$As(QSO9X z_iB4*afFGrJ5Eq~A@)fnuvHDhu6(a5Kzv{aJsN-J@$bvM{VKO^ph$7F5va9uZ%Bmk zW0_R7H+$n#ou=|ks>dv_^l;4c2g^PI#mCwZ_c&?Eg>E;cs9bHL%3s3I4@#8dh~wQy z448@^i_917xT)35Fh!kI)0fNqp=Yq-TA}-;hd8T+CZ~kqs7&e?l4(;#Ee3@)nP+Fw zCAg<~RXi&QC4&dRr-Y=s{_gmMgG8sPV5blj1tJRkVO(siwrnNvWFeP&WODOz03g~9 z&PXvPl}BGUfO`qgTz#Vn@jMBXBRrCfd#&pv*J|=49*$p8-#jx`hcN`q?kk$;JgBwy zjEe%F&wzd#+RIe7G0#>Mm&`QYGWpcRt7}lWL~!hm~GFbRB63+8`pc)-uVFjlCxhPZ|0+J^iEol-jo8r$#GBc@}0m2 zeeDgTSx!g*$g=9|-nYg}h2^QDoGGOTH)eF2;!9;6e9c#wk$#Gd)0SeB##iF4NhgvC z3jIIpmh-R(?9I2kF@%59A39geaUFW9Ok-)r>E_vGeEpi5Zu1H3pe^j!15O?@nc4T@;P znm>IaG=M6Vf9oRBh51#0U2DJ?WXY@erJFfg1$5HL-LPbc^Ty^Xof!TcXB1j;c4e&7 zNxR^5dsFe<=%ThDl1pc^-Q2>bG>lmYG`nRKg9{bR)Ezx|`@TMQ9B|jbWA?zLfrX`1 zQ@8Cry3|jg$)1o&JEk9Q)$w$RAE+~pcTb+5$HAW-)$|}~?hN>~9VT78nawL>bd?o)Jjtdx5WKW_TUK5@ zQw#K@|HqDRCr~_qLB-%wv(!U^$DlGqgJ+&@awW&(MsgKp>*v2sQgruF7!_e3@8{fF zu|hQ+Ka;&DKZ(E8BUHBY@U!y^;rs6srvGgJ6O6G~6r=svN&KoHUL=ct!n(YIyWj?& zO|MQ!Gv^OU&ZB!b6$p=TRZF|(P0}C_T5>UlzTP>zB%WHD$r2b^V=JKevdnSh;3r_J zwFU(iOl_>DeO?n~vDyBIgeSYZO*T3Od2Eg~7N4(?}KJ zd|jj=7tghgM9>x^5XIA$|6>n${-1mr9lYBC+hM{RQ`B&;!Sk}SsJ?N$UEK3PaNuj+ zfFJAi=CRwMJu5%3=8U9Iif{?G5d{&sjUGARTnTJ5AL^3Q{B*e%8mULa%IIK+6CsC+ z&IW^S^ciA3u1O5&^#0GQbv0r>GN{tJTxoY92|{>WL%YQ5G@R@uQf#oq3W2#quqa;i z>b#jww@e=HV^E=q9>lVLC5eHc%HVI0!GwuSaXdD}O79q~XbGN&Tu_%?q84ii<6-{zO{H9yVJ)~aP zr*60I`+UK#yfoiqUkZ&Y&8_%CdL0K#XU+Qko0fzXj8f?!cB6Gx@?e=(S601vspHFq zT^nBYmoFY}Y#pZq3x9O{!9F}*q0V#8bGEyIZyYRy9J;hb$Y6L+Hz$6H$Jc>1z3v8X zyQ`9NvkV3&4@q8Gf`i3r-EPgq`wgg?xmmB1o_djaSWML8neeF-es8t;ef15m0xkxj zV}S690xd3I&R^A7_wHZ~LD_2O<{s*H$i;pnv}wfc2tGbpc}dv*?%WmLe0q3Zw;#Wj z1T{y2)RcN1baGeD%@-7YuAR(`+O#it$KiFDTF9r~LWB6aE zFksJGz4~l14dm-E;t@jBBuq^du5n!1Dm(Cbi|kpHj7*7<9bd;>L^zo}k^ppcd%_8p zy-uz-_NP7USMA)c)E$4Dh))5=w9KIDz+o8zt(s`T#RK0-ar^*XRFSK#c_Ol^D1(E#tnL!6UC!Pqud;DCftA`JH|RMtjV7 zh0EWJz}H`1`>okU^qlbl6skd_>1UAVTdY{rCggZM`TTx_a2Fd?_&-|4g(AR(m3d6d z_7!@MRRf+SRR-M`LH*~#xj2G4%LhTN9g(C;=8;P6U=Y0ad`@qU%X0h=!RZRvyAS6HnTjDF=W zm3!VKQd**6UbPG~+rhZ_i=z5Goce*uQiit)&-pdEV9(#fc|51j@;)US04FDub`uJ8 zkIgI>AbWU#b<8yfH}|KLa<&humotxS-tRq}2yj_Uj*^=y41isGjWVHFRi-W}@ns3! zTWuY@QBOO+y7nsJjw{&59ti~;`C0KEoCO8gVB-8Yo3k_W!KeSBX-Dh?a%Iw|1nsjY)#WuUVHw*FSt<# zQqECsu(oS|s41kQ()0dWH9d`2INleQ#21ff~8fMPAcd!>mKV z!b2|heVaO5Os}l5aXhgQ&2143MoB$L&yS&EyE}7#X9PfUGW5E6Gj1QolD~yr%TyDs zdpFo4RajCKD~OI-(^b0k0HL&nk$GRt@?@`=pGfXklE-!dayJ@{)&W`NWuN3X}ZKA=qgHT8QI&>%1tAICkN7y^czWwhGvV#*XNiTnhvg0z{A82b0Gl|4cMO* z(l(0#1TtoLwzR4tHn#utr8-FRHJ(j*Ew7dy1vfj)6VOxjsk(k>szCpH@n6cFX5&p^ z?mAAw#cHUQABUS4i#NU0GF;5}F*KMEv zI|!2>zPr9BoyE3vuNxbAo))5#U)E=Vf=u6=T>Oo?S@Q3oO)3U{rBLl0@0>#FPsbK{ z{nGy(=xBvzD$bqx8FL4GqV68^@#fgpS0kVg2iL(2u-oRvf6_ToP9ld2nwX3Oj@$!w zMQH7hWv2TfOBjz|_#NdWcAu%`y*QDguNhnB3j1Ul!R+>#j0i{LhZs`sg3`9U$q$Q?;l!SZ z^VKd+AW}zAnHaboPgvq%vciffYYf!+I=?ehxsjBg=#7>Y#uRc4eGS{OniP6KIg(sM z-*jVWZGb2>x@sk&geD=n2?v>cuiEj2tOd3Lb@rc=rA1&R5-&>imy>QAuY0h-dDo^r zEHA{U{YlTZxRR?*?{NN@&le29E|JGOVf!V)Fuh2Y;=p-@4Q)26wZ_GX)cHgvdOi1m z`=_o`+nyk2%D3H#s|~8Y)X4wCVNpwLEI<45^PJJA70)jZo|^>Q6PB=I;rbVW3dLMV zyM8j`T2G5x*1?g{85HfS6{DEvN}!W-bkvcN^PdB@ndV;?o{lH80ttdDW98qVHXg5Jgzj%nWeZM)L>yB|JBk9;?Io>!Uf?eG(^-w2W_ari&0 z!_U^|8)Y9F7YmMXv5PV7f9>0>|YLt?_QW>n1woLnWjGH>;$6IO6JpHqNl3s zSZBLA6u0Aa5ph`EQrp?MMn3Zo>U3=L@AVQ8(C^Q?JJyjry*;^4}n$XnnxaI*!@%YKp5g;ESz=IoCT@y@{)GHl<{0t^& zs?vSJA8QJTp!S*cwo?*miuZu;yrDelf=RD*S>4;d*Q1KwfbQAbzt2nMHrrdZLWum? z7F5PEXUzNo8~))Ud5HcR-kH9hr$FOrp6DH(mMB?Xt8mALEKPTz+_?Q|G+Q}v~3B#J3?rA>O_X;$UWsEaVQsPDQ9$hIYkw7d5l4Z%WV-)Kn4j`$s zY9X7)UD>r8Jp*@+DWZnHXV_Z|A|rgp>YyX(Q3 zqSj3zCfZ_m=~cz_nzufJi89_Bh2W6-0oQ}IvN5CllnF@hlFZ+9_Nn}9OqNoz@<01) z@+E-k>RSA2*8*-o%ys{L^2_$POYmDrMAv^1mP<9NF1QopO_=?C34@1RWvA2(?z>|d zd)tF`M38U$?=OA#ay@>Z>b3&k+$~ZM!pw`a(f6TC^-OU0lx+h9Y&E~*cI~_IwiGRB zR;^%!Y51q(PNC~;fITOIihVui|3_Wb5_jm4+i7zhYcC!TLHY*)CjyxR_e*_{{miCne zR9BDE1m;h^I59W#((C1C1f%Orz*YSRN)Ip46FPoJp~m1och0bC=XPgsmrts4xN%Cn zwAjF}cyCrv-?PAuThnJw`{$A>uSFnYV2hHslM(xMC!xSrAM4h1@j`aVaFbtc%#r}> z_^bsn^slin%+$$~@jHz_!H=iTxAi^z^eI|x{)}63>NkH4sBGuaPyzM1DA=|^rm)y& zYbM;GaCHb7QkpRQdSC02kY5K2KPPf>H~87EDY>uG{)F3S`I-|14HylZ|MAvoIc|W= zrlI%hz~8bedPszyN2Q>H`&A#dDW|ANBsuWOLrt0~{QA2W)RC8uY=Jy?U>85vnx>enLF z5FbR4eb5;r@geAqjgTtu#>QPoT(1y&_>kO*EzfA$O zzVo0U9XPX$93ZpknzEr(6OcXPGTsyZ5;%$CM_z3As|D=yEA7%Lto92mHK8FZd9s}f zzr+!(D6TxbuRFOC3PtNYFYNA6As?;IPmf#e){K}n_gv4|o$QUdk*prkFq#+y`+4~- z-}C4=cV+`Y@EwD;-e2{_ce*@GzK)yW;j4T8m;|sWhYxZ#OFfes{uj)dmzcWnYf=P2 zsSEm&$<|^mC`BygvyqcvZAzkV(ksV7f}`b|HKZ zf&wi5pzZj!s{Tjs@^;H1&$~3FhQ&noMm>@y!9`+O|DvL51DyY~(Ddug7|-!vS7h0e zf&OD&WpcvTA6f!C_nD)M!m66|1+1r1Kar=joWuPQ;a~XI`_{iZztdcCfK$JccCFGD zl;U~ZGa8N=yLen@_O*C4irOa51O4vuu{-p$z;J=&dV)yA=KD8)IU!i=iF>m9vG~@c z^xE%HdZm#D5eXE_Tw3G-90G_-KXDxHU3jmkQ@J)N;`TKb`D(|DVAnHF?S(k5&+ERC|-_+dGe_e7|T%FR%>)h6RzvaR6xV zo0jy*lf*<~ys+{2m$PToN1Pql-Okd-#$t?CQD1w*HQaKq?#dl6vio4gF3;e?mQOtv zp8R$9DRW(`QP`UbE@>N$zPQto?=%CRs|0Xm^MH@N@#NT@SXs89@phVWDRC*yvyQH>D0^)zWpo#|TLw z(v_HjnCAh8r)%5-^@#Yr<(X=7N(=54O!KXDo>O_G&WF$h9TQujyKq)*Uv3RsN$qJJ)@!ns=RKwORZ*1npXz1* znoGoY!Ql{~S-%v?iezO;k4U7J!u zfv@r;lh+J%LkF`T&U>vvd4ooM7cNdNXs0FQwz^X#j^)!Fa;9S>)rUmDsnE;yA}L?= z*d2-vTSw2L$waGzCyzuwu{%Uzq1c-YEQ`gNlq<_p-;_GL}V#yU$?;{BfyctOJGHwnvZqwCbbU*%1m z!X<%YlB|j%!Z?$#WHw$l)Rx?px_)D9yyt3Nh}cP$fYd9djtf@0xn*V!UWj)oL3ese(u zEy46D&vC^(&_wUj73wPSv;EAo0YyX)`L5wGcCihkS~9qSL~%6Kd=b-Jr|;sJ7>s&M zyd+ILDxoq%cxENbf?^>4F26*&nb3aGj*PRKXos@4vcA3 zaN#n!p9rmP`1MF(Pcr|TvbBIBUeDXPv)7EVonwtIAcs+Za3V`#SFpCK=*r~6>RH`r ztrf9A0{v0yuZ1fz=_(2W{$k9Pi1taX}+DTmU9o5lJX+`2)(rZ79*!2z8J z&(@V8!kZpYv4?pE4=$A8sAWv4@X&wo9{g z92Cuixq7QP%X)*q+;Su=A~q7QqdTcD3K}q1iO@Ug3qE!;TTtSeMIm#KyyGYKL#GlS z{YLoR!_SQ`m^cTepVRq`DGg|>w054WPE?rjpR1GSYtw4Qj57TBSgb5}b(h2HN=SDf zw4ry#T)H~ecG}-MbN5Jfzn5l4Z2xSi>eJJ50f)*HqxNlY#lG{3(VU-sAGo7EL?RL+ z&4>CVBRYP5l5DZWcVp;OxmjDIzP3)hP}oQ%aa+X0$f!~OB{ij`=4bKJ*rkwxu+eZL z=SNreTM(SC{z~r3%0*%!&HFASp?p-vHg2o($6?z+eUCCALnXUoZ>{@6_J+(ha=qZJ z4VCgJru53OGKqrk)V*)*ldCzhJd!{dPR6RR6Y`BdrV`uxKyhs#ojIWUW!PE%X@gW~wI?bm{!`FZlJ0{L zDTf_V()!(sb6HpE^~PidR6}Pk++XHb0>oSmdI4kPOr`& zpA@P8-FwjgLkw`$uX0v5iZ3VOT>5x%FRnYSuOG%Su_}v2H1<&ozP@0!+(g=T14i=j z=%UB97Q~@y3fIX}{rUI1?+&5?wGI7osrykjO8=MSI#Xm!EX`A37Q#{5+{R^CRW|Zi zrQB$&kEhRXayKvmo;46*To}@z-70ZS=v^V;gX~(r=e;(msq5x1S5WgO1hl94Ol>gz z@~~0hCe_!rRVZ%ebl2^~k(q+iO67^08y`YvRX3&@{}U;&)LcRyQmQ%!rFUh=XkJ&0pwV#u{8C6&qAhU1b@W}8EtE>PM;Mt&nRA?bzk324! zAO1P)=4sZ}0)2l1?L(t_v=*!Zv4%`kcT;YeEQMg6a!^C1g&9_6vkbK5@XOzX5`O=b zH=QXkq6THLRXY?@9bA12+MnI)HfGZa?+##-v-xdbM+fOG#*RG$>^gn7y7R>HZ6jLx zS2U=*vXi#dW_HDa%Il(<6@DU{{e+A%H(}A4Xk>BE(2?VNo$t;YWj|_LbwOoBJ?)Oi zMCom9++<_;be~ZpJ;-18$?2$^9A}4TkD+qtUzKvmXmnQ=lQ=j%zjXbj;syny%>9r{ zU(d1M+55{5EJgA_HkA$+YHLpzFXO&H_Kc*}G--EhY+IBg#m(JXCg)L3^2}(I@9e{H zQZ{i9-SD#rK3Md>YGT5%#;9ll@p4e%zL;REcS~~35^f~IOlb&p;01V5%UOQ2z2d>Bq}Q{$xe>!KRNmf?FuRlzo&{KHY8crS#{j2JSU)ehE;u zamWnSK(C3Kd3sfb^gf=1<>z71g;TF?l!e{(jY9_M=vKZv;;^r;E-NsZ%Qu92sX9xI zCOFg_+_{Z%{lg$1CIoDXgt=@kHCPiZm}^o-bzxQqA#c99Of9ZWnm!JK!06VVHoW~o zH23w^vpyY+6cO>BK+{jfX(>{yv+7yCx7EcTajh)vO_$Wmpsw?tbH6Ap?!XD1-^cWEV^JodTwjyl zp=c9q-Ixjxm=B^m+a(Mj#bB;hWxUlOky>#ntz1Xr&6PnWU84bB%0wFJEyzFKDP?If&Mig5NTvf z0tj`!krfFd5ke4{roNwhc924a=&b#JQm<^&UzCLycM;)kkds%cWFy?b@KDj^#%i5!+u=$?J=lv`I)KHB8Q4peNj-J&RO7@!VA%69r|yCVA7z&mm2t?!Z~ z6n0`L>r$cbeK1ZkQM4xQ=kgkZP}BRtIza-6#L*B(JD9V+n?G>dwD1`IPV51<920Q* z2rQFvE6^gs1ICtfWQ1oZNl;{e3${%Q7C3)Venc+v@X7cdQz7g-@M0kDF3Z;27j%?a zs)rkYXNzobq}I*%8$v1o?qsOjr&ru%l~0fS{n*}PMOG6dEQL!dvCe&0503}LdcuV6 za5o>iwVB{qBLN-Nm+Xh(Ap4OC1ZSew-7MDK+)TV z`bYXa0s&5~4n8AP4iuM#0rdy^?N*bTx@iCP*L4E=5}eebc9uyseG$g3G6!e1pCtJN zJDDmU5#f>wLfO3>tpofWF!=ux4skdfDSifqvbRHS@BsqLFw{QSCCd+cxSiUvggqQ7g=6 zI;A6|2OwuLKF-D|>DS{fQ8607FDx00GJdC%WyBI8ybbEndtIE;yb6;W*5 z17ramRFEle(sd3*wFo8_{*?ume4h}ryY5mU{}L^G*&BM9+KzX1CR??ACl1mY(0F@j zssXrt`8y8Owp;^Nvyu}bO;sZ$z*`!#ot}bA^2A*$gPx*ue7vFmqRI(YhM2)~P=k5a zo1Lhr$<=(4tL(-lpT?#=gF!7gPOx9vC%6L!=SuWNv(4Wg5&g!HilvNg2_$mO1;lgt za7|xMU-tj7Ypz#H8EA(qjwpTl?IXNTF?XB8vk!b7t69)BY8{g5UPZw;)v3SX8Z=ZI zziX8$-Zey0`DLw$g0?SebE=~JRWc<*FZxt5V^5VeP-i3B{%hg3#ALfIVWnq%p+=I( z#1ZMeV)hR8jkGvUZ%v+pkc*9C3LZYRp?{tZ*7 zD#z~@qU~4tY%UOiDJ({}7i@bNv^h3&>-Y@B2~F=B;Zuo-udg)9;nBVFA zlFYKcY{w`yQ*KVdypD8=*a)=WSeaT1lQs3gn9h+@eDAgjO6=pn)AIc=A1Y^}(VCix z#08zX@=+UREQ85@tVE06dh(JMb~z9!WP9NM?$bXJ!Kp0e`vEJB-QP_58DBGP4-L>? zMRAJ#Gix2cA8Ab1G&3eG7(iD2nP&CN;=H9}=foVI>cbQ6?3L6pacymj#YXH!k%{WE z4^+8b>XsY0Z+_wS`v`GXEgPHJhbl5h4oM%c&5XH#$OtSzjD#7U5y3l0PVc!nT!K~J{tPx5^FB4{Ehzyom{&drSkY2BkM}0 zclin&vtgAS(Uk7T@GRA@>1XQ>FG%I*XzwpqEv%}Re|q$BgYepo6bG9An<@Jql)x+Y zx?PMp0+c7ZDK9aAk~STU!kDWUE&2_5|Dq;r%l;qYjq`9&(YMJ87dI+qldl-jT2n_U zlrCG}^23~^+o*lt2Ake#&kpg?d!^`)7m_}mLrZ6W{9aAOtejviz){2e#wVy#2S%B9 zX%99AsdW`EPV^!|kU`o>czk6rw`g0bs@PyJ^i%DL_4ch@f${UtLoiTVx867ZvBG9+ zx${?B)5$i!W%jwlIz+r1RI5=fbTWSZ5qS?Utq=YRTK$ebkCQA=_Ual?XniN4q(q0z zxzpij=?6NpI?#CxXG#e}h;so_Zi398pSR~KbiGaLEoCQcpNmRwi-sIq7eJg}5V!PY z^=`}#lc|4h`t>O#A#4ceMX|;g@xX=j%qmu}?@x}S+L4w46>0!*Mw?e;CEB6Y4W-+3 z8%8HKigXbow4Ug-8Z?<$JNhp}PJ-vRchm{OGy8y(y;0YXH3wpp17y@XL&IwNz@Z$M z`@m;aL7NC2#nHAphNNsKH-o%gT_v5fzjJj~{O}V5mBGL+M~Eu|A;YJhp`|c z^CRgW=*uzueM2B)e}%_>;mCV(eTmqJyPZ@EAiPP}sWVsR zWgb){72+T8dgAiY4i~>=!MKj&nEI+{$m&mrHlI@Pg}jY#s16#kDu*1aX_9%+fR(gy zyXtg7&XV}JNEzf?d3j{0hB3hquwRw!;}9>fwwFJvWWH^bgN zM-h=HxgI6!%-Q6}i$!&29sOq>Bk^#qRA&FzJT~J+qLEIMy;Dy99+POeHK6@B$mLgD zzNGp+_+dPyO?rAxxdDA#tQJb45YYp`ufdPbHHpC4h z1Ob%|#w$D5{||<%4+)M?znFeh`w}c&MuxkV>%Y+e&x=Z$qBQQIv=3Nmkt~3}6JI}; z(co%{t}p?gm%ZrtaY^+qy5@#UcDdVaVbCH#jmafoVYMr9wF%}7yB54YyV7^S$Efr7 zAyupv6klwGGo_EsI^cZFlou-09X%m^+hO_IYamD7G*z26ES}qjw{AXM^V`?EjAP$r z&A<|~;?z&shM8be16|&99DcF>#cBuU-&Sa}T>R=he+ZRZ6T-v&E7DKqRh&CVg{H{= zIwUIe=O`?>txAdJY7{!U$ui`6=PtA)Crufx{mA}z_HQnsl5m|8XmCx3TR0$PuQ+hf zA)At0PvQZhM7VHSmc~9niapdmLq0&3Y<@*{xs^fdE@?MZeZIQczV&=I8_Pn0e{l*! z*!QP#)^T<4)Md|h-(p?$I`JS`V)utf{8*uW(E;R1xrR$CE?%I; zh9cse?|B_v=d1egE#>fN+0V(3ORe%0Jh;4YT`BCgLmO{`SKvXBbyWp)?)w?YkV1Wh zFFH=aQ{h&r2w*uExenkZS@o6r#!C?) zt(VG+nf^8Xl&jv2Ay~c@04TyB2_#AU!1)PkU8IP61_7ug*#Bh*c~V6zDU!2W3}n_W zzs|oy>$h{XPtv5Of1WurqY7zBq1{gZMy4YyoVK<5Tb8Rw<7j}ID$T7ECTT5#qxfe) zTb|xXg-T9}7V|A;q@-?9v1NVGZlV*w9ap3cE`g``mL;g^AStyF-=cxKqDA^iZ{kw! zR=-n)AqANwYM<2A{Lb6&J^GS_>(AB=@u+2Bv}xdPzcTm{wIHH;&O(0H@IYld5&D>0 z`@sHz?_C(vrTX~m;>wpFQmrDKEq%rUS$k67KfTA@-k@8bR#y&?g7It2MMx&Lr2b`pe@|BT%-DfVR;>fG-$>23G z$SwijoefJ&<oeYTu1@tN5k-%PJ+g7JyOQ7IG{-=kg*mATwx2dk*_b*#Bxx2Js}iQ$2f zRfuWVj~sngVYt+Kv2IIgHp? zA}AV}v4L)`+DMJ;S0*5GZSfv|KCk>CmsBFoB=RfQsP+kjJG2^lew{u*YO=1z59z+E z>wnF?>X<;eoMyYO=Hy{pQzjeHxKifhy(rl(IlAc7q2kdj-g;2p6Y`)jd6qV;yH~P! zwel6U%Gq#_*Wp2!{JHv*kaOjiSKD`=jnKh3enA>*ZQ>@AY41w(YA;miuVYi&)a&i< zP*$XnKVS(X+Oq3ZJk;2%{c1sLssLMKL|61(C{)_Eu_CwL+@yIWb^S2yDDB<9qcaG` z^9j{p@N^Vn34v!}55T+B%(>y+_GG@nI4pAwosqU%gQfCgHPTeReVN`rUItF7fUo^p z!><*Ld+uVYGW+pLR6lG+eTAfw<_>v&R#E7`)MR_GhV&)JcvI1|t1J)6+h4o2f&Jux zGJdcTX`r_N`hQ&jS*Yhlt<#hPcn0DsVgF&tdw=P6>?h`$(KNnT@7zxwEYy(iHOkA~ zH9gV+Ylx(+n*A3p|Aj9LQJGDb51_+uk^Lh;;IgxvMhUL~sZ1VGn}!l1NNf~Hv~m|v ze$EW=1A@R`ptG&aKR!fEDNeH2MMG$q6`vd0Au_G7m3nnDDZTYI-!uwx z7~czGd<(dp7W4PHoYLkuL?1mpX9ujPPGyicGKF%B*+Qe`*{?5S$u})2%HB+=i4TA3 z6oGjnw8&NQE037ii6ab;LXuL4zy7XKTG}dpna3!fHU;rjAg)Uu_G5qY6lh@#Rs80G z<>Ll#xSJX!p2V?fVUs!YJ^$PSE}=%_bFOEo#Pf;m>UyU(QNuoD&K1s7{!MWr-4m2R@r3#% zYg7>}vu;i!-p!o-XnyU3$Vr;?;g_;OcOG4Piyakve)_F@3=I+m#QON3;KoEt@bd$} zvMsqlUX$+g$4*>f&q3Vpwuiv)@Atgz-y`luM|^qL2+I@7QZ&G zr2Yp8syARC3d7Pub*KT=2aJ&K`pLsv(UJ~BaRo`Cb}Qm48JNZC*h>k3#AnX*G@FPu zQ<#YFxusT1pW%qYG~I9JpGVY8pJvl@CV6i_%3Z(Sa6iG7i-d0(Fsw(s>8Yx|YuIt? z&r8iF*rdOtFM1+8ir2jMAi9eKxR=4DkOWJ!G1l<5UD#4#rT@7w_$f2QwzU;moCNLn z^H!}D+9es_4VURh7tnh?Q)dceVj>kVv-_!@F)4+&q&1RU_s*pn7vfTxFi`!>i(o^$ zdWh7>8b>Ri0>n(IbXtp+k-Wt7Lyn&q1N$+~D7$l*gE){(SbmJXmrB1d^q6?RQI940 z`NV5c#}m=Q6Zes$47bRakn^&|smGOMb*z`WT z0o{;XFl*WF?7^*5hVsAi<4g9DYCP9Ryz-|s>67s&{()L?$TAJu!J2p&$J95tbqdkK z!W1RN4i#x%$hLb>1Ee{=T@F~_gSe%4s%|H+f*uc>?3Il*b`sOPn~m%&^Ox@B`(Sg9 zva@GDZ|w~xd8e-wA8YG*n7Z-a0fC2TI-{EGaEIDSz0U}VeGtcUtl{&CShtl^3xXYq zH)ICxrl-$)=yRTG%`Z1arx&rB zOF7l}SvCFm_@4g&!^4B%d|hs852>#CZ(nqF`b@Z#CGPfjdEantB_>5B*&e_7{{X`o zEV_0RDGu>?OI$#aJa3B-Y{hVU?9t=>Fn9o_Dz0+XYBg3a7+b~`;ZY4#aulgqB+1>l zA-e(fpgKwo5sIK!zd))*f*<}lTxXeOu!#z2TwJq|kA4Of0I+myMfD!iaUX@k52)Iv$tbwZ+V+!P2C2{w4%O2OaK0RPHw1*&#J~cq;{J&0SZ3EXAZWo;!AfK#;9f1|gw!f&FjnQHY%@xb#-)uey%oLB0f z!S|@=LH2cv4XXW&^%p}1B6J9S0xYxQS*q*C`|zI_Vaj|1>`@R6?~RbYXDYKlJpz7< zn-pAew85`wkhvuJ=7QvgG*i8>R|@}7G(GNjbI^2Zenuhe;?&xVvbj$D!F&_g5b2?$#y>4r39dJ1Ji%%w*!JA z@NkU$rJcm(|HN-OJq=R@b-VdEj0E6^JU#@Ev4Bn9uxU+`Up=}$BU-dbipUfv4%2@5 zx;fvQC3`oooM9jqzn8!FEde1}%ehrP-O9z$ELJ$*JlSw=W>UZr-AB!yx#KI5bNt7C zkSJq!uU%Ex&P*-nK~R=10mbL4@##sM^(PxYO2)Y~E^2bM>$vbSmzX8OO64bTrKvNv ztPScBtw(ziO>1>jQ@Y6BNm;=+na6r={_*jMDlGLBpm}uB-#Tx&dHAmIq%_*N#c$@T6xz9VwmN69@QnMxkMNvqZdJM5?FQ9! zPRfI@CoGg4x1-CgJNsW*cZ~vz6>Z~fE_N#LG%RR-C&~E;PF*p`(4}ETxk}6G-DmN zu1pbUCyF(BKZ(1Fb`;Gb-Y`H{+sDgT;>mv|C%m$}mBlnT=GBhdC`wn0i*DP(nsO5D zk|4Aqiptcja1kn^uq3*#Q<^YcrTfA4fD<&N)*x-9fThoHrx#KJ@X1nM7DU zr`=jEci~$8I?c=Bu^IAV!B?fHab%+ULPj3l+qAzxvd7&;F`K~rdyAYM>b&*|#_cOT z=qBOY$2_mD$@U5H8?Y)=Pa5Q}iylXeUT>shA66e`L}6tiE86lH(<_Vx)P?od8vYHi zU|4TQLimVGvDXpoXKU5^1|Nap zRkglH&G5d#`X$*vGKFDn$JA8p_^Z3!`aQRxtYQ0;kWgzoK+8)+Av_E`?!ybRB`utT zlL~EQfk<~RH6M>TZ}6IU3#@q>cEf4h_lNS4)839uiQR+mKn$D?`Qftm{!vHe{&9P5 z*rsn}Y6^?gkyR*A1s6_`q7dORg`J!F+Pn#Wc<5xS3Z&Z@9vzDJ88y>?;E-c?ztHjF zdqvw%lnO#`T-+|fc5S}gs<)?{Eb*FoRR_H95bd5j8IVDDn}>0_kP|NU(ILpkCG!T> z6yI2Y>{LB0^}t(Aa~dt5Cc>zr?r8}C4$l}3mFOE!^2E7OxR#W!n1R;Bs4Wrt*bQ!Q zO;c*=5-zS~VNc`+-K2;-MNr-ZeU@lC5zSftjU`1c16HMB-ynsi#9$@y%<%kK zeO}63l)TGWA6~~W*7;3Drx)d8z1EBdb~$^P-%v2O2>f4dAd082i^+S`2ChUXP=!a5 zIiH0q9)?-AuS*Ny@_{{(n)G8({Pr)&PTPxaT3KVp_G=mv?Qi4%3L1rh3&9AcPi5@g2+3Tqd{FE=8=J< zOEQAGF&uouF!cU+HO-n8Q)6I#fyLWC2Dr3pk4-esC5Do){$nV>;`>1l2<2B+K(~{Z z{?{fiW`>;tg*R0USL$iZA=}RT9CRWA_0PNPFdC2+a!CkWtUFZuD0#5RO7EaZQB=j= ztoE68?ZMlRaV!?oIj7h*{#!1!&kGX6TKZ-iRoCoAHPzRc^l#7 ze}=le(;~udGqrgEsq4Ytk+o_8T`&D&p((ZVo$vS?N3JLOgTJYfg)QAoY|n9f0IJZW zI&@x6CdfEuo}_QSW`CoyGOGo99!Y68RS3~((i_rw_*3Wc$RC~FeEz_iFv^GmfQ`q{YSgKCb3_ zdc*<(4enIEPXld$Q;sYXFSwC#&2Z~gxa?YIP2B;o&9Ab7&Ax69_DyGoLc}^ynH{kG zSD%VjCLSQ`uM2idd_N_@m$qKG;(cT5B)3&Gkg90)*pP?eFV3f)d?#iM^FJ$HN~h=E z$iRq2`}-6lxro&9OuP2Ej7(eMcgLMTOtIGOP{N;fHUC28!?2R?_Ft10x=LHe+osI@ z1H)oB(O4G!HtF+=^-7vBy=%K+WB!az_zSyCq+<40sLgJeJhwhgeogcCiT}_>a@d?G z*r9Yz7XJ3AQ4eKy8Y2;AEy@l%HVFzYJ9*traiw_*aCV zQEX}J%N!>(OSQo}6c2Gs>gzdt5^U+NICE2DPIj?9-p-se5nhU}9yYY2^Q{S_PWtSe&$IF5Tm+kI1DHeerJ@MOWj!j= zZF*3~w9a_Oi=2M>7+RMvQd>H=A7HpzTk7R=Ry5}+mt$=P83(gI#EC+(uB)zF1PSmb z-e@D6^pvc-g+2M@NVb;eYcBtEzVk4d80$rhw*l_QDiM~qf^xwde)z8>hlsWou@JN# zy^v4xi>LDNYHE0beyyZ;^n6mCGV3aHT6y1RtQT?9#P#7{ZDS`095J9 zM0j#2-5up!`DGFtS-+*fftcWwJ-7i-i#@ebcmqTR}%8F;|^f+`P? zLVf<;d-CyhYeHjw)?#XP4*g~Vg0@vK?&uo#pESjw-h(<~*ULdpD-0kL5leNX@P-j^ zAJ5u>kh!K&ff3t&ka#NDF=C|QryuP9SZ9laCkE!w<~IIwD1YLv?bpggr)_qxCdCrD z2}M5I`)7?bX@OxF=4TDbV-G#Kp}Vlr7-1&@OegN3Ur>u$k08|_F}JK1N*(J)g){kn zz9YDIBlHY1%7r%U*j6e@q1Joh2d%AdJ8EWAp|r^M!z0C0DcDi0> zImf>k+9e0yj3D+Qx1h&;I@}{wQ`*8!*IvBdeQFn$8IIkFK4cnh-0o8Kw>xstvtyJ- z3pH}cvt5lzkjiu6#tBQV8>=jUo-&_0#)}=g8%S=~WtH!Oynf8t-WjjXz_a!y zRR^sp18#1&vVwamzF}E2BGB}}Go|M{U7!ZX6x-&&Qs@OI1;@!N)L7c zqTn!W5Z#Q1w_9Z2n3rf4q1+o++4Y~{PIji)fau|njz-9-)TeLlzd=wIK}nuF*Ok1d zN9Url&MC@=!DmlmjZ4Frf>WY-=+2)++X-cMUGjRBw_z&(;dD!8kDCq7+H79eRSXZR zhz-F|t0&NvjN(1U3>(UOkt!-ZS>yizvV2Ua}eT8g#xrll2I@I$am7WhUilxH(FmXRI zVS+}++M~?K>~UU*z4B5edlP}a6hvziGH{3{B_C#cn=b?=8PhVnU6PAPw8Lh|?>0Eo zQ{aax{7u*(7EYG~lb-(&SHqVif#mUi#~T4oCjYr+kxaAEv+<=Q)fV=(#L(9JV%*e( zkRw|Swy>8yyVIiBQ=QP*wg&GYn|B7=NRj{QIIPdRI>6&~bxN6ICT zMtSyuRd#*m7YylXS%3g|y`avC^5zSQ9772Ejfd-b=xLEED0S2S5&-!=)(~ zj$tSloJ!hwIj{SLF$8_%nrw~Bg>BblN?yP##&(=w5N?6KgP=O(rmr+9@oBD?S*PO? z`SmRSUxY8WzsmULGgEi^z3vBURp%Oi$e!7rzYF%-p{`JuWSjd#malgpXcPJ}FH!qk z_ruu$(Bh9=&f2e@5N^%S=#f#=+wF~#Tp-Gjso<1 zsfs^fbtCcxPa1CF-p?(l8ZSTxF4S9PI~})nWGWkizFkDvIkU1@{~O$?Y0&-W;P>~$ z@r)rVdKz;_N@Cl7yE(%vTXA`hhO6*jG`V*!`7S;6#SV)eluUAhe}UvsLR{3W^8na=HL_=g9ZDAGktN&PAaT}dz5>CfR`0ilq9L;4@ zI!p<97ZVhxUySFKJ35w?z`O9Ww9WrNOudC$lkXq*4I-eDUy+iSN=!sr8a4?DiK(ZeM@jTD*{0-N2oyX@oKkxVJrQ2gMm)ID9 zGPtV1bTECccqAv$RND(on=U+FWMTFH6jq!7s2;{x{j4A`$dXn5lu&Ti+*2D*x1&p+ zi_P;oPW0+idR{kog!iHU&#n!##0Q|hGko)FkQ#Tb+xbFb?!i{7Gj0VXSy&Z^SRH1P z*B!1vYSWu0 zxPaw)|0YMXHTFRt?{jG0(FvYW(29diux_G7QQq+hCii34t`eZ-%PyQKxtY^u$pAO_ zX(U~kS5&*|yKKam3mfZsbP@ZP|8)9fugvFRwsFl0|NIX8iHscV5R+mvV;#e+%xfX-MEnhnB2$H@;@tQln+6>$vp@X;cQ(*f_X1+gUV1+k|W z$Jf~q!PV}(f{Ln5BVdWFifvl^?Z0Ig!wJ* zIwH>z$B0jo5c#|liWUB?21UMwzI1euS?phSyX9J?#zrvqpb*A}(thMfsIp*IQ2BRG zJI2L73zsAEe0!W43(*yV6W*E|$ouV<9SIaKMYQeJXfHbW9%o^{S~AEZ{<^h1siq{n z6FhC++d;@_$NRs^O?g1QBmkVajMKDwA;$T2rk&}#TQMgz{Wbg0JFEu>U1ISxu-Xv} zvy!xM$*;HUV*q49ZgzO4xRse$dh_gKm*Wv!NiagYV4*?XYqRu9Iy*< zbw2$wOu|iuN(G$MX+iGYP55KeJXia4GAuY51AIqDtNkR}>BOGA5jPrF89b-f;!OOA z(9{dq#{sU9ftx#&__c)b|Ba;3O2Kt@$JOx~ylHHfc9n+!_|Yj|(OlDYPf2?2lyB{w zMjp;aOQJq|R{jy^1Wh|m%EG)&df)?ffb_R7k_UI);~8Fgu+l<55J{$D%7utFb=kxp z)1L}J@SZ&#YnDLwj%@AYZe&2_{eSCDOM5EDO#0?3wpx_(y4L7kV_jRR%(GM|FksD?q_dWb^7&8lWFjug)JL$ zL;{L--aHJHSqW2ZRW=+yzEF_VP8Egk*cv~tsQNxQWs+}0CT9@tj#+{czIr+;?_vl+V9B=TPFh=SZ1V-|)_cO!8H2>`XnL;%i%EE2ds!ZFxx@q)F;-=l zFn0#gJ<5}b?3FHP&dk8I4!RlKilU=5vs%uYx>DmwBG1oyiX|s z0_i?qwTI@Givre!;`dPDAA(e;OrxoWb8iyfp1x%f(ESxicCTj6l^{L5gpD?3h_5|S ze%at!cGBe2iJZrQGf&)`t6HYLiZg;UP=~+8eoeM>EnAR++p)59h<|z|@bto_QnWPu z1@v|j0oZ1Lqtx?Fp)%Qc=>~39q0jBsK5E_na)DckL!Bo(gJ1Ps8rlAn-_ACcC)cg{ zf&l2Z85@dkn0a;`y>7pJ&{us$em!o!+5Z}TY1WvBBS#&v2UtrTyq3G@YWMvi@{2cN zb%;+m`5MKANhSNQ{-TXdm`zt;HKu`;2d>FQA#R3eur@kX7vaCyMVOyzEn)km8ZL6L zzFjH9-}fA}9&fbnKDj^Dnb+dF^Y>n9T$DO;>uq^8m3G8Zn)I)kbiH>Qk zU-R{t_RMx?3fC>nlab&~1txZ9kISusT!~Fh_k>R6&nexF;mDWvyFCNP&T^vBb{y12 zbkR@i%bj3 zk_Fy74qd>clTtUs61M}fH4Id0aeufijvVt`zo#40ye7FXeYklix$VPU*}c$%fG5M9 zz=D;ZHAP?)vl(nmd^r!}PanTFFJv1bRDT&fCgp&--}mCfs+x@c>=FFX9!2;<*Qz%3 zZ@?Q?B$y9*9zj?dO1Q%Oa4(b2=LIpd8nrGP!Z6MFq^4JO-d% z`THELwY+>CvNG1Fkp3>kzegJBQn|Qu``A_H8jx@SKy>Vne<7FpbsmjW$;bA)BGMk! zdei^%nOqczgJOGzi0*(4q4GZ`v;UMNM7)Ga7e{ARSfGaPCPc2zmmNoUBYdz`HosW1 zKz>&W-xl-bL=Uq>JIwb0ZTQ6`3HRSMgD25Z>!BLokpV$lLX+&m<7iU>RGp2q&c6vp zDkrgEM2hmh-iPs7gz)=*@uan1I*Z6Fje3GmwjBMXPdE7jC%`eZs!SmhN_zBqgM@co z$;m$6)6K1xAqm@siKxb~HIM62lso>TY@?{eVdxIbVJ9QaxOT6svp$g3RAXj1*$%zr z=c$ys@@!`kLI$u;6SrLgJIUH_b6+&uLda;>_9&Wx4z+&u*_EIxJd&Enx@Bf2B`~fb z;l?v8MxN95ww$x|m_I_<*bVtL4Z-n>qbQB1SM)Ac#<0r=gyOgsk?*c(lIK5J##$V1 zq@(`FamgHq)A{;QC8tQ!{%$}n`8N}+$cri3W|mPP!{)<(EG{M!H?-RSn_;A>vJweV zPWE5WxORkXY%Tqp7zH3xylM6CVcuo$-`&M^W8c(CIG{ef4~P`;e{Z!L6si@)@jh`v zF?z4K)A)Xz>jZjtne44dpsN$^RggXV+D()2C=JJKR(iMdz%>CFxIDMJ8H?zQN2#vcKRTOop8F<8)0vHsm~?TO4$B45*zA(?zRkhXeb8U0gSZQ6A( zrt2SzGnAis6rYRjn}$TjM9eDrvqeFm?3BKP7(`v{C&P_WRnVa)3;(_x(Da_i-7ypm zr1={*i9&bE^}u)6Y7E({)C>I2=_#$ELf=t6=IIu9ISFbo%Sc^T)vEb)P`KKtFT}?0P_WRrRdD!<`j-zJq~24VJ5t=jgWh;@Rcj zbyuOCQr6M1cv<+$yNcaPgk8%6I$Zav?~eHP2URyEkrI{47t(ixKK?a+UO&^}=uoTk zEW;^o{Kp=NEmw!iO3@w_)!Cl;bdAIyEP-z`&XQmUY_G%B3es(4--d6u?#C<4vUZ2@ zW@RZ1E!bEW-9&VUB!IMiwfmMpMZ{xHDOTBi918=$r87u4kT8DX6Zhw%opti|Cs_oS z7~RaN!bD+q^>O0D8h;^G9|dyvJ2aLf%VpDnVdjv%+foeMa~la;T4UydM&A7^Q?ztw zb9KtfO(@Y+)O-%M17HQvEkMx-3rrP)4$s;gdwNKPmR9`ij(9AJp>070p4y{k{6DvQ zRI?FdW$#uxSc>{M=djI~$Y3uYzux(z0Wj)Y{bu}RxW{)T?=YMXjI<^!afzXg6ENr& ztf44sh58=jg0heYAz^lwzYo?W$qW0QAUz~u)=%xy*DBrH#n!)qahU;O&x3E0i`1gb z1F0jSV6qxo_H>@^w>fzd%c1$Yi=eYF#V27x^64ujX`33%%{(q+vcC3lP~hGj3d64t z`DYgE^;vo;8{>zAX$x&APrIS=kWh zIiF-TkEf(v>uL1wPN9~YvT{A$QhONiaFIeSeMNe)bGI$I+h*SWRrBM!Xu|WacL$1| zL;s9A^l3R>MjXb*xgLB!|6{HN{gGuT@?l~66CsN0+`(Hjlst1b_@?!MV7zFh|e zjf$N91SIvhb8Hx%nLK4XF%(#F5Gq1h74R&VQ?9RsOt2K|iY8hQ6!dqZ`Qs&|q^PAiA zsDooO5H}PH@R5(25urzZcjd@~jmd7YZD<>B(8NsdZ$=(2i4+ovt zC0@)Rr~_R8YQPbJTqhuw8HVPfY>}T3>NE1is)dzO3xKHegLpD_qNh+pgsIEc9m>4; z)u&DGb6G#F&9dA=O4->v<6@rd_Hh3R&m)m=ApnJ=pg#CpcRyECR=SMteF+tDd)SR< zZ$F~1Fl<45UNf^^!Cy_nt@3!K;<>~oC6%Ik4@Avzk0?-vgTO5RDy%OtDyAM=Kff3i z_q0&6MufsZIl17o{zvwfey*6D5%lHCptpHJd8Sa7oey9@u=;qGAANP4)L{{USfC0# z2y&c+c}AF1933=}Xg!!A-J0m@Jl0}XP?m1v<{!;`i@a+7$7z)N>eI;swwi(crcnG9_0qm2lTZmQszV zJjCX|@e3z@+KQ(!lh_89zFdPZlY`OXBG3A%M{jJPkE{E|leMDR*ueJqM_<6VGv!+lcmDy`r4I%*_8kq_ zb7_|MEH}e`8(`lU?08M6szoa^B0s2Gy{2mBN2deV6RSx zSCshGr&72BCoA@h+C`Rv(vVi;<72VAX0$!8G9ft1bAMakL{9Z|YOZ;|Dd`iZXVULnY4l6XpRN0Uq_~#&S}q!mml~YE9vR z#!{d7ite#rvHyPeOCc-JWF?i=ZF@X(ltt=QuaN}2@LnJiHvEqv%3l93FsQU^te0@R zSzFPM;aL8L-yX6Dez0&U1^q>9wAMeX9q*k-&!4|=^%3N&Snw~r!l#t7!fmKx)HgLZ z30EzK5$r?q*w16@Y0+m0>TmZ%p}LPnA)*TNs#Z@;+DSU=PnQm=)Svbr9)4pMb>Fo< zNkp;w1wE65u^AGU7`!Xvn=ZK@NjOpuFS&FKh32;%=ZC&v$$a41$_IGj=q6T&ht6fB z-(Gn#9S?3va;Da{t0D3{17sbgVA|j}D?70sHCM>)24sw8GDx}o3M2VWINwx)3I1Yl z?z0c;@;b^pzdt>Jby*}o22|bMetYbQ!zkMn>mk?oqLfPFzZIYN9HQGiRF3NvRr(ZE z^fNt*_OP$x$CzlYWLdj&$8=kT!KHDl)DO8D%#~vw!-LJw+=PKUr2{s z3=^<~J!gHJUi>H2r=b#iMc3qFkhSAURs6Sb=$4LsV+OvVE16XakrDIC=d zmZy@F%nrOJG~{^O$4YEvldk;;fR*+li*mF~5<|eO7a7C^l@RkO2LaF4ID={rI&Meyerg(`L8yO`u}Y z?cW!#8`N44*yVfqd%G&Dhr)%$(;6yPhpw|kLCxOI__1q+(1i>jBG|vvn-pR(4?`rca|{*w6^=?PNNJ)(@?^$y{_?hT`u*uqUESm zj!V(7<4S|m#Nd$@tzp6iW8=y7r>pFu#nWr#Fpy@znA~%J+O!STq8~3TG7sqg<;v+k7Qqb0A#4IgCvTM-fX^7ey0z z){c!5yKAA#7O@v5MTnY27RIrLTB9Gc6E>;SMKnSbHomYQ$Z;7HjOYHBI&_bqgJY*F z^_IEgz*y+jF!+w};!Wa^0$#Nch_Niq{)2M60xt_0dpWgXlA?OhA_aoxo8el|*MOiT zuGgBk#8rw2OC{2Hrs2*!lHq1lT502p|J**fFoTb0-yV4LHH<~B#2@On)bbp%KUohV zQ~pQQs1r{rMdkS-3@Vr{2j)}Ryj;p=+c#vHTQ45*D11{D9p6#+W7Yy496yqnMW+g; zNz1%Jt%IlurYj|yh zK0sp*X^i(i-FR!E-IbRP9XYngf=FtlSL&}=ho~8;4)gjRhnDo%cFE3lT0gG^Hi&&H zfCA(tzDT$ochwKI_~YM~h}I06GGNly2KUb-IX*EtAieGUUj&*`IL z6Gsj9_;Sm?ggVKs)gQ=xqOLQQ#_(Oo?xY5;OsnV670ttD#L_r?d!X5u8bEe0_Nq{I zha1lvO|n$P0UiT%ifVyarG4BjzqwWA$L;3Cqll{<6H!K)M>^N33@2Zl;iyI&?L%l` zO!9eW#m8(4NhI!TdA4w!XIme*>K_TasU@rT;Q%kB4(CYl;bKw=-#lH2sUzugc1(Qzl0-Wq7|Z*A8@~Y_Bq-IR~>%SI3aHT5Dd|Se2P*k_ayt=JrI34 zVc2v$I-x^S&UiyWuZri>swjnu&wE`CZH+-erkqoHMAkm z>tzNbU@H-n< zY}T%oR$eEeH4webbPz0?+)}vTySO;$jMucFEzntH&@U?u)eMQtVxg#A<6=3h_}uOy z{ngUOunr;Dz38g{?=p7i5XwMgnm?~{>K{g5}NjahfJFUvU#epfk|0uDu1|&P^>-n=EHFcwlttTu??dNmg8A4aj z`R2|L;IYt9Xsxgd2ZdbFZ0bSoYEbU+4@UwGNl0|nrt*TLYK;_yU>k?wYFxlg7d}5M z-#iVuM`gnWmY(op|2Y&DJS~Hja6RmvL*-q}V7<>B=tzl4-EIkWaTIei8#9tScaq{P zACdu^WC^=fDu`Ee&jI9nz235-9z#WQDcqcIl8?83lx1fBoIl<=VJLl^mA}8Pio)Vt z-@e-EO8eHESPnHFuG8!8q<`)%Axizq%!1xBo8@!`iD0_i6!YfdfwxmQ$L^lBb{&wd zez5A;w}U?U)@wNTD~Hr!+h+NXY;6zom%f3bR!${u2L=PA@oRqV?O$q8?ph9<9+cq3 zcI82)iK@p%>%x8~ac9lnG;FkULVq18%?;n#a#UKR8?f)g{Vy--_X2KDk!~G`UEg88 zzRYP;pJWgQW@`Ja8`C}+Q-NyFr4HViPo2=V{_0@6tSzTXL3#Qt_+iWp`<*|Z(?YLv z;|=QrrBG2Ji_z|=u&c;17AWw3WlL8Ddg_nuZHArWvGnJ2ZOFjqC2G9`J_D2BJ(9UL#GysSL>`gzdtI<>}uT#%3pn6|yHb)TjCh~Lfb z$o7;xnRNRC^7HDj#jl1o?q%Vq0kWD)b%7CqyQ{0~r|QPanyCl0$kLK`8E@K&ouA1> zK#9KP9c-Ycx@bWO!s#;I{*oliiGmP_0+Q#A<+W9^5LnSj$kjXZT^q9qlRd0-!VXCs zb3bCQ&k*q8a_aw`0nsTMX9c^mBM^CmJ}gk3pU7er#_&Z{iO9HGIiznl1>qy`$LgiJhAoC;=c-;1!CsqLuCT-UIQnda=%R_?Sy4uwymd||u_$oJ?9#9l= zq|2!PFF(8s`n5{Eg8fQtG40B#f4qdc+?w2XikU)OzfN|XiPm&3lrVF7UZY0`EaehWsD=sgy+IM*WDP=B%fI}G*K0y(R!doE?zxPmT56JB zvMuTkpEq$B;R5&_cNui9Z;-}vo8$uj@9ZAPdL;*HFT9wQ%Kwql5s})aY zf)|w6BK&_|8Nh%__yu!dd(--T)47<6rGzx+h|uP>{7`3r*wXnjdT`l1 zfRmtPaJ`nMv^ZN{PK@lWR^LAsvX$m;+Z#LnA%`-L_s*7?+ZfhhlO>3G9gDcxNdfbG zOl6*WW-DGSo8i{=yN$7}-6lcMMf->{H_lhcx^)9v4_2ma!lD$KJ-kKL{eBIyLE} zIgFNQG)0wcqNKBMOaF+_4it4uRK>F9KSt3}d`s%fxWO9d8wZ0(!mPO3_xKW+mCDpV zqDT9Gwd<*ma*1wri6$0gIII^e3-xtA{~Xx)2bcPdT!Xz@IM}?TgK7GypVlkP81~$! z@{7rVtKiVwJkx;1iQ)3mhS@8`Wn!@T7|DfK0RF6*8GUt_PbbW)&-4Jc8(GPFDC#@H9*qOk><>l zUzq|>S$Kf?Hru<_N6Y?PkDp5Vsru#nKX_c@7uK5Q?A8^COWZi;72ItLcm+RG?SWhh z1-PO&7ya=s)jOv1%P!T8IvwSOF?5GB;JKmmV1er%p2g`h0#dNT^K3uqBx(rnHaof8 zcDcXF3FuedqlKLKRO$F-`VNLR<+~&wcC%rz z5ccw_s?(3pL6#4iXS**zo$=80t5T#ZCeZco1>b9*1JmtJIh6O}E{J{ZetMHM5AueZ zm|h!cQ&}!sL<@f|z^;_jDW!72tg&>1P3-f6IozD7-x)P-jW3E`#z3BJ+CD3N! zgn?oQ&9R9ATaE_<=aTMzc?{0_-;b`|U!Qb`+dA(hJkyB?tkqraN(@Nx@BD$;GI=*s zzMUqM_s&gZ?&>0jlO>VSTJURz7!jzqKAH($u5#Ns`*3`$2Xk$gy$FigmRDPMFlW*C ziK4!S`=!tJpkDi|Kln7dGq02D8yaZ+H@AI4{{wAZ4E4!h7Fl6ZV_WO+X6E&tXgS|f zt;_i#NcneKW(UE(0p>jHmx_5YIuufkW^blivD`)P&2Ymc;pg?5%vB=uGXjyJllJ~@zvK^N6r`goNI}}f#wv%eFR!? zMY=JgGC9LL6PXc21uJ?Br|lp~_+aH;sa|MsR@7^u@?Bfx?jvAzU+s=qq*X#3*JNB2 znGo;+!N#Hgz4mo&oL*}m1p4WRfdQNE%4`2(gGFSCaS%S;t6cX0`-F=Xylo8mAMo%y zLe(fIp{lBWC6{;%l=aPz47*TA@Ux)>b-;hIV|KEnhcUM$=l(_NYg3bWaa(Q7%{FIQ zt&kE)WgR%iHEI%i0c9hxWyU$(a;|mKt2nbwLhhB4au2#? zF}u$|Y~BK91=<7fwkC%iI{sn-TSC~G1FSsm_o2s)7J*x|5~E46Kq*JmI`{~i<-BAA zRUZDZXTRNe?=v6oFB!yEbazT{k4anc8kPMuw8*Nm-#6S5uw7a{w;#%SZ8saY;@g$h zC$sdxTXzl>-%ePq!9NOnbMCWQWB@;3i!OrJkF8a5x!r+kS(40l{uvv4%o{tKO&a9N zzRvbFZiRIoX=u75pLxv2oAC_18E>!Jz+mWaj`RYtV5mRQq%Fyl=&{T0`rn;?$K*WQ zUs_kp5?akVJ@Dl2bj@FQK*zbGWA=5LDvLyV!0b!z5s*rrrS2>FZols}0vab~zmGh6 z0gU+VsQ{WORm}ne80OmnyCyNDNpw$D{bKru;#>^&I1NJg@g%Fh=jIUnS_~fAl=?jK zw%S2({<#^?fmEM&=_{mAN20!JGwyrqkc7*&Em(ivJC(DnU6joE^izLn)3rxN7)V)K zrQ*bR%Khcq%VC8?2IDmw5_Ub2pd1&6POtS(3Y`ZQlZQfbRBwM4&AM}@XM5)Q9L!^f(pifvorbs` zOG$_ zYd=H@Ow|%8!GP&Z3*UNW;LO>6=)#V#Rbyt?kPQm2JdSZ9AVoP_4%oFu0~b@Gi;rX) zGd9h{KNf7X{^4L1=SMacwX!}=G4;-2G(JLqBKNNtRe@*{J9NE%FONgo-#SbejtKyJ z)&eSK#{|;4>c9U)T#v>qGIjgN@lLi;HcL(VUJjM24IKg(FmYrR@g>Xtb$TaT0xF;* z)o}gqe?E2Pp zF?$0k?c=Azb^ty_yWT$pn{P%+d!9OUCLOrZTOhKlg;f^+Nv=3$8jq0TDTzpcJ%Z{Y zD@?vA(3FDs(^&XMUt(?`$HO29B;$1}@)KlFAI$s>qEFuhjy`jg8R;DDBtb=V>TPhX zsc>GS*i1tX6|A17TF*-5yg-`1&zAW!^GzvA`6@MRZ81Im<7y}B**$!sym)v47mrf-Z!>yk$ozS0K zSTU4dJqE_hY5P8vGj5lyi8+Rv6ZN|u=A(asMSC4$Nndb5kbt>=GV&+lLBm-BC1rhH zpRFFqzFAwn$Wt9*l}~?UTdGfx@0Kh&2TI@@QE6?&Z9p(8^eU-BE%MR90>kxyb3ymx zcz!Un7%(S;qaEi)O!|>4J=c3xC_od96^wOsD6Yb7mQgu$7=U;`1Fl>)pPRl=51L)# z!@e+S{I)E55`4ZQhSHs;&fO0HtwY;!WZugY6GE4p(~@ThyPX@*2#4zh9YwPw<(wfZ zHLwVR|2=a{jSz&$bu2gnIG#?vE$V>~X!5G~$`{{>b)bI?hHu8R6~&u~h(OrR#M1?M zu8Ef5pQ|D7ndf(&Tn(N!tUbbe?*gvOmx>YMD~II#;&2bAcC(JD_*D#AZeYfK%Mf=+nf@R9Ql+fAheO{)y4E8&%^nECYzUR(GaZ2EFI&dfGMzYq9 zI!9-a>MvXu7=Oe{=<&)jB;W>PaB28Ku|(IZ12LP2Vn>PV${IOo;UzhI00)P4i-BNe z+4Euy07O|yCyj%&hO5yi|cSe(r!ma=ZGK|D_gjOGWDHaY8~iOZ|c_sqAqbXDYT zqeZoHaZ;DoiH6LZ4B*Hu;+GGQS=+$M{K#<#HBX zyUqE<)46t|(EDF0@6MtF2zUDW`1$vsW$9Iu(i*E_A|_nCV!R|L#d^)m@wLH$ZRiOm zSnq`9XUUyG`70ODCZF}L6nbJo&k>c9?mi}+uWR0Z&Ls~qwcKAqfZy#hw=S04hp#K? zPo4Z_lC9=(fI^sVua^x%ToVKLuT(cu9DhimVVS^DZg|6kHHEe|ig>ZKpKa|?3?7{(&Rl@>Ng?&$xVTm=5dyEk4ksV>*oa~DCh%M%>)QhLT3 z56AvEwPYK65f876(A8hN77*S z4|z&o5n6B3Dn?N^eP`o{BB|vj{W&*nH;Jc+Y$K8HX&GO#9{aDo-a($+bG~%aBpGSk zVN4ztP3N_s!cZ!LH&bNPRER+Td7+@O9zsM3Rza-gU?=0}*-KZmg9vn=UR z{@q8kF{$kDGKVJJrq8{)Z96PW+e|jcJq@UxyN>EM$E7b2ZFw^s zy3;hlhks`NKLjFpkq&;-G%1u!Gelxz>O`3`Y)V<_6)sa2N+MNI1j-5ba-k*i5#QuF z;r_cSqO)+ZXHO6%f*q!U+>U=YKAQNK_cPb$NeLP&Cx%2=jY?QqRnk1Vqx;iWFP<9I z?N-CQx81RROX7gsDlT!oqt2zJ!Y6!@B8Y~5@P(1b6Uw7d7vkny`$tZ}^{I?rmIUuQ zI}Q8icLts+4sDLMD~qvo+v0zS3rNmHSQ$kDUm54U`%8}R38eozL4^Z3I#Pudy479sz7`i|lbN!om$ZfIveimux zF!1fHdi`+sMj{Pv>iMQE-1m7I%l$#mJwxNGgFUG3l8WnJ8(4gQVR6u}n%of7xw(An zebw*Q06!;L@cSo+EM`?*q8Q;&hLZ=!mr?%I#kfqpVzbA(7;(s}m%^a|SAt_er+CL( zIw9WewMbfN0$&NoN#f!m9k#c;Gd9?5NL7EqOR_=9Wuj;J+4wim2PZmIlWn(j)tc_q zWpcMI7`Cp%ZOpm8uBw!$SkW}v-H+>edg1k}*wAYgc^9KW$ z=_}&}TCuy9y>3HAfUll?bbT138+9?>EgsAezT!3be6~Sa+>7bY;e{ zO*HodC1cD(>`>xY@hO7GdiN`uwf^IX`A_p?DGvv5EL}K^lf|BS9JkuQOonb_z5rB# zl^fqK*Z-F(49Cn10SLRc>NcDe4N#QN82Nh+W7S}rmbah5S0lL%w=PYQ^D3Q!{v(DT z(QiFJ-RLGeE?`_2VA3k9t5N0xfG@FOwJps!E?yYo_~&)?!DKGu^s^ji&(j^o4`=w1 z!V35@Y{*v%qBlSsp3wff@!hR0Q72$uugIs@#LMtMeJS7g=IzC~IBNJo%EqE!;pe6sXomP(YJt zcl4+?a@e$NC!vNV-Qisw@y#vget^u*Ns`t zQ+GIWSV#ok-j^ywr%Tc6h!RiTev-wNv3^Mwum2QNMlon5TtMuSO_wLGNz$6buJrlk z?6L|4TxLzlzwMjPc)HGX zlTd=~zRQfH9sVxnmyaAdV&+@2)!O?d0nz&qn)N0PKTFl#`ZtAUQt?>r`dPlvz~dgo zhkC>H-N*Tkr7I4`-+A)2%I#-So&76N=)qB93LR0Dz3G0NC`{G>=Y%Id=3v z(QJR}L{{%5d1Ah~>|*!WVVbsAcb+SdG*v*8;-Ji(D@%jY9IR~1;kd;$lrHC?5tbnZ zAuzNFuc1<70sj|(D9ZUV0Qbasm+Clru6S26)J>P4R+u688s{N1z$n9qJA?n;iy?NC zDDmaTo4uTG3Ni?#a<8c7df~GksUVS~=lfryuxI4>WUTF}YMxYl>`H<`NUVYyv;!aV zijA>GMH?+)6#P+hlS4Su;tyUwY56O!ss~2@=of?F`%$W2x>m1^LDcJvA>#Jbt7_+$ zC=DEtiSle2e82Jy@VI_Bo?UMjlXQ+nnjQJ;iI(*;1$T3D~`+fSbfTR1;<=1oS9Q8pDMkE6h?cZQcd7um6@#b$%ATK~% z>0NJP?e#K0Qd$xAm6jT?*DUX*$4BEwkm4Np$(Dn=-+xT|{{3!FZ(-O8xY>e~Yd^F= zNqTmSWhso!gIda_P$s1N-SLMSq#SM{>MTWHsrq%OYFTZi; zx+@moAxgEa8R6u}&j(+f_n4iz3AVL`#=||IlyBa;$C-#vXCsK2(eT4oQ?_IDJK`6$ zLuH92p0W7qWSFJ%k-gy=U#Nz{6wX>6D!a@2LiF^^7QWVHun+6}w`0Rg_DTx&h;85t zSIMpztGNw){trB%q}?x}58^mH9nqj*c76CcNMPTH*y*6z z5cVE^Yr5m8-Riufpj;>+UZ8qOIR2L2ieH!H%ch`rL+cE13~SOZvNGgMAJif{f-da% zfDCsi6^;okU9ypJV8`&IjS#P^H*mo6yA9wu1`OKIAIGa3>)(NSwO99L*nOfgQjA2N zYvkU^ef2MlyAKyL;m7ftHgKJ{?%z;N)rTkES7y$=kV4!4 z2sq~me3PGFDH^+QVz#^T+s3JJ?eXp$sG4_oekjnOLE#+9T3NIh*sx?=Q8zxis4pBF zOpzz|d*Gg=;13(vm;c-k_{Mshau<))FXnfy%Ig2~wD8TOY7+am zBluPVZdKsG;e)k*aU3-)twVEaFK@}qFBTe7&b%y;Yc$;j*QfLQUNF|SO%!FAxU1wz z@L->I(MVwM-l?0Gr#?Drh3feDLQhK>$Shn)Z!t>rUfcCpl2K_gL6vzO6ywd zZw#3JMbGGLgtF|-8KEzxXnI*RqGN#5^I}(pev@kIeNw`1G`DD@YCf{7`Y?HBdEI{F zEqIwqM>=`7fCfFE$mYFNGbY)GTq|-F0=4Y`K%e^xMYiX>!f0g^raxP>DIDgT67Btu zA|eoptp45JkD`I+q`&&7Ku(*gOl>mpc`|O2ylp()ABPV2Vj58BuJM;n90i@(Fzen2 z6*9h3xY%aU{qMeNdCS1@D#VB^%=$=tgU^BHoGp z1k}N%y#`m0cV4$2z2OsCQOTWp5>Jpd^JuZ|0Zs0MR&LEO*XGl`XzVu>r@(N0qiL*| z`e0)5@HV{Qyokc24o{~z^QX7kU=qdY`tjMaxZ}zRfL*Hd`?l>zxzz_Ll=)>SZf-@k z{9ghte=@`_KTLqUsV#OrH3eiv7ywo2j<nsb~tkAn6(2jEl2SQSuUPp1aLYyP)(aR>nw>-d5&GQcoAF0ei zr*He)X?_UdX(JxRB=%w6UY-4`FmD-e+_%vm2>7z$+u^qzNY9lGYe2b$w4UO1b8Qy$*M$ zQ?{HRts4|)9#Z6fyh>KcPGtQCPZN?6h(L=AmO$D%dXSY88;Sbs@*=+Crz>C>0cvB> z-qp_0IUGd=hIT#r^Cj)?@?z{)E~2QoQg?M~XQN;%QV- z6LB?(-47kTz60rOwJHOlBmSej|H}o@AT;|y6=);WwiLmL9)-G;T0s9@WMd*j0&*Iq z*G|BiTy?&)_cw6ceG~4}sm=K`7eQha6}dZ6mMvhP>v)k<32IYO^V*%RfQ5toqFwGq z!CTVKa6x=&Wz55ywByiG6lvAg8kMs&cINza>qu^lSVk)*+4`|`nmP$Zlk)69Q{6v3&E;el%lSdHvy%QYfD_(ufR+3}nq zqI4cbCwSFP*L8DB=1ig1Z>sA~&Det`pN+SP(ot@M7Q_Q}Fscqnw4>_2UAPP7VIRt9 zoT{hrsjYH`7*M6gE%XF~KH$~c*Gqu()<{wx>R4&Y%*dg3%wvk%Qq<3Nr0%3SqRak1Cr3f~o-pZ;{7b*B$ z5*hsLm_cdROf6?Oft=a6HcQFsBx|^5$0Kgsl|hDLcm_7t?QnL;7wSII_Zji}YE45b z%^XAa1U@L>WzG8aznSbKE@>>JvIw*r8+<-pJniZDtz5BM$)VVjtYNb-)b40<->j_k zoiFQINU*k)j&c>9)gxd$%^8I69_1=e+?IlCAvzfQ8oso>xL3pWd)QGvqHR z2t;xnQ>w(a^_g6V90WG2JB>;cFW60EfIYB9#~tYc4yZn9Vc$^#H6U-!Fx zh@>zQR*|}xwFDjO1#SP(Uz-gSPArcd6S0H{ImX|yUSbi$GG(4(Vgh8&Dd=-XMu4PQ zb4Q@KSg=z_$=)>DWH|85`DV57`r+jNSVG|RV94e9@by6;aUuqBB9JNmPdzL2aPbr> zqcKX_6P&onUSPm=|sEg$_f5l!oz(C@WtibH)=V zZIb4Ait9MApThmWB!Ye@zE>E^8VV*H%>r`jkY!!LyN3aMz4dzwuYbD}M>MTWQb%A^C6wFKAYe*QnM0c)#(Q|{{dn02k2mGx6idWT( zeLjHzk*5p9hxdUo{=cJk*l4sul`S; zPue$py76mE?%r}3FWQTLBo=Od=GoxHAqPIb)cSS4!VsPU=g)uoHk~iL{a^pA?=w+w zzQ86(r&1Acp{O5rEhAy2oD1(?dyO!NNbq85L zO(2i?R6=C<+}3lH{x5-7MYR)jb1}*+6xzZ{v4>-f&_*%Wa<%5vAh~dfSB# zro7_T8D*ebE@M}E`V+=Eeqe>d=VbLx7uo(O*5{5O*hM+H>EvM1obZP4UFeO2^&&@C zfd=lAicdTk;MZ?H89mg-A3w102{gXYpE&?$nd83lV>Q8T{>Egi@JD9@;cJJ|#c`i(?YH{%MEPrBs z!XJ*ueYEXgV8UphjS@ zVXN&tSU>WUbGA{##~-C_`@&hoavB}=v>nIEF?4Jle49A<;pJQq`u6YaIR*lXFZkuy z#qYIoPKeD7rD$sP`RVb~d|ePs#lYt%SnX-H58FhpUx!M#%yN zSN7;Jt+fsR5x|NE<&&N!L(%#I?;2XUN<prF{9CRg8=WSI(KNdY=pHzQy16?{T(qLO3r_cE5Js>iPa(>;E0T|Db0ld#*Wbo5hajFXNihe)*N3^{Fc! zJ#r>N_F0CD=(d!9;=#1<<9O_pTaIz+cvl>qm0IRh_mk?5tbFP-Mo-#f{Hs59mR-?S z`xxWG+wN>`{Kw}t=FG(d@1~Jz)sx~^^B(`A0B_1uzU8(3#F)T*G|b|$+pBwF7Ly(qj}<0YxR*CFIhd(H&!y9Dn@LS zWHPls5sX z#%NaN=fYh+{Km1!Kj_xK|# zc8u8d4m6XYua$T<-RGja3I@drJx{gp19cthb0 zz$(nxl&z<2SuWgjpSw;Ny4d1PA-)7qgZ)ch*2TZY6DLM_x3YN~RI6`Rw9>XA*}@Jo zN_48#J@-X9#EtyqxD5fmbv6|KMNV9?{W-pKQvWf#d{%e*Jln~=LosKDwfPP*W0ufB z_$MyxjHPnd;93q&W3sie3G9p|{F3nxVESYBDSzYLx^Z7^#omW9a_I|HH(a00T>!!a zg|7IOk1^c%%LiAib2hfyUVIG>PWfXl^L09lqdsl>IQB>Rw{rX=TYPmE|Ipp?%js@g z9Qj=B;Y*-a;)jRF^3k!R1V!8X-Gvk==Rl7_-R>V>tV`RAc2;je`}_-wJW7(9R!T?TJ~c7$3c~{TORBuK zuype2Q)(x@^Z`~*y~|Sz(O1655{~j9I+!)KMuAx?K{DpKl$9(O&EZN1=$UuoRkr#rR;u)>HR#@iylE4GyfDcioOFaD+L$%C5H{2%}LR;wtl zUwj%~Pdr*z6#You>(Ct6x@t9L>wzbI2Mx(RyVR^aiWtdTe@MIu4sOPOTYl?3xQ&zusM!x+ip4=!skrJcB9U12pD&{#{JW zJ1>dnmhUiUW;VdkTTitE{9_BP~4}a?Kv>6Gse{U)OTTO$v z`c8nK-oJYB!%unE|L5$M*Sh}OZ;ia|))$%fMdnE?fN81!^3EEJ(>45C9h0thPn|iC zCCvPrWAd=qiE#3vERNgzSTYZgn;u-pTLet{o7oJz1Up8{NMCTA%cN`0>+=kMDazx?+B}759JoPQ%Zb z{2u4Hl@d;_3aQtZ?|@QLti7Cc46oZ3_32vv0lPu6nZN8huyVJC@#K-g~cm&wJwBAnB%XtPwo^^i~sxo`tzEYcBNy1Nt?DhbG&e1yJKC1 z9I)qM1jn-B`+&A2Z(8V=9k912RRA*Gj|^#Bpt>Qs5%*SsxDBH57Zyk&#ZKj|tvLo# zz5=v)Z%mwVRNlHFU_-L)gIoAaoHXs{idUJX4g~sP+V>7 zftvvKc_6xC@9~kLcO2&cMvks|QB%O15qO?F<=38lH?HAFW^1;G{R>_;Fa5@4ismJC zW%e(L2s_TrH@Mhw>1upJH1CEV7qSaiFZ(2@RV-1@#5Inku08v{;hS2%7+}b&eT@bC z(z%UK0VR6#P74CPGCruw-|y6Dj=A9UMJMM|6~gbljYPxY$K!u4xXC?y;W7(~tu>U9 z)fQdaq@lh*oM}0AK3@}{3g>tis)HPBQ7!!#JR;d7akI-ZMn`|xi=Qo6v5$ZL2-(`^ zN*A_zztNN6dDGs$)be;4bMq;3SKmE8>`B&RpD}p8biCv33WFVKw}Zudd+e{yQR`|oj&do%K=f0qpW;hWr3%{OuWKmYGPzxe)#ALr!4 zn@y%AhwIrUF!y_$PQ7ra95BaGWpgm<$U)q83#}gA>aM=|-1D7dht7!1 ztSSLpSK7P5%m|WZcFc@)C*8xG!H6vG-aH@=P&~;!Y43Mz-Dvqu@G6_Dsg=3)l}Sqx z1ikzP9`8CcQFtk&UGB+oC(S%)X}2WA4-Y@nA8CK;ctl!wgj~nF18?eo5WoD3s-+kE zZhTCcPMverys_VM1V)T@e}q57xPPWCJN}*Bjk#m?@+R`$@102}*5+Q`WqztW{Y1C; zczyuY&)2V4fBcc?V_e$R?)Xpn1NfM~&m)Ka%I-Pm2okv7#PP}b=QC(= zcic2J{iVhhj|_dd@KZKjEaP^X%5>I8`07e$qSvB6e|&t$mbFTObr0=??}Gt;#@*O- z)AP1`fQ6x7hPN<)4IkP&{OEOCmi<$_^~8bLFJ|u@+9H`dO=!Q<Tdu3-i8MxCE01E8mjy>D4K5D%7ga?ty7d^9II%|daof587ByPSF z0Ki^$!O5ES^bL4J9>$@uP(Y2zGV;a13&-sfBgN`|Naku zbDY4O-a1h|5M~fl=H=uup*Nqrh;~T8g>HD>kR4qMe~1~GH;78eJE2trMP;z_aR`| zWeRC0E=-^}b{)ML@N(VlAp?!qM zwDp4-JII!{^L?!1Dk4c6-pz=46fC~!)ZED-yFnBY+hxn%?M!)^w$xShgdqD|$a=Bb z)hyQlPG#p;-%i`hISX<5ptgj%miHW4>hRrv$W42LiS&+_h!Y%Scf6%{{FDJilR;FS zehQC3`5YTm;fD+4O6J=EwH}!e%|rMUpK&kh$Q6&`!K0u)+vdnl+4d0`JF&mxtzhii zfyl}kWSdgbJ2W>;va(Uzu`_rJ4=)Ve20Dr{CQ-7CqSLa?_6X^*liL(kHP-c!4x6z6zEHL*MgKTKrbr z&*9lG`Gmbj#;s$b+CY{sgRe)(49(E1AqT_zt@fBZ?68&|Mf3dfBI4D(>PNZARfRzaLp>0(r`CyndVd!0;HIYafI13!v`zH+Ui(MO_WfJ;Nj^Y1sz<#g;N`j8zS`)>X6ziY&`9s_A)nB#zhm+o zBY$&#q3al%w4?N&!@JMWyJ39rH=D?aZP62-OT_OpJo5@E=ft5ONIT8v&&d4}eEf(b zsIgOrvSkap?b}xTsIBIKTZ{X<_79418{W3?b!&iip~xwH{&3HSKSkIT*^Gk6tKTW8 z`^O)p>NMxrHz6uJ@!My?$Uzz z5<;IN?C9M%QuE|rM&+>OOT~eSA)oYqV%vV=k5az_&^7mdvLL$c*taZ0VPAKu_=TTs z3%b&`ZWb!t59G*w)p4>965|@`4}mb1i25h8pSAJGS06zLRCiaO;PBu`$o6;}cd-16 zuF(2HrtLxmJAIPS<9>;_Z=H83{^#_-7yWYQ|NI~SaP@!u_rG%l1uqx`d0SZqA9ND= z>A3J90vBi|07N=STm~!Pf-|U{lnY#0^1WxZ&&vaQpVfWf)A-+fxxf0`|LupXFDzdX-A&Y+*V}P}%{owgp=dr6R9@I;UErv) zkH`?#@>XOh^h>@r+Hp4gkov(E0f3JzlGDD>a-jx z#PiGA#wMz2$<}NWe;~VGp^Of$k)oWvfR`(O0j4wInHW@%>&j@K4v- zSN&GI$dD2r$Jgk5z1GxV`%L!Oa421Su(QTpH~Hw6FVD|7NF+fK4lb5@bWM7D%l^36 z+QA0@*pp@$ZV%;AG305B)#9Vor_V+fppS#4iBNw5%$08#kBxBdLzO6 z2%`ePq-D>#p;I88;cYye9dGeb*YhIiwk!I4d;>qRAADrcTRHqqyFSC$&uN=<@A&$) z^lkq89I!wfa^FxqZNBTpZ{nwPaMJB_=Zbxb@ke7^r;NL~b`N*Q&PF&Z9!Ce={A+g2?0z50K@al4heMr2tvvVFoL?Qw?vx%|<@@=A{9doD z^^P8BiGIt~+X+J%S9|Bj!YFz!Pnbg9NYGX{ZKpC2L^e; znW$CmC;053gFYhZxp9xJ)dHHk)}9+I0h#jHM?WZ{=SRw1ia+?tIfGx+(;hvv9&y&R zV}LgK+{DXmJk^Z%6AaaRgWm5LU>6$wS{|@Q^7EYtuGg1z>4E=3 zJ;0~hfBgHuzWTer{i~~g(zcQR{I9x!pF!raqZ8T#fC0nHBO?tk-*u)xrSi9OFMbTS zy^ILDzB5MUH!!${6h>+^C9Z((lEp^~SkNXJV3GGg) z6F~jDRfOq_o<-g%ztMBfn5qGrv>DpV3xUYUyp*!@0V$KaTH*Fa0`Wa%Vin$c(8rg7 z@I>#z#d;<}%ZT&F-I9Fw#dRiI`%Z(L#+J%y8~L!%4SW$ew$WdjbxC}eTjC3kK9u6m z8D2nq-0>C#a)z(pv~AfpP)?rti9O``N8j#u@aUhuvXE-a@qp5YzXXr21D`&L?r_4Z z-`2bNH0E*Vou8lL$DVcJF6k%mYMlB4&*nx;b)LX*-o31LAAVLoilf_pN)0*Lxy%V| z#Z_B6gZ@(c&UFL$r{zv#llU>`}?0<^4Xza6_46_QU z{hhWX*l@3FiM~6p6e^`(J;@RJ$Hxy}ZSe5Ua{&GFh%QP!ALwaV;6Uh3ctL+p;G(e}a#UKZZI?BOE zhlv3}H$Q6lvMbRwT*wC%^yg;Xz8QrxDoB4MO^jbKL`Mzd88OSXk3}&o9Q$*KAgy^y zeP!Q`fqR;Qm!y@GS3VyO+)hEN12mqVC+0wORgS#LIyOG^%Z+<`=aT=I>H)rV^xyyS zZ?679H}U_h===Yzm)BQ!gvi_dB%g8PHuR*2#_3<4%WFW)02@69T5_L^7)en;Mryt) zQr<_NhO2JB#_F1=!3tbotV@JWY}7Mp#V_ifZCvPEw6%7p3)c^d0PscMTlI^(Mg}~2 zJmP8OnWwMWaGj)IM#Yf~e3iXqePr?HmMfjU{XUT%A|Y6h(9$i&53W>@kQKt;>CH>Axj;VTJ4l+qqxIi8_M7TP9jmhg)fEvPEq z{ft)Ac-!z4ML>3!8?xy5n29y+VX(4R1ll?)hn?|a;g924{J0^>bqeZSIK>O7`i2Fr5s% z=r#P+hRVl9`w%@PD6h=;7=C=3=I2nuuy047M>cBdqsp(`0?5NmLNm2R*>o=2xvZ5J zuk*-%BeZ2Zep(P)!q=|byXiBWJ`fFj<%}==Bm5c7=iktlOK14n@=f}V7sI~qcwy~> zXc<59%?^q#+SY?sYZmy`fS!foAdf!dpr?MT_0c+&oU}68KHOfhqm1S+EfXY=@$@Gx z#W;zs4&YbHy!KjcXym!Az&rljC$jC`M${f6?If?!)c&d7z zaP>*nLbGPx+kzd(-yLby?ib`Z4n%QZHP#%t7TdpcYBBnm^GC|-Wci|ZO*!&Mn>1_{ zX-E9Vk^6jzLY>bi(~oB%QsXuB4G>`{`amQl60K{hp0-lEKz*_(b%zE)72mU{VzUy z84#TK8F(#IJ7~E~Lh29`p8@9y0m&nI5CM zvvL*B@#aD21hF%bIl=9EHrY8Ppe#G4A+J0l8DXGt97W3E z6ovDy5qH=h;k)Evtb(xpwu<3{&fjQ>%AddHi}vXH)f0B-4~Md}CA9ixpJ}uH_(u+Z z`TXimFcJURaiyq{m9TGog-3&vSvjU%%kIX9TN6`TCNXQr%#83M%%&x%VBuQ>Uise5g#(3qJ=W4I$fDJpgFg9 z>iB71=sVVaihPN~ zAN@0em?SyrJGmHBw)h!DR$;kgKrv`N#fI+Tc*s$zZX3cLgB!UHYGb&tV33w1rLHow zf*k;<#G58ANEDf(z1dC@Nk z;@^!T;JEQJ_HWpC7qeOqkA0>WJiFF6zL?zZUh}PduW3i^Jd%Ey#ePJyY*-O{Pi(A} zmmhbkQ|?+X1_akR4if#j9WN&=-fJqIk>9f$mNA;<+IC z(S3p+ojV?HF=HC`2iH8U8T*6(K~Ed?`_IB~Q?6aEG_Ts&w2voho2+U2(tTNcb>jcawJw|e!&wG zc9DJLNvZg^^Xt?W7NKk4iHvhI=?FhSgw^L=Pwg8`PKGAl^xxkC4cq8rb2--jc z+X!(Y;rZZ#Uk|!IkYf^~J!A7rr`bIRmiKw*!sOk~lCq3pL;lNzi4~9+_>+(aVh_Qq6hAE14|U17mu#~O_6w_@qf}yynpCnZ-ob) zPJZ9riqUaDgZpeec#!N912-p`5GZBBNggAo zT>bFFgTC0JVLCU=Ob{N(Rv4eW><>!-)j*m`#ed}JY&6~Grt!`)Awf1?G$szKnm6Xr zexsjDqhZi=GtUHUF|3(}qO?*aeF#7wB@zYD&AAY?9J#&jNfQ`0q$J0IdN6VS6o1@= z3uWD>cw>rhL&m50dDy8h_IT{$6TL&b<6rHk{kB%er)|a zc1lk%M_-7&bVZL5($Riex(81)eY|L>%d#-?=y!6RQvHl>^Uv_R{2aggiU0sW07*na zRKf?k?6i&LQ_oYO_|RclzIASPjK{Ze55G@j$DSKv@VvIWE(NnVX zO;%z_qFKCk<>v8r&Kvx~4u<0es`R6D=q?Y4%lJ3R{i1p)zu}AN54wTWV=jIOExB}Q zOd@lRr(b##Zk3}OIds#Pq}5Ks(GYXs;AlnWJYlVZ^BpDiA+pYmx-M?`eEY1aK_B2> zy&=2F_DgXS+e_S?3z?Kic_tbLHXI(SvTKL@oLvZRwMN}H`g8GqRcMMERBr~O{FSxw zw5yRLbc%HQ%mpYu9x1^As6W(w5>augVFYI!fL+C)mw`^YlqyyLh|$Do27&dv?4TaVI|5iqr_R{DL+evITGOeLASfg%pquc`VN?3m%FZGZyV>!G5~4lJF^js$8dIX!o1sGN^S zl_|f~`eT;UG4?^Am^k&@n|5Q-ZctAe(~ln4ilR!k`08^%&T&a!#}E3pH~70>=lETY zej&>H8wJF__-P%t9@ket>U{k1kvT}3c$vD{QGM~~SIOYl3p1QPkleh@nq|!|_JyfM zrQ6r8djCODO%q}K>WTf@X?J#$VPA0lHi;6u$`Fj1COF~?JuRk`Zn zF^KPpu&c5;;j@g$wEpm&SAPE^{SZ-Fezg8kzjjMo+fnzvJh!Klu7bPU6D|yZto!4h?(oN5uCP(AzJRNyxMvy=jNuCmNMU zk5s-(l|u)q^+fLTWCHr-#+_ccr0=2!IMsivD+8~8{BM8lHa+Sw>0kcxc=f;juYc7S zQ~1eb)~qE8!Y~DMOdlF_Og2VBZ)pf4?ZH{nhR9%yMk71QDV*-tK+fk@4pWvsR(9ZF`Dc|te$Z@XEZD-C6@a{Z2AfEgcWZK#Dr#V7{ zhF_AYd++eb zxJ?u$4aT)IJm#xwl_^Xr@4VjgtC*TNm-jIi(Q>2LGAiHc=8$D}8qOBDe<1R$QT(Et zdd-n9T8j6~mm@_pUSiA6oL@PAVzuSU+GokZ#THKud1;ZKS@BA1(0@?mU2=cXJniE% zc6R*IDLKkF{D_=#0t$8oBXL9YqcW$XReifRJd+gsXAZo_cbYg!*WZ zlS_E|4?ME)=_B9FQ~X(33GJisOCzyHD$0IlfBr-Z9}*3K(Ea#JSVcapI^-QZiZ zaUe*|BN5tOhQHS%ap2zL@hKOH(RNm^@8PB$hmG{(NBF~wQ;hpTK5|UZBXeuQHpTYo zE9lVz23ccNK72mIFP_Dv;J_FkMW5nvDY~&oYTwK;F}^l?K1*!;Gs2Ej0=?ngo&(bh z4N^(TftU70l^d2KD?MN7#*Ou&Uv=JBSA@-vhboGQ)5lf7E$J&hK)5%S1$coo6z9uMXx$FuzbLhdeFPwp?$#%Zb|L z$hF#+-9*$5_6v8S7rCYgL#}H{d!6pM*8%hKVNJdG-S0j7k*hx?^rqugpD2TW;n%dK z*vCn_n;fy{=GpT&`trf5(c>Hwj=%gj?7*U<5qhqHsP#Veq9-!1rBPjj&l3Rg@v|Ce zkN1tIT{;PA^Rwg;Or%;*2K;DQdbCE}1~9rM?Dq?+_?&iQA?F?T_DFhf{@YIcvtzv1 zF_mdIx_VB+!{777@oyi67rTwLLo3d{jo#`ZvJO7G;T-o5LK#>4>b*<4^uYJu1091a z*Tk<)6g4_ElWG9I>B}&T!#B2BNr|BzKHZ~#S0Q}fE2*d2_J%hmi$KJ6B~ldmKw|bXpn@H&>_lp~Ny5%d ztZ(|DVx69atw^SVjfp5+{z{nknWu6h{b&$PbZ$mKB#IB66x-1K`9pd94^K7AAa|6p zQ#t6o_7uNPF$W%OQgk2nolg0DLeAuzo9o!8y~S58{)cwpZQXR0+@Bk7fW2w|5HFd~ zt?9(K+TZosdohYZre&2jJjHQfqo3o^T|7sT5s|tjc@y=Zo4VPDxA4;s)H!q+UGdKm zIDhCJjrwG2TR)3OKTU~WpwYeC+{?S1%hJ#PPA}g5Bjxq?TyDpMu_Jb1%BE4)i}pIV zbCv?XFqTCiDQ!|2(vT6UPc4>5eJ@WJFEUv7cOncUT6>!j)J)a(tf6nw!jZYvvEl># zgAFm!iK;t!KfTma8=ek6=|=QLuUO#*TE8oyn~*QMQ766EZ}Q@B^Zw%-OB;1V$nmAW zlzKef7t}?+S1<&v_E3cpMf^xHd(^*Csgd@c@3e&*NH5hGpEx(#ACP$U#=LGC=Ytap z{eYa$qb=tEg5@$q;wGMCy`op%#J-J8eQO{4+%LEeqDy*6hprhXBKO93=@_}RKRB?_ zvH2tYs7@lD8IJB*8 z`+!ce{hGKKaw=`wI&d*t_$eO!;D)(<{lK)4@)h4MH}36`Oa5K=0Ba&S;cvZf{gBiqbf_xi=aBvts=MGt+n zlk}=>#N1xtL9*Yvzo5$+bN#(4;zoMAQ(d^bCn?btV*gKHMn1`lgP8 zUTVlZ7`S@A&!l&&K!x1Ym(FOVX!_#!xgSBAgFqjCI4_dC3J{Lwbtzt;NW zXP(5Et|vkZBY`O&e#C}-fE@|v@9mF%>9ySWgg^GP_~F~1h}suy#zDgmjGJGQkp1b0WP{}Fyw?~AN^ zODEr!(=mj{$@N6f0(>t8`9}#W*EHm(X!_;1?Bhb9Qi-{beGQ-Qgjd}A+L3$_=LTLs z6oJ?zD|Gq(|(w%@a&^EV*a*D=}U*|4?`!&<^3*j|yaN z9J*`d+A4naw~TkX%xA1~`j6dG2x<^7-_P6b{zBWpu&+7%W9>QZNyHg?BC$ww%%qK7 zV&Log#qlCS4VQi0d*0V4FdhekrDJ_#D}cY_Fj02ox~7^k80?a&%MoB2Uf}1LWI&bYlZQj}I5Y@{UW}n{}9kl1b?3cL-$S zB&DwV6xPvBLY^0?jpNtw2l^yWv2Q;y0^Hk9!Lp9B#;cCANu?9@?!3=;@G*%j6E z=sgz(e~gelVpE0)#aUUFQ!4D5BuRmq6{4;D7h^zrQ-e*)pDAFxVXzv z>pAd2Sr4!^bK$oLC#i(P+93~(RGD9bKlB7!JUXi9;GELnAIHdDVbNj_d_AkC)IY*Y zpY7(DMV|gnsT!%L-RJgO-`g%>;}2T#9JT0?X3M0G4@cjdAqO^^NZ_ic{Zf7KiZ9wS zZ2;N^Ps=#3-0W#PA4YxCCGyesf}_!Xj~|O8;oY{Cjsu53@A0u6Th==Y>4%lJqG^?> zVu<5UF(2Z`pQ^UK0^n`>PI#3$%PUj0)oZa$7j@4WJX_uV1kfXT%qrjbJrugLe<=C~6iGDCeJUA7%r1N3Iy z778Wyakd0&}!?5T8hSfY1zhzSXH6yS+l{Y}*ipK7z*Z4s z`2p$nEo+;71A+*8l_T*xMM?kor)S;ta6WX@sI0#q6p_Bw9R50e;@?iy9P;vj0r}I8 z;gdwXR{jlBnmYzl;T+{D0Re5V-PRazL|cKEx(k4|I$};oQrCjLiXe2&f?h=>sr3b#p9_VbtX@h8N+JYowQ`{|78LuSY9TYxN$#$ zpN@+4!EXvUr}(3%-`l6_5l(-kEKP$q2fSYNmyaXbh7avSyqgm__$PS4AL04nY=yLh z^CkG&SoUii8)ILRu_)f0QFys%_Obr&cuCYhgySdnak2Q&p}GBMc*Lw947|V>ZRflH zqZV~Z8{Q@dF9nM~uHXQUO{yVPciFO+9Q+W0GsAIXL_a}hh#$92$f1}1k6NpyEGn-# z5hxur%2N8Om**b47DVgLkwe$^vM*M=DKsA+Py|yqVal=b*S{l}B9cC@pN2iU{kO;<<4hW=@Is|-PI_g%2 zKA06c@YaBg)6qxZrYr3;mG~Z=^}jdb@FJWnwIm;l;SOQIFy|=Dc1>Y`b|w zaD9w_hC!4z^i^G#hfAbI%aMq3le ztJZ*rqR5qazU5cW-Y6umVb_HxyRNY2Px2CER~7HdAibInB#2QZZm?DLe&)DBWJ-x8 zZA?dO!N!0l@=jt`82s%7eIo~%z7)Tb>?vSofBDV;Rd$mx zVkZ7uZ8yh-ALcRXV!IP?^c!qicoMLE%Tf6NZ*r`eZ^v-r9SzC%_MyI)J;z6?{-su# zpz7(pNj)mo&~t+sX~@>e0=9FgqUG_yKLhpI~s*V&n5E z-roN#US}fTr{G)^{E6L*sOpU_f`Hbl1NTz)C`-F}k|#400GG-{g;{mZ-=hY2N*qAV5Bf!BymACwg*!)l zC8sBxnwIoLk;pm{InG_%dtLjAyfeYDuMC~X_LC$%=)3y;Z?CTY@F%GWNpqr}8zj`P zh(5)04K&qVlIgKqw;rMCV}5x?BI^C{B` z?^7=$^fUhL5o{##!HSZvP^%3$`tBF$Zk`xcuK6Vw*oyfH29@?}89t{}@vb$>zvu~16Mp84vby5V z@*yJNIiC0lo#Q62b+M&R|Lh4J@X1Nu#YdH{p-(;ik-ljk<$MTA{n)}Kzx2TO+ylON zXt4MOK@IIs3Ugs%!tiKv2V^4Y0CS{#=*V~gen5f0kc#O64vdL~fjW8hm=Dea+}1N# zJ*f4jB?5f%=W(!;b>PO-qY;PA&crUe)II3&fs0i5SfFH(C~T2AX+VE1NPBNbRbTDv`^eW7(t(}fhY{# zK2Z}4AD0fqC5DgoXZQy$exxtzOLRyz|JGM|Rjn`b)XGnp_tk9K-TSr@P6zs| zFCh&c2Bs#EYkrkay7(18fJDTx!4h^)8os-Q2Tl{3_d_Q#q_uYXdtnzEY1jAhoj+*N zIJh_OCL_9cp8<-L?0Exh-FR!)8@^=f4VIND-i~@D8F_HUr?m=U!O;C~p7iZ_7}A~gpW!$9fp<$)ZNB3vlgc~vn!5RR z$iTtpJ%K0f^y*BGzqBJMg@YFS>E!)6zH-6S2hm+RHt6ru`eDEH&+yP`FLKL^u>mJ| z3t7(cYEtzAg3GE*PH8lb6R-lqPf4|tpZ|gS3o(hpl|l6 z7)L>L&WkZZo_75bd}J)2PO%=`somzbbK)m1yvLjL37*rZ81${O=%Xt6hKKHmp9OR*VHW(*7@_2mGaTC73 z086E|*)H_W5qifI-ktM5wcSix?CrHEw428T{eH zfu9JVU`xA>jqD<8|4Dt)(8zoB#3pvr;?^%W?(VkB+xOlBO!u7h>&sReTpk27$e12P zaW||8HMNY$p;H$@<1*6;1Jo7MJzV*C4`}JlfF8{uOE80ZCMC&w0)@!S37WNAmnRA| zqguIbNuUsd5b@Pu3zTHW$ij7G#20Kya3iW25nJR;R=)aqq7@qvKzhS7`V3z~S5BS3 zD6lM(B?8Ek!b**sgj|c@ix$zyNEZFU%p_UkNRMoC7zfQDSwD2{yi?h>;lPKVmKN9C z-kjOO$6e>g`1o|-k9zQJYju$ywDg0~^yT!+$Fhh0$}Mr}r2nCZ7Fmv2WutR65AY*= z{7)Zqyo438_jprte#r%U!SS5GtU-;RNOE2z)qiR^*RXqH--e^KK8*!yk1@~( zF8I+YJb$h&$L*o*gz7 z9e(+%ta+gx4^UR4hhGQnklM`t>cxCuk{Qf%yypW`Z@}??onm;iRoW9keST~?#~D6z zHy=qVLw=GV9NprwvG}4t0w}%t1qTmh@DeZ)5hu$N8{d7NTJ+RnyaE#X&h@dBv$(@O zI`!OG%ZHJ#E%%kdNRMBVhmPl*FPu-{eT}kI>WBeFCu(U@5*CH0?Z}w7*_KfJ;e$iw zGh|4)X+LD6gX^O(hXLzGeqb>IVN2BstmU#>U;Rw9z8;U0uMZ3Lg z4FtZWE?NI6f1P&Rv+ulax}UwaT)Pm^7NqnGtLT5zuM#o=eDOZH@|VtVVl6v?`?T+t zwt-Njo_6_(f^u)au6Eo#=VAD*_hlyHkOq;1qnA8Nl7r<{yD&?u ztSBGg(Q?QZ*F4eu@-k`v6mChXP&x9X9Z#F^6-$*3jeb68Y46Aa7`+Q`;j!gR z_(h8}5ZlsQ&PJWjx(R#HMe^ZMYpx~#s`2C-#@Y9|a_M`S72D%Ygu@LC+C#BzG&!n9 zF8Ih5?-PBH!CSp4>7(GS($M0eON@b{gpbaZrOoltoEQ#&>3bUM( zcm%T_XAL#;qJsvRK6D3^2>*i=)9yzi{4)Hg2s?7D7^XRo><6#Xy*6NHo}xx0Z;${W z8_;+HX#`IKdHOf|(cdyJGY`;4W!IYDocQHbr5nE7Gg?jfMsIV9sE_cQ`JC2i9wef! z*Ddp)XpihBBKm{&uBX7RG03?ul^-d1*XdBnvMiBbO!c`g6lBlm&V7d*djb)8?|H{L z!rFJ9f;3W$KKzL7?8A;;qSwf?dyAP8plx5ZW*=Mjdz=K{-AMvh=z|}D=7{)sjGhj+fnKsp4}7OR;K@R78l+z0LeWj-oe5$aC?Zj3qF~Z9ZziG+ ztn`vF#c4Ey@Vvm>IrAL^KN0Lel@!T(fK$enE=swX9{y%qE|0TJr1D83rUf1U?C&1?78y^(MS{+2y?{-Lv!bNo^NOtyBb0lB7wmwr3yNbI!qk*RK9G#v8j$Mi>dAK~di zrE!7&t__}e(SASGLWa6tD~e`Q>08*O9sk~bk4bau8%FExXmjl!=h0y+v>jjG z2l(lS=!>6}>8E!#at6}+lk;|+bHdQe#v@hT;OJtK`gQelCpoR>vH+ zU7CK!0oNtxB}J;Z^*#^U=pBmyM>?tf=;IDX!IaSu#a5bbA#p>0T(6*5oAH#WI=WAs+^i_F|5DcTb>YNbZIXTSr3P25ee_Xh z^%dW7<-8%V-wb2ESK-D!}=0H(R4 zmfq>++gU3|{2>#Dr#SiPkeK#WmO`b(vH65g>}qBO*?FEd`b?(y|D?znc3Go}CL-W2 zX?-#2k=g*bWGtcrD>cayQiW<)vJl*}@OeFs~Ppmy5VV!-s`Ch=QB1q^@ zyiHow!F)jS3T6cL%dR9}8ssZolZ1DfG@-#?JQwieNS5*B3av^GJQ|A6qzeAfvE#!> z&l%o&JAt3#vFYesX57mjPZX6a0O_{gXu?6~oxaQCn_oSlWBJ6P-kuDboT3NduVO zWq9D}$x^?B8v8iIyu`lO$YYZPT^T=}s=_mi?lsBY=@Fs(gzp@E%M|Bq8~ZOjX_a5z z3<2Koz1CdioNsY3$6f6jBA$1b8h*jk5ncL!YfqQruuBZ~+ApkOx4sePdO_5;k#-`{ z)enw{GWsd=YJ}Kw@-u4k4&T4DDr;TCp9uFfPyO%ReLw}Wc1_9J?OyeC*nA?SLDtKY ziKSN&e)fA;owmRyanp@Gu65nj#y8>$e&J8$koE2`;|4mq#-H}7>UQtCyT-h7?!z_$ zg-Xz{OAyUZPNc{C(vN=le!?QzJ{jnT30gpVj{Z{LO1}KsmB>k|9{i?#jN(hW^uTxD z0}K|fVGI(=xp~kfL6a3ph+y|YTIchiO3%1Gy`txI}b&+i>;A0 z9DU;LcyRXNOgDJIhpcPk<6+cusOI`)N$EVQ4%8&N!R!GoEe zJ;AG@gbeA>d(?}E(lYv67FET)PG2SA^Bi{*f-(CH&&eaLmWnQl2fjc25+9L^EVk1x zhn@O@MD6?d$$xCbzxuCUp{Ug3pA$K9!J9d{A~$E87&zen13&$Q9}B-T5mg+o#5gHeNy=d)ZS=cs9(L{ zKBSGY+~aZ_!|+O9?UiFWZ#f2vkncC3)3n8xEclPwhK!#mZwJtl5(X0;Di1nKH@H4U z8+`s+?`~o}3+O-VapYdt8-74d2@Ds*Tu;YgWXBE>dT_^e5EM3%#W{-jH)Lf__6M9q z^p+14s$kB-6{FwqM|ImtTfw=_6egt)kVo%9Klm-7FXt(`&qYCYEqoE^-gTbW!Nh(M zKb>1vhKsB2%Z>X__uGa0o%Db|+3W1@{GQ!Z7!KS>>s@Q-m<)2it3f}J^;dq`R06N6 zGl&y-2BF9R@?Hxr5du~kV0;#4fcuwNRbVMQQF(=|rAGPeM|(HF#41DX;cG>_H5Y2v z2O>|3sOuJ-^?R@P%!Z0g=*AoUOpI?lD!(W*%dR%cU)favyKtGH80o4% zv+=Rg!LC z-1g;_2(}^9ECGQIzVvlGYympjf`LbU$xIm?@9?%0`Qkl>KEg|3@VJt;th(fVB%#aS zG)p;&OmtXF-t9@<@`z2FeU2D&;N2I42b%r}hTo^SB`(K)>H2$o(0<~A@?^srUKF|3 z)RHyjGNiiY_%e%ZKCth$aw6@ddmS%^`_)s{Dqnm2!^xAsw_9@ch2{<99{dZfQgOpC zrLtx|UBJy9j$oHIT{AJM6R!D%P_gp66{0^l6!@bkA)=Hl--Cl>#{aq_V2Vd zUuT!*BSl0-$?o-){`K=j$kl&DuvvFKCVLzc0anCT{=xJ9;>y8sQ_77XvWW;MvWp6q zba11}HG#vxn(!!>7SSDP7U!AW$oNH3eJ21tz3~J@ortb7C-jh@TbHtIlPvq*?W|)b z5qQowo-_joLY+vnGO5Ra&M$rEi?Nxt@%S4nJTX{yhKB7#rWK+0^-9+*u7`Xm;6f`o z*3zRRYtVUeVZ)}O8J)b$$1!Mn<%x9sgP*nYR%v4#r^ls`)4H$v~@EJxHkmvrfY@4p8$B-Kd0xLSFDs_c=k zDua|RFewvF4a=Sjd5Re;8 z;=2X=t&7s~Q*yY6c>QfYV&Y_i;_^)jUzauk-F(|#O02Jv0ia#(=)xh8aX6=9@Y6qb zLTw-!LDO8u4wupp5TUII0UgM)3$`?5EP5^{qTB5@jLj+U_;%`o&ZHQ;d&YMr zvPmOwQT1itw9oJ$)U$&hxF`oc@ZiUSCn#csjF9Apubb5nldP~+VH}2 z&O`ecZ@|LadIY5?xY|Ljb%{^D+sruz4ZmX_=^V4<#*fcn&+*t3WZ|)Kf|slHrFe8Y z0bTgWjWV%mJ8e<2elj=4b>rvF{V!J4GIFVT_b72N*#!C1)R zdQ)oqP^EIt3+7by{G3yjv7VU1-1w7oi3%>+6=Nym6O7P%&c$%>X~#jSue}k)C*Sm< z2Yssh`%S)3;3H(cIgxWt=4CQYfi*|DeakuPYn4y9NHo$8y*klhA14o8eBFgdt5w&8 zamyXCkZ-%AYvko;Z9wSeNs$OJ>K`>x+8Qox{iA+n@VsFmO0E7ESdcEcbsKpCj7{Q4tOL;y6nU$lDy z5p#vc^`^uw4N6QK);E*%wIVT=*V;$okBX_VS%Sp#DDlRTc=;v&u=_f@&phheIOzG} zUpCZaLMVyJ@tHNB+GXHNb|o0=Xcb{=`OiqKV58DxqXZTEJ5+Zhz*kq0_{ZGG}XC3fvXWE&Ldc^7h@+D-tyy<6$}nMc0b1V;sGLZ_Qmap-O_(4KDOgGcAHM{ z_-RILMrJR+$4936njaV+FN{p0P9!URCOM4*x{qJbB+*~j*FUOXz)+@NPw~_b3+Y2- zSAVLUbEJ4Qr`7RC($;%mz#D@vVxHO`{Nkx@=z%eQ{QL}0x7U6&Zg%kRtj+XA>>!Q7 z;L+oqW{h zdkUvU`nV`sPkQnid4@|G!tzPe-4QBbO8x6U zq`a1Y{lLccKp37dJF_%Cay`s7lmiz3(i$vc1Bs-zQZ{i$Z$9N!>WzOR+eEPQWWj=l z%bN6Y{R^C(&z|{ZToHP{yPZ`kdFmu~-=R#z8hJD7P19>KG zDzx{g`?#1MePB=U!+VF9_plE9q1RS68`KYc?1%#SbNmU0<5K_M}v5hQpIrru>u2soXQFGq-oRpM5D%!8~vC*p@ z`}N}R|7f$Vk9^!MFZSaHT1$^_(Iu)Bq+BbNJMg>S%KjW4ZJa;YO^RMzmFB~y*yw^r z3J)wVYCBzh2VV3Y<1zs2krJAy7h});i(;kav&v|dmW<;}Lm~t?@bIk&uoa+Wu=tUe zaoadY1_1Um{zqes+A`KH=LQW)*=Z_Zatzw5xFhBEB{ghVtMhO9mi6Vit(ulD^RBCn z@ote_SkYtp0GWC1Ql<6S?YzuS^oi0K$T=4h@4h({ud+LTF9T0~6saDYI^ODcAM5Gu zWXQ#56~=sMtwDDhm505`9mgxz-TDA3?J`Ei^n=c3^%1_%uBC6zix|uMr~M_pY0r^! zt=xTHdZBV`CdG%NzRMjlDeba*8SbvLxaRe(_2$qo5%>1SCI7B_;ElTm-DG+Vom%?9 zFPQ3L@}!71(}F(eXS^z6%y4}3zOh=nO&DGOx2!8ydYaJFy&~4!e|O-$&3^7gB9OfI zAXj9-5of7*CI(JqMQ;*#(Fb-!e2o($YdsYS&X%dDTzh|C9)xEn4{eJht`d

ATjhGH+T| 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

bOpL%7=mw#3gl`SUZ`kXbhh7%p{~qE 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≺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 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 11.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..ac0f289 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,68 @@ +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + + target.build_configurations.each do |config| + # You can remove unused permissions here + # for more information: https://github.com/BaseflowIT/flutter-permission-handler/blob/master/permission_handler/ios/Classes/PermissionHandlerEnums.h + # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0' + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + + ## dart: PermissionGroup.calendar + # 'PERMISSION_EVENTS=1', + + ## dart: PermissionGroup.calendarFullAccess + # 'PERMISSION_EVENTS_FULL_ACCESS=1', + + ## dart: PermissionGroup.reminders + # 'PERMISSION_REMINDERS=1', + + ## dart: PermissionGroup.contacts + # 'PERMISSION_CONTACTS=1', + + ## dart: PermissionGroup.camera + 'PERMISSION_CAMERA=1', + + ## dart: PermissionGroup.microphone + # 'PERMISSION_MICROPHONE=1', + + ## dart: PermissionGroup.speech + # 'PERMISSION_SPEECH_RECOGNIZER=1', + + ## dart: PermissionGroup.photos + # 'PERMISSION_PHOTOS=1', + + ## The 'PERMISSION_LOCATION' macro enables the `locationWhenInUse` and `locationAlways` permission. If + ## the application only requires `locationWhenInUse`, only specify the `PERMISSION_LOCATION_WHENINUSE` + ## macro. + ## + ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] + 'PERMISSION_LOCATION=1', + 'PERMISSION_LOCATION_WHENINUSE=0', + + ## dart: PermissionGroup.notification + 'PERMISSION_NOTIFICATIONS=1', + + ## dart: PermissionGroup.mediaLibrary + # 'PERMISSION_MEDIA_LIBRARY=1', + + ## dart: PermissionGroup.sensors + # 'PERMISSION_SENSORS=1', + + ## dart: PermissionGroup.bluetooth + # 'PERMISSION_BLUETOOTH=1', + + ## dart: PermissionGroup.appTrackingTransparency + # 'PERMISSION_APP_TRACKING_TRANSPARENCY=1', + + ## dart: PermissionGroup.criticalAlerts + 'PERMISSION_CRITICAL_ALERTS=1', + + ## dart: PermissionGroup.criticalAlerts + 'PERMISSION_ASSISTANT=1', + ] + + end + end +end \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..94e73de --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,613 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; +/* 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 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; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807E294A63A400263BE5 /* Frameworks */, + 331C807F294A63A400263BE5 /* Resources */, + ); + 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 = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + 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 = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + 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 = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.sfmApp; + 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 = AE0B7B92F70575B8D7E0D07E /* 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.sfmApp.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 = 89B67EB44CE7B6631473024E /* 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.sfmApp.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 = 640959BDD8F10B91D80A66BE /* 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.sfmApp.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; + 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; + 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 = 11.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; + 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; + 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 = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.sfmApp; + 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; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.sfmApp; + 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..e42adcb --- /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..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + 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..b7872dd --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,25 @@ +import UIKit +import Flutter +import flutter_local_notifications + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + // This is required to make any communication available in the action isolate. + FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in + GeneratedPluginRegistrant.register(with: registry) + } + GMSServices.provideAPIKey("AIzaSyDI8b-PUgKUgj5rHdtgEHCwWjUXYJrqYhE") + GeneratedPluginRegistrant.register(with: self) + + if #available(iOS 10.0, *) { + UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate + } + + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} 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..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 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..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 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..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX 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..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU 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..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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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..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H 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/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..fa8c652 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,70 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Sfm App + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + sfm_app + 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 + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + + NSLocationWhenInUseUsageDescription + Need location when in use + NSLocationAlwaysAndWhenInUseUsageDescription + Always and when in use! + NSLocationUsageDescription + Older devices need location. + NSLocationAlwaysUsageDescription + Can I have location always? + + NSCameraUsageDescription + camera + + + NSCameraUsageDescription + Camera permission is required for barcode scanning. + + + + 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/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/l10n.yaml b/l10n.yaml new file mode 100644 index 0000000..494619b --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,4 @@ +arb-dir: lib/product/lang/l10n +template-arb-file: app_en.arb +output-localization-file: app_localizations.dart +untranslated-messages-file: sfmTranslateErrors.txt diff --git a/lib/feature/auth/login/bloc/login_bloc.dart b/lib/feature/auth/login/bloc/login_bloc.dart new file mode 100644 index 0000000..a892c57 --- /dev/null +++ b/lib/feature/auth/login/bloc/login_bloc.dart @@ -0,0 +1,18 @@ +import 'dart:async'; +import '../../../../product/base/bloc/base_bloc.dart'; + +class LoginBloc extends BlocBase{ + + final loginRequest = StreamController>.broadcast(); + StreamSink> get sinkLoginRequest => loginRequest.sink; + Stream> get streamLoginRequest => loginRequest.stream; + + final isShowPassword = StreamController.broadcast(); + StreamSink get sinkIsShowPassword => isShowPassword.sink; + Stream get streamIsShowPassword => isShowPassword.stream; + + @override + void dispose() { + } + +} \ No newline at end of file diff --git a/lib/feature/auth/login/model/login_model.dart b/lib/feature/auth/login/model/login_model.dart new file mode 100644 index 0000000..04b87d0 --- /dev/null +++ b/lib/feature/auth/login/model/login_model.dart @@ -0,0 +1,17 @@ +class LoginModel { + int? exp; + int? iat; + String? id; + String? iss; + String? role; + + LoginModel({this.exp, this.iat, this.id, this.iss, this.role}); + + LoginModel.fromJson(Map json) { + exp = json['exp']; + iat = json['iat']; + id = json['id']; + iss = json['iss']; + role = json['role']; + } +} diff --git a/lib/feature/auth/login/screen/login_screen.dart b/lib/feature/auth/login/screen/login_screen.dart new file mode 100644 index 0000000..1de4387 --- /dev/null +++ b/lib/feature/auth/login/screen/login_screen.dart @@ -0,0 +1,234 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:convert'; +import 'dart:developer'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../product/constant/app/api_path_constant.dart'; +import '../../../../product/constant/enums/app_route_enums.dart'; +import '../model/login_model.dart'; +import '../../../../product/cache/local_manager.dart'; +import '../../../../product/constant/enums/local_keys_enums.dart'; +import '../../../../product/services/api_services.dart'; +import '../../../../product/shared/shared_snack_bar.dart'; +import '../../../../product/constant/icon/icon_constants.dart'; +import '../../../../product/extention/context_extention.dart'; +import '../../../../product/constant/image/image_constants.dart'; +import '../../../../product/services/language_services.dart'; +import '../bloc/login_bloc.dart'; +import '../../../../product/base/bloc/base_bloc.dart'; +import '../../../../product/shared/shared_background.dart'; + +class LoginScreen extends StatefulWidget { + const LoginScreen({super.key}); + + @override + State createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State { + late LoginBloc loginBloc; + Map loginRequest = {"username": "", "password": ""}; + final _formKey = GlobalKey(); + bool isShowPassword = true; + APIServices apiServices = APIServices(); + @override + void initState() { + super.initState(); + loginBloc = BlocProvider.of(context); + checkLogin(context); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SharedBackground( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + const Spacer(), + Expanded( + flex: 4, + child: Image.asset( + ImageConstants.instance.getImage("logo"), + height: context.dynamicHeight(0.2), + ), + ), + const Spacer(), + ], + ), + SizedBox( + height: context.mediumValue, + ), + StreamBuilder>( + stream: loginBloc.streamLoginRequest, + builder: (context, loginResquestSnapshot) { + return Padding( + padding: context.paddingLow, + child: Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + textInputAction: TextInputAction.next, + validator: (value) { + if (value == "null" || value!.isEmpty) { + return appLocalization(context) + .login_account_not_empty; + } + return null; + }, + onSaved: (username) { + loginRequest["username"] = username!; + loginBloc.sinkLoginRequest.add(loginRequest); + }, + decoration: InputDecoration( + hintText: + appLocalization(context).login_account_hint, + prefixIcon: Padding( + padding: context.dynamicPadding(16), + child: IconConstants.instance + .getMaterialIcon(Icons.person), + ), + ), + ), + SizedBox(height: context.lowValue), + StreamBuilder( + stream: loginBloc.streamIsShowPassword, + builder: (context, isShowPassSnapshot) { + return TextFormField( + textInputAction: TextInputAction.done, + obscureText: + isShowPassSnapshot.data ?? isShowPassword, + validator: (value) { + if (value == null || value.isEmpty) { + return appLocalization(context) + .login_password_not_empty; + } + return null; + }, + onSaved: (password) { + loginRequest["password"] = password!; + loginBloc.sinkLoginRequest.add(loginRequest); + }, + decoration: InputDecoration( + hintText: appLocalization(context) + .login_password_hint, + prefixIcon: Padding( + padding: context.dynamicPadding(16), + child: IconConstants.instance + .getMaterialIcon(Icons.lock), + ), + suffixIcon: IconButton( + onPressed: () { + isShowPassword = !isShowPassword; + loginBloc.sinkIsShowPassword + .add(isShowPassword); + }, + icon: isShowPassword + ? IconConstants.instance + .getMaterialIcon( + Icons.visibility, + ) + : IconConstants.instance + .getMaterialIcon( + Icons.visibility_off, + ), + ), + ), + ); + }, + ), + SizedBox( + height: context.lowValue, + ), + ElevatedButton( + style: const ButtonStyle( + backgroundColor: + MaterialStatePropertyAll(Colors.blue), + foregroundColor: + MaterialStatePropertyAll(Colors.white), + ), + onPressed: () { + validate(); + }, + child: Text( + appLocalization(context).login_button_content), + ), + ], + ), + ), + ); + }, + ) + ], + ), + ), + ), + ); + } + + void validate() async { + if (_formKey.currentState!.validate()) { + _formKey.currentState!.save(); + var data = + await apiServices.login(APIPathConstants.LOGIN_PATH, loginRequest); + if (data != "") { + Map tokenData = jsonDecode(data); + String token = tokenData['token']; + LocaleManager.instance.setString(PreferencesKeys.TOKEN, token); + String userToken = getBaseToken(token); + var decode = decodeBase64Token(userToken); + LoginModel loginModel = + LoginModel.fromJson(jsonDecode(decode) as Map); + LocaleManager.instance.setString(PreferencesKeys.UID, loginModel.id!); + LocaleManager.instance.setInt(PreferencesKeys.EXP, loginModel.exp!); + LocaleManager.instance + .setString(PreferencesKeys.ROLE, loginModel.role!); + context.goNamed(AppRoutes.HOME.name); + } else { + showErrorTopSnackBarCustom( + context, appLocalization(context).login_incorrect_usernameOrPass); + } + } + } + + void checkLogin(BuildContext context) async { + // ThemeNotifier themeNotifier = context.watch(); + await LocaleManager.prefrencesInit(); + // String theme = LocaleManager.instance.getStringValue(PreferencesKeys.THEME); + String token = LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN); + int exp = LocaleManager.instance.getIntValue(PreferencesKeys.EXP); + log("Token cu: ${LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN)}"); + log("UID: ${LocaleManager.instance.getStringValue(PreferencesKeys.UID)}"); + log("EXP: ${LocaleManager.instance.getIntValue(PreferencesKeys.EXP)}"); + log("Role: ${LocaleManager.instance.getStringValue(PreferencesKeys.ROLE)}"); + log("Theme: ${LocaleManager.instance.getStringValue(PreferencesKeys.THEME)}"); + log("Lang: ${LocaleManager.instance.getStringValue(PreferencesKeys.LANGUAGE_CODE)}"); + // log("Theme: $theme"); + // if (theme == AppThemes.DARK.name) { + // themeNotifier.changeValue(AppThemes.DARK); + // } else { + // themeNotifier.changeValue(AppThemes.LIGHT); + // } + int timeNow = DateTime.now().millisecondsSinceEpoch ~/ 1000; + if (token != "" && (exp - timeNow) > 7200) { + context.goNamed(AppRoutes.HOME.name); + } + } + + getBaseToken(String token) { + List parts = token.split('.'); + String userToken = parts[1]; + return userToken; + } + + decodeBase64Token(String value) { + List res = base64.decode(base64.normalize(value)); + return utf8.decode(res); + } +} diff --git a/lib/feature/bell/bell_bloc.dart b/lib/feature/bell/bell_bloc.dart new file mode 100644 index 0000000..98cb082 --- /dev/null +++ b/lib/feature/bell/bell_bloc.dart @@ -0,0 +1,22 @@ +import 'dart:async'; + +import '../../product/base/bloc/base_bloc.dart'; +import 'bell_model.dart'; + +class BellBloc extends BlocBase { + + final bellItems = StreamController>.broadcast(); + StreamSink> get sinkBellItems => bellItems.sink; + Stream> get streamBellItems => bellItems.stream; + + final isLoading = StreamController.broadcast(); + StreamSink get sinkIsLoading => isLoading.sink; + Stream get streamIsLoading => isLoading.stream; + + final hasMore = StreamController.broadcast(); + StreamSink get sinkHasMore => hasMore.sink; + Stream get streamHasMore => hasMore.stream; + + @override + void dispose() {} +} diff --git a/lib/feature/bell/bell_model.dart b/lib/feature/bell/bell_model.dart new file mode 100644 index 0000000..da3c086 --- /dev/null +++ b/lib/feature/bell/bell_model.dart @@ -0,0 +1,75 @@ +class Bell { + int? offset; + String? result; + List? items; + + Bell({ + this.offset, + this.result, + this.items, + }); + + Bell.fromJson(Map json) { + offset = json["offset"]; + result = json["result"]; + if (json['items'] != null) { + items = []; + json['items'].forEach((v) { + items!.add(BellItems.fromJson(v)); + }); + } else { + items = []; + } + } +} + +class BellItems { + String? id; + String? notifiType; + String? userId; + String? eventType; + ItemDetail? itemDetail; + int? status; + DateTime? createdAt; + DateTime? updatedAt; + + BellItems( + {this.id, this.eventType, this.status, this.createdAt, this.updatedAt}); + + BellItems.fromJson(Map json) { + id = json["id"]; + notifiType = json["notifi_type"]; + userId = json["user_id"]; + eventType = json["event_type"]; + status = json["status"]; + itemDetail = + json['detail'] != null ? ItemDetail.fromJson(json['detail']) : null; + createdAt = DateTime.parse(json["created_at"]); + updatedAt = DateTime.parse(json["updated_at"]); + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => BellItems.fromJson(e)).toList(); + } +} + +class ItemDetail { + String? sourceId; + String? sourceName; + String? targetId; + String? targetName; + + ItemDetail({ + this.sourceId, + this.sourceName, + this.targetId, + this.targetName, + }); + + ItemDetail.fromJson(Map json) { + sourceId = json["source_id"]; + sourceName = json["source_name"]; + targetId = json["target_id"]; + targetName = json["target_name"]; + } +} diff --git a/lib/feature/bell/bell_screen.dart b/lib/feature/bell/bell_screen.dart new file mode 100644 index 0000000..982fbca --- /dev/null +++ b/lib/feature/bell/bell_screen.dart @@ -0,0 +1,253 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import '../../product/extention/context_extention.dart'; +import '../../product/services/language_services.dart'; +import '../../product/constant/enums/app_theme_enums.dart'; +import 'bell_bloc.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/services/api_services.dart'; +import 'bell_model.dart'; + +class BellScreen extends StatefulWidget { + const BellScreen({super.key}); + + @override + State createState() => _BellScreenState(); +} + +class _BellScreenState extends State { + late BellBloc bellBloc; + APIServices apiServices = APIServices(); + Timer? getBellTimer; + int offset = 0; + Bell bell = Bell(); + List items = []; + bool check = true; + bool hasMore = true; + final controller = ScrollController(); + + @override + void initState() { + super.initState(); + bellBloc = BlocProvider.of(context); + getBellNotification(offset); + controller.addListener( + () { + if (controller.position.maxScrollExtent == controller.offset) { + offset += 20; + getBellNotification(offset); + } + }, + ); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: bellBloc.streamIsLoading, + builder: (context, isLoadingSnapshot) { + return Scaffold( + appBar: AppBar( + title: Text(appLocalization(context).bell_page_title), + centerTitle: true, + ), + body: StreamBuilder>( + stream: bellBloc.streamBellItems, + initialData: items, + builder: (context, bellSnapshot) { + return check + ? Center( + child: CircularProgressIndicator( + value: context.highValue, + ), + ) + : bellSnapshot.data?.isEmpty ?? true + ? Center( + child: Text( + appLocalization(context).bell_page_no_items_body), + ) + : SizedBox( + width: double.infinity, + height: double.infinity, + child: RefreshIndicator( + onRefresh: refresh, + child: ListView.builder( + controller: controller, + itemCount: (bellSnapshot.data!.length + 1), + itemBuilder: (context, index) { + if (index < bellSnapshot.data!.length) { + return GestureDetector( + onTap: () async { + List read = []; + read.add(bellSnapshot.data![index].id!); + int code = await apiServices + .updateStatusOfNotification(read); + if (code == 200) { + read.clear(); + } else { + read.clear(); + } + refresh(); + }, + child: Column( + children: [ + ListTile( + title: Text( + getBellEvent( + context, + bellSnapshot.data![index] + .itemDetail!.sourceName!, + bellSnapshot + .data![index].eventType!, + bellSnapshot.data![index] + .itemDetail!.targetName!, + ), + overflow: TextOverflow.ellipsis, + maxLines: 3, + style: + const TextStyle(fontSize: 15), + ), + trailing: Text( + timeAgo( + context, + bellSnapshot + .data![index].createdAt!, + ), + ), + ), + const Divider( + height: 1, + ), + ], + ), + ); + } else { + return Padding( + padding: const EdgeInsets.all(8.0), + child: StreamBuilder( + stream: bellBloc.streamHasMore, + builder: (context, hasMoreSnapshot) { + return Center( + child: hasMoreSnapshot.data ?? hasMore + ? const CircularProgressIndicator() + : Text( + appLocalization(context) + .bell_read_all, + ), + ); + }, + ), + ); + } + }, + ), + ), + ); + }, + ), + ); + }, + ); + } + + Future refresh() async { + check = true; + offset = 0; + items.clear(); + bellBloc.sinkBellItems.add(items); + hasMore = true; + getBellNotification(offset); + } + + Future getBellNotification(int offset) async { + bell = await apiServices.getBellNotifications( + offset.toString(), (offset + 20).toString()); + + if (bell.items!.isEmpty) { + hasMore = false; + bellBloc.sinkHasMore.add(hasMore); + } else { + for (var item in bell.items!) { + items.add(item); + } + } + bellBloc.bellItems.add(items); + check = false; + } + + bool checkStatus(List bells) { + for (var bell in bells) { + if (bell.status == 0) { + return false; + } + } + return true; + } + + Future colorByTheme(int status) async { + String theme = await apiServices.checkTheme(); + if (theme == AppThemes.LIGHT.name && status == 1) { + return Colors.white; + } else if (theme == AppThemes.DARK.name && status == 1) { + return Colors.black; + } else { + return const Color.fromARGB(255, 90, 175, 214); + } + } + + String timeAgo(BuildContext context, DateTime dateTime) { + final duration = DateTime.now().difference(dateTime); + + if (duration.inDays > 0) { + return '${duration.inDays} ${appLocalization(context).bell_days_ago}'; + } else if (duration.inHours > 0) { + return '${duration.inHours} ${appLocalization(context).bell_hours_ago}'; + } else if (duration.inMinutes > 0) { + return '${duration.inMinutes} ${appLocalization(context).bell_minutes_ago}'; + } else { + return appLocalization(context).bell_just_now; + } + } + + String getBellEvent(BuildContext context, String deviceName, String eventCode, + String targetName) { + String message = ""; + + if (eventCode == "001") { + message = + "${appLocalization(context).device_title} $deviceName ${appLocalization(context).disconnect_message_lowercase}"; + } else if (eventCode == "002") { + message = + "${appLocalization(context).device_title} $deviceName ${appLocalization(context).gf_connected_lowercase}"; + } else if (eventCode == "003") { + message = + "${appLocalization(context).device_title} $deviceName ${appLocalization(context).smoke_detecting_message_lowercase}"; + } else if (eventCode == "004") { + message = + "${appLocalization(context).device_title} $deviceName ${appLocalization(context).error_message_lowercase}"; + } else if (eventCode == "005") { + message = + "${appLocalization(context).device_title} $deviceName ${appLocalization(context).bell_operate_normal}"; + } else if (eventCode == "006") { + message = + "${appLocalization(context).bell_battery_device} $deviceName ${appLocalization(context).low_message_lowercase}"; + } else if (eventCode == "101") { + message = + "${appLocalization(context).bell_user_uppercase} ${appLocalization(context).bell_user_joined_group}"; + } else if (eventCode == "102") { + message = + "${appLocalization(context).bell_user_uppercase} $deviceName ${appLocalization(context).bell_leave_group} $targetName "; + } else if (eventCode == "103") { + message = + "${appLocalization(context).device_title} $deviceName ${appLocalization(context).bell_user_added_group} $targetName"; + } else if (eventCode == "104") { + message = + "${appLocalization(context).device_title} $deviceName ${appLocalization(context).bell_user_kick_group} $targetName"; + } else { + message = appLocalization(context).bell_invalid_code; + } + + return message; + } +} diff --git a/lib/feature/devices/add_new_device_widget.dart b/lib/feature/devices/add_new_device_widget.dart new file mode 100644 index 0000000..6c0f436 --- /dev/null +++ b/lib/feature/devices/add_new_device_widget.dart @@ -0,0 +1,97 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import '../../product/utils/response_status_utils.dart'; +import '../../product/constant/enums/role_enums.dart'; +import '../../product/services/api_services.dart'; +import '../../product/utils/qr_utils.dart'; +import '../../product/constant/icon/icon_constants.dart'; +import '../../product/extention/context_extention.dart'; +import '../../product/services/language_services.dart'; + +addNewDevice(BuildContext context, String role) async { + TextEditingController extIDController = TextEditingController(text: ""); + TextEditingController deviceNameController = TextEditingController(text: ""); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + dismissDirection: DismissDirection.none, + duration: context.dynamicMinutesDuration(1), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('${appLocalization(context).add_device_title}: ', + style: context.titleMediumTextStyle), + Container( + alignment: Alignment.centerRight, + child: IconButton( + onPressed: () async { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + }, + icon: IconConstants.instance.getMaterialIcon(Icons.close)), + ) + ], + ), + TextField( + textInputAction: TextInputAction.next, + controller: extIDController, + decoration: InputDecoration( + hintText: appLocalization(context).input_extID_device_hintText, + suffixIcon: IconButton( + onPressed: () async { + String result = + await QRScanUtils.instance.scanQR(context); + extIDController.text = result; + }, + icon: IconConstants.instance + .getMaterialIcon(Icons.qr_code_scanner_outlined))), + ), + role == RoleEnums.ADMIN.name + ? TextField( + textInputAction: TextInputAction.done, + controller: deviceNameController, + decoration: InputDecoration( + hintText: + appLocalization(context).input_name_device_hintText), + ) + : const SizedBox.shrink(), + Center( + child: TextButton( + onPressed: () async { + String extID = extIDController.text; + String deviceName = deviceNameController.text; + addDevices(context, role, extID, deviceName); + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + }, + child: Text(appLocalization(context).add_button_content)), + ) + ], + ), + ), + ); +} + +void addDevices( + BuildContext context, String role, String extID, String deviceName) async { + APIServices apiServices = APIServices(); + Map body = {}; + if (role == RoleEnums.ADMIN.name) { + body = {"ext_id": extID, "name": deviceName}; + int statusCode = await apiServices.createDeviceByAdmin(body); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_create_device_success, + appLocalization(context).notification_create_device_failed); + } else { + body = {"ext_id": extID}; + int statusCode = await apiServices.registerDevice(body); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_add_device_success, + appLocalization(context).notification_device_not_exist); + } +} diff --git a/lib/feature/devices/delete_device_widget.dart b/lib/feature/devices/delete_device_widget.dart new file mode 100644 index 0000000..49ac52a --- /dev/null +++ b/lib/feature/devices/delete_device_widget.dart @@ -0,0 +1,61 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import '../../product/constant/enums/role_enums.dart'; +import '../../product/services/api_services.dart'; +import '../../product/services/language_services.dart'; +import '../../product/utils/response_status_utils.dart'; + +handleDeleteDevice(BuildContext context, String thingID, String role) { + showDialog( + context: context, + builder: (dialogContext) { + return AlertDialog( + title: Text(appLocalization(dialogContext).delete_device_dialog_title), + content: + Text(appLocalization(dialogContext).delete_device_dialog_content), + actions: [ + TextButton( + child: Text(appLocalization(dialogContext).cancel_button_content), + onPressed: () { + Navigator.of(dialogContext).pop(); + }, + ), + TextButton( + child: Text( + appLocalization(dialogContext).delete_button_content, + style: const TextStyle(color: Colors.red), + ), + onPressed: () { + deleteOrUnregisterDevice(context, thingID, role); + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); +} + +deleteOrUnregisterDevice( + BuildContext context, String thingID, String role) async { + APIServices apiServices = APIServices(); + if (role == RoleEnums.USER.name) { + Map body = { + "thing_id": thingID, + }; + int statusCode = await apiServices.unregisterDevice(body); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_delete_device_success, + appLocalization(context).notification_delete_device_failed); + } else { + int statusCode = await apiServices.deleteDeviceByAdmin(thingID); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_delete_device_success, + appLocalization(context).notification_delete_device_failed); + } +} diff --git a/lib/feature/devices/device_detail/device_detail_bloc.dart b/lib/feature/devices/device_detail/device_detail_bloc.dart new file mode 100644 index 0000000..474dd83 --- /dev/null +++ b/lib/feature/devices/device_detail/device_detail_bloc.dart @@ -0,0 +1,79 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:sfm_app/product/services/api_services.dart'; +import 'package:sfm_app/product/utils/device_utils.dart'; + +import '../device_model.dart'; + +import '../../../product/base/bloc/base_bloc.dart'; + +class DetailDeviceBloc extends BlocBase { + APIServices apiServices = APIServices(); + + final deviceInfo = StreamController.broadcast(); + StreamSink get sinkDeviceInfo => deviceInfo.sink; + Stream get streamDeviceInfo => deviceInfo.stream; + + final deviceSensor = StreamController>.broadcast(); + StreamSink> get sinkDeviceSensor => deviceSensor.sink; + Stream> get streamDeviceSensor => deviceSensor.stream; + + final deviceLocation = StreamController.broadcast(); + StreamSink get sinkDeviceLocation => deviceLocation.sink; + Stream get streamDeviceLocation => deviceLocation.stream; + + @override + void dispose() {} + + void getDeviceDetail( + BuildContext context, + String thingID, + Completer controller, + ) async { + String body = await apiServices.getDeviceInfomation(thingID); + if (body != "") { + final data = jsonDecode(body); + Device device = Device.fromJson(data); + sinkDeviceInfo.add(device); + if (device.areaPath != null) { + String fullLocation = await DeviceUtils.instance + .getFullDeviceLocation(context, device.areaPath!); + log("Location: $fullLocation"); + sinkDeviceLocation.add(fullLocation); + } + Map sensorMap = {}; + if (device.status!.sensors != null) { + sensorMap = DeviceUtils.instance + .getDeviceSensors(context, device.status!.sensors!); + } else { + sensorMap = DeviceUtils.instance.getDeviceSensors(context, []); + } + sinkDeviceSensor.add(sensorMap); + if (device.settings!.latitude! != "" && + device.settings!.longitude! != "") { + final CameraPosition cameraPosition = CameraPosition( + target: LatLng( + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + ), + zoom: 13, + ); + final GoogleMapController mapController = await controller.future; + mapController + .animateCamera(CameraUpdate.newCameraPosition(cameraPosition)); + } + } + } + + void findLocation(BuildContext context, String areaPath) async { + String fullLocation = + await DeviceUtils.instance.getFullDeviceLocation(context, areaPath); + sinkDeviceLocation.add(fullLocation); + } +} diff --git a/lib/feature/devices/device_detail/device_detail_screen.dart b/lib/feature/devices/device_detail/device_detail_screen.dart new file mode 100644 index 0000000..57a9ae5 --- /dev/null +++ b/lib/feature/devices/device_detail/device_detail_screen.dart @@ -0,0 +1,361 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:simple_ripple_animation/simple_ripple_animation.dart'; +import 'dart:math' as math; +import '../device_model.dart'; +import '../../../product/base/bloc/base_bloc.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/utils/device_utils.dart'; + +import '../../../product/constant/icon/icon_constants.dart'; +import 'device_detail_bloc.dart'; + +class DetailDeviceScreen extends StatefulWidget { + const DetailDeviceScreen({super.key, required this.thingID}); + final String thingID; + @override + State createState() => _DetailDeviceScreenState(); +} + +class _DetailDeviceScreenState extends State { + List imageAssets = [ + IconConstants.instance.getIcon("normal_icon"), + IconConstants.instance.getIcon("offline_icon"), + IconConstants.instance.getIcon("flame_icon"), + ]; + String stateImgAssets(int state) { + String imgStringAsset; + if (state == 0) { + imgStringAsset = imageAssets[0]; + } else if (state == 1) { + imgStringAsset = imageAssets[1]; + } else { + imgStringAsset = imageAssets[2]; + } + return imgStringAsset; + } + + late DetailDeviceBloc detailDeviceBloc; + Completer controller = Completer(); + CameraPosition initialCamera = const CameraPosition( + target: LatLng(20.966048511844402, 105.74977710843086), zoom: 15); + @override + void initState() { + super.initState(); + detailDeviceBloc = BlocProvider.of(context); + } + + @override + Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + return StreamBuilder( + stream: detailDeviceBloc.streamDeviceInfo, + builder: (context, deviceSnapshot) { + if (deviceSnapshot.data?.extId == null) { + detailDeviceBloc.getDeviceDetail(context, widget.thingID, controller); + return const Center( + child: CircularProgressIndicator(), + ); + } else { + return StreamBuilder>( + stream: detailDeviceBloc.streamDeviceSensor, + builder: (context, sensorSnapshot) { + if (sensorSnapshot.data != null) { + return Scaffold( + appBar: AppBar( + title: Text(appLocalization(context).detail_message), + centerTitle: true, + ), + body: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + // device Name + Card( + child: Container( + width: context.dynamicWidth(1), + height: context.highValue, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(12), + ), + ), + child: Center( + child: Text( + '${appLocalization(context).device_title}: ${deviceSnapshot.data!.name}', + style: const TextStyle( + fontSize: 20, + ), + ), + ), + ), + ), + // Tinh trang va nhiet do + Row( + children: [ + Card( + child: Container( + width: (screenWidth - 20) / 2, + height: context.highValue, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(12), + ), + ), + padding: + const EdgeInsets.fromLTRB(5, 5, 0, 5), + alignment: Alignment.centerLeft, + child: Row( + children: [ + SizedBox( + height: 25, + width: 25, + child: RippleAnimation( + color: DeviceUtils.instance + .getColorRiple( + deviceSnapshot.data!.state!), + delay: + const Duration(milliseconds: 800), + repeat: true, + minRadius: 40, + ripplesCount: 6, + duration: const Duration( + milliseconds: 6 * 300), + child: CircleAvatar( + minRadius: 20, + maxRadius: 20, + backgroundImage: AssetImage( + stateImgAssets( + deviceSnapshot.data!.state!, + ), + ), + ), + ), + ), + SizedBox( + width: context.lowValue, + ), + Text( + DeviceUtils.instance.checkStateDevice( + context, + deviceSnapshot.data!.state!, + ), + style: const TextStyle( + fontSize: 15, + ), + ), + ], + ), + ), + ), + Card( + child: SizedBox( + width: (screenWidth - 20) / 2, + height: context.highValue, + child: Container( + alignment: Alignment.centerLeft, + padding: + const EdgeInsets.fromLTRB(5, 5, 0, 5), + child: Row( + children: [ + const Icon( + Icons.thermostat, + color: Colors.blue, + size: 30, + ), + const SizedBox( + width: 10, + ), + Text( + "${appLocalization(context).paginated_data_table_column_deviceTemperature}: ${sensorSnapshot.data?['sensorTemp'] ?? 100}", + style: const TextStyle( + fontSize: 15, + ), + ), + ], + ), + ), + ), + ), + ], + ), + Row( + children: [ + Card( + child: Container( + width: (screenWidth - 20) / 2, + height: context.highValue, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(12), + ), + ), + alignment: Alignment.centerLeft, + padding: + const EdgeInsets.fromLTRB(10, 5, 0, 5), + child: Row( + children: [ + Transform.rotate( + angle: 90 * math.pi / 180, + child: Icon( + DeviceUtils.instance.getBatteryIcon( + int.parse( + sensorSnapshot + .data!['sensorBattery'], + ), + ), + color: Colors.blue, + size: 30, + ), + ), + SizedBox( + width: context.lowValue, + ), + Text( + "${appLocalization(context).paginated_data_table_column_deviceBaterry}: ${sensorSnapshot.data!['sensorBattery']}%", + style: const TextStyle( + fontSize: 15, + ), + ), + ], + ), + ), + ), + Card( + child: Container( + width: (screenWidth - 20) / 2, + height: context.highValue, + alignment: Alignment.centerLeft, + padding: + const EdgeInsets.fromLTRB(10, 5, 0, 5), + child: Row( + children: [ + Icon( + DeviceUtils.instance.getSignalIcon( + context, + sensorSnapshot.data!['sensorCsq'], + ), + color: Colors.blue, + size: 30, + ), + SizedBox( + width: context.lowValue, + ), + Text( + "${appLocalization(context).paginated_data_table_column_deviceSignal}: ${sensorSnapshot.data!['sensorCsq']}", + style: const TextStyle(fontSize: 15), + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + ), + ], + ), + ), + ), + ], + ), + Card( + child: Container( + padding: const EdgeInsets.all(10.0), + height: context.highValue, + child: Row( + children: [ + const Icon( + Icons.location_on, + color: Colors.blue, + size: 30, + ), + SizedBox( + width: context.lowValue, + ), + Expanded( + child: StreamBuilder( + stream: + detailDeviceBloc.streamDeviceLocation, + builder: (context, locationSnapshot) { + if (locationSnapshot.data != null) { + return Text( + locationSnapshot.data ?? "", + style: + const TextStyle(fontSize: 13), + maxLines: 3, + overflow: TextOverflow.ellipsis, + softWrap: true, + ); + } else { + detailDeviceBloc.findLocation(context, + deviceSnapshot.data!.areaPath!); + return Text(appLocalization(context) + .undefine_message); + } + }, + ), + ), + ], + ), + ), + ), + Card( + child: Container( + height: 300, + padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(15), + ), + ), + child: deviceSnapshot.data!.settings!.latitude != + "" + ? GoogleMap( + initialCameraPosition: initialCamera, + mapType: MapType.normal, + markers: { + Marker( + markerId: MarkerId( + deviceSnapshot.data!.thingId!), + position: LatLng( + double.parse(deviceSnapshot + .data!.settings!.latitude!), + double.parse(deviceSnapshot + .data!.settings!.longitude!), + ), + ), + }, + onMapCreated: (mapcontroller) { + controller.complete(mapcontroller); + }, + mapToolbarEnabled: false, + zoomControlsEnabled: false, + liteModeEnabled: true, + ) + : Center( + child: Text( + appLocalization(context) + .detail_device_dont_has_location_message, + ), + ), + ), + ), + ], + ), + ), + ), + ); + } else { + return Scaffold( + appBar: AppBar(), + body: const Center( + child: CircularProgressIndicator(), + ), + ); + } + }, + ); + } + }, + ); + } +} diff --git a/lib/feature/devices/device_model.dart b/lib/feature/devices/device_model.dart new file mode 100644 index 0000000..a58cf8a --- /dev/null +++ b/lib/feature/devices/device_model.dart @@ -0,0 +1,171 @@ +import 'package:google_maps_cluster_manager/google_maps_cluster_manager.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; + +// class Device { +// int? offset; +// List? items; + +// Device({ +// this.offset, +// this.items, +// }); +// Device.fromJson(Map json) { +// offset = json['offset']; +// if (json['items'] != null) { +// items = []; +// json['items'].forEach((v) { +// items!.add(Item.fromJson(v)); +// }); +// } +// } +// } + +class Device with ClusterItem { + String? extId; + String? thingId; + String? thingKey; + List? channels; + String? areaPath; + String? fvers; + String? name; + HardwareInfo? hardwareInfo; + Settings? settings; + Status? status; + DateTime? connectionTime; + int? state; + String? visibility; + DateTime? createdAt; + DateTime? updatedAt; + + Device({ + this.extId, + this.thingId, + this.thingKey, + this.channels, + this.areaPath, + this.fvers, + this.name, + this.hardwareInfo, + this.settings, + this.status, + this.connectionTime, + this.state, + this.visibility, + this.createdAt, + this.updatedAt, + }); + Device.fromJson(Map json) { + extId = json['ext_id']; + thingId = json['thing_id']; + thingKey = json['thing_key']; + if (json['channels'] != null) { + channels = []; + json['channels'].forEach((v) { + channels!.add(v); + }); + } + areaPath = json['area_path']; + fvers = json['fvers']; + name = json['name']; + hardwareInfo = json['hardware_info'] != null + ? HardwareInfo.fromJson(json['hardware_info']) + : null; + settings = + json['settings'] != null ? Settings.fromJson(json['settings']) : null; + status = json['status'] != null ? Status.fromJson(json['status']) : null; + connectionTime = DateTime.parse(json['connection_time']); + state = json['state']; + visibility = json['visibility']; + createdAt = DateTime.parse(json['created_at']); + updatedAt = DateTime.parse(json['updated_at']); + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => Device.fromJson(e)).toList(); + } + + @override + LatLng get location { + double latitude = double.tryParse(settings?.latitude ?? '') ?? 34.639971; + double longitude = double.tryParse(settings?.longitude ?? '') ?? -39.664027; + return LatLng(latitude, longitude); + } +} + +class HardwareInfo { + String? gsm; + String? imei; + String? imsi; + String? phone; + DateTime? updatedAt; + + HardwareInfo({ + this.gsm, + this.imei, + this.imsi, + this.phone, + this.updatedAt, + }); + HardwareInfo.fromJson(Map json) { + gsm = json['gsm']; + imei = json['imei']; + imsi = json['imsi']; + phone = json['phone']; + updatedAt = DateTime.parse(json['updated_at']); + } +} + +class Settings { + String? latitude; + String? longitude; + DateTime? updatedAt; + + Settings({ + this.latitude, + this.longitude, + this.updatedAt, + }); + Settings.fromJson(Map json) { + latitude = json['latitude']; + longitude = json['longitude']; + updatedAt = DateTime.parse(json['updated_at']); + } +} + +class Status { + int? readOffset; + List? sensors; + DateTime? updatedAt; + + Status({ + this.readOffset, + this.sensors, + this.updatedAt, + }); + + Status.fromJson(Map json) { + readOffset = json['read_offset']; + if (json['sensors'] != null) { + sensors = []; + json['sensors'].forEach((v) { + sensors!.add(Sensor.fromJson(v)); + }); + } + updatedAt = DateTime.parse(json['updated_at']); + } +} + +class Sensor { + String? name; + int? value; + int? time; + dynamic x; + + Sensor({this.name, this.value, this.time, this.x}); + Sensor.fromJson(Map json) { + name = json['n']; + value = json['v']; + time = json['t']; + x = json['x']; + } +} diff --git a/lib/feature/devices/device_update/device_update_bloc.dart b/lib/feature/devices/device_update/device_update_bloc.dart new file mode 100644 index 0000000..c01fc87 --- /dev/null +++ b/lib/feature/devices/device_update/device_update_bloc.dart @@ -0,0 +1,255 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:intl/intl.dart'; +import '../../../product/services/api_services.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/shared/model/ward_model.dart'; +import '../../../product/utils/response_status_utils.dart'; + +import '../../../product/shared/model/district_model.dart'; +import '../../../product/shared/model/province_model.dart'; +import '../device_model.dart'; +import '../../../product/base/bloc/base_bloc.dart'; + +class DeviceUpdateBloc extends BlocBase { + APIServices apiServices = APIServices(); + + final deviceInfo = StreamController.broadcast(); + StreamSink get sinkDeviceInfo => deviceInfo.sink; + Stream get streamDeviceInfo => deviceInfo.stream; + + // DeviceUpdateScreen + final isChanged = StreamController.broadcast(); + StreamSink get sinkIsChanged => isChanged.sink; + Stream get streamIsChanged => isChanged.stream; + + final provinceData = StreamController>.broadcast(); + StreamSink> get sinkProvinceData => provinceData.sink; + Stream> get streamProvinceData => provinceData.stream; + + final listProvinces = + StreamController>>.broadcast(); + StreamSink>> get sinkListProvinces => + listProvinces.sink; + Stream>> get streamListProvinces => + listProvinces.stream; + + final districtData = StreamController>.broadcast(); + StreamSink> get sinkDistrictData => districtData.sink; + Stream> get streamDistrictData => districtData.stream; + + final listDistricts = + StreamController>>.broadcast(); + StreamSink>> get sinkListDistricts => + listDistricts.sink; + Stream>> get streamListDistricts => + listDistricts.stream; + + final wardData = StreamController>.broadcast(); + StreamSink> get sinkWardData => wardData.sink; + Stream> get streamWardData => wardData.stream; + + final listWards = StreamController>>.broadcast(); + StreamSink>> get sinkListWards => listWards.sink; + Stream>> get streamListWards => listWards.stream; + + // Show Maps in DeviceUpdateScreen + + final markers = StreamController>.broadcast(); + StreamSink> get sinkMarkers => markers.sink; + Stream> get streamMarkers => markers.stream; + + final searchLocation = StreamController.broadcast(); + StreamSink get sinkSearchLocation => + searchLocation.sink; + Stream get streamSearchLocation => + searchLocation.stream; + + @override + void dispose() { + // deviceInfo.done; + } + + Future getAllProvinces() async { + List> provincesData = []; + provincesData.clear(); + sinkListProvinces.add(provincesData); + final body = await apiServices.getAllProvinces(); + final data = jsonDecode(body); + List items = data["items"]; + + final provinces = Province.fromJsonDynamicList(items); + for (var province in provinces) { + provincesData.add( + DropdownMenuItem(value: province, child: Text(province.fullName!))); + } + sinkListProvinces.add(provincesData); + } + + Future getAllDistricts(String provinceID) async { + List> districtsData = []; + districtsData.clear(); + sinkListDistricts.add(districtsData); + final body = await apiServices.getAllDistricts(provinceID); + final data = jsonDecode(body); + List items = data["items"]; + final districts = District.fromJsonDynamicList(items); + for (var district in districts) { + districtsData.add( + DropdownMenuItem(value: district, child: Text(district.fullName!))); + } + sinkListDistricts.add(districtsData); + } + + Future getAllWards(String districtID) async { + List> wardsData = []; + wardsData.clear(); + sinkListWards.add(wardsData); + final body = await apiServices.getAllWards(districtID); + final data = jsonDecode(body); + List items = data["items"]; + final wards = Ward.fromJsonDynamicList(items); + for (var ward in wards) { + wardsData.add(DropdownMenuItem(value: ward, child: Text(ward.fullName!))); + } + sinkListWards.add(wardsData); + } + + Future getDeviceInfomation( + String thingID, + List> districtsData, + List> wardsData, + TextEditingController deviceNameController, + TextEditingController latitudeController, + TextEditingController longitudeController) async { + String body = await apiServices.getDeviceInfomation(thingID); + final data = jsonDecode(body); + Device device = Device.fromJson(data); + sinkDeviceInfo.add(device); + deviceNameController.text = device.name ?? ""; + latitudeController.text = device.settings!.latitude ?? ""; + longitudeController.text = device.settings!.longitude ?? ""; + if (device.areaPath != "") { + List areaPath = device.areaPath!.split('_'); + String provinceCode = areaPath[0]; + String districtCode = areaPath[1]; + String wardCode = areaPath[2]; + getAllDistricts(provinceCode); + getAllWards(districtCode); + final provinceResponse = await apiServices.getProvinceByID(provinceCode); + final provincesData = jsonDecode(provinceResponse); + Province province = Province.fromJson(provincesData['data']); + final districtResponse = await apiServices.getDistrictByID(districtCode); + final districtData = jsonDecode(districtResponse); + District district = District.fromJson(districtData['data']); + final wardResponse = await apiServices.getWardByID(wardCode); + final wardData = jsonDecode(wardResponse); + Ward ward = Ward.fromJson(wardData['data']); + Map provinceData = { + "name": province.fullName!, + "code": province.code! + }; + sinkProvinceData.add(provinceData); + Map districData = { + "name": district.fullName!, + "code": district.code!, + }; + sinkDistrictData.add(districData); + Map wardMap = { + "name": ward.fullName!, + "code": ward.code!, + }; + sinkWardData.add(wardMap); + } + } + + Future getProvinceByName(String name) async { + final response = await apiServices.getProvincesByName(name); + final data = jsonDecode(response); + if (data != null && + data.containsKey('items') && + data['items'] != null && + data['items'].isNotEmpty) { + List items = data['items']; + List provinces = Province.fromJsonDynamicList(items); + if (provinces.isNotEmpty) { + return provinces[0]; + } + } + return Province(name: "null"); + } + + Future getDistrictByName(String name, String provinceCode) async { + final response = await apiServices.getDistrictsByName(name); + if (response != "") { + final data = jsonDecode(response); + List items = data['items']; + if (items.isNotEmpty) { + List districts = District.fromJsonDynamicList(items); + if (districts.isNotEmpty) { + for (var district in districts) { + if (district.provinceCode == provinceCode) { + return district; + } + } + } + } + } + return District(name: "null"); + } + + Future getWardByName(String name, String districtCode) async { + final response = await apiServices.getWarsdByName(name); + final data = jsonDecode(response); + if (data != null && data['items'] != null) { + List items = data['items']; + if (items.isNotEmpty) { + List wards = Ward.fromJsonDynamicList(items); + if (wards.isNotEmpty) { + for (var ward in wards) { + if (ward.districtCode == districtCode) { + return ward; + } + } + } + } + } + return Ward(name: "null"); + } + + Future updateDevice( + BuildContext context, + String thingID, + String name, + String latitude, + String longitude, + String provinceCode, + String districtCode, + String wardCode, + ) async { + DateTime dateTime = DateTime.now(); + String formattedDateTime = + DateFormat('yyyy-MM-dd HH:mm:ss').format(dateTime); + Map body = { + "name": name, + "area_province": provinceCode, + "area_district": districtCode, + "area_ward": wardCode, + "latitude": latitude, + "longitude": longitude, + "note": "User updated device infomation at $formattedDateTime", + }; + int statusCode = await apiServices.updateOwnerDevice(thingID, body); + showSnackBarResponseByStatusCodeNoIcon( + context, + statusCode, + appLocalization(context).notification_update_device_success, + appLocalization(context).notification_update_device_failed, + ); + } +} diff --git a/lib/feature/devices/device_update/device_update_screen.dart b/lib/feature/devices/device_update/device_update_screen.dart new file mode 100644 index 0000000..2d8ffbb --- /dev/null +++ b/lib/feature/devices/device_update/device_update_screen.dart @@ -0,0 +1,515 @@ +import 'package:flutter/material.dart'; +import 'package:search_choices/search_choices.dart'; + +import '../device_model.dart'; +import 'device_update_bloc.dart'; +import 'map_dialog.dart'; +import '../../../product/base/bloc/base_bloc.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/api_services.dart'; +import '../../../product/services/language_services.dart'; + +import '../../../product/shared/model/district_model.dart'; +import '../../../product/shared/model/province_model.dart'; +import '../../../product/shared/model/ward_model.dart'; + +class DeviceUpdateScreen extends StatefulWidget { + const DeviceUpdateScreen({super.key, required this.thingID}); + final String thingID; + @override + State createState() => _DeviceUpdateScreenState(); +} + +class _DeviceUpdateScreenState extends State { + late DeviceUpdateBloc deviceUpdateBloc; + APIServices apiServices = APIServices(); + Device device = Device(); + bool isChanged = false; + TextEditingController deviceNameController = TextEditingController(); + TextEditingController deviceLatitudeController = TextEditingController(); + TextEditingController deviceLongitudeController = TextEditingController(); + List> provincesData = []; + String? selectedProvince = ""; + List> districtsData = []; + String? selectedDistrict = ""; + List> wardsData = []; + String? selectedWard = ""; + + // static String provinceCode = ""; + // static String districtCode = ""; + // static String wardCode = ""; + + Map provinceData = {}; + Map districtData = {}; + Map wardData = {}; + + @override + void initState() { + super.initState(); + deviceUpdateBloc = BlocProvider.of(context); + deviceUpdateBloc.getAllProvinces(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text(appLocalization(context).device_update_title), + ), + body: StreamBuilder>( + stream: deviceUpdateBloc.streamProvinceData, + builder: (context, provinceNameSnapshot) { + return StreamBuilder>( + stream: deviceUpdateBloc.streamDistrictData, + builder: (context, districtNameSnapshot) { + return StreamBuilder>( + stream: deviceUpdateBloc.streamWardData, + builder: (context, wardNameSnapshot) { + return SafeArea( + child: StreamBuilder( + stream: deviceUpdateBloc.streamDeviceInfo, + initialData: device, + builder: (context, deviceInfoSnapshot) { + if (deviceInfoSnapshot.data!.thingId == null) { + deviceUpdateBloc.getDeviceInfomation( + widget.thingID, + districtsData, + wardsData, + deviceNameController, + deviceLatitudeController, + deviceLongitudeController); + return const Center( + child: CircularProgressIndicator(), + ); + } else { + return StreamBuilder( + stream: deviceUpdateBloc.streamIsChanged, + initialData: isChanged, + builder: (context, isChangedSnapshot) { + return SingleChildScrollView( + child: Padding( + padding: context.paddingLow, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + "${appLocalization(context).input_name_device_device}:", + style: context + .titleMediumTextStyle), + Padding( + padding: + context.paddingLowVertical, + child: TextField( + onChanged: (value) { + isChangedListener(); + }, + textInputAction: + TextInputAction.next, + controller: + deviceNameController, + decoration: InputDecoration( + hintText: appLocalization( + context) + .input_name_device_hintText, + ), + ), + ), + Text( + "${appLocalization(context).device_update_location}:", + style: context + .titleMediumTextStyle), + Padding( + padding: + context.paddingLowVertical, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + SizedBox( + width: context + .dynamicWidth(0.6), + child: Column( + children: [ + SizedBox( + child: TextField( + onChanged: (value) { + isChangedListener(); + }, + textInputAction: + TextInputAction + .next, + controller: + deviceLatitudeController, + decoration: + InputDecoration( + label: Text( + "${appLocalization(context).update_device_dialog_location_longitude}:"), + hintText: appLocalization( + context) + .update_device_dialog_location_longitude_hintText, + ), + ), + ), + Padding( + padding: context + .paddingLowVertical, + child: SizedBox( + child: TextField( + onChanged: + (value) { + isChangedListener(); + }, + controller: + deviceLongitudeController, + textInputAction: + TextInputAction + .next, + decoration: + InputDecoration( + label: Text( + "${appLocalization(context).update_device_dialog_location_latitude}:"), + hintText: appLocalization( + context) + .update_device_dialog_location_latitude_hintText, + ), + ), + ), + ), + ], + ), + ), + Center( + child: IconButton.filled( + style: const ButtonStyle( + backgroundColor: + MaterialStatePropertyAll( + Colors + .lightGreen)), + // iconSize: 24, + onPressed: () async { + showMapDialog( + context, + deviceUpdateBloc, + deviceLatitudeController, + deviceLongitudeController); + }, + icon: const Icon( + Icons.map_outlined, + ), + ), + ), + SizedBox( + width: context.lowValue), + ], + ), + ), + Text( + "${appLocalization(context).device_update_province}:", + style: context + .titleMediumTextStyle), + Padding( + padding: + context.paddingLowVertical, + child: StreamBuilder< + List< + DropdownMenuItem< + Province>>>( + stream: deviceUpdateBloc + .streamListProvinces, + builder: (dialogContext, + listProvinces) { + return Container( + decoration: BoxDecoration( + borderRadius: + const BorderRadius + .all( + Radius.circular(20), + ), + border: Border.all(), + ), + child: SearchChoices.single( + items: + listProvinces.data ?? + provincesData, + hint: provinceNameSnapshot + .data != + null + ? Text( + provinceNameSnapshot + .data![ + 'name'] ?? + "", + ) + : appLocalization( + context) + .update_device_dialog_location_province_hintText, + searchHint: appLocalization( + context) + .update_device_dialog_location_province_searchHint, + displayClearIcon: false, + onChanged: (value) { + isChangedListener(); + // provinceCode = + // value.code; + selectedProvince = + value.fullName; + provinceData['name'] = + value.fullName; + provinceData['code'] = + value.code; + deviceUpdateBloc + .sinkProvinceData + .add(provinceData); + deviceUpdateBloc + .getAllDistricts( + value.code); + selectedDistrict = ""; + districtData['name'] = + selectedDistrict!; + // deviceUpdateBloc.sinkDistrictName + // .add(selectedDistrict); + deviceUpdateBloc + .sinkDistrictData + .add(districtData); + selectedWard = ""; + wardData['name'] = + selectedWard!; + deviceUpdateBloc + .sinkWardData + .add(wardData); + }, + isExpanded: true, + ), + ); + }, + ), + ), + Text( + "${appLocalization(context).device_update_district}:", + style: context + .titleMediumTextStyle), + Padding( + padding: + context.paddingLowVertical, + child: StreamBuilder< + List< + DropdownMenuItem< + District>>>( + stream: deviceUpdateBloc + .streamListDistricts, + builder: (dialogContext, + listDistricts) { + return Container( + decoration: BoxDecoration( + borderRadius: + const BorderRadius + .all( + Radius.circular(20), + ), + border: Border.all(), + ), + child: SearchChoices.single( + items: + listDistricts.data ?? + districtsData, + hint: districtNameSnapshot + .data != + null + ? Text( + districtNameSnapshot + .data![ + 'name'] ?? + selectedDistrict!, + ) + : appLocalization( + context) + .update_device_dialog_location_district_hintText, + searchHint: appLocalization( + context) + .update_device_dialog_location_district_searchHint, + displayClearIcon: false, + onChanged: (value) { + isChangedListener(); + // districtCode = + // value.code; + selectedDistrict = + value.fullName; + districtData['name'] = + value.fullName!; + districtData['code'] = + value.code; + deviceUpdateBloc + .sinkDistrictData + .add(districtData); + deviceUpdateBloc + .getAllWards( + value.code); + selectedWard = ""; + wardData['name'] = + selectedWard!; + deviceUpdateBloc + .sinkWardData + .add(wardData); + }, + isExpanded: true, + ), + ); + }, + ), + ), + Text( + "${appLocalization(context).device_update_ward}:", + style: context + .titleMediumTextStyle), + Padding( + padding: + context.paddingLowVertical, + child: StreamBuilder< + List>>( + stream: deviceUpdateBloc + .streamListWards, + builder: + (dialogContext, listWards) { + return Container( + decoration: BoxDecoration( + borderRadius: + const BorderRadius + .all( + Radius.circular( + 20)), + border: Border.all()), + child: SearchChoices.single( + items: listWards.data ?? + wardsData, + hint: wardNameSnapshot + .data != + null + ? Text( + wardNameSnapshot + .data![ + 'name'] ?? + selectedWard!, + ) + : appLocalization( + context) + .update_device_dialog_location_ward_hintText, + searchHint: appLocalization( + context) + .update_device_dialog_location_ward_searchHint, + displayClearIcon: false, + onChanged: (value) { + isChangedListener(); + // wardCode = value.code; + selectedWard = + value.fullName; + wardData['name'] = + value.fullName!; + wardData['code'] = + value.code!; + deviceUpdateBloc + .sinkWardData + .add(wardData); + }, + isExpanded: true, + ), + ); + }, + ), + ), + if (isChangedSnapshot.data == true) + Center( + child: SizedBox( + width: + context.dynamicWidth(0.6), + child: TextButton( + style: ButtonStyle( + foregroundColor: + MaterialStateProperty + .all(Colors + .white), + backgroundColor: + MaterialStateProperty + .all(Colors + .blue)), + onPressed: () async { + String provinceCode = + provinceNameSnapshot + .data![ + "code"] ?? + ""; + String districtCode = + districtNameSnapshot + .data![ + "code"] ?? + ""; + String wardCode = + wardNameSnapshot + .data![ + "code"] ?? + ""; + String latitude = + deviceLatitudeController + .value.text; + String longitude = + deviceLongitudeController + .value.text; + String deviceName = + deviceNameController + .value.text; + // log("ProvinceCode: $provinceCode"); + // log("DistrictCode: $districtCode"); + // log("WardCode: $wardCode"); + // log("Latitude: $latitude"); + // log("Longitude: $longitude"); + // log("Device Name: $deviceName"); + await deviceUpdateBloc + .updateDevice( + context, + deviceInfoSnapshot + .data!.thingId!, + deviceName, + latitude, + longitude, + provinceCode, + districtCode, + wardCode, + ); + Future.delayed( + // ignore: use_build_context_synchronously + context.lowDuration, + () { + Navigator.pop( + context); + }); + }, + child: Text(appLocalization( + context) + .update_button_content)), + ), + ), + ], + ), + ), + ); + }, + ); + } + }, + ), + ); + }); + }); + }), + ); + } + + void isChangedListener() { + isChanged = true; + deviceUpdateBloc.sinkIsChanged.add(isChanged); + } +} diff --git a/lib/feature/devices/device_update/geocode_model.dart b/lib/feature/devices/device_update/geocode_model.dart new file mode 100644 index 0000000..55eae98 --- /dev/null +++ b/lib/feature/devices/device_update/geocode_model.dart @@ -0,0 +1,47 @@ +class Geocode { + List? addressComponents; + String? formattedAddress; + Geocode({ + this.addressComponents, + this.formattedAddress, + }); + + Geocode.fromJson(Map json) { + formattedAddress = json['formatted_address']; + if (json['address_components'] != null) { + addressComponents = []; + json['address_components'].forEach((v) { + addressComponents!.add(AddressComponent.fromJson(v)); + }); + } + } + Map toJson() { + final Map data = {}; + data['formatted_address'] = formattedAddress; + if (addressComponents != null) { + data['address_components'] = + addressComponents!.map((e) => e.toJson()).toList(); + } + return data; + } +} + +class AddressComponent { + String? longName; + String? shortName; + List? types; + AddressComponent({this.longName, this.shortName, this.types}); + + AddressComponent.fromJson(Map json) { + longName = json['long_name']; + shortName = json['short_name']; + types = json['types'].cast(); + } + Map toJson() { + final Map data = {}; + data['long_name'] = longName; + data['short_name'] = shortName; + data['type'] = types; + return data; + } +} diff --git a/lib/feature/devices/device_update/map_dialog.dart b/lib/feature/devices/device_update/map_dialog.dart new file mode 100644 index 0000000..5c31ead --- /dev/null +++ b/lib/feature/devices/device_update/map_dialog.dart @@ -0,0 +1,298 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; +import 'package:http/http.dart' as http; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'device_update_bloc.dart'; +import '../../../product/constant/app/app_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/shared/find_location_maps/shared_map_search_location.dart'; + +import '../../../product/shared/find_location_maps/model/prediction_model.dart'; +import '../../../product/shared/shared_transition.dart'; +import 'geocode_model.dart'; + +showMapDialog( + BuildContext context, + DeviceUpdateBloc deviceUpdateBloc, + TextEditingController latitudeController, + TextEditingController longitudeController) async { + const CameraPosition defaultPosition = CameraPosition( + target: LatLng(20.985424, 105.738354), + zoom: 12, + ); + TextEditingController searchLocationController = TextEditingController(); + TextEditingController mapDialogLatitudeController = TextEditingController(); + TextEditingController mapDialogLongitudeController = TextEditingController(); + Completer ggmapController = Completer(); + final streamController = StreamController.broadcast(); + showGeneralDialog( + barrierDismissible: false, + transitionDuration: context.normalDuration, + transitionBuilder: transitionsLeftToRight, + context: context, + pageBuilder: (context, animation, secondaryAnimation) { + return StreamBuilder>( + stream: deviceUpdateBloc.streamMarkers, + builder: (context, markerSnapshot) { + if (!markerSnapshot.hasData) { + if (latitudeController.value.text != "" && + longitudeController.value.text != "") { + double latitude = double.parse(latitudeController.text); + double longitude = double.parse(longitudeController.text); + addMarker( + LatLng(latitude, longitude), + ggmapController, + deviceUpdateBloc, + mapDialogLatitudeController, + mapDialogLongitudeController, + ); + } + } + return Scaffold( + appBar: AppBar( + title: Text(appLocalization(context) + .update_device_dialog_maps_dialog_title), + centerTitle: true, + actions: [ + IconButton( + onPressed: () async { + String latitude = mapDialogLatitudeController.text; + String longitude = mapDialogLongitudeController.text; + log("Finish -- Latitude: $latitude, longitude: $longitude --"); + getDataFromApi(latitude, longitude, deviceUpdateBloc); + latitudeController.text = + mapDialogLatitudeController.text; + longitudeController.text = + mapDialogLongitudeController.text; + bool isChange = true; + deviceUpdateBloc.sinkIsChanged.add(isChange); + Navigator.of(context).pop(); + }, + icon: const Icon(Icons.check)) + ], + ), + body: Stack( + children: [ + GoogleMap( + onTap: (location) async { + addMarker( + location, + ggmapController, + deviceUpdateBloc, + mapDialogLatitudeController, + mapDialogLongitudeController, + ); + }, + markers: markerSnapshot.data ?? {}, + onMapCreated: (GoogleMapController mapController) { + ggmapController.complete(mapController); + streamController.add(mapController); + }, + initialCameraPosition: defaultPosition, + ), + Container( + // color: Colors.white, + height: 80, + alignment: Alignment.topCenter, + padding: const EdgeInsets.all(10), + child: StreamBuilder( + stream: deviceUpdateBloc.streamSearchLocation, + builder: (context, searchLocation) { + return NearBySearchSFM( + textInputAction: TextInputAction.done, + textEditingController: + searchLocation.data ?? searchLocationController, + googleAPIKey: ApplicationConstants.MAP_KEY, + locationLatitude: 20.985424, + locationLongitude: 105.738354, + radius: 50000, + inputDecoration: InputDecoration( + hintText: appLocalization(context) + .update_device_dialog_search_location_hint, + border: InputBorder.none), + debounceTime: 600, + isLatLngRequired: true, + getPlaceDetailWithLatLng: (Prediction prediction) { + FocusScope.of(context).unfocus(); + addMarker( + LatLng(double.parse(prediction.lat!), + double.parse(prediction.lng!)), + ggmapController, + deviceUpdateBloc, + mapDialogLatitudeController, + mapDialogLongitudeController); + }, + itemClick: (Prediction prediction) { + searchLocationController.text = + prediction.structuredFormatting!.mainText!; + deviceUpdateBloc.sinkSearchLocation + .add(searchLocationController); + searchLocationController.selection = + TextSelection.fromPosition(TextPosition( + offset: prediction.structuredFormatting! + .mainText!.length)); + }, + boxDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey, + width: 0.5, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20))), + ); + }), + ) + ], + ), + ); + }); + }, + ); +} + +addMarker( + LatLng position, + Completer mapController, + DeviceUpdateBloc deviceUpdateBloc, + TextEditingController mapDialogLatitudeController, + TextEditingController mapDialogLongitudeController, +) async { + log("AddMarker -- Latitude: ${position.latitude}, longitude: ${position.longitude} --"); + + Set marker = {}; + deviceUpdateBloc.sinkMarkers.add(marker); + Marker newMarker = Marker( + markerId: const MarkerId('value'), + position: LatLng(position.latitude, position.longitude), + icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), + draggable: true, + onDragEnd: (position) { + mapDialogLatitudeController.text = position.latitude.toString(); + mapDialogLongitudeController.text = position.longitude.toString(); + }, + ); + marker.add(newMarker); + deviceUpdateBloc.sinkMarkers.add(marker); + mapDialogLatitudeController.text = position.latitude.toString(); + mapDialogLongitudeController.text = position.longitude.toString(); + updateCameraPosition(position, 14, mapController); +} + +void getDataFromApi(String latitude, String longitude, + DeviceUpdateBloc deviceUpdateBloc) async { + String path = + "maps/api/geocode/json?latlng=$latitude,$longitude&language=vi&result_type=political&key=${ApplicationConstants.MAP_KEY}"; + var url = Uri.parse('https://maps.googleapis.com/$path'); + + final response = await http.get(url); + + if (response.statusCode != 200) { + log("Loi: ${response.statusCode}"); + return; + } + + Map data = jsonDecode(response.body); + if (!data.containsKey('results') || data['results'].isEmpty) { + log("Khong co result"); + return; + } + + List results = data['results']; + List geocodes = + results.map((result) => Geocode.fromJson(result)).toList(); + + Map locations = + _extractLocationComponents(geocodes[0].addressComponents!); + + // In ra thông tin của các location + locations.forEach((key, value) { + log("$key: $value"); + }); + + await _processLocations(locations, deviceUpdateBloc); +} + +Map _extractLocationComponents( + List addressComponents) { + Map locations = {}; + + for (var addressComponent in addressComponents) { + String longName = addressComponent.longName ?? ""; + if (addressComponent.types!.contains('administrative_area_level_3') || + addressComponent.types!.contains('sublocality_level_1')) { + locations['wardkey'] = longName; + } else if (addressComponent.types! + .contains('administrative_area_level_2') || + addressComponent.types!.contains('sublocality_level_2') || + addressComponent.types!.contains('locality')) { + locations['districtkey'] = longName; + } else if (addressComponent.types! + .contains('administrative_area_level_1')) { + locations['provincekey'] = longName; + } + } + + return locations; +} + +Future _processLocations( + Map locations, DeviceUpdateBloc deviceUpdateBloc) async { + String provinceNameFromAPI = locations['provincekey'] ?? ""; + String districtNameFromAPI = locations['districtkey'] ?? ""; + String wardNameFromAPI = locations['wardkey'] ?? ""; + + final province = + await deviceUpdateBloc.getProvinceByName(provinceNameFromAPI); + if (province.name != "null") { + log("Province: ${province.fullName}, ProvinceCode: ${province.code}"); + deviceUpdateBloc.sinkProvinceData + .add({"code": province.code!, "name": province.fullName!}); + deviceUpdateBloc.getAllProvinces(); + + final district = await deviceUpdateBloc.getDistrictByName( + districtNameFromAPI, province.code!); + log("Districtname: ${district.fullName}, districtCode: ${district.code}"); + deviceUpdateBloc.getAllDistricts(province.code!); + if (district.name != "null") { + deviceUpdateBloc.sinkDistrictData + .add({"code": district.code!, "name": district.fullName!}); + final ward = + await deviceUpdateBloc.getWardByName(wardNameFromAPI, district.code!); + log("Wardname: ${ward.fullName}, WardCode: ${ward.code}"); + deviceUpdateBloc.getAllWards(district.code!); + if (ward.name != "null") { + log("Xac dinh duoc het thong tin tu toa do"); + deviceUpdateBloc.sinkWardData + .add({"code": ward.code!, "name": ward.fullName!}); + } else { + deviceUpdateBloc.sinkWardData.add({}); + } + } else { + deviceUpdateBloc.sinkDistrictData.add({}); + } + } else { + deviceUpdateBloc.sinkProvinceData.add({}); + } +} + +Future updateCameraPosition(LatLng location, double zoom, + Completer mapController) async { + final CameraPosition cameraPosition = CameraPosition( + target: LatLng( + location.latitude, + location.longitude, + ), + zoom: zoom, + ); + final GoogleMapController mapControllerNew = await mapController.future; + mapControllerNew.animateCamera( + CameraUpdate.newCameraPosition( + cameraPosition, + ), + ); +} diff --git a/lib/feature/devices/devices_manager_bloc.dart b/lib/feature/devices/devices_manager_bloc.dart new file mode 100644 index 0000000..f265938 --- /dev/null +++ b/lib/feature/devices/devices_manager_bloc.dart @@ -0,0 +1,35 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'device_model.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/services/api_services.dart'; + +import '../../product/utils/device_utils.dart'; + +class DevicesManagerBloc extends BlocBase { + APIServices apiServices = APIServices(); + + final userRole = StreamController.broadcast(); + StreamSink get sinkUserRole => userRole.sink; + Stream get streamUserRole => userRole.stream; + + final allDevices = StreamController>.broadcast(); + StreamSink> get sinkAllDevices => allDevices.sink; + Stream> get streamAllDevices => allDevices.stream; + + @override + void dispose() {} + + void getDevice() async { + String body = await apiServices.getOwnerDevices(); + if (body != "") { + final data = jsonDecode(body); + List items = data['items']; + List originalDevices = Device.fromJsonDynamicList(items); + List devices = + DeviceUtils.instance.sortDeviceByState(originalDevices); + sinkAllDevices.add(devices); + } + } +} diff --git a/lib/feature/devices/devices_manager_screen.dart b/lib/feature/devices/devices_manager_screen.dart new file mode 100644 index 0000000..bc76489 --- /dev/null +++ b/lib/feature/devices/devices_manager_screen.dart @@ -0,0 +1,274 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'add_new_device_widget.dart'; +import 'delete_device_widget.dart'; +import 'device_model.dart'; +import 'devices_manager_bloc.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/constant/enums/app_route_enums.dart'; +import '../../product/constant/enums/role_enums.dart'; +import '../../product/constant/icon/icon_constants.dart'; +import '../../product/extention/context_extention.dart'; +import '../../product/services/api_services.dart'; +import '../../product/services/language_services.dart'; +import '../../product/utils/device_utils.dart'; + +class DevicesManagerScreen extends StatefulWidget { + const DevicesManagerScreen({super.key}); + + @override + State createState() => _DevicesManagerScreenState(); +} + +class _DevicesManagerScreenState extends State { + late DevicesManagerBloc devicesManagerBloc; + String role = "Undefine"; + APIServices apiServices = APIServices(); + List devices = []; + Timer? getAllDevicesTimer; + + @override + void initState() { + super.initState(); + devicesManagerBloc = BlocProvider.of(context); + getUserRole(); + // devicesManagerBloc.getDevice(); + // getAllOwnerDevices(); + // const duration = Duration(seconds: 10); + // getAllDevicesTimer = + // Timer.periodic(duration, (Timer t) => devicesManagerBloc.getDevice()); + } + + @override + void dispose() { + getAllDevicesTimer?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SafeArea( + child: StreamBuilder>( + stream: devicesManagerBloc.streamAllDevices, + initialData: devices, + builder: (context, allDeviceSnapshot) { + if (allDeviceSnapshot.data?.isEmpty ?? devices.isEmpty) { + devicesManagerBloc.getDevice(); + return const Center(child: CircularProgressIndicator()); + } else { + return SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + StreamBuilder( + stream: devicesManagerBloc.streamUserRole, + initialData: role, + builder: (context, roleSnapshot) { + return PaginatedDataTable( + header: Center( + child: Text( + appLocalization(context) + .paginated_data_table_title, + style: context.titleLargeTextStyle, + ), + ), + columns: [ + if (roleSnapshot.data == RoleEnums.ADMIN.name || + roleSnapshot.data == RoleEnums.USER.name) + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_action))), + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_deviceName))), + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_deviceStatus))), + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_deviceBaterry))), + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_deviceSignal))), + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_deviceTemperature))), + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_deviceHump))), + DataColumn( + label: Center( + child: Text(appLocalization(context) + .paginated_data_table_column_devicePower))), + ], + onPageChanged: (int pageIndex) { + // log('Chuyen page: $pageIndex'); + }, + rowsPerPage: 5, + actions: [ + if (roleSnapshot.data == RoleEnums.USER.name || + roleSnapshot.data == RoleEnums.ADMIN.name) + IconButton( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + Colors.green), + iconColor: + MaterialStateProperty.all( + Colors.white)), + onPressed: () { + ScaffoldMessenger.of(context) + .clearSnackBars(); + addNewDevice( + context, roleSnapshot.data ?? role); + }, + icon: IconConstants.instance + .getMaterialIcon(Icons.add)) + ], + source: DeviceSource( + devices: allDeviceSnapshot.data ?? devices, + context: context, + devicesBloc: devicesManagerBloc, + role: role)); + }) + ], + ), + ); + } + }), + ); + } + + void getUserRole() async { + role = await apiServices.getUserRole(); + devicesManagerBloc.sinkUserRole.add(role); + } +} + +class DeviceSource extends DataTableSource { + String role; + APIServices apiServices = APIServices(); + List devices; + final DevicesManagerBloc devicesBloc; + final BuildContext context; + DeviceSource( + {required this.devices, + required this.context, + required this.devicesBloc, + required this.role}); + @override + DataRow? getRow(int index) { + if (index >= devices.length) { + return null; + } + final device = devices[index]; + Map sensorMap = DeviceUtils.instance + .getDeviceSensors(context, device.status?.sensors ?? []); + String deviceState = + DeviceUtils.instance.checkStateDevice(context, device.state!); + return DataRow.byIndex( + // color: getTableRowColor(device.state!), + index: index, + cells: [ + if (role == RoleEnums.USER.name || role == RoleEnums.ADMIN.name) + DataCell( + Center( + child: Row( + children: [ + IconButton( + // style: ButtonStyle(), + hoverColor: Colors.black, + onPressed: () { + context.pushNamed(AppRoutes.DEVICE_UPDATE.name, + pathParameters: {'thingID': device.thingId!}); + }, + icon: const Icon(Icons.build, color: Colors.blue)), + IconButton( + onPressed: () async { + handleDeleteDevice(context, device.thingId!, role); + }, + icon: const Icon(Icons.delete, color: Colors.red)), + ], + ), + ), + ), + DataCell( + Text(device.name!, + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor(device.state!))), onTap: () { + // log(device.thingId.toString()); + context.pushNamed(AppRoutes.DEVICE_DETAIL.name, + pathParameters: {'thingID': device.thingId!}); + }), + DataCell( + Center( + child: Text(deviceState, + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor(device.state!)))), onTap: () { + // log(device.thingId.toString()); + context.pushNamed(AppRoutes.DEVICE_DETAIL.name, + pathParameters: {'thingID': device.thingId!}); + }), + DataCell( + Center( + child: Center( + child: Text(sensorMap['sensorBattery'] + "%", + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor(device.state!))))), + onTap: () => context.pushNamed(AppRoutes.DEVICE_DETAIL.name, + pathParameters: {'thingID': device.thingId!}), + ), + DataCell( + Center( + child: Center( + child: Text(sensorMap['sensorCsq'], + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor(device.state!))))), + ), + DataCell( + Center( + child: Text(sensorMap['sensorTemp'], + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor(device.state!)))), + ), + DataCell( + Center( + child: Text(sensorMap['sensorHum'], + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor(device.state!)))), + ), + DataCell( + Center( + child: Text(sensorMap['sensorVolt'], + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor(device.state!)))), + ), + ], + ); + } + + @override + int get rowCount => devices.length; + + @override + bool get isRowCountApproximate => false; + + @override + int get selectedRowCount => 0; +} diff --git a/lib/feature/error/not_found_screen.dart b/lib/feature/error/not_found_screen.dart new file mode 100644 index 0000000..e62ee83 --- /dev/null +++ b/lib/feature/error/not_found_screen.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:sfm_app/product/constant/enums/app_route_enums.dart'; +import 'package:sfm_app/product/constant/image/image_constants.dart'; + +class NotFoundScreen extends StatelessWidget { + const NotFoundScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + fit: StackFit.expand, + children: [ + Image.asset( + ImageConstants.instance.getImage('error_page'), + fit: BoxFit.cover, + ), + Positioned( + bottom: MediaQuery.of(context).size.height * 0.15, + left: MediaQuery.of(context).size.width * 0.3, + right: MediaQuery.of(context).size.width * 0.3, + child: TextButton( + onPressed: () { + context.goNamed(AppRoutes.LOGIN.name); + }, + child: Text( + "Go Home".toUpperCase(), + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/feature/home/device_alias_model.dart b/lib/feature/home/device_alias_model.dart new file mode 100644 index 0000000..e2ca4b7 --- /dev/null +++ b/lib/feature/home/device_alias_model.dart @@ -0,0 +1,79 @@ + +import '../devices/device_model.dart'; + +class DeviceWithAlias { + String? extId; + String? thingId; + String? thingKey; + List? channels; + String? areaPath; + String? fvers; + String? name; + HardwareInfo? hardwareInfo; + Settings? settings; + Status? status; + DateTime? connectionTime; + int? state; + String? visibility; + DateTime? createdAt; + DateTime? updatedAt; + bool? isOwner; + String? ownerId; + String? ownerName; + String? alias; + + DeviceWithAlias({ + this.extId, + this.thingId, + this.thingKey, + this.channels, + this.areaPath, + this.fvers, + this.name, + this.hardwareInfo, + this.settings, + this.status, + this.connectionTime, + this.state, + this.visibility, + this.createdAt, + this.updatedAt, + this.isOwner, + this.ownerId, + this.ownerName, + this.alias, + }); + + DeviceWithAlias.fromJson(Map json) { + extId = json['ext_id']; + thingId = json['thing_id']; + thingKey = json['thing_key']; + if (json['channels'] != null) { + channels = []; + json['channels'].forEach((v) { + channels!.add(v); + }); + } + areaPath = json['area_path']; + fvers = json['fvers']; + name = json['name']; + hardwareInfo = json['hardware_info'] != null + ? HardwareInfo.fromJson(json['hardware_info']) + : null; + settings = + json['settings'] != null ? Settings.fromJson(json['settings']) : null; + status = json['status'] != null ? Status.fromJson(json['status']) : null; + connectionTime = DateTime.parse(json['connection_time']); + state = json['state']; + visibility = json['visibility']; + createdAt = DateTime.parse(json['created_at']); + updatedAt = DateTime.parse(json['updated_at']); + isOwner = json['is_owner']; + ownerId = json['owner_id']; + ownerName = json['owner_name']; + alias = json['alias']; + } + static List fromJsonDynamicList(List list) { + return list.map((e) => DeviceWithAlias.fromJson(e)).toList(); + } +} diff --git a/lib/feature/home/home_bloc.dart b/lib/feature/home/home_bloc.dart new file mode 100644 index 0000000..e4f7f21 --- /dev/null +++ b/lib/feature/home/home_bloc.dart @@ -0,0 +1,92 @@ +import 'dart:async'; + +import 'device_alias_model.dart'; + +import '../../product/base/bloc/base_bloc.dart'; + +class HomeBloc extends BlocBase { + + final allDevicesAlias = StreamController>.broadcast(); + StreamSink> get sinkAllDevicesAlias => + allDevicesAlias.sink; + Stream> get streamAllDevicesAlias => + allDevicesAlias.stream; + + final onlineDevicesAlias = + StreamController>.broadcast(); + StreamSink> get sinkOnlineDevicesAlias => + onlineDevicesAlias.sink; + Stream> get streamOnlineDevicesAlias => + onlineDevicesAlias.stream; + + final offlineDevicesAlias = + StreamController>.broadcast(); + StreamSink> get sinkOfflineDevicesAlias => + offlineDevicesAlias.sink; + Stream> get streamOfflineDevicesAlias => + offlineDevicesAlias.stream; + + final warningDevicesAlias = + StreamController>.broadcast(); + StreamSink> get sinkWarningDevicesAlias => + warningDevicesAlias.sink; + Stream> get streamWarningDevicesAlias => + warningDevicesAlias.stream; + + final notUseDevicesAlias = + StreamController>.broadcast(); + StreamSink> get sinkNotUseDevicesAlias => + notUseDevicesAlias.sink; + Stream> get streamNotUseDevicesAlias => + notUseDevicesAlias.stream; + + final allDevicesAliasJoined = + StreamController>.broadcast(); + StreamSink> get sinkAllDevicesAliasJoined => + allDevicesAliasJoined.sink; + Stream> get streamAllDevicesAliasJoined => + allDevicesAliasJoined.stream; + + final onlineDevicesAliasJoined = + StreamController>.broadcast(); + StreamSink> get sinkOnlineDevicesAliasJoined => + onlineDevicesAliasJoined.sink; + Stream> get streamOnlineDevicesAliasJoined => + onlineDevicesAliasJoined.stream; + + final offlineDevicesAliasJoined = + StreamController>.broadcast(); + StreamSink> get sinkOfflineDevicesAliasJoined => + offlineDevicesAliasJoined.sink; + Stream> get streamOfflineDevicesAliasJoined => + offlineDevicesAliasJoined.stream; + + final warningDevicesAliasJoined = + StreamController>.broadcast(); + StreamSink> get sinkWarningDevicesAliasJoined => + warningDevicesAliasJoined.sink; + Stream> get streamWarningDevicesAliasJoined => + warningDevicesAliasJoined.stream; + + final notUseDevicesAliasJoined = + StreamController>.broadcast(); + StreamSink> get sinkNotUseDevicesAliasJoined => + notUseDevicesAliasJoined.sink; + Stream> get streamNotUseDevicesAliasJoined => + notUseDevicesAliasJoined.stream; + + final countNotitication = StreamController.broadcast(); + StreamSink get sinkCountNotitication => countNotitication.sink; + Stream get streamCountNotitication => countNotitication.stream; + + final ownerDevicesStatus = + StreamController>>.broadcast(); + StreamSink>> + get sinkOwnerDevicesStatus => ownerDevicesStatus.sink; + Stream>> get streamOwnerDevicesStatus => + ownerDevicesStatus.stream; + + + @override + void dispose() {} +} diff --git a/lib/feature/home/home_screen.dart b/lib/feature/home/home_screen.dart new file mode 100644 index 0000000..38d8aae --- /dev/null +++ b/lib/feature/home/home_screen.dart @@ -0,0 +1,411 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'shared/alert_card.dart'; +import 'shared/warning_card.dart'; +import '../../product/utils/device_utils.dart'; +import 'device_alias_model.dart'; +import 'shared/overview_card.dart'; +import '../settings/device_notification_settings/device_notification_settings_model.dart'; +import '../../product/extention/context_extention.dart'; +import '../../product/services/api_services.dart'; +import '../../product/services/language_services.dart'; +import 'home_bloc.dart'; +import '../../product/base/bloc/base_bloc.dart'; + +class HomeScreen extends StatefulWidget { + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + late HomeBloc homeBloc; + APIServices apiServices = APIServices(); + List devices = []; + List allDevicesAlias = []; + List onlineDevicesAlias = []; + List offlineDevicesAlias = []; + List warningDevicesAlias = []; + List notUseDevicesAlias = []; + + List allDevicesAliasJoined = []; + List onlineDevicesAliasJoined = []; + List offlineDevicesAliasJoined = []; + List warningDevicesAliasJoined = []; + List notUseDevicesAliasJoined = []; + bool isFunctionCall = false; + Timer? getAllDevicesTimer; + int notificationCount = 0; + Map> ownerDevicesStatus = {}; + List ownerDevicesState = []; + + @override + void initState() { + super.initState(); + homeBloc = BlocProvider.of(context); + const duration = Duration(seconds: 20); + getOwnerAndJoinedDevices(); + getAllDevicesTimer = + Timer.periodic(duration, (Timer t) => getOwnerAndJoinedDevices()); + } + + @override + void dispose() { + getAllDevicesTimer?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: context.paddingLow, + child: SingleChildScrollView( + child: Column( + children: [ + Row( + children: [ + Text( + appLocalization(context).notification, + style: context.titleMediumTextStyle, + ), + SizedBox(width: context.lowValue), + StreamBuilder( + stream: homeBloc.streamCountNotitication, + builder: (context, countSnapshot) { + return Text( + "(${countSnapshot.data ?? 0})", + style: context.titleMediumTextStyle, + ); + }, + ) + ], + ), + SizedBox( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: StreamBuilder>>( + stream: homeBloc.streamOwnerDevicesStatus, + builder: (context, snapshot) { + if (snapshot.data?['state'] != null || + snapshot.data?['battery'] != null) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (snapshot.data?['state'] != null) + ...snapshot.data!['state']! + .map( + (item) => FutureBuilder( + future: warningCard( + context, apiServices, item), + builder: (context, warningCardSnapshot) { + if (warningCardSnapshot.hasData) { + return ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 400, + maxHeight: 260, + ), + child: warningCardSnapshot.data!, + ); + } else { + return const SizedBox.shrink(); + } + }, + ), + ) + .toList(), + if (snapshot.data?['battery'] != null) + ...snapshot.data!['battery']! + .map( + (batteryItem) => FutureBuilder( + future: notificationCard( + context, + "lowBattery", + "Cảnh báo pin yếu", + batteryItem.name!, + batteryItem.areaPath!, + ), + builder: (context, warningCardSnapshot) { + if (warningCardSnapshot.hasData) { + return ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 400, + maxHeight: 260, + ), + child: warningCardSnapshot.data!, + ); + } else { + return const SizedBox.shrink(); + } + }, + ), + ) + .toList(), + ]); + } else { + return Padding( + padding: context.paddingMedium, + child: Center( + child: Row( + children: [ + const Icon( + Icons.check_circle_outline_rounded, + size: 40, + color: Colors.green, + ), + SizedBox(width: context.lowValue), + Text( + appLocalization(context) + .notification_description, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ], + ), + ), + ); + } + }, + ), + ), + ), + StreamBuilder>( + stream: homeBloc.streamAllDevicesAlias, + initialData: allDevicesAlias, + builder: (context, allDeviceSnapshot) { + return StreamBuilder>( + stream: homeBloc.streamOnlineDevicesAlias, + initialData: onlineDevicesAlias, + builder: (context, onlineDeviceSnapshot) { + return StreamBuilder>( + stream: homeBloc.streamOfflineDevicesAlias, + initialData: offlineDevicesAlias, + builder: (context, deviceDashboardSnapshot) { + return StreamBuilder>( + stream: homeBloc.streamWarningDevicesAlias, + initialData: warningDevicesAlias, + builder: (context, warningDeviceSnapshot) { + return StreamBuilder>( + stream: homeBloc.streamNotUseDevicesAlias, + initialData: notUseDevicesAlias, + builder: (context, notUseSnapshot) { + return OverviewCard( + isOwner: true, + total: allDeviceSnapshot.data!.length, + active: onlineDeviceSnapshot.data!.length, + inactive: + deviceDashboardSnapshot.data!.length, + warning: warningDeviceSnapshot.data!.length, + unused: notUseSnapshot.data!.length, + ); + }, + ); + }, + ); + }, + ); + }, + ); + }, + ), + SizedBox(height: context.lowValue), + StreamBuilder>( + stream: homeBloc.streamAllDevicesAliasJoined, + initialData: allDevicesAliasJoined, + builder: (context, allDeviceSnapshot) { + if (allDeviceSnapshot.data?.isEmpty ?? true) { + return const SizedBox.shrink(); + } + return StreamBuilder>( + stream: homeBloc.streamOnlineDevicesAliasJoined, + initialData: onlineDevicesAliasJoined, + builder: (context, onlineDeviceSnapshot) { + return StreamBuilder>( + stream: homeBloc.streamOfflineDevicesAliasJoined, + initialData: offlineDevicesAliasJoined, + builder: (context, deviceDashboardSnapshot) { + return StreamBuilder>( + stream: homeBloc.streamWarningDevicesAliasJoined, + initialData: warningDevicesAliasJoined, + builder: (context, warningDeviceSnapshot) { + return StreamBuilder>( + stream: homeBloc.streamNotUseDevicesAliasJoined, + initialData: notUseDevicesAliasJoined, + builder: (context, notUseSnapshot) { + return OverviewCard( + isOwner: false, + total: allDeviceSnapshot.data!.length, + active: onlineDeviceSnapshot.data!.length, + inactive: + deviceDashboardSnapshot.data!.length, + warning: warningDeviceSnapshot.data!.length, + unused: notUseSnapshot.data!.length, + ); + }, + ); + }, + ); + }, + ); + }, + ); + }, + ), + ], + ), + ), + ); + } + + void getOwnerAndJoinedDevices() async { + String response = await apiServices.getDashBoardDevices(); + final data = jsonDecode(response); + List result = data["items"]; + devices = DeviceWithAlias.fromJsonDynamicList(result); + getOwnerDeviceState(devices); + getDevicesStatusAlias(devices); + checkSettingdevice(devices); + } + + void getOwnerDeviceState(List allDevices) async { + List ownerDevices = []; + for (var device in allDevices) { + if (device.isOwner!) { + ownerDevices.add(device); + } + } + if (ownerDevicesState.isEmpty || + ownerDevicesState.length < devices.length) { + ownerDevicesState.clear(); + ownerDevicesStatus.clear(); + homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus); + int count = 0; + for (var device in ownerDevices) { + Map sensorMap = DeviceUtils.instance + .getDeviceSensors(context, device.status?.sensors ?? []); + if (device.state == 1 || device.state == 3) { + ownerDevicesStatus["state"] ??= []; + ownerDevicesStatus["state"]!.add(device); + homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus); + count++; + } + if (sensorMap['sensorBattery'] != + appLocalization(context).no_data_message) { + if (double.parse(sensorMap['sensorBattery']) <= 20) { + ownerDevicesStatus['battery'] ??= []; + ownerDevicesStatus['battery']!.add(device); + homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus); + count++; + } + } + notificationCount = count; + homeBloc.sinkCountNotitication.add(notificationCount); + } + } + } + + void getDevicesStatusAlias(List devices) async { + clearAllDeviceStatusAlias(); + for (DeviceWithAlias device in devices) { + if (device.isOwner == true) { + allDevicesAlias.add(device); + if (device.state! == 0 || device.state! == 1) { + onlineDevicesAlias.add(device); + homeBloc.sinkOnlineDevicesAlias.add(onlineDevicesAlias); + } + if (device.state! == -1) { + offlineDevicesAlias.add(device); + homeBloc.sinkOfflineDevicesAlias.add(offlineDevicesAlias); + } + if (device.state! == 1) { + warningDevicesAlias.add(device); + homeBloc.sinkWarningDevicesAlias.add(warningDevicesAlias); + } + if (device.state! == -2) { + notUseDevicesAlias.add(device); + homeBloc.sinkNotUseDevicesAlias.add(notUseDevicesAlias); + } + } else { + allDevicesAliasJoined.add(device); + if (device.state! == 0 || device.state! == 1) { + onlineDevicesAliasJoined.add(device); + homeBloc.sinkOnlineDevicesAliasJoined.add(onlineDevicesAliasJoined); + } + if (device.state! == -1) { + offlineDevicesAliasJoined.add(device); + homeBloc.sinkOfflineDevicesAliasJoined.add(offlineDevicesAliasJoined); + } + if (device.state! == 1) { + warningDevicesAliasJoined.add(device); + homeBloc.sinkWarningDevicesAliasJoined.add(warningDevicesAliasJoined); + } + if (device.state! == -2) { + notUseDevicesAliasJoined.add(device); + homeBloc.sinkNotUseDevicesAliasJoined.add(notUseDevicesAliasJoined); + } + } + } + checkSettingdevice(allDevicesAliasJoined); + homeBloc.sinkAllDevicesAlias.add(allDevicesAlias); + homeBloc.sinkAllDevicesAliasJoined.add(allDevicesAliasJoined); + } + + void checkSettingdevice(List devices) async { + if (isFunctionCall) { + } else { + String? response = + await apiServices.getAllSettingsNotificationOfDevices(); + if (response != "") { + final data = jsonDecode(response); + final result = data['data']; + // log("Data ${DeviceNotificationSettings.mapFromJson(jsonDecode(data)).values.toList()}"); + List list = + DeviceNotificationSettings.mapFromJson(result).values.toList(); + // log("List: $list"); + Set thingIdsInList = + list.map((device) => device.thingId!).toSet(); + for (var device in devices) { + if (!thingIdsInList.contains(device.thingId)) { + log("Device with Thing ID ${device.thingId} is not in the notification settings list."); + await apiServices.setupDeviceNotification( + device.thingId!, device.name!); + } else { + log("All devives are in the notification settings list."); + } + } + } else { + log("apiServices: getAllSettingsNotificationofDevices error!"); + } + } + isFunctionCall = true; + } + + void clearAllDeviceStatusAlias() { + allDevicesAlias.clear(); + homeBloc.sinkAllDevicesAlias.add(allDevicesAlias); + onlineDevicesAlias.clear(); + homeBloc.sinkOnlineDevicesAlias.add(onlineDevicesAlias); + offlineDevicesAlias.clear(); + homeBloc.sinkOfflineDevicesAlias.add(offlineDevicesAlias); + warningDevicesAlias.clear(); + homeBloc.sinkWarningDevicesAlias.add(warningDevicesAlias); + notUseDevicesAlias.clear(); + homeBloc.sinkNotUseDevicesAlias.add(notUseDevicesAlias); + allDevicesAliasJoined.clear(); + homeBloc.sinkAllDevicesAliasJoined.add(allDevicesAliasJoined); + onlineDevicesAliasJoined.clear(); + homeBloc.sinkOnlineDevicesAliasJoined.add(onlineDevicesAliasJoined); + offlineDevicesAliasJoined.clear(); + homeBloc.sinkOfflineDevicesAliasJoined.add(offlineDevicesAliasJoined); + warningDevicesAliasJoined.clear(); + homeBloc.sinkWarningDevicesAliasJoined.add(warningDevicesAliasJoined); + notUseDevicesAliasJoined.clear(); + homeBloc.sinkNotUseDevicesAliasJoined.add(notUseDevicesAliasJoined); + } +} diff --git a/lib/feature/home/shared/alert_card.dart b/lib/feature/home/shared/alert_card.dart new file mode 100644 index 0000000..f4f7cbf --- /dev/null +++ b/lib/feature/home/shared/alert_card.dart @@ -0,0 +1,130 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import '../../../product/constant/image/image_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/utils/device_utils.dart'; + +import '../../../product/constant/icon/icon_constants.dart'; + +Future notificationCard( + BuildContext context, + String notiticationType, + String notificationTitle, + String notificationDevicename, + String notificationLocation) async { + String location = await DeviceUtils.instance + .getFullDeviceLocation(context, notificationLocation); + String path = ""; + DateTime time = DateTime.now(); + if (notiticationType == "lowBattery") { + path = ImageConstants.instance.getImage("low_battery"); + } + return Card( + child: Padding( + padding: context.paddingLow, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + child: Text( + notificationTitle, + style: const TextStyle( + letterSpacing: 1, + fontWeight: FontWeight.bold, + color: Color.fromARGB(255, 250, 84, 34), + fontSize: 18, + ), + ), + ), + SizedBox(height: context.lowValue), + SizedBox( + child: Text( + "${appLocalization(context).device_title} $notificationDevicename", + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ), + ], + ), + SizedBox( + height: context.dynamicWidth(0.15), + width: context.dynamicWidth(0.15), + child: Image.asset(path), + ), + ], + ), + SizedBox(height: context.lowValue), + Row( + children: [ + IconConstants.instance + .getMaterialIcon(Icons.location_on_outlined), + SizedBox( + width: context.lowValue, + ), + Expanded( + child: Text( + location, + style: const TextStyle(fontSize: 15), + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ), + ], + ), + SizedBox(height: context.lowValue), + Row( + children: [ + IconConstants.instance.getMaterialIcon(Icons.schedule), + SizedBox( + width: context.lowValue, + ), + Expanded( + child: Text( + time.toString(), + style: const TextStyle(fontSize: 15), + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ), + ], + ), + Align( + alignment: Alignment.centerRight, + child: OutlinedButton( + style: const ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.blueAccent)), + onPressed: () {}, + child: Text( + appLocalization(context).detail_message, + style: const TextStyle( + color: Colors.white, + ), + ), + ), + ), + ], + ), + ), + ); +} diff --git a/lib/feature/home/shared/overview_card.dart b/lib/feature/home/shared/overview_card.dart new file mode 100644 index 0000000..dfa68ad --- /dev/null +++ b/lib/feature/home/shared/overview_card.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:sfm_app/feature/home/shared/status_card.dart'; +import 'package:sfm_app/product/extention/context_extention.dart'; +import 'package:sfm_app/product/services/language_services.dart'; + +class OverviewCard extends StatelessWidget { + final bool isOwner; + final int total; + final int active; + final int inactive; + final int warning; + final int unused; + + const OverviewCard( + {super.key, + required this.isOwner, + required this.total, + required this.active, + required this.inactive, + required this.warning, + required this.unused}); + + @override + Widget build(BuildContext context) { + return Card( + margin: context.paddingLow, + elevation: 8, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)), + child: Padding( + padding: context.paddingNormal, + child: Column( + children: [ + Text( + isOwner + ? appLocalization(context).overview_message + : appLocalization(context).interfamily_page_name, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: context.normalValue), + Column( + children: [ + StatusCard( + label: appLocalization(context).total_nof_devices_message, + count: total, + color: Colors.blue, + ), + StatusCard( + label: appLocalization(context).active_devices_message, + count: active, + color: Colors.green, + ), + StatusCard( + label: appLocalization(context).inactive_devices_message, + count: inactive, + color: Colors.grey, + ), + StatusCard( + label: appLocalization(context).warning_devices_message, + count: warning, + color: Colors.orange, + ), + StatusCard( + label: appLocalization(context).unused_devices_message, + count: unused, + color: Colors.yellow, + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/feature/home/shared/status_card.dart b/lib/feature/home/shared/status_card.dart new file mode 100644 index 0000000..54ab04e --- /dev/null +++ b/lib/feature/home/shared/status_card.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +class StatusCard extends StatelessWidget { + final String label; + final int count; + final Color color; + + const StatusCard( + {super.key, + required this.label, + required this.count, + required this.color}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: color.withOpacity(0.2), + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: color, + width: 1, + ), + ), + padding: const EdgeInsets.all(15), + margin: const EdgeInsets.symmetric(vertical: 5), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(label, style: const TextStyle(fontSize: 18)), + Text( + count.toString(), + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ); + } +} diff --git a/lib/feature/home/shared/warning_card.dart b/lib/feature/home/shared/warning_card.dart new file mode 100644 index 0000000..4fff4ae --- /dev/null +++ b/lib/feature/home/shared/warning_card.dart @@ -0,0 +1,248 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:maps_launcher/maps_launcher.dart'; +import '../device_alias_model.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/constant/image/image_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/api_services.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/utils/device_utils.dart'; +import '../../../product/shared/shared_snack_bar.dart'; + +Future warningCard( + BuildContext context, APIServices apiServices, DeviceWithAlias item) async { + Color backgroundColor = Colors.blue; + Color textColor = Colors.white; + String message = ""; + String fullLocation = + await DeviceUtils.instance.getFullDeviceLocation(context, item.areaPath!); + String time = ""; + for (var sensor in item.status!.sensors!) { + if (sensor.name! == "11") { + DateTime dateTime = + DateTime.fromMillisecondsSinceEpoch((sensor.time!) * 1000); + time = DateFormat('yyyy-MM-dd HH:mm:ss').format(dateTime); + } + } + if (item.state! == 3) { + backgroundColor = Colors.grey; + textColor = Colors.black; + message = appLocalization(context).in_progress_message; + } else if (item.state! == 2) { + backgroundColor = const Color.fromARGB(255, 6, 138, 72); + textColor = const Color.fromARGB(255, 255, 255, 255); + message = appLocalization(context).gf_in_firefighting_message; + } else if (item.state! == 1) { + backgroundColor = const Color.fromARGB(255, 250, 63, 63); + textColor = Colors.white; + message = appLocalization(context).button_fake_fire_message; + } else { + backgroundColor = Colors.black; + textColor = Colors.white; + message = appLocalization(context).disconnect_message_uppercase; + } + return Card( + // color: Color.fromARGB(255, 208, 212, 217), + child: Padding( + padding: context.paddingLow, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + child: Text( + appLocalization(context).smoke_detecting_message, + style: const TextStyle( + letterSpacing: 1, + fontWeight: FontWeight.bold, + color: Colors.red, + fontSize: 18, + ), + ), + ), + SizedBox(height: context.lowValue), + SizedBox( + child: Text( + "${appLocalization(context).device_title}: ${item.name}", + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ), + ], + ), + SizedBox( + height: context.dynamicWidth(0.15), + width: context.dynamicWidth(0.15), + child: Image.asset( + ImageConstants.instance.getImage("fire_warning")), + ) + ], + ), + SizedBox(height: context.lowValue), + Row( + children: [ + IconConstants.instance + .getMaterialIcon(Icons.location_on_outlined), + SizedBox( + width: context.lowValue, + ), + Expanded( + child: Text( + fullLocation, + style: const TextStyle(fontSize: 15), + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ), + ], + ), + SizedBox(height: context.lowValue), + Row( + children: [ + IconConstants.instance.getMaterialIcon(Icons.schedule), + SizedBox( + width: context.lowValue, + ), + Expanded( + child: Text( + time, + style: const TextStyle(fontSize: 15), + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ), + ], + ), + SizedBox( + height: context.lowValue, + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IconButton.outlined( + onPressed: () async => {}, + // displayListOfFireStationPhoneNumbers(testDevice), + icon: IconConstants.instance.getMaterialIcon(Icons.call), + iconSize: 25, + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.blue[300]!), + ), + ), + const SizedBox(width: 10), + IconButton.outlined( + onPressed: () async { + String markerLabel = "Destination"; + MapsLauncher.launchCoordinates( + double.parse(item.settings!.latitude!), + double.parse(item.settings!.longitude!), + markerLabel); + }, + icon: const Icon(Icons.directions), + iconSize: 25, + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.blue[300]!), + ), + ), + SizedBox(width: context.mediumValue), + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: OutlinedButton( + style: ButtonStyle( + backgroundColor: + MaterialStatePropertyAll(backgroundColor)), + onPressed: () async { + if (message == + appLocalization(context).button_fake_fire_message) { + await showDialog( + context: context, + builder: (context) => AlertDialog( + icon: const Icon(Icons.warning), + iconColor: Colors.red, + title: Text(appLocalization(context) + .confirm_fake_fire_message), + content: Text(appLocalization(context) + .confirm_fake_fire_body), + actions: [ + TextButton( + onPressed: () async { + int statusCode = await apiServices + .confirmFakeFireByUser(item.thingId!); + if (statusCode == 200) { + showNoIconTopSnackBar( + context, + appLocalization(context) + .notification_confirm_fake_fire_success, + Colors.green, + Colors.white); + } else { + showNoIconTopSnackBar( + context, + appLocalization(context) + .notification_confirm_fake_fire_failed, + Colors.red, + Colors.red); + } + Navigator.of(context).pop(); + }, + child: Text( + appLocalization(context) + .confirm_fake_fire_sure_message, + style: const TextStyle(color: Colors.red)), + ), + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(appLocalization(context) + .cancel_button_content), + ), + ], + ), + ); + } else { + showNoIconTopSnackBar( + context, + appLocalization(context).let_PCCC_handle_message, + Colors.orange, + Colors.white); + } + }, + child: Text( + message, + style: TextStyle(color: textColor), + ), + ), + ), + ), + ], + ), + ], + ), + ), + ); +} diff --git a/lib/feature/inter_family/group_detail/add_device_to_group_dialog.dart b/lib/feature/inter_family/group_detail/add_device_to_group_dialog.dart new file mode 100644 index 0000000..75ced8d --- /dev/null +++ b/lib/feature/inter_family/group_detail/add_device_to_group_dialog.dart @@ -0,0 +1,134 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; +import 'group_detail_bloc.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/services/language_services.dart'; + +import '../../devices/device_model.dart'; +import 'group_detail_model.dart'; + +addDeviceDialog(BuildContext context, DetailGroupBloc detailGroupBloc, + String groupID, List devices) async { + List ownerDevices = await detailGroupBloc.getOwnerDevices(); + List selectedItems = []; + List selectedDevices = []; + if (devices.isNotEmpty) { + ownerDevices.removeWhere((element) => + devices.any((device) => device.thingId == element.thingId)); + } + showDialog( + context: context, + builder: (dialogContext) { + return AlertDialog( + title: Center(child: Text(appLocalization(context).add_device_title)), + content: DropdownButtonFormField2( + isExpanded: true, + decoration: InputDecoration( + contentPadding: const EdgeInsets.symmetric(vertical: 10), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(15), + ), + ), + hint: Text( + appLocalization(context).choose_device_dropdownButton, + style: const TextStyle(fontSize: 14), + ), + items: ownerDevices + .map((item) => DropdownMenuItem( + value: item.thingId, + child: StatefulBuilder(builder: (context, menuSetState) { + final isSelected = selectedItems.contains(item.thingId); + final isNameSelected = selectedItems.contains(item.name); + + return InkWell( + onTap: () { + isSelected + ? selectedItems.remove(item.thingId) + : selectedItems.add(item.thingId!); + isNameSelected + ? selectedDevices.remove(item.name) + : selectedDevices.add(item.name!); + menuSetState(() {}); + }, + child: SizedBox( + height: double.infinity, + child: Row( + children: [ + if (isSelected) + const Icon(Icons.check_box_outlined) + else + const Icon(Icons.check_box_outline_blank), + const SizedBox(width: 10), + Expanded( + child: Text( + item.name!, + style: const TextStyle(fontSize: 14), + )) + ], + ), + ), + ); + }))) + .toList(), + buttonStyleData: const ButtonStyleData( + padding: EdgeInsets.only(right: 8), + ), + onChanged: (value) { + // thingID = value!; + // setState(() {}); + }, + onSaved: (value) {}, + selectedItemBuilder: (context) { + return selectedDevices.map( + (item) { + return Container( + alignment: AlignmentDirectional.center, + child: Text( + item, + style: const TextStyle( + fontSize: 14, + overflow: TextOverflow.ellipsis, + ), + maxLines: 1, + ), + ); + }, + ).toList(); + }, + iconStyleData: IconStyleData( + icon: IconConstants.instance + .getMaterialIcon(Icons.arrow_drop_down)), + dropdownStyleData: DropdownStyleData( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + ), + ), + menuItemStyleData: const MenuItemStyleData( + padding: EdgeInsets.symmetric(horizontal: 16), + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(dialogContext).pop(); + }, + child: Text( + appLocalization(context).cancel_button_content, + style: const TextStyle(color: Colors.red), + ), + ), + TextButton( + onPressed: () async { + for (var device in selectedItems) { + await detailGroupBloc.addDeviceToGroup( + context, groupID, device); + await detailGroupBloc.getGroupDetail(groupID); + } + }, + child: Text(appLocalization(context).add_device_title)) + ], + ); + }); +} diff --git a/lib/feature/inter_family/group_detail/group_detail_bloc.dart b/lib/feature/inter_family/group_detail/group_detail_bloc.dart new file mode 100644 index 0000000..9442a43 --- /dev/null +++ b/lib/feature/inter_family/group_detail/group_detail_bloc.dart @@ -0,0 +1,118 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/widgets.dart'; +import '../../devices/device_model.dart'; +import '../../../product/base/bloc/base_bloc.dart'; +import '../../../product/services/api_services.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/utils/response_status_utils.dart'; + +import 'group_detail_model.dart'; + +class DetailGroupBloc extends BlocBase { + APIServices apiServices = APIServices(); + final detailGroup = StreamController.broadcast(); + StreamSink get sinkDetailGroup => detailGroup.sink; + Stream get streamDetailGroup => detailGroup.stream; + + final warningDevice = StreamController>.broadcast(); + StreamSink> get sinkWarningDevice => warningDevice.sink; + Stream> get streamWarningDevice => warningDevice.stream; + + final message = StreamController.broadcast(); + StreamSink get sinkMessage => message.sink; + Stream get streamMessage => message.stream; + + @override + void dispose() {} + + Future getGroupDetail(String groupID) async { + final body = await apiServices.getGroupDetail(groupID); + final data = jsonDecode(body); + List warningDevices = []; + if (data != null) { + GroupDetail group = GroupDetail.fromJson(data); + sinkDetailGroup.add(group); + if (group.devices != null) { + for (var device in group.devices!) { + if (device.state == 1) { + warningDevices.add(device); + } + } + sinkWarningDevice.add(warningDevices); + } + } + } + + Future approveUserToGroup(BuildContext context, String groupID, + String userID, String userName) async { + Map body = {"group_id": groupID, "user_id": userID}; + int statusCode = await apiServices.approveGroup(body); + showSnackBarResponseByStatusCode(context, statusCode, + "Đã duyệt $userName vào nhóm!", "Duyệt $userName thất bại!"); + } + + Future deleteOrUnapproveUser(BuildContext context, String groupID, + String userID, String userName) async { + int statusCode = await apiServices.deleteUserInGroup(groupID, userID); + showSnackBarResponseByStatusCode(context, statusCode, + "Đã xóa người dùng $userName", "Xóa người dùng $userName thất bại"); + } + + Future deleteDevice(BuildContext context, String groupID, + String thingID, String deviceName) async { + int statusCode = await apiServices.deleteDeviceInGroup(groupID, thingID); + showSnackBarResponseByStatusCode(context, statusCode, + "Đã xóa thiết bị $deviceName", "Xóa thiết bị $deviceName thất bại"); + } + + Future leaveGroup( + BuildContext context, String groupID, String userID) async { + int statusCode = await apiServices.deleteUserInGroup(groupID, userID); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_leave_group_success, + appLocalization(context).notification_leave_group_failed); + } + + Future updateDeviceNameInGroup( + BuildContext context, String thingID, String newAlias) async { + Map body = {"thing_id": thingID, "alias": newAlias}; + int statusCode = await apiServices.updateDeviceAlias(body); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_update_device_success, + appLocalization(context).notification_update_device_failed, + ); + } + + Future> getOwnerDevices() async { + List allDevices = []; + String body = await apiServices.getOwnerDevices(); + if (body != "") { + final data = jsonDecode(body); + List items = data['items']; + allDevices = Device.fromJsonDynamicList(items); + } + return allDevices; + } + + Future addDeviceToGroup( + BuildContext context, String groupID, String thingID) async { + Map body = { + "thing_id": thingID, + }; + int statusCode = await apiServices.addDeviceToGroup(groupID, body); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_add_device_success, + appLocalization(context).notification_add_device_failed, + ); + } +} diff --git a/lib/feature/inter_family/group_detail/group_detail_model.dart b/lib/feature/inter_family/group_detail/group_detail_model.dart new file mode 100644 index 0000000..247f3eb --- /dev/null +++ b/lib/feature/inter_family/group_detail/group_detail_model.dart @@ -0,0 +1,133 @@ +class GroupDetail { + String? id; + String? type; + String? name; + String? description; + String? ownerId; + String? status; + String? visibility; + DateTime? createdAt; + DateTime? updatedAt; + List? users; + List? devices; + + GroupDetail({ + required this.id, + this.type, + this.name, + this.description, + this.ownerId, + this.status, + this.visibility, + this.createdAt, + this.updatedAt, + this.users, + this.devices, + }); + + GroupDetail.fromJson(Map json) { + id = json["id"]; + type = json["type"]; + name = json["name"]; + description = json["description"]; + ownerId = json["ownerId"]; + status = json["status"]; + visibility = json["visibility"]; + createdAt = DateTime.parse(json["created_at"]); + updatedAt = DateTime.parse(json['updated_at']); + if (json['users'] != null) { + users = []; + json["users"].forEach((v) { + final user = GroupUser.fromJson(v); + users!.add(user); + }); + } + if (json['devices'] != null) { + devices = []; + json["devices"].forEach((v) { + final device = DeviceOfGroup.fromJson(v); + devices!.add(device); + }); + } + } + + // static List fromJsonDynamicList(List list) { + // return list.map((e) => GroupDetail.fromJson(e)).toList(); + // } +} + +class GroupUser { + String? id; + String? username; + String? role; + String? name; + String? email; + String? phone; + bool? isOwner; + String? status; + String? address; + String? latitude; + String? longitude; + + GroupUser({ + required this.id, + this.username, + this.role, + this.name, + this.email, + this.phone, + this.isOwner, + this.status, + this.address, + this.latitude, + this.longitude, + }); + + GroupUser.fromJson(Map json) { + id = json["id"]; + username = json["username"]; + role = json["role"]; + name = json["name"]; + email = json['email']; + phone = json['phone']; + isOwner = json['is_owner']; + status = json['status']; + address = json['address']; + latitude = json['latitude']; + longitude = json['longitude']; + } + + static List fromJsonList(List list) { + return list.map((e) => GroupUser.fromJson(e)).toList(); + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => GroupUser.fromJson(e)).toList(); + } +} + +class DeviceOfGroup { + String? thingId; + String? name; + String? alias; + DateTime? connectionTime; + int? state; + String? visibility; + + DeviceOfGroup({ + required this.thingId, + this.name, + this.alias, + this.connectionTime, + this.state, + this.visibility, + }); + DeviceOfGroup.fromJson(Map json) { + thingId = json['thing_id']; + name = json['name']; + alias = json['alias']; + connectionTime = DateTime.parse(json['connection_time']); + state = json['state']; + visibility = json['visibility']; + } +} diff --git a/lib/feature/inter_family/group_detail/group_detail_screen.dart b/lib/feature/inter_family/group_detail/group_detail_screen.dart new file mode 100644 index 0000000..4e48749 --- /dev/null +++ b/lib/feature/inter_family/group_detail/group_detail_screen.dart @@ -0,0 +1,552 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import 'group_detail_bloc.dart'; +import 'group_detail_model.dart'; +import '../../../product/base/bloc/base_bloc.dart'; +import '../../../product/constant/app/app_constants.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/api_services.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/utils/device_utils.dart'; +import '../../../product/utils/response_status_utils.dart'; + +import 'add_device_to_group_dialog.dart'; + +class DetailGroupScreen extends StatefulWidget { + const DetailGroupScreen({super.key, required this.group, required this.role}); + final String group; + final String role; + @override + State createState() => _DetailGroupScreenState(); +} + +class _DetailGroupScreenState extends State { + late DetailGroupBloc detailGroupBloc; + final scaffoldKey = GlobalKey(); + @override + void initState() { + super.initState(); + detailGroupBloc = BlocProvider.of(context); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: detailGroupBloc.streamDetailGroup, + builder: (context, detailGroupSnapshot) { + if (detailGroupSnapshot.data?.id == null) { + detailGroupBloc.getGroupDetail(widget.group); + return const Center( + child: CircularProgressIndicator(), + ); + } else { + return Scaffold( + key: scaffoldKey, + appBar: AppBar( + title: Center( + child: Text( + detailGroupSnapshot.data?.name ?? + appLocalization(context).loading_message, + ), + ), + actions: [ + IconButton( + onPressed: () { + if (scaffoldKey.currentState != null) { + scaffoldKey.currentState?.openEndDrawer(); + } else { + // log("_scaffoldKey.currentState is null"); + } + }, + icon: const Icon(Icons.info_outline_rounded), + ), + ], + ), + endDrawer: endDrawer(detailGroupSnapshot.data!), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + addDeviceDialog(context, detailGroupBloc, widget.group, + detailGroupSnapshot.data?.devices ?? []); + }, + icon: const Icon(Icons.add), + // backgroundColor: const Color.fromARGB(255, 109, 244, 96), + label: Text(appLocalization(context).add_device_title), + ), + body: SafeArea( + child: groupBody( + detailGroupSnapshot.data?.devices ?? [], + ), + ), + ); + } + }); + } + + Widget endDrawer(GroupDetail groupDetail) { + APIServices apiServices = APIServices(); + return Drawer( + width: context.dynamicWidth(0.75), + child: ListView( + children: [ + Center( + child: Text(groupDetail.name ?? "", + style: Theme.of(context).textTheme.titleLarge)), + Center( + child: Text(groupDetail.description ?? "", + style: Theme.of(context).textTheme.bodyMedium)), + Visibility( + visible: widget.role == "owner", + child: Theme( + data: + Theme.of(context).copyWith(dividerColor: Colors.transparent), + child: ExpansionTile( + title: Text( + "${appLocalization(context).approve_user} (${getNumberInGroup(groupDetail, "PENDING")})", + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + if (groupDetail.users != null && + groupDetail.users!.isNotEmpty) + for (var user in groupDetail.users!) + if (user.status == "PENDING") + ListTile( + title: Text(user.name!), + subtitle: Text(user.email!), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: 48, + child: IconButton( + onPressed: () async { + await detailGroupBloc.approveUserToGroup( + context, + widget.group, + user.id!, + user.name!); + detailGroupBloc + .getGroupDetail(widget.group); + }, + icon: const Icon( + Icons.check, + color: Colors.green, + ), + ), + ), + SizedBox( + width: 48, + child: IconButton( + onPressed: () async { + await detailGroupBloc.deleteOrUnapproveUser( + context, + widget.group, + user.id!, + user.name!); + await detailGroupBloc + .getGroupDetail(widget.group); + }, + icon: const Icon( + Icons.close, + color: Colors.red, + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + Theme( + data: Theme.of(context).copyWith(dividerColor: Colors.transparent), + child: ExpansionTile( + title: Text( + "${appLocalization(context).member_title} (${getNumberInGroup(groupDetail, "JOINED")})", + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + if (groupDetail.users != null && groupDetail.users!.isNotEmpty) + for (var user in groupDetail.users!) + if (user.status == "JOINED") + ListTile( + title: Text(user.name ?? 'Error'), + subtitle: Text(user.email ?? 'Error'), + trailing: widget.role == "owner" + ? PopupMenuButton( + icon: IconConstants.instance + .getMaterialIcon(Icons.more_horiz), + itemBuilder: (contex) => [ + PopupMenuItem( + value: 1, + child: Text(appLocalization(context) + .change_button_content)), + PopupMenuItem( + onTap: () async { + await detailGroupBloc + .deleteOrUnapproveUser( + context, + widget.group, + user.id!, + user.name!); + await detailGroupBloc + .getGroupDetail(widget.group); + }, + value: 2, + child: Text(appLocalization(context) + .delete_button_content)), + ], + ) + : null, + ), + ], + ), + ), + Theme( + data: Theme.of(context).copyWith(dividerColor: Colors.transparent), + child: ExpansionTile( + title: Text( + "${appLocalization(context).devices_title} (${getNumberInGroup(groupDetail, "DEVICES")})", + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + if (groupDetail.devices != null && + groupDetail.devices!.isNotEmpty) + for (var device in groupDetail.devices!) + if (device.visibility == "PUBLIC") + ListTile( + title: Text( + device.alias != "" ? device.alias! : device.name!), + // subtitle: Text(device.thingId ?? 'Error'), + trailing: widget.role == + ApplicationConstants.OWNER_GROUP + ? PopupMenuButton( + icon: IconConstants.instance + .getMaterialIcon(Icons.more_horiz), + itemBuilder: (contex) => [ + PopupMenuItem( + onTap: () { + Navigator.pop(context); + showChangeAlias(device); + }, + value: 1, + child: Text(appLocalization(context) + .change_button_content)), + PopupMenuItem( + onTap: () async { + await detailGroupBloc.deleteDevice( + context, + widget.group, + device.thingId!, + device.name!, + ); + }, + value: 2, + child: Text( + appLocalization(context) + .delete_button_content, + ), + ), + ], + ) + : PopupMenuButton( + icon: IconConstants.instance.getMaterialIcon( + Icons.more_horiz, + ), + itemBuilder: ((itemContext) => [ + PopupMenuItem( + onTap: () async { + Navigator.pop(itemContext); + Future.delayed( + context.normalDuration, + () => showChangeAlias(device), + ); + }, + value: 1, + child: Text( + appLocalization(context) + .change_button_content, + ), + ), + ]), + ), + ), + ], + ), + ), + SizedBox(height: context.dynamicHeight(0.3)), + if (widget.role == "owner") + TextButton( + onPressed: () { + Future.delayed(context.normalDuration) + .then((value) => Navigator.pop(context)) + .then( + (value) => { + showDialog( + context: context, + builder: (dialogContext) { + return AlertDialog( + title: Center( + child: Text(appLocalization(context) + .delete_group_title)), + content: Text( + appLocalization(context) + .delete_device_dialog_content, + ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(dialogContext).pop(); + }, + child: Text( + appLocalization(context) + .cancel_button_content, + ), + ), + TextButton( + onPressed: () async { + Navigator.of(dialogContext).pop(); + Future.delayed(context.lowDuration).then( + (value) => Navigator.pop(context), + ); + int statusCode = await apiServices + .deleteGroup(widget.group); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context) + .notification_delete_group_success, + appLocalization(context) + .notification_delete_group_failed); + }, + child: Text( + appLocalization(context) + .confirm_button_content, + style: const TextStyle(color: Colors.red), + ), + ), + ], + ); + }, + ), + }, + ); + }, + style: const ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.red), + foregroundColor: MaterialStatePropertyAll(Colors.white), + ), + child: Text( + appLocalization(context).delete_group_title, + ), + ) + else + TextButton( + onPressed: () async { + String uid = await apiServices.getUID(); + Future.delayed(context.lowDuration) + .then((value) => Navigator.pop(context)) + .then((value) => { + showDialog( + context: context, + builder: (dialogContext) { + return AlertDialog( + title: Center( + child: Text( + appLocalization(context) + .leave_group_title, + ), + ), + content: Text(appLocalization(context) + .leave_group_content), + actions: [ + TextButton( + onPressed: () { + Navigator.of(dialogContext).pop(); + }, + child: Text( + appLocalization(context) + .cancel_button_content, + ), + ), + TextButton( + onPressed: () async { + Navigator.of(dialogContext).pop(); + Future.delayed(context.normalDuration) + .then((value) => + Navigator.pop(context)); + await detailGroupBloc.leaveGroup( + context, widget.group, uid); + }, + child: Text( + appLocalization(context) + .confirm_button_content, + style: const TextStyle(color: Colors.red), + )) + ], + ); + }) + }); + }, + style: const ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.red), + foregroundColor: MaterialStatePropertyAll(Colors.white), + ), + child: Text( + appLocalization(context).leave_group_title, + ), + ), + ], + ), + ); + } + + Widget groupBody(List devices) { + devices = softDeviceByState(devices); + List deviceState = []; + if (devices.isNotEmpty) { + for (var device in devices) { + String state = + DeviceUtils.instance.checkStateDevice(context, device.state!); + deviceState.add(state); + } + } + + return Expanded( + child: Center( + child: devices.isEmpty + ? Center( + child: Text(appLocalization(context).dont_have_device), + ) + : StreamBuilder>( + stream: detailGroupBloc.streamWarningDevice, + builder: (context, warningDeviceSnapshot) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "${appLocalization(context).warning_message} ${warningDeviceSnapshot.data?.length ?? '0'}", + style: const TextStyle( + color: Colors.red, + ), + ), + Expanded( + child: ListView.builder( + itemCount: devices.length, + itemBuilder: (BuildContext context, int index) { + return ListTile( + title: Text(devices[index].alias != "" + ? devices[index].alias! + : devices[index].name!,), + trailing: Text( + DeviceUtils.instance.checkStateDevice( + context, devices[index].state!), + style: TextStyle( + color: DeviceUtils.instance + .getTableRowColor( + devices[index].state!,),), + ), + ); + }, + ), + ), + ], + ); + },), + ), + ); + } + + showChangeAlias(DeviceOfGroup device) async { + TextEditingController aliasController = + TextEditingController(text: device.alias); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.white, + dismissDirection: DismissDirection.none, + duration: const Duration(minutes: 1), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('${appLocalization(context).map_result}: ', + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black)), + Container( + alignment: Alignment.centerRight, + child: IconButton( + onPressed: () async { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + }, + icon: const Icon(Icons.close)), + ) + ], + ), + TextField( + controller: aliasController, + decoration: InputDecoration( + label: + Text(appLocalization(context).input_name_device_device), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(16.0)))), + ), + const SizedBox(height: 5), + Center( + child: TextButton( + style: const ButtonStyle( + foregroundColor: MaterialStatePropertyAll(Colors.white), + backgroundColor: MaterialStatePropertyAll(Colors.green)), + onPressed: () async { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + String alias = aliasController.text; + await detailGroupBloc.updateDeviceNameInGroup( + context, device.thingId!, alias); + await detailGroupBloc.getGroupDetail(widget.group); + }, + child: Text(appLocalization(context).confirm_button_content)), + ) + ], + ), + ), + ); + } +} + +List softDeviceByState(List devices) { + List sortedDevices = List.from(devices); + sortedDevices.sort((a, b) { + int stateOrder = [2, 1, 3, 0, -1, 3].indexOf(a.state!) - + [2, 1, 3, 0, -1, 3].indexOf(b.state!); + return stateOrder; + }); + + return sortedDevices; +} + +int getNumberInGroup(GroupDetail group, String name) { + int number = 0; + + if (group.id != "") { + if (name == "PENDING" || name == "JOINED") { + for (var user in group.users ?? []) { + if (user.status == name) { + number++; + } + } + } else { + for (var device in group.devices ?? []) { + if (device.visibility == "PUBLIC") { + number++; + } + } + } + } + + return number; +} diff --git a/lib/feature/inter_family/groups/groups_model.dart b/lib/feature/inter_family/groups/groups_model.dart new file mode 100644 index 0000000..f79b473 --- /dev/null +++ b/lib/feature/inter_family/groups/groups_model.dart @@ -0,0 +1,46 @@ +class Group { + String? id; + String? type; + String? name; + String? ownerId; + String? status; + String? visibility; + DateTime? createdAt; + DateTime? updatedAt; + bool? isOwner; + String? description; + + Group({ + required this.id, + this.type, + this.name, + this.ownerId, + this.status, + this.visibility, + this.createdAt, + this.updatedAt, + this.isOwner, + this.description, + }); + + Group.fromJson(Map json) { + id = json["id"]; + type = json["type"]; + name = json["name"]; + ownerId = json["owner_id"]; + status = json["status"]; + visibility = json["visibility"]; + createdAt = DateTime.parse(json["created_at"]); + updatedAt = DateTime.parse(json["updated_at"]); + isOwner = json["is_owner"]; + description = json["description"]; + } + + static List fromJsonList(List list) { + return list.map((e) => Group.fromJson(e)).toList(); + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => Group.fromJson(e)).toList(); + } +} diff --git a/lib/feature/inter_family/groups/groups_screen.dart b/lib/feature/inter_family/groups/groups_screen.dart new file mode 100644 index 0000000..fbffa89 --- /dev/null +++ b/lib/feature/inter_family/groups/groups_screen.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../product/constant/enums/app_route_enums.dart'; +import 'groups_model.dart'; +import '../inter_family_bloc.dart'; +import '../inter_family_widget.dart'; +import '../../../product/base/bloc/base_bloc.dart'; +import '../../../product/constant/app/app_constants.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/language_services.dart'; + +import 'groups_widget.dart'; + +class GroupsScreen extends StatefulWidget { + const GroupsScreen({super.key, required this.role}); + final String role; + @override + State createState() => _GroupsScreenState(); +} + +class _GroupsScreenState extends State { + late InterFamilyBloc interFamilyBloc; + + @override + void initState() { + super.initState(); + interFamilyBloc = BlocProvider.of(context); + // interFamilyBloc.getAllGroup(widget.role); + } + + @override + Widget build(BuildContext context) { + if (widget.role == ApplicationConstants.OWNER_GROUP || + widget.role == ApplicationConstants.PARTICIPANT_GROUP) { + interFamilyBloc.getAllGroup(widget.role); + return StreamBuilder>( + stream: interFamilyBloc.streamCurrentGroups, + builder: (context, groupsSnapshot) { + return Scaffold( + body: groupsSnapshot.data?.isEmpty ?? true + ? const Center( + child: CircularProgressIndicator(), + ) + : ListView.builder( + itemCount: groupsSnapshot.data!.length, + itemBuilder: (context, index) { + return ListTile( + onTap: () { + context.pushNamed(AppRoutes.GROUP_DETAIL.name, + pathParameters: { + "groupId": groupsSnapshot.data![index].id! + }, + extra: widget.role); + }, + leading: IconConstants.instance + .getMaterialIcon(Icons.diversity_2), + title: Text( + groupsSnapshot.data![index].name ?? '', + style: const TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text( + groupsSnapshot.data![index].description ?? ""), + trailing: + widget.role == ApplicationConstants.OWNER_GROUP + ? PopupMenuButton( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8.0), + bottomRight: Radius.circular(8.0), + topLeft: Radius.circular(8.0), + topRight: Radius.circular(8.0), + ), + ), + itemBuilder: (ctx) => [ + _buildPopupMenuItem( + groupsSnapshot.data![index], + context, + appLocalization(context) + .share_group_title, + Icons.share, + 4), + _buildPopupMenuItem( + groupsSnapshot.data![index], + context, + appLocalization(context) + .change_group_infomation_title, + Icons.settings_backup_restore, + 2), + _buildPopupMenuItem( + groupsSnapshot.data![index], + context, + appLocalization(context) + .delete_group_title, + Icons.delete_forever_rounded, + 3), + ], + icon: const Icon(Icons.more_horiz), + ) + : const SizedBox.shrink(), + ); + }, + ), + ); + }); + } else { + return const SizedBox.shrink(); + } + } + + PopupMenuItem _buildPopupMenuItem(Group group, BuildContext context, + String title, IconData iconData, int position) { + return PopupMenuItem( + onTap: () { + if (title == appLocalization(context).share_group_title) { + Future.delayed(context.lowDuration, () { + shareGroup(context, group); + }); + } else if (title == + appLocalization(context).change_group_infomation_title) { + Future.delayed(context.lowDuration, () { + createOrJoinGroupDialog( + context, + interFamilyBloc, + widget.role, + appLocalization(context).change_group_infomation_content, + appLocalization(context).group_name_title, + group.name!, + false, + group.id!, + appLocalization(context).description_group, + group.description ?? ""); + }); + } else if (title == appLocalization(context).delete_group_title) { + Future.delayed(context.lowDuration, () { + showActionDialog( + context, + widget.role, + interFamilyBloc, + appLocalization(context).delete_group_title, + appLocalization(context).delete_group_content, + group); + }); + } else {} + }, + value: position, + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon( + iconData, + color: Colors.black, + ), + const SizedBox(width: 10), + Text(title), + ], + ), + ); + } +} diff --git a/lib/feature/inter_family/groups/groups_widget.dart b/lib/feature/inter_family/groups/groups_widget.dart new file mode 100644 index 0000000..f23d70a --- /dev/null +++ b/lib/feature/inter_family/groups/groups_widget.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import '../inter_family_bloc.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/language_services.dart'; + +import 'groups_model.dart'; + +shareGroup(BuildContext context, Group group) { + showGeneralDialog( + barrierColor: Colors.black.withOpacity(0.5), + transitionBuilder: (context, a1, a2, widget) { + return Material( + child: Scaffold( + appBar: AppBar( + title: + Center(child: Text(appLocalization(context).share_group_title)), + leading: IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: IconConstants.instance.getMaterialIcon(Icons.arrow_back), + ), + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: QrImageView( + data: '${group.id}.${group.name!}', + size: 250, + ), + ), + const SizedBox(height: 10), + Text(group.name!), + const SizedBox(height: 10), + OutlinedButton( + onPressed: () {}, + child: const Text('Capture and Save as Image'), + ), + ], + ), + ), + ); + }, + transitionDuration: context.lowDuration, + barrierDismissible: true, + barrierLabel: '', + context: context, + pageBuilder: (context, animation1, animation2) { + return const SizedBox(); + }, + ); +} + +showActionDialog( + BuildContext context, + String role, + InterFamilyBloc interFamilyBloc, + String dialogTitle, + String dialogContent, + Group group) { + showDialog( + context: context, + builder: (dialogContext) { + return AlertDialog( + title: Center(child: Text(dialogTitle)), + content: Text(dialogContent), + actions: [ + TextButton( + onPressed: () { + Navigator.of(dialogContext).pop(); + }, + child: Text(appLocalization(context).cancel_button_content), + ), + TextButton( + onPressed: () async { + if (dialogTitle == appLocalization(context).delete_group_title) { + Navigator.of(dialogContext).pop(); + await interFamilyBloc.deleteGroup(context, group.id!); + interFamilyBloc.getAllGroup(role); + } else {} + }, + child: Text( + appLocalization(context).confirm_button_content, + style: const TextStyle(color: Colors.red), + ), + ), + ], + ); + }, + ); +} diff --git a/lib/feature/inter_family/inter_family_bloc.dart b/lib/feature/inter_family/inter_family_bloc.dart new file mode 100644 index 0000000..2541080 --- /dev/null +++ b/lib/feature/inter_family/inter_family_bloc.dart @@ -0,0 +1,119 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import '../../product/constant/app/app_constants.dart'; + +import '../../product/services/api_services.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/services/language_services.dart'; +import '../../product/utils/response_status_utils.dart'; +import 'groups/groups_model.dart'; + +class InterFamilyBloc extends BlocBase { + APIServices apiServices = APIServices(); + + final isLoading = StreamController.broadcast(); + StreamSink get sinkIsLoading => isLoading.sink; + Stream get streamIsLoading => isLoading.stream; + + final titleScreen = StreamController.broadcast(); + StreamSink get sinkTitleScreen => titleScreen.sink; + Stream get streamTitleScreen => titleScreen.stream; + + final selectedScreen = StreamController.broadcast(); + StreamSink get sinkSelectedScreen => selectedScreen.sink; + Stream get streamSelectedScreen => selectedScreen.stream; + + final currentGroups = StreamController>.broadcast(); + StreamSink> get sinkCurrentGroups => currentGroups.sink; + Stream> get streamCurrentGroups => currentGroups.stream; + + @override + void dispose() {} + + void getAllGroup(String role) async { + List groups = []; + sinkCurrentGroups.add(groups); + final body = await apiServices.getAllGroups(); + + if (body.isNotEmpty) { + final data = jsonDecode(body); + List items = data["items"]; + groups = Group.fromJsonDynamicList(items); + groups = sortGroupByName(groups); + + List currentGroups = groups.where( + (group) { + bool isPublic = group.visibility == "PUBLIC"; + + if (role == ApplicationConstants.OWNER_GROUP) { + return group.isOwner == true && isPublic; + } + + if (role == ApplicationConstants.PARTICIPANT_GROUP) { + return group.isOwner == null && isPublic; + } + + return false; + }, + ).toList(); + + sinkCurrentGroups.add(currentGroups); + } else { + log("Get groups from API failed"); + } + log("Inter Family Role: $role"); + } + + Future createGroup( + BuildContext context, String name, String description) async { + APIServices apiServices = APIServices(); + Map body = {"name": name, "description": description}; + int? statusCode = await apiServices.createGroup(body); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_add_group_success, + appLocalization(context).notification_add_group_failed); + } + + Future changeGroupInfomation(BuildContext context, String groupID, + String name, String description) async { + Map body = {"name": name, "description": description}; + int statusCode = await apiServices.updateGroup(body, groupID); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_update_group_success, + appLocalization(context).notification_update_group_failed); + } + + Future joinGroup(BuildContext context, String groupID) async { + Map body = { + "group_id": groupID, + }; + int statusCode = await apiServices.joinGroup(groupID, body); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_join_request_group_success, + appLocalization(context).notification_join_request_group_failed); + } + + Future deleteGroup(BuildContext context, String groupID) async { + int statusCode = await apiServices.deleteGroup(groupID); + showSnackBarResponseByStatusCode( + context, + statusCode, + appLocalization(context).notification_delete_group_success, + appLocalization(context).notification_delete_group_failed); + } + + List sortGroupByName(List groups) { + return groups..sort((a, b) => (a.name ?? '').compareTo(b.name ?? '')); + } +} diff --git a/lib/feature/inter_family/inter_family_screen.dart b/lib/feature/inter_family/inter_family_screen.dart new file mode 100644 index 0000000..c192618 --- /dev/null +++ b/lib/feature/inter_family/inter_family_screen.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; + +import 'groups/groups_screen.dart'; +import 'inter_family_bloc.dart'; +import 'inter_family_widget.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/constant/app/app_constants.dart'; +import '../../product/constant/icon/icon_constants.dart'; +import '../../product/extention/context_extention.dart'; +import '../../product/services/language_services.dart'; + +class InterFamilyScreen extends StatefulWidget { + const InterFamilyScreen({super.key}); + + @override + State createState() => _InterFamilyScreenState(); +} + +class _InterFamilyScreenState extends State { + late InterFamilyBloc interFamilyBloc; + String title = ""; + int _selectedIndex = 0; + bool isLoading = false; + @override + void initState() { + super.initState(); + interFamilyBloc = BlocProvider.of(context); + } + + final _widgetOptions = [ + BlocProvider( + blocBuilder: () => InterFamilyBloc(), + child: const GroupsScreen( + role: ApplicationConstants.OWNER_GROUP, + ), + ), + BlocProvider( + blocBuilder: () => InterFamilyBloc(), + child: const GroupsScreen( + role: ApplicationConstants.PARTICIPANT_GROUP, + ), + ), + ]; + + @override + Widget build(BuildContext context) { + checkTitle(_selectedIndex); + return StreamBuilder( + stream: interFamilyBloc.streamSelectedScreen, + initialData: _selectedIndex, + builder: (context, selectSnapshot) { + return Scaffold( + appBar: AppBar( + actions: [ + ElevatedButton( + onPressed: () { + if (selectSnapshot.data == 0) { + createOrJoinGroupDialog( + context, + interFamilyBloc, + selectSnapshot.data! == 0 + ? ApplicationConstants.OWNER_GROUP + : ApplicationConstants.PARTICIPANT_GROUP, + appLocalization(context).add_new_group, + appLocalization(context).group_name_title, + "", + false, + "", + "", + ""); + } else { + createOrJoinGroupDialog( + context, + interFamilyBloc, + selectSnapshot.data! == 0 + ? ApplicationConstants.OWNER_GROUP + : ApplicationConstants.PARTICIPANT_GROUP, + appLocalization(context).join_group, + appLocalization(context).group_id_title, + '', + true, + "", + appLocalization(context).group_name_title, + ""); + } + }, + style: ElevatedButton.styleFrom( + shape: const CircleBorder(), + ), + child: IconConstants.instance.getMaterialIcon(Icons.add), + ), + ], + leading: Builder( + builder: (context) { + return IconButton( + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + icon: const Icon(Icons.menu), + ); + }, + ), + title: StreamBuilder( + stream: interFamilyBloc.streamTitleScreen, + initialData: title, + builder: (context, titleSnapshot) { + return Center( + child: Text(titleSnapshot.data ?? title), + ); + }, + ), + ), + drawer: Drawer( + width: context.dynamicWidth(0.4), + child: ListView( + padding: EdgeInsets.zero, + children: [ + ListTile( + title: Text(appLocalization(context).my_group_title), + selected: _selectedIndex == 0, + onTap: () { + _onItemTapped(0); + title = appLocalization(context).my_group_title; + interFamilyBloc.sinkTitleScreen.add(title); + Navigator.pop(context); + }, + ), + ListTile( + title: Text(appLocalization(context).invite_group), + selected: _selectedIndex == 1, + onTap: () { + _onItemTapped(1); + title = appLocalization(context).invite_group; + interFamilyBloc.sinkTitleScreen.add(title); + Navigator.pop(context); + }, + ), + ], + ), + ), + body: _widgetOptions[selectSnapshot.data ?? _selectedIndex], + ); + }, + ); + } + + void checkTitle(int index) { + if (index == 0) { + title = appLocalization(context).my_group_title; + interFamilyBloc.sinkTitleScreen.add(title); + } else { + title = appLocalization(context).invite_group; + interFamilyBloc.sinkTitleScreen.add(title); + } + } + + void _onItemTapped(int index) { + _selectedIndex = index; + interFamilyBloc.sinkSelectedScreen.add(_selectedIndex); + isLoading = false; + interFamilyBloc.sinkIsLoading.add(isLoading); + } +} diff --git a/lib/feature/inter_family/inter_family_widget.dart b/lib/feature/inter_family/inter_family_widget.dart new file mode 100644 index 0000000..87c857e --- /dev/null +++ b/lib/feature/inter_family/inter_family_widget.dart @@ -0,0 +1,152 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import 'inter_family_bloc.dart'; +import '../../product/constant/icon/icon_constants.dart'; +import '../../product/services/language_services.dart'; +import '../../product/utils/qr_utils.dart'; + +createOrJoinGroupDialog( + BuildContext context, + InterFamilyBloc interFamilyBloc, + String role, + String titleDialogName, + String titleTextField1, + String textFieldContent1, + bool icon, + String groupID, + String titleTextField2, + String textFieldContent2) { + TextEditingController editingController = TextEditingController(); + TextEditingController readOnlycontroller = TextEditingController(); + TextEditingController descriptionController = TextEditingController(); + + if (textFieldContent1 != "") { + editingController.text = textFieldContent1; + } + if (textFieldContent2 != "") { + descriptionController.text = textFieldContent2; + } + // final byte = b + showDialog( + context: context, + builder: (dialogContext) { + return AlertDialog( + title: Center(child: Text(titleDialogName)), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + icon + ? Column( + children: [ + TextField( + controller: editingController, + textInputAction: TextInputAction.done, + decoration: InputDecoration( + suffixIcon: IconButton( + onPressed: () async { + String data = await QRScanUtils.instance + .scanQR(dialogContext); + Map items = + QRScanUtils.instance.getQRData(data); + String groupID = items['group_id']; + String groupName = items['group_name']; + editingController.text = groupID; + readOnlycontroller.text = groupName; + }, + icon: IconConstants.instance + .getMaterialIcon(Icons.qr_code_outlined)), + label: Text(titleTextField1), + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(16.0))), + ), + ), + const SizedBox(height: 10), + TextField( + readOnly: true, + controller: readOnlycontroller, + decoration: InputDecoration( + label: Text(titleTextField2), + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(16.0)))), + ), + ], + ) + : Column( + children: [ + TextField( + textInputAction: TextInputAction.next, + controller: editingController, + decoration: InputDecoration( + label: Text(titleTextField1), + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(16.0)))), + ), + const SizedBox(height: 10), + TextField( + onChanged: (value) {}, + maxLines: 3, + textInputAction: TextInputAction.done, + controller: descriptionController, + decoration: InputDecoration( + labelText: + appLocalization(context).description_group, + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(16.0)))), + ), + ], + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(dialogContext).pop(); + }, + child: Text( + appLocalization(context).cancel_button_content, + style: const TextStyle(color: Colors.red), + ), + ), + TextButton( + onPressed: () async { + if (!icon) { + String groupName = editingController.text; + String description = descriptionController.text; + if (titleDialogName == + appLocalization(context).add_new_group) { + try { + await interFamilyBloc.createGroup( + context, groupName, description); + interFamilyBloc.getAllGroup(role); + Navigator.of(dialogContext).pop(); + } catch (e) { + // log("Lỗi khi tạo nhóm: $e"); + } + } else if (titleDialogName == + appLocalization(context) + .change_group_infomation_content) { + try { + await interFamilyBloc.changeGroupInfomation( + context, groupID, groupName, description); + interFamilyBloc.getAllGroup(role); + Navigator.of(dialogContext).pop(); + } catch (e) { + // log("Lỗi khi sửa nhóm: $e"); + } + } + } else { + String groupId = editingController.text; + await interFamilyBloc.joinGroup(context, groupId); + Navigator.of(dialogContext).pop(); + } + }, + child: Text(appLocalization(context).confirm_button_content)) + ], + ); + }); +} diff --git a/lib/feature/log/device_logs_bloc.dart b/lib/feature/log/device_logs_bloc.dart new file mode 100644 index 0000000..9acf5d9 --- /dev/null +++ b/lib/feature/log/device_logs_bloc.dart @@ -0,0 +1,82 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; + +import 'package:sfm_app/feature/devices/device_model.dart'; +import 'package:sfm_app/product/base/bloc/base_bloc.dart'; +import 'package:sfm_app/product/services/api_services.dart'; +import 'package:sfm_app/product/utils/date_time_utils.dart'; + +import '../../product/utils/device_utils.dart'; +import 'device_logs_model.dart'; + +class DeviceLogsBloc extends BlocBase { + APIServices apiServices = APIServices(); + final fromDate = StreamController.broadcast(); + StreamSink get sinkFromDate => fromDate.sink; + Stream get streamFromDate => fromDate.stream; + + final hasMore = StreamController.broadcast(); + StreamSink get sinkHasMore => hasMore.sink; + Stream get streamHasMore => hasMore.stream; + + final allDevices = StreamController>.broadcast(); + StreamSink> get sinkAllDevices => allDevices.sink; + Stream> get streamAllDevices => allDevices.stream; + + final sensors = StreamController>.broadcast(); + StreamSink> get sinkSensors => sensors.sink; + Stream> get streamSensors => sensors.stream; + + @override + void dispose() {} + + void getAllDevices() async { + String body = await apiServices.getOwnerDevices(); + if (body != "") { + final data = jsonDecode(body); + List items = data['items']; + List originalDevices = Device.fromJsonDynamicList(items); + List devices = + DeviceUtils.instance.sortDeviceByState(originalDevices); + sinkAllDevices.add(devices); + } + } + + void getDeviceLogByThingID( + int offset, + String thingID, + DateTime fromDate, + List sensors, + ) async { + log("SensorLength: ${sensors.length}"); + String fromDateString = + DateTimeUtils.instance.formatDateTimeToString(fromDate); + String now = DateTimeUtils.instance.formatDateTimeToString(DateTime.now()); + // List sensors = []; + Map params = { + 'thing_id': thingID, + 'from': fromDateString, + 'to': now, + 'limit': '30', + "offset": offset.toString(), + "asc": "true" + }; + final body = await apiServices.getLogsOfDevice(thingID, params); + if (body != "") { + final data = jsonDecode(body); + DeviceLog devicesListLog = DeviceLog.fromJson(data); + if (devicesListLog.sensors!.isEmpty) { + bool hasMore = false; + sinkHasMore.add(hasMore); + } + if (devicesListLog.sensors!.isNotEmpty) { + for (var sensor in devicesListLog.sensors!) { + sensors.add(sensor); + } + } + + sinkSensors.add(sensors); + } + } +} diff --git a/lib/feature/log/device_logs_model.dart b/lib/feature/log/device_logs_model.dart new file mode 100644 index 0000000..45fa032 --- /dev/null +++ b/lib/feature/log/device_logs_model.dart @@ -0,0 +1,66 @@ +class DeviceLog { + String? thingId; + DateTime? from; + DateTime? to; + int? total; + int? offset; + List? sensors; + + DeviceLog({ + this.thingId, + this.from, + this.to, + this.total, + this.offset, + this.sensors, + }); + + DeviceLog.fromJson(Map json) { + thingId = json["thing_id"]; + from = DateTime.parse(json["from"]); + to = DateTime.parse(json["to"]); + total = json["total"]; + offset = json["offset"]; + if (json['sensors'] != null) { + sensors = []; + json['sensors'].forEach((v) { + sensors!.add(SensorLogs.fromJson(v)); + }); + } + } +} + +class SensorLogs { + String? name; + int? value; + int? time; + LogDetail? detail; + + SensorLogs({ + this.name, + this.value, + this.time, + this.detail, + }); + SensorLogs.fromJson(Map json) { + name = json["n"]; + value = json["v"]; + time = json["t"]; + detail = json["x"] != null ? LogDetail.fromJson(json["x"]) : null; + } +} + +class LogDetail { + String? username; + String? note; + + LogDetail({ + this.username, + this.note, + }); + + LogDetail.fromJson(Map json) { + username = json["username"]; + note = json["note"]; + } +} diff --git a/lib/feature/log/device_logs_screen.dart b/lib/feature/log/device_logs_screen.dart new file mode 100644 index 0000000..9eae191 --- /dev/null +++ b/lib/feature/log/device_logs_screen.dart @@ -0,0 +1,295 @@ +import 'dart:developer'; + +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:sfm_app/feature/devices/device_model.dart'; +import 'package:sfm_app/feature/log/device_logs_bloc.dart'; +import 'package:sfm_app/product/constant/icon/icon_constants.dart'; +import 'package:sfm_app/product/extention/context_extention.dart'; +import 'package:sfm_app/product/services/language_services.dart'; +import 'package:sfm_app/product/shared/shared_snack_bar.dart'; +import 'package:sfm_app/product/utils/date_time_utils.dart'; +import 'package:sfm_app/product/utils/device_utils.dart'; + +import '../../product/base/bloc/base_bloc.dart'; +import 'device_logs_model.dart'; + +class DeviceLogsScreen extends StatefulWidget { + const DeviceLogsScreen({super.key}); + + @override + State createState() => _DeviceLogsScreenState(); +} + +class _DeviceLogsScreenState extends State { + TextEditingController fromDate = TextEditingController(); + String fromDateApi = ''; + DateTime? dateTime; + String thingID = ""; + late DeviceLogsBloc deviceLogsBloc; + List allDevices = []; + List sensors = []; + int offset = 0; + final controller = ScrollController(); + bool hasMore = true; + @override + void initState() { + super.initState(); + deviceLogsBloc = BlocProvider.of(context); + controller.addListener( + () { + if (controller.position.maxScrollExtent == controller.offset) { + offset += 30; + deviceLogsBloc.getDeviceLogByThingID( + offset, thingID, dateTime!, sensors); + } + }, + ); + } + + @override + void dispose() { + controller.dispose(); + sensors.clear(); + deviceLogsBloc.sinkSensors.add(sensors); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder>( + stream: deviceLogsBloc.streamAllDevices, + builder: (context, allDevicesSnapshot) { + if (allDevicesSnapshot.data?[0].thingId == null) { + deviceLogsBloc.getAllDevices(); + return const Center( + child: CircularProgressIndicator(), + ); + } else { + return StreamBuilder>( + stream: deviceLogsBloc.streamSensors, + initialData: sensors, + builder: (context, sensorsSnapshot) { + return Padding( + padding: context.paddingLow, + child: Scaffold( + body: SafeArea( + child: Column( + children: [ + DropdownButtonFormField2( + isExpanded: true, + decoration: InputDecoration( + contentPadding: context.paddingLowVertical, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(15), + ), + ), + hint: Text( + appLocalization(context) + .choose_device_dropdownButton, + style: const TextStyle( + fontSize: 14, + ), + ), + items: allDevicesSnapshot.data?.isNotEmpty ?? false + ? allDevicesSnapshot.data! + .map( + (device) => DropdownMenuItem( + value: device.thingId, + child: Text( + device.name!, + style: const TextStyle( + fontSize: 14, + ), + ), + ), + ) + .toList() + : [], + buttonStyleData: const ButtonStyleData( + padding: EdgeInsets.only(right: 8), + ), + onChanged: (value) { + thingID = value!; + setState(() {}); + }, + onSaved: (value) { + log("On Saved"); + }, + iconStyleData: const IconStyleData( + icon: Icon( + Icons.arrow_drop_down, + ), + iconSize: 24, + ), + dropdownStyleData: DropdownStyleData( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + ), + ), + menuItemStyleData: const MenuItemStyleData( + padding: EdgeInsets.symmetric(horizontal: 16), + ), + ), + Padding( + padding: context.paddingLowVertical, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: context.dynamicWidth(0.6), + child: TextField( + controller: fromDate, + decoration: InputDecoration( + icon: + IconConstants.instance.getMaterialIcon( + Icons.calendar_month_outlined, + ), + labelText: appLocalization(context) + .choose_date_start_datePicker, + ), + readOnly: true, + onTap: () async { + DateTime? datePicker = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2023), + lastDate: DateTime(2050), + ); + dateTime = datePicker; + if (datePicker != null) { + fromDateApi = DateTimeUtils.instance + .formatDateTimeToString(datePicker); + setState( + () { + fromDate.text = + DateFormat('yyyy-MM-dd') + .format(datePicker); + }, + ); + } + }, + ), + ), + Center( + child: TextButton.icon( + style: const ButtonStyle( + backgroundColor: + MaterialStatePropertyAll(Colors.green), + ), + onPressed: () { + if (fromDateApi.isEmpty) { + showNoIconTopSnackBar( + context, + appLocalization(context) + .notification_enter_all_inf, + Colors.red, + Colors.white, + ); + } else { + deviceLogsBloc.getDeviceLogByThingID( + offset, thingID, dateTime!, sensors); + } + log("ThingID: $thingID"); + log("From Date: ${DateTimeUtils.instance.formatDateTimeToString(dateTime!)}"); + }, + icon: IconConstants.instance + .getMaterialIcon(Icons.search), + label: Text( + appLocalization(context) + .find_button_content, + ), + ), + ), + ], + ), + ), + Divider( + height: context.lowValue, + ), + Expanded( + child: sensorsSnapshot.data?.isEmpty ?? false + ? Center( + child: Text( + appLocalization(context).no_data_message), + ) + : RefreshIndicator( + onRefresh: refresh, + child: ListView.builder( + controller: controller, + itemCount: sensorsSnapshot.data!.length + 1, + itemBuilder: (context, index) { + if (index < + sensorsSnapshot.data!.length) { + return logDetail( + sensorsSnapshot.data![index], + index, + ); + } else { + return Padding( + padding: context.paddingLow, + child: StreamBuilder( + stream: + deviceLogsBloc.streamHasMore, + builder: + (context, hasMoreSnapshot) { + return Center( + child: hasMoreSnapshot.data ?? + hasMore + ? const CircularProgressIndicator() + : Text( + appLocalization(context) + .main_no_data), + ); + }, + ), + ); + } + }, + ), + ), + ), + ], + ), + ), + ), + ); + }, + ); + } + }, + ); + } + + Widget logDetail(SensorLogs sensor, int index) { + return Column( + children: [ + ListTile( + subtitle: + Text(DeviceUtils.instance.getDeviceSensorsLog(context, sensor)), + // leading: const Icon(Icons.sensors_outlined), + leading: Text(index.toString()), + title: Text( + DateTimeUtils.instance + .convertCurrentMillisToDateTimeString(sensor.time ?? 0), + ), + ), + const Divider( + thickness: 0.5, + indent: 50, + endIndent: 100, + ), + ], + ); + } + + Future refresh() async { + offset = 0; + sensors.clear(); + deviceLogsBloc.sensors.add(sensors); + hasMore = true; + deviceLogsBloc.sinkHasMore.add(hasMore); + deviceLogsBloc.getDeviceLogByThingID(offset, thingID, dateTime!, sensors); + } +} diff --git a/lib/feature/main/main_bloc.dart b/lib/feature/main/main_bloc.dart new file mode 100644 index 0000000..9ae5707 --- /dev/null +++ b/lib/feature/main/main_bloc.dart @@ -0,0 +1,39 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:sfm_app/product/base/bloc/base_bloc.dart'; + +import '../bell/bell_model.dart'; + +class MainBloc extends BlocBase { + final bellBloc = StreamController.broadcast(); + StreamSink get sinkBellBloc => bellBloc.sink; + Stream get streamBellBloc => bellBloc.stream; + + final title = StreamController.broadcast(); + StreamSink get sinkTitle => title.sink; + Stream get streamTitle => title.stream; + + final role = StreamController.broadcast(); + StreamSink get sinkRole => role.sink; + Stream get streamRole => role.stream; + + final language = StreamController.broadcast(); + StreamSink get sinkLanguage => language.sink; + Stream get streamLanguage => language.stream; + + final themeMode = StreamController.broadcast(); + StreamSink get sinkThemeMode => themeMode.sink; + Stream get streamThemeMode => themeMode.stream; + + final isVNIcon = StreamController.broadcast(); + StreamSink get sinkIsVNIcon => isVNIcon.sink; + Stream get streamIsVNIcon => isVNIcon.stream; + + final currentPageIndex = StreamController.broadcast(); + StreamSink get sinkCurrentPageIndex => currentPageIndex.sink; + Stream get streamCurrentPageIndex => currentPageIndex.stream; + + @override + void dispose() {} +} diff --git a/lib/feature/main/main_screen.dart b/lib/feature/main/main_screen.dart new file mode 100644 index 0000000..ec8d258 --- /dev/null +++ b/lib/feature/main/main_screen.dart @@ -0,0 +1,393 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:developer'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:provider/provider.dart'; +import 'package:badges/badges.dart' as badges; +import 'package:sfm_app/feature/home/home_bloc.dart'; +import 'package:sfm_app/product/constant/app/app_constants.dart'; +import 'package:sfm_app/product/constant/enums/app_route_enums.dart'; +import 'package:sfm_app/product/constant/enums/role_enums.dart'; +import '../devices/devices_manager_bloc.dart'; +import '../devices/devices_manager_screen.dart'; +import '../home/home_screen.dart'; +import '../inter_family/inter_family_bloc.dart'; +import '../inter_family/inter_family_screen.dart'; +import '../log/device_logs_bloc.dart'; +import '../log/device_logs_screen.dart'; +import 'main_bloc.dart'; +import '../map/map_bloc.dart'; +import '../map/map_screen.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/constant/enums/app_theme_enums.dart'; +import '../../product/extention/context_extention.dart'; +import '../../product/services/api_services.dart'; +import '../../main.dart'; +import '../../product/constant/icon/icon_constants.dart'; +import '../../product/constant/lang/language_constants.dart'; +import '../../product/services/language_services.dart'; +import '../../product/theme/theme_notifier.dart'; +import '../bell/bell_model.dart'; + +class MainScreen extends StatefulWidget { + const MainScreen({super.key}); + + @override + State createState() => _MainScreenState(); +} + +class _MainScreenState extends State { + APIServices apiServices = APIServices(); + late MainBloc mainBloc; + bool isVN = true; + bool isLight = true; + String role = 'Unknown'; + String titlePage = "Page Title"; + int currentPageIndex = 0; + final _badgeKey = GlobalKey(); + Bell bell = Bell(); + + void initialCheck() async { + role = await apiServices.getUserRole(); + mainBloc.sinkRole.add(role); + String language = await apiServices.checkLanguage(); + String theme = await apiServices.checkTheme(); + if (language == LanguageConstants.VIETNAM) { + isVN = true; + } else { + isVN = false; + } + if (theme == AppThemes.LIGHT.name) { + isLight = true; + } else { + isLight = false; + } + mainBloc.sinkIsVNIcon.add(isVN); + mainBloc.sinkThemeMode.add(isLight); + log("role: $role"); + } + + @override + void initState() { + super.initState(); + mainBloc = BlocProvider.of(context); + initialCheck(); + getBellNotification(); + } + + @override + Widget build(BuildContext context) { + ThemeNotifier themeNotifier = context.watch(); + checkSelectedIndex(currentPageIndex); + + List userDestinations = [ + NavigationDestination( + selectedIcon: IconConstants.instance.getMaterialIcon(Icons.home), + icon: IconConstants.instance.getMaterialIcon(Icons.home_outlined), + label: appLocalization(context).home_page_destination, + tooltip: appLocalization(context).home_page_destination, + ), + NavigationDestination( + selectedIcon: IconConstants.instance.getMaterialIcon(Icons.settings), + icon: IconConstants.instance.getMaterialIcon(Icons.settings_outlined), + label: appLocalization(context).manager_page_destination, + tooltip: appLocalization(context).device_manager_page_name, + ), + NavigationDestination( + selectedIcon: IconConstants.instance.getMaterialIcon(Icons.location_on), + icon: + IconConstants.instance.getMaterialIcon(Icons.location_on_outlined), + label: appLocalization(context).map_page_destination, + tooltip: appLocalization(context).map_page_destination, + ), + NavigationDestination( + // selectedIcon: IconConstants.instance.getMaterialIcon(Icons.histor), + icon: IconConstants.instance.getMaterialIcon(Icons.history_rounded), + label: appLocalization(context).history_page_destination, + tooltip: appLocalization(context).history_page_destination_tooltip, + ), + NavigationDestination( + selectedIcon: IconConstants.instance.getMaterialIcon(Icons.group), + icon: IconConstants.instance.getMaterialIcon(Icons.group_outlined), + label: appLocalization(context).group_page_destination, + tooltip: appLocalization(context).group_page_destination_tooltip, + ), + ]; + + List userBody = [ + BlocProvider(child: const HomeScreen(), blocBuilder: () => HomeBloc()), + BlocProvider( + child: const DevicesManagerScreen(), + blocBuilder: () => DevicesManagerBloc()), + BlocProvider( + child: const MapScreen(), + blocBuilder: () => MapBloc(), + ), + BlocProvider( + child: const DeviceLogsScreen(), + blocBuilder: () => DeviceLogsBloc(), + ), + BlocProvider( + child: const InterFamilyScreen(), + blocBuilder: () => InterFamilyBloc(), + ), + ]; + + List modDestinations = [ + NavigationDestination( + selectedIcon: IconConstants.instance.getMaterialIcon(Icons.home), + icon: IconConstants.instance.getMaterialIcon(Icons.home_outlined), + label: appLocalization(context).home_page_destination, + tooltip: appLocalization(context).home_page_destination, + ), + NavigationDestination( + selectedIcon: IconConstants.instance.getMaterialIcon(Icons.settings), + icon: IconConstants.instance.getMaterialIcon(Icons.settings_outlined), + label: appLocalization(context).manager_page_destination, + tooltip: appLocalization(context).device_manager_page_name, + ), + NavigationDestination( + selectedIcon: IconConstants.instance.getMaterialIcon(Icons.location_on), + icon: + IconConstants.instance.getMaterialIcon(Icons.location_on_outlined), + label: appLocalization(context).map_page_destination, + tooltip: appLocalization(context).map_page_destination, + ), + ]; + + List modBody = [ + BlocProvider(child: const HomeScreen(), blocBuilder: () => HomeBloc()), + BlocProvider( + child: const DevicesManagerScreen(), + blocBuilder: () => DevicesManagerBloc()), + BlocProvider( + child: const MapScreen(), + blocBuilder: () => MapBloc(), + ), + ]; + + return StreamBuilder( + stream: mainBloc.streamRole, + initialData: role, + builder: (context, roleSnapshot) { + return StreamBuilder( + stream: mainBloc.streamCurrentPageIndex, + initialData: currentPageIndex, + builder: (context, indexSnapshot) { + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + centerTitle: true, + title: StreamBuilder( + stream: mainBloc.streamTitle, + initialData: titlePage, + builder: (context, titleSnapshot) { + return Text( + titleSnapshot.data ?? ApplicationConstants.APP_NAME, + ); + }, + ), + actions: [ + StreamBuilder( + stream: mainBloc.streamThemeMode, + initialData: isLight, + builder: (context, themeModeSnapshot) { + return IconButton( + onPressed: () { + themeNotifier.changeTheme(); + isLight = !isLight; + mainBloc.sinkThemeMode.add(isLight); + }, + icon: Icon( + themeModeSnapshot.data ?? isLight + ? Icons.light_mode_outlined + : Icons.dark_mode_outlined, + ), + ); + }, + ), + StreamBuilder( + stream: mainBloc.streamIsVNIcon, + initialData: isVN, + builder: (context, isVnSnapshot) { + return IconButton( + onPressed: () async { + log("Locale: ${LanguageServices().getLocale()}"); + Locale locale = await LanguageServices().setLocale( + isVN + ? LanguageConstants.ENGLISH + : LanguageConstants.VIETNAM); + MyApp.setLocale(context, locale); + isVN = !isVN; + mainBloc.sinkIsVNIcon.add(isVN); + }, + icon: Image.asset( + IconConstants.instance.getIcon( + isVnSnapshot.data ?? isVN + ? 'vi_icon' + : 'en_icon'), + height: 24, + width: 24, + ), + ); + }, + ), + StreamBuilder( + stream: mainBloc.streamBellBloc, + builder: (context, bellSnapshot) { + return checkStatus(bellSnapshot.data?.items ?? []) + ? IconButton( + onPressed: () { + context.pushNamed(AppRoutes.BELL.name); + }, + icon: const Icon( + Icons.notifications, + ), + ) + : GestureDetector( + child: badges.Badge( + badgeStyle: const badges.BadgeStyle( + shape: badges.BadgeShape.twitter, + ), + key: _badgeKey, + badgeContent: const Icon( + CupertinoIcons.circle_filled, + color: Colors.red, + size: 5, + ), + badgeAnimation: + const badges.BadgeAnimation.slide( + animationDuration: + Duration(milliseconds: 200), + colorChangeAnimationDuration: + Duration(seconds: 1), + loopAnimation: false, + curve: Curves.decelerate, + colorChangeAnimationCurve: Curves.easeInCirc, + ), + showBadge: true, + // ignorePointer: false, + child: const Icon( + Icons.notifications, + size: 30, + ), + ), + onTap: () { + context.pushNamed(AppRoutes.BELL.name); + }, + ); + }, + ), + PopupMenuButton( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8.0), + bottomRight: Radius.circular(8.0), + topLeft: Radius.circular(8.0), + topRight: Radius.circular(8.0), + ), + ), + icon: const Icon(Icons.more_vert), + itemBuilder: (context) { + return [ + PopupMenuItem( + value: ApplicationConstants.SETTINGS_PATH, + onTap: () { + context.pushNamed(AppRoutes.SETTINGS.name); + }, + child: Row( + children: [ + const Icon(Icons.person), + const SizedBox(width: 5), + Text(appLocalization(context).profile_icon_title) + ], + ), + ), + PopupMenuItem( + value: ApplicationConstants.LOGOUT_PATH, + onTap: () { + Future.delayed( + const Duration(milliseconds: 200), + () async { + await apiServices.logOut(context); + }, + ); + }, + child: Row( + children: [ + const Icon(Icons.logout), + const SizedBox(width: 5), + Text( + appLocalization(context).log_out, + ), + ], + ), + ), + ]; + }, + ) + ], + ), + bottomNavigationBar: Container( + decoration: + BoxDecoration(borderRadius: BorderRadius.circular(50)), + padding: context.paddingLow, + child: NavigationBar( + onDestinationSelected: (index) { + currentPageIndex = index; + mainBloc.sinkCurrentPageIndex.add(currentPageIndex); + checkSelectedIndex(currentPageIndex); + }, + selectedIndex: indexSnapshot.data ?? currentPageIndex, + destinations: roleSnapshot.data == RoleEnums.USER.name + ? userDestinations + : modDestinations, + ), + ), + body: IndexedStack( + index: indexSnapshot.data ?? currentPageIndex, + children: roleSnapshot.data == RoleEnums.USER.name + ? userBody + : modBody, + ), + ); + }, + ); + }, + ); + } + + Future getBellNotification() async { + bell = await apiServices.getBellNotifications("0", "20"); + mainBloc.bellBloc.add(bell); + } + + bool checkStatus(List bells) { + if (bells.isEmpty) { + return true; + } + return !bells.any((bell) => bell.status == 0); + } + + void checkSelectedIndex(int current) { + if (current == 0) { + titlePage = appLocalization(context).home_page_name; + mainBloc.sinkTitle.add(titlePage); + } else if (current == 1) { + titlePage = appLocalization(context).device_manager_page_name; + mainBloc.sinkTitle.add(titlePage); + } else if (current == 2) { + titlePage = appLocalization(context).map_page_destination; + mainBloc.sinkTitle.add(titlePage); + } else if (current == 3) { + titlePage = appLocalization(context).device_log_page_name; + mainBloc.sinkTitle.add(titlePage); + } else if (current == 4) { + titlePage = appLocalization(context).interfamily_page_name; + mainBloc.sinkTitle.add(titlePage); + } + } +} diff --git a/lib/feature/map/map_bloc.dart b/lib/feature/map/map_bloc.dart new file mode 100644 index 0000000..9cd7830 --- /dev/null +++ b/lib/feature/map/map_bloc.dart @@ -0,0 +1,74 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import '../../product/services/map_services.dart'; +import '../../product/shared/shared_snack_bar.dart'; +import '../devices/device_model.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/services/api_services.dart'; + +class MapBloc extends BlocBase { + APIServices apiServices = APIServices(); + MapServices mapServices = MapServices(); + @override + void dispose() {} + + final mapType = StreamController.broadcast(); + StreamSink get sinkmapType => mapType.sink; + Stream get streammapType => mapType.stream; + + final mapController = StreamController.broadcast(); + StreamSink get sinkmapController => mapController.sink; + Stream get streammapController => mapController.stream; + + final allDevices = StreamController>.broadcast(); + StreamSink> get sinkAllDevices => allDevices.sink; + Stream> get streamAllDevices => allDevices.stream; + + final allMarker = StreamController>.broadcast(); + StreamSink> get sinkAllMarker => allMarker.sink; + Stream> get streamAllMarker => allMarker.stream; + + final polylines = StreamController>.broadcast(); + StreamSink> get sinkPolylines => polylines.sink; + Stream> get streamPolylines => polylines.stream; + + Future updateCameraPosition( + Completer controller, + double latitude, + double longitude, + double zoom, + ) async { + final CameraPosition cameraPosition = + CameraPosition(target: LatLng(latitude, longitude), zoom: zoom); + final GoogleMapController mapController = await controller.future; + mapController.animateCamera(CameraUpdate.newCameraPosition(cameraPosition)); + } + + Future findTheWay( + BuildContext context, + Completer controller, + LatLng origin, + LatLng destination, + ) async { + List polylines = []; + final polylineCoordinates = + await mapServices.findTheWay(origin, destination); + if (polylineCoordinates.isNotEmpty) { + polylines = polylineCoordinates; + sinkPolylines.add(polylines); + await updateCameraPosition( + controller, + destination.latitude, + destination.longitude, + 13.0, + ); + } else { + showNoIconTopSnackBar( + context, "Không tìm thấy đường", Colors.orange, Colors.white); + } + } +} diff --git a/lib/feature/map/map_screen.dart b/lib/feature/map/map_screen.dart new file mode 100644 index 0000000..a7615cf --- /dev/null +++ b/lib/feature/map/map_screen.dart @@ -0,0 +1,237 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_cluster_manager/google_maps_cluster_manager.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:sfm_app/feature/devices/device_model.dart'; +import 'package:sfm_app/feature/map/map_bloc.dart'; +import 'package:sfm_app/feature/map/widget/on_tap_marker_widget.dart'; +import 'package:sfm_app/product/base/bloc/base_bloc.dart'; +import 'package:sfm_app/product/constant/icon/icon_constants.dart'; +import 'package:sfm_app/product/services/api_services.dart'; + +class MapScreen extends StatefulWidget { + const MapScreen({super.key}); + + @override + State createState() => _MapScreenState(); +} + +class _MapScreenState extends State { + late BitmapDescriptor normalIcon; + late BitmapDescriptor offlineIcon; + late BitmapDescriptor abnormalIcon; + late BitmapDescriptor flameIcon; + late BitmapDescriptor hospitalIcon; + late BitmapDescriptor fireStationIcon; + late MapBloc mapBloc; + late ClusterManager clusterManager; + MapType mapType = MapType.terrain; + APIServices apiServices = APIServices(); + final streamController = StreamController.broadcast(); + List devices = []; + Completer _controller = Completer(); + List imageAssets = [ + IconConstants.instance.getIcon("normal_icon"), + IconConstants.instance.getIcon("offline_icon"), + IconConstants.instance.getIcon("flame_icon"), + IconConstants.instance.getIcon("hospital_marker"), + IconConstants.instance.getIcon("fire_station_marker"), + ]; + static const CameraPosition _myPosition = CameraPosition( + target: LatLng(20.976108, 105.791666), + zoom: 12, + ); + Set markersAll = {}; + List markers = []; + LatLng myLocation = const LatLng(213761, 123123); + + @override + void initState() { + super.initState(); + mapBloc = BlocProvider.of(context); + _loadIcons(); + getAllMarkers(); + clusterManager = _initClusterManager(); + } + + @override + void dispose() { + streamController.close(); + _controller = Completer(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + StreamBuilder>( + stream: mapBloc.streamAllMarker, + builder: (context, markerSnapshot) { + return StreamBuilder>( + stream: mapBloc.streamPolylines, + builder: (context, polylinesSnapshot) { + return GoogleMap( + initialCameraPosition: _myPosition, + mapType: mapType, + onMapCreated: (GoogleMapController controller) { + if (!_controller.isCompleted) { + _controller.complete(controller); + } + streamController.sink.add(controller); + clusterManager.setMapId(controller.mapId); + }, + markers: markerSnapshot.data ?? markersAll + ..addAll(markers), + zoomControlsEnabled: true, + myLocationEnabled: true, + mapToolbarEnabled: false, + onCameraMove: (position) { + clusterManager.onCameraMove(position); + }, + onCameraIdle: () { + clusterManager.updateMap(); + }, + polylines: { + Polyline( + polylineId: const PolylineId('router'), + points: polylinesSnapshot.data ?? [], + color: Colors.deepPurpleAccent, + width: 8, + ), + }, + ); + }, + ); + }, + ), + ], + ), + ); + } + + Future _loadIcons() async { + List> iconFutures = imageAssets.map((asset) { + return BitmapDescriptor.fromAssetImage(const ImageConfiguration(), asset); + }).toList(); + + List icons = await Future.wait(iconFutures); + + normalIcon = icons[0]; + offlineIcon = icons[1]; + flameIcon = icons[2]; + hospitalIcon = icons[3]; + fireStationIcon = icons[4]; + } + + ClusterManager _initClusterManager() { + return ClusterManager( + devices, + _updateMarkers, + markerBuilder: _getmarkerBuilder(), + ); + } + + Future Function(Cluster) _getmarkerBuilder() => + (cluster) async { + return Marker( + markerId: MarkerId( + cluster.getId(), + ), + position: cluster.location, + onTap: () { + onTapMarker( + context, + _controller, + mapBloc, + myLocation, + cluster.items, + imageAssets, + markers, + hospitalIcon, + fireStationIcon); + }, + icon: getMarkerIcon(cluster), + ); + }; + + BitmapDescriptor getMarkerIcon(Cluster cluster) { + if (cluster.items.length == 1) { + Device item = cluster.items.first; + if (item.state == 0) { + return normalIcon; + } else if (item.state == 1) { + return flameIcon; + } else { + return offlineIcon; + } + } + bool hasStateOne = false; + bool hasOtherState = false; + + for (var item in cluster.items) { + if (item.state == 1) { + hasStateOne = true; + break; + } else if (item.state != 0) { + hasOtherState = true; + } + } + + // log("Has state = 1: $hasStateOne, Has other state: $hasOtherState"); + + if (hasStateOne) { + return flameIcon; // flameIcon + } else if (hasOtherState) { + return normalIcon; // normalIcon + } else { + return offlineIcon; // offlineIcon + } + } + + bool checkStateMarker(Cluster cluster) { + bool hasStateOne = false; + bool hasOtherState = false; + + for (var item in cluster.items) { + if (item.state == 1) { + hasStateOne = true; + break; + } else if (item.state != 0) { + hasOtherState = true; + } + } + + // log("Has state = 1: $hasStateOne, Has other state: $hasOtherState"); + + if (hasStateOne) { + return true; // flameIcon + } else if (hasOtherState) { + return false; // normalIcon + } else { + return true; // offlineIcon + } + } + + void _updateMarkers(Set marker) { + log("Update Marker"); + markersAll = marker; + mapBloc.sinkAllMarker.add(marker); + } + + void getAllMarkers() async { + String response = await apiServices.getOwnerDevices(); + if (response != "") { + final data = jsonDecode(response); + List result = data['items']; + final devicesList = Device.fromJsonDynamicList(result); + for (var device in devicesList) { + devices.add(device); + } + } + } +} diff --git a/lib/feature/map/widget/on_tap_marker_widget.dart b/lib/feature/map/widget/on_tap_marker_widget.dart new file mode 100644 index 0000000..2f39c06 --- /dev/null +++ b/lib/feature/map/widget/on_tap_marker_widget.dart @@ -0,0 +1,344 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'show_direction_widget.dart'; +import 'show_nearest_place.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../map_bloc.dart'; +import '../../../product/services/api_services.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/utils/device_utils.dart'; + +import '../../devices/device_model.dart'; + +onTapMarker( + BuildContext context, + Completer controller, + MapBloc mapBloc, + LatLng myLocation, + Iterable devices, + List imageAssets, + List otherMarkers, + BitmapDescriptor hospitalIcon, + BitmapDescriptor fireStationIcon, +) { + LatLng testLocation = const LatLng(20.985453, 105.738381); + showModalBottomSheet( + context: context, + builder: (BuildContext modalBottomSheetContext) { + if (devices.length == 1) { + List devicesList = devices.toList(); + final device = devicesList[0]; + String deviceState = DeviceUtils.instance + .checkStateDevice(modalBottomSheetContext, device.state ?? 3); + String imgStringAsset; + if (device.state == 0) { + imgStringAsset = imageAssets[0]; + } else if (device.state == 1) { + imgStringAsset = imageAssets[2]; + } else { + imgStringAsset = imageAssets[1]; + } + return Padding( + padding: context.paddingLow, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "${appLocalization(context).device_title}: ${device.name}", + style: context.titleLargeTextStyle, + ), + ], + ), + SizedBox( + height: context.lowValue, + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: () async { + Navigator.pop(modalBottomSheetContext); + var destination = LatLng( + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + ); + mapBloc.findTheWay( + context, + controller, + testLocation, + destination, + ); + String deviceLocations = await DeviceUtils.instance + .getFullDeviceLocation(context, device.areaPath!); + String yourLocation = + appLocalization(context).map_your_location; + showDirections( + context, + controller, + otherMarkers, + mapBloc, + yourLocation, + deviceLocations, + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + ); + }, + style: const ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.blue), + foregroundColor: MaterialStatePropertyAll(Colors.white), + ), + child: Row( + children: [ + IconConstants.instance + .getMaterialIcon(Icons.turn_right), + Text(appLocalization(modalBottomSheetContext) + .map_show_direction), + ], + ), + ), + SizedBox( + width: context.lowValue, + ), + ElevatedButton.icon( + onPressed: () { + Navigator.pop(modalBottomSheetContext); + showNearPlacesSideSheet( + context, + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + "Bệnh viện gần nhất", + 5000, + "hospital", + mapBloc, + controller, + otherMarkers, + hospitalIcon, + fireStationIcon, + ); + }, + style: const ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.pink), + foregroundColor: MaterialStatePropertyAll(Colors.white), + ), + icon: IconConstants.instance + .getMaterialIcon(Icons.local_hospital), + label: Text(appLocalization(modalBottomSheetContext) + .map_nearby_hospital), + ), + SizedBox( + width: context.lowValue, + ), + ElevatedButton.icon( + onPressed: () { + Navigator.pop(modalBottomSheetContext); + showNearPlacesSideSheet( + context, + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + "đội pccc gần nhất", + 5000, + "fire_station", + mapBloc, + controller, + otherMarkers, + hospitalIcon, + fireStationIcon, + ); + }, + style: const ButtonStyle( + backgroundColor: MaterialStatePropertyAll(Colors.red), + foregroundColor: MaterialStatePropertyAll(Colors.white), + ), + icon: IconConstants.instance + .getMaterialIcon(Icons.fire_truck_outlined), + label: Text(appLocalization(modalBottomSheetContext) + .map_nearby_firestation), + ), + ], + ), + ), + SizedBox(height: context.lowValue), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '${appLocalization(modalBottomSheetContext).paginated_data_table_column_deviceStatus}: '), + SizedBox( + height: 25, + width: 25, + child: CircleAvatar( + minRadius: 20, + maxRadius: 20, + backgroundImage: AssetImage(imgStringAsset), + ), + ), + SizedBox(width: context.lowValue), + Text( + deviceState, + style: context.bodyMediumTextStyle, + ), + ], + ), + ], + ), + ); + // Tiếp tục xử lý mảng devices + } else if (devices.length > 1) { + DeviceSource deviceSource = DeviceSource( + DeviceUtils.instance.sortDeviceByState(devices.toList()), + modalBottomSheetContext, + controller, + mapBloc, + ); + // Devices là một phần tử + return Padding( + padding: context.paddingLow, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Center( + child: Text( + appLocalization(modalBottomSheetContext) + .paginated_data_table_title, + style: context.titleLargeTextStyle, + ), + ), + PaginatedDataTable( + columns: [ + DataColumn( + label: Center( + child: Text( + appLocalization(modalBottomSheetContext) + .input_name_device_device, + ), + ), + ), + DataColumn( + label: Center( + child: Text( + appLocalization(modalBottomSheetContext) + .paginated_data_table_column_deviceStatus, + ), + ), + ), + DataColumn( + label: Center( + child: Text( + appLocalization(modalBottomSheetContext) + .paginated_data_table_column_deviceBaterry, + ), + ), + ), + DataColumn( + label: Center( + child: Text( + appLocalization(modalBottomSheetContext) + .paginated_data_table_column_deviceSignal, + ), + ), + ), + ], + source: deviceSource, + rowsPerPage: 5, + ), + ], + ), + ); + } else { + return Text(appLocalization(modalBottomSheetContext).undefine_message); + } + }, + ); +} + +class DeviceSource extends DataTableSource { + BuildContext context; + MapBloc mapBloc; + final List devices; + final Completer controller; + DeviceSource(this.devices, this.context, this.controller, this.mapBloc); + APIServices apiServices = APIServices(); + @override + DataRow? getRow(int index) { + if (index >= devices.length) { + return null; + } + final device = devices[index]; + Map sensorMap = DeviceUtils.instance + .getDeviceSensors(context, device.status?.sensors ?? []); + String deviceState = + DeviceUtils.instance.checkStateDevice(context, device.state!); + return DataRow.byIndex( + color: MaterialStatePropertyAll( + DeviceUtils.instance.getTableRowColor(device.state ?? -1), + ), + index: index, + cells: [ + DataCell( + Text(device.name!), + onTap: () { + mapBloc.updateCameraPosition( + controller, + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + 16, + ); + Navigator.pop(context); + }, + ), + DataCell( + Text(deviceState), + onTap: () { + mapBloc.updateCameraPosition( + controller, + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + 16, + ); + }, + ), + DataCell( + Text(sensorMap['sensorBattery'] + "%"), + onTap: () { + mapBloc.updateCameraPosition( + controller, + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + 16, + ); + }, + ), + DataCell( + Text(sensorMap['sensorCsq']), + onTap: () { + mapBloc.updateCameraPosition( + controller, + double.parse(device.settings!.latitude!), + double.parse(device.settings!.longitude!), + 16, + ); + }, + ), + ], + ); + } + + @override + bool get isRowCountApproximate => false; + @override + int get rowCount => devices.length; + @override + int get selectedRowCount => 0; +} diff --git a/lib/feature/map/widget/show_direction_widget.dart b/lib/feature/map/widget/show_direction_widget.dart new file mode 100644 index 0000000..2d9ab49 --- /dev/null +++ b/lib/feature/map/widget/show_direction_widget.dart @@ -0,0 +1,124 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:maps_launcher/maps_launcher.dart'; +import 'package:sfm_app/product/constant/icon/icon_constants.dart'; +import 'package:sfm_app/product/extention/context_extention.dart'; +import 'package:sfm_app/product/services/language_services.dart'; + +import '../map_bloc.dart'; + +showDirections( + BuildContext context, + Completer controller, + List markers, + MapBloc mapBloc, + String originalName, + String destinationLocation, + double devicelat, + double devicelng, +) { + TextEditingController originController = + TextEditingController(text: originalName); + TextEditingController destinationController = + TextEditingController(text: destinationLocation); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.transparent, + // dismissDirection: DismissDirection.none, + duration: const Duration(minutes: 5), + content: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + appLocalization(context).map_show_direction, + style: context.titleLargeTextStyle, + ), + Container( + alignment: Alignment.centerRight, + child: IconButton.outlined( + onPressed: () async { + await mapBloc.updateCameraPosition( + controller, + devicelat, + devicelng, + 13.0, + ); + List polylineCoordinates = []; + mapBloc.sinkPolylines.add(polylineCoordinates); + markers.clear(); + if (context.mounted) { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + } + }, + icon: IconConstants.instance.getMaterialIcon(Icons.close), + ), + ) + ], + ), + Row( + children: [ + Text( + '${appLocalization(context).map_start}: ', + ), + SizedBox(width: context.lowValue), + Expanded( + child: TextField( + controller: originController, + readOnly: true, + ), + ), + ], + ), + SizedBox( + height: context.lowValue, + ), + Row( + children: [ + Text( + '${appLocalization(context).map_destination}: ', + ), + SizedBox(width: context.lowValue), + Expanded( + child: TextField( + controller: destinationController, + readOnly: true, + ), + ), + ], + ), + SizedBox(height: context.lowValue), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ElevatedButton.icon( + onPressed: () async { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + List polylineCoordinates = []; + mapBloc.sinkPolylines.add(polylineCoordinates); + MapsLauncher.launchCoordinates(devicelat, devicelng); + }, + icon: IconConstants.instance + .getMaterialIcon(Icons.near_me_rounded), + label: Text( + appLocalization(context).map_stream, + ), + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.blue[300]!), + ), + ), + ], + ), + ], + ), + ), + ); +} diff --git a/lib/feature/map/widget/show_nearest_place.dart b/lib/feature/map/widget/show_nearest_place.dart new file mode 100644 index 0000000..beab93a --- /dev/null +++ b/lib/feature/map/widget/show_nearest_place.dart @@ -0,0 +1,226 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import '../map_bloc.dart'; +import 'show_direction_widget.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/language_services.dart'; +import '../../../product/services/map_services.dart'; +import '../../../product/shared/model/near_by_search_model.dart'; + +showNearPlacesSideSheet( + BuildContext context, + double latitude, + double longitude, + String searchKey, + int radius, + String type, + MapBloc mapBloc, + Completer controller, + List markers, + BitmapDescriptor hospitalIcon, + BitmapDescriptor fireStationIcon, +) async { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + LatLng testLocation = LatLng(latitude, longitude); + List placeDetails = []; + placeDetails = + await findLocation(latitude, longitude, searchKey, radius, type); + await mapBloc.updateCameraPosition(controller, latitude, longitude, 12.0); + if (placeDetails.isNotEmpty) { + for (int i = 0; i < placeDetails.length; i++) { + Marker marker = Marker( + markerId: MarkerId(placeDetails[i].result!.placeId!), + position: LatLng(placeDetails[i].result!.geometry!.location!.lat!, + placeDetails[i].result!.geometry!.location!.lng!), + infoWindow: InfoWindow(title: placeDetails[i].result!.name!), + icon: + searchKey == "Bệnh viện gần nhất" ? hospitalIcon : fireStationIcon, + ); + markers.add(marker); + } + } + showModalBottomSheet( + context: context, + builder: (modalBottomSheetContext) { + return Container( + padding: context.paddingLow, + width: screenWidth, + height: screenHeight / 3, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Center( + child: Text( + '${appLocalization(modalBottomSheetContext).map_result}: ', + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + Container( + alignment: Alignment.centerRight, + child: IconButton( + onPressed: () async { + Navigator.pop(modalBottomSheetContext); + markers.clear(); + await mapBloc.updateCameraPosition( + controller, + latitude, + longitude, + 14.0, + ); + }, + icon: IconConstants.instance.getMaterialIcon(Icons.close), + ), + ), + ], + ), + if (placeDetails.isNotEmpty) + Expanded( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: placeDetails.length, + itemBuilder: (BuildContext listViewContext, int index) { + final place = placeDetails[index]; + return GestureDetector( + onTap: () async { + await mapBloc.updateCameraPosition( + controller, + place.result!.geometry!.location!.lat!, + place.result!.geometry!.location!.lng!, + 17.0, + ); + }, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20.0), + ), + child: Container( + padding: listViewContext.paddingLow, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.0), + ), + width: screenWidth / 1.5, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + place.result!.name!, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: listViewContext.lowValue), + Text( + '${appLocalization(listViewContext).change_profile_address} ${place.result!.formattedAddress} '), + SizedBox(height: listViewContext.lowValue), + if (place.result?.openingHours?.openNow == null) + Text( + appLocalization(listViewContext) + .map_always_opened, + style: const TextStyle( + color: Colors.green, + ), + ) + else + place.result?.openingHours?.openNow ?? false + ? Text( + appLocalization(listViewContext) + .map_openning, + style: const TextStyle( + color: Colors.green, + ), + ) + : Text( + appLocalization(listViewContext) + .map_closed, + style: const TextStyle( + color: Colors.red, + ), + ), + SizedBox( + height: listViewContext.lowValue, + ), + Center( + child: ElevatedButton.icon( + style: const ButtonStyle( + backgroundColor: + MaterialStatePropertyAll(Colors.blue), + foregroundColor: + MaterialStatePropertyAll(Colors.white), + ), + onPressed: () async { + Navigator.pop(modalBottomSheetContext); + var destination = LatLng( + place.result!.geometry!.location!.lat!, + place.result!.geometry!.location!.lng!); + mapBloc.findTheWay(context, controller, + testLocation, destination); + // findTheWay(myLocation, destination); + await mapBloc.updateCameraPosition( + controller, + place.result!.geometry!.location!.lat!, + place.result!.geometry!.location!.lng!, + 13.0, + ); + showDirections( + context, + controller, + markers, + mapBloc, + appLocalization(context) + .map_your_location, + place.result!.name!, + latitude, + longitude, + ); + }, + icon: IconConstants.instance + .getMaterialIcon(Icons.turn_right), + label: Text(appLocalization(listViewContext) + .map_show_direction), + ), + ), + ], + ), + ), + ), + ); + }, + ), + ) + else + Center( + child: Text( + appLocalization(modalBottomSheetContext).map_no_results, + ), + ), + ], + ), + ); + }, + ); +} + +Future> findLocation(double latitude, double longitude, + String searchKey, int radius, String type) async { + MapServices mapServices = MapServices(); + + final nearByPlaces = await mapServices.getNearbyPlaces( + latitude, longitude, searchKey, radius, type); + + return nearByPlaces.isNotEmpty ? nearByPlaces : []; +} diff --git a/lib/feature/settings/device_notification_settings/device_notification_settings_bloc.dart b/lib/feature/settings/device_notification_settings/device_notification_settings_bloc.dart new file mode 100644 index 0000000..5cd8ed8 --- /dev/null +++ b/lib/feature/settings/device_notification_settings/device_notification_settings_bloc.dart @@ -0,0 +1,42 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'device_notification_settings_model.dart'; +import '../../../product/base/bloc/base_bloc.dart'; + +class DeviceNotificationSettingsBloc extends BlocBase { + final listNotifications = + StreamController>.broadcast(); + StreamSink> get sinkListNotifications => + listNotifications.sink; + Stream> get streamListNotifications => + listNotifications.stream; + + final deviceThingID = StreamController.broadcast(); + StreamSink get sinkDeviceThingID => deviceThingID.sink; + Stream get streamDeviceThingID => deviceThingID.stream; + + final deviceNotificationSettingMap = + StreamController>.broadcast(); + StreamSink> get sinkDeviceNotificationSettingMap => + deviceNotificationSettingMap.sink; + Stream> get streamDeviceNotificationSettingMap => + deviceNotificationSettingMap.stream; + + final isDataChange = StreamController.broadcast(); + StreamSink get sinkIsDataChange => isDataChange.sink; + Stream get streamIsDataChange => isDataChange.stream; + + final iconChange = StreamController.broadcast(); + StreamSink get sinkIconChange => iconChange.sink; + Stream get streamIconChange => iconChange.stream; + + final messageChange = StreamController.broadcast(); + StreamSink get sinkMessageChange => messageChange.sink; + Stream get streaMmessageChange => messageChange.stream; + + + @override + void dispose() {} +} diff --git a/lib/feature/settings/device_notification_settings/device_notification_settings_model.dart b/lib/feature/settings/device_notification_settings/device_notification_settings_model.dart new file mode 100644 index 0000000..e6e84ef --- /dev/null +++ b/lib/feature/settings/device_notification_settings/device_notification_settings_model.dart @@ -0,0 +1,56 @@ +class DeviceNotificationSettings { + String? id; + String? userId; + String? thingId; + DeviceAliasSettings? settings; + DateTime? updatedAt; + + DeviceNotificationSettings({ + this.id, + this.userId, + this.thingId, + this.settings, + this.updatedAt, + }); + + DeviceNotificationSettings.fromJson(Map json) { + id = json["id"]; + userId = json["user_id"]; + thingId = json["thing_id"]; + settings = json["settings"] != null + ? DeviceAliasSettings.fromJson(json["settings"]) + : null; + updatedAt = DateTime.parse(json["updated_at"]); + } + + static List mapToList( + Map map) { + return map.values.toList(); + } + + static Map mapFromJson( + Map json) { + final Map devices = {}; + json.forEach((key, value) { + devices[key] = DeviceNotificationSettings.fromJson(value); + }); + return devices; + } +} + +class DeviceAliasSettings { + String? alias; + Map? notifiSettings; + + DeviceAliasSettings({ + this.alias, + this.notifiSettings, + }); + + DeviceAliasSettings.fromJson(Map json) { + alias = json['alias']; + if (json['notifi_settings'] != null) { + notifiSettings = Map.from(json['notifi_settings']); + } + } +} diff --git a/lib/feature/settings/device_notification_settings/device_notification_settings_screen.dart b/lib/feature/settings/device_notification_settings/device_notification_settings_screen.dart new file mode 100644 index 0000000..9054e03 --- /dev/null +++ b/lib/feature/settings/device_notification_settings/device_notification_settings_screen.dart @@ -0,0 +1,313 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:convert'; +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; +import '../../../product/shared/shared_snack_bar.dart'; +import 'device_notification_settings_bloc.dart'; +import 'device_notification_settings_model.dart'; +import '../../../product/base/bloc/base_bloc.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/api_services.dart'; +import '../../../product/services/language_services.dart'; + +class DeviceNotificationSettingsScreen extends StatefulWidget { + const DeviceNotificationSettingsScreen({super.key}); + + @override + State createState() => + _DeviceNotificationSettingsScreenState(); +} + +class _DeviceNotificationSettingsScreenState + extends State { + late DeviceNotificationSettingsBloc deviceNotificationSettingsBloc; + String thingID = ""; + List deviceNotifications = []; + APIServices apiServices = APIServices(); + @override + void initState() { + super.initState(); + deviceNotificationSettingsBloc = BlocProvider.of(context); + getNotificationSetting(); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder>( + stream: deviceNotificationSettingsBloc.streamListNotifications, + initialData: deviceNotifications, + builder: (context, notificationSnapshot) { + return StreamBuilder( + stream: deviceNotificationSettingsBloc.streamDeviceThingID, + initialData: thingID, + builder: (context, deviceThingIdSnapshot) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text( + appLocalization(context).profile_setting, + style: Theme.of(context).textTheme.titleLarge, + ), + ), + body: deviceNotifications.isEmpty + ? Center( + child: CircularProgressIndicator( + value: context.mediumValue, + ), + ) + : Padding( + padding: context.paddingLow, + child: Column( + children: [ + DropdownButtonFormField2< + DeviceNotificationSettings>( + isExpanded: true, + decoration: InputDecoration( + contentPadding: + const EdgeInsets.symmetric(vertical: 10), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(15), + ), + ), + hint: Text( + appLocalization(context) + .choose_device_dropdownButton, + style: const TextStyle(fontSize: 14), + ), + iconStyleData: const IconStyleData( + icon: Icon( + Icons.arrow_drop_down, + ), + iconSize: 24, + ), + menuItemStyleData: const MenuItemStyleData( + padding: EdgeInsets.symmetric(horizontal: 16), + ), + items: deviceNotifications + .map((e) => DropdownMenuItem< + DeviceNotificationSettings>( + value: e, + child: Text(e.settings!.alias!), + )) + .toList(), + onChanged: (value) { + thingID = value!.thingId ?? ""; + deviceNotificationSettingsBloc + .sinkDeviceThingID + .add(thingID); + }, + ), + if (deviceThingIdSnapshot.data! != "") + listNotificationSetting( + deviceThingIdSnapshot.data ?? thingID, + deviceNotifications) + ], + ), + ), + ); + }); + }); + } + + void getNotificationSetting() async { + String? response = await apiServices.getAllSettingsNotificationOfDevices(); + final data = jsonDecode(response); + final result = data['data']; + // log("Data ${DeviceNotificationSettings.mapFromJson(jsonDecode(data)).values.toList()}"); + deviceNotifications = + DeviceNotificationSettings.mapFromJson(result).values.toList(); + deviceNotificationSettingsBloc.sinkListNotifications + .add(deviceNotifications); + } + + Widget listNotificationSetting( + String thingID, List devices) { + DeviceNotificationSettings chooseDevice = DeviceNotificationSettings(); + + for (var device in devices) { + if (device.thingId == thingID) { + chooseDevice = device; + break; + } + } + IconData selectIcon = Icons.unpublished_outlined; + String selectMessage = appLocalization(context) + .change_profile_device_notification_deselect_all; + bool isChange = false; + bool isDataChange = false; + // Lấy notifiSettings + final notifiSettings = chooseDevice.settings?.notifiSettings ?? {}; + deviceNotificationSettingsBloc.sinkDeviceNotificationSettingMap + .add(notifiSettings); + return SingleChildScrollView( + child: StreamBuilder>( + stream: + deviceNotificationSettingsBloc.streamDeviceNotificationSettingMap, + initialData: notifiSettings, + builder: (context, deviceNotificationSettingSnapshot) { + return StreamBuilder( + stream: deviceNotificationSettingsBloc.streamIsDataChange, + initialData: isDataChange, + builder: (context, isDataChangeSnapshot) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TextButton.icon( + onPressed: () { + changeIconAndMessage( + isChange, + selectIcon, + selectMessage, + notifiSettings, + isDataChange); + isChange = !isChange; + }, + icon: StreamBuilder( + stream: deviceNotificationSettingsBloc + .streamIconChange, + initialData: selectIcon, + builder: (context, iconSnapshot) { + return Icon( + iconSnapshot.data ?? selectIcon); + }), + label: StreamBuilder( + stream: deviceNotificationSettingsBloc + .streaMmessageChange, + builder: (context, messageSnapshot) { + return Text( + messageSnapshot.data ?? selectMessage); + })), + if (isDataChangeSnapshot.data ?? isDataChange) + IconButton( + onPressed: () { + updateDeviceNotification( + thingID, notifiSettings, isDataChange); + }, + icon: const Icon(Icons.done)) + ], + ), + ListView.builder( + shrinkWrap: true, + itemCount: + deviceNotificationSettingSnapshot.data?.length ?? + notifiSettings.length, + itemBuilder: (context, index) { + final key = deviceNotificationSettingSnapshot + .data!.keys + .elementAt(index); + final value = + deviceNotificationSettingSnapshot.data![key]; + return CheckboxListTile( + value: value == 1, + onChanged: (newValue) { + notifiSettings[key] = newValue == true ? 1 : 0; + deviceNotificationSettingsBloc + .sinkDeviceNotificationSettingMap + .add(notifiSettings); + isDataChange = true; + deviceNotificationSettingsBloc.sinkIsDataChange + .add(isDataChange); + }, + title: Text(getNotificationEvent(key)), + ); + }, + ), + if (isDataChangeSnapshot.data ?? isDataChange) + Center( + child: TextButton( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all( + Colors.green), + foregroundColor: + MaterialStateProperty.all( + Colors.white)), + onPressed: () async { + updateDeviceNotification( + thingID, notifiSettings, isDataChange); + }, + child: Text(appLocalization(context) + .update_button_content)), + ) + ], + ); + }); + }), + ); + } + + void changeIconAndMessage(bool isChange, IconData icon, String message, + Map notifiSettings, bool isDataChange) { + if (isChange == false) { + icon = Icons.published_with_changes_outlined; + message = appLocalization(context) + .change_profile_device_notification_select_all; + notifiSettings.updateAll((key, value) => 0); + } else { + icon = Icons.unpublished_outlined; + message = appLocalization(context) + .change_profile_device_notification_deselect_all; + notifiSettings.updateAll((key, value) => 1); + } + isDataChange = true; + deviceNotificationSettingsBloc.sinkIsDataChange.add(isDataChange); + deviceNotificationSettingsBloc.sinkDeviceNotificationSettingMap + .add(notifiSettings); + deviceNotificationSettingsBloc.sinkIconChange.add(icon); + deviceNotificationSettingsBloc.sinkMessageChange.add(message); + } + + String getNotificationEvent(String eventCode) { + String event = ""; + if (eventCode == "001") { + event = "Thiết bị mất kết nối"; + } else if (eventCode == "002") { + event = "Hoạt động của thiết bị"; + } else if (eventCode == "003") { + event = "Cảnh báo của thiết bị"; + } else if (eventCode == "004") { + event = "Thiết bị lỗi"; + } else if (eventCode == "005") { + event = "Thiết bị bình thường"; + } else if (eventCode == "006") { + event = "Thiết bị yếu pin"; + } else if (eventCode == "101") { + event = "Người dùng tham gia nhóm"; + } else if (eventCode == "102") { + event = "Người dùng rời nhóm"; + } else if (eventCode == "103") { + event = "Thiết bị tham gia nhóm"; + } else if (eventCode == "104") { + event = "Thiết bị bị xóa khỏi nhóm"; + } else { + event = "Chưa xác định"; + } + + return event; + } + + void updateDeviceNotification(String thingID, Map notifiSettings, + bool isDataChange) async { + int statusCode = await apiServices.updateDeviceNotificationSettings( + thingID, notifiSettings); + if (statusCode == 200) { + showNoIconTopSnackBar( + context, + appLocalization(context).notification_update_device_settings_success, + Colors.green, + Colors.white); + } else { + showNoIconTopSnackBar( + context, + appLocalization(context).notification_update_device_settings_failed, + Colors.red, + Colors.white); + } + isDataChange = false; + deviceNotificationSettingsBloc.sinkIsDataChange.add(isDataChange); + } +} diff --git a/lib/feature/settings/profile/profile_model.dart b/lib/feature/settings/profile/profile_model.dart new file mode 100644 index 0000000..a38ae68 --- /dev/null +++ b/lib/feature/settings/profile/profile_model.dart @@ -0,0 +1,37 @@ +class User { + String? id; + String? username; + String? role; + String? name; + String? email; + String? phone; + String? address; + String? notes; + String? latitude; + String? longitude; + + User( + {this.address, + this.email, + this.id, + this.name, + this.notes, + this.phone, + this.role, + this.username, + this.latitude, + this.longitude}); + + User.fromJson(Map json) { + id = json['id']; + username = json['username']; + role = json['role']; + name = json['name']; + email = json['email']; + phone = json['phone']; + address = json['address']; + notes = json['notes']; + latitude = json['latitude']; + longitude = json['longitude']; + } +} diff --git a/lib/feature/settings/profile/profile_screen.dart b/lib/feature/settings/profile/profile_screen.dart new file mode 100644 index 0000000..b72780d --- /dev/null +++ b/lib/feature/settings/profile/profile_screen.dart @@ -0,0 +1,440 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import '../../../product/shared/shared_snack_bar.dart'; +import '../../../product/constant/icon/icon_constants.dart'; +import '../../../product/services/api_services.dart'; +import '../settings_bloc.dart'; +import '../../../product/shared/shared_input_decoration.dart'; +import '../../../product/extention/context_extention.dart'; +import '../../../product/services/language_services.dart'; + +import 'profile_model.dart'; + +changeUserInfomation( + BuildContext context, User user, SettingsBloc settingsBloc) { + final formKey = GlobalKey(); + String username = user.name ?? ""; + String email = user.email ?? ""; + String tel = user.phone ?? ""; + String address = user.address ?? ""; + bool isChange = false; + APIServices apiServices = APIServices(); + showModalBottomSheet( + isScrollControlled: true, + useSafeArea: true, + context: context, + builder: (modalBottomSheetContext) { + return StreamBuilder( + stream: settingsBloc.streamIsChangeProfileInfomation, + initialData: isChange, + builder: (context, isChangeSnapshot) { + return Scaffold( + appBar: AppBar( + title: Text(appLocalization(context).change_profile_title), + centerTitle: true, + actions: [ + isChangeSnapshot.data ?? isChange + ? IconButton( + onPressed: () async { + if (formKey.currentState!.validate()) { + formKey.currentState!.save(); + String latitude = user.latitude ?? ""; + String longitude = user.longitude ?? ""; + Map body = { + "name": username, + "email": email, + "phone": tel, + "address": address, + "latitude": latitude, + "longitude": longitude + }; + int statusCode = + await apiServices.updateUserProfile(body); + if (statusCode == 200) { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_profile_success, + Colors.green, + Colors.white); + } else { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_profile_failed, + Colors.redAccent, + Colors.white); + } + Navigator.pop(modalBottomSheetContext); + } + }, + icon: + IconConstants.instance.getMaterialIcon(Icons.check), + ) + : const SizedBox.shrink() + ], + ), + body: SingleChildScrollView( + child: Form( + key: formKey, + child: Padding( + padding: context.paddingLow, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + appLocalization(context).change_profile_username, + style: context.titleMediumTextStyle, + ), + Padding( + padding: context.paddingLowVertical, + child: TextFormField( + initialValue: username, + textInputAction: TextInputAction.next, + validator: (usernameValue) { + if (usernameValue == "null" || + usernameValue!.isEmpty) { + return appLocalization(modalBottomSheetContext) + .login_account_not_empty; + } + return null; + }, + onChanged: (value) { + isChange = true; + settingsBloc.sinkIsChangeProfileInfomation + .add(isChange); + }, + onSaved: (newUsername) { + username = newUsername!; + }, + decoration: borderRadiusTopLeftAndBottomRight( + modalBottomSheetContext, + appLocalization(modalBottomSheetContext) + .change_profile_username_hint), + ), + ), + Text( + appLocalization(context).change_profile_email, + style: context.titleMediumTextStyle, + ), + Padding( + padding: context.paddingLowVertical, + child: TextFormField( + initialValue: email, + textInputAction: TextInputAction.next, + validator: (emailValue) { + if (emailValue == "null" || emailValue!.isEmpty) { + return appLocalization(modalBottomSheetContext) + .change_profile_email_not_empty; + } + return null; + }, + onChanged: (value) { + isChange = true; + settingsBloc.sinkIsChangeProfileInfomation + .add(isChange); + }, + onSaved: (newEmail) { + email = newEmail!; + }, + decoration: borderRadiusTopLeftAndBottomRight( + modalBottomSheetContext, + appLocalization(modalBottomSheetContext) + .change_profile_email_hint), + ), + ), + Text( + appLocalization(context).change_profile_tel, + style: context.titleMediumTextStyle, + ), + Padding( + padding: context.paddingLowVertical, + child: TextFormField( + initialValue: tel, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.phone, + validator: (telValue) { + if (telValue == "null" || telValue!.isEmpty) { + return appLocalization(modalBottomSheetContext) + .change_profile_tel_not_empty; + } + return null; + }, + onChanged: (value) { + isChange = true; + settingsBloc.sinkIsChangeProfileInfomation + .add(isChange); + }, + onSaved: (newTel) { + tel = newTel!; + }, + decoration: borderRadiusTopLeftAndBottomRight( + modalBottomSheetContext, + appLocalization(modalBottomSheetContext) + .change_profile_tel_hint), + ), + ), + Text( + appLocalization(context).change_profile_address, + style: context.titleMediumTextStyle, + ), + Padding( + padding: context.paddingLowVertical, + child: TextFormField( + initialValue: address, + textInputAction: TextInputAction.done, + onSaved: (newAddress) { + address = newAddress!; + }, + onChanged: (value) { + isChange = true; + settingsBloc.sinkIsChangeProfileInfomation + .add(isChange); + }, + decoration: borderRadiusTopLeftAndBottomRight( + modalBottomSheetContext, + appLocalization(modalBottomSheetContext) + .change_profile_address_hint), + ), + ), + SizedBox(height: context.mediumValue), + isChangeSnapshot.data ?? isChange + ? Center( + child: TextButton( + onPressed: () async { + if (formKey.currentState!.validate()) { + formKey.currentState!.save(); + String latitude = user.latitude ?? ""; + String longitude = user.longitude ?? ""; + Map body = { + "name": username, + "email": email, + "phone": tel, + "address": address, + "latitude": latitude, + "longitude": longitude + }; + int statusCode = await apiServices + .updateUserProfile(body); + if (statusCode == 200) { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_profile_success, + Colors.green, + Colors.white); + } else { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_profile_failed, + Colors.redAccent, + Colors.white); + } + Navigator.pop(modalBottomSheetContext); + } + }, + style: const ButtonStyle( + backgroundColor: + MaterialStatePropertyAll(Colors.blue), + foregroundColor: + MaterialStatePropertyAll(Colors.white), + ), + child: Text(appLocalization(context) + .update_button_content), + ), + ) + : const SizedBox.shrink(), + ], + ), + ), + ), + ), + ); + }, + ); + }, + ); +} + +changeUserPassword(BuildContext context, SettingsBloc settingsBloc) { + final formKey = GlobalKey(); + String oldPass = ""; + String newPass = ""; + APIServices apiServices = APIServices(); + bool isChange = false; + showModalBottomSheet( + isScrollControlled: true, + useSafeArea: true, + context: context, + builder: (modalBottomSheetContext) { + return StreamBuilder( + stream: settingsBloc.streamIsChangeProfileInfomation, + initialData: isChange, + builder: (context, isChangeSnapshot) { + return Scaffold( + appBar: AppBar( + title: Text(appLocalization(context).change_profile_title), + centerTitle: true, + actions: [ + isChangeSnapshot.data ?? isChange + ? IconButton( + onPressed: () async { + if (formKey.currentState!.validate()) { + formKey.currentState!.save(); + Map body = { + "password_old": oldPass, + "password_new": newPass, + }; + int statusCode = + await apiServices.updateUserPassword(body); + if (statusCode == 200) { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_password_success, + Colors.green, + Colors.white); + } else { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_password_failed, + Colors.redAccent, + Colors.white); + } + Navigator.pop(modalBottomSheetContext); + } + }, + icon: + IconConstants.instance.getMaterialIcon(Icons.check), + ) + : const SizedBox.shrink() + ], + ), + body: SingleChildScrollView( + child: Form( + key: formKey, + child: Padding( + padding: context.paddingLow, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + appLocalization(context).change_profile_old_pass, + style: context.titleMediumTextStyle, + ), + Padding( + padding: context.paddingLowVertical, + child: TextFormField( + initialValue: oldPass, + textInputAction: TextInputAction.next, + validator: (oldPassValue) { + if (oldPassValue == "null" || + oldPassValue!.isEmpty) { + return appLocalization(modalBottomSheetContext) + .change_profile_old_pass_not_empty; + } + return null; + }, + onChanged: (value) { + isChange = true; + settingsBloc.sinkIsChangeProfileInfomation + .add(isChange); + }, + onSaved: (newOldPass) { + oldPass = newOldPass!; + }, + decoration: borderRadiusTopLeftAndBottomRight( + modalBottomSheetContext, + appLocalization(modalBottomSheetContext) + .change_profile_old_pass_hint), + ), + ), + Text( + appLocalization(context).change_profile_new_pass, + style: context.titleMediumTextStyle, + ), + Padding( + padding: context.paddingLowVertical, + child: TextFormField( + initialValue: newPass, + textInputAction: TextInputAction.done, + validator: (newPassValue) { + if (newPassValue == "null" || + newPassValue!.isEmpty) { + return appLocalization(modalBottomSheetContext) + .change_profile_new_pass_not_empty; + } + return null; + }, + onChanged: (value) { + isChange = true; + settingsBloc.sinkIsChangeProfileInfomation + .add(isChange); + }, + onSaved: (newnewPass) { + newPass = newnewPass!; + }, + decoration: borderRadiusTopLeftAndBottomRight( + modalBottomSheetContext, + appLocalization(modalBottomSheetContext) + .change_profile_new_pass_hint), + ), + ), + SizedBox(height: context.mediumValue), + isChangeSnapshot.data ?? isChange + ? Center( + child: TextButton( + onPressed: () async { + if (formKey.currentState!.validate()) { + formKey.currentState!.save(); + Map body = { + "password_old": oldPass, + "password_new": newPass, + }; + int statusCode = await apiServices + .updateUserPassword(body); + if (statusCode == 200) { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_password_success, + Colors.green, + Colors.white); + } else { + showNoIconTopSnackBar( + modalBottomSheetContext, + appLocalization(context) + .notification_update_password_failed, + Colors.redAccent, + Colors.white); + } + Navigator.pop(modalBottomSheetContext); + } + }, + style: const ButtonStyle( + backgroundColor: + MaterialStatePropertyAll(Colors.blue), + foregroundColor: + MaterialStatePropertyAll(Colors.white), + ), + child: Text(appLocalization(context) + .update_button_content), + ), + ) + : const SizedBox.shrink() + ], + ), + ), + ), + ), + ); + }, + ); + }, + ); +} diff --git a/lib/feature/settings/settings_bloc.dart b/lib/feature/settings/settings_bloc.dart new file mode 100644 index 0000000..ea88d57 --- /dev/null +++ b/lib/feature/settings/settings_bloc.dart @@ -0,0 +1,25 @@ +import 'dart:async'; + +import 'profile/profile_model.dart'; +import '../../product/base/bloc/base_bloc.dart'; + +class SettingsBloc extends BlocBase { +// Settings Screen + final userProfile = StreamController.broadcast(); + StreamSink get sinkUserProfile => userProfile.sink; + Stream get streamUserProfile => userProfile.stream; + + +// Profile Screen + final isChangeProfileInfomation = StreamController.broadcast(); + StreamSink get sinkIsChangeProfileInfomation => + isChangeProfileInfomation.sink; + Stream get streamIsChangeProfileInfomation => + isChangeProfileInfomation.stream; + + + + @override + void dispose() { + } +} diff --git a/lib/feature/settings/settings_screen.dart b/lib/feature/settings/settings_screen.dart new file mode 100644 index 0000000..0ff5c12 --- /dev/null +++ b/lib/feature/settings/settings_screen.dart @@ -0,0 +1,153 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import '../../product/constant/app/app_constants.dart'; +import 'profile/profile_screen.dart'; +import '../../product/constant/icon/icon_constants.dart'; +import '../../product/extention/context_extention.dart'; +import '../../product/services/api_services.dart'; +import 'profile/profile_model.dart'; +import 'settings_bloc.dart'; +import '../../product/base/bloc/base_bloc.dart'; +import '../../product/services/language_services.dart'; + +class SettingsScreen extends StatefulWidget { + const SettingsScreen({super.key}); + + @override + State createState() => _SettingsScreenState(); +} + +class _SettingsScreenState extends State { + late SettingsBloc settingsBloc; + User user = User(); + APIServices apiServices = APIServices(); + @override + void initState() { + super.initState(); + settingsBloc = BlocProvider.of(context); + getUserProfile(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(appLocalization(context).profile_page_title), + centerTitle: true, + ), + body: StreamBuilder( + stream: settingsBloc.streamUserProfile, + initialData: user, + builder: (context, userSnapshot) { + return userSnapshot.data?.id == "" || user.id == "" + ? Center( + child: CircularProgressIndicator( + value: context.highValue, + ), + ) + : Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + radius: 70, + child: CircleAvatar( + radius: 60, + child: CircleAvatar( + radius: 50, + child: Text( + getAvatarContent( + userSnapshot.data?.username ?? ""), + style: const TextStyle( + fontSize: 35, fontWeight: FontWeight.bold), + ), + ), + ), + ), + SizedBox(height: context.lowValue), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + userSnapshot.data?.name ?? "User Name", + style: const TextStyle( + fontWeight: FontWeight.w900, fontSize: 26), + ) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [Text(userSnapshot.data?.email ?? "Email")], + ), + SizedBox(height: context.mediumValue), + cardContent( + Icons.account_circle_rounded, + appLocalization(context).profile_change_info, + ), + SizedBox(height: context.lowValue), + cardContent( + Icons.lock_outline, + appLocalization(context).profile_change_pass, + ), + SizedBox(height: context.lowValue), + cardContent( + Icons.settings_outlined, + appLocalization(context).profile_setting, + ), + SizedBox(height: context.lowValue), + cardContent( + Icons.logout_outlined, + appLocalization(context).log_out, + ), + ], + ); + }), + ); + } + + cardContent(IconData icon, String content) { + return GestureDetector( + onTap: () async { + if (icon == Icons.account_circle_rounded) { + changeUserInfomation(context, user, settingsBloc); + } else if (icon == Icons.lock_outline) { + changeUserPassword(context, settingsBloc); + } else if (icon == Icons.settings_outlined) { + context.push(ApplicationConstants.DEVICE_NOTIFICATIONS_SETTINGS); + } else { + await apiServices.logOut(context); + } + }, + child: Card( + margin: const EdgeInsets.only(left: 35, right: 35, bottom: 10), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), + child: ListTile( + leading: IconConstants.instance.getMaterialIcon(icon), + title: Text( + content, + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + trailing: const Icon( + Icons.arrow_forward_ios_outlined, + ), + ), + ), + ); + } + + void getUserProfile() async { + String data = await apiServices.getUserDetail(); + user = User.fromJson(jsonDecode(data)); + settingsBloc.sinkUserProfile.add(user); + } + + String getAvatarContent(String username) { + String name = ""; + if (username.isNotEmpty) { + name = username[0].toUpperCase(); + } + return name; + } +} diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..ee20712 --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,86 @@ +// 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) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return windows; + 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 web = FirebaseOptions( + apiKey: 'AIzaSyCD8s_CD1dzXuY2EdgzulRJqZV7TY-1chY', + appId: '1:910110439150:web:b3dc22fa9ecb953b5b65ff', + messagingSenderId: '910110439150', + projectId: 'sfm-notification', + authDomain: 'sfm-notification.firebaseapp.com', + storageBucket: 'sfm-notification.firebasestorage.app', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyADdZ66_q4HALlb0-yEGgeyGnsbwmlvDsA', + appId: '1:910110439150:android:c3dbc3b4a85d7cb75b65ff', + messagingSenderId: '910110439150', + projectId: 'sfm-notification', + storageBucket: 'sfm-notification.firebasestorage.app', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyCpcnAulIA5fxrSM0uHSf0uWSzzlM208Fw', + appId: '1:910110439150:ios:1d111f0cdd0240a35b65ff', + messagingSenderId: '910110439150', + projectId: 'sfm-notification', + storageBucket: 'sfm-notification.firebasestorage.app', + iosBundleId: 'com.example.sfmApp', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyCpcnAulIA5fxrSM0uHSf0uWSzzlM208Fw', + appId: '1:910110439150:ios:1d111f0cdd0240a35b65ff', + messagingSenderId: '910110439150', + projectId: 'sfm-notification', + storageBucket: 'sfm-notification.firebasestorage.app', + iosBundleId: 'com.example.sfmApp', + ); + + static const FirebaseOptions windows = FirebaseOptions( + apiKey: 'AIzaSyCD8s_CD1dzXuY2EdgzulRJqZV7TY-1chY', + appId: '1:910110439150:web:7c413e6bc22555575b65ff', + messagingSenderId: '910110439150', + projectId: 'sfm-notification', + authDomain: 'sfm-notification.firebaseapp.com', + storageBucket: 'sfm-notification.firebasestorage.app', + ); +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..b869359 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,80 @@ +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:sfm_app/product/services/language_services.dart'; +import 'feature/main/main_bloc.dart'; +import 'product/base/bloc/base_bloc.dart'; +import 'product/constant/navigation/navigation_router.dart'; +import 'product/theme/provider/app_provider.dart'; +import 'product/theme/theme_notifier.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp(); + runApp( + MultiProvider( + providers: [...ApplicationProvider.instance.dependItems], + child: BlocProvider( + child: const MyApp(), + blocBuilder: () => MainBloc(), + ), + ), + ); +} + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); + static void setLocale(BuildContext context, Locale newLocale) { + _MyAppState? state = context.findAncestorStateOfType<_MyAppState>(); + state?.setLocale(newLocale); + } +} + +class _MyAppState extends State { + Locale? _locale; + late MainBloc mainBloc; + LanguageServices languageServices = LanguageServices(); + // late ThemeNotifier themeNotifier; + setLocale(Locale locale) { + _locale = locale; + mainBloc.sinkLanguage.add(_locale); + } + + @override + void initState() { + super.initState(); + mainBloc = BlocProvider.of(context); + // themeNotifier = Provider.of(context, listen: false); + // ThemeNotifier().loadThemeFromPreferences(); + // log("ThemeKey1: ${LocaleManager.instance.getStringValue(PreferencesKeys.THEME)}"); + // log("Date: ${DateTime.parse("2024-11-16T07:17:36.785Z")}"); + } + + @override + void didChangeDependencies() { + languageServices.getLocale().then((locale) => {setLocale(locale)}); + super.didChangeDependencies(); + } + + @override + Widget build(BuildContext context) { + final router = goRouter(); + return StreamBuilder( + stream: mainBloc.streamLanguage, + initialData: _locale, + builder: (context, languageSnapshot) { + return MaterialApp.router( + theme: context.watch().currentTheme, + routerConfig: router, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + locale: languageSnapshot.data, + ); + }, + ); + } +} diff --git a/lib/product/base/bloc/base_bloc.dart b/lib/product/base/bloc/base_bloc.dart new file mode 100644 index 0000000..0f80078 --- /dev/null +++ b/lib/product/base/bloc/base_bloc.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +typedef BlocBuilder = T Function(); +typedef BlocDisposer = Function(T); + +abstract class BlocBase { + void dispose(); +} + +class _BlocProviderInherited extends InheritedWidget { + const _BlocProviderInherited({ + Key? key, + required Widget child, + required this.bloc, + }) : super(key: key, child: child); + + final T bloc; + + @override + bool updateShouldNotify(_BlocProviderInherited oldWidget) => false; +} + +class BlocProvider extends StatefulWidget { + const BlocProvider({ + Key? key, + required this.child, + required this.blocBuilder, + this.blocDispose, + }) : super(key: key); + + final Widget child; + final BlocBuilder blocBuilder; + final BlocDisposer? blocDispose; + + @override + BlocProviderState createState() => BlocProviderState(); + + static T of(BuildContext context) { + _BlocProviderInherited provider = context + .getElementForInheritedWidgetOfExactType<_BlocProviderInherited>() + ?.widget as _BlocProviderInherited; + return provider.bloc; + } +} + +class BlocProviderState extends State> { + late T bloc; + + @override + void initState() { + super.initState(); + bloc = widget.blocBuilder(); + } + + @override + void dispose() { + if (widget.blocDispose != null) { + widget.blocDispose!(bloc); + } else { + bloc.dispose(); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return _BlocProviderInherited( + bloc: bloc, + child: widget.child, + ); + } +} diff --git a/lib/product/base/screen/base_screen.dart b/lib/product/base/screen/base_screen.dart new file mode 100644 index 0000000..7f83b0c --- /dev/null +++ b/lib/product/base/screen/base_screen.dart @@ -0,0 +1,142 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +abstract class BasePageScreen extends StatefulWidget { + const BasePageScreen({Key? key}) : super(key: key); +} + +abstract class BasePageScreenState extends State { + bool _isBack = true; + bool _isHome = true; + bool _isShowTitle = true; + + final _loadingController = StreamController(); + + String appBarTitle(); + String appBarSubTitle(); + + void onClickBackButton(); + + void onClickHome(); + + void isBackButton(bool isBack) { + _isBack = isBack; + } + + void isHomeButton(bool isHome) { + _isHome = isHome; + } + + void isShowTitle(bool isShowTitle) { + _isShowTitle = isShowTitle; + } + + void showLoading() { + _loadingController.add(true); + } + + void hideLoading() { + _loadingController.add(false); + } +} + +mixin BaseScreen on BasePageScreenState { + Widget body(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + // flexibleSpace: Container( + // decoration: const BoxDecoration( + // image: DecorationImage( + // image: AssetImage('assets/images/bg_header.jpeg'), + // fit: BoxFit.cover)), + // ), + title: Column( + children: [ + Visibility( + visible: _isShowTitle, + child: Text( + appBarTitle(), + style: const TextStyle( + color: Colors.white, + fontSize: 16, + ), + ), + ), + Text( + appBarSubTitle(), + maxLines: _isShowTitle ? 1 : 2, + style: const TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ) + ], + ), + leading: _isBack + ? IconButton( + icon: const Icon( + Icons.arrow_back_ios, + color: Colors.white, + ), + onPressed: () { + // onClickBackButton(); + Navigator.of(context).pushNamedAndRemoveUntil( + "/main", (Route route) => false); + }, + ) + : Container(), + actions: [ + _isHome + ? IconButton( + icon: const Icon( + Icons.home, + color: Colors.white, + ), + onPressed: () { + onClickHome(); + }, + ) + : Container() + ], + ), + body: Stack( + children: [ + Container( + height: double.infinity, + color: Colors.white, + child: body(), + ), + StreamBuilder( + stream: _loadingController.stream, + builder: (_, snapshot) { + return snapshot.data == true + ? Positioned.fill( + child: _buildLoader(), + ) + : const SizedBox(); + }, + ), + ], + )); + } + + Widget _buildLoader() { + return Container( + color: Colors.black54, + child: const Center( + child: CircularProgressIndicator(), + ), + ); + } + + @override + void dispose() { + _loadingController.close(); + super.dispose(); + } +} diff --git a/lib/product/base/widget/dialog/request_permission_dialog.dart b/lib/product/base/widget/dialog/request_permission_dialog.dart new file mode 100644 index 0000000..91e4d0d --- /dev/null +++ b/lib/product/base/widget/dialog/request_permission_dialog.dart @@ -0,0 +1,61 @@ +import 'package:app_settings/app_settings.dart'; +import 'package:flutter/material.dart'; +import '../../../extention/context_extention.dart'; +import '../../../services/language_services.dart'; + +class RequestPermissionDialog { + showRequestPermissionDialog(BuildContext context, IconData icon, + String dialogContent, AppSettingsType type) { + showDialog( + useRootNavigator: false, + context: context, + builder: (dialogContext) { + return AlertDialog( + title: Center( + child: Icon(icon), + ), + content: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: context.paddingNormalVertical, + child: Text( + dialogContent, + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + ), + ), + Divider(height: context.lowValue), + GestureDetector( + onTap: () { + AppSettings.openAppSettings(type: type); + }, + child: Padding( + padding: + context.paddingNormalVertical, // Cách giữa các phần tử + child: Text(appLocalization(context).allow_message, + style: const TextStyle(fontWeight: FontWeight.bold)), + ), + ), + Divider(height: context.lowValue), + GestureDetector( + onTap: () { + Navigator.of(dialogContext).pop(); // Đóng dialog + }, + child: Padding( + padding: + context.paddingNormalVertical, // Cách giữa các phần tử + child: Text(appLocalization(context).decline_message, + style: const TextStyle(fontWeight: FontWeight.bold)), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/product/cache/local_manager.dart b/lib/product/cache/local_manager.dart new file mode 100644 index 0000000..500596d --- /dev/null +++ b/lib/product/cache/local_manager.dart @@ -0,0 +1,42 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +import '../constant/enums/local_keys_enums.dart'; + +class LocaleManager { + LocaleManager._init() { + SharedPreferences.getInstance().then((value) { + _preferences = value; + }); + } + static final LocaleManager _instance = LocaleManager._init(); + + SharedPreferences? _preferences; + + static LocaleManager get instance => _instance; + + static Future prefrencesInit() async { + instance._preferences ??= await SharedPreferences.getInstance(); + } + + void setString(PreferencesKeys key, String value) async { + await _preferences?.setString(key.toString(), value); + } + + void setInt(PreferencesKeys key, int value) async { + await _preferences?.setInt(key.toString(), value); + } + + Future setStringValue(PreferencesKeys key, String value) async { + await _preferences!.setString(key.toString(), value); + } + + String getStringValue(PreferencesKeys key) => + _preferences?.getString(key.toString()) ?? ''; + + int getIntValue(PreferencesKeys key) => + _preferences?.getInt(key.toString()) ?? 0; + + Future deleteStringValue(PreferencesKeys key) async { + await _preferences!.remove(key.toString()); + } +} diff --git a/lib/product/constant/app/api_path_constant.dart b/lib/product/constant/app/api_path_constant.dart new file mode 100644 index 0000000..bcdbeb5 --- /dev/null +++ b/lib/product/constant/app/api_path_constant.dart @@ -0,0 +1,24 @@ +// ignore_for_file: constant_identifier_names + +class APIPathConstants { + static const LOGIN_PATH = "/api/login"; + static const LOGOUT_PATH = "/api/logout"; + static const BELL_NOTIFICATIONS_PATH = "/api/notifications/bell-list"; + static const BELL_UPDATE_READ_NOTIFICATIONS_PATH = + "/api/notifications/bell-read"; + static const DEVICE_NOTIFICATION_SETTINGS = "/api/users/my-device-settings"; + static const DASHBOARD_DEVICES = "/api/dashboard/devices"; + static const USER_PATH = "/api/users"; + static const USER_PROFILE_PATH = "/api/users/profile"; + static const PROVINCES_PATH = "/api/vn/provinces"; + static const DISTRICTS_PATH = "/api/vn/districts"; + static const WARDS_PATH = "/api/vn/wards"; + static const DEVICE_PATH = "/api/devices"; + static const DEVICE_REGISTER_PATH = "/api/devices/register"; + static const DEVICE_UNREGISTER_PATH = "/api/devices/unregister"; + static const ALL_GROUPS_PATH = "/api/groups/user"; + static const GROUPS_PATH = "/api/groups"; + static const JOIN_GROUP_PATH = "/api/groups/join"; + static const APPROVE_GROUP_PATH = "/api/groups/approve"; + static const DEVICE_LOGS_PATH = "/api/device-logs"; +} diff --git a/lib/product/constant/app/app_constants.dart b/lib/product/constant/app/app_constants.dart new file mode 100644 index 0000000..94eab82 --- /dev/null +++ b/lib/product/constant/app/app_constants.dart @@ -0,0 +1,21 @@ +// ignore_for_file: constant_identifier_names + +class ApplicationConstants { + static const APP_NAME = "Smatec SFM"; + static const DOMAIN = "sfm.smatec.com.vn"; + static const MAP_KEY = "AIzaSyDI8b-PUgKUgj5rHdtgEHCwWjUXYJrqYhE"; + static const LOGIN_PATH = "/login"; + static const LOGOUT_PATH = "/logout"; + static const HOME_PATH = "/"; + static const SETTINGS_PATH = "/settings"; + static const BELL_PATH = "/bell"; + static const DEVICES_MANAGER_PATH = "/devices-manager"; + static const DEVICES_UPDATE_PATH = "/device-update"; + static const DEVICES_DETAIL_PATH = "/device"; + static const MAP_PATH = "/map"; + static const DEVICE_LOGS_PATH = "/device-logs"; + static const GROUP_PATH = "/groups"; + static const DEVICE_NOTIFICATIONS_SETTINGS = "/device-notifications-settings"; + static const OWNER_GROUP = "owner"; + static const PARTICIPANT_GROUP = "participant"; +} diff --git a/lib/product/constant/enums/app_route_enums.dart b/lib/product/constant/enums/app_route_enums.dart new file mode 100644 index 0000000..0f3712a --- /dev/null +++ b/lib/product/constant/enums/app_route_enums.dart @@ -0,0 +1,16 @@ +// ignore_for_file: constant_identifier_names + +enum AppRoutes { + LOGIN, + HOME, + SETTINGS, + DEVICE_NOTIFICATION_SETTINGS, + BELL, + DEVICES, + DEVICE_UPDATE, + DEVICE_DETAIL, + MAP, + HISTORY, + GROUPS, + GROUP_DETAIL, +} diff --git a/lib/product/constant/enums/app_theme_enums.dart b/lib/product/constant/enums/app_theme_enums.dart new file mode 100644 index 0000000..a5af3bd --- /dev/null +++ b/lib/product/constant/enums/app_theme_enums.dart @@ -0,0 +1,3 @@ +// ignore_for_file: constant_identifier_names + +enum AppThemes { LIGHT, DARK, SYSTEM } diff --git a/lib/product/constant/enums/local_keys_enums.dart b/lib/product/constant/enums/local_keys_enums.dart new file mode 100644 index 0000000..03cce61 --- /dev/null +++ b/lib/product/constant/enums/local_keys_enums.dart @@ -0,0 +1,10 @@ +// ignore_for_file: constant_identifier_names + +enum PreferencesKeys{ + TOKEN, + UID, + EXP, + ROLE, + LANGUAGE_CODE, + THEME +} \ No newline at end of file diff --git a/lib/product/constant/enums/role_enums.dart b/lib/product/constant/enums/role_enums.dart new file mode 100644 index 0000000..d21e63e --- /dev/null +++ b/lib/product/constant/enums/role_enums.dart @@ -0,0 +1,7 @@ +// ignore_for_file: constant_identifier_names + +enum RoleEnums{ + USER, + ADMIN, + MOD +} \ No newline at end of file diff --git a/lib/product/constant/icon/icon_constants.dart b/lib/product/constant/icon/icon_constants.dart new file mode 100644 index 0000000..37e22f1 --- /dev/null +++ b/lib/product/constant/icon/icon_constants.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +class IconConstants { + IconConstants._init(); + static IconConstants? _instance; + static IconConstants get instance => _instance ??= IconConstants._init(); + + String get logo => getIcon(""); + + String getIcon(String name) => "assets/icons/$name.png"; + + Icon getMaterialIcon(IconData icon) => Icon(icon); +} diff --git a/lib/product/constant/image/image_constants.dart b/lib/product/constant/image/image_constants.dart new file mode 100644 index 0000000..bc889c0 --- /dev/null +++ b/lib/product/constant/image/image_constants.dart @@ -0,0 +1,9 @@ +class ImageConstants { + ImageConstants._init(); + static ImageConstants? _instance; + static ImageConstants get instance => _instance ??= ImageConstants._init(); + + String get logo => getImage(""); + + String getImage(String name) => "assets/images/$name.png"; +} diff --git a/lib/product/constant/lang/language_constants.dart b/lib/product/constant/lang/language_constants.dart new file mode 100644 index 0000000..a50076c --- /dev/null +++ b/lib/product/constant/lang/language_constants.dart @@ -0,0 +1,6 @@ +// ignore_for_file: constant_identifier_names + +class LanguageConstants { + static const ENGLISH = "en"; + static const VIETNAM = "vi"; +} diff --git a/lib/product/constant/navigation/navigation_router.dart b/lib/product/constant/navigation/navigation_router.dart new file mode 100644 index 0000000..0053824 --- /dev/null +++ b/lib/product/constant/navigation/navigation_router.dart @@ -0,0 +1,156 @@ +import 'package:go_router/go_router.dart'; +import 'package:sfm_app/feature/devices/device_detail/device_detail_bloc.dart'; +import 'package:sfm_app/feature/devices/device_detail/device_detail_screen.dart'; +import 'package:sfm_app/feature/settings/device_notification_settings/device_notification_settings_bloc.dart'; +import 'package:sfm_app/feature/settings/device_notification_settings/device_notification_settings_screen.dart'; +import '../app/app_constants.dart'; +import '../../../feature/auth/login/bloc/login_bloc.dart'; +import '../../../feature/auth/login/screen/login_screen.dart'; +import '../../../feature/bell/bell_bloc.dart'; +import '../../../feature/bell/bell_screen.dart'; +import '../../../feature/devices/device_update/device_update_bloc.dart'; +import '../../../feature/devices/device_update/device_update_screen.dart'; +import '../../../feature/devices/devices_manager_bloc.dart'; +import '../../../feature/devices/devices_manager_screen.dart'; +import '../../../feature/error/not_found_screen.dart'; +import '../../../feature/inter_family/group_detail/group_detail_bloc.dart'; +import '../../../feature/inter_family/group_detail/group_detail_screen.dart'; +import '../../../feature/inter_family/inter_family_bloc.dart'; +import '../../../feature/inter_family/inter_family_screen.dart'; +import '../../../feature/log/device_logs_bloc.dart'; +import '../../../feature/log/device_logs_screen.dart'; +import '../../../feature/main/main_bloc.dart'; +import '../../../feature/main/main_screen.dart'; +import '../../../feature/map/map_bloc.dart'; +import '../../../feature/map/map_screen.dart'; +import '../../../feature/settings/settings_bloc.dart'; +import '../../../feature/settings/settings_screen.dart'; +import '../../../product/base/bloc/base_bloc.dart'; +import '../enums/app_route_enums.dart'; +import '../../../product/shared/shared_transition.dart'; + +GoRouter goRouter() { + return GoRouter( + debugLogDiagnostics: true, + errorBuilder: (context, state) => const NotFoundScreen(), + initialLocation: ApplicationConstants.LOGIN_PATH, + routes: [ + GoRoute( + path: ApplicationConstants.LOGIN_PATH, + name: AppRoutes.LOGIN.name, + builder: (context, state) => BlocProvider( + child: const LoginScreen(), + blocBuilder: () => LoginBloc(), + ), + ), + GoRoute( + path: ApplicationConstants.HOME_PATH, + name: AppRoutes.HOME.name, + builder: (context, state) => BlocProvider( + child: const MainScreen(), + blocBuilder: () => MainBloc(), + ), + ), + GoRoute( + path: ApplicationConstants.SETTINGS_PATH, + name: AppRoutes.SETTINGS.name, + pageBuilder: (context, state) => CustomTransitionPage( + child: BlocProvider( + child: const SettingsScreen(), + blocBuilder: () => SettingsBloc(), + ), + transitionsBuilder: transitionsBottomToTop, + ), + ), + GoRoute( + path: ApplicationConstants.BELL_PATH, + name: AppRoutes.BELL.name, + pageBuilder: (context, state) => CustomTransitionPage( + child: BlocProvider( + child: const BellScreen(), + blocBuilder: () => BellBloc(), + ), + transitionsBuilder: transitionsCustom1), + ), + GoRoute( + path: ApplicationConstants.DEVICES_MANAGER_PATH, + name: AppRoutes.DEVICES.name, + builder: (context, state) => BlocProvider( + child: const DevicesManagerScreen(), + blocBuilder: () => DevicesManagerBloc(), + ), + ), + GoRoute( + path: '${ApplicationConstants.DEVICES_UPDATE_PATH}/:thingID', + name: AppRoutes.DEVICE_UPDATE.name, + pageBuilder: (context, state) => CustomTransitionPage( + child: BlocProvider( + child: DeviceUpdateScreen( + thingID: state.pathParameters['thingID']!, + ), + blocBuilder: () => DeviceUpdateBloc(), + ), + transitionsBuilder: transitionsBottomToTop), + ), + GoRoute( + path: '${ApplicationConstants.DEVICES_DETAIL_PATH}/:thingID', + name: AppRoutes.DEVICE_DETAIL.name, + pageBuilder: (context, state) => CustomTransitionPage( + child: BlocProvider( + child: DetailDeviceScreen( + thingID: state.pathParameters['thingID']!, + ), + blocBuilder: () => DetailDeviceBloc(), + ), + transitionsBuilder: transitionsRightToLeft), + ), + GoRoute( + path: ApplicationConstants.MAP_PATH, + name: AppRoutes.MAP.name, + builder: (context, state) => BlocProvider( + child: const MapScreen(), + blocBuilder: () => MapBloc(), + ), + ), + GoRoute( + path: ApplicationConstants.DEVICE_LOGS_PATH, + name: AppRoutes.HISTORY.name, + builder: (context, state) => BlocProvider( + child: const DeviceLogsScreen(), + blocBuilder: () => DeviceLogsBloc(), + ), + ), + GoRoute( + path: ApplicationConstants.GROUP_PATH, + name: AppRoutes.GROUPS.name, + builder: (context, state) => BlocProvider( + child: const InterFamilyScreen(), + blocBuilder: () => InterFamilyBloc(), + ), + ), + GoRoute( + path: '${ApplicationConstants.GROUP_PATH}/:groupId', + name: AppRoutes.GROUP_DETAIL.name, + pageBuilder: (context, state) { + final groupId = state.pathParameters['groupId']!; + final role = state.extra! as String; + return CustomTransitionPage( + child: BlocProvider( + child: DetailGroupScreen(group: groupId, role: role), + blocBuilder: () => DetailGroupBloc(), + ), + transitionsBuilder: transitionsRightToLeft); + }), + GoRoute( + path: ApplicationConstants.DEVICE_NOTIFICATIONS_SETTINGS, + name: AppRoutes.DEVICE_NOTIFICATION_SETTINGS.name, + pageBuilder: (context, state) => CustomTransitionPage( + child: BlocProvider( + child: const DeviceNotificationSettingsScreen(), + blocBuilder: () => DeviceNotificationSettingsBloc(), + ), + transitionsBuilder: transitionsRightToLeft), + ), + ], + ); +} diff --git a/lib/product/constant/status_code/status_code_constants.dart b/lib/product/constant/status_code/status_code_constants.dart new file mode 100644 index 0000000..5a6873a --- /dev/null +++ b/lib/product/constant/status_code/status_code_constants.dart @@ -0,0 +1,7 @@ +// ignore_for_file: constant_identifier_names + +class StatusCodeConstants { + static const CREATED = 201; + static const OK = 200; + static const BAD_REQUEST = 400; +} diff --git a/lib/product/extention/context_extention.dart b/lib/product/extention/context_extention.dart new file mode 100644 index 0000000..75eaaab --- /dev/null +++ b/lib/product/extention/context_extention.dart @@ -0,0 +1,103 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import '../theme/app_theme_light.dart'; + +// MEDIA +extension ContextExtension on BuildContext { + MediaQueryData get mediaQuery => MediaQuery.of(this); +} + +// VALUES +extension MediaQueryExtension on BuildContext { + double get height => mediaQuery.size.height; + double get width => mediaQuery.size.width; + + double get lowValue => height * 0.01; + double get normalValue => height * 0.02; + double get mediumValue => height * 0.04; + double get highValue => height * 0.1; + + double dynamicWidth(double val) => width * val; + double dynamicHeight(double val) => height * val; +} + +// THEME +extension ThemeExtension on BuildContext { + ThemeData get theme => Theme.of(this); + TextTheme get textTheme => theme.textTheme; + ColorScheme get colors => AppThemeLight.instance.theme.colorScheme; +} + +// PADDING ALLL +extension PaddingExtensionAll on BuildContext { + EdgeInsets get paddingLow => EdgeInsets.all(lowValue); + EdgeInsets get paddingNormal => EdgeInsets.all(normalValue); + EdgeInsets get paddingMedium => EdgeInsets.all(mediumValue); + EdgeInsets get paddingHigh => EdgeInsets.all(highValue); + EdgeInsets dynamicPadding(double val) => EdgeInsets.all(val); + // double dynamicPadding(double val) => height * val; +} + +// PADDING SYMETRIC +extension PaddingExtensionSymetric on BuildContext { + // VERTICAL PADDİNG + EdgeInsets get paddingLowVertical => EdgeInsets.symmetric(vertical: lowValue); + EdgeInsets get paddingNormalVertical => + EdgeInsets.symmetric(vertical: normalValue); + EdgeInsets get paddingMediumVertical => + EdgeInsets.symmetric(vertical: mediumValue); + EdgeInsets get paddingHighVertical => + EdgeInsets.symmetric(vertical: highValue); + + // HORIZONTAL PADDİNG + EdgeInsets get paddingLowHorizontal => + EdgeInsets.symmetric(horizontal: lowValue); + EdgeInsets get paddingNormalHorizontal => + EdgeInsets.symmetric(horizontal: normalValue); + EdgeInsets get paddingMediumHorizontal => + EdgeInsets.symmetric(horizontal: mediumValue); + EdgeInsets get paddingHighHorizontal => + EdgeInsets.symmetric(horizontal: highValue); +} + +// RANDOM COLOR +extension PageExtension on BuildContext { + Color get randomColor => Colors.primaries[Random().nextInt(17)]; +} + +// DURATION +extension DurationExtension on BuildContext { + Duration get lowDuration => const Duration(milliseconds: 150); + Duration get normalDuration => const Duration(milliseconds: 500); + Duration dynamicSecondDuration(int seconds) => Duration(seconds: seconds); + Duration dynamicMinutesDuration(int minutes) => Duration(minutes: minutes); + +} + +// RADIUS +extension RadiusExtension on BuildContext { + Radius get lowRadius => Radius.circular(width * 0.02); + Radius get normalRadius => Radius.circular(width * 0.05); + Radius get highRadius => Radius.circular(width * 0.1); +} + +extension TextStyleExtention on BuildContext { + TextStyle get labelSmallTextStyle => Theme.of(this).textTheme.labelSmall!; + TextStyle get labelMediumTextStyle => Theme.of(this).textTheme.labelMedium!; + TextStyle get labelLargeTextStyle => Theme.of(this).textTheme.labelLarge!; + TextStyle get bodySmallTextStyle => Theme.of(this).textTheme.bodySmall!; + TextStyle get bodyMediumTextStyle => Theme.of(this).textTheme.bodyMedium!; + TextStyle get bodyLargeTextStyle => Theme.of(this).textTheme.bodyLarge!; + TextStyle get titleSmallTextStyle => Theme.of(this).textTheme.titleSmall!; + TextStyle get titleMediumTextStyle => Theme.of(this).textTheme.titleMedium!; + TextStyle get titleLargeTextStyle => Theme.of(this).textTheme.titleLarge!; + TextStyle get headlineSmallTextStyle => + Theme.of(this).textTheme.headlineSmall!; + TextStyle get headlineMediumTextStyle => + Theme.of(this).textTheme.headlineMedium!; + TextStyle get headlineLargeTextStyle => + Theme.of(this).textTheme.headlineLarge!; +} + diff --git a/lib/product/lang/l10n/app_en.arb b/lib/product/lang/l10n/app_en.arb new file mode 100644 index 0000000..508bf46 --- /dev/null +++ b/lib/product/lang/l10n/app_en.arb @@ -0,0 +1,242 @@ +{ + "description_NOTUSE": "This is english language in HomePage", + "home_page_name": "Home Page", + "vietnam_language": "Vietnamese", + "english_language": "English", + "notification": "Notifications:", + "profile_icon_title": "Settings", + "log_out": "Log out", + "log_out_content": "Are you sure you want to log out?", + "notification_description": "All devices are operating normally", + "button_fake_fire_message": "False fire alarm", + "in_progress_message": "In progress", + "smoke_detecting_message": "Smoke detecting!", + "smoke_detecting_message_lowercase": "smoke detecting!", + "disconnect_message_uppercase": "Disconnected", + "disconnect_message_lowercase": "disconnected", + "location_message": "Address: ", + "confirm_fake_fire_message": "Are you sure the fire is a false alarm?", + "confirm_fake_fire_body": "Please check carefully to ensure that this is just a normal incident. The fire department will confirm that this is a false alarm!", + "confirm_fake_fire_sure_message": "I''m sure", + "let_PCCC_handle_message": "Let the Fire Prevention and Fighting Team handle it!", + "overview_message": "Overview", + "total_nof_devices_message": "Total number of devices", + "active_devices_message": "Active", + "inactive_devices_message": "Inactive", + "warning_devices_message": "Warning", + "unused_devices_message": "Unused", + "description_NOTUSE1": "This is english language in DeviceManagerPage", + "device_manager_page_name": "Devices Manager", + "add_device_title": "Add new device", + "input_extID_device_input": "Devcice ID", + "input_extID_device_hintText": "Enter the device ID", + "input_name_device_device": "Device Name", + "input_name_device_hintText": "Enter the device Name", + "paginated_data_table_title": "List of devices", + "paginated_data_table_column_action": "Action", + "paginated_data_table_column_deviceName": "Device name", + "paginated_data_table_column_deviceStatus": "Status", + "paginated_data_table_column_deviceBaterry": "Battery", + "paginated_data_table_column_deviceSignal": "Signal", + "paginated_data_table_column_deviceTemperature": "Temperature", + "paginated_data_table_column_deviceHump": "Humidity", + "paginated_data_table_column_devicePower": "Power", + "delete_device_dialog_title": "Remove device", + "delete_device_dialog_content": "Are you sure you want to delete this device?", + "update_device_dialog_title": "Update device", + "update_device_dialog_location_title": "Device location", + "update_device_dialog_location_longitude": "Longitude", + "update_device_dialog_location_latitude": "Latitude", + "update_device_dialog_location_longitude_hintText": "Enter longitude", + "update_device_dialog_location_latitude_hintText": "Enter latitude", + "update_device_dialog_location_province_hintText": "Select Province/City", + "update_device_dialog_location_province_searchHint": "Find Province/City", + "update_device_dialog_location_district_hintText": "Select District", + "update_device_dialog_location_district_searchHint": "Find district", + "update_device_dialog_location_ward_hintText": "Select Ward/Commune", + "update_device_dialog_location_ward_searchHint": "Find Ward/Commune", + "update_device_dialog_maps_dialog_title": "Update location", + "update_device_dialog_search_location_hint": "Search Location", + "description_NOTUSE8": "This is english language in MapPositionPage", + "map_your_location": "Your Location", + "map_show_direction": "Give directions", + "map_nearby_hospital": "Nearby hospital", + "map_nearest_hospital": "Nearest hospital", + "map_nearby_firestation": "Nearby fire station", + "map_nearest_firestation": "Nearest fire station", + "map_result": "Result", + "map_always_opened": "Always open", + "map_openning": "Openning", + "map_closed": "Closed", + "map_no_results": "No results found", + "map_start": "Start", + "map_destination": "Destination", + "map_stream": "Stream", + "description_NOTUSE2": "This is english language in DeviceLogPage", + "device_log_page_name": "Devices Log", + "choose_device_dropdownButton": "Select device", + "choose_date_start_datePicker": "Start from", + "choose_date_end_datePicker": "End", + "main_no_data": "No data yet.", + "description_NOTUSE3": "This is english language in InterFamily", + "interfamily_page_name": "InterFamily", + "my_group_title": "My group", + "invite_group": "Joined group", + "add_new_group": "Add new group", + "join_group": "Join group", + "group_name_title": "Group Name", + "group_id_title": "Group ID", + "add_new_user_title": "Add user", + "share_group_title": "Share group", + "change_group_infomation_title": "Change Infomation", + "change_group_infomation_content": "Change group infomation", + "delete_group_title": "Delete group", + "delete_group_content": "Are you sure you want to delete this group?", + "leave_group_content": "Are you sure you want to leave this group?", + "dont_have_group": "No group yet", + "dont_join_group": "You haven''t joined any groups yet.", + "description_group": "Description", + "add_new_device_title": "Add new device", + "approve_user": "Approve members", + "devices_title": "Devices", + "device_title": "Device", + "member_title": "Members", + "leave_group_title": "Leave group", + "dont_have_device": "No device yet", + "description_NOTUSE4": "This is english language in ProfilePage", + "profile_page_title": "Settings Page", + "profile_change_info": "Change information", + "profile_change_pass": "Change password", + "profile_setting": "Notification Setting", + "change_profile_title": "Personal information", + "change_profile_username": "Username: ", + "change_profile_username_hint": "Enter username ", + "change_profile_email": "Email: ", + "change_profile_email_hint": "Enter email ", + "change_profile_email_not_empty": "Email cannot be empty", + "change_profile_tel": "Phone number: ", + "change_profile_tel_hint": "Enter phone number", + "change_profile_tel_not_empty": "Phone number cannot be empty", + "change_profile_address": "Address: ", + "change_profile_address_hint": "Enter address", + "change_profile_old_pass": "Password: ", + "change_profile_old_pass_hint": "Enter password", + "change_profile_old_pass_not_empty": "Old password cannot be empty", + "change_profile_new_pass": "New password: ", + "change_profile_new_pass_hint": "Enter new password", + "change_profile_new_pass_not_empty": "New password cannot be empty", + "change_profile_device_notification_select_all": "Select all", + "change_profile_device_notification_deselect_all": "Deselect all", + "description_NOTUSE5": "This is english language in BellPage", + "bell_page_title": "Notifications", + "bell_page_no_items_body": "No notifications yet", + "bell_user_uppercase": "User", + "bell_battery_device": "Device Battery", + "bell_user_joined_group": "joined group", + "bell_leave_group": "left group", + "bell_user_added_group": "added to the group", + "bell_user_kick_group": "removed from the group", + "bell_operate_normal": "operating normally", + "bell_invalid_code": "Invalid event code", + "bell_days_ago": "days ago", + "bell_hours_ago": "hours ago", + "bell_minutes_ago": "minutes ago", + "bell_just_now": "just now", + "bell_read_all": "You have read all the notifications", + "description_NOTUSE6": "This is english language in GlobalFunction", + "gf_newly_create_message": "Newly created", + "gf_disconnect_message": "Disconnected", + "gf_smoke_detected_message": "Smoke detected", + "gf_no_signal_message": "No Signal", + "gf_weak_signal_message": "Weak Signal", + "gf_moderate_signal_message": "Moderate signal", + "gf_good_signal_message": "Good signal", + "gf_volt_detect_message": "Voltage detected", + "gf_temp_detect_message": "Temperature detected", + "gf_hum_detect_message": "Humidity detected", + "gf_battery_detect_message": "Battery detected", + "gf_offline_message": "Offline", + "gf_in_firefighting_message": "In firefighting", + "gf_device_error_message": "Device error", + "gf_not_move_message": "Not moved", + "gf_moving_message": "Moved", + "gf_remove_from_base_message": "Removed from the base", + "gf_connected_lowercase": "connected", + "description_NOTUSE7": "This is english language in LoginPage", + "login_account_not_empty": "Account cannot be empty", + "login_account_hint": "Account", + "login_password_not_empty": "Password cannot be empty", + "login_password_hint": "Password", + "login_success_message": "Login successful", + "login_incorrect_usernameOrPass": "Incorrect account or password", + "login_button_content": "Login", + "description_NOTUSE9": "This is english language in DeviceUpdatePage", + "device_update_title": "Update Device", + "device_update_location": "Device Location", + "device_update_province": "Province/City", + "device_update_district": "District", + "device_update_ward": "Ward/Commune", + "description_NOTUSE10": "This is english language in DetailDevicePage", + "detail_device_dont_has_location_message": "No location information available yet", + "no_data_message": "No data yet", + "normal_message": "Normal", + "warning_status_message": "Warning", + "undefine_message": "Undefined", + "low_message_uppercase": "Low", + "moderate_message_uppercase": "Moderate", + "good_message_uppercase": "Good", + "low_message_lowercase": "low", + "moderate_message_lowercase": "moderate", + "good_message_lowercase": "good", + "error_message_uppercase": "Error", + "error_message_lowercase": "error", + "warning_message": "Warning: ", + "loading_message": "Loading...", + "detail_message": "Detail", + "decline_message": "DECLINE", + "allow_message": "ALLOW", + "add_button_content": "Add", + "update_button_content": "Update", + "change_button_content": "Change", + "confirm_button_content": "Confirm", + "delete_button_content": "Delete", + "cancel_button_content": "Cancel", + "find_button_content": "Find", + "home_page_destination": "Home", + "manager_page_destination": "Manager", + "map_page_destination": "Map", + "history_page_destination": "History", + "history_page_destination_tooltip": "Device history", + "group_page_destination": "Group", + "group_page_destination_tooltip": "Exchange device notifications", + "notification_enter_all_inf": "Please enter all the required information", + "notification_update_device_success": "Device update successfully", + "notification_update_device_failed": "Device update failed", + "notification_update_device_error": "Device update Error", + "notification_cannot_find_address_from_location": "Can''t find the location", + "notification_add_device_success": "Device added successfully", + "notification_add_device_failed": "Failed to add device", + "notification_create_device_success": "Device created successfully", + "notification_create_device_failed": "Failed to create device", + "notification_delete_device_success": "Device deleted successfully", + "notification_delete_device_failed": "Failed to delete device", + "notification_device_not_exist": "The device does not exist", + "notification_add_group_success": "Group created successfully", + "notification_add_group_failed": "Failed to create group", + "notification_update_group_success": "Group updated successfully", + "notification_update_group_failed": "Failed to updated group", + "notification_delete_group_success": "Group deleted successfully", + "notification_delete_group_failed": "Failed to delete group", + "notification_leave_group_success": "Leave group successfully", + "notification_leave_group_failed": "Failed to leave group", + "notification_join_request_group_success": "Group join request successful!", + "notification_join_request_group_failed": "Group join request failed!", + "notification_update_profile_success": "Update profile successfully", + "notification_update_profile_failed": "Failed to update profile", + "notification_update_password_success": "Change password successfully", + "notification_update_password_failed": "The old password does not match", + "notification_update_device_settings_success": "Device notification updated successfully", + "notification_update_device_settings_failed": "Failed to update device notification", + "notification_confirm_fake_fire_success": "Information has been updated to the Fire Station", + "notification_confirm_fake_fire_failed": "Failed to update confirm fake fire" +} diff --git a/lib/product/lang/l10n/app_vi.arb b/lib/product/lang/l10n/app_vi.arb new file mode 100644 index 0000000..f395858 --- /dev/null +++ b/lib/product/lang/l10n/app_vi.arb @@ -0,0 +1,242 @@ +{ + "description_NOTUSE": "This is VietNam language in HomePage", + "home_page_name": "Trang chủ", + "vietnam_language": "Tiếng Việt", + "english_language": "Tiếng Anh", + "notification": "Thông báo:", + "profile_icon_title": "Cài đặt", + "log_out": "Đăng xuất", + "log_out_content": "Bạn chắc chắn muốn đăng xuất?", + "notification_description": "Tất cả thiết bị hoạt động bình thường", + "button_fake_fire_message": "Cháy giả?", + "in_progress_message": "Đang xử lý", + "smoke_detecting_message": "Phát hiện khói!", + "smoke_detecting_message_lowercase": "Phát hiện khói!", + "disconnect_message_uppercase": "Mất kết nối", + "disconnect_message_lowercase": "mất kết nối", + "location_message": "Địa chỉ: ", + "confirm_fake_fire_message": "Bạn chắc chắn đám cháy là cháy giả?", + "confirm_fake_fire_body": "Bạn hãy kiểm tra thật kỹ để chắc chắn rằng đây chỉ là sự cố bình thường. Đội PCCC sẽ xác nhận đây là đám cháy giả!", + "confirm_fake_fire_sure_message": "Tôi chắc chắn", + "let_PCCC_handle_message": "Hãy để Đội PCCC xử lý!", + "overview_message": "Tổng quan", + "total_nof_devices_message": "Tổng số", + "active_devices_message": "Đang hoạt động", + "inactive_devices_message": "Đang tắt", + "warning_devices_message": "Cảnh báo", + "unused_devices_message": "Không sử dụng", + "description_NOTUSE1": "This is vietnamese language in DeviceManagerPage", + "device_manager_page_name": "Quản lý thiết bị", + "add_device_title": "Thêm thiết bị", + "input_extID_device_input": "Mã thiết bị", + "input_extID_device_hintText": "Nhập mã thiết bị", + "input_name_device_device": "Tên thiết bị", + "input_name_device_hintText": "Nhập tên thiết bị", + "paginated_data_table_title": "Danh sách thiết bị", + "paginated_data_table_column_action": "Thao tác", + "paginated_data_table_column_deviceName": "Tên thiết bị", + "paginated_data_table_column_deviceStatus": "Tình trạng", + "paginated_data_table_column_deviceBaterry": "Mức pin", + "paginated_data_table_column_deviceSignal": "Mức sóng", + "paginated_data_table_column_deviceTemperature": "Nhiệt độ", + "paginated_data_table_column_deviceHump": "Độ ẩm", + "paginated_data_table_column_devicePower": "Nguồn", + "delete_device_dialog_title": "Xóa thiết bị", + "delete_device_dialog_content": "Bạn có chắc chắn muốn xóa thiết bị này?", + "update_device_dialog_title": "Sửa thiết bị", + "update_device_dialog_location_title": "Ví trí thiết bị", + "update_device_dialog_location_longitude": "Kinh độ", + "update_device_dialog_location_latitude": "Vĩ độ", + "update_device_dialog_location_longitude_hintText": "Nhập kinh độ", + "update_device_dialog_location_latitude_hintText": "Nhập vĩ độ", + "update_device_dialog_location_province_hintText": "Chọn Tỉnh/Thành phố", + "update_device_dialog_location_province_searchHint": "Tìm Tỉnh/Thành phố", + "update_device_dialog_location_district_hintText": "Chọn Quận/Huyện", + "update_device_dialog_location_district_searchHint": "Tìm Quận/Huyện", + "update_device_dialog_location_ward_hintText": "Chọn Phường/Xã", + "update_device_dialog_location_ward_searchHint": "Tìm Phường/Xã", + "update_device_dialog_maps_dialog_title": "Cập nhật vị trí", + "update_device_dialog_search_location_hint": "Tìm kiếm địa chỉ", + "description_NOTUSE8": "This is vietnamese language in MapPositionPage", + "map_your_location": "Vị trí của bạn", + "map_show_direction": "Chỉ đường", + "map_nearby_hospital": "Bệnh viện gần đó", + "map_nearest_hospital": "Bệnh viện gần nhất", + "map_nearby_firestation": "Trạm cứu hỏa gần đó", + "map_nearest_firestation": "Trạm cứu hỏa gần nhất", + "map_result": "Kết quả", + "map_always_opened": "Luôn mở cửa", + "map_openning": "Đang mở cửa", + "map_closed": "Đóng cửa", + "map_no_results": "Không tìm thấy kết quả", + "map_start": "Xuất phát", + "map_destination": "Đích đến", + "map_stream": "Trực tiếp", + "description_NOTUSE2": "This is vietnamese language in DeviceLogPage", + "device_log_page_name": "Lịch sử thiết bị", + "choose_device_dropdownButton": "Chọn thiết bị", + "choose_date_start_datePicker": "Bắt đầu từ", + "choose_date_end_datePicker": "Kết thúc", + "main_no_data": "Chưa có dữ liệu.", + "description_NOTUSE3": "This is vietnamese language in InterFamily", + "interfamily_page_name": "Liên gia", + "my_group_title": "Group của tôi", + "invite_group": "Group tham gia", + "add_new_group": "Thêm nhóm mới", + "join_group": "Tham gia nhóm", + "group_name_title": "Tên nhóm", + "group_id_title": "ID nhóm", + "add_new_user_title": "Thêm người dùng", + "share_group_title": "Chia sẻ nhóm", + "change_group_infomation_title": "Đổi thông tin", + "change_group_infomation_content": "Chỉnh sửa thông tin nhóm", + "delete_group_title": "Xóa nhóm", + "delete_group_content": "Bạn chắc chắn muốn xóa nhóm này?", + "leave_group_content": "Bạn chắc chắn muốn rời nhóm?", + "dont_have_group": "Chưa có nhóm", + "dont_join_group": "Bạn chưa tham gia nhóm nào", + "description_group": "Mô tả", + "add_new_device_title": "Thêm thiết bị mới", + "approve_user": "Duyệt thành viên", + "devices_title": "Thiết bị", + "device_title": "Thiết bị", + "member_title": "Thành viên", + "leave_group_title": "Rời nhóm", + "dont_have_device": "Chưa có thiết bị", + "description_NOTUSE4": "This is vietnamese language in ProfilePage", + "profile_page_title": "Cài đặt", + "profile_change_info": "Đổi thông tin cá nhân", + "profile_change_pass": "Đổi mật khẩu", + "profile_setting": "Cài đặt thông báo", + "change_profile_title": "Thông tin người dùng", + "change_profile_username": "Tên người dùng: ", + "change_profile_username_hint": "Nhập tên ", + "change_profile_email": "Email: ", + "change_profile_email_hint": "Nhập email ", + "change_profile_email_not_empty": "Email không được để trống", + "change_profile_tel": "Số điện thoại: ", + "change_profile_tel_hint": "Nhập số điện thoại", + "change_profile_tel_not_empty": "Số điện thoại không được để trống", + "change_profile_address": "Địa chỉ: ", + "change_profile_address_hint": "Nhập địa chỉ", + "change_profile_old_pass": "Mật khẩu cũ: ", + "change_profile_old_pass_hint": "Nhập mật khẩu cũ", + "change_profile_old_pass_not_empty": "Mật khẩu không được để trống", + "change_profile_new_pass": "Mật khẩu mới: ", + "change_profile_new_pass_hint": "Nhập mật khẩu mới", + "change_profile_new_pass_not_empty": "Mật khẩu không được để trống", + "change_profile_device_notification_select_all": "Chọn tất cả", + "change_profile_device_notification_deselect_all": "Bỏ chọn tất cả", + "description_NOTUSE5": "This is vietnamese language in BellPage", + "bell_page_title": "Thông báo", + "bell_page_no_items_body": "Chưa có thông báo", + "bell_user_uppercase": "Người dùng", + "bell_battery_device": "Pin thiết bị", + "bell_user_joined_group": "đã tham gia nhóm", + "bell_leave_group": "đã rời nhóm", + "bell_user_added_group": "đã được thêm vào nhóm", + "bell_user_kick_group": "đã bị xóa khỏi nhóm", + "bell_operate_normal": "hoạt động bình thường", + "bell_invalid_code": "Mã sự kiện không hợp lệ", + "bell_days_ago": "ngày trước", + "bell_hours_ago": "giờ trước", + "bell_minutes_ago": "phút trước", + "bell_just_now": "Vừa xong", + "bell_read_all": "Bạn đã xem hết thông báo", + "description_NOTUSE6": "This is vietnamese language in GlobalFunction", + "gf_newly_create_message": "Mới tạo", + "gf_disconnect_message": "Mất kết nối", + "gf_smoke_detected_message": "Đang hoạt động", + "gf_no_signal_message": "Không có sóng", + "gf_weak_signal_message": "Mức sóng yếu", + "gf_moderate_signal_message": "Mức sóng khá", + "gf_good_signal_message": "Mức sóng tốt", + "gf_volt_detect_message": "Có điện thế", + "gf_temp_detect_message": "Có nhiệt độ", + "gf_hum_detect_message": "Có độ ẩm", + "gf_battery_detect_message": "Có mức pin", + "gf_offline_message": "Không hoạt động", + "gf_in_firefighting_message": "Đang chữa cháy", + "gf_device_error_message": "Thiết bị lỗi", + "gf_not_move_message": "Chưa di chuyển", + "gf_moving_message": "Đã di chuyển", + "gf_remove_from_base_message": "Bị tháo khỏi đế", + "gf_connected_lowercase": "đã kết nối", + "description_NOTUSE7": "This is vietnamese language in LoginPage", + "login_account_not_empty": "Tài khoản không được để trống", + "login_account_hint": "Tài khoản", + "login_password_not_empty": "Mật khẩu không được để trống", + "login_password_hint": "Mật khẩu", + "login_success_message": "Đăng nhập thành công", + "login_incorrect_usernameOrPass": "Tài khoản hoặc mật khẩu không đúng", + "login_button_content": "Đăng nhập", + "description_NOTUSE9": "This is vietnamese language in DeviceUpdatePage", + "device_update_title": "Chỉnh sửa chi tiết thiết bị", + "device_update_location": "Vị trí thiết bị", + "device_update_province": "Tỉnh/Thành phố", + "device_update_district": "Quận/Huyện", + "device_update_ward": "Phường/Xã", + "description_NOTUSE10": "This is vietnamese language in DetailDevicePage", + "detail_device_dont_has_location_message": "Chưa có thông tin về vị trí", + "no_data_message": "Chưa có", + "normal_message": "Bình thường", + "warning_status_message": "Cảnh báo", + "undefine_message": "Không xác định", + "low_message_uppercase": "Yếu", + "moderate_message_uppercase": "Khá", + "good_message_uppercase": "Tốt", + "low_message_lowercase": "yếu", + "moderate_message_lowercase": "khá", + "good_message_lowercase": "tốt", + "error_message_uppercase": "Lỗi", + "error_message_lowercase": "lỗi", + "warning_message": "Cảnh báo:", + "loading_message": "Đang tải...", + "detail_message": "Chi tiết", + "decline_message": "TỪ CHỐI", + "allow_message": "CHO PHÉP", + "add_button_content": "Thêm", + "update_button_content": "Cập nhật", + "change_button_content": "Chỉnh sửa", + "confirm_button_content": "Xác nhận", + "delete_button_content": "Xóa", + "cancel_button_content": "Hủy", + "find_button_content": "Tìm", + "home_page_destination": "Trang chủ", + "manager_page_destination": "Quản lý", + "map_page_destination": "Bản đồ", + "history_page_destination": "Lịch sử", + "history_page_destination_tooltip": "Lịch sử thiết bị", + "group_page_destination": "Nhóm", + "group_page_destination_tooltip": "Trao đổi thông báo thiết bị", + "notification_enter_all_inf": "Vui lòng điền đầy đủ thông tin", + "notification_update_device_success": "Cập nhật thiết bị thành công", + "notification_update_device_failed": "Cập nhật thiết bị thất bại", + "notification_update_device_error": "Cập nhật lỗi", + "notification_cannot_find_address_from_location": "Không tìm được vị trí", + "notification_add_device_success": "Thêm thiết bị thành công", + "notification_add_device_failed": "Thêm thiết bị thất bại", + "notification_create_device_success": "Tạo thiết bị thành công", + "notification_create_device_failed": "Tạo thiết bị thất bại", + "notification_delete_device_success": "Xóa thiết bị thành công", + "notification_delete_device_failed": "Xóa thiết bị thất bại", + "notification_device_not_exist": "Thiết bị không tồn tại", + "notification_add_group_success": "Tạo nhóm thành công", + "notification_add_group_failed": "Tạo nhóm thất bại", + "notification_update_group_success": "Sửa nhóm thành công", + "notification_update_group_failed": "Sửa nhóm thất bại", + "notification_delete_group_success": "Xóa nhóm thành công", + "notification_delete_group_failed": "Xóa nhóm thất bại", + "notification_leave_group_success": "Rời nhóm thành công", + "notification_leave_group_failed": "Rời nhóm thất bại", + "notification_join_request_group_success": "Yêu cầu tham gia nhóm thành công!", + "notification_join_request_group_failed": "Yêu cầu tham gia nhóm thất bại!", + "notification_update_profile_success": "Sửa thông tin thành công", + "notification_update_profile_failed": "Sửa thông tin thất bại", + "notification_update_password_success": "Đổi mật khẩu thành công", + "notification_update_password_failed": "Mật khẩu cũ không khớp", + "notification_update_device_settings_success": "Cập nhật thông báo cho thiết bị thành công", + "notification_update_device_settings_failed": "Cập nhật thông báo cho thiết bị thất bại", + "notification_confirm_fake_fire_success": "Đã cập nhật thông tin đến đội PCCC", + "notification_confirm_fake_fire_failed": "Cập nhật cháy giả thất bại" +} diff --git a/lib/product/lang/language_model.dart b/lib/product/lang/language_model.dart new file mode 100644 index 0000000..ec5a7be --- /dev/null +++ b/lib/product/lang/language_model.dart @@ -0,0 +1,18 @@ +import 'package:sfm_app/product/constant/icon/icon_constants.dart'; +import 'package:sfm_app/product/constant/lang/language_constants.dart'; + +class Language { + final int id; + final String imgageIcon; + final String name; + final String languageCode; + + Language(this.id, this.imgageIcon, this.name, this.languageCode); + + static List languages() { + return [ + Language(1, IconConstants.instance.getIcon("vi_icon"), "vn", LanguageConstants.VIETNAM), + Language(2, IconConstants.instance.getIcon("en_icon"), "en", LanguageConstants.VIETNAM), + ]; + } +} diff --git a/lib/product/network/network_manager.dart b/lib/product/network/network_manager.dart new file mode 100644 index 0000000..afbfd8f --- /dev/null +++ b/lib/product/network/network_manager.dart @@ -0,0 +1,114 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:sfm_app/product/constant/status_code/status_code_constants.dart'; + +import '../cache/local_manager.dart'; +import '../constant/app/app_constants.dart'; +import '../constant/enums/local_keys_enums.dart'; +import 'package:http/http.dart' as http; + +class NetworkManager { + NetworkManager._init(); + static NetworkManager? _instance; + static NetworkManager? get instance => _instance ??= NetworkManager._init(); + + Future> getHeaders() async { + String? token = + LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN); + Map headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + "Access-Control-Allow-Credentials": "false", + "Access-Control-Allow-Headers": + "Origin,Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,locale", + 'Access-Control-Allow-Origin': "*", + 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE', + 'Authorization': token, + }; + return headers; + } + + /// Retrieves data from the server using a GET request. + /// + /// [path] is the endpoint for the request. Returns the response body as a + /// [String] if the request is successful (status code 200), or an empty + /// string if the request fails + Future getDataFromServer(String path) async { + final url = Uri.https(ApplicationConstants.DOMAIN, path); + log("GET url: $url"); + final headers = await getHeaders(); + final response = await http.get(url, headers: headers); + if (response.statusCode == StatusCodeConstants.OK || + response.statusCode == StatusCodeConstants.CREATED) { + return response.body; + } else { + return ""; + } + } + + /// Sends a GET request to the server with the specified parameters. + /// + /// This function constructs a URL from the provided [path] and [params], + /// then sends an HTTP GET request to the server. If the response has a + /// status code of 200, the function returns the response body. + /// Otherwise, it returns an empty string. + /// + /// [path] is the endpoint on the server. + /// [params] is a map containing query parameters for the request. + /// + /// Returns a [Future] containing the server response body. + Future getDataFromServerWithParams( + String path, Map params) async { + final url = Uri.https(ApplicationConstants.DOMAIN, path, params); + log("GET Params url: $url"); + final headers = await getHeaders(); + final response = await http.get(url, headers: headers); + if (response.statusCode == StatusCodeConstants.CREATED || + response.statusCode == StatusCodeConstants.OK) { + return response.body; + } else { + return ""; + } + } + + /// Creates new data on the server using a POST request. + /// + /// [path] is the endpoint for the request, and [body] contains the data + /// to be sent. Returns the HTTP status code of the response. + Future createDataInServer(String path, Map body) async { + final url = Uri.https(ApplicationConstants.DOMAIN, path); + log("POST url: $url"); + final headers = await getHeaders(); + final response = + await http.post(url, headers: headers, body: jsonEncode(body)); + return response.statusCode; + } + + /// Updates existing data on the server using a PUT request. + /// + /// [path] is the endpoint for the request, and [body] contains the data + /// to be updated. Returns the HTTP status code of the response. + Future updateDataInServer(String path, Map body) async { + final url = Uri.https(ApplicationConstants.DOMAIN, path); + log("PUT url: $url"); + final headers = await getHeaders(); + final response = + await http.put(url, headers: headers, body: jsonEncode(body)); + return response.statusCode; + } + + /// Deletes data from the server using a DELETE request. + /// + /// [path] is the endpoint for the request. Returns the HTTP status code + /// of the response, indicating the result of the deletion operation. + /// A status code of 200 indicates success, while other codes indicate + /// failure or an error. + Future deleteDataInServer(String path) async { + final url = Uri.https(ApplicationConstants.DOMAIN, path); + log("DELETE url: $url"); + final headers = await getHeaders(); + final response = await http.delete(url, headers: headers); + return response.statusCode; + } +} diff --git a/lib/product/permission/notification_permission.dart b/lib/product/permission/notification_permission.dart new file mode 100644 index 0000000..23d5b75 --- /dev/null +++ b/lib/product/permission/notification_permission.dart @@ -0,0 +1,31 @@ +import 'dart:developer'; + +import 'package:app_settings/app_settings.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import '../base/widget/dialog/request_permission_dialog.dart'; + +class NotificationPermission { + FirebaseMessaging messaging = FirebaseMessaging.instance; + void requestNotificationsPermission(BuildContext context) async { + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: true, + sound: true); + if (settings.authorizationStatus == AuthorizationStatus.authorized) { + log("NotificationsPermission: User granted permission"); + } else if (settings.authorizationStatus == + AuthorizationStatus.provisional) { + log("NotificationsPermission: User granted provisional permission"); + } else { + log("NotificationsPermission: User denied permission"); + // ignore: use_build_context_synchronously + RequestPermissionDialog().showRequestPermissionDialog(context, + Icons.location_on_outlined, "ABCDE", AppSettingsType.notification); + } + } +} diff --git a/lib/product/services/api_services.dart b/lib/product/services/api_services.dart new file mode 100644 index 0000000..e6fe8fa --- /dev/null +++ b/lib/product/services/api_services.dart @@ -0,0 +1,386 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:http/http.dart' as http; +import '../constant/app/api_path_constant.dart'; +import '../shared/shared_snack_bar.dart'; +import '../constant/enums/app_route_enums.dart'; +import 'language_services.dart'; +import '../../feature/bell/bell_model.dart'; +import '../cache/local_manager.dart'; +import '../constant/app/app_constants.dart'; +import '../constant/enums/local_keys_enums.dart'; +import '../network/network_manager.dart'; + +class APIServices { + Map headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + "Access-Control-Allow-Credentials": "false", + "Access-Control-Allow-Headers": + "Origin,Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,locale", + 'Access-Control-Allow-Origin': "*", + 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE', + }; + + Future> getHeaders() async { + String? token = + LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN); + Map headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + "Access-Control-Allow-Credentials": "false", + "Access-Control-Allow-Headers": + "Origin,Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,locale", + 'Access-Control-Allow-Origin': "*", + 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE', + 'Authorization': token, + }; + return headers; + } + + Future login(String path, Map loginRequest) async { + final url = Uri.https(ApplicationConstants.DOMAIN, path); + final headers = await getHeaders(); + final response = + await http.post(url, headers: headers, body: jsonEncode(loginRequest)); + return response.body; + } + + Future logOut(BuildContext context) async { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(appLocalization(context).log_out_content, + textAlign: TextAlign.center), + actions: [ + TextButton( + onPressed: () async { + var url = Uri.http(ApplicationConstants.DOMAIN, + APIPathConstants.LOGOUT_PATH); + final headers = await NetworkManager.instance!.getHeaders(); + final response = await http.post(url, headers: headers); + if (response.statusCode == 200) { + LocaleManager.instance + .deleteStringValue(PreferencesKeys.UID); + LocaleManager.instance + .deleteStringValue(PreferencesKeys.TOKEN); + LocaleManager.instance + .deleteStringValue(PreferencesKeys.EXP); + LocaleManager.instance + .deleteStringValue(PreferencesKeys.ROLE); + context.goNamed(AppRoutes.LOGIN.name); + } else { + showErrorTopSnackBarCustom( + context, "Error: ${response.statusCode}"); + } + }, + child: Text(appLocalization(context).log_out, + style: const TextStyle(color: Colors.red)), + ), + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(appLocalization(context).cancel_button_content), + ), + ], + )); + } + + Future getUID() async { + String uid = LocaleManager.instance.getStringValue(PreferencesKeys.UID); + return uid; + } + + Future getUserRole() async { + String role = LocaleManager.instance.getStringValue(PreferencesKeys.ROLE); + return role; + } + + Future checkTheme() async { + String theme = LocaleManager.instance.getStringValue(PreferencesKeys.THEME); + return theme; + } + + Future checkLanguage() async { + String language = + LocaleManager.instance.getStringValue(PreferencesKeys.LANGUAGE_CODE); + return language; + } + + Future getBellNotifications(String offset, String pagesize) async { + Bell bell = Bell(); + final params = {"offset": offset, "page_size": pagesize}; + final data = await NetworkManager.instance!.getDataFromServerWithParams( + APIPathConstants.BELL_NOTIFICATIONS_PATH, params); + if (data != "") { + bell = Bell.fromJson(jsonDecode(data)); + return bell; + } else { + return bell; + } + } + + Future updateStatusOfNotification(List notificationID) async { + Map body = { + "event_ids": notificationID, + }; + int statusCode = await NetworkManager.instance!.updateDataInServer( + APIPathConstants.BELL_UPDATE_READ_NOTIFICATIONS_PATH, body); + return statusCode; + } + + Future getUserDetail() async { + String uid = await getUID(); + String? response = await NetworkManager.instance! + .getDataFromServer('${APIPathConstants.USER_PATH}/$uid'); + return response; + } + + Future updateUserProfile(Map body) async { + String uid = await getUID(); + int statusCode = await NetworkManager.instance! + .updateDataInServer("${APIPathConstants.USER_PROFILE_PATH}/$uid", body); + return statusCode; + } + + Future updateUserPassword(Map body) async { + String uid = await getUID(); + int statusCode = await NetworkManager.instance!.updateDataInServer( + "${APIPathConstants.USER_PATH}/$uid/password", body); + return statusCode; + } + + Future getAllSettingsNotificationOfDevices() async { + String? data = await NetworkManager.instance! + .getDataFromServer(APIPathConstants.DEVICE_NOTIFICATION_SETTINGS); + return data; + } + + Future updateDeviceNotificationSettings( + String thingID, Map data) async { + Map body = {"thing_id": thingID, "notifi_settings": data}; + int statusCode = await NetworkManager.instance!.updateDataInServer( + APIPathConstants.DEVICE_NOTIFICATION_SETTINGS, body); + return statusCode; + } + + Future getDashBoardDevices() async { + String? data = await NetworkManager.instance! + .getDataFromServer(APIPathConstants.DASHBOARD_DEVICES); + return data; + } + + Future setupDeviceNotification(String thingID, String deviceName) async { + Map body = { + "thing_id": thingID, + "alias": deviceName, + "notifi_settings": { + "001": 1, + "002": 1, + "003": 1, + "004": 1, + "005": 1, + "006": 1, + "101": 1, + "102": 1, + "103": 1, + "104": 1, + } + }; + int statusCode = await NetworkManager.instance!.updateDataInServer( + APIPathConstants.DEVICE_NOTIFICATION_SETTINGS, body); + return statusCode; + } + + Future getAllProvinces() async { + String? data = await NetworkManager.instance! + .getDataFromServer(APIPathConstants.PROVINCES_PATH); + return data; + } + + Future getProvincesByName(String name) async { + final params = {'name': name}; + String? data = await NetworkManager.instance! + .getDataFromServerWithParams(APIPathConstants.PROVINCES_PATH, params); + return data; + } + + Future getProvinceByID(String provinceID) async { + String data = await NetworkManager.instance! + .getDataFromServer("${APIPathConstants.PROVINCES_PATH}/$provinceID"); + return data; + } + + Future getAllDistricts(String provinceID) async { + final params = {"parent": provinceID}; + String? data = await NetworkManager.instance! + .getDataFromServerWithParams(APIPathConstants.DISTRICTS_PATH, params); + return data; + } + + Future getDistrictsByName(String districtName) async { + final params = {"name": districtName}; + String? data = await NetworkManager.instance! + .getDataFromServerWithParams(APIPathConstants.DISTRICTS_PATH, params); + return data; + } + + Future getDistrictByID(String districtID) async { + String? data = await NetworkManager.instance! + .getDataFromServer("${APIPathConstants.DISTRICTS_PATH}/$districtID"); + return data; + } + + Future getAllWards(String districtID) async { + final params = {'parent': districtID}; + String? data = await NetworkManager.instance! + .getDataFromServerWithParams(APIPathConstants.WARDS_PATH, params); + return data; + } + + Future getWarsdByName(String wardName) async { + final params = {"name": wardName}; + String? data = await NetworkManager.instance! + .getDataFromServerWithParams(APIPathConstants.WARDS_PATH, params); + return data; + } + + Future getWardByID(String wardID) async { + String? data = await NetworkManager.instance! + .getDataFromServer("${APIPathConstants.WARDS_PATH}/$wardID"); + return data; + } + + Future confirmFakeFireByUser(String thingID) async { + Map body = { + "state": 3, + "note": "Người dùng xác nhận cháy giả!" + }; + int statusCode = await NetworkManager.instance! + .updateDataInServer("${APIPathConstants.DEVICE_PATH}/$thingID", body); + return statusCode; + } + + Future getOwnerDevices() async { + String? data = await NetworkManager.instance! + .getDataFromServer(APIPathConstants.DEVICE_PATH); + return data; + } + + Future createDeviceByAdmin(Map body) async { + int? statusCode = await NetworkManager.instance! + .createDataInServer(APIPathConstants.DEVICE_PATH, body); + return statusCode; + } + + Future registerDevice(Map body) async { + int? statusCode = await NetworkManager.instance! + .createDataInServer(APIPathConstants.DEVICE_REGISTER_PATH, body); + return statusCode; + } + + Future deleteDeviceByAdmin(String thingID) async { + int statusCode = await NetworkManager.instance! + .deleteDataInServer("${APIPathConstants.DEVICE_PATH}/$thingID"); + return statusCode; + } + + Future unregisterDevice(Map body) async { + int statusCode = await NetworkManager.instance! + .createDataInServer(APIPathConstants.DEVICE_UNREGISTER_PATH, body); + return statusCode; + } + + Future getDeviceInfomation(String thingID) async { + String? response = await NetworkManager.instance! + .getDataFromServer("${APIPathConstants.DEVICE_PATH}/$thingID"); + return response; + } + + Future getAllGroups() async { + String? body = await NetworkManager.instance! + .getDataFromServer(APIPathConstants.ALL_GROUPS_PATH); + return body; + } + + Future createGroup(Map body) async { + int? statusCode = await NetworkManager.instance! + .createDataInServer(APIPathConstants.GROUPS_PATH, body); + return statusCode; + } + + Future updateGroup(Map body, String groupID) async { + int? statusCode = await NetworkManager.instance! + .updateDataInServer("${APIPathConstants.GROUPS_PATH}/$groupID", body); + return statusCode; + } + + Future joinGroup(String groupID, Map body) async { + int? statusCode = await NetworkManager.instance! + .createDataInServer(APIPathConstants.JOIN_GROUP_PATH, body); + return statusCode; + } + + Future deleteGroup(String groupID) async { + int? statusCode = await NetworkManager.instance! + .deleteDataInServer("${APIPathConstants.GROUPS_PATH}/$groupID"); + return statusCode; + } + + Future getGroupDetail(String groupID) async { + String? body = await NetworkManager.instance! + .getDataFromServer("${APIPathConstants.GROUPS_PATH}/$groupID"); + return body; + } + + Future approveGroup(Map body) async { + int statusCode = await NetworkManager.instance! + .createDataInServer(APIPathConstants.APPROVE_GROUP_PATH, body); + return statusCode; + } + + Future deleteUserInGroup(String groupID, String userID) async { + int? statusCode = await NetworkManager.instance!.deleteDataInServer( + "${APIPathConstants.GROUPS_PATH}/$groupID/users/$userID"); + return statusCode; + } + + Future deleteDeviceInGroup(String groupID, String thingID) async { + int? statusCode = await NetworkManager.instance!.deleteDataInServer( + "${APIPathConstants.GROUPS_PATH}/$groupID/devices/$thingID"); + return statusCode; + } + + Future updateDeviceAlias(Map body) async { + int? statusCode = await NetworkManager.instance!.updateDataInServer( + APIPathConstants.DEVICE_NOTIFICATION_SETTINGS, body); + return statusCode; + } + + Future addDeviceToGroup( + String groupID, Map body) async { + int? statusCode = await NetworkManager.instance!.createDataInServer( + "${APIPathConstants.GROUPS_PATH}/$groupID/things", body); + return statusCode; + } + + Future updateOwnerDevice( + String thingID, Map body) async { + int? statusCode = await NetworkManager.instance! + .updateDataInServer("${APIPathConstants.DEVICE_PATH}/$thingID", body); + return statusCode; + } + + Future getLogsOfDevice( + String thingID, Map params) async { + String? body = await NetworkManager.instance! + .getDataFromServerWithParams(APIPathConstants.DEVICE_LOGS_PATH, params); + return body; + } + + +} diff --git a/lib/product/services/language_services.dart b/lib/product/services/language_services.dart new file mode 100644 index 0000000..6f88622 --- /dev/null +++ b/lib/product/services/language_services.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import '../cache/local_manager.dart'; +import '../constant/enums/local_keys_enums.dart'; +import '../constant/lang/language_constants.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class LanguageServices { + Future setLocale(String languageCode) async { + await LocaleManager.prefrencesInit(); + LocaleManager.instance + .setStringValue(PreferencesKeys.LANGUAGE_CODE, languageCode); + return _locale(languageCode); + } + + Future getLocale() async { + await LocaleManager.prefrencesInit(); + String languageCode = + LocaleManager.instance.getStringValue(PreferencesKeys.LANGUAGE_CODE); + return _locale(languageCode); + } + + Locale _locale(String languageCode) { + switch (languageCode) { + case LanguageConstants.ENGLISH: + return const Locale(LanguageConstants.ENGLISH, ''); + case LanguageConstants.VIETNAM: + return const Locale(LanguageConstants.VIETNAM, ''); + default: + return const Locale(LanguageConstants.VIETNAM, ''); + } + } +} + +AppLocalizations appLocalization(BuildContext context) { + return AppLocalizations.of(context)!; +} diff --git a/lib/product/services/map_services.dart b/lib/product/services/map_services.dart new file mode 100644 index 0000000..e0654cc --- /dev/null +++ b/lib/product/services/map_services.dart @@ -0,0 +1,63 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:dio/dio.dart'; +import 'package:flutter_polyline_points/flutter_polyline_points.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:http/http.dart' as http; +import '../constant/app/app_constants.dart'; +import '../shared/find_location_maps/model/prediction_model.dart'; +import '../shared/model/near_by_search_model.dart'; + +class MapServices { + + Future> getNearbyPlaces(double latitude, double longitude, + String searchKey, int radius, String type) async { + List result = []; + var url = Uri.parse( + 'https://maps.googleapis.com/maps/api/place/autocomplete/json?input=$searchKey&language=vi&location=$latitude%2C$longitude&radius=$radius&strictbounds=true&type=$type&key=${ApplicationConstants.MAP_KEY}'); + log("URL LIST: $url"); + var response = await http.post(url); + final placesAutocompleteResponse = + PlacesAutocompleteResponse.fromJson(jsonDecode(response.body)); + if (placesAutocompleteResponse.predictions != null) { + for (int i = 0; i < placesAutocompleteResponse.predictions!.length; i++) { + var url = + "https://maps.googleapis.com/maps/api/place/details/json?placeid=${placesAutocompleteResponse.predictions![i].placeId}&language=vi&key=${ApplicationConstants.MAP_KEY}"; + log(url.toString()); + Response response = await Dio().get( + url, + ); + PlaceDetails placeDetails = PlaceDetails.fromJson(response.data); + result.add(placeDetails); + // displayLocation(placesAutocompleteResponse.predictions![i], i); + } + return result; + } else { + log("null"); + return []; + } + } + + Future> findTheWay(LatLng origin, LatLng destination) async { + List polylineCoordinates = []; + PolylinePoints polylinePoints = PolylinePoints(); + + PolylineResult result = await polylinePoints.getRouteBetweenCoordinates( + ApplicationConstants.MAP_KEY, + PointLatLng(origin.latitude, origin.longitude), + PointLatLng(destination.latitude, destination.longitude), + travelMode: TravelMode.driving, + optimizeWaypoints: true); + if (result.points.isNotEmpty) { + for (var point in result.points) { + polylineCoordinates.add(LatLng(point.latitude, point.longitude)); + } + return polylineCoordinates; + } else { + log("Lỗi khi tìm đường"); + return []; + } + } + +} \ No newline at end of file diff --git a/lib/product/services/notification_services.dart b/lib/product/services/notification_services.dart new file mode 100644 index 0000000..f4c5d8b --- /dev/null +++ b/lib/product/services/notification_services.dart @@ -0,0 +1,103 @@ +import 'dart:developer' as dev; +import 'dart:math' as math; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +class NotificationServices { + FirebaseMessaging messaging = FirebaseMessaging.instance; + final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + + void firebaseInit(BuildContext context) async { + FirebaseMessaging.onMessage.listen((message) { + initNotifications(context, message); + showNotification(message); + dev.log( + "Title: ${message.notification!.title}, Body: ${message.notification!.body} from ${message.sentTime}"); + }); + } + + Future getDeviceToken() async { + String? token = await messaging.getToken(); + return token!; + } + + void isTokenRefresh() async { + messaging.onTokenRefresh.listen((newToken) { + dev.log("Refresh Firebase Messaging Token: $newToken"); + }); + } + + void initNotifications(BuildContext context, RemoteMessage message) async { + var androidInitializationSettings = + const AndroidInitializationSettings('app_icon'); + var iosInitializationSettings = const DarwinInitializationSettings(); + var initializationSettings = InitializationSettings( + android: androidInitializationSettings, iOS: iosInitializationSettings); + await _flutterLocalNotificationsPlugin.initialize(initializationSettings, + onDidReceiveNotificationResponse: (payload) { + handleMessage(context, message); + }); + } + + Future showNotification(RemoteMessage message) async { + AndroidNotificationChannel androidNotificationChannel = + AndroidNotificationChannel( + math.Random.secure().nextInt(1000000).toString(), + 'high Important Notification', + importance: Importance.max); + AndroidNotificationDetails androidNotificationDetails = + AndroidNotificationDetails( + androidNotificationChannel.id.toString(), + androidNotificationChannel.name.toString(), + sound: RawResourceAndroidNotificationSound(message.data['sound']), + channelDescription: "Channel description", + importance: androidNotificationChannel.importance, + priority: Priority.high, + ticker: 'ticker', + ); + + const DarwinNotificationDetails darwinNotificationDetails = + DarwinNotificationDetails( + presentAlert: true, + presentBadge: true, + presentBanner: true, + presentSound: true, + ); + NotificationDetails notificationDetails = NotificationDetails( + android: androidNotificationDetails, iOS: darwinNotificationDetails); + Future.delayed(Duration.zero, () { + _flutterLocalNotificationsPlugin.show(0, message.notification!.title!, + message.notification!.body, notificationDetails); + }); + } + + void handleMessage(BuildContext context, RemoteMessage message) async { + if (message.data['type'] == "msj") { + // Navigator.push(context, + // MaterialPageRoute(builder: (context) => const MessageScreen())); + } else if (message.data['type'] == "warn") { + // Navigator.push( + // context, MaterialPageRoute(builder: (context) => const MapScreen())); + } else { + dev.log("Not found data"); + } + } + + Future setupInteractMessage(BuildContext context) async { + // When app terminate + RemoteMessage? initialMessage = + await FirebaseMessaging.instance.getInitialMessage(); + if (initialMessage != null) { + // showNotification(initialMessage); + // ignore: use_build_context_synchronously + handleMessage(context, initialMessage); + } + + // When app is inBackGround + FirebaseMessaging.onMessageOpenedApp.listen((message) { + handleMessage(context, message); + }); + } +} diff --git a/lib/product/shared/find_location_maps/error/dio_handle_error.dart b/lib/product/shared/find_location_maps/error/dio_handle_error.dart new file mode 100644 index 0000000..5b57e0b --- /dev/null +++ b/lib/product/shared/find_location_maps/error/dio_handle_error.dart @@ -0,0 +1,137 @@ + +import 'package:dio/dio.dart'; + +import 'error_response_model.dart'; + +class DioErrorHandler { + ErrorResponse errorResponse = ErrorResponse(); + String errorDescription = ""; + + ErrorResponse handleDioError(DioException dioError) { + switch (dioError.type) { + case DioExceptionType.cancel: + errorResponse.message = "Request to API server was cancelled"; + break; + case DioExceptionType.connectionTimeout: + errorResponse.message = "Connection timeout with API server"; + break; + case DioExceptionType.unknown: + if ((dioError.message!.contains("RedirectException"))) { + errorResponse.message = dioError.message; + } else { + errorResponse.message = "Please check the internet connection"; + } + break; + case DioExceptionType.receiveTimeout: + errorResponse.message = "Receive timeout in connection with API server"; + break; + case DioExceptionType.badResponse: + try { + if (dioError.response?.data['message'] != null) { + errorResponse.message = dioError.response?.data['message']; + } else { + if ((dioError.response?.statusMessage ?? "").isNotEmpty) { + errorResponse.message = dioError.response?.statusMessage; + } else { + return _handleError( + dioError.response!.statusCode, dioError.response!.data); + } + } + } catch (e) { + if ((dioError.response?.statusMessage ?? "").isNotEmpty) { + errorResponse.message = dioError.response?.statusMessage; + } else { + return _handleError( + dioError.response!.statusCode, dioError.response!.data); + } + } + + break; + case DioExceptionType.sendTimeout: + errorResponse.message = "Send timeout in connection with API server"; + break; + default: + errorResponse.message = "Something went wrong"; + break; + } + return errorResponse; + } + + ErrorResponse _handleError(int? statusCode, dynamic error) { + switch (statusCode) { + case 400: + return getMas(error); + // case 401: + // return checkTokenExpire(error); + case 404: + return getMas(error); + case 403: + return getMas(error); + case 500: + errorResponse.message = 'Internal server error'; + return errorResponse; + default: + return getUnKnownMes(error); + } + } + + // checkTokenExpire(error) { + // // print("my error ${error}"); + // if (error['msg'].toString().toLowerCase() == + // "Token has expired".toLowerCase()) { + // UIData.tokenExpire(error['msg']); + // return; + // } + // errorResponse.message = error['msg'].toString(); + // return errorResponse; + // } + + getMas(dynamic error) { + print("myError ${error.runtimeType}"); + if (error.runtimeType != String) { + errorResponse.message = + error['message'].toString(); //?? S.of(Get.context).something_wrong; + } else { + if (error['msg'] != null) { + errorResponse.message = error['msg'].toString(); + } else { + errorResponse.message = "Something Wrong"; + } //S.of(Get.context).something_wrong; + } + return errorResponse; + } + + getUnKnownMes(dynamic error) { + if (error['msg'] != null) { + errorResponse.message = error['msg'].toString(); + } else if (error['message'] != null) { + errorResponse.message = error['message'].toString(); + } else { + errorResponse.message = "Something went wrong"; + } + return errorResponse; + } +} + +class ErrorHandler { + static final ErrorHandler _inst = ErrorHandler.internal(); + ErrorHandler.internal(); + + factory ErrorHandler() { + return _inst; + } + ErrorResponse errorResponse = ErrorResponse(); + + ErrorResponse handleError(var error) { + if (error.runtimeType.toString().toLowerCase() == + "_TypeError".toLowerCase()) { + // return error.toString(); + errorResponse.message = "The Provided API key is invalid"; + return errorResponse; + } else if (error is DioError) { + return DioErrorHandler().handleDioError(error); + } + errorResponse.message = "The Provided API key is invalid"; + return errorResponse; + } +} diff --git a/lib/product/shared/find_location_maps/error/error_response_model.dart b/lib/product/shared/find_location_maps/error/error_response_model.dart new file mode 100644 index 0000000..4fdb49f --- /dev/null +++ b/lib/product/shared/find_location_maps/error/error_response_model.dart @@ -0,0 +1,19 @@ +class ErrorResponse { + String? message; + int? status; + + ErrorResponse({this.message, this.status}); + + ErrorResponse.fromJson(Map json) { + message = json['message']; + status = json['status']; + } + + Map toJson() { + final Map data = {}; + data['message'] = message; + data['status'] = status; + + return data; + } +} diff --git a/lib/product/shared/find_location_maps/model/place_detail_model.dart b/lib/product/shared/find_location_maps/model/place_detail_model.dart new file mode 100644 index 0000000..803349f --- /dev/null +++ b/lib/product/shared/find_location_maps/model/place_detail_model.dart @@ -0,0 +1,234 @@ +class PlaceDetails { + Result? result; + String? status; + + PlaceDetails({this.result, this.status}); + + PlaceDetails.fromJson(Map json) { + result = + json['result'] != null ? Result.fromJson(json['result']) : null; + status = json['status']; + } + + Map toJson() { + final Map data = {}; + + if (result != null) { + data['result'] = result!.toJson(); + } + data['status'] = status; + return data; + } +} + +class Result { + List? addressComponents; + String? adrAddress; + String? formattedAddress; + Geometry? geometry; + String? icon; + String? name; + List? photos; + String? placeId; + String? reference; + String? scope; + List? types; + String? url; + int? utcOffset; + String? vicinity; + String? website; + + Result( + {this.addressComponents, + this.adrAddress, + this.formattedAddress, + this.geometry, + this.icon, + this.name, + this.photos, + this.placeId, + this.reference, + this.scope, + this.types, + this.url, + this.utcOffset, + this.vicinity, + this.website}); + + Result.fromJson(Map json) { + if (json['address_components'] != null) { + addressComponents = []; + json['address_components'].forEach((v) { + addressComponents!.add(AddressComponents.fromJson(v)); + }); + } + adrAddress = json['adr_address']; + formattedAddress = json['formatted_address']; + geometry = json['geometry'] != null + ? Geometry.fromJson(json['geometry']) + : null; + icon = json['icon']; + name = json['name']; + if (json['photos'] != null) { + photos = []; + json['photos'].forEach((v) { + photos!.add(Photos.fromJson(v)); + }); + } + placeId = json['place_id']; + reference = json['reference']; + scope = json['scope']; + types = json['types'].cast(); + url = json['url']; + utcOffset = json['utc_offset']; + vicinity = json['vicinity']; + website = json['website']; + } + + Map toJson() { + final Map data = {}; + if (addressComponents != null) { + data['address_components'] = + addressComponents!.map((v) => v.toJson()).toList(); + } + data['adr_address'] = adrAddress; + data['formatted_address'] = formattedAddress; + if (geometry != null) { + data['geometry'] = geometry!.toJson(); + } + data['icon'] = icon; + data['name'] = name; + if (photos != null) { + data['photos'] = photos!.map((v) => v.toJson()).toList(); + } + data['place_id'] = placeId; + data['reference'] = reference; + data['scope'] = scope; + data['types'] = types; + data['url'] = url; + data['utc_offset'] = utcOffset; + data['vicinity'] = vicinity; + data['website'] = website; + return data; + } +} + +class AddressComponents { + String? longName; + String? shortName; + List? types; + + AddressComponents({this.longName, this.shortName, this.types}); + + AddressComponents.fromJson(Map json) { + longName = json['long_name']; + shortName = json['short_name']; + types = json['types'].cast(); + } + + Map toJson() { + final Map data = {}; + data['long_name'] = longName; + data['short_name'] = shortName; + data['types'] = types; + return data; + } +} + +class Geometry { + Location? location; + Viewport? viewport; + + Geometry({this.location, this.viewport}); + + Geometry.fromJson(Map json) { + location = json['location'] != null + ? Location.fromJson(json['location']) + : null; + viewport = json['viewport'] != null + ? Viewport.fromJson(json['viewport']) + : null; + } + + Map toJson() { + final Map data = {}; + if (location != null) { + data['location'] = location!.toJson(); + } + if (viewport != null) { + data['viewport'] = viewport!.toJson(); + } + return data; + } +} + +class Location { + double? lat; + double? lng; + + Location({this.lat, this.lng}); + + Location.fromJson(Map json) { + lat = json['lat']; + lng = json['lng']; + } + + Map toJson() { + final Map data = {}; + data['lat'] = lat; + data['lng'] = lng; + return data; + } +} + +class Viewport { + Location? northeast; + Location? southwest; + + Viewport({this.northeast, this.southwest}); + + Viewport.fromJson(Map json) { + northeast = json['northeast'] != null + ? Location.fromJson(json['northeast']) + : null; + southwest = json['southwest'] != null + ? Location.fromJson(json['southwest']) + : null; + } + + Map toJson() { + final Map data = {}; + if (northeast != null) { + data['northeast'] = northeast!.toJson(); + } + if (southwest != null) { + data['southwest'] = southwest!.toJson(); + } + return data; + } +} + +class Photos { + int? height; + List? htmlAttributions; + String? photoReference; + int? width; + + Photos({this.height, this.htmlAttributions, this.photoReference, this.width}); + + Photos.fromJson(Map json) { + height = json['height']; + htmlAttributions = json['html_attributions'].cast(); + photoReference = json['photo_reference']; + width = json['width']; + } + + Map toJson() { + final Map data = {}; + data['height'] = height; + data['html_attributions'] = htmlAttributions; + data['photo_reference'] = photoReference; + data['width'] = width; + return data; + } +} diff --git a/lib/product/shared/find_location_maps/model/prediction_model.dart b/lib/product/shared/find_location_maps/model/prediction_model.dart new file mode 100644 index 0000000..6ece4e9 --- /dev/null +++ b/lib/product/shared/find_location_maps/model/prediction_model.dart @@ -0,0 +1,157 @@ +class PlacesAutocompleteResponse { + List? predictions; + String? status; + + PlacesAutocompleteResponse({this.predictions, this.status}); + + PlacesAutocompleteResponse.fromJson(Map json) { + if (json['predictions'] != null) { + predictions = []; + json['predictions'].forEach((v) { + predictions!.add(Prediction.fromJson(v)); + }); + } + status = json['status']; + } + + Map toJson() { + final Map data = {}; + if (predictions != null) { + data['predictions'] = predictions!.map((v) => v.toJson()).toList(); + } + data['status'] = status; + return data; + } +} + +class Prediction { + String? description; + String? id; + List? matchedSubstrings; + String? placeId; + String? reference; + StructuredFormatting? structuredFormatting; + List? terms; + List? types; + String? lat; + String? lng; + + Prediction( + {this.description, + this.id, + this.matchedSubstrings, + this.placeId, + this.reference, + this.structuredFormatting, + this.terms, + this.types, + this.lat, + this.lng}); + + Prediction.fromJson(Map json) { + description = json['description']; + id = json['id']; + if (json['matched_substrings'] != null) { + matchedSubstrings = []; + json['matched_substrings'].forEach((v) { + matchedSubstrings!.add(MatchedSubstrings.fromJson(v)); + }); + } + placeId = json['place_id']; + reference = json['reference']; + structuredFormatting = json['structured_formatting'] != null + ? StructuredFormatting.fromJson(json['structured_formatting']) + : null; + if (json['terms'] != null) { + terms = []; + json['terms'].forEach((v) { + terms!.add(Terms.fromJson(v)); + }); + } + types = json['types'].cast(); + lat = json['lat']; + lng = json['lng']; + } + + Map toJson() { + final Map data = {}; + data['description'] = description; + data['id'] = id; + if (matchedSubstrings != null) { + data['matched_substrings'] = + matchedSubstrings!.map((v) => v.toJson()).toList(); + } + data['place_id'] = placeId; + data['reference'] = reference; + if (structuredFormatting != null) { + data['structured_formatting'] = structuredFormatting!.toJson(); + } + if (terms != null) { + data['terms'] = terms!.map((v) => v.toJson()).toList(); + } + data['types'] = types; + data['lat'] = lat; + data['lng'] = lng; + + return data; + } +} + +class MatchedSubstrings { + int? length; + int? offset; + + MatchedSubstrings({this.length, this.offset}); + + MatchedSubstrings.fromJson(Map json) { + length = json['length']; + offset = json['offset']; + } + + Map toJson() { + final Map data = {}; + data['length'] = length; + data['offset'] = offset; + return data; + } +} + +class StructuredFormatting { + String? mainText; + + String? secondaryText; + + StructuredFormatting({this.mainText, this.secondaryText}); + + StructuredFormatting.fromJson(Map json) { + mainText = json['main_text']; + + secondaryText = json['secondary_text']; + } + + Map toJson() { + final Map data = {}; + data['main_text'] = mainText; + data['secondary_text'] = secondaryText; + return data; + } +} + +class Terms { + int? offset; + String? value; + + Terms({this.offset, this.value}); + + Terms.fromJson(Map json) { + offset = json['offset']; + value = json['value']; + } + + Map toJson() { + final Map data = {}; + data['offset'] = offset; + data['value'] = value; + return data; + } +} diff --git a/lib/product/shared/find_location_maps/shared_map_search_location.dart b/lib/product/shared/find_location_maps/shared_map_search_location.dart new file mode 100644 index 0000000..72b4782 --- /dev/null +++ b/lib/product/shared/find_location_maps/shared_map_search_location.dart @@ -0,0 +1,313 @@ +// ignore_for_file: unnecessary_this, use_build_context_synchronously, prefer_typing_uninitialized_variables, library_private_types_in_public_api + +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:dio/dio.dart'; +import 'package:rxdart/rxdart.dart'; + +import 'error/dio_handle_error.dart'; +import 'model/place_detail_model.dart'; +import 'model/prediction_model.dart'; + +// ignore: must_be_immutable +class NearBySearchSFM extends StatefulWidget { + InputDecoration inputDecoration; + ItemClick? itemClick; + GetPlaceDetailswWithLatLng? getPlaceDetailWithLatLng; + bool isLatLngRequired = true; + double locationLatitude; + double locationLongitude; + int radius; + TextStyle textStyle; + String googleAPIKey; + int debounceTime = 600; + List? countries = []; + TextEditingController textEditingController = TextEditingController(); + ListItemBuilder? itemBuilder; + TextInputAction? textInputAction; + Widget? seperatedBuilder; + void clearData; + BoxDecoration? boxDecoration; + bool isCrossBtnShown; + bool showError; + + NearBySearchSFM( + {super.key, + required this.textEditingController, + required this.googleAPIKey, + required this.locationLatitude, + required this.locationLongitude, + required this.radius, + this.debounceTime = 600, + this.inputDecoration = const InputDecoration(), + this.itemClick, + this.isLatLngRequired = true, + this.textStyle = const TextStyle(), + this.countries, + this.getPlaceDetailWithLatLng, + this.itemBuilder, + this.boxDecoration, + this.isCrossBtnShown = true, + this.seperatedBuilder, + this.showError = true, + this.textInputAction}); + + @override + _NearBySearchSFMState createState() => + _NearBySearchSFMState(); +} + +class _NearBySearchSFMState + extends State { + final subject = PublishSubject(); + OverlayEntry? _overlayEntry; + List alPredictions = []; + + TextEditingController controller = TextEditingController(); + final LayerLink _layerLink = LayerLink(); + bool isSearched = false; + + bool isCrossBtn = true; + late var _dio; + + CancelToken? _cancelToken = CancelToken(); + + @override + Widget build(BuildContext context) { + return CompositedTransformTarget( + link: _layerLink, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + alignment: Alignment.centerLeft, + decoration: widget.boxDecoration ?? + BoxDecoration( + shape: BoxShape.rectangle, + border: Border.all(color: Colors.grey, width: 0.6), + borderRadius: const BorderRadius.all(Radius.circular(10))), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: TextFormField( + decoration: widget.inputDecoration, + style: widget.textStyle, + controller: widget.textEditingController, + onChanged: (string) { + subject.add(string); + if (widget.isCrossBtnShown) { + isCrossBtn = string.isNotEmpty ? true : false; + setState(() {}); + } + }, + ), + ), + (!widget.isCrossBtnShown) + ? const SizedBox() + : isCrossBtn && _showCrossIconWidget() + ? IconButton(onPressed: clearData, icon: Icon(Icons.close)) + : const SizedBox() + ], + ), + ), + ); + } + + getLocation( + String text, double latitude, double longitude, int radius) async { + // String url = + // "https://maps.googleapis.com/maps/api/place/nearbysearch/json?keyword=$text&location=$latitude%2C$longitude&radius=$radius&type=hospital|pharmacy|doctor&key=${widget.googleAPIKey}"; + + String url = + "https://maps.googleapis.com/maps/api/place/autocomplete/json?input=$text&location=$latitude%2C$longitude&radius=$radius&strictbounds=true&key=${widget.googleAPIKey}"; + log(url); + if (widget.countries != null) { + for (int i = 0; i < widget.countries!.length; i++) { + String country = widget.countries![i]; + + if (i == 0) { + url = url + "&components=country:$country"; + } else { + url = url + "|" + "country:" + country; + } + } + } + + if (_cancelToken?.isCancelled == false) { + _cancelToken?.cancel(); + _cancelToken = CancelToken(); + } + + try { + Response response = await _dio.get(url); + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + + Map map = response.data; + if (map.containsKey("error_message")) { + throw response.data; + } + + PlacesAutocompleteResponse subscriptionResponse = + PlacesAutocompleteResponse.fromJson(response.data); + + if (text.length == 0) { + alPredictions.clear(); + this._overlayEntry!.remove(); + return; + } + + isSearched = false; + alPredictions.clear(); + if (subscriptionResponse.predictions!.isNotEmpty && + (widget.textEditingController.text.toString().trim()).isNotEmpty) { + alPredictions.addAll(subscriptionResponse.predictions!); + } + + this._overlayEntry = null; + _overlayEntry = _createOverlayEntry(); + Overlay.of(context).insert(_overlayEntry!); + } catch (e) { + var errorHandler = ErrorHandler.internal().handleError(e); + _showSnackBar("${errorHandler.message}"); + } + } + + @override + void initState() { + super.initState(); + _dio = Dio(); + subject.stream + .distinct() + .debounceTime(Duration(milliseconds: widget.debounceTime)) + .listen(textChanged); + } + + textChanged(String text) async { + getLocation(text, widget.locationLatitude, widget.locationLongitude, + widget.radius); + } + + OverlayEntry? _createOverlayEntry() { + if (context.findRenderObject() != null) { + RenderBox renderBox = context.findRenderObject() as RenderBox; + var size = renderBox.size; + var offset = renderBox.localToGlobal(Offset.zero); + return OverlayEntry( + builder: (context) => Positioned( + left: offset.dx, + top: size.height + offset.dy, + width: size.width, + child: CompositedTransformFollower( + showWhenUnlinked: false, + link: this._layerLink, + offset: Offset(0.0, size.height + 5.0), + child: Material( + child: ListView.separated( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: alPredictions.length, + separatorBuilder: (context, pos) => + widget.seperatedBuilder ?? SizedBox(), + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + var selectedData = alPredictions[index]; + if (index < alPredictions.length) { + widget.itemClick!(selectedData); + + if (widget.isLatLngRequired) { + getPlaceDetailsFromPlaceId(selectedData); + } + removeOverlay(); + } + }, + child: widget.itemBuilder != null + ? widget.itemBuilder!( + context, index, alPredictions[index]) + : Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10)), + padding: const EdgeInsets.all(5), + child: Text(alPredictions[index].description!)), + ); + }, + )), + ), + )); + } + return null; + } + + removeOverlay() { + alPredictions.clear(); + this._overlayEntry = this._createOverlayEntry(); + Overlay.of(context).insert(this._overlayEntry!); + this._overlayEntry!.markNeedsBuild(); + } + + Future getPlaceDetailsFromPlaceId(Prediction prediction) async { + //String key = GlobalConfiguration().getString('google_maps_key'); + + var url = + "https://maps.googleapis.com/maps/api/place/details/json?placeid=${prediction.placeId}&key=${widget.googleAPIKey}"; + Response response = await Dio().get( + url, + ); + + PlaceDetails placeDetails = PlaceDetails.fromJson(response.data); + + prediction.lat = placeDetails.result!.geometry!.location!.lat.toString(); + prediction.lng = placeDetails.result!.geometry!.location!.lng.toString(); + + widget.getPlaceDetailWithLatLng!(prediction); + return null; + } + + void clearData() { + widget.textEditingController.clear(); + if (_cancelToken?.isCancelled == false) { + _cancelToken?.cancel(); + } + + setState(() { + alPredictions.clear(); + isCrossBtn = false; + }); + + if (this._overlayEntry != null) { + try { + this._overlayEntry?.remove(); + } catch (e) {} + } + } + + _showCrossIconWidget() { + return (widget.textEditingController.text.isNotEmpty); + } + + _showSnackBar(String errorData) { + if (widget.showError) { + final snackBar = SnackBar( + content: Text("$errorData"), + ); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + } + } +} + +PlacesAutocompleteResponse parseResponse(Map responseBody) { + return PlacesAutocompleteResponse.fromJson( + responseBody as Map); +} + +PlaceDetails parsePlaceDetailMap(Map responseBody) { + return PlaceDetails.fromJson(responseBody as Map); +} + +typedef ItemClick = void Function(Prediction postalCodeResponse); +typedef GetPlaceDetailswWithLatLng = void Function( + Prediction postalCodeResponse); + +typedef ListItemBuilder = Widget Function( + BuildContext context, int index, Prediction prediction); diff --git a/lib/product/shared/model/district_model.dart b/lib/product/shared/model/district_model.dart new file mode 100644 index 0000000..2d22214 --- /dev/null +++ b/lib/product/shared/model/district_model.dart @@ -0,0 +1,43 @@ +class District { + String? code; + String? name; + String? nameEn; + String? fullName; + String? fullNameEn; + String? codeName; + String? provinceCode; + String? type; + + District({ + this.code, + this.name, + this.nameEn, + this.fullName, + this.fullNameEn, + this.codeName, + this.provinceCode, + this.type, + }); + + District.fromJson(Map json) { + code = json['code']; + name = json['name']; + nameEn = json['name_en']; + fullName = json['full_name']; + fullNameEn = json['full_name_en']; + codeName = json['code_name']; + provinceCode = json['parent']; + type = json['type']; + } + + static List fromJsonList(List list) { + return list.map((e) => District.fromJson(e)).toList(); + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => District.fromJson(e)).toList(); + } + + // @override + // String toString() => fullName!; +} diff --git a/lib/product/shared/model/near_by_search_model.dart b/lib/product/shared/model/near_by_search_model.dart new file mode 100644 index 0000000..a26561e --- /dev/null +++ b/lib/product/shared/model/near_by_search_model.dart @@ -0,0 +1,172 @@ +class NearbySearch { + List? results; + String? status; + + NearbySearch({ + this.results, + this.status, + }); + + NearbySearch.fromJson(Map json) { + if (json['results'] != null) { + results = []; + json['results'].forEach((v) { + results!.add(Result.fromJson(v)); + }); + } + status = json['status']; + } + + Map toJson() { + final Map data = {}; + if (results != null) { + data['result'] = results!.map((v) => v.toJson()).toList(); + } + data['status'] = status; + return data; + } +} + +class PlaceDetails { + Result? result; + String? status; + + PlaceDetails({this.result, this.status}); + + PlaceDetails.fromJson(Map json) { + result = json['result'] != null ? Result.fromJson(json['result']) : null; + status = json['status']; + } + + Map toJson() { + final Map data = {}; + + if (result != null) { + data['result'] = result!.toJson(); + } + data['status'] = status; + return data; + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => PlaceDetails.fromJson(e)).toList(); + } +} + +class Result { + Geometry? geometry; + String? icon; + String? name; + String? placeId; + String? vicinity; + String? adress; + String? formattedAddress; + String? formattedPhoneNumber; + String? phoneNumber; + OpeningHours? openingHours; + + Result({ + this.geometry, + this.icon, + this.name, + this.placeId, + this.vicinity, + this.formattedPhoneNumber, + this.phoneNumber, + this.openingHours, + this.adress, + this.formattedAddress, + }); + + Result.fromJson(Map json) { + geometry = + json['geometry'] != null ? Geometry.fromJson(json['geometry']) : null; + icon = json['icon']; + name = json['name']; + placeId = json['place_id']; + vicinity = json['vicinity']; + adress = json['adr_address']; + formattedPhoneNumber = json['formatted_phone_number'] ?? ""; + phoneNumber = json['international_phone_number'] ?? ""; + formattedAddress = json['formatted_address']; + openingHours = json['opening_hours'] != null + ? OpeningHours.fromJson(json['opening_hours']) + : null; + } + + Map toJson() { + final Map data = {}; + if (geometry != null) { + data['geometry'] = geometry!.toJson(); + } + data['icon'] = icon; + data['name'] = name; + data['vicinity'] = vicinity; + data['adr_address'] = adress; + data['formatted_address'] = formattedAddress; + data['international_phone_number'] = phoneNumber; + data['formatted_phone_number'] = formattedPhoneNumber; + if (openingHours != null) { + data['opening_hours'] = openingHours!.toJson(); + } + return data; + } +} + +class Geometry { + Location? location; + Geometry({ + this.location, + }); + + Geometry.fromJson(Map json) { + location = + json['location'] != null ? Location.fromJson(json['location']) : null; + } + Map toJson() { + final Map data = {}; + if (location != null) { + data['location'] = location!.toJson(); + } + return data; + } +} + +class Location { + double? lat; + double? lng; + + Location({ + this.lat, + this.lng, + }); + + Location.fromJson(Map json) { + lat = json['lat']; + lng = json['lng']; + } + + Map toJson() { + final Map data = {}; + data['lat'] = lat; + data['lng'] = lng; + return data; + } +} + +class OpeningHours { + bool? openNow; + + OpeningHours({ + this.openNow, + }); + OpeningHours.fromJson(Map json) { + openNow = json['open_now']; + } + + Map toJson() { + final Map data = {}; + data['open_now'] = openNow; + return data; + } +} diff --git a/lib/product/shared/model/province_model.dart b/lib/product/shared/model/province_model.dart new file mode 100644 index 0000000..dde39c7 --- /dev/null +++ b/lib/product/shared/model/province_model.dart @@ -0,0 +1,42 @@ +class Province { + String? code; + String? name; + String? nameEn; + String? fullName; + String? fullNameEn; + String? codeName; + String? parent; + String? type; + + Province( + {this.code, + this.name, + this.nameEn, + this.fullName, + this.fullNameEn, + this.codeName, + this.parent, + this.type}); + + Province.fromJson(Map json) { + code = json['code']; + name = json['name']; + nameEn = json['name_en']; + fullName = json['full_name']; + fullNameEn = json['full_name_en']; + codeName = json['code_name']; + parent = json['parent']; + type = json['type']; + } + + static List fromJsonList(List list) { + return list.map((e) => Province.fromJson(e)).toList(); + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => Province.fromJson(e)).toList(); + } + + @override + String toString() => fullName!; +} diff --git a/lib/product/shared/model/ward_model.dart b/lib/product/shared/model/ward_model.dart new file mode 100644 index 0000000..7ae0413 --- /dev/null +++ b/lib/product/shared/model/ward_model.dart @@ -0,0 +1,43 @@ +class Ward { + String? code; + String? name; + String? nameEn; + String? fullName; + String? fullNameEn; + String? codeName; + String? districtCode; + String? type; + + Ward({ + this.code, + this.name, + this.nameEn, + this.fullName, + this.fullNameEn, + this.codeName, + this.districtCode, + this.type, + }); + + Ward.fromJson(Map json) { + code = json['code']; + name = json['name']; + nameEn = json['name_en']; + fullName = json['full_name']; + fullNameEn = json['full_name_en']; + codeName = json['code_name']; + districtCode = json['parent']; + type = json['type']; + } + + static List fromJsonList(List list) { + return list.map((e) => Ward.fromJson(e)).toList(); + } + + static List fromJsonDynamicList(List list) { + return list.map((e) => Ward.fromJson(e)).toList(); + } + + @override + String toString() => fullName!; +} diff --git a/lib/product/shared/shared_background.dart b/lib/product/shared/shared_background.dart new file mode 100644 index 0000000..8df40f4 --- /dev/null +++ b/lib/product/shared/shared_background.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:sfm_app/product/constant/image/image_constants.dart'; + +class SharedBackground extends StatelessWidget { + final Widget child; + const SharedBackground({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + Size size = MediaQuery.of(context).size; + return Directionality( + textDirection: TextDirection.ltr, + child: Scaffold( + resizeToAvoidBottomInset: false, + body: SizedBox( + height: size.height, + width: double.infinity, + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + top: 0, + left: 0, + child: Image.asset( + ImageConstants.instance.getImage("background_top"), + width: size.width * 0.3, + ), + ), + Positioned( + bottom: 0, + right: 0, + child: Image.asset( + ImageConstants.instance.getImage("background_bottom"), + width: size.width * 0.4, + ), + ), + SafeArea(child: child) + ], + ), + ), + ), + ); + } +} diff --git a/lib/product/shared/shared_input_decoration.dart b/lib/product/shared/shared_input_decoration.dart new file mode 100644 index 0000000..0a9eaa7 --- /dev/null +++ b/lib/product/shared/shared_input_decoration.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import '../extention/context_extention.dart'; + +InputDecoration borderRadiusTopLeftAndBottomRight( + BuildContext context, String hintText) => + InputDecoration( + hintText: hintText, + border: OutlineInputBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(12), bottomRight: Radius.circular(12)), + )); + +InputDecoration borderRadiusAll(BuildContext context, String hintText) => + InputDecoration( + hintText: hintText, + border: OutlineInputBorder( + borderRadius: BorderRadius.all(context.normalRadius), + )); diff --git a/lib/product/shared/shared_snack_bar.dart b/lib/product/shared/shared_snack_bar.dart new file mode 100644 index 0000000..4a73520 --- /dev/null +++ b/lib/product/shared/shared_snack_bar.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:sfm_app/product/extention/context_extention.dart'; +import 'package:top_snackbar_flutter/custom_snack_bar.dart'; +import 'package:top_snackbar_flutter/top_snack_bar.dart'; + +void showNoIconTopSnackBar(BuildContext context, String message, + Color backgroundColor, Color textColor) { + if (!context.mounted) return; + showTopSnackBar( + Overlay.of(context), + Card( + color: backgroundColor, + child: Container( + margin: const EdgeInsets.only(left: 20), + height: 50, + child: Align( + alignment: Alignment.centerLeft, + child: Text( + message, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 15, + color: textColor, + ), + ), + ), + ), + ), + displayDuration: context.lowDuration); +} + +void showSuccessTopSnackBarCustom(BuildContext context, String message) { + if (!context.mounted) return; + showTopSnackBar( + Overlay.of(context), + SizedBox( + height: 60, + child: CustomSnackBar.success( + message: message, + icon: const Icon(Icons.sentiment_very_satisfied_outlined, + color: Color(0x15000000), size: 80))), + displayDuration: context.lowDuration); +} + +void showErrorTopSnackBarCustom(BuildContext context, String message) { + if (!context.mounted) return; + showTopSnackBar( + Overlay.of(context), + SizedBox( + height: 60, + child: CustomSnackBar.error( + message: message, + icon: const Icon(Icons.sentiment_dissatisfied_outlined, + color: Color(0x15000000), size: 80))), + displayDuration: context.lowDuration); +} diff --git a/lib/product/shared/shared_transition.dart b/lib/product/shared/shared_transition.dart new file mode 100644 index 0000000..f35b9ff --- /dev/null +++ b/lib/product/shared/shared_transition.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; + +/// Hiệu ứng di chuyển từ phải qua trái +Widget transitionsRightToLeft(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const begin = Offset(1.0, 0.0); + const end = Offset.zero; + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var offsetAnimation = animation.drive(tween); + + return SlideTransition( + position: offsetAnimation, + child: child, + ); +} + +/// Hiệu ứng di chuyển từ trái sang phải +Widget transitionsLeftToRight(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const begin = Offset(-1.0, 0.0); + const end = Offset.zero; + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var offsetAnimation = animation.drive(tween); + + return SlideTransition( + position: offsetAnimation, + child: child, + ); +} + +/// Hiệu ứng di chuyển từ dưới lên trên +Widget transitionsBottomToTop(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const begin = Offset(0.0, 1.0); + const end = Offset.zero; + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var offsetAnimation = animation.drive(tween); + + return SlideTransition( + position: offsetAnimation, + child: child, + ); +} + +/// Hiệu ứng di chuyển từ trên xuống dưới +Widget transitionsTopToBottom(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const begin = Offset(0.0, -1.0); + const end = Offset.zero; + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var offsetAnimation = animation.drive(tween); + + return SlideTransition( + position: offsetAnimation, + child: child, + ); +} + +/// Hiệu ứng mở dần vào và ra +Widget transitionsFaded(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const begin = 0.0; + const end = 1.0; + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var fadeAnimation = animation.drive(tween); + + return FadeTransition( + opacity: fadeAnimation, + child: child, + ); +} + +/// Hiệu ứng di chuyển từ kích thước nhỏ đến đầy đủ +Widget transitionsScale(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const begin = 0.0; // Bắt đầu từ kích thước 0 + const end = 1.0; // Kết thúc ở kích thước 1 + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var scaleAnimation = animation.drive(tween); + + return ScaleTransition( + scale: scaleAnimation, + child: child, + ); +} + +Widget transitionsTotation(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const begin = 0.0; // Bắt đầu từ góc 0 độ + const end = 1.0; // Kết thúc ở góc 1 vòng (360 độ) + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var rotationAnimation = animation.drive(tween); + + return RotationTransition( + turns: rotationAnimation, + child: child, + ); +} + +/// Hiệu ứng kết hợp (Di chuyển và mờ dần) +Widget transitionsCustom1(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + const beginOffset = Offset(1.0, 0.0); // Di chuyển từ phải vào + const endOffset = Offset.zero; + const beginOpacity = 0.0; // Bắt đầu từ độ mờ 0 + const endOpacity = 1.0; // Kết thúc ở độ mờ 1 + + var offsetTween = Tween(begin: beginOffset, end: endOffset); + var opacityTween = Tween(begin: beginOpacity, end: endOpacity); + + var offsetAnimation = + animation.drive(offsetTween.chain(CurveTween(curve: Curves.easeInOut))); + var opacityAnimation = + animation.drive(opacityTween.chain(CurveTween(curve: Curves.easeInOut))); + + return FadeTransition( + opacity: opacityAnimation, + child: SlideTransition( + position: offsetAnimation, + child: child, + ), + ); +} diff --git a/lib/product/theme/app_theme.dart b/lib/product/theme/app_theme.dart new file mode 100644 index 0000000..0d38495 --- /dev/null +++ b/lib/product/theme/app_theme.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +abstract class AppTheme { + ThemeData? theme; +} diff --git a/lib/product/theme/app_theme_dark.dart b/lib/product/theme/app_theme_dark.dart new file mode 100644 index 0000000..2a55f08 --- /dev/null +++ b/lib/product/theme/app_theme_dark.dart @@ -0,0 +1,53 @@ +import 'package:flex_color_scheme/flex_color_scheme.dart'; +import 'package:flutter/material.dart'; +import 'package:sfm_app/product/theme/app_theme.dart'; + +class AppThemeDark extends AppTheme { + static AppThemeDark? _instance; + static AppThemeDark get instance { + _instance ??= AppThemeDark._init(); + return _instance!; + } + + AppThemeDark._init(); + + @override + ThemeData get theme => FlexThemeData.dark( + useMaterial3: true, + scheme: FlexScheme.flutterDash, + subThemesData: const FlexSubThemesData( + inputDecoratorRadius: 30, + interactionEffects: true, + tintedDisabledControls: true, + blendOnColors: true, + useM2StyleDividerInM3: true, + inputDecoratorBorderType: FlexInputBorderType.outline, + tooltipRadius: 20, + tooltipWaitDuration: Duration(milliseconds: 500), + tooltipShowDuration: Duration(milliseconds: 500), + navigationRailUseIndicator: true, + navigationRailLabelType: NavigationRailLabelType.all, + ), + visualDensity: FlexColorScheme.comfortablePlatformDensity, + ); + + // ThemeData.dark().copyWith( + // useMaterial3: true, + // colorScheme: _buildColorScheme, + // ); + + // ColorScheme get _buildColorScheme => FlexColorScheme.dark().toScheme; + // ColorScheme( + // brightness: Brightness.dark, + // primary: Colors.blue.shade900, + // onPrimary: Colors.blue, + // secondary: Colors.white, + // onSecondary: Colors.white70, + // error: Colors.red, + // onError: Colors.orange, + // background: Colors.black, + // onBackground: Colors.white70, + // surface: Colors.grey, + // onSurface: Colors.white, + // ); +} diff --git a/lib/product/theme/app_theme_light.dart b/lib/product/theme/app_theme_light.dart new file mode 100644 index 0000000..92e5675 --- /dev/null +++ b/lib/product/theme/app_theme_light.dart @@ -0,0 +1,54 @@ +import 'package:flex_color_scheme/flex_color_scheme.dart'; +import 'package:flutter/material.dart'; +import 'package:sfm_app/product/theme/app_theme.dart'; + +class AppThemeLight extends AppTheme { + static AppThemeLight? _instance; + static AppThemeLight get instance { + _instance ??= AppThemeLight._init(); + return _instance!; + } + + AppThemeLight._init(); + + @override + ThemeData get theme => FlexThemeData.light( + useMaterial3: true, + scheme: FlexScheme.flutterDash, + bottomAppBarElevation: 20.0, + subThemesData: const FlexSubThemesData( + inputDecoratorRadius: 30, + interactionEffects: true, + tintedDisabledControls: true, + useM2StyleDividerInM3: true, + inputDecoratorBorderType: FlexInputBorderType.outline, + tooltipRadius: 20, + tooltipWaitDuration: Duration(milliseconds: 1600), + tooltipShowDuration: Duration(milliseconds: 1500), + navigationRailUseIndicator: true, + navigationRailLabelType: NavigationRailLabelType.all, + ), + visualDensity: FlexColorScheme.comfortablePlatformDensity, + ); + // ThemeData.light().copyWith( + // useMaterial3: true, + // colorScheme: _buildColorScheme, + // ); + + // ColorScheme get _buildColorScheme => FlexColorScheme.light( + + // ).toScheme; + // const ColorScheme( + // brightness: Brightness.light, + // primary: Colors.black, + // onPrimary: Colors.white, + // secondary: Colors.black, + // onSecondary: Colors.black45, + // error: Colors.red, + // onError: Colors.orange, + // background: Colors.white, + // onBackground: Colors.red, + // surface: Colors.white, + // onSurface: Colors.black, + // ); +} diff --git a/lib/product/theme/provider/app_provider.dart b/lib/product/theme/provider/app_provider.dart new file mode 100644 index 0000000..39091ec --- /dev/null +++ b/lib/product/theme/provider/app_provider.dart @@ -0,0 +1,23 @@ +import 'package:provider/provider.dart'; +import 'package:provider/single_child_widget.dart'; + +import '../theme_notifier.dart'; + +class ApplicationProvider { + static ApplicationProvider? _instance; + static ApplicationProvider get instance { + _instance ??= ApplicationProvider._init(); + return _instance!; + } + + ApplicationProvider._init(); + + List singleItems = []; + List dependItems = [ + ChangeNotifierProvider( + create: (context) => ThemeNotifier(), + ), + // Provider.value(value: NavigationService.instance) + ]; + List uiChangesItems = []; +} diff --git a/lib/product/theme/theme_notifier.dart b/lib/product/theme/theme_notifier.dart new file mode 100644 index 0000000..0e35247 --- /dev/null +++ b/lib/product/theme/theme_notifier.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'app_theme_dark.dart'; +import 'app_theme_light.dart'; + +import '../constant/enums/app_theme_enums.dart'; + +class ThemeNotifier extends ChangeNotifier { + // ThemeData _currentTheme = AppThemeLight.instance.theme; + // // ThemeData get currentTheme => LocaleManager.instance.getStringValue(PreferencesKeys.THEME) == + // // AppThemes.LIGHT.name + // // ? AppThemeLight.instance.theme + // // : AppThemeDark.instance.theme; + // ThemeData get currentTheme { + // log("ThemeKey: ${LocaleManager.instance.getStringValue(PreferencesKeys.THEME)}"); + // if (LocaleManager.instance.getStringValue(PreferencesKeys.THEME) == + // AppThemes.LIGHT.name) { + // log("light"); + // } else { + // log("dark"); + // } + // return LocaleManager.instance.getStringValue(PreferencesKeys.THEME) == + // AppThemes.LIGHT.name + // ? AppThemeLight.instance.theme + // : AppThemeDark.instance.theme; + // } + + // ThemeData _currentTheme = AppThemeLight.instance.theme; // Mặc định là light + + // ThemeNotifier() { + // loadThemeFromPreferences(); + // } + + // Future loadThemeFromPreferences() async { + // String themeKey = + // LocaleManager.instance.getStringValue(PreferencesKeys.THEME); + // log("ThemeNotifierKey:$themeKey "); + // if (themeKey == AppThemes.LIGHT.name) { + // _currentTheme = AppThemeLight.instance.theme; + // } else { + // _currentTheme = AppThemeDark.instance.theme; + // } + // notifyListeners(); // Thông báo cho các widget lắng nghe + // } + + // ThemeData get currentTheme => _currentTheme; + + // AppThemes _currenThemeEnum = AppThemes.LIGHT; + // AppThemes get currenThemeEnum => + // LocaleManager.instance.getStringValue(PreferencesKeys.THEME) == + // AppThemes.LIGHT.name + // ? AppThemes.LIGHT + // : AppThemes.DARK; + // // AppThemes get currenThemeEnum => _currenThemeEnum; + + // void changeValue(AppThemes theme) { + // if (theme == AppThemes.LIGHT) { + // _currentTheme = ThemeData.dark(); + // } else { + // _currentTheme = ThemeData.light(); + // } + // notifyListeners(); + // } + + // void changeTheme() { + // if (_currenThemeEnum == AppThemes.LIGHT) { + // _currentTheme = AppThemeDark.instance.theme; + // _currenThemeEnum = AppThemes.DARK; + // LocaleManager.instance + // .setString(PreferencesKeys.THEME, AppThemes.DARK.name); + // } else { + // _currentTheme = AppThemeLight.instance.theme; + // _currenThemeEnum = AppThemes.LIGHT; + // LocaleManager.instance + // .setString(PreferencesKeys.THEME, AppThemes.LIGHT.name); + // } + // notifyListeners(); + // } + + ThemeData _currentTheme = AppThemeLight.instance.theme; + ThemeData get currentTheme => _currentTheme; + + AppThemes _currenThemeEnum = AppThemes.LIGHT; + AppThemes get currenThemeEnum => _currenThemeEnum; + + void changeValue(AppThemes theme) { + if (theme == AppThemes.LIGHT) { + _currentTheme = AppThemeLight.instance.theme; + } else { + _currentTheme = AppThemeDark.instance.theme; + } + notifyListeners(); + } + + void changeTheme() { + if (_currenThemeEnum == AppThemes.LIGHT) { + _currentTheme = AppThemeDark.instance.theme; + _currenThemeEnum = AppThemes.DARK; + } else { + _currentTheme = AppThemeLight.instance.theme; + _currenThemeEnum = AppThemes.LIGHT; + } + notifyListeners(); + } +} diff --git a/lib/product/utils/date_time_utils.dart b/lib/product/utils/date_time_utils.dart new file mode 100644 index 0000000..1a6bb44 --- /dev/null +++ b/lib/product/utils/date_time_utils.dart @@ -0,0 +1,16 @@ +import 'package:intl/intl.dart'; + +class DateTimeUtils { + DateTimeUtils._init(); + static DateTimeUtils? _instance; + static DateTimeUtils get instance => _instance ??= DateTimeUtils._init(); + + String formatDateTimeToString(DateTime dateTime) { + return DateFormat('yyyy-MM-dd\'T\'00:00:00\'Z\'').format(dateTime); + } + + String convertCurrentMillisToDateTimeString(int time) { + DateTime dateTime = DateTime.fromMillisecondsSinceEpoch((time) * 1000); + return DateFormat('yyyy-MM-dd HH:mm:ss').format(dateTime); + } +} diff --git a/lib/product/utils/device_utils.dart b/lib/product/utils/device_utils.dart new file mode 100644 index 0000000..8ae0f2a --- /dev/null +++ b/lib/product/utils/device_utils.dart @@ -0,0 +1,269 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:sfm_app/feature/log/device_logs_model.dart'; +import 'package:sfm_app/product/services/api_services.dart'; +import 'package:sfm_app/product/services/language_services.dart'; +import 'package:sfm_app/product/shared/model/district_model.dart'; +import 'package:sfm_app/product/shared/model/province_model.dart'; + +import '../../feature/devices/device_model.dart'; +import '../shared/model/ward_model.dart'; + +class DeviceUtils { + DeviceUtils._init(); + static DeviceUtils? _instance; + static DeviceUtils get instance => _instance ??= DeviceUtils._init(); + APIServices apiServices = APIServices(); + + Map getDeviceSensors( + BuildContext context, List sensors) { + Map map = {}; + if (sensors.isEmpty) { + map['sensorState'] = appLocalization(context).no_data_message; + map['sensorBattery'] = appLocalization(context).no_data_message; + map['sensorCsq'] = appLocalization(context).no_data_message; + map['sensorTemp'] = appLocalization(context).no_data_message; + map['sensorHum'] = appLocalization(context).no_data_message; + map['sensorVolt'] = appLocalization(context).no_data_message; + } else { + for (var sensor in sensors) { + if (sensor.name == "1") { + if (sensor.value == 0) { + map['sensorIn'] = "sensor 0"; + } else { + map['sensorIn'] = "sensor 1"; + } + } + if (sensor.name == "2") { + if (sensor.value == 0) { + map['sensorMove'] = appLocalization(context).gf_not_move_message; + } else { + map['sensorMove'] = appLocalization(context).gf_moving_message; + } + } + if (sensor.name == "3") { + if (sensor.value == 0) { + map['sensorAlarm'] = appLocalization(context).normal_message; + } else { + map['sensorAlarm'] = + appLocalization(context).warning_status_message; + } + } + if (sensor.name == "6") { + if (sensor.value! > 0 && sensor.value! < 12) { + map['sensorCsq'] = appLocalization(context).low_message_uppercase; + } else if (sensor.value! >= 12 && sensor.value! < 20) { + map['sensorCsq'] = + appLocalization(context).moderate_message_uppercase; + } else if (sensor.value! >= 20) { + map['sensorCsq'] = appLocalization(context).good_message_uppercase; + } else { + map['sensorCsq'] = appLocalization(context).gf_no_signal_message; + } + } + if (sensor.name == "7") { + map['sensorVolt'] = "${(sensor.value!) / 1000} V"; + } + if (sensor.name == "8") { + map['sensorTemp'] = "${sensor.value}°C"; + } + if (sensor.name == "9") { + map['sensorHum'] = "${sensor.value} %"; + } + if (sensor.name == "10") { + map['sensorBattery'] = "${sensor.value}"; + } + if (sensor.name == "11") { + if (sensor.value == 0) { + map['sensorState'] = appLocalization(context).normal_message; + } else if (sensor.value == 1) { + map['sensorState'] = + appLocalization(context).smoke_detecting_message; + } else if (sensor.value == 3) { + map['sensorState'] = + appLocalization(context).gf_remove_from_base_message; + } else { + map['sensorState'] = appLocalization(context).undefine_message; + } + } + } + } + return map; + } + + Future getFullDeviceLocation( + BuildContext context, String areaPath) async { + if (areaPath != "") { + List parts = areaPath.split('_'); + + String provinceID = parts[0]; + String districtID = parts[1]; + String wardID = parts[2]; + + String provinceBody = await apiServices.getProvinceByID(provinceID); + final provinceItem = jsonDecode(provinceBody); + Province province = Province.fromJson(provinceItem['data']); + String districtBody = await apiServices.getDistrictByID(districtID); + final districtItem = jsonDecode(districtBody); + District district = District.fromJson(districtItem['data']); + String wardBody = await apiServices.getWardByID(wardID); + final wardItem = jsonDecode(wardBody); + Ward ward = Ward.fromJson(wardItem['data']); + + return "${ward.fullName}, ${district.fullName}, ${province.fullName}"; + } + return appLocalization(context).no_data_message; + } + + String checkStateDevice(BuildContext context, int state) { + String message = appLocalization(context).no_data_message; + if (state == 1) { + message = appLocalization(context).smoke_detecting_message; + } else if (state == 0) { + message = appLocalization(context).normal_message; + } else if (state == -1) { + message = appLocalization(context).disconnect_message_uppercase; + } else if (state == 2) { + message = appLocalization(context).in_progress_message; + } else if (state == 3) { + message = appLocalization(context).in_progress_message; + } + return message; + } + + List sortDeviceByState(List devices) { + List sortedDevices = List.from(devices); + sortedDevices.sort((a, b) { + int stateOrder = [2, 1, 3, 0, -1, 3].indexOf(a.state!) - + [2, 1, 3, 0, -1, 3].indexOf(b.state!); + return stateOrder; + }); + + return sortedDevices; + } + + Color getTableRowColor(int state) { + if (state == 1) { + return Colors.red; + } else if (state == 0) { + return Colors.green; + } else { + return Colors.grey; + } + } + + String getDeviceSensorsLog(BuildContext context, SensorLogs sensor) { + String message = ""; + if (sensor.detail!.username != null || sensor.detail!.note != null) { + message = "${appLocalization(context).bell_user_uppercase} "; + if (sensor.name! == "0") { + if (sensor.value! == 3) { + String state = "đã thông báo rằng đây là cháy giả"; + message = message + state; + } + } + } else { + message = "${appLocalization(context).device_title} "; + if (sensor.name == "11") { + String state = checkStateDevice(context, sensor.value!); + message = message + state; + } else if (sensor.name == "2") { + String state = getDeviceMove(context, sensor.value!); + message = message + state; + } else if (sensor.name == "6") { + String state = getDeviceCSQ(context, sensor.value!); + message = message + state; + } else if (sensor.name == "7") { + String state = getDeviceVolt(context, sensor.value!); + message = message + state; + } else if (sensor.name == "8") { + String state = getDeviceTemp(context, sensor.value!); + message = message + state; + } else if (sensor.name == "9") { + String state = getDeviceHum(context, sensor.value!); + message = message + state; + } else if (sensor.name == "10") { + String state = getDeviceBattery(context, sensor.value!); + message = message + state; + } else { + String state = appLocalization(context).undefine_message; + message = message + state; + } + } + return message; + } + + String getDeviceCSQ(BuildContext context, int number) { + if (number >= 0 && number < 12) { + return appLocalization(context).gf_weak_signal_message; + } else if (number >= 12 && number < 20) { + return appLocalization(context).gf_moderate_signal_message; + } else if (number >= 20) { + return appLocalization(context).gf_good_signal_message; + } + return appLocalization(context).gf_no_signal_message; + } + + String getDeviceVolt(BuildContext context, int number) { + return "${appLocalization(context).gf_volt_detect_message} ${number / 1000} V"; + } + + String getDeviceTemp(BuildContext context, int number) { + return "${appLocalization(context).gf_temp_detect_message} $number °C"; + } + + String getDeviceHum(BuildContext context, int number) { + return "${appLocalization(context).gf_hum_detect_message} $number%"; + } + + String getDeviceBattery(BuildContext context, int number) { + return "${appLocalization(context).gf_battery_detect_message} $number%"; + } + + String getDeviceMove(BuildContext context, int number) { + String message = ""; + if (number == 0) { + message = appLocalization(context).gf_not_move_message; + } else { + message = appLocalization(context).gf_moving_message; + } + return message; + } + + IconData getBatteryIcon(int battery) { + if (battery <= 10) { + return Icons.battery_alert; + } else if (battery <= 40) { + return Icons.battery_2_bar; + } else if (battery <= 70) { + return Icons.battery_4_bar; + } else if (battery <= 90) { + return Icons.battery_6_bar; + } else { + return Icons.battery_full_rounded; + } + } + + IconData getSignalIcon(BuildContext context, String signal) { + if (signal == appLocalization(context).gf_weak_signal_message) { + return Icons.signal_cellular_alt_1_bar; + } else if (signal == appLocalization(context).gf_moderate_signal_message) { + return Icons.signal_cellular_alt_2_bar; + } else { + return Icons.signal_cellular_alt; + } + } + + Color getColorRiple(int state) { + if (state == 1) { + return Colors.red; + } else if (state == 3) { + return Colors.orange; + } else if (state == -1) { + return Colors.grey; + } else { + return Colors.green; + } + } +} diff --git a/lib/product/utils/qr_utils.dart b/lib/product/utils/qr_utils.dart new file mode 100644 index 0000000..1357a93 --- /dev/null +++ b/lib/product/utils/qr_utils.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; +import '../services/language_services.dart'; + +class QRScanUtils { + QRScanUtils._init(); + static QRScanUtils? _instance; + static QRScanUtils get instance => _instance ??= QRScanUtils._init(); + + Future scanQR(BuildContext context) async { + String barcodeScanRes; + // Platform messages may fail, so we use a try/catch PlatformException. + try { + barcodeScanRes = await FlutterBarcodeScanner.scanBarcode( + '#ffffff', appLocalization(context).cancel_button_content, true, ScanMode.QR); + } on PlatformException { + barcodeScanRes = 'Failed to get platform version.'; + } + return barcodeScanRes; + } + + Map getQRData(String data) { + if (data.isEmpty) { + return {}; + } else { + final parts = data.split('.'); + return { + 'group_id': parts.length == 2 ? parts[0] : '', + 'group_name': parts.length == 2 ? parts[1] : '', + }; + } + } +} \ No newline at end of file diff --git a/lib/product/utils/response_status_utils.dart b/lib/product/utils/response_status_utils.dart new file mode 100644 index 0000000..c1cb631 --- /dev/null +++ b/lib/product/utils/response_status_utils.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import '../constant/status_code/status_code_constants.dart'; +import '../shared/shared_snack_bar.dart'; + +void showSnackBarResponseByStatusCode(BuildContext context, int statusCode, + String successMessage, String failedMessage) async { + if (statusCode == StatusCodeConstants.OK || + statusCode == StatusCodeConstants.CREATED) { + showSuccessTopSnackBarCustom(context, successMessage); + } else { + showErrorTopSnackBarCustom(context, failedMessage); + } +} + +void showSnackBarResponseByStatusCodeNoIcon(BuildContext context, int statusCode, + String successMessage, String failedMessage) async { + if (statusCode == StatusCodeConstants.OK || + statusCode == StatusCodeConstants.CREATED) { + showNoIconTopSnackBar(context, successMessage,Colors.green, Colors.white); + } else { + showNoIconTopSnackBar(context, failedMessage, Colors.red, Colors.white); + } +} diff --git a/lib/product/utils/string_utils.dart b/lib/product/utils/string_utils.dart new file mode 100644 index 0000000..5557a57 --- /dev/null +++ b/lib/product/utils/string_utils.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +class StringUtils { + StringUtils._init(); + static StringUtils? _instance; + static StringUtils get instance => _instance ??= StringUtils._init(); + + List parseAddressFromMapAPI(String addressString) { + RegExp regex = RegExp(r'([^<]+)'); + List textSpans = []; + + Iterable matches = regex.allMatches(addressString); + for (Match match in matches) { + String cssClass = match.group(1)!; + String text = match.group(2)!; + if (cssClass == 'country-name') { + continue; + } + textSpans.add( + TextSpan( + text: text, + ), + ); + textSpans.add( + const TextSpan(text: ', '), + ); + } + + textSpans.removeLast(); + return textSpans; + } +} 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..c43473c --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,139 @@ +# 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 "sfm_app") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.sfm_app") + +# 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) + +# 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..dbec55e --- /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) maps_launcher_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "MapsLauncherPlugin"); + maps_launcher_plugin_register_with_registrar(maps_launcher_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..6c56d5b --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + maps_launcher + 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..6c06c70 --- /dev/null +++ b/linux/my_application.cc @@ -0,0 +1,104 @@ +#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, "sfm_app"); + 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, "sfm_app"); + } + + 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 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_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..c2efd0b --- /dev/null +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#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..c2efd0b --- /dev/null +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..4fac21f --- /dev/null +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,24 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import firebase_core +import firebase_messaging +import flutter_local_notifications +import geolocator_apple +import maps_launcher +import shared_preferences_foundation +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) + MapsLauncherPlugin.register(with: registry.registrar(forPlugin: "MapsLauncherPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1ff4f1a --- /dev/null +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,695 @@ +// !$*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 /* sfm_app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "sfm_app.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 /* sfm_app.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 /* sfm_app.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1300; + 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.sfmApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sfm_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sfm_app"; + }; + 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.sfmApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sfm_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sfm_app"; + }; + 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.sfmApp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sfm_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sfm_app"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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; + 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; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + 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; + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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..3e3d674 --- /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..a885967 --- /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 = sfm_app + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.sfmApp + +// 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..f7f0efc --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,919 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: f5628cd9c92ed11083f425fd1f8f1bc60ecdda458c81d73b143aeda036c35fe7 + url: "https://pub.dev" + source: hosted + version: "1.3.16" + app_settings: + dependency: "direct main" + description: + name: app_settings + sha256: "09bc7fe0313a507087bec1a3baf555f0576e816a760cbb31813a88890a09d9e5" + url: "https://pub.dev" + source: hosted + version: "5.1.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" + badges: + dependency: "direct main" + description: + name: badges + sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + url: "https://pub.dev" + source: hosted + version: "1.17.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + dio: + dependency: "direct main" + description: + name: dio + sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + url: "https://pub.dev" + source: hosted + version: "5.7.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "36c5b2d79eb17cdae41e974b7a8284fec631651d2a6f39a8a2ff22327e90aeac" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + dropdown_button2: + dependency: "direct main" + description: + name: dropdown_button2 + sha256: b0fe8d49a030315e9eef6c7ac84ca964250155a6224d491c1365061bc974a9e1 + url: "https://pub.dev" + source: hosted + version: "2.3.9" + 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: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "96607c0e829a581c2a483c658f04e8b159964c3bae2730f73297070bc85d40bb" + url: "https://pub.dev" + source: hosted + version: "2.24.2" + 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: d585bdf3c656c3f7821ba1bd44da5f13365d22fcecaf5eb75c4295246aaa83c0 + url: "https://pub.dev" + source: hosted + version: "2.10.0" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: "980259425fa5e2afc03e533f33723335731d21a56fd255611083bceebf4373a8" + url: "https://pub.dev" + source: hosted + version: "14.7.10" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "54e283a0e41d81d854636ad0dad73066adc53407a60a7c3189c9656e2f1b6107" + url: "https://pub.dev" + source: hosted + version: "4.5.18" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "90dc7ed885e90a24bb0e56d661d4d2b5f84429697fd2cbb9e5890a0ca370e6f4" + url: "https://pub.dev" + source: hosted + version: "3.5.18" + flex_color_scheme: + dependency: "direct main" + description: + name: flex_color_scheme + sha256: "659cf59bd5ccaa1e7de9384342be8b666ff10b108ed57a7fd46c122fb8bf6aca" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + flex_seed_scheme: + dependency: transitive + description: + name: flex_seed_scheme + sha256: "29c12aba221eb8a368a119685371381f8035011d18de5ba277ad11d7dfb8657f" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_barcode_scanner: + dependency: "direct main" + description: + name: flutter_barcode_scanner + sha256: a4ba37daf9933f451a5e812c753ddd045d6354e4a3280342d895b07fecaab3fa + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35" + url: "https://pub.dev" + source: hosted + version: "17.2.4" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af + url: "https://pub.dev" + source: hosted + version: "4.0.1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + url: "https://pub.dev" + source: hosted + version: "2.0.17" + flutter_polyline_points: + dependency: "direct main" + description: + name: flutter_polyline_points + sha256: "0e07862139cb65a88789cd6efbe284c0b6f1fcb5ed5ec87781759c48190d84b9" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + 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" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: "6cb9fb6e5928b58b9a84bdf85012d757fd07aab8215c5205337021c4999bad27" + url: "https://pub.dev" + source: hosted + version: "11.1.0" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "06e37fa32392f69f133e166ef6b358a8b6afddbf4c418fc236988184cc115a49" + url: "https://pub.dev" + source: hosted + version: "4.4.1" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: "6154ea2682563f69fc0125762ed7e91e7ed85d0b9776595653be33918e064807" + url: "https://pub.dev" + source: hosted + version: "2.3.8+1" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "386ce3d9cce47838355000070b1d0b13efb5bc430f8ecda7e9238c8409ace012" + url: "https://pub.dev" + source: hosted + version: "4.2.4" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: "49d8f846ebeb5e2b6641fe477a7e97e5dd73f03cbfef3fd5c42177b7300fb0ed" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e" + url: "https://pub.dev" + source: hosted + version: "0.2.3" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "07ee2436909f749d606f53521dc1725dd738dc5196e5ff815bc254253c594075" + url: "https://pub.dev" + source: hosted + version: "13.1.0" + google_maps: + dependency: transitive + description: + name: google_maps + sha256: "555d5d736339b0478e821167ac521c810d7b51c3b2734e6802a9f046b64ea37a" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_maps_cluster_manager: + dependency: "direct main" + description: + name: google_maps_cluster_manager + sha256: "36e9a4b2d831c470fc85d692a6c9cec70e0f385d578b9697de5f4de347561b83" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + google_maps_flutter: + dependency: "direct main" + description: + name: google_maps_flutter + sha256: ae66fef3e71261d7df2eff29b2a119e190b2884325ecaa55321b1e17b5504066 + url: "https://pub.dev" + source: hosted + version: "2.5.3" + google_maps_flutter_android: + dependency: transitive + description: + name: google_maps_flutter_android + sha256: "714530f865f13bb3b9505c58821c3baed5d247a871724acf5d2ea5808fbed02c" + url: "https://pub.dev" + source: hosted + version: "2.6.2" + google_maps_flutter_ios: + dependency: transitive + description: + name: google_maps_flutter_ios + sha256: c89556ed0338fcb4b843c9fcdafac7ad2df601c8b41286d82f0727f7f66434e4 + url: "https://pub.dev" + source: hosted + version: "2.3.6" + google_maps_flutter_platform_interface: + dependency: transitive + description: + name: google_maps_flutter_platform_interface + sha256: "6060779f020638a8eedeb0fb14234818e5fa32ec45a4653d6428ab436e2bbc64" + url: "https://pub.dev" + source: hosted + version: "2.4.3" + google_maps_flutter_web: + dependency: transitive + description: + name: google_maps_flutter_web + sha256: "05067c5aa762ebee44b7ef4902a311ed8cf891ef655e2798bae063aa3050c8d9" + url: "https://pub.dev" + source: hosted + version: "0.5.4+1" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" + http: + dependency: "direct main" + description: + name: http + sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 + url: "https://pub.dev" + source: hosted + version: "0.18.0" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + js_wrapping: + dependency: transitive + description: + name: js_wrapping + sha256: e385980f7c76a8c1c9a560dfb623b890975841542471eade630b2871d243851c + url: "https://pub.dev" + source: hosted + version: "0.7.4" + lints: + dependency: transitive + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + maps_launcher: + dependency: "direct main" + description: + name: maps_launcher + sha256: "57ba3c31db96e30f58c23fcb22a1fac6accc5683535b2cf344c534bbb9f8f910" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + url: "https://pub.dev" + source: hosted + version: "0.12.15" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + meta: + dependency: transitive + description: + name: meta + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + path: + dependency: transitive + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + 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" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" + url: "https://pub.dev" + source: hosted + version: "11.0.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: f9fddd3b46109bd69ff3f9efa5006d2d309b7aec0f3c1c5637a60a2d5659e76e + url: "https://pub.dev" + source: hosted + version: "11.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" + url: "https://pub.dev" + source: hosted + version: "9.1.4" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" + url: "https://pub.dev" + source: hosted + version: "3.12.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 + url: "https://pub.dev" + source: hosted + version: "0.1.3" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 + url: "https://pub.dev" + source: hosted + version: "5.4.0" + platform: + dependency: transitive + description: + name: platform + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + provider: + dependency: "direct main" + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + qr: + dependency: transitive + description: + name: qr + sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + qr_flutter: + dependency: "direct main" + description: + name: qr_flutter + sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + rxdart: + dependency: "direct main" + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + sanitize_html: + dependency: transitive + description: + name: sanitize_html + sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + search_choices: + dependency: "direct main" + description: + name: search_choices + sha256: "10a50815c0190922dadae81cce723266bfc57d134911565c37c96d4527312bde" + url: "https://pub.dev" + source: hosted + version: "2.2.11" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + simple_ripple_animation: + dependency: "direct main" + description: + name: simple_ripple_animation + sha256: "09a80a6d352ce12d33c2ca43423bf5b544179cc5bc78bf3ff73bd5c08ea378bd" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + 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" + 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: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + url: "https://pub.dev" + source: hosted + version: "0.5.1" + timezone: + dependency: transitive + description: + name: timezone + sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + top_snackbar_flutter: + dependency: "direct main" + description: + name: top_snackbar_flutter + sha256: "22d14664a13db6ac714934c3382bd8d4daa57fb888a672f922df71981c5a5cb2" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27" + url: "https://pub.dev" + source: hosted + version: "6.1.14" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + url: "https://pub.dev" + source: hosted + version: "6.2.4" + 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: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: ba140138558fcc3eead51a1c42e92a9fb074a1b1149ed3c73e66035b2ccd94f2 + url: "https://pub.dev" + source: hosted + version: "2.0.19" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: "22c94e5ad1e75f9934b766b53c742572ee2677c56bc871d850a57dad0f82127f" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + win32: + dependency: transitive + description: + name: win32 + sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" + url: "https://pub.dev" + source: hosted + version: "5.0.9" + 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: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" + url: "https://pub.dev" + source: hosted + version: "6.3.0" +sdks: + dart: ">=3.0.1 <4.0.0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..c88cdf1 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,114 @@ +name: sfm_app +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.0.1 <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: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + shared_preferences: ^2.2.2 + intl: ^0.18.0 + firebase_core: ^2.24.2 + firebase_messaging: ^14.7.10 + flutter_local_notifications: ^17.2.4 + permission_handler: ^11.0.1 + app_settings: ^5.1.1 + provider: ^6.1.2 + flex_color_scheme: ^7.2.0 + go_router: ^13.1.0 + http: ^1.1.0 + top_snackbar_flutter: ^3.1.0 + badges: ^3.1.2 + google_maps_cluster_manager: ^3.1.0 + google_maps_flutter: ^2.5.0 + dropdown_button2: ^2.3.9 + maps_launcher: ^2.2.1 + flutter_barcode_scanner: ^2.0.0 + search_choices: ^2.2.11 + dio: ^5.7.0 + rxdart: ^0.28.0 + geolocator: ^11.1.0 + qr_flutter: ^4.1.0 + flutter_polyline_points: ^2.0.0 + simple_ripple_animation: ^0.1.0 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + generate: true + # To add assets to your application, add an assets section, like this: + assets: + - assets/images/ + - assets/icons/ + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/sfmTranslateErrors.txt b/sfmTranslateErrors.txt new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/sfmTranslateErrors.txt @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..515a95d --- /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:sfm_app/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // 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..1db9e07 --- /dev/null +++ b/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + sfm_app + + + + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..bbc0e5a --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "sfm_app", + "short_name": "sfm_app", + "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..93d0e3c --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,102 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(sfm_app 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 "sfm_app") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# 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() + +# 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..930d207 --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# 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") + +# === 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" + windows-x64 $ + 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..e7f561c --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,26 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + MapsLauncherPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("MapsLauncherPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + 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..5feb846 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,28 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + firebase_core + geolocator_windows + maps_launcher + permission_handler_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..88bc832 --- /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", "sfm_app" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "sfm_app" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "sfm_app.exe" "\0" + VALUE "ProductName", "sfm_app" "\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..b25e363 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,66 @@ +#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(); + }); + + 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..0b90f71 --- /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"sfm_app", 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_

U8|@C=Wr= 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Ν3lnjsdd5!U6kOGI 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